diff --git a/.buildkite/install-repo.sh b/.buildkite/install-repo.sh index d4589b7a..88e3ea34 100644 --- a/.buildkite/install-repo.sh +++ b/.buildkite/install-repo.sh @@ -7,10 +7,4 @@ gcloud config set account monorepo-ci@embark-builds.iam.gserviceaccount.com echo --- Installing dependencies -eval "$(pyenv init --path)" -eval "$(pyenv init -)" - -${PDM_COMMAND:1:-1} use ${PYTHON_VERSION:1:-1} -${PDM_COMMAND:1:-1} install --plugins -${PDM_COMMAND:1:-1} install -d -G ci -${PDM_COMMAND:1:-1} torch install cpu +./get-pants.sh diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml index 2a7264ba..d053e64d 100644 --- a/.buildkite/pipeline.yml +++ b/.buildkite/pipeline.yml @@ -1,95 +1,86 @@ -plugin_base: &plugin_base - service-account-name: monorepo-ci - image: gcr.io/embark-shared/ml/ci-runner@sha256:dac3595ade7e3e92ed006f6c29f461b71bb3a6b0ade8d3afb88ba8e55b9601d6 - default-secret-name: buildkite-k8s-plugin - always-pull: false - use-agent-node-affinity: true - -agents: &agent - cluster: builds-fi-2 - queue: monorepo-ci - size: small - -tiny: &tiny - agents: *agent - plugins: - - EmbarkStudios/k8s#1.2.10: - << : *plugin_base - resources-limit-cpu: 3 - resources-limit-memory: 10Gi - - agents: *agent - -small: &small - agents: *agent - plugins: - - EmbarkStudios/k8s#1.2.10: - << : *plugin_base - resources-limit-cpu: 7 - resources-limit-memory: 20Gi - -large: &large - agents: *agent - plugins: - - EmbarkStudios/k8s#1.2.10: - << : *plugin_base - resources-limit-cpu: 14 - resources-limit-memory: 35Gi - +agent_kinds: + large_config: &large + agents: + cluster: builds-fi-2 + queue: monorepo-ci + size: large + env: + PANTS_PROCESS_EXECUTION_LOCAL_PARALLELISM: 12 + PANTS_RULE_THREADS_CORE: 6 + + small_config: &small + agents: + cluster: builds-fi-2 + queue: monorepo-ci + size: small + env: + PANTS_PROCESS_EXECUTION_LOCAL_PARALLELISM: 6 + PANTS_RULE_THREADS_CORE: 3 env: - PDM_COMMAND: pdm210 PYTHON_VERSION: '3.10' - + PY: "python3.10" + PANTS_PYTHON_INTERPRETER_CONSTRAINTS: "['==3.10.*']" + PANTS_CONFIG_FILES: "pants.ci.toml" + PYTHON_BIN_NAME: "python3.10" + PEX_PYTHON: "python3.10" steps: - group: ":passport_control: Validating PR" steps: - label: ":hourglass: Validating branch age" command: bash .buildkite/validate-branch-age.sh - << : *tiny + <<: *small - label: ":straight_ruler: Checking line-endings" command: bash .buildkite/check-line-endings.sh - << : *tiny - - - label: ":lock: Checking lockfile" - command: bash .buildkite/validate-lockfile.sh - << : *tiny + <<: *small - wait - group: ":vertical_traffic_light: Validating changes" steps: - - label: 📚 Publish docs - command: bash .buildkite/publish-docs.sh - << : *tiny + - label: ":package: Validating {{matrix}} packages" + command: | + . ci/init.sh + pants package --filter-address-regex='.*@resolve={{matrix}}' emote:: + + matrix: + - "cpu" + - "gpu" + - "base" + + <<: *large - - label: ":python-black: Validate black" - command: bash .buildkite/run-black.sh - << : *tiny + - label: ":package: Packaging bases" + command: | + . ci/init.sh + pants package --filter-address-regex='-.*@resolve=.*' emote:: - - label: ":isort: Validate isort" - command: bash .buildkite/run-isort.sh - << : *tiny + <<: *large - - label: ":bandit: Validate bandit" - command: bash .buildkite/run-bandit.sh - << : *tiny + - label: ":pants: Validating tailor" + command: | + . ci/init.sh + pants tailor --check :: - - label: ":lint-roller: Validate flake8" - command: bash .buildkite/run-flake8.sh - << : *tiny + <<: *small + + - label: ":python-black: :isort: Check-and-lint " + command: | + . ci/init.sh + pants update-build-files --check lint :: + + <<: *small - label: ":pytest: Run tests" - command: bash .buildkite/run-pytest.sh - << : *large + command: | + . ci/init.sh + pants test :: - - wait + <<: *small - - label: ":package: Validate packaging" - command: bash .buildkite/run-package.sh - << : *tiny + - wait - label: ":packagecloud: Triggering Cloud-Training build" trigger: erupt diff --git a/.buildkite/publish-docs.sh b/.buildkite/publish-docs.sh index 742ecbbe..b1f078b2 100644 --- a/.buildkite/publish-docs.sh +++ b/.buildkite/publish-docs.sh @@ -4,24 +4,17 @@ set -eo pipefail source .buildkite/install-repo.sh echo --- Building docs -pushd docs -EXIT_CODE=0 -export TZ=UTC - -PDM=${PDM_COMMAND:1:-1} ${PDM_COMMAND:1:-1} run make deploy || EXIT_CODE=$? - -if [ $EXIT_CODE -ne 0 ]; then - cat << EOF | buildkite-agent annotate --style "error" --context "sphinx" -:warning: Failed building documentation. Please check logs below, or build docs locally using `make deploy` to check for errors. +if ! pants package //docs:book; then + cat << EOF | buildkite-agent annotate --style "error" --context "pants" +:warning: Failed building documentation. Please check logs below, or build docs locally using \`pants package //docs:book\` to check for errors. EOF exit 1 else if [[ "$BUILDKITE_BRANCH" = "main" ]]; then - gsutil rsync -r ./_build/dirhtml gs://embark-static/emote-docs - buildkite-agent annotate "✅ New documentation deployed at https://static.embark.net/emote-docs/" --style "success" --context "sphinx" + gsutil rsync -r ./dist/docs/book gs://embark-static/emote-docs + buildkite-agent annotate "✅ New documentation deployed at https://static.embark.net/emote-docs/" --style "success" --context "pants" else - buildkite-agent annotate "✅ Documentation built succesfully" --style "success" --context "sphinx" + buildkite-agent annotate "✅ Documentation built succesfully" --style "success" --context "pants" fi fi -popd diff --git a/.buildkite/run-bandit.sh b/.buildkite/run-bandit.sh deleted file mode 100644 index 947bb0bb..00000000 --- a/.buildkite/run-bandit.sh +++ /dev/null @@ -1,23 +0,0 @@ -set -eo pipefail - -source .buildkite/install-repo.sh - -echo --- Running bandit - -EXIT_CODE=0 -${PDM_COMMAND:1:-1} run bandit --r emote experiments tests -ll > diff.txt || EXIT_CODE=$? - -if [ $EXIT_CODE -ne 0 ]; then - cat << EOF | buildkite-agent annotate --style "error" --context "bandit" -:warning: \`bandit\` found issues with your code. Please fix the below issues, and update your PR. - -\`\`\`diff -$(cat diff.txt) -\`\`\` - -EOF -else - buildkite-agent annotate "✅ \`bandit\` found no code issues." --style "success" --context "bandit" -fi - -exit $EXIT_CODE diff --git a/.buildkite/run-black.sh b/.buildkite/run-black.sh deleted file mode 100644 index 50375475..00000000 --- a/.buildkite/run-black.sh +++ /dev/null @@ -1,23 +0,0 @@ -set -eo pipefail - -source .buildkite/install-repo.sh - -echo --- Running black - -EXIT_CODE=0 -${PDM_COMMAND:1:-1} run black --check --diff emote tests experiments > diff.txt || EXIT_CODE=$? - -if [ $EXIT_CODE -ne 0 ]; then - cat << EOF | buildkite-agent annotate --style "error" --context "black" -:warning: Your code isn't formatted by \`black\`. Please fix the below diffs, or run \`pdm run black emote tests experiments\` to automatically format it. - -\`\`\`diff -$(cat diff.txt) -\`\`\` - -EOF -else - buildkite-agent annotate "✅ Code formatted correctly " --style "success" --context "black" -fi - -exit $EXIT_CODE diff --git a/.buildkite/run-flake8.sh b/.buildkite/run-flake8.sh deleted file mode 100644 index 5ffdf782..00000000 --- a/.buildkite/run-flake8.sh +++ /dev/null @@ -1,23 +0,0 @@ -set -eo pipefail - -source .buildkite/install-repo.sh - -echo --- Running flake8 - -EXIT_CODE=0 -${PDM_COMMAND:1:-1} run flake8 emote experiments tests > diff.txt || EXIT_CODE=$? - -if [ $EXIT_CODE -ne 0 ]; then - cat << EOF | buildkite-agent annotate --style "error" --context "flake8" -:warning: \`flake8\` found issues with your code. Please fix the below issues, and update your PR. - -\`\`\`diff -$(cat diff.txt) -\`\`\` - -EOF -else - buildkite-agent annotate "✅ \`flake8\` found no code issues." --style "success" --context "flake8" -fi - -exit $EXIT_CODE diff --git a/.buildkite/run-isort.sh b/.buildkite/run-isort.sh deleted file mode 100644 index 20db4851..00000000 --- a/.buildkite/run-isort.sh +++ /dev/null @@ -1,23 +0,0 @@ -set -eo pipefail - -source .buildkite/install-repo.sh - -echo --- Running isort - -EXIT_CODE=0 -${PDM_COMMAND:1:-1} run isort --check --diff emote tests experiments > diff.txt || EXIT_CODE=$? -cat diff.txt - -if [ $EXIT_CODE -ne 0 ]; then - cat << EOF | buildkite-agent annotate --style "error" --context "isort" -:warning: Your imports aren't sorted by \`isort\`. Please fix the below diffs, or run \`pdm run isort emote tests experiments\` to automatically format it. - -\`\`\`diff -$(cat diff.txt) -\`\`\` -EOF -else - buildkite-agent annotate "✅ Imports sorted correctly " --style "success" --context "isort" -fi - -exit $EXIT_CODE diff --git a/.buildkite/run-package.sh b/.buildkite/run-package.sh deleted file mode 100644 index 18a4c7db..00000000 --- a/.buildkite/run-package.sh +++ /dev/null @@ -1,23 +0,0 @@ -set -eo pipefail - -source .buildkite/install-repo.sh - -echo --- Packaging emote - -EXIT_CODE=0 -${PDM_COMMAND:1:-1} build > errors.txt || EXIT_CODE=$? - -if [ $EXIT_CODE -ne 0 ]; then - cat << EOF | buildkite-agent annotate --style "error" --context "package" -:warning: Packaging failed. Please see below errors and correct any issues. You can try packaging locally with `pdm build`. - -\`\`\`shell -$(cat errors.txt) -\`\`\` - -EOF -else - buildkite-agent annotate "✅ Packaging succeeded." --style "success" --context "package" -fi - -exit $EXIT_CODE diff --git a/.buildkite/run-pytest.sh b/.buildkite/run-pytest.sh deleted file mode 100644 index 4969b17f..00000000 --- a/.buildkite/run-pytest.sh +++ /dev/null @@ -1,24 +0,0 @@ -set -eo pipefail - -source .buildkite/install-repo.sh - -echo --- Running pytest - - -EXIT_CODE=0 -${PDM_COMMAND:1:-1} run pytest --color=yes tests emote > errors.txt || EXIT_CODE=$? - -if [ $EXIT_CODE -ne 0 ]; then - cat << EOF | buildkite-agent annotate --style "error" --context "pytest" -:warning: Tests failed. Please see below errors and correct any issues. You can run tests locally with \`pdm run pytest tests emote\`. - -\`\`\`term -$(cat errors.txt) -\`\`\` - -EOF -else - buildkite-agent annotate "✅ All tests passed." --style "success" --context "pytest" -fi - -exit $EXIT_CODE diff --git a/.buildkite/validate-lockfile.sh b/.buildkite/validate-lockfile.sh deleted file mode 100644 index 5e608416..00000000 --- a/.buildkite/validate-lockfile.sh +++ /dev/null @@ -1,19 +0,0 @@ -set -eo pipefail - -${PDM_COMMAND:1:-1} install --plugins - -EXIT_CODE=0 -TORCH_EXIT_CODE=0 - -${PDM_COMMAND:1:-1} lock --check || EXIT_CODE=$? -${PDM_COMMAND:1:-1} torch lock --check || TORCH_EXIT_CODE=$? - -if [ $EXIT_CODE -ne 0 ] || [ $TORCH_EXIT_CODE -ne 0 ]; then - cat << EOF | buildkite-agent annotate --style "error" --context "lockfile" -:lock: Lockfiles are outdated. Please run \`pdm lock && pdm torch lock\` and commit the result. -EOF - exit 1 -else - buildkite-agent annotate --style "success" --context "lockfile" ":lock: Lockfile is up to date." - exit 0 -fi diff --git a/.github/workflows/build-docs.yml b/.github/workflows/build-docs.yml new file mode 100644 index 00000000..96a01fe8 --- /dev/null +++ b/.github/workflows/build-docs.yml @@ -0,0 +1,19 @@ +name: Build docs + +on: + pull_request: + workflow_dispatch: + +env: + PANTS_BACKEND_PACKAGES: '-["pants.backend.python.providers.experimental.pyenv"]' + PANTS_VERIFY_CONFIG: false + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Generate docs + uses: ./.github/workflows/docs diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml new file mode 100644 index 00000000..aef7aa34 --- /dev/null +++ b/.github/workflows/deploy-docs.yml @@ -0,0 +1,45 @@ +name: Deploy docs to Pages + +on: + push: + branches: ["main"] + workflow_dispatch: + +env: + PANTS_BACKEND_PACKAGES: '-["pants.backend.python.providers.experimental.pyenv"]' + PANTS_VERIFY_CONFIG: false + +permissions: + contents: read + pages: write + id-token: write + +concurrency: + group: "pages" + cancel-in-progress: true + +jobs: + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Generate docs + uses: ./.github/workflows/docs + + - name: Setup Pages + uses: actions/configure-pages@v2 + + - name: Upload artifact + uses: actions/upload-pages-artifact@v1 + with: + # Upload entire repository + path: 'dist/docs/book' + + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v1 diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml deleted file mode 100644 index 12eba961..00000000 --- a/.github/workflows/docs.yml +++ /dev/null @@ -1,64 +0,0 @@ -name: Deploy static content to Pages - -on: - pull_request: - branches: [main] - push: - branches: ["main"] - workflow_dispatch: - -permissions: - contents: read - pages: write - id-token: write - -concurrency: - group: "pages" - cancel-in-progress: true - -jobs: - build-docs: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v3 - - name: Accept Repository Changes - run: | - sudo apt-get --allow-releaseinfo-change update - - name: Setup Graphviz - uses: ts-graphviz/setup-graphviz@v1 - - name: Setup Pages - uses: actions/configure-pages@v2 - - name: Setup PDM - uses: pdm-project/setup-pdm@v3 - with: - python-version: '3.10' - architecture: x64 - version: 2.10.1 - prerelease: false - enable-pep582: true - cache: true - cache-dependency-path: '**/pdm.lock' - - name: Install dependencies - run: pdm install --plugins && pdm install -d -G ci && pdm torch install cpu - - name: Build docs - run: cd docs && make deploy - - name: Upload artifact - uses: actions/upload-pages-artifact@v1 - with: - name: doc-build - path: 'docs/_build/dirhtml' - - deploy: - needs: build-docs - if: github.ref == 'refs/heads/main' - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - runs-on: ubuntu-latest - steps: - - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@v1 - with: - artifact_name: doc-build diff --git a/.github/workflows/docs/action.yml b/.github/workflows/docs/action.yml new file mode 100644 index 00000000..1f0ec4de --- /dev/null +++ b/.github/workflows/docs/action.yml @@ -0,0 +1,28 @@ +name: 'Generate docs' + +runs: + using: "composite" + steps: + - name: Set up Python 3.10 + uses: actions/setup-python@v4 + with: + python-version: '3.10' + + - name: Tell Pants to use Python 3.10 + shell: bash + run: | + echo "PY=python3.10" >> $GITHUB_ENV + echo "PANTS_PYTHON_INTERPRETER_CONSTRAINTS=['==3.10.*']" >> $GITHUB_ENV + + - name: Initialize Pants + uses: pantsbuild/actions/init-pants@main + with: + # cache0 makes it easy to bust the cache if needed + gha-cache-key: cache0-py3.10 + named-caches-hash: ${{ hashFiles('locks/*.lock', 'locks/tools/*.lock') }} + + - name: Build docs + shell: bash + run: | + . ci/init.sh + pants package //docs:book diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index cd35ab15..000e3ddb 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -15,22 +15,16 @@ jobs: - name: Fetch tags run: git fetch --prune --unshallow --tags - - uses: pdm-project/setup-pdm@v3 - name: Setup PDM + - name: Initialize Pants + uses: pantsbuild/actions/init-pants@main with: - python-version: '3.10' - architecture: x64 - version: 2.10.1 - prerelease: true - enable-pep582: true - cache: true - cache-dependency-path: '*.lock' # we have pdm.lock and torch.lock - - - name: Install dependencies - run: pdm install -d -G ci + # cache0 makes it easy to bust the cache if needed + gha-cache-key: cache0-py3.10 + named-caches-hash: ${{ hashFiles('locks/*.lock', 'locks/tools/*.lock') }} + pants-python-version: 3.10 - name: Build Packages - run: pdm build + run: pants package //:package - name: "Build Changelog" id: github_release @@ -56,4 +50,4 @@ jobs: env: PDM_PUBLISH_PASSWORD: ${{ secrets.PYPI_TOKEN }} - run: pdm publish -r pypi -u __token__ + run: pants publish //:package diff --git a/.gitignore b/.gitignore index bd17e327..5e62b625 100644 --- a/.gitignore +++ b/.gitignore @@ -7,21 +7,17 @@ __pycache__/ *.egg-info .coverage -# Files generated by the docs publishing systems -docs/_build -docs/generated -docs/coverage.rst +# Files generated by the build systems +/dist/ # Outputs from Emote and tests *.onnx runs/** -/.pdm.toml -/dist/ /.buildkite/digest.txt -/docs/adr/ wandb/** __pypackages__/ -.pdm-python -.DS_STORE \ No newline at end of file +.DS_STORE +.pants.d/ +.pids/ diff --git a/.pypirc b/.pypirc new file mode 100644 index 00000000..848af7f8 --- /dev/null +++ b/.pypirc @@ -0,0 +1,6 @@ +[distutils] +index-servers = + pypi + +[pypi] +username: embark-studios diff --git a/BUILD b/BUILD new file mode 100644 index 00000000..655f14a6 --- /dev/null +++ b/BUILD @@ -0,0 +1,102 @@ +TORCH_VERSION = "1.12.0" +CUDA_VERSION = "cu116" + +TORCH_VARIANTS = { + "base": f"=={TORCH_VERSION},!={TORCH_VERSION}+cpu,!={TORCH_VERSION}+{CUDA_VERSION}", + "cpu": f"=={TORCH_VERSION}+cpu,!={TORCH_VERSION}+{CUDA_VERSION}", + "gpu": f"=={TORCH_VERSION}+{CUDA_VERSION},!={TORCH_VERSION}+cpu", +} + + +if is_standalone(): + resolves = ["cpu", "gpu", "base"] + + __defaults__( + { + python_source: dict(resolve=parametrize(*resolves)), + python_sources: dict(resolve=parametrize(*resolves)), + } + ) + + TOOLS = { + "pytest": [ + "pytest-cov!=2.12.1,<3.1,>=2.12", + "pytest-xdist<3,>=2.5", + "pytest~=8.0", + "pytest-platform-markers", + "pytest-rerunfailures", + "pytest-benchmark==4.0.0", + ], + "black": ["black>=22.6.0,<24"], + "ipython": ["ipython>=7.27.0,<8"], + "isort": ["isort[pyproject,colors]>=5.9.3,<6.0"], + "docformatter": ["docformatter[tomli]"], + "apibook": ["apibook~=0.1.0"], + } + + for tool, reqs in TOOLS.items(): + python_requirement( + name=tool, + requirements=reqs, + resolve=tool, + ) + + for resolve in resolves: + python_requirements( + name=resolve, + source="pyproject.toml", + resolve=resolve, + module_mapping={ + "protobuf": ["google.protobuf"], + "opencv-python": ["cv2"], + }, + overrides={ + "gymnasium": {"dependencies": [f":{resolve}#box2d-py", f":{resolve}#pygame"]} + }, + ) + + python_requirement( + name=f"pytest-{resolve}", + requirements=TOOLS["pytest"], + resolve=resolve, + ) + +resources( + name="adr", + sources=["adr/*.md"], +) + +resources(name="package_data", sources=["pyproject.toml", "README.md"]) + +python_distribution( + name="package", + dependencies=[ + ":package_data", + emote_dependency_path("/emote:emote@resolve=base"), + emote_dependency_path("/emote/algorithms@resolve=base"), + emote_dependency_path("/emote/algorithms/genrl@resolve=base"), + emote_dependency_path("/emote/memory@resolve=base"), + emote_dependency_path("/emote/nn@resolve=base"), + ], + provides=python_artifact( + name="emote", + version="0.1.0", + long_description_content_type="markdown", + ), + repositories=[ + "@pypi", + ], + long_description_path="./README.md", + interpreter_constraints=[">=3.10,<3.11"], +) + +pex_binary( + name="tensorboard", + entry_point="tensorboard.main:run_main", + dependencies=["//:cpu#tensorboard"], + resolve="cpu", +) + +shell_sources( + name="root", +) diff --git a/README.md b/README.md index 4eb3f573..39a8f867 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,6 @@ reinforcement learning [![Embark](https://img.shields.io/badge/discord-ark-%237289da.svg?logo=discord)](https://discord.gg/dAuKfZS) [![Build status](https://badge.buildkite.com/968ac3c0bb075fb878f9f973ed91406c8b257b0f050c197542.svg?theme=github&branch=main)](https://buildkite.com/embark-studios/emote) [![Docs status](https://img.shields.io/badge/Docs-latest-brightgreen)](https://embarkstudios.github.io/emote/) -[![pdm-managed](https://img.shields.io/badge/PDM-v2.10.1-blueviolet)](https://pdm.fming.dev) 🚧 This project is a **work in progress**. Things can and will change. 🚧 @@ -45,7 +44,7 @@ Using the components provided with Emote, we can write this as device = torch.device("cpu") env = DictGymWrapper(AsyncVectorEnv(10 * [HitTheMiddle])) table = DictObsTable(spaces=env.dict_space, maxlen=1000, device=device) -memory_proxy = TableMemoryProxy(table) +memory_proxy = MemoryTableProxy(table) dataloader = MemoryLoader(table, 100, 2, "batch_size") q1 = QNet(2, 1) @@ -110,27 +109,14 @@ class PolicyLoss(LossCallback): ## Installation -For installation and environment handling we use `pdm`. Install it from [pdm](https://pdm.fming.dev/latest/#installation). After `pdm` is set up, set up and activate the emote environment by running +For package management and environment handling we use `pants`. Install it from [pants](https://v1.pantsbuild.org/install.html). After `pants` is set up, verify that it is setup by running ```bash -pdm install -``` - -or for a full developer installation with all the extra dependencies: - -```bash -pdm install -d -G :all +pants tailor :: ``` ### Common problems -**Torch won't install:** Check that your python version is correct. Try deleting your `.venv` and recreating it with - -```bash -pdm venv create 3.10 -pdm install -G :all -``` - **Box2d complains:** Box2d needs swig and python bindings. On apt-based systems try ```bash diff --git a/adr/doc.md b/adr/README.md similarity index 100% rename from adr/doc.md rename to adr/README.md diff --git a/ci/BUILD b/ci/BUILD new file mode 100644 index 00000000..6c95f663 --- /dev/null +++ b/ci/BUILD @@ -0,0 +1 @@ +shell_sources() diff --git a/ci/init.sh b/ci/init.sh new file mode 100644 index 00000000..2d577569 --- /dev/null +++ b/ci/init.sh @@ -0,0 +1,34 @@ +#!/usr/bin/env bash + +set -exo pipefail + +if [[ -n "$GITHUB_ACTIONS" ]]; then + sudo apt update + sudo apt install -y \ + build-essential \ + libssl-dev \ + zlib1g-dev \ + libbz2-dev \ + libreadline-dev \ + libsqlite3-dev \ + curl \ + libncursesw5-dev \ + xz-utils \ + tk-dev \ + libxml2-dev \ + libxmlsec1-dev \ + libffi-dev \ + liblzma-dev \ + swig \ + graphviz +fi + +export PATH="/root/bin/:$PATH" + +if ! command -v pants &>/dev/null; then + bash get-pants.sh +fi + +gcloud config set account monorepo-ci@embark-builds.iam.gserviceaccount.com + +echo "--- Running main build step" diff --git a/docs/BUILD b/docs/BUILD new file mode 100644 index 00000000..151f6a12 --- /dev/null +++ b/docs/BUILD @@ -0,0 +1,95 @@ +python_sources(name="py") + +DOC_DEPS = [ + emote_dependency_path(":adr"), + emote_dependency_path("/emote@resolve=base"), + emote_dependency_path("/emote/algorithms@resolve=base"), + emote_dependency_path("/emote/algorithms/genrl@resolve=base"), + emote_dependency_path("/emote/callbacks@resolve=base"), + emote_dependency_path("/emote/env@resolve=base"), + emote_dependency_path("/emote/env/box2d@resolve=base"), + emote_dependency_path("/emote/extra@resolve=base"), + emote_dependency_path("/emote/memory@resolve=base"), + emote_dependency_path("/emote/mixins@resolve=base"), + emote_dependency_path("/emote/models@resolve=base"), + emote_dependency_path("/emote/nn@resolve=base"), + emote_dependency_path("/emote/utils@resolve=base"), + emote_dependency_path("/experiments/gym@resolve=base"), +] + +pex_binary( + name="adr", + entry_point="adr.py", + resolve="base", +) + +resource( + name="template", + source="./SUMMARY.tmpl", +) + +pex_binary( + name="apibook", + entry_point="apibook.cli:main", + dependencies=["//:apibook#apibook"], + resolve="apibook", +) + +adhoc_tool( + name="build-apibook", + runnable=":apibook", + args=["../emote", "src", "--summary-template-file", "SUMMARY.tmpl"], + execution_dependencies=DOC_DEPS + + [ + ":template", + ], + log_output=True, + output_directories=["src"], + root_output_directory="/", +) + +system_binary( + name="dot", + binary_name="dot", +) + +pex_binary( + name="graphviz", + entry_point="graphviz.py", + resolve="base", +) + +resources( + name="dot-files", + sources=["raw/*.dot"], +) + +adhoc_tool( + name="build-dot", + runnable=":graphviz", + args=["./raw", "./src"], + execution_dependencies=[":dot-files"], + runnable_dependencies=[":dot"], + log_output=True, + output_directories=["src"], + root_output_directory="/", +) + +md_book( + name="book", + sources=["book.toml", "src/*.md", "adr.py"], + dependencies=DOC_DEPS + + [ + ":build-apibook", + ":build-dot", + ], +) + +# Hack to somewhat easily serve the generated doc book +pex_binary( + name="serve", + entry_point="http.server", + resolve="base", + args=["-d", "dist/docs/book"], + dependencies=[":book"], +) diff --git a/docs/Makefile b/docs/Makefile deleted file mode 100644 index 062c8deb..00000000 --- a/docs/Makefile +++ /dev/null @@ -1,26 +0,0 @@ -# Minimal makefile for Sphinx documentation -# - -# You can set these variables from the command line, and also -# from the environment for the first two. -PDM ?= pdm -SPHINXOPTS ?= -SPHINXBUILD ?= $(PDM) run sphinx-build -SOURCEDIR = . -BUILDDIR = _build - -# Put it first so that "make" without argument is like "make help". -help: - @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) - -.PHONY: help Makefile - -# Catch-all target: route all unknown targets to Sphinx using the new -# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). -%: Makefile - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) - -deploy: - @$(SPHINXBUILD) -M coverage "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) - cp "$(BUILDDIR)/coverage/python.txt" "$(SOURCEDIR)/coverage.rst" - @$(SPHINXBUILD) -M dirhtml "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/SUMMARY.tmpl b/docs/SUMMARY.tmpl new file mode 100644 index 00000000..ffc3cb92 --- /dev/null +++ b/docs/SUMMARY.tmpl @@ -0,0 +1,15 @@ +# Emote + +[Introduction](./intro.md) + +# Design + +- [Coding standard](./coding-standard.md) +- [Editing documentation](./documentation.md) +- [Metrics](./metrics.md) +- [Getting started](./getting_started.md) +- [Callback system](./callback.md) + +# API Reference + +{{apibook_toc}} diff --git a/docs/_templates/autosummary/class.rst b/docs/_templates/autosummary/class.rst deleted file mode 100644 index e7441664..00000000 --- a/docs/_templates/autosummary/class.rst +++ /dev/null @@ -1,32 +0,0 @@ -{{ objname | escape | underline}} - -.. currentmodule:: {{ module }} - -.. autoclass:: {{ objname }} - :members: - :show-inheritance: - :inherited-members: - - {% block methods %} - .. automethod:: __init__ - - {% if methods %} - .. rubric:: {{ _('Methods') }} - - .. autosummary:: - {% for item in methods %} - ~{{ name }}.{{ item }} - {%- endfor %} - {% endif %} - {% endblock %} - - {% block attributes %} - {% if attributes %} - .. rubric:: {{ _('Attributes') }} - - .. autosummary:: - {% for item in attributes %} - ~{{ name }}.{{ item }} - {%- endfor %} - {% endif %} - {% endblock %} diff --git a/docs/adr.py b/docs/adr.py new file mode 100644 index 00000000..5bc39897 --- /dev/null +++ b/docs/adr.py @@ -0,0 +1,91 @@ +"""Expands tabs into HTML.""" + +import dataclasses +import json +import os +import pathlib +import sys + + +@dataclasses.dataclass +class MarkdownFile: + name: str + path: str + section: str + is_index: bool + + +def find_all_markdowns(root: str) -> dict[str, str]: + """Find all markdown files in the given directory.""" + markdowns = {} + for root, dirs, files in os.walk(root): + for file in files: + if file.endswith(".md"): + markdowns[file] = os.path.join(root, file) + + return markdowns + + +def output_chapter(path: str, number: int): + """Read the markdown file and output the chapter.""" + file_content = pathlib.Path(path).read_text() + + # parse the title from the non-empty line + name = "" + + for line in file_content.splitlines(): + if line.strip(): + name = line.strip("# ") + break + + chapter = { + "name": name, + "content": file_content, + "number": number, + "sub_items": [], + "parent_names": [], + "path": f"{path[2:]}", + "source_path": f"../../{path[2:]}", + } + + return chapter + + +if __name__ == "__main__": + if len(sys.argv) > 1: + if sys.argv[1] == "supports": + sys.exit(0) + + context, book = json.load(sys.stdin) + + config = context["config"]["preprocessor"]["adr"] + + for section in config["section"]: + markdowns = find_all_markdowns(section["path"]) + title = section["title"] + book["sections"].append( + { + "PartTitle": title, + } + ) + + # we process the readme first to make it the index + if "README.md" in markdowns: + p = markdowns.pop("README.md") + chapter = output_chapter(p, [1]) + chapter["name"] = title + book["sections"].append( + { + "Chapter": chapter, + } + ) + + for idx, path in enumerate(sorted(markdowns.keys())): + chapter = output_chapter(markdowns[path], [idx + 1]) + book["sections"].append( + { + "Chapter": chapter, + } + ) + + print(json.dumps(book)) diff --git a/docs/book.toml b/docs/book.toml new file mode 100644 index 00000000..a03536a6 --- /dev/null +++ b/docs/book.toml @@ -0,0 +1,33 @@ +[book] +title = "Emote" +authors = ["Embark Studios `_ following the instructions on the -PDM site. Then install the package using :: - - pdm install - -Currently, our supported version of PDM is 2.10 -- other versions may work, but there are no guarantees. - -Ideas and Philosophy -==================== - -We wanted a reinforcement learning framework that was modular both in the -sense that we could easily swap the algorithm we used and how data was collected -but also in the sense that the different parts of various algorithms could be reused -to build other algorithms. - -.. automodule:: emote - - -.. toctree:: - :maxdepth: 2 - :caption: Design - :hidden: - - self - installing-torch - coding-standard - 📚 Editing documentation - 🌡 Metrics - 🚀 Getting Started - -.. toctree:: - :maxdepth: 6 - :caption: API Documentation - :hidden: - - emote - memory - callback - callbacks - -.. toctree:: - :caption: Extras - :hidden: - :glob: - - Undocumented code - Architecture Desicision Records - -.. - .. include:: adr/doc.md - .. include:: documentation.md - .. include:: metrics.md - .. include:: getting_started.md - - :parser: myst_parser.sphinx_ - -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` diff --git a/docs/installing-torch.rst b/docs/installing-torch.rst deleted file mode 100644 index 15165588..00000000 --- a/docs/installing-torch.rst +++ /dev/null @@ -1,39 +0,0 @@ -🔥 Installing Torch -=================== - -Pytorch supports multiple variants of hardware and compute -backends. Due to how Python versioning works and how Pytorch publishes -their packages; it is impossible to use all of these as dependencies, -optional or not. We still want to make it easy and quick to install -this package, and develop it. - -As a starting step, we offer the extra group `torch`. As the name -implies, this'll use our pinned version of torch with CPU sort and the -default CUDA support. This is quick and easy to install, and works -well for testing and development. - -GPU support ------------ - -Depending on how you use ``emote``, you'll need to approach GPU support slightly differently. - -Using the emote repository and PDM -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -For those wanting GPU support; we have a plugin for PDM to help install these variants while -maintaining compatibility and the lockfile securities. This plugin is exposed as ``pdm torch`` after -installing the repository. - -To install a specific backend API for torch; use the command ``pdm torch install {API}``. We have -enabled ``cpu`` and ``cu116`` by default. If you're using the repository and something is missing -that you need, feel free to add it and PR it back to us. Any backend selected here has to be -available from a PEP503 or PEP621 page hosted by PyTorch. - -When installing from PyPi -^^^^^^^^^^^^^^^^^^^^^^^^^ - -Our suggestion is to avoid mixing package managers and Python Interpreters. We'd suggest following the method of the -plugin and installing torch from PyTorch's PEP503 index. For example; for CUDA 11.1 you can use the command ``pip -install -i https://download.pytorch.org/whl/cu116/ torch==$TORCH_VERSION``. There's other pages for other APIs. There's -also a generic `repository `_ which provides a combination of APIs, such as pure CPU -and rocm. diff --git a/docs/make.bat b/docs/make.bat deleted file mode 100644 index 8084272b..00000000 --- a/docs/make.bat +++ /dev/null @@ -1,35 +0,0 @@ -@ECHO OFF - -pushd %~dp0 - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=sphinx-build -) -set SOURCEDIR=. -set BUILDDIR=_build - -if "%1" == "" goto help - -%SPHINXBUILD% >NUL 2>NUL -if errorlevel 9009 ( - echo. - echo.The 'sphinx-build' command was not found. Make sure you have Sphinx - echo.installed, then set the SPHINXBUILD environment variable to point - echo.to the full path of the 'sphinx-build' executable. Alternatively you - echo.may add the Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.https://www.sphinx-doc.org/ - exit /b 1 -) - -%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% -goto end - -:help -%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% - -:end -popd diff --git a/docs/memory.rst b/docs/memory.rst deleted file mode 100644 index d8a095db..00000000 --- a/docs/memory.rst +++ /dev/null @@ -1,130 +0,0 @@ -emote.memory -============ - -.. currentmodule:: emote.memory -.. automodule:: emote.memory - -This module contains all the major building blocks for our memory -implementation. The memory was developed in the same time period as -`DeepMind's Reverb `_, and shares -naming with it, which in turn is borrowing from databases. What is not -alike Reverb is that we do not have the RateSamplers (but it can be -added). We also do not share data between ArrayTables. - -The goal of the memory is to provide a unified interface for all types of -machine learning tasks. This is achieved by focusing on configuration and -pluggability over code-driven functionality. - -Currently, there are three main points of customization: - -* Shape and type of data -* Insertion, sampling, and eviction -* Data transformation and generation - -High-level parts ----------------- - -ArrayTable -########## - -A table is a datastructure containing a specific type of data that shares the same high-level structure. - -.. autosummary:: - :toctree: generated - - Table - -Columns and Virtual Columns -########################### - -A column is a storage for a specific type of data where each item is -the same shape and type. A virtual column is like a column, but it -references another column and does data synthesization or modification -w.r.t that. For example, dones and masks are synthetic data based only -on indices. - -.. autosummary:: - :toctree: generated - - column.Column - column.TagColumn - column.VirtualColumn - -Adaptors -######## - -Adaptors are another approach to virtual column but are more suited for -transforming the whole batch, such as scaling for reshaping specific -datas. Since this step occurs when the data has already been converted to -tensors, the full power of Tensorflow is available here and gradients will be -correctly tracked. - -.. autosummary:: - :toctree: generated - - adaptors.DictObsAdaptor - adaptors.KeyScaleAdaptor - adaptors.KeyCastAdaptor - adaptors.KeyScaleAdaptor - adaptors.TerminalAdaptor - -Strategies, Samplers and Ejectors -################################# - -Strategies are based on the delegate pattern, where we can inject implementation -details through objects instead of using inheritance. Strategies define the API -for sampling and ejection from memories, and are queried from the table upon -sampling and insertion. - -Samplers and Ejectors track the data (but do not own it!). They are used by the -table for sampling and ejection based on the policy they implement. Currently we -have Fifo and Uniform samplers and ejectors, but one could have prioritized -samplers/ejectors, etc. - -.. topic:: Bases - - .. autosummary:: - :toctree: generated - - strategy.Strategy - strategy.SampleStrategy - strategy.EjectionStrategy - - fifo_strategy.FifoStrategyBase - uniform_strategy.UniformStrategyBase - -.. topic:: Samplers - - .. autosummary:: - :toctree: generated - - fifo_strategy.FifoSampleStrategy - uniform_strategy.UniformSampleStrategy - - -.. topic:: Samplers - - .. autosummary:: - :toctree: generated - - fifo_strategy.FifoEjectionStrategy - uniform_strategy.UniformEjectionStrategy - - -Proxy Wrappers -############## - -Wrappers live around the memory proxy and extend functionality. This is a great point for data conversion, validation, and logging. - - -.. autosummary:: - :toctree: generated - - memory.TableMemoryProxyWrapper - memory.LoggingProxyWrapper - - -.. contents:: emote.memory - :depth: 3 - :local: - :backlinks: top diff --git a/docs/callback.rst b/docs/raw/callback.dot similarity index 51% rename from docs/callback.rst rename to docs/raw/callback.dot index cbd341c5..e6025a4d 100644 --- a/docs/callback.rst +++ b/docs/raw/callback.dot @@ -1,22 +1,3 @@ -emote.callback -============== - -.. currentmodule:: emote.callback -.. automodule:: emote.callback - -In this module you'll find the callback framework used by Emote. Those -who have used FastAI before will recognize it, as it's heavily -inspired by that system - but adapted for RL and our use-cases. - -The `Callback` interface -######################## - -The callback is the core interface used to hook into the Emote framework. You can think of these as events - when the training loop starts, we'll invoke `begin_training` on all callback objects. Then we'll start a new cycle, and call :meth:`Callback.begin_cycle` for those that need it. - -All in all, the flow of callbacks is like this: - -.. graphviz:: - digraph foo { rankdir=LR; node [shape=rectangle,style="rounded"] @@ -49,7 +30,3 @@ All in all, the flow of callbacks is like this: end_batch -> end_cycle [style=dashed] end_cycle -> end_training [style=dashed] } - -.. autoclass:: Callback - :members: - :member-order: bysource diff --git a/docs/src/callback.md b/docs/src/callback.md new file mode 100644 index 00000000..58a7d257 --- /dev/null +++ b/docs/src/callback.md @@ -0,0 +1,14 @@ +# Callback system + + +In this module you'll find the callback framework used by Emote. Those +who have used FastAI before will recognize it, as it's heavily +inspired by that system - but adapted for RL and our use-cases. + +## The `Callback` interface + +The callback is the core interface used to hook into the Emote framework. You can think of these as events - when the training loop starts, we'll invoke `begin_training` on all callback objects. Then we'll start a new cycle, and call :meth:`Callback.begin_cycle` for those that need it. + +All in all, the flow of callbacks is like this: + +![Dot Graph of Callback flow](./callback.png) diff --git a/docs/cart_pole.gif b/docs/src/cart_pole.gif similarity index 100% rename from docs/cart_pole.gif rename to docs/src/cart_pole.gif diff --git a/docs/coding-standard.rst b/docs/src/coding-standard.md similarity index 61% rename from docs/coding-standard.rst rename to docs/src/coding-standard.md index 7d15b511..46ff90a1 100644 --- a/docs/coding-standard.rst +++ b/docs/src/coding-standard.md @@ -1,5 +1,4 @@ -📄 Coding standard -================== +# 📄 Coding standard In emote we strive to maintain a consistent style, both visually and implementation-wise. In order to achieve this we rely on tools to @@ -13,54 +12,50 @@ we welcome contributions to these pages. However, we strive to avoid easily lead to mismatch between different editors - the description below is authoritative, not any specific editor configuration. -We also require that all commits are made using LF-only line endings. Windows users will need to configure using the below command, or set up their editor appropriately. This helps keep emote platform-generic, and reduces risk for spurious diffs or tools misbehaving. :: +We also require that all commits are made using LF-only line endings. Windows users will need to configure using the below command, or set up their editor appropriately. This helps keep emote platform-generic, and reduces risk for spurious diffs or tools misbehaving. - $ git config --global core.autocrlf true +```shell +git config --global core.autocrlf true +``` -Tools ------ +## Tools +To run the tools mentioned below on the whole repo, the easiest way is with +```shell +pants lint :: +``` -black -^^^^^ -`Black `_ is an auto-formatter for Python, +### black + + +[`Black`](https://github.com/psf/black>) is an auto-formatter for Python, which mostly matches the PEP8 rules. We use black because it doesn't support a lot of configuration, and will format for you - instead of just complaining. We do allow overrides to these styles, nor do we allow disabling of formatting anywhere. -To run black manually, you can use the command: :: - - pdm run black emote/ tests/ +### isort -Which will format all code in emote. -isort -^^^^^ - -`isort `_ is another formatting tool, +[`isort`](https://github.com/PyCQA/isort) is another formatting tool, but deals only with sorting imports. Isort is configured to be consistent with Black from within `pyproject.toml`. -To run isort manually, you can use the command: :: - - pdm run isort emote/ tests/ +## Example configurations -Example configurations ----------------------- -emacs -^^^^^ +### emacs -.. code-block:: lisp - (use-package python-black - :demand t - :after python - :hook (python-mode . python-black-on-save-mode-enable-dwim)) +```lisp +(use-package python-black + :demand t + :after python + :hook (python-mode . python-black-on-save-mode-enable-dwim)) - (use-package python-isort - :demand t - :after python - :hook (python-mode . python-isort-on-save-mode)) +(use-package python-isort + :demand t + :after python + :hook (python-mode . python-isort-on-save-mode)) +``` diff --git a/docs/src/documentation.md b/docs/src/documentation.md new file mode 100644 index 00000000..4450e2dc --- /dev/null +++ b/docs/src/documentation.md @@ -0,0 +1,10 @@ +# 📚 Documentation + +To write documentation for *emote* we use [mdBook](https://rust-lang.github.io/mdBook/) written in `Markdown` (`.md`) files. These can reference each other, and will be built into a book like HTML bundle. + +See the [mdBook markdown docs](https://rust-lang.github.io/mdBook/format/markdown.html) for details about syntax and feature support. + +## Helpful commands + +* To build the docs: `pants package //docs:book` +* To view the docs in your browser: `pants run //docs:serve` and then visit [http://localhost:8000](http://localhost:8000) diff --git a/docs/getting_started.md b/docs/src/getting_started.md similarity index 60% rename from docs/getting_started.md rename to docs/src/getting_started.md index 1f2ed253..acc7e672 100644 --- a/docs/getting_started.md +++ b/docs/src/getting_started.md @@ -4,22 +4,22 @@ In the `/experiments` folder, example runs can be found for different Gymnasium For example, you can run the cartpole example using DQN with the following command: -```python -pdm run python experiments/train_dqn_cartpole.py +```shell +pants run //experiments/gym/train_dqn_cartpole.py@resolve=base ``` ![Alt Text](cart_pole.gif) -This comes with a lot of predefined arguments, such as the learning rate, the amount of hidden layers, the batch size, etc. You can find all the arguments in the `experiments/train_dqn_cartpole.py` file. +This comes with a lot of predefined arguments, such as the learning rate, the amount of hidden layers, the batch size, etc. You can find all the arguments in the `experiments/gym/train_dqn_cartpole.py` file. ## 📊 Tensorboard To visualize the training process, you can use Tensorboard. To do so, run the following command: -```bash -pdm run tensorboard --logdir ./mllogs +```shell +pants run //:tensorboard -- --logdir ./mllogs ``` -This will start a Tensorboard server on `localhost:6006`. You can now open your browser and go to `localhost:6006` to see the training process where you can see the rewards over time, the loss over time, etc. +This will start a Tensorboard server on `localhost:6006`. You can now open your browser and go to [http://localhost:6006](http://localhost:6006) to see the training process where you can see the rewards over time, the loss over time, etc. ![Alt Text](tensorboard.png) diff --git a/docs/haarnoja_sac.png b/docs/src/haarnoja_sac.png similarity index 100% rename from docs/haarnoja_sac.png rename to docs/src/haarnoja_sac.png diff --git a/docs/src/intro.md b/docs/src/intro.md new file mode 100644 index 00000000..fbadf3ae --- /dev/null +++ b/docs/src/intro.md @@ -0,0 +1,22 @@ + +# 🍒 Emote + + +**Emote** — **E**\ mbark's **Mo**\ dular **T**\ raining **E**\ ngine — is a flexible framework +for reinforcement learning written at Embark. + +## Installation + + +For package managemend and environment handling we use `pants`. Install it from [pants](https://v1.pantsbuild.org/install.html). After `pants` is set up, verify that it is setup by running + +```shell +pants tailor :: +``` + +## Ideas and Philosophy + +We wanted a reinforcement learning framework that was modular both in the +sense that we could easily swap the algorithm we used and how data was collected +but also in the sense that the different parts of various algorithms could be reused +to build other algorithms. diff --git a/docs/metrics.md b/docs/src/metrics.md similarity index 89% rename from docs/metrics.md rename to docs/src/metrics.md index ca1bf2ed..0781d94a 100644 --- a/docs/metrics.md +++ b/docs/src/metrics.md @@ -21,12 +21,12 @@ Things behave slightly differently on the data-generation side. Our suggested (a method) is to wrap the memory with a [`LoggingProxyWrapper`](emote.memory.memory.LoggingProxyWrapper). Since all data going into the training loop passes through the memory, and all data has associated metadata, this will capture most metrics. Our suggestion is that users primarily rely on this mechanism for logging data associated with the -agents, as it'll get smoothed across all agents to reduce noise. +agents, as it will get smoothed across all agents to reduce noise. ```python env = DictGymWrapper(AsyncVectorEnv(10 * [HitTheMiddle])) -table = DictObsTable(spaces=env.dict_space, maxlen=1000, device="cpu") -table_proxy = TableMemoryProxy(table, 0, True) +table = DictObsMemoryTable(spaces=env.dict_space, maxlen=1000, device="cpu") +table_proxy = MemoryTableProxy(table, 0, True) table_proxy = LoggingProxyWrapper(table, SummaryWriter("/tmp/output_dir"), 2000) ``` diff --git a/docs/tensorboard.png b/docs/src/tensorboard.png similarity index 100% rename from docs/tensorboard.png rename to docs/src/tensorboard.png diff --git a/emote/BUILD b/emote/BUILD new file mode 100644 index 00000000..db46e8d6 --- /dev/null +++ b/emote/BUILD @@ -0,0 +1 @@ +python_sources() diff --git a/emote/__init__.py b/emote/__init__.py index fa282895..3120f477 100644 --- a/emote/__init__.py +++ b/emote/__init__.py @@ -1,8 +1,6 @@ -"""emote is a torch implementation of embarkrl - +""" Emote -======== - +===== In order to do reinforcement learning we need to have two things: A **learning protocol** that specifies which losses to use, which network @@ -13,7 +11,6 @@ In Emote, data collection is done by Collectors, the protocol for the learning algorithm is built up of Callbacks, and they are tied together by a Trainer. - """ from . import nn, utils diff --git a/emote/algorithms/BUILD b/emote/algorithms/BUILD new file mode 100644 index 00000000..db46e8d6 --- /dev/null +++ b/emote/algorithms/BUILD @@ -0,0 +1 @@ +python_sources() diff --git a/emote/algorithms/action_symmetry.py b/emote/algorithms/action_symmetry.py new file mode 100644 index 00000000..8c029e3e --- /dev/null +++ b/emote/algorithms/action_symmetry.py @@ -0,0 +1,149 @@ +from typing import Callable + +import torch + +from erupt_shared.utils.nn import Discriminator +from torch import Tensor + +from emote import Callback +from emote.algorithms.amp import gradient_loss_function +from emote.callbacks.logging import LoggingMixin +from emote.callbacks.loss import LossCallback + + +def _get_action_mapping_fn(action_indices): + """Making a mapping function to map an action vector into a lower + dimensional action vector containing only given action_indices. + + Returns: + mapping fn: The mapping function + """ + + def action_map_fn(obs: Tensor): + slices = [obs[:, f.start : f.end] for f in action_indices] + return torch.cat(slices, dim=1) + + return action_map_fn + + +class ActionSymmetryDiscriminatorLoss(LossCallback): + """This loss is used to train a discriminator for adversarial training.""" + + def __init__( + self, + discriminator: Discriminator, + right_action_map_fn: Callable[[Tensor], Tensor], + left_action_map_fn: Callable[[Tensor], Tensor], + grad_loss_weight: float, + optimizer: torch.optim.Optimizer, + lr_schedule: torch.optim.lr_scheduler._LRScheduler, + max_grad_norm: float, + data_group: str, + name: str, + ): + super().__init__( + lr_schedule=lr_schedule, + name=name, + network=discriminator, + optimizer=optimizer, + max_grad_norm=max_grad_norm, + data_group=data_group, + ) + self._discriminator = discriminator + self._right_action_map_fn = right_action_map_fn + self._left_action_map_fn = left_action_map_fn + self._grad_loss_weight = grad_loss_weight + + def loss(self, actions) -> Tensor: + """Computing the loss to train a discriminator to classify right-side + from left-side action values.""" + right_actions = self._right_action_map_fn(actions) + right_actions.requires_grad_(True) + + left_actions = self._left_action_map_fn(actions) + + pos_output = self._discriminator(right_actions) + neg_output = self._discriminator(left_actions) + + pos_loss = torch.mean(torch.square(pos_output - 1.0)) # Positive samples should label to 1. + neg_loss = torch.mean( + torch.square(neg_output + 1.0) + ) # Negative samples should label to -1. + + grad_penalty_loss = self._grad_loss_weight * gradient_loss_function( + pos_output, right_actions + ) + + loss = pos_loss + neg_loss + grad_penalty_loss + + self.log_scalar("amp_action_symmetry/loss/pos_discrimination_loss", pos_loss) + self.log_scalar("amp_action_symmetry/loss/neg_discrimination_loss", neg_loss) + self.log_scalar("amp_action_symmetry/loss/grad_loss", grad_penalty_loss) + self.log_scalar("amp_action_symmetry/loss/total", loss) + self.log_scalar("amp_action_symmetry/predict/positive_samples_mean", torch.mean(pos_output)) + self.log_scalar("amp_action_symmetry/predict/positive_samples_std", torch.std(pos_output)) + self.log_scalar("amp_action_symmetry/predict/negative_samples_mean", torch.mean(neg_output)) + self.log_scalar("amp_action_symmetry/predict/negative_samples_std", torch.std(neg_output)) + + return loss + + +class ActionSymmetryAMPReward(LoggingMixin, Callback): + """Adversarial rewarding with AMP.""" + + def __init__( + self, + discriminator: Discriminator, + right_action_map_fn: Callable[[Tensor], Tensor], + left_action_map_fn: Callable[[Tensor], Tensor], + confusion_reward_weight: float, + data_group: str, + ): + super().__init__() + self._discriminator = discriminator + self._order = 0 + self.data_group = data_group + self._reward_weight = confusion_reward_weight + self._left_action_map_fn = left_action_map_fn + self._right_action_map_fn = right_action_map_fn + + def begin_batch(self, actions: Tensor, rewards: Tensor): + """ + Updating the reward by adding the weighted AMP reward + Arguments: + actions: batch of actions + rewards: task reward + Returns + dict: the batch data with updated reward + """ + batch_size = actions.shape[0] + + right_actions = self._right_action_map_fn(actions) + left_actions = self._left_action_map_fn(actions) + + all_actions = torch.cat((right_actions, left_actions), dim=0) + + predictions = self._discriminator(all_actions) + predictions_right = predictions[:batch_size] # labeled 1 + predictions_left = predictions[batch_size:] # labeled -1 + + predictions_right = torch.clamp(predictions_right, -1.0, 1.0) + predictions_left = torch.clamp(predictions_left, -1.0, 1.0) + + confusion_reward = 1.0 - 0.25 * (predictions_left - 1.0) ** 2 + confusion_reward += 1.0 - 0.25 * (predictions_right + 1.0) ** 2 + + scaled_confusion_reward = confusion_reward * self._reward_weight + + total_reward = rewards + scaled_confusion_reward + + self.log_scalar( + "amp_action_symmetry/unscaled_confusion_reward", torch.mean(confusion_reward) + ) + self.log_scalar( + "amp_action_symmetry/scaled_confusion_reward", torch.mean(scaled_confusion_reward) + ) + self.log_scalar("amp_action_symmetry/task_reward", torch.mean(rewards)) + self.log_scalar("amp_action_symmetry/total_reward", torch.mean(total_reward)) + + return {self.data_group: {"rewards": total_reward}} diff --git a/emote/algorithms/amp.py b/emote/algorithms/amp.py index cd9216ca..906bb9f6 100644 --- a/emote/algorithms/amp.py +++ b/emote/algorithms/amp.py @@ -31,10 +31,7 @@ def gradient_loss_function(model_output: Tensor, model_input: Tensor) -> Tensor: class DiscriminatorLoss(LossCallback): - """ - This loss is used to train a discriminator for - adversarial training. - """ + """This loss is used to train a discriminator for adversarial training.""" def __init__( self, @@ -117,8 +114,8 @@ def loss(self, imitation_batch: dict, policy_batch: dict) -> Tensor: return loss -class AMPReward(Callback, LoggingMixin): - """Adversarial rewarding with AMP""" +class AMPReward(LoggingMixin, Callback): + """Adversarial rewarding with AMP.""" def __init__( self, diff --git a/emote/algorithms/genrl/BUILD b/emote/algorithms/genrl/BUILD new file mode 100644 index 00000000..db46e8d6 --- /dev/null +++ b/emote/algorithms/genrl/BUILD @@ -0,0 +1 @@ +python_sources() diff --git a/emote/algorithms/genrl/proxies.py b/emote/algorithms/genrl/proxies.py index 514e7415..971db4b8 100644 --- a/emote/algorithms/genrl/proxies.py +++ b/emote/algorithms/genrl/proxies.py @@ -4,22 +4,22 @@ import torch import torch.nn as nn -from emote.memory.memory import TableMemoryProxy -from emote.memory.table import Table +from emote.memory.memory import MemoryTableProxy +from emote.memory.table import MemoryTable from emote.typing import AgentId, DictObservation, DictResponse -class MemoryProxyWithEncoder(TableMemoryProxy): +class MemoryProxyWithEncoder(MemoryTableProxy): def __init__( self, - table: Table, + memory_table: MemoryTable, encoder: nn.Module, minimum_length_threshold: Optional[int] = None, use_terminal: bool = False, input_key: str = "obs", action_key: str = "actions", ): - super().__init__(table, minimum_length_threshold, use_terminal) + super().__init__(memory_table, minimum_length_threshold, use_terminal) self.encoder = encoder self._input_key = input_key self._action_key = action_key diff --git a/emote/algorithms/genrl/vae.py b/emote/algorithms/genrl/vae.py index 4c826167..0875db53 100644 --- a/emote/algorithms/genrl/vae.py +++ b/emote/algorithms/genrl/vae.py @@ -72,7 +72,6 @@ def __init__( self._input_key = input_key def loss(self, observation, actions): - condition = self.conditioning_func(observation[self._input_key]) samples, dist_mean, dist_log_std, _ = self.vae.forward(actions, condition) loss, info = self.vae.loss(actions, samples, dist_mean, dist_log_std) diff --git a/emote/algorithms/genrl/wrappers.py b/emote/algorithms/genrl/wrappers.py index 79dc04bb..e88efb10 100644 --- a/emote/algorithms/genrl/wrappers.py +++ b/emote/algorithms/genrl/wrappers.py @@ -27,16 +27,14 @@ def __init__( param.requires_grad = False def forward(self, latent: torch.Tensor, observation: torch.Tensor = None) -> torch.Tensor: + """Running decoder. - """ - Running decoder - - Arguments: - latent (torch.Tensor): batch x latent_size - observation (torch.Tensor): batch x obs_size + Arguments: + latent (torch.Tensor): batch x latent_size + observation (torch.Tensor): batch x obs_size - Returns: - torch.Tensor: the sample (batch x data_size) + Returns: + torch.Tensor: the sample (batch x data_size) """ latent = latent * self._latent_multiplier @@ -77,15 +75,14 @@ def __init__( param.requires_grad = False def forward(self, action: torch.Tensor, observation: torch.Tensor = None) -> torch.Tensor: - """ - Running encoder + """Running encoder. - Arguments: - action (torch.Tensor): batch x data_size - observation (torch.Tensor): batch x obs_size + Arguments: + action (torch.Tensor): batch x data_size + observation (torch.Tensor): batch x obs_size - Returns: - torch.Tensor: the mean (batch x data_size) + Returns: + torch.Tensor: the mean (batch x data_size) """ action = action.to(self.device) condition = None diff --git a/emote/algorithms/hlgauss.py b/emote/algorithms/hlgauss.py new file mode 100644 index 00000000..c4fe8316 --- /dev/null +++ b/emote/algorithms/hlgauss.py @@ -0,0 +1,149 @@ +from typing import Optional + +import torch +import torch.nn.functional as F + +from torch import Tensor, nn, optim + +from emote.callbacks.loss import LossCallback + + +class LogitNet(nn.Module): + """The QNet assumes that the input network has a num_bins property.""" + + def __init__(self, num_bins): + super().__init__() + self.num_bins = num_bins + + +class QNet(nn.Module): + """The HL Gauss QNet needs to output both the q-value based on the input + and to convert logits to q.""" + + def __init__( + self, + logit_net: LogitNet, + min_value: float, + max_value: float, + ): + super().__init__() + self.logit_net = logit_net + self.min_value = min_value + self.max_value = max_value + self.num_bins = logit_net.num_bins + support = torch.linspace(min_value, max_value, logit_net.num_bins + 1, dtype=torch.float32) + self.register_buffer("centers", (support[:-1] + support[1:]) / 2) + + def forward(self, *args, **kwargs) -> Tensor: + logits = self.logit_net(*args, **kwargs) + out = self.q_from_logit(logits) + assert 1 == out.shape[1] + return out + + def q_from_logit(self, logits: Tensor) -> Tensor: + probs = torch.softmax(logits, dim=1) + out = torch.sum(probs * self.centers, dim=-1) + out.unsqueeze_(1) + return out + + +class HLGaussLoss(nn.Module): + r"""A HLGauss loss as described by Imani and White. + + Code from Google Deepmind's + https://arxiv.org/pdf/2403.03950v1.pdf. + + :param min_value (float): Minimal value of the range of target bins. + :param max_value (float): Maximal value of the range of target bins. + :param num_bins (int): Number of bins. + :param sigma (float): Standard deviation of the Gaussian used to + convert regression targets to distributions. + """ + + def __init__(self, min_value: float, max_value: float, num_bins: int, sigma: float): + super().__init__() + self.min_value = min_value + self.max_value = max_value + self.num_bins = num_bins + self.sigma = sigma + support = torch.linspace(min_value, max_value, num_bins + 1, dtype=torch.float32) + self.register_buffer( + "support", + support, + ) + + def forward(self, logits: torch.Tensor, target: torch.Tensor) -> torch.Tensor: + t_target = self.transform_to_probs(target) + assert logits.shape == t_target.shape + return F.cross_entropy(logits, t_target) + + def transform_to_probs(self, target: torch.Tensor) -> torch.Tensor: + cdf_evals = torch.special.erf( + (self.support - target.squeeze(1).unsqueeze(-1)) + / (torch.sqrt(torch.tensor(2.0)) * self.sigma) + ) + z = cdf_evals[..., -1] - cdf_evals[..., 0] + bin_probs = cdf_evals[..., 1:] - cdf_evals[..., :-1] + return bin_probs / z.unsqueeze(-1) + + +class QLoss(LossCallback): + r"""A classification loss between the action value net and the target q. + + The target q values are not calculated here and need to be added to + the state before the loss of this module runs. + + :param name (str): The name of the module. Used e.g. while logging. + :param q (torch.nn.Module): A deep neural net that outputs the + discounted loss given the current observations and a given + action. + :param opt (torch.optim.Optimizer): An optimizer for q. + :param lr_schedule (torch.optim.lr_scheduler._LRSchedule): Learning + rate schedule for the optimizer of q. + :param max_grad_norm (float): Clip the norm of the gradient during + backprop using this value. + :param smoothing_ratio (float): The HL Gauss smoothing ratio is the + standard deviation of the Gaussian divided by the bin size. + :param data_group (str): The name of the data group from which this + Loss takes its data. + :param log_per_param_weights (bool): If true, log each individual + policy parameter that is optimized (norm and value histogram). + :param log_per_param_grads (bool): If true, log the gradients of + each individual policy parameter that is optimized (norm and + histogram). + """ + + def __init__( + self, + *, + name: str, + q: QNet, + opt: optim.Optimizer, + lr_schedule: Optional[optim.lr_scheduler._LRScheduler] = None, + max_grad_norm: float = 10.0, + smoothing_ratio: float = 0.75, + data_group: str = "default", + log_per_param_weights=False, + log_per_param_grads=False, + ): + super().__init__( + name=name, + optimizer=opt, + lr_schedule=lr_schedule, + network=q, + max_grad_norm=max_grad_norm, + data_group=data_group, + log_per_param_weights=log_per_param_weights, + log_per_param_grads=log_per_param_grads, + ) + self.q_network = q + sigma = smoothing_ratio * (q.max_value - q.min_value) / q.num_bins + loss = HLGaussLoss(q.min_value, q.max_value, q.num_bins, sigma) + self.hl_gauss = loss.to(q.centers.device) + + def loss(self, observation, actions, q_target): + logits = self.q_network.logit_net(actions, **observation) + q_value = self.q_network.q_from_logit(logits) + self.log_scalar(f"training/{self.name}_prediction", torch.mean(q_value)) + q_target = torch.clamp(q_target, self.q_network.min_value, self.q_network.max_value) + return self.hl_gauss(logits, q_target) diff --git a/emote/algorithms/sac.py b/emote/algorithms/sac.py index 8c63c78c..f6a59dc0 100644 --- a/emote/algorithms/sac.py +++ b/emote/algorithms/sac.py @@ -26,19 +26,25 @@ def soft_update_from_to(source, target, tau): # From rlkit class QLoss(LossCallback): r"""A MSE loss between the action value net and the target q. - The target q values are not calculated here and need to be added - to the state before the loss of this module runs. + The target q values are not calculated here and need to be added to + the state before the loss of this module runs. :param name (str): The name of the module. Used e.g. while logging. - :param q (torch.nn.Module): A deep neural net that outputs the discounted loss - given the current observations and a given action. + :param q (torch.nn.Module): A deep neural net that outputs the + discounted loss given the current observations and a given + action. :param opt (torch.optim.Optimizer): An optimizer for q. - :param lr_schedule (torch.optim.lr_scheduler._LRSchedule): Learning rate schedule - for the optimizer of q. - :param max_grad_norm (float): Clip the norm of the gradient during backprop using this value. - :param data_group (str): The name of the data group from which this Loss takes its data. - :param log_per_param_weights (bool): If true, log each individual policy parameter that is optimized (norm and value histogram). - :param log_per_param_grads (bool): If true, log the gradients of each individual policy parameter that is optimized (norm and histogram). + :param lr_schedule (torch.optim.lr_scheduler._LRSchedule): Learning + rate schedule for the optimizer of q. + :param max_grad_norm (float): Clip the norm of the gradient during + backprop using this value. + :param data_group (str): The name of the data group from which this + Loss takes its data. + :param log_per_param_weights (bool): If true, log each individual + policy parameter that is optimized (norm and value histogram). + :param log_per_param_grads (bool): If true, log the gradients of + each individual policy parameter that is optimized (norm and + histogram). """ def __init__( @@ -73,28 +79,36 @@ def loss(self, observation, actions, q_target): class QTarget(LoggingMixin, Callback): - r"""Creates rolling averages of the Q nets, and predicts q values using these. - - The module is responsible both for keeping the averages correct in the target q - networks and supplying q-value predictions using the target q networks. - - :param pi (torch.nn.Module): A deep neural net that outputs actions and their log - probability given a state. - :param ln_alpha (torch.tensor): The current weight for the entropy part of the - soft Q. - :param q1 (torch.nn.Module): A deep neural net that outputs the discounted loss - given the current observations and a given action. - :param q2 (torch.nn.Module): A deep neural net that outputs the discounted loss - given the current observations and a given action. - :param q1t (torch.nn.Module, optional): target Q network. (default: None) - :param q2t (torch.nn.Module, optional): target Q network. (default: None) - :param gamma (float, optional): Discount factor for the rewards in time. (default: 0.99) - :param reward_scale (float, optional): Scale factor for the rewards. (default: 1.0) - :param target_q_tau (float, optional): The weight given to the latest network in the - exponential moving average. So NewTargetQ = OldTargetQ * (1-tau) + Q*tau. (default: 0.005) - :param data_group (str, optional): The name of the data group from which this Loss takes its data. (default: "default") - :param roll_length (int, optional): Rollout length. (default: 1) - :param use_terminal_masking (bool, optional): Whether to use terminal masking for the next values. (default: False) + r"""Creates rolling averages of the Q nets, and predicts q values using + these. + + The module is responsible both for keeping the averages correct in + the target q networks and supplying q-value predictions using the + target q networks. + + :param pi (torch.nn.Module): A deep neural net that outputs actions + and their log probability given a state. + :param ln_alpha (torch.tensor): The current weight for the entropy + part of the soft Q. + :param q1 (torch.nn.Module): A deep neural net that outputs the + discounted loss given the current observations and a given + action. + :param q2 (torch.nn.Module): A deep neural net that outputs the + discounted loss given the current observations and a given + action. :param q1t (torch.nn.Module, optional): target Q + network. (default: None) :param q2t (torch.nn.Module, + optional): target Q network. (default: None) :param gamma + (float, optional): Discount factor for the rewards in time. + (default: 0.99) :param reward_scale (float, optional): Scale + factor for the rewards. (default: 1.0) :param target_q_tau + (float, optional): The weight given to the latest network in the + exponential moving average. So NewTargetQ = OldTargetQ * (1-tau) + + Q*tau. (default: 0.005) :param data_group (str, optional): The + name of the data group from which this Loss takes its data. + (default: "default") :param roll_length (int, optional): Rollout + length. (default: 1) :param use_terminal_masking (bool, + optional): Whether to use terminal masking for the next values. + (default: False) """ def __init__( @@ -165,26 +179,33 @@ def end_batch(self): class PolicyLoss(LossCallback): r"""Maximize the soft Q-value for the policy. - This loss modifies the policy to select the action that gives the highest soft q-value. - - :param pi (torch.nn.Module): A deep neural net that outputs actions and their log - probability given a state. - :param ln_alpha (torch.tensor): The current weight for the entropy part of the - soft Q. - :param q (torch.nn.Module): A deep neural net that outputs the discounted loss - given the current observations and a given action. - :param lr_schedule (torch.optim.lr_scheduler._LRSchedule): Learning rate schedule - for the optimizer of policy. + This loss modifies the policy to select the action that gives the + highest soft q-value. + + :param pi (torch.nn.Module): A deep neural net that outputs actions + and their log probability given a state. + :param ln_alpha (torch.tensor): The current weight for the entropy + part of the soft Q. + :param q (torch.nn.Module): A deep neural net that outputs the + discounted loss given the current observations and a given + action. + :param lr_schedule (torch.optim.lr_scheduler._LRSchedule): Learning + rate schedule for the optimizer of policy. :param opt (torch.optim.Optimizer): An optimizer for pi. - :param q2 (torch.nn.Module): A second deep neural net that outputs the discounted - loss given the current observations and a given action. This is not necessary - since it is fine if the policy isn't pessimistic, but can be nice for symmetry - with the Q-loss. - :param max_grad_norm (float): Clip the norm of the gradient during backprop using this value. + :param q2 (torch.nn.Module): A second deep neural net that outputs + the discounted loss given the current observations and a given + action. This is not necessary since it is fine if the policy + isn't pessimistic, but can be nice for symmetry with the Q-loss. + :param max_grad_norm (float): Clip the norm of the gradient during + backprop using this value. :param name (str): The name of the module. Used e.g. while logging. - :param data_group (str): The name of the data group from which this Loss takes its data. - :param log_per_param_weights (bool): If true, log each individual policy parameter that is optimized (norm and value histogram). - :param log_per_param_grads (bool): If true, log the gradients of each individual policy parameter that is optimized (norm and histogram). + :param data_group (str): The name of the data group from which this + Loss takes its data. + :param log_per_param_weights (bool): If true, log each individual + policy parameter that is optimized (norm and value histogram). + :param log_per_param_grads (bool): If true, log the gradients of + each individual policy parameter that is optimized (norm and + histogram). """ def __init__( @@ -238,24 +259,24 @@ def loss(self, observation): class AlphaLoss(LossCallback): r"""Tweaks the alpha so that a specific target entropy is kept. - The target entropy is scaled with the number of actions and a provided entropy - scaling factor. + The target entropy is scaled with the number of actions and a + provided entropy scaling factor. - :param pi (torch.nn.Module): A deep neural net that outputs actions and their log - probability given a state. - :param ln_alpha (torch.tensor): The current weight for the entropy part of the - soft Q. - :param lr_schedule (torch.optim.lr_scheduler._LRSchedule | None): Learning rate schedule - for the optimizer of alpha. + :param pi (torch.nn.Module): A deep neural net that outputs actions + and their log probability given a state. + :param ln_alpha (torch.tensor): The current weight for the entropy + part of the soft Q. :param lr_schedule + (torch.optim.lr_scheduler._LRSchedule | None): Learning rate + schedule for the optimizer of alpha. :param opt (torch.optim.Optimizer): An optimizer for ln_alpha. - :param n_actions (int): The dimension of the action space. Scales the target - entropy. - :param max_grad_norm (float): Clip the norm of the gradient during backprop using - this value. + :param n_actions (int): The dimension of the action space. Scales + the target entropy. + :param max_grad_norm (float): Clip the norm of the gradient during + backprop using this value. :param name (str): The name of the module. Used e.g. while logging. - :param data_group (str): The name of the data group from which this Loss takes its - data. - :param t_entropy (float | Schedule | None): Value or schedule for the target entropy. + :param data_group (str): The name of the data group from which this + Loss takes its data. :param t_entropy (float | Schedule | None): + Value or schedule for the target entropy. """ def __init__( @@ -361,7 +382,8 @@ def policy(self): class FeatureAgentProxy(GenericAgentProxy): """An agent proxy for basic MLPs. - This AgentProxy assumes that the observations will contain a single flat array of features. + This AgentProxy assumes that the observations will contain a single + flat array of features. """ @deprecated(reason="Use GenericAgentProxy instead", version="23.1.0") @@ -382,7 +404,8 @@ def __init__(self, policy: nn.Module, device: torch.device, input_key: str = "ob class VisionAgentProxy(FeatureAgentProxy): - """This AgentProxy assumes that the observations will contain image observations 'obs'""" + """This AgentProxy assumes that the observations will contain image + observations 'obs'.""" @deprecated(reason="Use GenericAgentProxy instead", version="23.1.0") def __init__(self, policy: nn.Module, device: torch.device): @@ -392,7 +415,8 @@ def __init__(self, policy: nn.Module, device: torch.device): class MultiKeyAgentProxy(GenericAgentProxy): """Handles multiple input keys. - Observations are dicts that contain multiple input keys (e.g. both "features" and "images"). + Observations are dicts that contain multiple input keys (e.g. both + "features" and "images"). """ @deprecated(reason="Use GenericAgentProxy instead", version="23.1.0") diff --git a/emote/callback.py b/emote/callback.py index 6a6447aa..57675370 100644 --- a/emote/callback.py +++ b/emote/callback.py @@ -96,7 +96,8 @@ def _wrap_callback_function(obj, func, *, group: str = None, use_group: bool = T class CallbackMeta(ABCMeta): - """The CallbackMeta metaclass modifies the callbacks so that they accept data groups.""" + """The CallbackMeta metaclass modifies the callbacks so that they accept + data groups.""" def __init__(self, cls, bases, fields): self._callbacks = {} @@ -168,11 +169,13 @@ def _wrap(func): class Callback(metaclass=CallbackMeta): """The principal modular building block of emote. - Callbacks are modular pieces of code that together build up the training loop. They contain - hooks that are executed at different points during training. These can consume values from - other callbacks, and generate their own for others to consume. This allows a very loosely - coupled flow of data between different parts of the code. The most important examples of - callbacks in emote are the Losses. + Callbacks are modular pieces of code that together build up the + training loop. They contain hooks that are executed at different + points during training. These can consume values from other + callbacks, and generate their own for others to consume. This allows + a very loosely coupled flow of data between different parts of the + code. The most important examples of callbacks in emote are the + Losses. The concept has been borrowed from Keras and FastAI. """ @@ -181,16 +184,20 @@ def __init__(self, cycle: int | None = None): super().__init__() self._order = 0 self.cycle = cycle + self.name = type(self).__name__ def restore_state(self, *args, **kwargs): - """Called before training starts to allow loader modules to import state. At this point, no - assumptions can be made for other modules state. + """Called before training starts to allow loader modules to import + state. + At this point, no assumptions can be made for other modules + state. """ pass def begin_training(self, *args, **kwargs): - """Called when training starts, both from scratch and when restoring from a checkpoint.""" + """Called when training starts, both from scratch and when restoring + from a checkpoint.""" pass def begin_cycle(self, *args, **kwargs): @@ -198,7 +205,8 @@ def begin_cycle(self, *args, **kwargs): pass def begin_batch(self, *args, **kwargs): - """Called at the start of each batch, immediately after data has been sampled.""" + """Called at the start of each batch, immediately after data has been + sampled.""" pass def backward(self, *args, **kwargs): @@ -218,7 +226,8 @@ def end_training(self, *args, **kwargs): pass def state_dict(self) -> Dict[str, Any]: - """Called by checkpointers primarily to capture state for on-disk saving.""" + """Called by checkpointers primarily to capture state for on-disk + saving.""" return {} def load_state_dict( @@ -228,7 +237,8 @@ def load_state_dict( load_optimizer: bool = True, load_hparams: bool = True, ): - """Called from checkpoint-loaders during the `restore_state` phase, primarily.""" + """Called from checkpoint-loaders during the `restore_state` phase, + primarily.""" pass diff --git a/emote/callbacks/BUILD b/emote/callbacks/BUILD new file mode 100644 index 00000000..db46e8d6 --- /dev/null +++ b/emote/callbacks/BUILD @@ -0,0 +1 @@ +python_sources() diff --git a/emote/callbacks/__init__.py b/emote/callbacks/__init__.py index c31dce04..4ad7d68f 100644 --- a/emote/callbacks/__init__.py +++ b/emote/callbacks/__init__.py @@ -1,6 +1,4 @@ -""" - -""" +"""""" from emote.callbacks.checkpointing import Checkpointer, CheckpointLoader from emote.callbacks.generic import BackPropStepsTerminator diff --git a/emote/callbacks/checkpointing.py b/emote/callbacks/checkpointing.py index 3b33f51b..5e1dccf5 100644 --- a/emote/callbacks/checkpointing.py +++ b/emote/callbacks/checkpointing.py @@ -1,32 +1,50 @@ import logging import os import time -import warnings -from typing import List +from typing import Any, Protocol import torch from emote.callback import Callback +class Restoree(Protocol): + name: str + + def state_dict(self) -> dict[str, Any]: + ... + + def load_state_dict( + self, + state_dict: dict[str, Any], + load_network: bool = True, + load_optimizer: bool = True, + load_hparams: bool = True, + ): + ... + + class Checkpointer(Callback): """Checkpointer writes out a checkpoint every n steps. - Exactly what is written to the checkpoint is determined by the callbacks - supplied in the constructor. - - :param callbacks (List[Callback]): A list of callbacks that should be saved. - :param run_root (str): The root path to where the run artifacts should be stored. - :param checkpoint_interval (int): Number of backprops between checkpoints. - :param storage_subdirectory (str): The subdirectory where the checkpoints are - stored. + Exactly what is written to the checkpoint is determined by the + restorees supplied in the constructor. + + :param restorees (list[Restoree]): A list of restorees that should + be saved. + :param run_root (str): The root path to where the run artifacts + should be stored. + :param checkpoint_interval (int): Number of backprops between + checkpoints. + :param storage_subdirectory (str): The subdirectory where the + checkpoints are stored. """ def __init__( self, *, - callbacks: List[Callback], + restorees: list[Restoree], run_root: str, checkpoint_interval: int, checkpoint_index: int = 0, @@ -36,23 +54,17 @@ def __init__( self._run_root = run_root self._checkpoint_index = checkpoint_index self._folder_path = os.path.join(run_root, storage_subdirectory) + self._restorees = restorees - self._cbs = [] - names = [] - for cb in callbacks: - if hasattr(cb, "name"): - self._cbs.append(cb) - names.append(cb.name) - else: - warnings.warn( - f"Checkpointer ignored {cb} because of not having the 'name' field.", - UserWarning, - ) - - if len(names) != len(set(names)): + names = [r.name for r in restorees] + unique_names = set(names) + if len(names) != len(unique_names): + duplicates = {n for n in unique_names if names.count(n) > 1} + dupe_string = ", ".join(duplicates) raise ValueError( - "Checkpointer is given a list of callbacks with at least" - "two callbacks with identical names" + "Checkpointer is given a list of restorees where\n" + f"[{dupe_string}]\n" + "occur multiple times" ) def begin_training(self): @@ -62,7 +74,7 @@ def end_cycle(self, bp_step, bp_samples): name = f"checkpoint_{self._checkpoint_index}.tar" final_path = os.path.join(self._folder_path, name) state_dict = { - "callback_state_dicts": {cb.name: cb.state_dict() for cb in self._cbs}, + "callback_state_dicts": {r.name: r.state_dict() for r in self._restorees}, "training_state": { "latest_checkpoint": final_path, "bp_step": bp_step, @@ -71,6 +83,7 @@ def end_cycle(self, bp_step, bp_samples): }, } torch.save(state_dict, final_path) + logging.info(f"Saved checkpoint {self._checkpoint_index} at {final_path}.") self._checkpoint_index += 1 return { @@ -80,28 +93,33 @@ def end_cycle(self, bp_step, bp_samples): class CheckpointLoader(Callback): - """CheckpointLoader loads a checkpoint like the one created by Checkpointer. - - This is intended for resuming training given a specific checkpoint index. It also - enables you to load network weights, optimizer, or other callback hyper-params - independently. If you want to do something more specific, like only restore a - specific network (outside a callback), it is probably easier to just do it - explicitly when the network is constructed. - - :param callbacks (List[Callback]): A list of callbacks that should be restored. - :param run_root (str): The root path to where the run artifacts should be stored. + """CheckpointLoader loads a checkpoint like the one created by + Checkpointer. + + This is intended for resuming training given a specific checkpoint + index. It also enables you to load network weights, optimizer, or + other callback hyper-params independently. If you want to do + something more specific, like only restore a specific network + (outside a callback), it is probably easier to just do it explicitly + when the network is constructed. + + :param restorees (list[Restoree]): A list of restorees that should + be restored. + :param run_root (str): The root path to where the run artifacts + should be stored. :param checkpoint_index (int): Which checkpoint to load. :param load_weights (bool): If True, it loads the network weights :param load_optimizers (bool): If True, it loads the optimizer state - :param load_hparams (bool): If True, it loads other callback hyper-params - :param storage_subdirectory (str): The subdirectory where the checkpoints are - stored. + :param load_hparams (bool): If True, it loads other callback hyper- + params + :param storage_subdirectory (str): The subdirectory where the + checkpoints are stored. """ def __init__( self, *, - callbacks: List[Callback], + restorees: list[Restoree], run_root: str, checkpoint_index: int, load_weights: bool = True, @@ -117,23 +135,17 @@ def __init__( self._load_weights = load_weights self._load_optimizers = load_optimizers self._load_hparams = load_hparams + self._restorees = restorees - self._cbs = [] - names = [] - for cb in callbacks: - if hasattr(cb, "name"): - self._cbs.append(cb) - names.append(cb.name) - else: - warnings.warn( - f"CheckpointLoader ignored {cb} because of not having the 'name' field.", - UserWarning, - ) - - if len(names) != len(set(names)): + names = [r.name for r in restorees] + unique_names = set(names) + if len(names) != len(unique_names): + duplicates = {n for n in unique_names if names.count(n) > 1} + dupe_string = ", ".join(duplicates) raise ValueError( - "CheckpointLoader is given a list of callbacks with at least" - "two callbacks with identical names" + "Checkpointer is given a list of restorees where\n" + f"[{dupe_string}]\n" + "occur multiple times" ) def restore_state(self): @@ -147,9 +159,11 @@ def restore_state(self): logging.info(f"Loading checkpoints from {self._folder_path}") state_dict: dict = torch.load(final_path) - for cb in self._cbs: - state = state_dict["callback_state_dicts"][cb.name] - cb.load_state_dict(state, self._load_weights, self._load_optimizers, self._load_hparams) + for restoree in self._restorees: + state = state_dict["callback_state_dicts"][restoree.name] + restoree.load_state_dict( + state, self._load_weights, self._load_optimizers, self._load_hparams + ) return_value = {} if self._load_hparams: diff --git a/emote/callbacks/generic.py b/emote/callbacks/generic.py index dbf45ad8..37449242 100644 --- a/emote/callbacks/generic.py +++ b/emote/callbacks/generic.py @@ -5,8 +5,8 @@ class BackPropStepsTerminator(Callback): """Terminates training after a given number of backprops. - :param bp_steps (int): The total number of backprops that the trainer should run - for. + :param bp_steps (int): The total number of backprops that the + trainer should run for. """ def __init__(self, bp_steps: int): diff --git a/emote/callbacks/logging.py b/emote/callbacks/logging.py index a540c74f..0bc88aab 100644 --- a/emote/callbacks/logging.py +++ b/emote/callbacks/logging.py @@ -3,6 +3,8 @@ from typing import List +import tensorboard # noqa + from torch.utils.tensorboard import SummaryWriter from emote.callback import Callback @@ -102,8 +104,8 @@ def __init__( def log_scalars(self, step, suffix=None): """Logs scalar logs adding optional suffix on the first level. - **Example:** If k='training/loss' and suffix='bp_step', k will be renamed to - 'training_bp_step/loss'. + **Example:** If k='training/loss' and suffix='bp_step', k will + be renamed to 'training_bp_step/loss'. """ for log in self._logs: for k, v in log.scalar_logs.items(): diff --git a/emote/callbacks/loss.py b/emote/callbacks/loss.py index dc1f4b29..2c35da98 100644 --- a/emote/callbacks/loss.py +++ b/emote/callbacks/loss.py @@ -114,5 +114,6 @@ def load_state_dict( def loss(self, *args, **kwargs) -> Tensor: """The loss method needs to be overwritten to implement a loss. - :return: A PyTorch tensor of shape (batch,).""" + :return: A PyTorch tensor of shape (batch,). + """ raise NotImplementedError diff --git a/emote/env/BUILD b/emote/env/BUILD new file mode 100644 index 00000000..db46e8d6 --- /dev/null +++ b/emote/env/BUILD @@ -0,0 +1 @@ +python_sources() diff --git a/emote/env/box2d/BUILD b/emote/env/box2d/BUILD new file mode 100644 index 00000000..db46e8d6 --- /dev/null +++ b/emote/env/box2d/BUILD @@ -0,0 +1 @@ +python_sources() diff --git a/emote/env/box2d/__init__.py b/emote/env/box2d/__init__.py index e8b3926f..f49042c8 100644 --- a/emote/env/box2d/__init__.py +++ b/emote/env/box2d/__init__.py @@ -1,4 +1,4 @@ -import gym +import gymnasium from emote.env.wrappers import FrameStack, ScaledFloatFrame, WarpFrame @@ -20,7 +20,7 @@ def make_vision_box2d_env( """ def _thunk(): - env = gym.make(environment_id) + env = gymnasium.make(environment_id) env.seed(seed + rank) env = WarpFrame(env) if use_float_scaling: diff --git a/emote/env/wrappers.py b/emote/env/wrappers.py index 775e38c0..e81eb03d 100755 --- a/emote/env/wrappers.py +++ b/emote/env/wrappers.py @@ -1,10 +1,10 @@ from collections import deque import cv2 -import gym +import gymnasium import numpy as np -from gym import spaces +from gymnasium import spaces cv2.ocl.setUseOpenCL(False) @@ -17,14 +17,13 @@ # Copyright (c) 2017 OpenAI (http://openai.com), used under the MIT license -class WarpFrame(gym.ObservationWrapper): +class WarpFrame(gymnasium.ObservationWrapper): def __init__(self, env, width: int = 84, height: int = 84): - """ - Warp frames to width x height + """Warp frames to width x height. :param env: (Gym Environment) the environment """ - gym.ObservationWrapper.__init__(self, env) + gymnasium.ObservationWrapper.__init__(self, env) self.width = width self.height = height self.observation_space = spaces.Box( @@ -35,8 +34,7 @@ def __init__(self, env, width: int = 84, height: int = 84): ) def observation(self, frame): - """ - returns the current observation from a frame + """Returns the current observation from a frame. :param frame: ([int] or [float]) environment frame :return: ([int] or [float]) the observation @@ -46,7 +44,7 @@ def observation(self, frame): return frame[:, :, None] -class FrameStack(gym.Wrapper): +class FrameStack(gymnasium.Wrapper): def __init__(self, env, n_frames: int): """Stack n_frames last frames. @@ -59,7 +57,7 @@ def __init__(self, env, n_frames: int): :param env: (Gym Environment) the environment :param n_frames: (int) the number of frames to stack """ - gym.Wrapper.__init__(self, env) + gymnasium.Wrapper.__init__(self, env) self.n_frames = n_frames self.frames = deque([], maxlen=n_frames) shp = env.observation_space.shape @@ -86,9 +84,9 @@ def _get_ob(self): return LazyFrames(list(self.frames)) -class ScaledFloatFrame(gym.ObservationWrapper): +class ScaledFloatFrame(gymnasium.ObservationWrapper): def __init__(self, env): - gym.ObservationWrapper.__init__(self, env) + gymnasium.ObservationWrapper.__init__(self, env) self.observation_space = spaces.Box( low=0, high=1.0, shape=env.observation_space.shape, dtype=np.float32 ) @@ -101,12 +99,12 @@ def observation(self, observation): class LazyFrames(object): def __init__(self, frames): - """ - This object ensures that common frames between the observations are only stored once. - It exists purely to optimize memory usage which can be huge for DQN's 1M frames replay - buffers. + """This object ensures that common frames between the observations are + only stored once. It exists purely to optimize memory usage which can + be huge for DQN's 1M frames replay buffers. - This object should only be converted to np.ndarray before being passed to the model. + This object should only be converted to np.ndarray before being + passed to the model. :param frames: ([int] or [float]) environment frames """ diff --git a/emote/extra/BUILD b/emote/extra/BUILD new file mode 100644 index 00000000..db46e8d6 --- /dev/null +++ b/emote/extra/BUILD @@ -0,0 +1 @@ +python_sources() diff --git a/emote/extra/__init__.py b/emote/extra/__init__.py index 8062daa4..f3b0d32f 100644 --- a/emote/extra/__init__.py +++ b/emote/extra/__init__.py @@ -1,3 +1 @@ -""" - -""" +"""""" diff --git a/emote/extra/crud_storage.py b/emote/extra/crud_storage.py index a3e7d327..6f8f35ba 100644 --- a/emote/extra/crud_storage.py +++ b/emote/extra/crud_storage.py @@ -1,6 +1,5 @@ -""" -Generic CRUD-based storage on disk. -""" +"""Generic CRUD-based storage on disk.""" + import os from dataclasses import dataclass @@ -28,8 +27,8 @@ class StorageItemHandle(Generic[T]): @staticmethod def from_string(value: str) -> Optional["StorageItemHandle"]: - """ - Parses a handle from its string representation. + """Parses a handle from its string representation. + Returns None if the handle is invalid. """ try: @@ -54,9 +53,8 @@ class StorageItem(Generic[T]): class CRUDStorage(Generic[T]): - """ - Manages a set of files on disk in a simple CRUD way. - All files will be stored to a single directory with a name on the format + """Manages a set of files on disk in a simple CRUD way. All files will be + stored to a single directory with a name on the format `{prefix}{timestamp}_{index}.{extension}`. This class is thread-safe. @@ -81,7 +79,7 @@ def __init__(self, directory: str, prefix: str = "", extension: str = "bin"): self._prefix = prefix def create_with_data(self, data: bytearray) -> StorageItem[T]: - """Creates a new file with the given data""" + """Creates a new file with the given data.""" def save(filepath): with open(filepath, "wb") as f: @@ -90,10 +88,11 @@ def save(filepath): return self.create_with_saver(save) def create_from_filepath(self, filepath: str) -> StorageItem[T]: - """ - Creates a new entry for an existing file. - The file must already be in the directory that this storage manages. - It does not need to conform to the naming convention that the CRUDStorage normally uses. + """Creates a new entry for an existing file. + + The file must already be in the directory that this storage + manages. It does not need to conform to the naming convention + that the CRUDStorage normally uses. """ assert os.path.isfile(filepath), "File does not exist" if os.path.dirname(os.path.abspath(filepath)) != self._directory: @@ -111,9 +110,10 @@ def create_from_filepath(self, filepath: str) -> StorageItem[T]: return item def create_with_saver(self, saver: Callable[[str], None]) -> StorageItem[T]: - """ - Creates a new file by saving it via the provided function. - The function will be called with the path at which the file should be saved. + """Creates a new file by saving it via the provided function. + + The function will be called with the path at which the file + should be saved. """ if not os.path.isdir(self._directory): raise Exception(f"The storage directory ({self._directory}) has been deleted") @@ -149,9 +149,7 @@ def create_with_saver(self, saver: Callable[[str], None]) -> StorageItem[T]: return item def update(self, handle: StorageItemHandle[T], data: bytearray): - """ - Updates an existing file with the given contents - """ + """Updates an existing file with the given contents.""" item = self.get(handle) assert item is not None, "Invalid handle" with open(item.filepath, "wb") as f: @@ -167,11 +165,13 @@ def items(self) -> Sequence[StorageItem[T]]: return items[:] def delete(self, handle: StorageItemHandle[T]) -> bool: - """ - Deletes an existing file owned by this storage. - :returns: True if a file was deleted, and false if the file was not owned by this storage. - :raises: Exception if this storage contains an entry for the file, - but it has been deleted on disk without going through the CRUDStorage. + """Deletes an existing file owned by this storage. + + :returns: True if a file was deleted, and false if the file was + not owned by this storage. + :raises: Exception if this storage contains an entry for the + file, but it has been deleted on disk without going through + the CRUDStorage. """ with self._items as items: for item in items: @@ -200,9 +200,10 @@ def get(self, handle: StorageItemHandle[T]) -> Optional[StorageItem[T]]: return next((item for item in items if item.handle == handle), None) def latest(self) -> Optional[StorageItem[T]]: - """ - The last storage item that was added to the storage. - If items have been deleted, this is the last item of the ones that remain. + """The last storage item that was added to the storage. + + If items have been deleted, this is the last item of the ones + that remain. """ with self._items as items: if items: diff --git a/emote/extra/onnx_exporter.py b/emote/extra/onnx_exporter.py index 843307d8..e29da4ce 100644 --- a/emote/extra/onnx_exporter.py +++ b/emote/extra/onnx_exporter.py @@ -160,10 +160,8 @@ def end_cycle(self): self.log_scalar(f"onnx_export/{name}_var_ms", var * 1000.0) def process_pending_exports(self): - """ - If you are using `export_threadsafe` the main thread must call - this method regularly to make sure things are actually exported. - """ + """If you are using `export_threadsafe` the main thread must call this + method regularly to make sure things are actually exported.""" while self.queued_exports.qsize() > 0: try: item = self.queued_exports.get_nowait() @@ -276,18 +274,19 @@ def _export(self, metadata: Optional[Mapping[str, str]], sync: bool) -> StorageI return item.block_until_complete() def export_threadsafe(self, metadata=None) -> StorageItem: - """ - Same as `export`, but it can be called in threads other than the main thread. + """Same as `export`, but it can be called in threads other than the + main thread. + This method relies on the main thread calling `process_pending_exports` from time to time. You cannot call this method from the main thread. It will block indefinitely. """ return self._export(metadata, False) def export(self, metadata=None) -> StorageItem: - """ - Serializes a model to onnx and saves it to disk. - This must only be called from the main thread. - That is, the thread which has ownership over the model and that modifies it. + """Serializes a model to onnx and saves it to disk. + + This must only be called from the main thread. That is, the + thread which has ownership over the model and that modifies it. This is usually the thread that has the training loop. """ logging.info("Starting ONNX export...") diff --git a/emote/extra/system_logger.py b/emote/extra/system_logger.py index 9164166d..39911b9f 100644 --- a/emote/extra/system_logger.py +++ b/emote/extra/system_logger.py @@ -1,6 +1,5 @@ -""" -Logger that logs the memory consumption and memory consumption growth rate. -""" +"""Logger that logs the memory consumption and memory consumption growth +rate.""" import os diff --git a/emote/memory/BUILD b/emote/memory/BUILD new file mode 100644 index 00000000..db46e8d6 --- /dev/null +++ b/emote/memory/BUILD @@ -0,0 +1 @@ +python_sources() diff --git a/emote/memory/__init__.py b/emote/memory/__init__.py index 1d9f2a78..d26380f7 100644 --- a/emote/memory/__init__.py +++ b/emote/memory/__init__.py @@ -1,5 +1,63 @@ """ +This module contains all the major building blocks for our memory +implementation. The memory was developed in the same time period as +`DeepMind's Reverb `_, and shares +naming with it, which in turn is borrowing from databases. What is not +alike Reverb is that we do not have the RateSamplers (but it can be +added). We also do not share data between ArrayTables. +The goal of the memory is to provide a unified interface for all types of +machine learning tasks. This is achieved by focusing on configuration and +pluggability over code-driven functionality. + +Currently, there are three main points of customization: + +* Shape and type of data +* Insertion, sampling, and eviction +* Data transformation and generation + + +## High-level parts + + +### ArrayTable + + +A table is a datastructure containing a specific type of data that shares the same high-level structure. + +### Columns and Virtual Columns + + +A column is a storage for a specific type of data where each item is +the same shape and type. A virtual column is like a column, but it +references another column and does data synthesization or modification +w.r.t that. For example, dones and masks are synthetic data based only +on indices. + +### Adaptors + + +Adaptors are another approach to virtual column but are more suited for +transforming the whole batch, such as scaling for reshaping specific +datas. Since this step occurs when the data has already been converted to +tensors, the full power of Tensorflow is available here and gradients will be +correctly tracked. + +### Strategies, Samplers and Ejectors + +Strategies are based on the delegate pattern, where we can inject implementation +details through objects instead of using inheritance. Strategies define the API +for sampling and ejection from memories, and are queried from the table upon +sampling and insertion. + +Samplers and Ejectors track the data (but do not own it!). They are used by the +table for sampling and ejection based on the policy they implement. Currently we +have Fifo and Uniform samplers and ejectors, but one could have prioritized +samplers/ejectors, etc. + +### Proxy Wrappers + +Wrappers live around the memory proxy and extend functionality. This is a great point for data conversion, validation, and logging. """ from .callbacks import MemoryImporterCallback @@ -8,15 +66,15 @@ LoggingProxyWrapper, MemoryExporterProxyWrapper, MemoryLoader, + MemoryTableProxy, MemoryWarmup, - TableMemoryProxy, ) -from .table import Table +from .table import MemoryTable __all__ = [ - "Table", - "TableMemoryProxy", + "MemoryTable", + "MemoryTableProxy", "MemoryLoader", "MemoryExporterProxyWrapper", "MemoryImporterCallback", diff --git a/emote/memory/adaptors.py b/emote/memory/adaptors.py index d3ef13bc..10ef2629 100644 --- a/emote/memory/adaptors.py +++ b/emote/memory/adaptors.py @@ -1,6 +1,4 @@ -""" - -""" +"""""" from typing import Callable, List, Optional @@ -13,14 +11,13 @@ class DictObsAdaptor: - """ - Converts multiple observation columns to a single dict observation. + """Converts multiple observation columns to a single dict observation. :param keys: The dictionary keys to extract - :param output_keys: The output names for the extracted keys. Defaults to the same - name. - :param with_next: If True, adds an extra column called "next_{key}" for each key - in keys. + :param output_keys: The output names for the extracted keys. + Defaults to the same name. + :param with_next: If True, adds an extra column called "next_{key}" + for each key in keys. """ def __init__( @@ -39,7 +36,7 @@ def __init__( def __call__(self, result: SampleResult, count: int, sequence_length: int) -> SampleResult: obs_dict = {} next_obs_dict = {} - for (key, out_key) in self.key_map: + for key, out_key in self.key_map: obs_dict[out_key] = result.pop(key) if self.with_next: next_obs_dict[f"{out_key}"] = result.pop("next_" + key) @@ -84,8 +81,8 @@ def __call__(self, result: SampleResult, count: int, sequence_length: int) -> Sa class TerminalAdaptor: """An adaptor to apply tags from detailed terminal tagging. - :param memory: The table to adapt - :param value_key: the key containing the terminal mask value to apply + :param value_key: the key containing the terminal mask value to + apply :param target_key: the default mask data to override """ diff --git a/emote/memory/builder.py b/emote/memory/builder.py index fa1cc489..16565cfa 100644 --- a/emote/memory/builder.py +++ b/emote/memory/builder.py @@ -1,6 +1,4 @@ -""" - -""" +"""""" from typing import List @@ -14,11 +12,11 @@ from .column import Column, TagColumn, VirtualColumn from .fifo_strategy import FifoEjectionStrategy from .storage import NextElementMapper, SyntheticDones -from .table import ArrayTable +from .table import ArrayMemoryTable from .uniform_strategy import UniformSampleStrategy -class DictTable(ArrayTable): +class DictMemoryTable(ArrayMemoryTable): def __init__( self, *, @@ -55,11 +53,10 @@ def __init__( ) -class DictObsTable(DictTable): - """Create a memory suited for Reinforcement Learning Tasks with 1-Step Bellman - Backup with a single bootstrap value, and using dictionary observations as network - inputs. - """ +class DictObsMemoryTable(DictMemoryTable): + """Create a memory suited for Reinforcement Learning Tasks with 1-Step + Bellman Backup with a single bootstrap value, and using dictionary + observations as network inputs.""" def __init__( self, @@ -133,11 +130,10 @@ def __init__( ) -class DictObsNStepTable(DictTable): - """Create a memory suited for Reinforcement Learning Tasks with N-Step Bellman - Backup with a single bootstrap value, and using dictionary observations as network - inputs. - """ +class DictObsNStepMemoryTable(DictMemoryTable): + """Create a memory suited for Reinforcement Learning Tasks with N-Step + Bellman Backup with a single bootstrap value, and using dictionary + observations as network inputs.""" def __init__( self, diff --git a/emote/memory/callbacks.py b/emote/memory/callbacks.py index 257f86ad..2aa994db 100644 --- a/emote/memory/callbacks.py +++ b/emote/memory/callbacks.py @@ -2,22 +2,22 @@ import os from emote.callback import Callback -from emote.memory.table import Table +from emote.memory.table import MemoryTable class MemoryImporterCallback(Callback): - """Load and validate a previously exported memory""" + """Load and validate a previously exported memory.""" def __init__( self, - memory: Table, + memory_table: MemoryTable, target_memory_name: str, experiment_load_dir: str, load_fname_override=None, ): super().__init__() self._order = -1 # this is to ensure that this callback is called before the others - self.memory = memory + self.memory_table = memory_table self._target_memory_name = target_memory_name self._load_fname_override = load_fname_override self._load_dir = experiment_load_dir @@ -31,5 +31,5 @@ def restore_state(self): if not os.path.exists(restore_path + ".zip"): raise FileNotFoundError(f"Failed to load memory dump: {restore_path} does not exist.") - self.memory.restore(restore_path) + self.memory_table.restore(restore_path) logging.info(f"Loading memory dump {restore_path}") diff --git a/emote/memory/column.py b/emote/memory/column.py index ddec275f..579022d6 100644 --- a/emote/memory/column.py +++ b/emote/memory/column.py @@ -1,6 +1,4 @@ -""" - -""" +"""""" from dataclasses import dataclass from typing import Tuple, Type @@ -15,7 +13,7 @@ class Column: """A typed column for data storage.""" name: str - """The name of the column""" + """The name of the column.""" shape: Tuple[int] dtype: type @@ -55,7 +53,7 @@ class TagColumn(Column): @dataclass class VirtualColumn(Column): - """A column providing fake or transformed data via Mapper""" + """A column providing fake or transformed data via Mapper.""" target_name: str mapper: Type[VirtualStorage] diff --git a/emote/memory/core_types.py b/emote/memory/core_types.py index 85c78a85..2986eb69 100644 --- a/emote/memory/core_types.py +++ b/emote/memory/core_types.py @@ -1,6 +1,4 @@ -""" -Supporting types used for working with the memory -""" +"""Supporting types used for working with the memory.""" from typing import Dict, Generic, Tuple, TypeVar diff --git a/emote/memory/coverage_based_strategy.py b/emote/memory/coverage_based_strategy.py index d06ff072..5f3e14b4 100644 --- a/emote/memory/coverage_based_strategy.py +++ b/emote/memory/coverage_based_strategy.py @@ -1,6 +1,4 @@ -""" - -""" +"""""" import random @@ -13,9 +11,12 @@ class CoverageBasedStrategy(Strategy): - """A sampler intended to sample based on coverage of experiences, - favoring less-visited states. This base class can be used for implementing - various coverage-based sampling strategies.""" + """A sampler intended to sample based on coverage of experiences, favoring + less-visited states. + + This base class can be used for implementing various coverage-based + sampling strategies. + """ def __init__(self, alpha=0.5): super().__init__() diff --git a/emote/memory/fifo_strategy.py b/emote/memory/fifo_strategy.py index 497e4a3c..210e1586 100644 --- a/emote/memory/fifo_strategy.py +++ b/emote/memory/fifo_strategy.py @@ -1,6 +1,4 @@ -""" - -""" +"""""" import random @@ -12,9 +10,11 @@ class FifoStrategyBase(Strategy): - """A sampler intended to sample in a first-in-first-out style across the whole - set of experiences. This base class is used by both the fifo sample and - ejection strategies. + """A sampler intended to sample in a first-in-first-out style across the + whole set of experiences. + + This base class is used by both the fifo sample and ejection + strategies. """ def __init__(self): @@ -49,14 +49,14 @@ def post_import(self): self.track(-abs(id) - 1, length) def state(self) -> dict: - """Serialize the strategy to a JSON-serializable dictionary""" + """Serialize the strategy to a JSON-serializable dictionary.""" return { "identities": list(self._identities), "sequence_lengths": list(self._sequence_lengths.items()), } def load_state(self, state: dict): - """Load the strategy from a dictionary""" + """Load the strategy from a dictionary.""" self._identities = deque(state["identities"]) self._sequence_lengths = dict(state["sequence_lengths"]) @@ -68,9 +68,10 @@ class FifoSampleStrategy(FifoStrategyBase, SampleStrategy): def __init__(self, per_episode: bool = True, random_offset: bool = True): """Create a FIFO-based sample strategy. - :param per_episode: if true, will only sample each episode once in a single pass - :param random_offset: if true will sample at a random offset in each - episode. Will be assumed true when sampling per episode + :param per_episode: if true, will only sample each episode once + in a single pass + :param random_offset: if true will sample at a random offset in + each episode. Will be assumed true when sampling per episode """ super().__init__() self._per_episode = per_episode diff --git a/emote/memory/loading.py b/emote/memory/loading.py index 19044a4b..581ab94b 100644 --- a/emote/memory/loading.py +++ b/emote/memory/loading.py @@ -1,16 +1,14 @@ -""" -Utilities for loading files into memories. -""" +"""Utilities for loading files into memories.""" import pickle import numpy as np -from .table import ArrayTable +from .table import ArrayMemoryTable def fill_table_from_legacy_file( - table: ArrayTable, + memory_table: ArrayMemoryTable, path: str, *, read_obs: bool = False, @@ -19,11 +17,11 @@ def fill_table_from_legacy_file( ): """Load a legacy memory dump into a new-style table memory. - :param table: The table to fill. Must contain 'obs', 'rewards', and 'actions' columns - :param path: The path to load from. Must be a pickle file. Extension is optional - - :throws: OSError if file does not exist. KeyError if table or file do not - match the legacy format. + :param table: The table to fill. Must contain 'obs', 'rewards', and + 'actions' columns + :param path: The path to load from. Must be a pickle file. Extension + is optional :throws: OSError if file does not exist. KeyError if + table or file do not match the legacy format. """ if not path.endswith(".pickle"): @@ -65,7 +63,7 @@ def fill_table_from_legacy_file( if read_rewards: outs["rewards"] = rewards - table.add_sequence(agent_idx, outs) + memory_table.add_sequence(agent_idx, outs) previous_idx = done_idx + 1 agent_idx -= 1 diff --git a/emote/memory/memory.py b/emote/memory/memory.py index 94e74495..abb67b6c 100644 --- a/emote/memory/memory.py +++ b/emote/memory/memory.py @@ -1,10 +1,12 @@ """Sequence builder collates observations into sequences stored in the memory. -The sequence builder is the API between "instant" based APIs such as the agent -proxy and the episode-based functionality of the memory implementation. The goal -of the sequence builder is to consume individual timesteps per agent and collate -them into episodes before submission into the memory. +The sequence builder is the API between "instant" based APIs such as the +agent proxy and the episode-based functionality of the memory +implementation. The goal of the sequence builder is to consume +individual timesteps per agent and collate them into episodes before +submission into the memory. """ + from __future__ import annotations import collections @@ -32,12 +34,12 @@ from ..typing import AgentId, DictObservation, DictResponse, EpisodeState from ..utils import BlockTimers, TimedBlock from .core_types import Matrix -from .table import Table +from .table import MemoryTable @dataclass class Episode: - """An episode of data being constructed""" + """An episode of data being constructed.""" data: Dict[str, List[Matrix]] = field(default_factory=lambda: defaultdict(list)) @@ -59,25 +61,27 @@ def from_initial(observation: Mapping[str, Matrix]) -> "Episode": ################################################################################ -class TableMemoryProxy: - """The sequence builder wraps a sequence-based memory to build full episodes - from [identity, observation] data. Not thread safe. +class MemoryTableProxy: + """The sequence builder wraps a sequence-based memory to build full + episodes from [identity, observation] data. + + Not thread safe. """ def __init__( self, - table: Table, + memory_table: MemoryTable, minimum_length_threshold: Optional[int] = None, use_terminal: bool = False, *, - name: str = "default", + name: str = "memproxy", ): self._store: Dict[AgentId, Episode] = {} - self._table = table + self._table = memory_table if minimum_length_threshold is None: self._min_length_filter = lambda _: True else: - key = table._length_key + key = memory_table._length_key self._min_length_filter = lambda ep: len(ep[key]) >= minimum_length_threshold self._completed_episodes: set[AgentId] = set() @@ -99,8 +103,11 @@ def store(self, path: str): return self._table.store(path) def is_initial(self, identity: int): - """Returns true if identity is not already used in a partial sequence. Does not - validate if the identity is associated with a complete episode.""" + """Returns true if identity is not already used in a partial sequence. + + Does not validate if the identity is associated with a complete + episode. + """ return identity not in self._store def add( @@ -168,6 +175,7 @@ def timers(self): class MemoryProxyWrapper: """Base class for memory proxy wrappers. + This class forwards non-existing method accessess to the inner MemoryProxy or MemoryProxyWrapper. """ @@ -206,19 +214,31 @@ def __getattr__(self, name): return attr + def state_dict(self) -> dict[str, Any]: + return {} -class TableMemoryProxyWrapper(MemoryProxyWrapper): - def __init__(self, *, inner: TableMemoryProxy, **kwargs): + def load_state_dict( + self, + state_dict: dict[str, Any], + load_network: bool = True, + load_optimizer: bool = True, + load_hparams: bool = True, + ): + pass + + +class MemoryTableProxyWrapper(MemoryProxyWrapper): + def __init__(self, *, inner: MemoryTableProxy, **kwargs): super().__init__(inner=inner, **kwargs) def store(self, path: str): return self._inner.store(path) -class LoggingProxyWrapper(TableMemoryProxyWrapper, LoggingMixin): +class LoggingProxyWrapper(LoggingMixin, MemoryTableProxyWrapper): def __init__( self, - inner: TableMemoryProxy, + inner: MemoryTableProxy, writer: SummaryWriter, log_interval: int, ): @@ -240,22 +260,20 @@ def state_dict(self) -> dict[str, Any]: return { "completed_inferences": self.completed_inferences, "completed_episodes": self.completed_episodes, - "inference_steps": self._total_infs, } def load_state_dict( self, - state_dict: Dict[str, Any], + state_dict: dict[str, Any], load_network: bool = True, load_optimizer: bool = True, load_hparams: bool = True, - ) -> dict[str, Any]: + ): if load_hparams: self.completed_inferences = state_dict.get( "completed_inferences", self.completed_inferences ) self.completed_episodes = state_dict.get("completed_episodes", self.completed_episodes) - self._total_infs = state_dict.get("inference_steps", self._total_infs) self._infs_at_start = self.completed_inferences def add( @@ -384,12 +402,12 @@ def _end_cycle(self): self._cycle_start_time = now_time -class MemoryExporterProxyWrapper(TableMemoryProxyWrapper, LoggingMixin): - """Export the memory at regular intervals""" +class MemoryExporterProxyWrapper(LoggingMixin, MemoryTableProxyWrapper): + """Export the memory at regular intervals.""" def __init__( self, - memory: TableMemoryProxy | TableMemoryProxyWrapper, + memory: MemoryTableProxy | MemoryTableProxyWrapper, target_memory_name, inf_steps_per_memory_export, experiment_root_path: str, @@ -422,10 +440,9 @@ def add( observations: Dict[AgentId, DictObservation], responses: Dict[AgentId, DictResponse], ): - """First add the new batch to the memory""" + """First add the new batch to the memory.""" self._inner.add(observations, responses) - - """Save the replay buffer if it has enough data and enough time""" + """Save the replay buffer if it has enough data and enough time.""" has_enough_data = self._inf_step > self._next_export time_now = time.monotonic() has_enough_time = time_now > self._next_export_time @@ -455,21 +472,21 @@ def add( class MemoryLoader: def __init__( self, - table: Table, + memory_table: MemoryTable, rollout_count: int, rollout_length: int, size_key: str, data_group: str = "default", ): self.data_group = data_group - self.table = table + self.table = memory_table self.rollout_count = rollout_count self.rollout_length = rollout_length self.size_key = size_key self.timer = TimedBlock() def is_ready(self): - """True if the data loader has enough data to start providing data""" + """True if the data loader has enough data to start providing data.""" return self.table.size() >= (self.rollout_count * self.rollout_length) def __iter__(self): @@ -488,7 +505,8 @@ def __iter__(self): class JointMemoryLoader: - """A memory loader capable of loading data from multiple `MemoryLoader`s.""" + """A memory loader capable of loading data from multiple + `MemoryLoader`s.""" def __init__(self, loaders: list[MemoryLoader], size_key: str = "batch_size"): self._loaders = loaders @@ -525,7 +543,8 @@ def __iter__(self): class JointMemoryLoaderWithDataGroup(JointMemoryLoader): - """A JointMemoryLoader that places its data inside of a user-specified datagroup.""" + """A JointMemoryLoader that places its data inside of a user-specified + datagroup.""" def __init__(self, loaders: list[MemoryLoader], data_group: str, size_key: str = "batch_size"): super().__init__(loaders, size_key) @@ -541,11 +560,12 @@ def __iter__(self): class MemoryWarmup(Callback): """A blocker to ensure memory has data. - This ensures the memory has enough data when training starts, as the memory - will panic otherwise. This is useful if you use an async data generator. + This ensures the memory has enough data when training starts, as the + memory will panic otherwise. This is useful if you use an async data + generator. - If you do not use an async data generator this can deadlock your training - loop and prevent progress. + If you do not use an async data generator this can deadlock your + training loop and prevent progress. """ def __init__( diff --git a/emote/memory/segment_tree.py b/emote/memory/segment_tree.py index 1690efc7..0fef1467 100644 --- a/emote/memory/segment_tree.py +++ b/emote/memory/segment_tree.py @@ -3,8 +3,7 @@ class SegmentTree: def __init__(self, capacity, operation, neutral_element): - """ - Build a Segment Tree data structure. + """Build a Segment Tree data structure. https://en.wikipedia.org/wiki/Segment_tree @@ -45,9 +44,8 @@ def _reduce_helper(self, start, end, node, node_start, node_end): ) def reduce(self, start=0, end=None): - """ - Returns result of applying `self.operation` - to a contiguous subsequence of the array. + """Returns result of applying `self.operation` to a contiguous + subsequence of the array. self.operation(arr[start], operation(arr[start+1], operation(... arr[end]))) @@ -83,8 +81,7 @@ def __init__(self, capacity): ) def sum(self, start=0, end=None): - """ - Returns arr[start] + ... + arr[end] + """Returns arr[start] + ... + arr[end] :param start: (int) start position of the reduction (must be >= 0) :param end: (int) end position of the reduction (must be < len(arr), can be None for len(arr) - 1) @@ -122,8 +119,7 @@ def __init__(self, capacity): ) def min(self, start=0, end=None): - """ - Returns min(arr[start], ..., arr[end]) + """Returns min(arr[start], ..., arr[end]) :param start: (int) start position of the reduction (must be >= 0) :param end: (int) end position of the reduction (must be < len(arr), can be None for len(arr) - 1) diff --git a/emote/memory/storage.py b/emote/memory/storage.py index 31d9bc90..6e31b333 100644 --- a/emote/memory/storage.py +++ b/emote/memory/storage.py @@ -1,6 +1,4 @@ -""" - -""" +"""""" from typing import Sequence, Tuple @@ -10,8 +8,8 @@ class BaseStorage(dict): - """A simple dictionary-based storage with support for a temporary workspace for - sampled data""" + """A simple dictionary-based storage with support for a temporary workspace + for sampled data.""" def __init__(self, shape, dtype): self._shape = shape @@ -19,9 +17,10 @@ def __init__(self, shape, dtype): self._temp_storage = None def get_empty_storage(self, count, length): - """A workspace that can be reused to skip reallocating the same numpy buffer - each time the memory is sampled. Will *not* work if the memory is - sampled from multiple threads. + """A workspace that can be reused to skip reallocating the same numpy + buffer each time the memory is sampled. + + Will *not* work if the memory is sampled from multiple threads. """ total_size = count * length if self._temp_storage is None or self._temp_storage.shape[0] < total_size: @@ -65,9 +64,10 @@ def __init__(self, shape, dtype): self._temp_storage = None def get_empty_storage(self, count, length): - """A workspace that can be reused to skip reallocating the same numpy buffer - each time the memory is sampled. Will *not* work if the memory is - sampled from multiple threads. + """A workspace that can be reused to skip reallocating the same numpy + buffer each time the memory is sampled. + + Will *not* work if the memory is sampled from multiple threads. """ total_size = count * length if self._temp_storage is None or self._temp_storage.shape[0] < total_size: @@ -105,7 +105,7 @@ def shape(self): class VirtualStorage: - """A virtual storage uses a simple storage to generate data""" + """A virtual storage uses a simple storage to generate data.""" def __init__(self, storage, shape, dtype): self._storage = storage @@ -142,8 +142,8 @@ def post_import(self): class NextElementMapper(VirtualStorage): - """Simple mapper that can be used to sample a specified one step over, which is - useful to sample transitions for RL.""" + """Simple mapper that can be used to sample a specified one step over, + which is useful to sample transitions for RL.""" class Wrapper: def __init__(self, item): @@ -203,7 +203,7 @@ def with_only_last(storage, shape, dtype): class NextNElementWrapper(VirtualStorage): - """Simple mapper that can be used to sample a specified N steps over""" + """Simple mapper that can be used to sample a specified N steps over.""" class Wrapper: def __init__(self, item, n: int): @@ -216,7 +216,13 @@ def __getitem__(self, key): elif isinstance(key, tuple): key = tuple(k + self._n for k in key) elif isinstance(key, slice): + # slicing in numpy never bounds checks, it instead returns an empty array.. + # so lets do the bound checking ourselves key = slice(key.start + self._n, key.stop + self._n, key.step) + if key.start >= self._item.shape[0] or key.stop > self._item.shape[0]: + raise IndexError( + f"Slice out of bounds: {key}, item has shape {self._item.shape}" + ) else: raise ValueError( f"Invalid indexing type '{type(key)}'. Only integer, tuple or slices supported." diff --git a/emote/memory/strategy.py b/emote/memory/strategy.py index ca977686..66792e8f 100644 --- a/emote/memory/strategy.py +++ b/emote/memory/strategy.py @@ -1,6 +1,4 @@ -""" - -""" +"""""" from abc import ABC, abstractmethod from typing import Optional, Sequence @@ -9,25 +7,26 @@ class Strategy(ABC): - """A generalized strategy that may be specialized for sampling or ejection from - a memory buffer""" + """A generalized strategy that may be specialized for sampling or ejection + from a memory buffer.""" def __init__(self): self._in_simple_import = False @abstractmethod def track(self, identity: int, sequence_length: int): - """Track a sequence given by identity and sequence_length that exists in the - memory + """Track a sequence given by identity and sequence_length that exists + in the memory. :param identity: an identity that is globally unique - :param sequence_length: the number of transitions in the sequence - identified by identity""" + :param sequence_length: the number of transitions in the + sequence identified by identity + """ ... @abstractmethod def forget(self, identity: int): - """Forget the sequence of transitions given by identity""" + """Forget the sequence of transitions given by identity.""" ... def on_sample( @@ -36,9 +35,9 @@ def on_sample( transition_count: int, advantages: Optional[Matrix] = None, ): - """Called after a sampling strategy has been invoked, to give the strategy a - chance to update sampling weights in case it uses prioritized sampling - """ + """Called after a sampling strategy has been invoked, to give the + strategy a chance to update sampling weights in case it uses + prioritized sampling.""" ... def post_import(self): @@ -50,22 +49,23 @@ def post_import(self): ... def state(self) -> dict: - """Serialize the strategy state to a dictionary""" + """Serialize the strategy state to a dictionary.""" ... def load_state(self, state: dict): - """Load the strategy state from a dictionary""" + """Load the strategy state from a dictionary.""" def clear(self): - """Clear the strategy's internal state""" + """Clear the strategy's internal state.""" ... def begin_simple_import(self): - """Called before a simple import, to allow the strategy to prepare itself""" + """Called before a simple import, to allow the strategy to prepare + itself.""" self._in_simple_import = True def end_simple_import(self): - """Called after a simple import, to allow the strategy to cleanup""" + """Called after a simple import, to allow the strategy to cleanup.""" self._in_simple_import = False @@ -73,12 +73,12 @@ def end_simple_import(self): class SampleStrategy(Strategy): - """A strategy specialized for sampling""" + """A strategy specialized for sampling.""" @abstractmethod def sample(self, count: int, transition_count: int) -> Sequence[SamplePoint]: - """Apply the sampling strategy to the memory metadata, returning `count` - identities and offsets to use when sampling from the memory""" + """Apply the sampling strategy to the memory metadata, returning + `count` identities and offsets to use when sampling from the memory.""" ... @@ -86,12 +86,11 @@ def sample(self, count: int, transition_count: int) -> Sequence[SamplePoint]: class EjectionStrategy(Strategy): - """A strategy specialized for ejection sampling""" + """A strategy specialized for ejection sampling.""" @abstractmethod def sample(self, count: int) -> Sequence[int]: - """Apply the sampling strategy to the memory metadata, returning a list of - identities that shall be ejected from the memory to remove at least "count" transitions. - - """ + """Apply the sampling strategy to the memory metadata, returning a list + of identities that shall be ejected from the memory to remove at least + "count" transitions.""" ... diff --git a/emote/memory/table.py b/emote/memory/table.py index 88501d3d..4dfd9b78 100644 --- a/emote/memory/table.py +++ b/emote/memory/table.py @@ -29,37 +29,42 @@ class TableSerializationVersion(enum.Enum): """The version of the memory serialization format.""" Legacy = 0 - """The legacy memory table format using pickling, which leads to portability issues and risks - when refactoring.""" + """The legacy memory table format using pickling, which leads to + portability issues and risks when refactoring.""" V1 = 1 - """Memory table format using a zip file with a JSON metadata file and raw numpy data files. Note - that this version only restores data, but will not affect the types of ejectors, adaptors, and - so on.""" + """Memory table format using a zip file with a JSON metadata file and raw + numpy data files. + + Note that this version only restores data, but will not affect the + types of ejectors, adaptors, and so on. + """ LATEST = V1 -class Table(Protocol): +class MemoryTable(Protocol): adaptors: List[Adaptor] def sample(self, count: int, sequence_length: int) -> SampleResult: - """sample COUNT traces from the memory, each consisting of SEQUENCE_LENGTH - frames. The data is transposed in a SoA fashion (since this is - both easier to store and easier to consume). + """Sample COUNT traces from the memory, each consisting of + SEQUENCE_LENGTH frames. + + The data is transposed in a SoA fashion (since this is both + easier to store and easier to consume). """ ... def size(self) -> int: - """query the number of elements currently in the memory""" + """Query the number of elements currently in the memory.""" ... def full(self) -> bool: - """query whether the memory is filled""" + """Query whether the memory is filled.""" ... def add_sequence(self, identity: int, sequence): - """add a fully terminated sequence to the memory""" + """Add a fully terminated sequence to the memory.""" ... def store( @@ -67,15 +72,19 @@ def store( path: str, version: TableSerializationVersion = TableSerializationVersion.LATEST, ) -> bool: - """Persist the whole table and all metadata into the designated name""" + """Persist the whole table and all metadata into the designated + name.""" ... def restore(self, path: str, override_version: TableSerializationVersion | None = None) -> bool: - """Restore the data table from the provided path. This also clears the data stores.""" + """Restore the data table from the provided path. + + This also clears the data stores. + """ ... -class ArrayTable: +class ArrayMemoryTable: def __init__( self, *, @@ -87,7 +96,7 @@ def __init__( adaptors: Optional[Adaptor] = None, device: torch.device, ): - """Create the table with the specified configuration""" + """Create the table with the specified configuration.""" self._sampler = sampler self._ejector = ejector self._length_key = length_key @@ -109,12 +118,12 @@ def resize(self, new_size): self._maxlen = new_size def clear(self): - """Clear and reset all data""" + """Clear and reset all data.""" with self._lock: self._clear() def _clear(self): - """Clear and reset all data""" + """Clear and reset all data.""" self._data = {} @@ -185,9 +194,12 @@ def _execute_gather(self, count: int, sequence_length: int, sample_points: List[ return out def sample(self, count: int, sequence_length: int) -> SampleResult: - """sample COUNT traces from the memory, each consisting of SEQUENCE_LENGTH - transitions. The transitions are returned in a SoA fashion (since this is both - easier to store and easier to consume)""" + """Sample COUNT traces from the memory, each consisting of + SEQUENCE_LENGTH transitions. + + The transitions are returned in a SoA fashion (since this is + both easier to store and easier to consume) + """ with self._lock: with self._timers.scope("points"): @@ -199,7 +211,7 @@ def sample(self, count: int, sequence_length: int) -> SampleResult: return result def size(self) -> int: - """query the number of elements currently in the memory""" + """Query the number of elements currently in the memory.""" with self._lock: return self._internal_size() @@ -207,13 +219,12 @@ def _internal_size(self) -> int: return self._total_length def full(self) -> bool: - """Returns true if the memory has reached saturation, e.g., where new adds may - cause ejection. + """Returns true if the memory has reached saturation, e.g., where new + adds may cause ejection. .. warning:: This does not necessarily mean that `size() == maxlen`, as we store and eject full sequences. The memory only guarantees we will have *fewer* samples than maxlen. - """ with self._lock: return self._filled @@ -226,7 +237,7 @@ def add_sequence(self, identity: int, sequence: dict): self._add_sequence_internal(identity, sequence) def _add_sequence_internal(self, identity: int, sequence: dict): - """add a fully terminated sequence to the memory""" + """Add a fully terminated sequence to the memory.""" sequence_length = len(sequence[self._length_key]) # unsigned extend: all Ids that are added as sequences must be positive int64 values @@ -251,7 +262,8 @@ def _add_sequence_internal(self, identity: int, sequence: dict): self._ejector.track(identity, sequence_length) def _eject_count(self, count: int): - """Request ejection of *at least* the specified number of transitions""" + """Request ejection of *at least* the specified number of + transitions.""" self._filled = True identities = self._ejector.sample(count) @@ -337,7 +349,10 @@ def _serialize(self, path: str) -> bool: os.chmod(f"{path}.zip", stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP | stat.S_IROTH) def _deserialize(self, zip_: "zipfile.ZipFile") -> bool: - """Restore the data table from the provided path. This currently implies a "clear" of the data stores.""" + """Restore the data table from the provided path. + + This currently implies a "clear" of the data stores. + """ with self._lock: self._clear() @@ -438,7 +453,8 @@ def _deserialize(self, zip_: "zipfile.ZipFile") -> bool: version="23.1.0", ) def _store_legacy(self, path: str) -> bool: - """Persist the whole table and all metadata into the designated name""" + """Persist the whole table and all metadata into the designated + name.""" import cloudpickle @@ -476,7 +492,10 @@ def _store_legacy(self, path: str) -> bool: version="23.1.0", ) def _restore_legacy(self, zip_: zipfile.ZipFile) -> bool: - """Restore the data table from the provided path. This currently implies a "clear" of the data stores.""" + """Restore the data table from the provided path. + + This currently implies a "clear" of the data stores. + """ import cloudpickle @@ -521,7 +540,7 @@ def store( """Persist the whole table and all metadata into the designated name. :param path: The path to store the data to. - :param use_legacy_format: Whether to use the legacy format for storing the data. + :param version: The serialization version to use. """ if version is None: diff --git a/emote/memory/uniform_strategy.py b/emote/memory/uniform_strategy.py index 41874960..8c0757cb 100644 --- a/emote/memory/uniform_strategy.py +++ b/emote/memory/uniform_strategy.py @@ -1,6 +1,4 @@ -""" - -""" +"""""" import random @@ -14,8 +12,11 @@ class UniformStrategyBase(Strategy): """A sampler intended to sample uniformly across the whole set of - experiences. This base class is used by both the uniform sample and ejection - strategies.""" + experiences. + + This base class is used by both the uniform sample and ejection + strategies. + """ def __init__(self): super().__init__() diff --git a/emote/mixins/BUILD b/emote/mixins/BUILD new file mode 100644 index 00000000..db46e8d6 --- /dev/null +++ b/emote/mixins/BUILD @@ -0,0 +1 @@ +python_sources() diff --git a/emote/mixins/__init__.py b/emote/mixins/__init__.py index 25067c22..b6734582 100644 --- a/emote/mixins/__init__.py +++ b/emote/mixins/__init__.py @@ -1,8 +1,7 @@ """Mixins for emote. -Mixins are used to add functionality to other classes just like -regular inheritance. The difference is that mixins are designed to -work well with multiple inheritance, which requires extra care to -avoid issues in initialization order. - +Mixins are used to add functionality to other classes just like regular +inheritance. The difference is that mixins are designed to work well +with multiple inheritance, which requires extra care to avoid issues in +initialization order. """ diff --git a/emote/mixins/logging.py b/emote/mixins/logging.py index 09184670..eba631a3 100644 --- a/emote/mixins/logging.py +++ b/emote/mixins/logging.py @@ -9,10 +9,9 @@ class LoggingMixin: """A Mixin that accepts logging calls. - Logged data is saved on this object and gets written by a - Logger. This therefore doesn't care how the data is logged, it - only provides a standard interface for storing the data to be - handled by a Logger. + Logged data is saved on this object and gets written by a Logger. + This therefore doesn't care how the data is logged, it only provides + a standard interface for storing the data to be handled by a Logger. """ def __init__(self, *, default_window_length: int = 250, **kwargs): @@ -90,7 +89,15 @@ def log_histogram( self.hist_logs[key].append(value) def state_dict(self): - state_dict = super().state_dict() + try: + state_dict = super().state_dict() + except AttributeError: + print(f"Error getting the state dict for {self.__class__.__name__}.") + print("This sometimes happens when the LoggingMixin is inherited from after") + print( + f"the other mixins. The current method resolution order is {self.__class__.__mro__}" + ) + raise state_dict["scalar_logs"] = self.scalar_logs state_dict["hist_logs"] = self.hist_logs state_dict["image_logs"] = self.image_logs diff --git a/emote/models/BUILD b/emote/models/BUILD new file mode 100644 index 00000000..db46e8d6 --- /dev/null +++ b/emote/models/BUILD @@ -0,0 +1 @@ +python_sources() diff --git a/emote/models/callbacks.py b/emote/models/callbacks.py index 6d45239a..44d84efe 100644 --- a/emote/models/callbacks.py +++ b/emote/models/callbacks.py @@ -19,10 +19,10 @@ class ModelLoss(LossCallback): - """Trains a dynamic model by minimizing the model loss + """Trains a dynamic model by minimizing the model loss. Arguments: - dynamic_model (DynamicModel): A dynamic model + model (DynamicModel): A dynamic model opt (torch.optim.Optimizer): An optimizer. lr_schedule (lr_scheduler, optional): A learning rate scheduler max_grad_norm (float): Clip the norm of the gradient during backprop using this value. @@ -121,18 +121,19 @@ def get_batch(self, observation, next_observation, actions, rewards): class BatchSampler(BatchCallback): - """BatchSampler class is used to provide batches of data for the RL training callbacks. - In every BP step, it samples one batch from either the gym buffer or the model buffer - based on a Bernoulli probability distribution. It outputs the batch to a separate - data-group which will be used by other RL training callbacks. - - Arguments: - dataloader (MemoryLoader): the dataloader to load data from the model buffer - prob_scheduler (BPStepScheduler): the scheduler to update the prob of data - samples to come from the model vs. the Gym buffer - data_group (str): the data_group to receive data - rl_data_group (str): the data_group to upload data for RL training - generator (torch.Generator (optional)): an optional random generator + """BatchSampler class is used to provide batches of data for the RL + training callbacks. In every BP step, it samples one batch from either the + gym buffer or the model buffer based on a Bernoulli probability + distribution. It outputs the batch to a separate data-group which will be + used by other RL training callbacks. + + Arguments: + dataloader (MemoryLoader): the dataloader to load data from the model buffer + prob_scheduler (BPStepScheduler): the scheduler to update the prob of data + samples to come from the model vs. the Gym buffer + data_group (str): the data_group to receive data + rl_data_group (str): the data_group to upload data for RL training + generator (torch.Generator (optional)): an optional random generator """ def __init__( @@ -192,18 +193,17 @@ def use_model_batch(self): class ModelBasedCollector(LoggingMixin, BatchCallback): - """ModelBasedCollector class is used to sample rollouts from the trained dynamic model. - The rollouts are stored in a replay buffer memory. - - Arguments: - model_env: The Gym-like dynamic model - agent: The policy used to sample actions - memory: The memory to store the new synthetic samples - rollout_scheduler: A scheduler used to set the rollout-length when unrolling the dynamic model - num_bp_to_retain_buffer: The number of BP steps to keep samples. Samples will be over-written (first in - first out) for bp steps larger than this. - data_group: The data group to receive data from. This must be set to get real (Gym) samples + """ModelBasedCollector class is used to sample rollouts from the trained + dynamic model. The rollouts are stored in a replay buffer memory. + Arguments: + model_env: The Gym-like dynamic model + agent: The policy used to sample actions + memory: The memory to store the new synthetic samples + rollout_scheduler: A scheduler used to set the rollout-length when unrolling the dynamic model + num_bp_to_retain_buffer: The number of BP steps to keep samples. Samples will be over-written (first in + first out) for bp steps larger than this. + data_group: The data group to receive data from. This must be set to get real (Gym) samples """ def __init__( @@ -217,9 +217,11 @@ def __init__( input_key: str = "obs", ): super().__init__() - """ The data group is used to receive correct observation when collect_multiple is - called. The data group must be set such that real Gym samples (not model data) - are given to the function. + """The data group is used to receive correct observation when + collect_multiple is called. + + The data group must be set such that real Gym samples (not model + data) are given to the function. """ self.data_group = data_group self._input_key = input_key @@ -248,7 +250,7 @@ def get_batch(self, observation): return observation[self._input_key] def collect_sample(self): - """Collect a single rollout""" + """Collect a single rollout.""" actions = self.agent(self.obs) next_obs, ep_info = self.model_env.dict_step(actions) diff --git a/emote/models/ensemble.py b/emote/models/ensemble.py index bb6c00bf..86bc9cd0 100644 --- a/emote/models/ensemble.py +++ b/emote/models/ensemble.py @@ -12,7 +12,8 @@ def truncated_normal_init(m: nn.Module): - """Initializes the weights of the given module using a truncated normal distribution.""" + """Initializes the weights of the given module using a truncated normal + distribution.""" if isinstance(m, nn.Linear): input_dim = m.weight.data.shape[0] stddev = 1 / (2 * np.sqrt(input_dim)) @@ -158,7 +159,8 @@ def sample( model_input: torch.Tensor, rng: torch.Generator, ) -> torch.Tensor: - """Samples next observation, reward and terminal from the model using the ensemble. + """Samples next observation, reward and terminal from the model using + the ensemble. Args: model_input (tensor): the observation and action. diff --git a/emote/models/model.py b/emote/models/model.py index 38f6e900..d12d7b2f 100644 --- a/emote/models/model.py +++ b/emote/models/model.py @@ -12,10 +12,10 @@ class DynamicModel(nn.Module): - """Wrapper class for model. - DynamicModel class functions as a wrapper for models including ensembles. It also provides - data manipulations that are common when using dynamics models with observations - and actions (e.g., predicting delta observations, input normalization). + """Wrapper class for model. DynamicModel class functions as a wrapper for + models including ensembles. It also provides data manipulations that are + common when using dynamics models with observations and actions (e.g., + predicting delta observations, input normalization). Arguments: model: the model to wrap. @@ -84,9 +84,9 @@ def sample( observation: torch.Tensor, rng: torch.Generator, ) -> tuple[torch.Tensor, Optional[torch.Tensor]]: - """Samples a simulated transition from the dynamics model. The function first - normalizes the inputs to the model, and then denormalize the model output as the - final output. + """Samples a simulated transition from the dynamics model. The function + first normalizes the inputs to the model, and then denormalize the + model output as the final output. Arguments: action (tensor): the action at. @@ -121,16 +121,17 @@ def get_model_input( obs: torch.Tensor, action: torch.Tensor, ) -> torch.Tensor: - """The function prepares the input to the neural network model by concatenating - observations and actions. In case, obs_process_fn is given, the observations are - processed by the function prior to the concatenation. + """The function prepares the input to the neural network model by + concatenating observations and actions. In case, obs_process_fn is + given, the observations are processed by the function prior to the + concatenation. - Arguments: - obs (torch.Tensor): observation tensor - action (torch.Tensor): action tensor + Arguments: + obs (torch.Tensor): observation tensor + action (torch.Tensor): action tensor - Returns: - (torch.Tensor): the concatenation of obs and actions + Returns: + (torch.Tensor): the concatenation of obs and actions """ if self.obs_process_fn: obs = self.obs_process_fn(obs) @@ -144,8 +145,8 @@ def process_batch( action: torch.Tensor, reward: torch.Tensor, ) -> tuple[torch.Tensor, torch.Tensor]: - """The function processes the given batch, normalizes inputs and targets, - and prepares them for the training. + """The function processes the given batch, normalizes inputs and + targets, and prepares them for the training. Arguments: obs (torch.Tensor): the observations tensor @@ -172,7 +173,7 @@ def process_batch( return model_in_normalized, target_normalized def save(self, save_dir: str) -> None: - """Saving the model + """Saving the model. Arguments: save_dir (str): the directory to save the model @@ -180,7 +181,7 @@ def save(self, save_dir: str) -> None: self.model.save(save_dir) def load(self, load_dir: str) -> None: - """Loading the model + """Loading the model. Arguments: load_dir (str): the directory to load the model @@ -241,7 +242,7 @@ def sample( model_input: torch.Tensor, rng: torch.Generator = None, ) -> torch.Tensor: - """Samples next observation, reward and terminal from the model + """Samples next observation, reward and terminal from the model. Args: model_input (tensor): the observation and action. @@ -255,7 +256,8 @@ def sample( class Normalizer: - """Class that keeps a running mean and variance and normalizes data accordingly.""" + """Class that keeps a running mean and variance and normalizes data + accordingly.""" def __init__(self): self.mean = None @@ -269,7 +271,6 @@ def update_stats(self, data: torch.Tensor): Arguments: data (torch.Tensor): The data used to compute the statistics. - """ if self.mean is None: self.mean = data.mean(0, keepdim=True) diff --git a/emote/models/model_env.py b/emote/models/model_env.py index a7712412..09e7226e 100644 --- a/emote/models/model_env.py +++ b/emote/models/model_env.py @@ -98,7 +98,10 @@ def step( assert len(actions.shape) == 2 # batch, action_dim with torch.no_grad(): actions = torch.from_numpy(actions).to(self.device) - (next_observs, pred_rewards,) = self.dynamic_model.sample( + ( + next_observs, + pred_rewards, + ) = self.dynamic_model.sample( action=actions, observation=self._current_obs, rng=self.rng, @@ -171,7 +174,7 @@ def dict_reset( obs: torch.Tensor, len_rollout: int, ) -> dict[AgentId, DictObservation]: - """resets the model env. + """Resets the model env. Arguments: obs (torch.Tensor): the initial observations. diff --git a/emote/nn/BUILD b/emote/nn/BUILD new file mode 100644 index 00000000..db46e8d6 --- /dev/null +++ b/emote/nn/BUILD @@ -0,0 +1 @@ +python_sources() diff --git a/emote/nn/curl.py b/emote/nn/curl.py index b118fe18..e1f1a028 100644 --- a/emote/nn/curl.py +++ b/emote/nn/curl.py @@ -101,8 +101,8 @@ def _cutout_per_batch_pos_and_mask_size(self, images: torch.Tensor): class CurlLoss(LossCallback): - """ - Contrastive Unsupervised Representations for Reinforcement Learning (CURL). + """Contrastive Unsupervised Representations for Reinforcement Learning + (CURL). paper: https://arxiv.org/abs/2004.04136 @@ -195,8 +195,8 @@ def __init__( self._encoder = encoder_model self._target_encoder = target_encoder_model - self._W = torch.tensor( - torch.rand(size=[desired_zdim, desired_zdim]), + self._W = torch.rand( + size=[desired_zdim, desired_zdim], requires_grad=True, device=device, ) diff --git a/emote/nn/gaussian_policy.py b/emote/nn/gaussian_policy.py index cd9b13ad..02cf702a 100644 --- a/emote/nn/gaussian_policy.py +++ b/emote/nn/gaussian_policy.py @@ -18,14 +18,16 @@ def __init__(self): super().__init__() def post_process(self, actions): - """Post-process a pre-action into a post-action""" + """Post-process a pre-action into a post-action.""" return actions def infer(self, x: Tensor): - """ - Samples pre-actions and associated post-actions (actual decisions) from the policy given the - encoder input. Only for use at inference time; defaults to identity transformation. Crucial to reimplement for - discrete reparametrized policies. + """Samples pre-actions and associated post-actions (actual decisions) + from the policy given the encoder input. + + Only for use at inference time; defaults to identity + transformation. Crucial to reimplement for discrete + reparametrized policies. """ p_samp, _ = self(x) return p_samp, self.post_process(p_samp) @@ -44,12 +46,10 @@ def __init__( self.log_std = nn.Linear(hidden_dim, action_dim) def forward(self, x: Tensor, epsilon: Tensor | None = None) -> Tensor | Tuple[Tensor]: - """ - Sample pre-actions and associated log-probabilities. + """Sample pre-actions and associated log-probabilities. - :return: - Direct samples (pre-actions) from the policy - log-probabilities associated to those samples + :return: Direct samples (pre-actions) from the policy log- + probabilities associated to those samples """ bsz, _ = x.shape diff --git a/emote/nn/layers.py b/emote/nn/layers.py index d245c8a1..38b765ea 100644 --- a/emote/nn/layers.py +++ b/emote/nn/layers.py @@ -8,15 +8,17 @@ class Conv2dEncoder(nn.Module): - """ - Multi-layer 2D convolutional encoder. + """Multi-layer 2D convolutional encoder. - :param input_shape: (tuple[int, int, int]) The input image shape, this should be consistent with channels_last. - :param channels: (list[int]) The number of channels for each conv layer. + :param input_shape: (tuple[int, int, int]) The input image shape, + this should be consistent with channels_last. + :param channels: (list[int]) The number of channels for each conv + layer. :param kernels: (list[int]) The kernel size for each conv layer. :param strides: (list[int]) The strides for each conv layer. :param padding: (list[int]]) The padding. - :param channels_last: (bool) Whether the input image has channels as the last dim, else first. + :param channels_last: (bool) Whether the input image has channels as + the last dim, else first. :param activation: (torch.nn.Module) The activation function. :param flatten: (bool) Flattens the output into a vector. """ @@ -77,7 +79,6 @@ def forward(self, obs: torch.Tensor): def get_encoder_output_size(self): curr_size_x, curr_size_y = self._img_shape_cwh[1], self._img_shape_cwh[2] - """Calculate the outputs size of a conv encoder.""" for k, s, p in zip(self._kernels, self._strides, self._padding): curr_size_x = ((curr_size_x - k + 2 * p) // s) + 1 @@ -92,18 +93,19 @@ def get_encoder_output_size(self): class Conv1dEncoder(nn.Module): - """ - Multi-layer 1D convolutional encoder + """Multi-layer 1D convolutional encoder. :param input_shape: (tuple[int, int]) The input shape - :param channels: (list[int]) The number of channels for each conv layer. + :param channels: (list[int]) The number of channels for each conv + layer. :param kernels: (list[int]) The kernel size for each conv layer. :param strides: (list[int]) The strides for each conv layer. :param padding: (list[int]) The padding. :param activation: (torch.nn.Module) The activation function. :param flatten: (bool) Flattens the output into a vector. :param name: (str) Name of the encoder (default: "conv1d") - :param channels_last: (bool) Whether the input has channels as the last dim, else first. + :param channels_last: (bool) Whether the input has channels as the + last dim, else first. """ def __init__( diff --git a/emote/optimizers.py b/emote/optimizers.py index 06e97fd0..0e06df83 100644 --- a/emote/optimizers.py +++ b/emote/optimizers.py @@ -56,7 +56,8 @@ def separate_modules_for_weight_decay( class ModifiedAdamW(torch.optim.AdamW): - """Modifies AdamW (Adam with weight decay) to not apply weight decay on the bias and layer normalization weights, and optionally additional modules. + """Modifies AdamW (Adam with weight decay) to not apply weight decay on the + bias and layer normalization weights, and optionally additional modules. Args: network (torch.nn.Module): network diff --git a/emote/proxies.py b/emote/proxies.py index e5e8ef23..09ffc605 100644 --- a/emote/proxies.py +++ b/emote/proxies.py @@ -1,7 +1,5 @@ -""" -Proxies are bridges between the world the agent acts in and the algorithm training loop. -""" - +"""Proxies are bridges between the world the agent acts in and the algorithm +training loop.""" from __future__ import annotations @@ -17,13 +15,15 @@ class AgentProxy(Protocol): - """The interface between the agent in the game and the network used during training.""" + """The interface between the agent in the game and the network used during + training.""" def __call__( self, obserations: Dict[AgentId, DictObservation], ) -> Dict[AgentId, DictResponse]: - """Take observations for the active agents and returns the relevant network output.""" + """Take observations for the active agents and returns the relevant + network output.""" ... @property @@ -40,7 +40,8 @@ def output_names(self) -> tuple[str, ...]: class MemoryProxy(Protocol): - """The interface between the agent in the game and the memory buffer the network trains from.""" + """The interface between the agent in the game and the memory buffer the + network trains from.""" def add( self, @@ -49,8 +50,9 @@ def add( ): """Store episodes in the memory buffer used for training. - This is useful e.g. if the data collection is running from a checkpointed model running on - another machine.""" + This is useful e.g. if the data collection is running from a + checkpointed model running on another machine. + """ ... @@ -58,9 +60,9 @@ class GenericAgentProxy(AgentProxy): """Observations are dicts that contain multiple input and output keys. For example, we might have a policy that takes in both "obs" and - "goal" and outputs "actions". In order to be able to properly - invoke the network it is the responsibility of this proxy to - collate the inputs and decollate the outputs per agent. + "goal" and outputs "actions". In order to be able to properly invoke + the network it is the responsibility of this proxy to collate the + inputs and decollate the outputs per agent. """ def __init__( diff --git a/emote/trainer.py b/emote/trainer.py index 2fa3b5f2..98fa1858 100644 --- a/emote/trainer.py +++ b/emote/trainer.py @@ -11,12 +11,11 @@ class StateDict( dict, MutableMapping[str, Any] ): # TODO(singhblom) Split state dict into two - one persistable and one transient. - """Wrapped around a dict allowing usage in a weakref""" + """Wrapped around a dict allowing usage in a weakref.""" def get_handle(self) -> WeakReference["StateDict"]: - """Retrieve a weak handle to this state dict, with no promise of ownership - or lifetime - """ + """Retrieve a weak handle to this state dict, with no promise of + ownership or lifetime.""" return ref(self) @@ -27,7 +26,9 @@ class TrainingShutdownException(Exception): class Trainer: """The Trainer class manages the main training loop in emote. - It does so by invoking a bunch of callbacks in a number of different places.""" + It does so by invoking a bunch of callbacks in a number of different + places. + """ state: StateDict callbacks: List[Callback] @@ -54,10 +55,12 @@ def __init__( def train(self, shutdown_signal: Callable = None): """The main training loop. - This method will wait until the memory is full enough to start sampling, and then start - running cycles of backprops on batches sampled from the memory. + This method will wait until the memory is full enough to start + sampling, and then start running cycles of backprops on batches + sampled from the memory. - :param shutdown_signal: A function that returns True if training shut end, False otherwise. + :param shutdown_signal: A function that returns True if training + shut end, False otherwise. """ shutdown_signal = shutdown_signal or (lambda: False) diff --git a/emote/typing.py b/emote/typing.py index 2df3a77c..dc124163 100644 --- a/emote/typing.py +++ b/emote/typing.py @@ -1,13 +1,19 @@ +""" +emote.typing +============ +""" +from __future__ import annotations + from dataclasses import dataclass from enum import Enum -from typing import Callable, Dict, List +from typing import Callable, Dict, List, TypeAlias import torch from numpy.typing import ArrayLike -RewardFnType = Callable[[torch.Tensor, torch.Tensor], torch.Tensor] +RewardFnType: TypeAlias = Callable[[torch.Tensor, torch.Tensor], torch.Tensor] TermFnType = Callable[[torch.Tensor], torch.Tensor] # The AgentId is an application-defined integer diff --git a/emote/utils/BUILD b/emote/utils/BUILD new file mode 100644 index 00000000..db46e8d6 --- /dev/null +++ b/emote/utils/BUILD @@ -0,0 +1 @@ +python_sources() diff --git a/emote/utils/deprecated.py b/emote/utils/deprecated.py index 464b7da8..44f48477 100644 --- a/emote/utils/deprecated.py +++ b/emote/utils/deprecated.py @@ -1,6 +1,4 @@ -""" - -""" +"""""" import functools import warnings @@ -11,17 +9,20 @@ def deprecated( original_function: Callable = None, *, - reason: str = None, + reason: str, max_warn_count: int = 10, version: str = None, ) -> Callable: - """Function decorator to deprecate an annotated function. Can be used both as a - bare decorator, or with parameters to customize the display of the + """Function decorator to deprecate an annotated function. Can be used both + as a bare decorator, or with parameters to customize the display of the message. Writes to logging.warn. - :param original_function: Function to decorate. Automatically passed. - :param message: Message to show. Function name is automatically added. - :param max_warn_count: How many times we will warn for the same function + :param original_function: Function to decorate. Automatically + passed. + :param reason: Message to show. Function name is automatically + added. + :param max_warn_count: How many times we will warn for the same + function :returns: the wrapped function """ reason = f": {reason}" if reason else "" diff --git a/emote/utils/math.py b/emote/utils/math.py index 0bf95653..540ddb16 100644 --- a/emote/utils/math.py +++ b/emote/utils/math.py @@ -6,10 +6,16 @@ def truncated_linear(min_x: float, max_x: float, min_y: float, max_y: float, x: float) -> float: """Truncated linear function. + Implements the following function: - f1(x) = min_y + (x - min_x) / (max_x - min_x) * (max_y - min_y) + + \\[ + \\begin{cases} + f1(x) = \\frac{min_y + (x - min_x)}{ (max_x - min_x) * (max_y - min_y)} \\\\ f(x) = min(max_y, max(min_y, f1(x))) - If max_x - min_x < 1e-10, then it behaves as the constant f(x) = max_y + \\end{cases} + \\] + If max_x - min_x < 1e-10, then it behaves as the constant \\(f(x) = max_y\\) """ if max_x - min_x < 1e-10: return max_y diff --git a/emote/utils/threading.py b/emote/utils/threading.py index 1ab65f87..99fd8640 100644 --- a/emote/utils/threading.py +++ b/emote/utils/threading.py @@ -1,17 +1,6 @@ #!/usr/bin/env python3 - -""" -Thread-related utilities and tools. - -.. note:: - - TODO - --- - - * Make these generic over the locked resources - -""" +"""Thread-related utilities and tools.""" import threading @@ -23,32 +12,33 @@ class LockedResource(Generic[T]): - """Context manager for a lock and a resource, only giving access to the resource - when locked. Works well when paired with :class:`empyc.types.Ref` for primitive - types as well. - - - Usage: - - .. code:: - - resource = LockedResource([]) - with resource as inner_list: - inner_list.append(1) - + """Context manager for a lock and a resource. + + Only giving access to the + resource when locked. Works well when paired with [`empyc.types.Ref`] + for primitive types as well. + + *Usage:* + ```python + resource = LockedResource([]) + with resource as inner_list: + inner_list.append(1) + ``` """ def __init__(self, data: T): """Create a new LockedResource, with the provided data. - :param data: The data to lock""" + :param data: The data to lock + """ self._lock = threading.Lock() self._data = data def __enter__(self) -> T: """Enter the locked context and retrieve the data. - :returns: The underlying data object""" + :returns: The underlying data object + """ self._lock.acquire() return self._data @@ -62,11 +52,12 @@ def __exit__(self, _1, _2, _3): self._lock.release() def swap(self, new_resource: T) -> T: - """Replace the contained resource with the provided new resource, returning the - previous resource. This operation is atomic. + """Replace the contained resource with the provided new resource, + returning the previous resource. This operation is atomic. :param new_resource: The resource to lock after the swap - :returns: The previously guarded data""" + :returns: The previously guarded data + """ with self._lock: res = self._data self._data = new_resource @@ -117,7 +108,7 @@ def swap(self, value: int): return current_value def increment(self, value: int = 1): - """Increments the integer and returns the previous value""" + """Increments the integer and returns the previous value.""" with self._lock: original = self._value self._value += value @@ -142,6 +133,3 @@ def __enter__(self): def __exit__(self, *args, **kwargs): self._lock.release() self._accumulated_exec_time += perf_counter() - self._current_scope_exec_start - - -__all__ = ["LockedResource", "AtomicContainer", "AtomicInt", "TracedLock"] diff --git a/emote/utils/timed_call.py b/emote/utils/timed_call.py index eee31738..3ef18aa7 100644 --- a/emote/utils/timed_call.py +++ b/emote/utils/timed_call.py @@ -1,5 +1,5 @@ -""" -Simple block-based timers using Welford's Online Algorithm to approximate mean and variance. +"""Simple block-based timers using Welford's Online Algorithm to approximate +mean and variance. Usage: ```python @@ -26,11 +26,11 @@ class StatisticsAccumulator(ABC): - """Interface for a statistics integrator""" + """Interface for a statistics integrator.""" @abstractmethod def add(self, value: float): - """Add the `value` to the running statistics + """Add the `value` to the running statistics. :param value: the sample to integrate """ @@ -38,22 +38,24 @@ def add(self, value: float): @abstractmethod def current(self) -> Tuple[float, float]: - """Returns the statistics of the observed samples so far + """Returns the statistics of the observed samples so far. - :returns: a tuple (mean, variance)""" + :returns: a tuple (mean, variance) + """ ... @dataclass class WelfordAccumulator(StatisticsAccumulator): - """Implements Welford's Online Algorithm for single-pass variance and mean""" + """Implements Welford's Online Algorithm for single-pass variance and + mean.""" count: int = 0 mean: float = 0.0 differences: float = 0.0 def add(self, value: float): - """Add the `value` to the running statistics + """Add the `value` to the running statistics. :param value: the sample to integrate """ @@ -64,9 +66,10 @@ def add(self, value: float): self.differences += delta * delta2 def current(self) -> Tuple[float, float]: - """Returns the current values of the Welford algorithm + """Returns the current values of the Welford algorithm. - :returns: a tuple (mean, variance)""" + :returns: a tuple (mean, variance) + """ if self.count == 0: return float("nan"), float("nan") @@ -78,16 +81,17 @@ class MovingWindowAccumulator(StatisticsAccumulator): values: deque = field(default_factory=lambda: deque(maxlen=100)) def add(self, value: float): - """Add the `value` to the running statistics + """Add the `value` to the running statistics. :param value: the sample to integrate """ self.values.append(value) def current(self) -> Tuple[float, float]: - """Returns the current statistics + """Returns the current statistics. - :returns: a tuple (mean, variance)""" + :returns: a tuple (mean, variance) + """ if len(self.values) == 0: return float("nan"), float("nan") @@ -96,13 +100,15 @@ def current(self) -> Tuple[float, float]: class TimedBlock: - """Used to track the performance statistics of a block of code, in terms - of execution time.""" + """Used to track the performance statistics of a block of code, in terms of + execution time.""" def __init__(self, tracker_type: Type[StatisticsAccumulator] = MovingWindowAccumulator): - """Create a new timed block instance + """Create a new timed block instance. - :param tracker_type: The statistics integrator to use. Defaults to to MovingWindowStats""" + :param tracker_type: The statistics integrator to use. Defaults + to to MovingWindowStats + """ self._tracker = tracker_type() self._start = None @@ -113,15 +119,15 @@ def __exit__(self, *args): self._tracker.add(time.perf_counter() - self._start) def mean(self) -> float: - """Retrieve the mean execution time""" + """Retrieve the mean execution time.""" return self._tracker.current()[0] def var(self): - """Retrieve the variance of the execution time""" + """Retrieve the variance of the execution time.""" return self._tracker.current()[1] def stats(self): - """Retrieve the mean and the variance of execution time""" + """Retrieve the mean and the variance of execution time.""" return self._tracker.current() @@ -134,6 +140,3 @@ def scope(self, name: str) -> TimedBlock: def stats(self): return {name: timer.stats() for name, timer in self._timers.items()} - - -__all__ = ["TimedBlock", "MovingWindowAccumulator", "WelfordAccumulator"] diff --git a/emote/utils/weak_reference.py b/emote/utils/weak_reference.py index 8fc256d4..5a6d3b55 100644 --- a/emote/utils/weak_reference.py +++ b/emote/utils/weak_reference.py @@ -1,6 +1,4 @@ -""" -A class that contains a typed weak reference. -""" +"""A class that contains a typed weak reference.""" from typing import Generic, TypeVar from weakref import ReferenceType @@ -10,4 +8,4 @@ class WeakReference(ReferenceType, Generic[T]): - """A typed weak reference""" + """A typed weak reference.""" diff --git a/experiments/gym/BUILD b/experiments/gym/BUILD new file mode 100644 index 00000000..db46e8d6 --- /dev/null +++ b/experiments/gym/BUILD @@ -0,0 +1 @@ +python_sources() diff --git a/experiments/gym/__init__.py b/experiments/gym/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/experiments/gym/train_carracing.py b/experiments/gym/train_carracing.py index 9f52dbde..b615e400 100644 --- a/experiments/gym/train_carracing.py +++ b/experiments/gym/train_carracing.py @@ -8,7 +8,7 @@ import numpy as np import torch -from gym.vector import AsyncVectorEnv +from gymnasium.vector import AsyncVectorEnv from tests.gym import DictGymWrapper from tests.gym.collector import ThreadedGymCollector from torch import nn @@ -20,8 +20,8 @@ from emote.callback import Callback from emote.callbacks.logging import TensorboardLogger from emote.env.box2d import make_vision_box2d_env -from emote.memory import MemoryLoader, TableMemoryProxy -from emote.memory.builder import DictObsNStepTable +from emote.memory import MemoryLoader, MemoryTableProxy +from emote.memory.builder import DictObsNStepMemoryTable from emote.mixins.logging import LoggingMixin from emote.nn import GaussianPolicyHead from emote.nn.action_value_mlp import SharedEncoderActionValueNet @@ -168,7 +168,7 @@ def train_carracing(args): ImageLoggerCallback(), ] - memory_table = DictObsNStepTable( + memory_table = DictObsNStepMemoryTable( spaces=env.dict_space, use_terminal_column=False, maxlen=cfg.max_memory_size, @@ -180,7 +180,7 @@ def train_carracing(args): ThreadedGymCollector( env, VisionAgentProxy(policy, device=device), - TableMemoryProxy(memory_table, use_terminal=False), + MemoryTableProxy(memory_table, use_terminal=False), warmup_steps=cfg.batch_size * 3, render=False, ), diff --git a/experiments/gym/train_dqn_cartpole.py b/experiments/gym/train_dqn_cartpole.py index d92bb2a8..3225defa 100644 --- a/experiments/gym/train_dqn_cartpole.py +++ b/experiments/gym/train_dqn_cartpole.py @@ -19,16 +19,18 @@ from emote.callbacks.checkpointing import Checkpointer from emote.callbacks.generic import BackPropStepsTerminator from emote.callbacks.logging import TensorboardLogger -from emote.memory import MemoryLoader, TableMemoryProxy -from emote.memory.builder import DictObsNStepTable +from emote.memory import MemoryLoader, MemoryTableProxy +from emote.memory.builder import DictObsNStepMemoryTable from emote.mixins.logging import LoggingMixin from emote.proxies import GenericAgentProxy from emote.utils.spaces import BoxSpace, DictSpace, MDPSpace def _make_env(): - """Create the environment for the experiment, the environment is created in a thunk to avoid - creating multiple environments in the same process. This is important for the vectorized + """Create the environment for the experiment, the environment is created in + a thunk to avoid creating multiple environments in the same process. + + This is important for the vectorized environments. Returns: (Callable[[], gym.Env]): The thunk that creates the environment @@ -44,8 +46,8 @@ def _thunk(): class QNet(nn.Module): - """ - Q-Network class for Q-Learning. It takes observations and returns Q-values for actions. + """Q-Network class for Q-Learning. It takes observations and returns + Q-values for actions. Attributes: network (nn.Sequential): Neural network for computing Q-values. @@ -72,8 +74,7 @@ def __init__(self, num_obs, num_actions, hidden_dims): self.network = nn.Sequential(*layers) def forward(self, obs): - """ - Forward pass for the Q-Network. + """Forward pass for the Q-Network. Args: obs (Tensor): Observations. @@ -85,8 +86,8 @@ def forward(self, obs): class DQNPolicy(nn.Module): - """ - DQN Policy class to handle action selection with epsilon-greedy strategy. + """DQN Policy class to handle action selection with epsilon-greedy + strategy. Attributes: q_net (QNet): Q-Network to evaluate Q-values. @@ -117,8 +118,7 @@ def __init__( # Returns the index of the chosen action def forward(self, state): - """ - Forward pass for action selection. + """Forward pass for action selection. Args: state (Tensor): The state observations. @@ -160,7 +160,7 @@ def create_memory( data_group: str, device: torch.device, ): - """Creates memory and data_loader for the RL training + """Creates memory and data_loader for the RL training. Arguments: space (MDPSpace): the MDP space @@ -172,21 +172,20 @@ def create_memory( preload_buffer (bool): preload the buffer with some existing data buffer_filename (str): the path to the replay buffer if preload_buffer is set to True Returns: - (tuple[TableMemoryProxy, MemoryLoader]): A proxy for the memory and a dataloader - + (tuple[MemoryTableProxy, MemoryLoader]): A proxy for the memory and a dataloader """ # Create the memory - table = DictObsNStepTable( + memory_table = DictObsNStepMemoryTable( spaces=space, use_terminal_column=False, maxlen=memory_size, device=device, ) # The memory proxy is used to upload the data to the memory - memory_proxy = TableMemoryProxy(table=table, use_terminal=False) + memory_proxy = MemoryTableProxy(memory_table=memory_table, use_terminal=False) # The data loader is used to sample the data from the memory data_loader = MemoryLoader( - table=table, + memory_table=memory_table, rollout_count=batch_size // len_rollout, rollout_length=len_rollout, size_key="batch_size", @@ -200,15 +199,15 @@ def create_complementary_callbacks( logged_cbs: list[LoggingMixin], cbs_name_to_checkpoint: list[str] = None, ): - """The function creates the supplementary callbacks for the training and adds them to the callback lists - and returns the list. + """The function creates the supplementary callbacks for the training and + adds them to the callback lists and returns the list. - Arguments: - args: input args - logged_cbs (list[Callback]): the list of callbacks - cbs_name_to_checkpoint (list[str]): the name of callbacks to checkpoint - Returns: - (list[Callback]): the full list of callbacks for the training + Arguments: + args: input args + logged_cbs (list[Callback]): the list of callbacks + cbs_name_to_checkpoint (list[str]): the name of callbacks to checkpoint + Returns: + (list[Callback]): the full list of callbacks for the training """ # The logger callback is used for logging the training progress logger = TensorboardLogger( @@ -225,7 +224,7 @@ def create_complementary_callbacks( if cbs_name_to_checkpoint: # The checkpointer exports the model weights to the checkpoint directory checkpointer = Checkpointer( - callbacks=[ + restorees=[ cb for cb in logged_cbs if hasattr(cb, "name") and cb.name in cbs_name_to_checkpoint ], run_root=args.checkpoint_dir, @@ -263,8 +262,7 @@ def main(args): data_group="default", device=device, ) - - """Create a memory exporter if needed""" + """Create a memory exporter if needed.""" if args.export_memory: from emote.memory.memory import MemoryExporterProxyWrapper diff --git a/experiments/gym/train_genrl.py b/experiments/gym/train_genrl.py index 096d14e3..1ae227d5 100644 --- a/experiments/gym/train_genrl.py +++ b/experiments/gym/train_genrl.py @@ -1,9 +1,8 @@ -""" - -This is an example training with GenRL algorithm. GenRL training requires a generative model as an input. The generative -model should be trained prior to the GenRL training using VAE training as an example. One can use train_vae.py as an -example way to train a generative model. Please follow the instruction given by 'train_vae.py' to train a vae model for -the lunar lander environment. +"""This is an example training with GenRL algorithm. GenRL training requires a +generative model as an input. The generative model should be trained prior to +the GenRL training using VAE training as an example. One can use train_vae.py +as an example way to train a generative model. Please follow the instruction +given by 'train_vae.py' to train a vae model for the lunar lander environment. Policy training with GenRL can be done using the following: @@ -12,7 +11,6 @@ The above example assumes a pre-trained generative model exists in the directory defined by '--vae-checkpoint-dir' at the index defined by '--vae-checkpoint-index'. - """ import argparse @@ -37,7 +35,7 @@ from emote.algorithms.genrl.wrappers import DecoderWrapper, EncoderWrapper, PolicyWrapper from emote.algorithms.sac import FeatureAgentProxy from emote.memory import MemoryLoader -from emote.memory.builder import DictObsNStepTable +from emote.memory.builder import DictObsNStepMemoryTable from emote.utils.spaces import BoxSpace, MDPSpace @@ -51,10 +49,9 @@ def create_memory( device: torch.device, observation_key: str = "obs", ): - use_terminal_masking = True - table = DictObsNStepTable( + memory_table = DictObsNStepMemoryTable( spaces=space, use_terminal_column=use_terminal_masking, maxlen=memory_size, @@ -62,22 +59,22 @@ def create_memory( ) memory_proxy = MemoryProxyWithEncoder( - table=table, + memory_table=memory_table, encoder=encoder, minimum_length_threshold=len_rollout, use_terminal=use_terminal_masking, input_key=observation_key, ) - data_loader = MemoryLoader( - table=table, + memory_loader = MemoryLoader( + memory_table=memory_table, rollout_count=batch_size // len_rollout, rollout_length=len_rollout, size_key="batch_size", data_group=data_group, ) - return memory_proxy, data_loader + return memory_proxy, memory_loader def create_actor_critic_agents( @@ -87,7 +84,6 @@ def create_actor_critic_agents( decoder_wrapper: DecoderWrapper, init_alpha: float = 0.01, ): - device = args.device hidden_dims = [args.hidden_layer_size] * arg.num_hidden_layer @@ -127,16 +123,14 @@ def create_actor_critic_agents( arg = parser.parse_args() training_device = torch.device(arg.device) - - """Creating a vector of Gym environments """ + """Creating a vector of Gym environments.""" gym_wrapper = DictGymWrapper(AsyncVectorEnv([_make_env() for _ in range(arg.num_envs)])) number_of_actions = gym_wrapper.dict_space.actions.shape[0] number_of_obs = list(gym_wrapper.dict_space.state.spaces.values())[0].shape[0] condition_func = get_conditioning_fn(arg.condition_size) - - """Create the decoder wrapper""" + """Create the decoder wrapper.""" action_latent_size = arg.vae_latent_size decoder = FullyConnectedDecoder( @@ -176,16 +170,14 @@ def create_actor_critic_agents( actions=BoxSpace(dtype=np.float32, shape=(action_latent_size,)), state=gym_wrapper.dict_space.state, ) - - """Creating agent and the Q-functions""" + """Creating agent and the Q-functions.""" qnet1, qnet2, policy, agent_proxy, ln_alpha = create_actor_critic_agents( decoder_wrapper=decoder_wrapper, args=arg, num_latent=action_latent_size, num_obs=number_of_obs, ) - - """Creating the memory""" + """Creating the memory.""" gym_memory, dataloader = create_memory( space=spaces, encoder=encoder_wrapper, @@ -196,8 +188,7 @@ def create_actor_critic_agents( device=training_device, observation_key=arg.observation_key, ) - - """Creating the train callbacks""" + """Creating the train callbacks.""" train_callbacks = create_train_callbacks( args=arg, q1=qnet1, @@ -209,13 +200,11 @@ def create_actor_critic_agents( memory_proxy=gym_memory, data_group="rl_buffer", ) - - """Creating the complementary callbacks""" + """Creating the complementary callbacks.""" callbacks = create_complementary_callbacks( args=arg, logged_cbs=train_callbacks, ) - - """Start the training""" + """Start the training.""" trainer = Trainer(callbacks, dataloader) trainer.train() diff --git a/experiments/gym/train_lunar_lander.py b/experiments/gym/train_lunar_lander.py index 9249e513..6d00a691 100644 --- a/experiments/gym/train_lunar_lander.py +++ b/experiments/gym/train_lunar_lander.py @@ -19,8 +19,8 @@ from emote.callbacks import Checkpointer from emote.callbacks.generic import BackPropStepsTerminator from emote.callbacks.logging import TensorboardLogger -from emote.memory import MemoryLoader, TableMemoryProxy -from emote.memory.builder import DictObsNStepTable +from emote.memory import MemoryLoader, MemoryTableProxy +from emote.memory.builder import DictObsNStepMemoryTable from emote.mixins.logging import LoggingMixin from emote.nn import GaussianPolicyHead from emote.nn.initialization import ortho_init_, xavier_uniform_init_ @@ -28,7 +28,7 @@ def _make_env(): - """Making a Lunar Lander Gym environment + """Making a Lunar Lander Gym environment. Returns: (Gym.env): one Lunar Lander Gym environment @@ -100,7 +100,7 @@ def create_memory( preload_buffer: bool = False, buffer_filename: str = None, ): - """Creates memory and data_loader for the RL training + """Creates memory and data_loader for the RL training. Arguments: space (MDPSpace): the MDP space @@ -112,21 +112,20 @@ def create_memory( preload_buffer (bool): preload the buffer with some existing data buffer_filename (str): the path to the replay buffer if preload_buffer is set to True Returns: - (tuple[TableMemoryProxy, MemoryLoader]): A proxy for the memory and a dataloader - + (tuple[MemoryTableProxy, MemoryLoader]): A proxy for the memory and a dataloader """ - table = DictObsNStepTable( + memory_table = DictObsNStepMemoryTable( spaces=space, use_terminal_column=False, maxlen=memory_size, device=device, ) if preload_buffer: - table.restore(buffer_filename) - print(f"memory populated with offline samples - size: {table.size()}") - memory_proxy = TableMemoryProxy(table=table, use_terminal=False) + memory_table.restore(buffer_filename) + print(f"memory populated with offline samples - size: {memory_table.size()}") + memory_proxy = MemoryTableProxy(memory_table=memory_table, use_terminal=False) data_loader = MemoryLoader( - table=table, + memory_table=memory_table, rollout_count=batch_size // len_rollout, rollout_length=len_rollout, size_key="batch_size", @@ -141,7 +140,8 @@ def create_actor_critic_agents( num_actions: int, init_alpha: float = 0.01, ): - """The function to create the actor (policy) and the critics (two Q-functions) + """The function to create the actor (policy) and the critics (two + Q-functions) Arguments: args: the input arguments given by argparser @@ -173,7 +173,7 @@ def create_train_callbacks( policy_proxy: FeatureAgentProxy, ln_alpha: torch.Tensor, env: DictGymWrapper, - memory_proxy: TableMemoryProxy, + memory_proxy: MemoryTableProxy, data_group: str, ): """The function creates the callbacks required for model-free SAC training. @@ -186,7 +186,7 @@ def create_train_callbacks( policy_proxy (FeatureAgentProxy): the wrapper for the policy network ln_alpha (Tensor): the log of alpha parameters (trainable) env (DictGymWrapper): the Gym wrapper - memory_proxy (TableMemoryProxy): the proxy for the memory + memory_proxy (MemoryTableProxy): the proxy for the memory data_group (str): the data_group to receive data batches Returns: (list[Callback]): the callbacks for the SAC RL training @@ -253,15 +253,15 @@ def create_complementary_callbacks( logged_cbs: list[LoggingMixin], cbs_name_to_checkpoint: list[str] = None, ): - """The function creates the supplementary callbacks for the training and adds them to the callback lists - and returns the list. - - Arguments: - args: input args - logged_cbs (list[Callback]): the list of callbacks - cbs_name_to_checkpoint (list[str]): the name of callbacks to checkpoint - Returns: - (list[Callback]): the full list of callbacks for the training + """The function creates the supplementary callbacks for the training and + adds them to the callback lists and returns the list. + + Arguments: + args: input args + logged_cbs (list[Callback]): the list of callbacks + cbs_name_to_checkpoint (list[str]): the name of callbacks to checkpoint + Returns: + (list[Callback]): the full list of callbacks for the training """ if args.use_wandb: from emote.callbacks.wb_logger import WBLogger @@ -291,7 +291,7 @@ def create_complementary_callbacks( if cbs_name_to_checkpoint: checkpointer = Checkpointer( - callbacks=[ + restorees=[ cb for cb in logged_cbs if hasattr(cb, "name") and cb.name in cbs_name_to_checkpoint ], run_root=args.checkpoint_dir, @@ -325,13 +325,11 @@ def create_complementary_callbacks( input_args = parser.parse_args() training_device = torch.device(input_args.device) - - """Creating a vector of Gym environments """ + """Creating a vector of Gym environments.""" gym_wrapper = DictGymWrapper(AsyncVectorEnv([_make_env() for _ in range(input_args.num_envs)])) number_of_actions = gym_wrapper.dict_space.actions.shape[0] number_of_obs = list(gym_wrapper.dict_space.state.spaces.values())[0].shape[0] - - """Creating the memory and the dataloader""" + """Creating the memory and the dataloader.""" gym_memory_proxy, dataloader = create_memory( space=gym_wrapper.dict_space, memory_size=4_000_000, @@ -340,8 +338,7 @@ def create_complementary_callbacks( data_group="default", device=training_device, ) - - """Create a memory exporter if needed""" + """Create a memory exporter if needed.""" if input_args.export_memory: from emote.memory.memory import MemoryExporterProxyWrapper @@ -357,8 +354,7 @@ def create_complementary_callbacks( qnet1, qnet2, agent_proxy, ln_alpha, policy = create_actor_critic_agents( args=input_args, num_actions=number_of_actions, num_obs=number_of_obs ) - - """Creating the training callbacks """ + """Creating the training callbacks.""" train_callbacks = create_train_callbacks( args=input_args, q1=qnet1, @@ -370,10 +366,9 @@ def create_complementary_callbacks( memory_proxy=gym_memory_proxy, data_group="default", ) - - """Creating the supplementary callbacks and adding them to the training callbacks """ + """Creating the supplementary callbacks and adding them to the training + callbacks.""" all_callbacks = create_complementary_callbacks(args=input_args, logged_cbs=train_callbacks) - - """Training """ + """Training.""" trainer = Trainer(all_callbacks, dataloader) trainer.train() diff --git a/experiments/gym/train_lunar_lander_model_based.py b/experiments/gym/train_lunar_lander_model_based.py index 14e47113..02fed8ea 100644 --- a/experiments/gym/train_lunar_lander_model_based.py +++ b/experiments/gym/train_lunar_lander_model_based.py @@ -24,8 +24,10 @@ def lunar_lander_term_func( states: torch.Tensor, ): - """The termination function used to identify terminal states for the lunar lander - gym environment. This function is used inside a gym-like dynamic model to terminate + """The termination function used to identify terminal states for the lunar + lander gym environment. + + This function is used inside a gym-like dynamic model to terminate trajectories. The current implementation always outputs False which means all states labeled as non-terminal. This can be improved by adding some code to identify terminal states, or alternatively, training a neural network to detect terminal states. @@ -73,22 +75,24 @@ def create_model_based_callbacks( model_env, policy_proxy, ): - """ "Creates the extra callbacks required for model-based RL (MBRL) training. - Currently, there are three callbacks required for the MBRL training: - (1) ModelLoss: It is used to train the dynamic model. - (2) BatchSampler: In every BP step, it samples a batch of transitions from either the gym buffer or - the model buffer depending on a probability distribution. The batch is only used for the RL training. - (3) ModelBasedCollector: It is used to create synthetic transitions by unrolling the gym-like dynamic - model. The transitions are stored in the model buffer. + """ "Creates the extra callbacks required for model-based RL (MBRL) + training. Currently, there are three callbacks required for the MBRL + training: (1) ModelLoss: It is used to train the dynamic model. (2) + BatchSampler: In every BP step, it samples a batch of transitions from + either the gym buffer or the model buffer depending on a probability + distribution. The batch is only used for the RL training. (3) + ModelBasedCollector: It is used to create synthetic transitions by + unrolling the gym-like dynamic model. The transitions are stored in the + model buffer. - Arguments: - args: arguments passed to the code via argparse - model_buffer (DictTable): the replay_buffer used to store transitions - model_data_loader (MemoryLoader): the dataloader used to sample batches of transitions - model_env (ModelEnv): the Gym-like dynamic model - policy_proxy (FeatureAgentProxy): the policy proxy - Returns: - (list[Callback]): A list of callbacks required for model-based RL training + Arguments: + args: arguments passed to the code via argparse + model_buffer (DictTable): the replay_buffer used to store transitions + model_data_loader (MemoryLoader): the dataloader used to sample batches of transitions + model_env (ModelEnv): the Gym-like dynamic model + policy_proxy (FeatureAgentProxy): the policy proxy + Returns: + (list[Callback]): A list of callbacks required for model-based RL training """ mb_cbs = [ ModelLoss( @@ -133,8 +137,7 @@ def create_model_based_callbacks( default=None, help="Short display name of run for the W&B UI. Randomly generated by default.", ) - - """The extra arguments for the model-based RL training""" + """The extra arguments for the model-based RL training.""" parser.add_argument( "--num-model-ensembles", type=int, @@ -174,8 +177,8 @@ def create_model_based_callbacks( gym_wrapper = DictGymWrapper(AsyncVectorEnv([_make_env() for _ in range(input_args.num_envs)])) number_of_actions = gym_wrapper.dict_space.actions.shape[0] number_of_obs = list(gym_wrapper.dict_space.state.spaces.values())[0].shape[0] - - """Creating the models, memory, dataloader and callbacks (the same as model-free training). """ + """Creating the models, memory, dataloader and callbacks (the same as + model-free training).""" qnet1, qnet2, agent_proxy = create_actor_critic_agents( args=input_args, num_actions=number_of_actions, num_obs=number_of_obs ) @@ -198,8 +201,7 @@ def create_model_based_callbacks( memory_proxy=gym_memory, data_group="rl_buffer", ) - - """The extra functions used only for model-based RL training""" + """The extra functions used only for model-based RL training.""" memory_init_size = input_args.batch_size * input_args.num_bp_to_retain_model_buffer model_memory, model_dataloader = create_memory( space=gym_wrapper.dict_space, @@ -223,8 +225,7 @@ def create_model_based_callbacks( model_env=gym_like_env, policy_proxy=agent_proxy, ) - - """Creating the complementary callbacks and starting the training""" + """Creating the complementary callbacks and starting the training.""" callbacks = create_complementary_callbacks( args=input_args, logged_cbs=(train_callbacks + mb_callbacks) ) diff --git a/experiments/gym/train_vae.py b/experiments/gym/train_vae.py index b80de9c8..be327a44 100644 --- a/experiments/gym/train_vae.py +++ b/experiments/gym/train_vae.py @@ -18,7 +18,6 @@ """ - import argparse import os @@ -88,8 +87,8 @@ def conditioning_fn(a): ), ) condition_fn = get_conditioning_fn(arg.condition_size) - - """Create the memory and pre-load it with some expert policy trajectories""" + """Create the memory and pre-load it with some expert policy + trajectories.""" _, dataloader = create_memory( space=spaces, memory_size=4_000_000, @@ -100,8 +99,7 @@ def conditioning_fn(a): buffer_filename=os.path.join(arg.buffer_dir, arg.buffer_filename), device=training_device, ) - - """Create the vae model """ + """Create the vae model.""" encoder = FullyConnectedEncoder( input_size=arg.action_size, output_size=arg.latent_size, @@ -133,14 +131,13 @@ def conditioning_fn(a): input_key=arg.observation_key, ) ] - - """Creating the supplementary callbacks and adding them to the training callbacks """ + """Creating the supplementary callbacks and adding them to the training + callbacks.""" all_callbacks = create_complementary_callbacks( args=arg, logged_cbs=cbs, cbs_name_to_checkpoint=["vae"], ) - - """Training """ + """Training.""" trainer = Trainer(all_callbacks, dataloader) trainer.train() diff --git a/experiments/gym/wandb_sweep_lunar_lander.py b/experiments/gym/wandb_sweep_lunar_lander.py index faf37589..f3e7caf5 100644 --- a/experiments/gym/wandb_sweep_lunar_lander.py +++ b/experiments/gym/wandb_sweep_lunar_lander.py @@ -17,8 +17,8 @@ from emote.algorithms.sac import AlphaLoss, FeatureAgentProxy, PolicyLoss, QLoss, QTarget from emote.callbacks.generic import BackPropStepsTerminator from emote.callbacks.wb_logger import WBLogger -from emote.memory import MemoryLoader, TableMemoryProxy -from emote.memory.builder import DictObsNStepTable +from emote.memory import MemoryLoader, MemoryTableProxy +from emote.memory.builder import DictObsNStepMemoryTable from emote.nn import GaussianPolicyHead from emote.nn.initialization import ortho_init_, xavier_uniform_init_ @@ -103,14 +103,14 @@ def train_lunar_lander(args): learning_rate = wandb.config.learning_rate env = DictGymWrapper(AsyncVectorEnv([_make_env() for _ in range(n_env)])) - table = DictObsNStepTable( + memory_table = DictObsNStepMemoryTable( spaces=env.dict_space, use_terminal_column=False, maxlen=4_000_000, device=device, ) - memory_proxy = TableMemoryProxy(table, use_terminal=False) - dataloader = MemoryLoader(table, batch_size // rollout_len, rollout_len, "batch_size") + memory_proxy = MemoryTableProxy(memory_table, use_terminal=False) + dataloader = MemoryLoader(memory_table, batch_size // rollout_len, rollout_len, "batch_size") num_actions = env.dict_space.actions.shape[0] num_obs = list(env.dict_space.state.spaces.values())[0].shape[0] diff --git a/get-pants.sh b/get-pants.sh new file mode 100755 index 00000000..76f9712d --- /dev/null +++ b/get-pants.sh @@ -0,0 +1,221 @@ +#!/usr/bin/env bash +# Copyright 2023 Pants project contributors (see CONTRIBUTORS.md). +# Licensed under the Apache License, Version 2.0 (see LICENSE). + +set -euo pipefail + +COLOR_RED="\x1b[31m" +COLOR_GREEN="\x1b[32m" +COLOR_YELLOW="\x1b[33m" +COLOR_RESET="\x1b[0m" + +function log() { + echo -e "$@" 1>&2 +} + +function die() { + (($# > 0)) && log "${COLOR_RED}$*${COLOR_RESET}" + exit 1 +} + +function green() { + (($# > 0)) && log "${COLOR_GREEN}$*${COLOR_RESET}" +} + +function warn() { + (($# > 0)) && log "${COLOR_YELLOW}$*${COLOR_RESET}" +} + +function check_cmd() { + local cmd="$1" + command -v "$cmd" >/dev/null || die "This script requires the ${cmd} binary to be on the PATH." +} + +help_url="https://www.pantsbuild.org/docs/getting-help" + +_GC=() + +function gc() { + if (($# > 0)); then + check_cmd rm + _GC+=("$@") + else + rm -rf "${_GC[@]}" + fi +} + +trap gc EXIT + +check_cmd uname + +function calculate_os() { + local os + + os="$(uname -s)" + if [[ "${os}" =~ [Ll]inux ]]; then + echo linux + elif [[ "${os}" =~ [Dd]arwin ]]; then + echo macos + elif [[ "${os}" =~ [Ww]in|[Mm][Ii][Nn][Gg] ]]; then + # Powershell reports something like: Windows_NT + # Git bash reports something like: MINGW64_NT-10.0-22621 + echo windows + else + die "Pants is not supported on this operating system (${os}). Please reach out to us at ${help_url} for help." + fi +} + +OS="$(calculate_os)" + +check_cmd basename +if [[ "${OS}" == "windows" ]]; then + check_cmd pwsh +else + check_cmd curl +fi + +function fetch() { + local url="$1" + local dest_dir="$2" + + local dest + dest="${dest_dir}/$(basename "${url}")" + + if [[ "${OS}" == "windows" ]]; then + pwsh -c "Invoke-WebRequest -OutFile $dest -Uri $url" + else + curl --proto '=https' --tlsv1.2 -sSfL -o "${dest}" "${url}" + fi +} + +if [[ "${OS}" == "macos" ]]; then + check_cmd shasum +else + check_cmd sha256sum +fi + +function sha256() { + if [[ "${OS}" == "macos" ]]; then + shasum --algorithm 256 "$@" + else + sha256sum "$@" + fi +} + +check_cmd mktemp + +function install_from_url() { + local url="$1" + local dest="$2" + + local workdir + workdir="$(mktemp -d)" + gc workdir + + fetch "${url}.sha256" "${workdir}" + fetch "${url}" "${workdir}" + ( + cd "${workdir}" + sha256 -c --status ./*.sha256 || + die "Download from ${url} did not match the fingerprint at ${url}.sha256" + ) + rm "${workdir}/"*.sha256 + if [[ "${OS}" == "macos" ]]; then + mkdir -p "$(dirname "${dest}")" + install -m 755 "${workdir}/"* "${dest}" + else + install -D -m 755 "${workdir}/"* "${dest}" + fi +} + +function calculate_arch() { + local arch + + arch="$(uname -m)" + if [[ "${arch}" =~ x86[_-]64 ]]; then + echo x86_64 + elif [[ "${arch}" =~ arm64|aarch64 ]]; then + echo aarch64 + else + die "Pants is not supported for this chip architecture (${arch}). Please reach out to us at ${help_url} for help." + fi +} + +check_cmd cat + +function usage() { + cat < 0)); do + case "$1" in + --help | -h) + usage + exit 0 + ;; + --bin-dir | -d) + bin_dir="$2" + shift + ;; + --base-name | -b) + base_name="$2" + shift + ;; + --version | -V) + version="download/v$2" + shift + ;; + *) + usage + die "Unexpected argument $1\n" + ;; + esac + shift +done + +ARCH="$(calculate_arch)" +URL="https://github.com/pantsbuild/scie-pants/releases/${version}/scie-pants-${OS}-${ARCH}" +dest="${bin_dir}/${base_name}" + +log "Downloading and installing the pants launcher ..." +install_from_url "${URL}" "${dest}" +green "Installed the pants launcher from ${URL} to ${dest}" +if ! command -v "${base_name}" >/dev/null; then + warn "${dest} is not on the PATH." + log "You'll either need to invoke ${dest} explicitly or else add ${bin_dir} to your shell's PATH." +fi + +green "\nRunning \`pants\` in a Pants-enabled repo will use the version of Pants configured for that repo." +green "In a repo not yet Pants-enabled, it will prompt you to set up Pants for that repo." diff --git a/locks/base.lock b/locks/base.lock new file mode 100644 index 00000000..b5d3505a --- /dev/null +++ b/locks/base.lock @@ -0,0 +1,2872 @@ +// This lockfile was autogenerated by Pants. To regenerate, run: +// +// pants generate-lockfiles --resolve=base +// +// --- BEGIN PANTS LOCKFILE METADATA: DO NOT EDIT OR REMOVE --- +// { +// "version": 3, +// "valid_for_interpreter_constraints": [ +// "CPython<3.11,>=3.10" +// ], +// "generated_with_requirements": [ +// "atomicwrites>=1.4.0", +// "box2d-py>=2.3.5", +// "cloudpickle~=3.0", +// "gsutil>=4.66", +// "gymnasium>=0.27.1", +// "numpy<1.24", +// "onnx>=1.10", +// "opencv-python>=3.0", +// "protobuf>=4.0", +// "psutil>=5.8.0", +// "pygame>=2.1.0", +// "pytest-benchmark==4.0.0", +// "pytest-cov!=2.12.1,<3.1,>=2.12", +// "pytest-platform-markers", +// "pytest-rerunfailures", +// "pytest-xdist<3,>=2.5", +// "pytest~=8.0", +// "setuptools==59.5", +// "tensorboard>=2.8.0", +// "torch==1.12.0", +// "wandb>=0.14.0" +// ], +// "manylinux": "manylinux2014", +// "requirement_constraints": [], +// "only_binary": [], +// "no_binary": [] +// } +// --- END PANTS LOCKFILE METADATA --- + +{ + "allow_builds": true, + "allow_prereleases": false, + "allow_wheels": true, + "build_isolation": true, + "constraints": [], + "locked_resolves": [ + { + "locked_requirements": [ + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "526a04eadab8b4ee719ce68f204172ead1027549089702d99b9059f129ff1308", + "url": "https://files.pythonhosted.org/packages/a2/ad/e0d3c824784ff121c03cc031f944bc7e139a8f1870ffd2845cc2dd76f6c4/absl_py-2.1.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "7820790efbb316739cde8b4e19357243fc3608a152024288513dd968d7d959ff", + "url": "https://files.pythonhosted.org/packages/7a/8f/fc001b92ecc467cc32ab38398bd0bfb45df46e7523bf33c2ad22a505f06e/absl-py-2.1.0.tar.gz" + } + ], + "project_name": "absl-py", + "requires_dists": [], + "requires_python": ">=3.7", + "version": "2.1.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "702e2c7c187c1a498a4e2b03155d52658fdd6fda882d3d7fbb891a5cf108bb10", + "url": "https://files.pythonhosted.org/packages/25/00/d3d4a9e23e4d810a345f8ca24550caec0aaca7307fd692e0b939746b1d78/aiohttp-3.9.5-cp310-cp310-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "edea7d15772ceeb29db4aff55e482d4bcfb6ae160ce144f2682de02f6d693551", + "url": "https://files.pythonhosted.org/packages/04/a4/e3679773ea7eb5b37a2c998e25b017cc5349edf6ba2739d1f32855cfb11b/aiohttp-3.9.5.tar.gz" + }, + { + "algorithm": "sha256", + "hash": "c8a02fbeca6f63cb1f0475c799679057fc9268b77075ab7cf3f1c600e81dd46b", + "url": "https://files.pythonhosted.org/packages/6e/05/36471e8cbcf4c56d4917fcbe0c2c6d68119ba6e83b66d7173f39ee0125b6/aiohttp-3.9.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "ff84aeb864e0fac81f676be9f4685f0527b660f1efdc40dcede3c251ef1e867f", + "url": "https://files.pythonhosted.org/packages/77/4d/892098719e00bcf746a9fccc5f6854b1cfaf0d892de8ca5a646083eb12e2/aiohttp-3.9.5-cp310-cp310-musllinux_1_1_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "84dabd95154f43a2ea80deffec9cb44d2e301e38a0c9d331cc4aa0166fe28ae3", + "url": "https://files.pythonhosted.org/packages/7f/ee/0c83fd6ece4200145417da81565af7e7266b3a0591fbe32129b48187a472/aiohttp-3.9.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "c26959ca7b75ff768e2776d8055bf9582a6267e24556bb7f7bd29e677932be72", + "url": "https://files.pythonhosted.org/packages/a0/09/e7637f4f0760cad4d67347bbd8311c6ad0259a3fc01f04555af9e84bd378/aiohttp-3.9.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "c413016880e03e69d166efb5a1a95d40f83d5a3a648d16486592c49ffb76d0db", + "url": "https://files.pythonhosted.org/packages/a3/5c/322ffd8b6bb4a49d399685c1fccecb0bd0f7487bfefeef202c4f4c478bd0/aiohttp-3.9.5-cp310-cp310-musllinux_1_1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "6ae79c1bc12c34082d92bf9422764f799aee4746fd7a392db46b7fd357d4a17a", + "url": "https://files.pythonhosted.org/packages/a9/51/d95cab6dbee773c57ff590d218633e7b9d52a103bc51060483349f3c8e1e/aiohttp-3.9.5-cp310-cp310-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "4d3ebb9e1316ec74277d19c5f482f98cc65a73ccd5430540d6d11682cd857430", + "url": "https://files.pythonhosted.org/packages/ac/03/5da5d4b8e88d8af96f3b2f498141cafaad9acf3282831f0036993385b2d5/aiohttp-3.9.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "ad7f2919d7dac062f24d6f5fe95d401597fbb015a25771f85e692d043c9d7832", + "url": "https://files.pythonhosted.org/packages/b8/e6/17062e803031c760bc452117f0789f36545355d287258889ccfe6f57cce8/aiohttp-3.9.5-cp310-cp310-musllinux_1_1_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "fcde4c397f673fdec23e6b05ebf8d4751314fa7c24f93334bf1f1364c1c69ac7", + "url": "https://files.pythonhosted.org/packages/bb/6b/baa5886a66dc4a9fe60df3fff543ac0cdbac3d18347889f17023b15bdceb/aiohttp-3.9.5-cp310-cp310-macosx_10_9_universal2.whl" + }, + { + "algorithm": "sha256", + "hash": "e7a6a8354f1b62e15d48e04350f13e726fa08b62c3d7b8401c0a1314f02e3558", + "url": "https://files.pythonhosted.org/packages/db/fd/f390f2a538858c0ff5d74f11226d85956d6c52b16765cc485d4f7ba7d45d/aiohttp-3.9.5-cp310-cp310-musllinux_1_1_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "5d6b3f1fabe465e819aed2c421a6743d8debbde79b6a8600739300630a01bf2c", + "url": "https://files.pythonhosted.org/packages/e7/3d/557ca9d4867e0e17f69694e514999c3de0a63c11964701600c9719171b97/aiohttp-3.9.5-cp310-cp310-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "714d4e5231fed4ba2762ed489b4aec07b2b9953cf4ee31e9871caac895a839c0", + "url": "https://files.pythonhosted.org/packages/f4/46/c36596481a148014b0b6d4a62570baf5580aede5acc95901317b12cc3308/aiohttp-3.9.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + } + ], + "project_name": "aiohttp", + "requires_dists": [ + "Brotli; platform_python_implementation == \"CPython\" and extra == \"speedups\"", + "aiodns; (sys_platform == \"linux\" or sys_platform == \"darwin\") and extra == \"speedups\"", + "aiosignal>=1.1.2", + "async-timeout<5.0,>=4.0; python_version < \"3.11\"", + "attrs>=17.3.0", + "brotlicffi; platform_python_implementation != \"CPython\" and extra == \"speedups\"", + "frozenlist>=1.1.1", + "multidict<7.0,>=4.5", + "yarl<2.0,>=1.0" + ], + "requires_python": ">=3.8", + "version": "3.9.5" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17", + "url": "https://files.pythonhosted.org/packages/76/ac/a7305707cb852b7e16ff80eaf5692309bde30e2b1100a1fcacdc8f731d97/aiosignal-1.3.1-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc", + "url": "https://files.pythonhosted.org/packages/ae/67/0952ed97a9793b4958e5736f6d2b346b414a2cd63e82d05940032f45b32f/aiosignal-1.3.1.tar.gz" + } + ], + "project_name": "aiosignal", + "requires_dists": [ + "frozenlist>=1.1.0" + ], + "requires_python": ">=3.7", + "version": "1.3.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "69a79e083a716173e5532e0fa3bef45f793f4e61096cf52b5a42c0211c8b8aa5", + "url": "https://files.pythonhosted.org/packages/0b/29/cba741f3abc1700dda883c4a1dd83f4ae89e4e8654067929d89143df2c58/argcomplete-3.4.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "c2abcdfe1be8ace47ba777d4fce319eb13bf8ad9dace8d085dcad6eded88057f", + "url": "https://files.pythonhosted.org/packages/db/ca/45176b8362eb06b68f946c2bf1184b92fc98d739a3f8c790999a257db91f/argcomplete-3.4.0.tar.gz" + } + ], + "project_name": "argcomplete", + "requires_dists": [ + "coverage; extra == \"test\"", + "mypy; extra == \"test\"", + "pexpect; extra == \"test\"", + "ruff; extra == \"test\"", + "wheel; extra == \"test\"" + ], + "requires_python": ">=3.8", + "version": "3.4.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028", + "url": "https://files.pythonhosted.org/packages/a7/fa/e01228c2938de91d47b307831c62ab9e4001e747789d0b05baf779a6488c/async_timeout-4.0.3-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f", + "url": "https://files.pythonhosted.org/packages/87/d6/21b30a550dafea84b1b8eee21b5e23fa16d010ae006011221f33dcd8d7f8/async-timeout-4.0.3.tar.gz" + } + ], + "project_name": "async-timeout", + "requires_dists": [ + "typing-extensions>=3.6.5; python_version < \"3.8\"" + ], + "requires_python": ">=3.7", + "version": "4.0.3" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11", + "url": "https://files.pythonhosted.org/packages/87/c6/53da25344e3e3a9c01095a89f16dbcda021c609ddb42dd6d7c0528236fb2/atomicwrites-1.4.1.tar.gz" + } + ], + "project_name": "atomicwrites", + "requires_dists": [], + "requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7", + "version": "1.4.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1", + "url": "https://files.pythonhosted.org/packages/e0/44/827b2a91a5816512fcaf3cc4ebc465ccd5d598c45cefa6703fcf4a79018f/attrs-23.2.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30", + "url": "https://files.pythonhosted.org/packages/e3/fc/f800d51204003fa8ae392c4e8278f256206e7a919b708eef054f5f4b650d/attrs-23.2.0.tar.gz" + } + ], + "project_name": "attrs", + "requires_dists": [ + "attrs[tests-mypy]; extra == \"tests-no-zope\"", + "attrs[tests-no-zope]; extra == \"tests\"", + "attrs[tests]; extra == \"cov\"", + "attrs[tests]; extra == \"dev\"", + "cloudpickle; platform_python_implementation == \"CPython\" and extra == \"tests-no-zope\"", + "coverage[toml]>=5.3; extra == \"cov\"", + "furo; extra == \"docs\"", + "hypothesis; extra == \"tests-no-zope\"", + "importlib-metadata; python_version < \"3.8\"", + "mypy>=1.6; (platform_python_implementation == \"CPython\" and python_version >= \"3.8\") and extra == \"tests-mypy\"", + "myst-parser; extra == \"docs\"", + "pre-commit; extra == \"dev\"", + "pympler; extra == \"tests-no-zope\"", + "pytest-mypy-plugins; (platform_python_implementation == \"CPython\" and python_version >= \"3.8\") and extra == \"tests-mypy\"", + "pytest-xdist[psutil]; extra == \"tests-no-zope\"", + "pytest>=4.3.0; extra == \"tests-no-zope\"", + "sphinx-notfound-page; extra == \"docs\"", + "sphinx; extra == \"docs\"", + "sphinxcontrib-towncrier; extra == \"docs\"", + "towncrier; extra == \"docs\"", + "zope-interface; extra == \"docs\"", + "zope-interface; extra == \"tests\"" + ], + "requires_python": ">=3.7", + "version": "23.2.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "147758d41ae7240dc989f0039f27da8ca0d53734be0eb869ef16e3adcfa462e8", + "url": "https://files.pythonhosted.org/packages/23/10/c0b78c27298029e4454a472a1919bde20cb182dab1662cec7f2ca1dcc523/boto-2.49.0-py2.py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "ea0d3b40a2d852767be77ca343b58a9e3a4b00d9db440efb8da74b4e58025e5a", + "url": "https://files.pythonhosted.org/packages/c8/af/54a920ff4255664f5d238b5aebd8eedf7a07c7a5e71e27afcfe840b82f51/boto-2.49.0.tar.gz" + } + ], + "project_name": "boto", + "requires_dists": [], + "requires_python": null, + "version": "2.49.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "bdacfbbc56079bb317548efe49d3d5a86646885cc27f4a2ee97e4b2960921ab7", + "url": "https://files.pythonhosted.org/packages/98/c2/ab05b5329dc4416b5ee5530f0625a79c394a3e3c10abe0812b9345256451/box2d-py-2.3.8.tar.gz" + } + ], + "project_name": "box2d-py", + "requires_dists": [], + "requires_python": null, + "version": "2.3.8" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945", + "url": "https://files.pythonhosted.org/packages/fb/2b/a64c2d25a37aeb921fddb929111413049fc5f8b9a4c1aefaffaafe768d54/cachetools-5.3.3-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105", + "url": "https://files.pythonhosted.org/packages/b3/4d/27a3e6dd09011649ad5210bdf963765bc8fa81a0827a4fc01bafd2705c5b/cachetools-5.3.3.tar.gz" + } + ], + "project_name": "cachetools", + "requires_dists": [], + "requires_python": ">=3.7", + "version": "5.3.3" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56", + "url": "https://files.pythonhosted.org/packages/5b/11/1e78951465b4a225519b8c3ad29769c49e0d8d157a070f681d5b6d64737f/certifi-2024.6.2-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516", + "url": "https://files.pythonhosted.org/packages/07/b3/e02f4f397c81077ffc52a538e0aec464016f1860c472ed33bd2a1d220cc5/certifi-2024.6.2.tar.gz" + } + ], + "project_name": "certifi", + "requires_dists": [], + "requires_python": ">=3.6", + "version": "2024.6.2" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d", + "url": "https://files.pythonhosted.org/packages/ee/68/74a2b9f9432b70d97d1184cdabf32d7803124c228adef9481d280864a4a7/cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684", + "url": "https://files.pythonhosted.org/packages/22/05/43cfda378da7bb0aa19b3cf34fe54f8867b0d581294216339d87deefd69c/cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7", + "url": "https://files.pythonhosted.org/packages/54/49/b8875986beef2e74fc668b95f2df010e354f78e009d33d95b375912810c3/cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673", + "url": "https://files.pythonhosted.org/packages/57/3a/c263cf4d5b02880274866968fa2bf196a02c4486248bc164732319b4a4c0/cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0", + "url": "https://files.pythonhosted.org/packages/68/ce/95b0bae7968c65473e1298efb042e10cafc7bafc14d9e4f154008241c91d/cffi-1.16.0.tar.gz" + }, + { + "algorithm": "sha256", + "hash": "6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088", + "url": "https://files.pythonhosted.org/packages/aa/aa/1c43e48a6f361d1529f9e4602d6992659a0107b5f21cae567e2eddcf8d66/cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9", + "url": "https://files.pythonhosted.org/packages/c4/01/f5116266fe80c04d4d1cc96c3d355606943f9fb604a810e0b02228a0ce19/cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614", + "url": "https://files.pythonhosted.org/packages/c9/7c/43d81bdd5a915923c3bad5bb4bff401ea00ccc8e28433fb6083d2e3bf58e/cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743", + "url": "https://files.pythonhosted.org/packages/eb/de/4f644fc78a1144a897e1f908abfb2058f7be05a8e8e4fe90b7f41e9de36b/cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896", + "url": "https://files.pythonhosted.org/packages/f0/31/a6503a5c4874fb4d4c2053f73f09a957cb427b6943fab5a43b8e156df397/cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + } + ], + "project_name": "cffi", + "requires_dists": [ + "pycparser" + ], + "requires_python": ">=3.8", + "version": "1.16.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc", + "url": "https://files.pythonhosted.org/packages/28/76/e6222113b83e3622caa4bb41032d0b1bf785250607392e1b778aca0b8a7d/charset_normalizer-3.3.2-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e", + "url": "https://files.pythonhosted.org/packages/05/8c/eb854996d5fef5e4f33ad56927ad053d04dc820e4a3d39023f35cad72617/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3", + "url": "https://files.pythonhosted.org/packages/2b/61/095a0aa1a84d1481998b534177c8566fdc50bb1233ea9a0478cd3cc075bd/charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl" + }, + { + "algorithm": "sha256", + "hash": "beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c", + "url": "https://files.pythonhosted.org/packages/33/c3/3b96a435c5109dd5b6adc8a59ba1d678b302a97938f032e3770cc84cd354/charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537", + "url": "https://files.pythonhosted.org/packages/3f/ba/3f5e7be00b215fa10e13d64b1f6237eb6ebea66676a41b2bcdd09fe74323/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12", + "url": "https://files.pythonhosted.org/packages/43/05/3bf613e719efe68fb3a77f9c536a389f35b95d75424b96b426a47a45ef1d/charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03", + "url": "https://files.pythonhosted.org/packages/46/6a/d5c26c41c49b546860cc1acabdddf48b0b3fb2685f4f5617ac59261b44ae/charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f", + "url": "https://files.pythonhosted.org/packages/58/78/a0bc646900994df12e07b4ae5c713f2b3e5998f58b9d3720cce2aa45652f/charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5", + "url": "https://files.pythonhosted.org/packages/63/09/c1bc53dab74b1816a00d8d030de5bf98f724c52c1635e07681d312f20be8/charset-normalizer-3.3.2.tar.gz" + }, + { + "algorithm": "sha256", + "hash": "fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519", + "url": "https://files.pythonhosted.org/packages/a8/31/47d018ef89f95b8aded95c589a77c072c55e94b50a41aa99c0a2008a45a4/charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d", + "url": "https://files.pythonhosted.org/packages/b8/60/e2f67915a51be59d4539ed189eb0a2b0d292bf79270410746becb32bc2c3/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027", + "url": "https://files.pythonhosted.org/packages/cc/94/f7cf5e5134175de79ad2059edf2adce18e0685ebdb9227ff0139975d0e93/charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5", + "url": "https://files.pythonhosted.org/packages/da/f1/3702ba2a7470666a62fd81c58a4c40be00670e5006a67f4d626e57f013ae/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269", + "url": "https://files.pythonhosted.org/packages/eb/5c/97d97248af4920bc68687d9c3b3c0f47c910e21a8ff80af4565a576bd2f0/charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6", + "url": "https://files.pythonhosted.org/packages/f6/93/bb6cbeec3bf9da9b2eba458c15966658d1daa8b982c642f81c93ad9b40e1/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl" + } + ], + "project_name": "charset-normalizer", + "requires_dists": [], + "requires_python": ">=3.7.0", + "version": "3.3.2" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", + "url": "https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de", + "url": "https://files.pythonhosted.org/packages/96/d3/f04c7bfcf5c1862a2a5b845c6b2b360488cf47af55dfa79c98f6a6bf98b5/click-8.1.7.tar.gz" + } + ], + "project_name": "click", + "requires_dists": [ + "colorama; platform_system == \"Windows\"", + "importlib-metadata; python_version < \"3.8\"" + ], + "requires_python": ">=3.7", + "version": "8.1.7" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "246ee7d0c295602a036e86369c77fecda4ab17b506496730f2f576d9016fd9c7", + "url": "https://files.pythonhosted.org/packages/96/43/dae06432d0c4b1dc9e9149ad37b4ca8384cf6eb7700cd9215b177b914f0a/cloudpickle-3.0.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "996d9a482c6fb4f33c1a35335cf8afd065d2a56e973270364840712d9131a882", + "url": "https://files.pythonhosted.org/packages/c8/72/42a6570fc61b1f8913529728ad314c7cf5961540728dcad22c33fb2db6b6/cloudpickle-3.0.0.tar.gz" + } + ], + "project_name": "cloudpickle", + "requires_dists": [], + "requires_python": ">=3.8", + "version": "3.0.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "79b356f3dd5b26f3ad23b35c75dbdaf1f9e2450b6bcefc6d0825ea0aa3f86ca5", + "url": "https://files.pythonhosted.org/packages/7a/c3/a5b06a07b68795018f47b5d69b523ad473ac9ee66be3c22c4d3e5eadd91e/coverage-7.5.4-pp38.pp39.pp310-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "6cfb5a4f556bb51aba274588200a46e4dd6b505fb1a5f8c5ae408222eb416f99", + "url": "https://files.pythonhosted.org/packages/38/3d/9f9469f445789a170cb5bef3ad02ae9084ddd689f938797aa8ee793db404/coverage-7.5.4-cp310-cp310-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "5cd64adedf3be66f8ccee418473c2916492d53cbafbfcff851cbec5a8454b136", + "url": "https://files.pythonhosted.org/packages/44/ab/1ce64d6d01486b7e307ce0b25565b2337b9883d409fdb7655c94b0e80ae7/coverage-7.5.4-cp310-cp310-musllinux_1_2_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "2214ee920787d85db1b6a0bd9da5f8503ccc8fcd5814d90796c2f2493a2f4d2e", + "url": "https://files.pythonhosted.org/packages/99/49/0e8c8e8f9f7ea87ed94ddce70cdfe49224b13857ef3cbdb65a5eb29bba6f/coverage-7.5.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "b385d49609f8e9efc885790a5a0e89f2e3ae042cdf12958b6034cc442de428d3", + "url": "https://files.pythonhosted.org/packages/a2/78/d457df19baefbe3d38ef63cddfbda0f443d6546f3f56fa95cd884d612e8e/coverage-7.5.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "1137f46adb28e3813dec8c01fefadcb8c614f33576f672962e323b5128d9a68d", + "url": "https://files.pythonhosted.org/packages/a9/9a/79381c5dbc118b5cc0aac637352f65078766527ab0d23031d5421f2fb144/coverage-7.5.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "2174e7c23e0a454ffe12267a10732c273243b4f2d50d07544a91198f05c48f47", + "url": "https://files.pythonhosted.org/packages/b0/d8/b7bde23a5e94cfc1a45effad2dd4c45dc111c515f71c522986dd8ded31a1/coverage-7.5.4-cp310-cp310-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "a44963520b069e12789d0faea4e9fdb1e410cdc4aab89d94f7f55cbb7fef0353", + "url": "https://files.pythonhosted.org/packages/ef/05/31553dc038667012853d0a248b57987d8d70b2d67ea885605f87bcb1baba/coverage-7.5.4.tar.gz" + }, + { + "algorithm": "sha256", + "hash": "b4a474f799456e0eb46d78ab07303286a84a3140e9700b9e154cfebc8f527016", + "url": "https://files.pythonhosted.org/packages/ef/48/fccbf1b4ab5943e1b5bf5e29892531341b4c2731c448c6970349b0bb2f3b/coverage-7.5.4-cp310-cp310-musllinux_1_2_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "e564c2cf45d2f44a9da56f4e3a26b2236504a496eb4cb0ca7221cd4cc7a9aca9", + "url": "https://files.pythonhosted.org/packages/fd/a2/4db4030508e3f7267151155e2221487e1515eda167262d0aa88bce8d4b57/coverage-7.5.4-cp310-cp310-musllinux_1_2_x86_64.whl" + } + ], + "project_name": "coverage", + "requires_dists": [ + "tomli; python_full_version <= \"3.11.0a6\" and extra == \"toml\"" + ], + "requires_python": ">=3.8", + "version": "7.5.4" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "dc7051a0db5f2bd48665a990d3ec1cc305a466a77358ca4492826f41f283601e", + "url": "https://files.pythonhosted.org/packages/6b/b0/e595ce2a2527e169c3bcd6c33d2473c1918e0b7f6826a043ca1245dd4e5b/crcmod-1.7.tar.gz" + } + ], + "project_name": "crcmod", + "requires_dists": [], + "requires_python": null, + "version": "1.7" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "c9bb2ae11bfbab395bdd072985abde58ea9860ed84e59dbc0463a5d0159f5b71", + "url": "https://files.pythonhosted.org/packages/c1/e2/60b05e720766e185ef097d07068bd878a51d613ef91e4c241750f9c9192b/cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "6b7c4f03ce01afd3b76cf69a5455caa9cfa3de8c8f493e0d3ab7d20611c8dae9", + "url": "https://files.pythonhosted.org/packages/07/40/d6f6819c62e808ea74639c3c640f7edd636b86cce62cb14943996a15df92/cryptography-42.0.8-cp37-abi3-manylinux_2_28_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "cafb92b2bc622cd1aa6a1dce4b93307792633f4c5fe1f46c6b97cf67073ec961", + "url": "https://files.pythonhosted.org/packages/0f/38/85c74d0ac4c540780e072b1e6f148ecb718418c1062edcb20d22f3ec5bbb/cryptography-42.0.8-cp39-abi3-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "ad803773e9df0b92e0a817d22fd8a3675493f690b96130a5e24f1b8fabbea9c7", + "url": "https://files.pythonhosted.org/packages/25/c9/86f04e150c5d5d5e4a731a2c1e0e43da84d901f388e3fea3d5de98d689a7/cryptography-42.0.8-cp37-abi3-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "e599b53fd95357d92304510fb7bda8523ed1f79ca98dce2f43c115950aa78801", + "url": "https://files.pythonhosted.org/packages/35/66/2d87e9ca95c82c7ee5f2c09716fc4c4242c1ae6647b9bd27e55e920e9f10/cryptography-42.0.8-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "c4783183f7cb757b73b2ae9aed6599b96338eb957233c58ca8f49a49cc32fd5e", + "url": "https://files.pythonhosted.org/packages/43/c2/4a3eef67e009a522711ebd8ac89424c3a7fe591ece7035d964419ad52a1d/cryptography-42.0.8-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "a0608251135d0e03111152e41f0cc2392d1e74e35703960d4190b2e0f4ca9c70", + "url": "https://files.pythonhosted.org/packages/49/1c/9f6d13cc8041c05eebff1154e4e71bedd1db8e174fff999054435994187a/cryptography-42.0.8-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "2f66d9cd9147ee495a8374a45ca445819f8929a3efcd2e3df6428e46c3cbb10b", + "url": "https://files.pythonhosted.org/packages/53/c2/903014dafb7271fb148887d4355b2e90319cad6e810663be622b0c933fc9/cryptography-42.0.8-cp37-abi3-musllinux_1_2_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "2346b911eb349ab547076f47f2e035fc8ff2c02380a7cbbf8d87114fa0f1c583", + "url": "https://files.pythonhosted.org/packages/5c/46/de71d48abf2b6d3c808f4fbb0f4dc44a4e72786be23df0541aa2a3f6fd7e/cryptography-42.0.8-cp37-abi3-musllinux_1_1_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "e3ec3672626e1b9e55afd0df6d774ff0e953452886e06e0f1eb7eb0c832e8902", + "url": "https://files.pythonhosted.org/packages/5d/32/f6326c70a9f0f258a201d3b2632bca586ea24d214cec3cf36e374040e273/cryptography-42.0.8-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "dc0fdf6787f37b1c6b08e6dfc892d9d068b5bdb671198c72072828b80bd5fe4c", + "url": "https://files.pythonhosted.org/packages/5f/f9/c3d4f19b82bdb25a3d857fe96e7e571c981810e47e3f299cc13ac429066a/cryptography-42.0.8-cp39-abi3-manylinux_2_28_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "dea567d1b0e8bc5764b9443858b673b734100c2871dc93163f58c46a97a83d28", + "url": "https://files.pythonhosted.org/packages/60/12/f064af29190cdb1d38fe07f3db6126091639e1dece7ec77c4ff037d49193/cryptography-42.0.8-cp39-abi3-macosx_10_12_universal2.whl" + }, + { + "algorithm": "sha256", + "hash": "31f721658a29331f895a5a54e7e82075554ccfb8b163a18719d342f5ffe5ecb1", + "url": "https://files.pythonhosted.org/packages/89/f4/a8b982e88eb5350407ebdbf4717b55043271d878705329e107f4783555f2/cryptography-42.0.8-cp39-abi3-musllinux_1_2_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "8d09d05439ce7baa8e9e95b07ec5b6c886f548deb7e0f69ef25f64b3bce842f2", + "url": "https://files.pythonhosted.org/packages/93/a7/1498799a2ea06148463a9a2c10ab2f6a921a74fb19e231b27dc412a748e2/cryptography-42.0.8.tar.gz" + }, + { + "algorithm": "sha256", + "hash": "d45b940883a03e19e944456a558b67a41160e367a719833c53de6911cabba2b7", + "url": "https://files.pythonhosted.org/packages/95/26/82d704d988a193cbdc69ac3b41c687c36eaed1642cce52530ad810c35645/cryptography-42.0.8-cp37-abi3-musllinux_1_2_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "fff12c88a672ab9c9c1cf7b0c80e3ad9e2ebd9d828d955c126be4fd3e5578c9e", + "url": "https://files.pythonhosted.org/packages/a2/68/e16751f6b859bc120f53fddbf3ebada5c34f0e9689d8af32884d8b2e4b4c/cryptography-42.0.8-cp39-abi3-musllinux_1_1_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "ba4f0a211697362e89ad822e667d8d340b4d8d55fae72cdd619389fb5912eefe", + "url": "https://files.pythonhosted.org/packages/a3/fe/1e21699f0a7904e8a30d4fc6db262958f1edf5e505a02e7d97a5b419e482/cryptography-42.0.8-pp310-pypy310_pp73-macosx_10_12_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "5226d5d21ab681f432a9c1cf8b658c0cb02533eece706b155e5fbd8a0cdd3949", + "url": "https://files.pythonhosted.org/packages/c2/de/8083fa2e68d403553a01a9323f4f8b9d7ffed09928ba25635c29fb28c1e7/cryptography-42.0.8-cp37-abi3-manylinux_2_28_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "81884c4d096c272f00aeb1f11cf62ccd39763581645b0812e99a91505fa48e0c", + "url": "https://files.pythonhosted.org/packages/d5/f3/61b398b5ec61f4b6ffbf746227df7ebb421696458d9625d634043f236a13/cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "81d8a521705787afe7a18d5bfb47ea9d9cc068206270aad0b96a725022e18d2e", + "url": "https://files.pythonhosted.org/packages/f9/8b/1b929ba8139430e09e140e6939c2b29c18df1f2fc2149e41bdbdcdaf5d1f/cryptography-42.0.8-cp37-abi3-macosx_10_12_universal2.whl" + }, + { + "algorithm": "sha256", + "hash": "961e61cefdcb06e0c6d7e3a1b22ebe8b996eb2bf50614e89384be54c48c6b63d", + "url": "https://files.pythonhosted.org/packages/fa/5d/31d833daa800e4fab33209843095df7adb4a78ea536929145534cbc15026/cryptography-42.0.8-cp37-abi3-macosx_10_12_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "9c0c1716c8447ee7dbf08d6db2e5c41c688544c61074b54fc4564196f55c25a7", + "url": "https://files.pythonhosted.org/packages/fa/e2/b7e6e8c261536c489d9cf908769880d94bd5d9a187e166b0dc838d2e6a56/cryptography-42.0.8-cp39-abi3-manylinux_2_28_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "b297f90c5723d04bcc8265fc2a0f86d4ea2e0f7ab4b6994459548d3a6b992a14", + "url": "https://files.pythonhosted.org/packages/fd/2b/be327b580645927bb1a1f32d5a175b897a9b956bc085b095e15c40bac9ed/cryptography-42.0.8-cp39-abi3-musllinux_1_2_x86_64.whl" + } + ], + "project_name": "cryptography", + "requires_dists": [ + "bcrypt>=3.1.5; extra == \"ssh\"", + "build; extra == \"sdist\"", + "certifi; extra == \"test\"", + "cffi>=1.12; platform_python_implementation != \"PyPy\"", + "check-sdist; extra == \"pep8test\"", + "click; extra == \"pep8test\"", + "mypy; extra == \"pep8test\"", + "nox; extra == \"nox\"", + "pretend; extra == \"test\"", + "pyenchant>=1.6.11; extra == \"docstest\"", + "pytest-benchmark; extra == \"test\"", + "pytest-cov; extra == \"test\"", + "pytest-randomly; extra == \"test-randomorder\"", + "pytest-xdist; extra == \"test\"", + "pytest>=6.2.0; extra == \"test\"", + "readme-renderer; extra == \"docstest\"", + "ruff; extra == \"pep8test\"", + "sphinx-rtd-theme>=1.1.1; extra == \"docs\"", + "sphinx>=5.3.0; extra == \"docs\"", + "sphinxcontrib-spelling>=4.0.1; extra == \"docstest\"" + ], + "requires_python": ">=3.7", + "version": "42.0.8" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "7266112468627868005106ec19cd0d722702d2b7d5912a28e19b826c3d37af49", + "url": "https://files.pythonhosted.org/packages/f5/e8/f6bd1eee09314e7e6dee49cbe2c5e22314ccdb38db16c9fc72d2fa80d054/docker_pycreds-0.4.0-py2.py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "6ce3270bcaf404cc4c3e27e4b6c70d3521deae82fb508767870fdbf772d584d4", + "url": "https://files.pythonhosted.org/packages/c5/e6/d1f6c00b7221e2d7c4b470132c931325c8b22c51ca62417e300f5ce16009/docker-pycreds-0.4.0.tar.gz" + } + ], + "project_name": "docker-pycreds", + "requires_dists": [ + "six>=1.4.0" + ], + "requires_python": null, + "version": "0.4.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad", + "url": "https://files.pythonhosted.org/packages/01/90/79fe92dd413a9cab314ef5c591b5aa9b9ba787ae4cadab75055b0ae00b33/exceptiongroup-1.2.1-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16", + "url": "https://files.pythonhosted.org/packages/a0/65/d66b7fbaef021b3c954b3bbb196d21d8a4b97918ea524f82cfae474215af/exceptiongroup-1.2.1.tar.gz" + } + ], + "project_name": "exceptiongroup", + "requires_dists": [ + "pytest>=6; extra == \"test\"" + ], + "requires_python": ">=3.7", + "version": "1.2.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc", + "url": "https://files.pythonhosted.org/packages/43/09/2aea36ff60d16dd8879bdb2f5b3ee0ba8d08cbbdcdfe870e695ce3784385/execnet-2.1.1-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3", + "url": "https://files.pythonhosted.org/packages/bb/ff/b4c0dc78fbe20c3e59c0c7334de0c27eb4001a2b2017999af398bf730817/execnet-2.1.1.tar.gz" + } + ], + "project_name": "execnet", + "requires_dists": [ + "hatch; extra == \"testing\"", + "pre-commit; extra == \"testing\"", + "pytest; extra == \"testing\"", + "tox; extra == \"testing\"" + ], + "requires_python": ">=3.8", + "version": "2.1.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "14de931035a41961f7c056361dc7f980762a143d05791ef5794a751a2caf05ae", + "url": "https://files.pythonhosted.org/packages/05/2c/ffc08c54c05cdce6fbed2aeebc46348dbe180c6d2c541c7af7ba0aa5f5f8/Farama_Notifications-0.0.4-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "13fceff2d14314cf80703c8266462ebf3733c7d165336eee998fc58e545efd18", + "url": "https://files.pythonhosted.org/packages/2e/2c/8384832b7a6b1fd6ba95bbdcae26e7137bb3eedc955c42fd5cdcc086cfbf/Farama-Notifications-0.0.4.tar.gz" + } + ], + "project_name": "farama-notifications", + "requires_dists": [], + "requires_python": null, + "version": "0.0.4" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "758819cb5d94cdedf4e836988b74de396ceacb8e2794d21f82d131fd9ee77237", + "url": "https://files.pythonhosted.org/packages/61/bf/fd60001b3abc5222d8eaa4a204cd8c0ae78e75adc688f33ce4bf25b7fafa/fasteners-0.19-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "b4f37c3ac52d8a445af3a66bce57b33b5e90b97c696b7b984f530cf8f0ded09c", + "url": "https://files.pythonhosted.org/packages/5f/d4/e834d929be54bfadb1f3e3b931c38e956aaa3b235a46a3c764c26c774902/fasteners-0.19.tar.gz" + } + ], + "project_name": "fasteners", + "requires_dists": [], + "requires_python": ">=3.6", + "version": "0.19" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "04ced3e6a46b4cfffe20f9ae482818e34eba9b5fb0ce4056e4cc9b6e212d09b7", + "url": "https://files.pythonhosted.org/packages/83/10/466fe96dae1bff622021ee687f68e5524d6392b0a2f80d05001cd3a451ba/frozenlist-1.4.1-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "5c849d495bf5154cd8da18a9eb15db127d4dba2968d88831aff6f0331ea9bd4c", + "url": "https://files.pythonhosted.org/packages/36/ce/dc6f29e0352fa34ebe45421960c8e7352ca63b31630a576e8ffb381e9c08/frozenlist-1.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "9750cc7fe1ae3b1611bb8cfc3f9ec11d532244235d75901fb6b8e42ce9229dfe", + "url": "https://files.pythonhosted.org/packages/51/47/159ac53faf8a11ae5ee8bb9db10327575557504e549cfd76f447b969aa91/frozenlist-1.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "27657df69e8801be6c3638054e202a135c7f299267f1a55ed3a598934f6c0d75", + "url": "https://files.pythonhosted.org/packages/53/82/274e19f122e124aee6d113188615f63b0736b4242a875f482a81f91e07e2/frozenlist-1.4.1-cp310-cp310-musllinux_1_1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "4f57dab5fe3407b6c0c1cc907ac98e8a189f9e418f3b6e54d65a718aaafe3950", + "url": "https://files.pythonhosted.org/packages/6e/4f/b8a5a2f10c4a58c52a52a40cf6cf1ffcdbf3a3b64f276f41dab989bf3ab5/frozenlist-1.4.1-cp310-cp310-musllinux_1_1_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "f9aa1878d1083b276b0196f2dfbe00c9b7e752475ed3b682025ff20c1c1f51ac", + "url": "https://files.pythonhosted.org/packages/7a/35/1328c7b0f780d34f8afc1d87ebdc2bb065a123b24766a0b475f0d67da637/frozenlist-1.4.1-cp310-cp310-macosx_10_9_universal2.whl" + }, + { + "algorithm": "sha256", + "hash": "0633c8d5337cb5c77acbccc6357ac49a1770b8c487e5b3505c57b949b4b82e98", + "url": "https://files.pythonhosted.org/packages/97/94/a1305fa4716726ae0abf3b1069c2d922fcfd442538cb850f1be543f58766/frozenlist-1.4.1-cp310-cp310-musllinux_1_1_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "74fb4bee6880b529a0c6560885fce4dc95936920f9f20f53d99a213f7bf66776", + "url": "https://files.pythonhosted.org/packages/ae/83/bcdaa437a9bd693ba658a0310f8cdccff26bd78e45fccf8e49897904a5cd/frozenlist-1.4.1-cp310-cp310-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "e02a0e11cf6597299b9f3bbd3f93d79217cb90cfd1411aec33848b13f5c656cc", + "url": "https://files.pythonhosted.org/packages/b0/2c/7be3bdc59dbae444864dbd9cde82790314390ec54636baf6b9ce212627ad/frozenlist-1.4.1-cp310-cp310-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "f9a3ea26252bd92f570600098783d1371354d89d5f6b7dfd87359d669f2109b5", + "url": "https://files.pythonhosted.org/packages/b8/28/899931015b8cffbe155392fe9ca663f981a17e1adc69589ee0e1e7cdc9a2/frozenlist-1.4.1-cp310-cp310-musllinux_1_1_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b", + "url": "https://files.pythonhosted.org/packages/cf/3d/2102257e7acad73efc4a0c306ad3953f68c504c16982bbdfee3ad75d8085/frozenlist-1.4.1.tar.gz" + }, + { + "algorithm": "sha256", + "hash": "590344787a90ae57d62511dd7c736ed56b428f04cd8c161fcc5e7232c130c69a", + "url": "https://files.pythonhosted.org/packages/d4/e9/759043ab7d169b74fe05ebfbfa9ee5c881c303ebc838e308346204309cd0/frozenlist-1.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "a9b2de4cf0cdd5bd2dee4c4f63a653c61d2408055ab77b151c1957f221cabf2a", + "url": "https://files.pythonhosted.org/packages/ec/25/0c87df2e53c0c5d90f7517ca0ff7aca78d050a8ec4d32c4278e8c0e52e51/frozenlist-1.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "29acab3f66f0f24674b7dc4736477bcd4bc3ad4b896f5f45379a67bce8b96868", + "url": "https://files.pythonhosted.org/packages/f4/d6/ca016b0adcf8327714ccef969740688808c86e0287bf3a639ff582f24e82/frozenlist-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "068b63f23b17df8569b7fdca5517edef76171cf3897eb68beb01341131fbd2ad", + "url": "https://files.pythonhosted.org/packages/f8/ce/b9de7dc61e753dc318cf0de862181b484178210c5361eae6eaf06792264d/frozenlist-1.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + } + ], + "project_name": "frozenlist", + "requires_dists": [], + "requires_python": ">=3.8", + "version": "1.4.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "a46817f3abed2bc4f6b4b12b0de7c8bf5ff5f1822dc03c45fa1ae6ed7a455843", + "url": "https://files.pythonhosted.org/packages/8d/47/2106398c28d6f4346b6ec84cb092bb00b4d50a3b03653328d53e4ce1ac30/gcs-oauth2-boto-plugin-3.2.tar.gz" + } + ], + "project_name": "gcs-oauth2-boto-plugin", + "requires_dists": [ + "boto>=2.29.1", + "freezegun; extra == \"dev\"", + "google-auth-httplib2>=0.2.0", + "google-auth==2.17.0", + "google-reauth>=0.1.0", + "httplib2>=0.18", + "mock; python_version < \"3.3\" and extra == \"dev\"", + "oauth2client>=2.2.0", + "pyOpenSSL>=0.13", + "retry-decorator>=1.0.0", + "rsa==4.7.2", + "six>=1.12.0" + ], + "requires_python": null, + "version": "3.2" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "81a3407ddd2ee8df444cbacea00e2d038e40150acfa3001696fe0dcf1d3adfa4", + "url": "https://files.pythonhosted.org/packages/fd/5b/8f0c4a5bb9fd491c277c21eff7ccae71b47d43c4446c9d0c6cff2fe8c2c4/gitdb-4.0.11-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "bf5421126136d6d0af55bc1e7c1af1c397a34f5b7bd79e776cd3e89785c2b04b", + "url": "https://files.pythonhosted.org/packages/19/0d/bbb5b5ee188dec84647a4664f3e11b06ade2bde568dbd489d9d64adef8ed/gitdb-4.0.11.tar.gz" + } + ], + "project_name": "gitdb", + "requires_dists": [ + "smmap<6,>=3.0.1" + ], + "requires_python": ">=3.7", + "version": "4.0.11" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "eec7ec56b92aad751f9912a73404bc02ba212a23adb2c7098ee668417051a1ff", + "url": "https://files.pythonhosted.org/packages/e9/bd/cc3a402a6439c15c3d4294333e13042b915bbeab54edc457c723931fed3f/GitPython-3.1.43-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "35f314a9f878467f5453cc1fee295c3e18e52f1b99f10f6cf5b1682e968a9e7c", + "url": "https://files.pythonhosted.org/packages/b6/a1/106fd9fa2dd989b6fb36e5893961f82992cf676381707253e0bf93eb1662/GitPython-3.1.43.tar.gz" + } + ], + "project_name": "gitpython", + "requires_dists": [ + "coverage[toml]; extra == \"test\"", + "ddt!=1.4.3,>=1.1.1; extra == \"test\"", + "gitdb<5,>=4.0.1", + "mock; python_version < \"3.8\" and extra == \"test\"", + "mypy; extra == \"test\"", + "pre-commit; extra == \"test\"", + "pytest-cov; extra == \"test\"", + "pytest-instafail; extra == \"test\"", + "pytest-mock; extra == \"test\"", + "pytest-sugar; extra == \"test\"", + "pytest>=7.3.1; extra == \"test\"", + "sphinx-autodoc-typehints; extra == \"doc\"", + "sphinx-rtd-theme; extra == \"doc\"", + "sphinx==4.3.2; extra == \"doc\"", + "sphinxcontrib-applehelp<=1.0.4,>=1.0.2; extra == \"doc\"", + "sphinxcontrib-devhelp==1.0.2; extra == \"doc\"", + "sphinxcontrib-htmlhelp<=2.0.1,>=2.0.0; extra == \"doc\"", + "sphinxcontrib-qthelp==1.0.3; extra == \"doc\"", + "sphinxcontrib-serializinghtml==1.1.5; extra == \"doc\"", + "typing-extensions; python_version < \"3.11\" and extra == \"test\"", + "typing-extensions>=3.7.4.3; python_version < \"3.8\"" + ], + "requires_python": ">=3.7", + "version": "3.1.43" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "b78f74116558e0476e19501b5b4b2ac7c93261a69c5449c861ea95cbc853c688", + "url": "https://files.pythonhosted.org/packages/5e/cb/cb0311f2ec371c83d6510847476c665edc9cc97564a51923557bc8f0b680/google_apitools-0.5.32-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "c3763e52289f61e21c41d5531e20fbda9cc8484a088b8686fd460770db8bad13", + "url": "https://files.pythonhosted.org/packages/dc/eb/c26c36463a769a3a9f08847b9bf218cb629ca91877a911bbd6dcf37d9e62/google-apitools-0.5.32.tar.gz" + } + ], + "project_name": "google-apitools", + "requires_dists": [ + "fasteners>=0.14", + "httplib2>=0.8", + "mock>=1.0.1; extra == \"testing\"", + "oauth2client>=1.4.12", + "python-gflags>=3.0.6; extra == \"cli\"", + "six>=1.12.0" + ], + "requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7", + "version": "0.5.32" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "45ba9b4b3e49406de3c5451697820694b2f6ce8a6b75bb187852fdae231dab94", + "url": "https://files.pythonhosted.org/packages/b9/e6/d64f9f31c78fc405e82fdadc4e49b42a642cd3927a60b2fd063acd468a02/google_auth-2.17.0-py2.py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "f51d26ebb3e5d723b9a7dbd310b6c88654ef1ad1fc35750d1fdba48ca4d82f52", + "url": "https://files.pythonhosted.org/packages/e7/7a/85f8b331e6469d7737f083f6d899c8583c3715bafc3b034ad8f3b4afe457/google-auth-2.17.0.tar.gz" + } + ], + "project_name": "google-auth", + "requires_dists": [ + "aiohttp<4.0.0dev,>=3.6.2; python_version >= \"3.6\" and extra == \"aiohttp\"", + "cachetools<6.0,>=2.0.0", + "cryptography==36.0.2; extra == \"enterprise-cert\"", + "cryptography>=38.0.3; extra == \"pyopenssl\"", + "enum34>=1.1.10; python_version < \"3.4\"", + "pyasn1-modules>=0.2.1", + "pyopenssl==22.0.0; extra == \"enterprise-cert\"", + "pyopenssl>=20.0.0; extra == \"pyopenssl\"", + "pyu2f>=0.1.5; extra == \"reauth\"", + "requests<3.0.0dev,>=2.20.0; extra == \"aiohttp\"", + "requests<3.0.0dev,>=2.20.0; extra == \"requests\"", + "rsa<4.6; python_version < \"3.6\"", + "rsa<5,>=3.1.4; python_version >= \"3.6\"", + "six>=1.9.0" + ], + "requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7", + "version": "2.17.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "b65a0a2123300dd71281a7bf6e64d65a0759287df52729bdd1ae2e47dc311a3d", + "url": "https://files.pythonhosted.org/packages/be/8a/fe34d2f3f9470a27b01c9e76226965863f153d5fbe276f83608562e49c04/google_auth_httplib2-0.2.0-py2.py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "38aa7badf48f974f1eb9861794e9c0cb2a0511a4ec0679b1f886d108f5640e05", + "url": "https://files.pythonhosted.org/packages/56/be/217a598a818567b28e859ff087f347475c807a5649296fb5a817c58dacef/google-auth-httplib2-0.2.0.tar.gz" + } + ], + "project_name": "google-auth-httplib2", + "requires_dists": [ + "google-auth", + "httplib2>=0.19.0" + ], + "requires_python": null, + "version": "0.2.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "cb39074488d74c8853074dde47368bbf8f739d4a4338b89aab696c895b6d8368", + "url": "https://files.pythonhosted.org/packages/69/e1/67ffaa3a645b86318ce30717af7145070ebccec5eef5c623ae08b86129b8/google_reauth-0.1.1-py2.py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "f9f6852a55c2c5453d581cd01f3d1278e86147c03d008409800390a834235892", + "url": "https://files.pythonhosted.org/packages/7d/86/74242e08d24ec4c436b8325dabbd7c60422b4829dfb1ad6ec117bdebea76/google-reauth-0.1.1.tar.gz" + } + ], + "project_name": "google-reauth", + "requires_dists": [ + "oauth2client>=2.0.0; extra == \"oauth2client\"", + "pyu2f" + ], + "requires_python": null, + "version": "0.1.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "2981c7365a9353f9b5c864595c510c983251b1ab403e05b1ccc70a3d9541a73b", + "url": "https://files.pythonhosted.org/packages/3f/dd/f3ff5b2ae4f5675132a766ea883f5b3b631fa104ae5b146046e924a5839f/grpcio-1.64.1-cp310-cp310-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "0a2813093ddb27418a4c99f9b1c223fab0b053157176a64cc9db0f4557b69bd9", + "url": "https://files.pythonhosted.org/packages/1b/cb/6c3dada17b6360a235908bb5f9badff83e5ee60c0459ffcf97d3c1590646/grpcio-1.64.1-cp310-cp310-musllinux_1_1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "e7cd5c1325f6808b8ae31657d281aadb2a51ac11ab081ae335f4f7fc44c1721d", + "url": "https://files.pythonhosted.org/packages/5e/3b/459a477de3d899ffd4164d116a0a1db67468465ef5eaa81652f9319c27ab/grpcio-1.64.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "3b64ae304c175671efdaa7ec9ae2cc36996b681eb63ca39c464958396697daff", + "url": "https://files.pythonhosted.org/packages/62/46/2f080ed826b7641220ba1584960f90dd5354d71eb455a1e3e40c0614cd6b/grpcio-1.64.1-cp310-cp310-macosx_12_0_universal2.whl" + }, + { + "algorithm": "sha256", + "hash": "6c024ffc22d6dc59000faf8ad781696d81e8e38f4078cb0f2630b4a3cf231a90", + "url": "https://files.pythonhosted.org/packages/a3/0e/dd710c8033bc9d81c6f9a52e83e5b3ee803dab6c32d92b9abeee4141a860/grpcio-1.64.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "55697ecec192bc3f2f3cc13a295ab670f51de29884ca9ae6cd6247df55df2502", + "url": "https://files.pythonhosted.org/packages/b5/cb/4762ce391ff792f011dc288985b7754cc386bd5cd85e0c0a9486edfb323b/grpcio-1.64.1-cp310-cp310-linux_armv7l.whl" + }, + { + "algorithm": "sha256", + "hash": "bac71b4b28bc9af61efcdc7630b166440bbfbaa80940c9a697271b5e1dabbc61", + "url": "https://files.pythonhosted.org/packages/d8/af/14e95d1bf9e1fdbad332525653cff9fc9c9ed8f19854f8f69665862996b8/grpcio-1.64.1-cp310-cp310-manylinux_2_17_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "8d51dd1c59d5fa0f34266b80a3805ec29a1f26425c2a54736133f6d87fc4968a", + "url": "https://files.pythonhosted.org/packages/f5/9d/662a0c2181b2d7c1ec697ff06ec5ab9c37ed14e7f9e720e16f26443d233a/grpcio-1.64.1.tar.gz" + } + ], + "project_name": "grpcio", + "requires_dists": [ + "grpcio-tools>=1.64.1; extra == \"protobuf\"" + ], + "requires_python": ">=3.8", + "version": "1.64.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "ef29d47764d2a3c2436ce50c4e1827626725ba8dbfd3127b42a18641710e7d38", + "url": "https://files.pythonhosted.org/packages/11/a4/eb6bd231662c4a8c2b59576220c39d3db82cb294236d179869b759804b6f/gsutil-5.30.tar.gz" + } + ], + "project_name": "gsutil", + "requires_dists": [ + "argcomplete>=1.9.4", + "crcmod>=1.7", + "fasteners>=0.14.1", + "gcs-oauth2-boto-plugin>=3.2", + "google-apitools>=0.5.32", + "google-auth-httplib2>=0.2.0", + "google-auth[aiohttp]==2.17.0", + "google-reauth>=0.1.0", + "httplib2==0.20.4", + "mock<=3.0.5,>=2.0.0; python_version < \"3.3\"", + "monotonic>=1.4", + "pyOpenSSL>=0.13", + "retry-decorator>=1.0.0", + "six>=1.16.0" + ], + "requires_python": "!=2.*,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,<4", + "version": "5.30" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "61c3384b5575985bb7f85e43213bcb40f36fcdff388cae6bc229304c71f2843e", + "url": "https://files.pythonhosted.org/packages/a8/4d/3cbfd81ed84db450dbe73a89afcd8bc405273918415649ac6683356afe92/gymnasium-0.29.1-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "1a532752efcb7590478b1cc7aa04f608eb7a2fdad5570cd217b66b6a35274bb1", + "url": "https://files.pythonhosted.org/packages/0d/f8/5699ddb3e1c4f6d97b8930e573074849b921da8374fccd141f0f3a9bd713/gymnasium-0.29.1.tar.gz" + } + ], + "project_name": "gymnasium", + "requires_dists": [ + "autorom[accept-rom-license]~=0.4.2; extra == \"accept-rom-license\"", + "box2d-py==2.3.5; extra == \"all\"", + "box2d-py==2.3.5; extra == \"box2d\"", + "cloudpickle>=1.2.0", + "cython<3; extra == \"all\"", + "cython<3; extra == \"mujoco-py\"", + "cython<3; extra == \"mujoco-py\"", + "farama-notifications>=0.0.1", + "imageio>=2.14.1; extra == \"all\"", + "imageio>=2.14.1; extra == \"mujoco\"", + "importlib-metadata>=4.8.0; python_version < \"3.10\"", + "jax>=0.4.0; extra == \"all\"", + "jax>=0.4.0; extra == \"jax\"", + "jaxlib>=0.4.0; extra == \"all\"", + "jaxlib>=0.4.0; extra == \"jax\"", + "lz4>=3.1.0; extra == \"all\"", + "lz4>=3.1.0; extra == \"other\"", + "matplotlib>=3.0; extra == \"all\"", + "matplotlib>=3.0; extra == \"other\"", + "moviepy>=1.0.0; extra == \"all\"", + "moviepy>=1.0.0; extra == \"other\"", + "mujoco-py<2.2,>=2.1; extra == \"all\"", + "mujoco-py<2.2,>=2.1; extra == \"mujoco-py\"", + "mujoco-py<2.2,>=2.1; extra == \"mujoco-py\"", + "mujoco>=2.3.3; extra == \"all\"", + "mujoco>=2.3.3; extra == \"mujoco\"", + "numpy>=1.21.0", + "opencv-python>=3.0; extra == \"all\"", + "opencv-python>=3.0; extra == \"other\"", + "pygame>=2.1.3; extra == \"all\"", + "pygame>=2.1.3; extra == \"box2d\"", + "pygame>=2.1.3; extra == \"classic-control\"", + "pygame>=2.1.3; extra == \"classic-control\"", + "pygame>=2.1.3; extra == \"toy-text\"", + "pygame>=2.1.3; extra == \"toy-text\"", + "pytest==7.1.3; extra == \"testing\"", + "scipy>=1.7.3; extra == \"testing\"", + "shimmy[atari]<1.0,>=0.1.0; extra == \"all\"", + "shimmy[atari]<1.0,>=0.1.0; extra == \"atari\"", + "swig==4.*; extra == \"all\"", + "swig==4.*; extra == \"box2d\"", + "torch>=1.0.0; extra == \"all\"", + "torch>=1.0.0; extra == \"other\"", + "typing-extensions>=4.3.0" + ], + "requires_python": ">=3.8", + "version": "0.29.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "8b6a905cb1c79eefd03f8669fd993c36dc341f7c558f056cb5a33b5c2f458543", + "url": "https://files.pythonhosted.org/packages/59/0f/29725a9caf4b2618f524e0f28e2bda91aca8f880123ec77426ede6ea1ea4/httplib2-0.20.4-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "58a98e45b4b1a48273073f905d2961666ecf0fbac4250ea5b47aef259eb5c585", + "url": "https://files.pythonhosted.org/packages/9c/65/57ad964eb8d45cc3d1316ce5ada2632f74e35863a0e57a52398416a182a1/httplib2-0.20.4.tar.gz" + } + ], + "project_name": "httplib2", + "requires_dists": [ + "pyparsing!=3.0.0,!=3.0.1,!=3.0.2,!=3.0.3,<4,>=2.4.2; python_version > \"3.0\"", + "pyparsing<3,>=2.4.2; python_version < \"3.0\"" + ], + "requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7", + "version": "0.20.4" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0", + "url": "https://files.pythonhosted.org/packages/e5/3e/741d8c82801c347547f8a2a06aa57dbb1992be9e948df2ea0eda2c8b79e8/idna-3.7-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc", + "url": "https://files.pythonhosted.org/packages/21/ed/f86a79a07470cb07819390452f178b3bef1d375f2ec021ecfc709fc7cf07/idna-3.7.tar.gz" + } + ], + "project_name": "idna", + "requires_dists": [], + "requires_python": ">=3.5", + "version": "3.7" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374", + "url": "https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", + "url": "https://files.pythonhosted.org/packages/d7/4b/cbd8e699e64a6f16ca3a8220661b5f83792b3017d0f79807cb8708d33913/iniconfig-2.0.0.tar.gz" + } + ], + "project_name": "iniconfig", + "requires_dists": [], + "requires_python": ">=3.7", + "version": "2.0.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "48f276f4d8cfb8ce6527c8f79e2ee29708508bf4d40aa410fbc3b4ee832c850f", + "url": "https://files.pythonhosted.org/packages/fc/b3/0c0c994fe49cd661084f8d5dc06562af53818cc0abefaca35bdc894577c3/Markdown-3.6-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "ed4f41f6daecbeeb96e576ce414c41d2d876daa9a16cb35fa8ed8c2ddfad0224", + "url": "https://files.pythonhosted.org/packages/22/02/4785861427848cc11e452cc62bb541006a1087cf04a1de83aedd5530b948/Markdown-3.6.tar.gz" + } + ], + "project_name": "markdown", + "requires_dists": [ + "coverage; extra == \"testing\"", + "importlib-metadata>=4.4; python_version < \"3.10\"", + "mdx-gh-links>=0.2; extra == \"docs\"", + "mkdocs-gen-files; extra == \"docs\"", + "mkdocs-literate-nav; extra == \"docs\"", + "mkdocs-nature>=0.6; extra == \"docs\"", + "mkdocs-section-index; extra == \"docs\"", + "mkdocs>=1.5; extra == \"docs\"", + "mkdocstrings[python]; extra == \"docs\"", + "pyyaml; extra == \"testing\"" + ], + "requires_python": ">=3.8", + "version": "3.6" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd", + "url": "https://files.pythonhosted.org/packages/30/39/8d845dd7d0b0613d86e0ef89549bfb5f61ed781f59af45fc96496e897f3a/MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46", + "url": "https://files.pythonhosted.org/packages/0a/7b/85681ae3c33c385b10ac0f8dd025c30af83c78cec1c37a6aa3b55e67f5ec/MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900", + "url": "https://files.pythonhosted.org/packages/29/fe/a36ba8c7ca55621620b2d7c585313efd10729e63ef81e4e61f52330da781/MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff", + "url": "https://files.pythonhosted.org/packages/60/ae/9c60231cdfda003434e8bd27282b1f4e197ad5a710c14bee8bea8a9ca4f0/MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad", + "url": "https://files.pythonhosted.org/packages/65/dc/1510be4d179869f5dafe071aecb3f1f41b45d37c02329dfba01ff59e5ac5/MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5", + "url": "https://files.pythonhosted.org/packages/6a/4a/a4d49415e600bacae038c67f9fecc1d5433b9d3c71a4de6f33537b89654c/MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f", + "url": "https://files.pythonhosted.org/packages/7c/52/2b1b570f6b8b803cef5ac28fdf78c0da318916c7d2fe9402a84d591b394c/MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b", + "url": "https://files.pythonhosted.org/packages/87/5b/aae44c6655f3801e81aa3eef09dbbf012431987ba564d7231722f68df02d/MarkupSafe-2.1.5.tar.gz" + }, + { + "algorithm": "sha256", + "hash": "a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc", + "url": "https://files.pythonhosted.org/packages/e4/54/ad5eb37bf9d51800010a74e4665425831a9db4e7c4e0fde4352e391e808e/MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl" + } + ], + "project_name": "markupsafe", + "requires_dists": [], + "requires_python": ">=3.7", + "version": "2.1.5" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "68687e19a14f11f26d140dd5c86f3dba4bf5df58003000ed467e0e2a69bca96c", + "url": "https://files.pythonhosted.org/packages/9a/67/7e8406a29b6c45be7af7740456f7f37025f0506ae2e05fb9009a53946860/monotonic-1.6-py2.py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "3a55207bcfed53ddd5c5bae174524062935efed17792e9de2ad0205ce9ad63f7", + "url": "https://files.pythonhosted.org/packages/ea/ca/8e91948b782ddfbd194f323e7e7d9ba12e5877addf04fb2bf8fca38e86ac/monotonic-1.6.tar.gz" + } + ], + "project_name": "monotonic", + "requires_dists": [], + "requires_python": null, + "version": "1.6" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7", + "url": "https://files.pythonhosted.org/packages/fa/a2/17e1e23c6be0a916219c5292f509360c345b5fa6beeb50d743203c27532c/multidict-6.0.5-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "fe5d7785250541f7f5019ab9cba2c71169dc7d74d0f45253f8313f436458a4ef", + "url": "https://files.pythonhosted.org/packages/11/b7/bef33e84e3722bc42531af020d7ae8c31235ce8846bacaa852b6484cf868/multidict-6.0.5-cp310-cp310-musllinux_1_1_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "6939c95381e003f54cd4c5516740faba40cf5ad3eeff460c3ad1d3e0ea2549bf", + "url": "https://files.pythonhosted.org/packages/12/4d/99dfc36872dcc53956879f5da80a6505bbd29214cce90ce792a86e15fddf/multidict-6.0.5-cp310-cp310-musllinux_1_1_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "c1c1496e73051918fcd4f58ff2e0f2f3066d1c76a0c6aeffd9b45d53243702cc", + "url": "https://files.pythonhosted.org/packages/26/ce/f745a2d6104e56f7fa0d7d0756bb9ed27b771dd7b8d9d7348cd7f0f7b9de/multidict-6.0.5-cp310-cp310-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "21fd81c4ebdb4f214161be351eb5bcf385426bf023041da2fd9e60681f3cebae", + "url": "https://files.pythonhosted.org/packages/33/62/2c9085e571318d51212a6914566fe41dd0e33d7f268f7e2f23dcd3f06c56/multidict-6.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "7c6390cf87ff6234643428991b7359b5f59cc15155695deb4eda5c777d2b880f", + "url": "https://files.pythonhosted.org/packages/36/6d/d2f982fb485175727a193b4900b5f929d461e7aa87d6fb5a91a377fcc9c0/multidict-6.0.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "215ed703caf15f578dca76ee6f6b21b7603791ae090fbf1ef9d865571039ade5", + "url": "https://files.pythonhosted.org/packages/8d/ea/0230b6faa9a5bc10650fd50afcc4a86e6c37af2fe05bc679b74d79253732/multidict-6.0.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "411bf8515f3be9813d06004cac41ccf7d1cd46dfe233705933dd163b60e37600", + "url": "https://files.pythonhosted.org/packages/a4/eb/d8e7693c9064554a1585698d1902839440c6c695b0f53c9a8be5d9d4a3b8/multidict-6.0.5-cp310-cp310-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "228b644ae063c10e7f324ab1ab6b548bdf6f8b47f3ec234fef1093bc2735e5f9", + "url": "https://files.pythonhosted.org/packages/b7/36/48097b96135017ed1b806c5ea27b6cdc2ed3a6861c5372b793563206c586/multidict-6.0.5-cp310-cp310-macosx_10_9_universal2.whl" + }, + { + "algorithm": "sha256", + "hash": "766c8f7511df26d9f11cd3a8be623e59cca73d44643abab3f8c8c07620524e4a", + "url": "https://files.pythonhosted.org/packages/bc/84/9579004267e1cc5968ef2ef8718dab9d8950d99354d85b739dd67b09c273/multidict-6.0.5-cp310-cp310-musllinux_1_1_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "220dd781e3f7af2c2c1053da9fa96d9cf3072ca58f057f4c5adaaa1cab8fc442", + "url": "https://files.pythonhosted.org/packages/c2/5c/1e76b2c742cb9e0248d1e8c4ed420817879230c833fa27d890b5fd22290b/multidict-6.0.5-cp310-cp310-musllinux_1_1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "3cc2ad10255f903656017363cd59436f2111443a76f996584d1077e43ee51182", + "url": "https://files.pythonhosted.org/packages/ce/e2/88cdfeaf03eab3498f688a19b62ca704d371cd904cb74b682541ca7b20a7/multidict-6.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "896ebdcf62683551312c30e20614305f53125750803b614e9e6ce74a96232604", + "url": "https://files.pythonhosted.org/packages/d9/48/037440edb5d4a1c65e002925b2f24071d6c27754e6f4734f63037e3169d6/multidict-6.0.5-cp310-cp310-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "1d147090048129ce3c453f0292e7697d333db95e52616b3793922945804a433c", + "url": "https://files.pythonhosted.org/packages/f3/7d/fe7648d4b2f200f8854066ce6e56bf51889abfaf859814c62160dd0e32a9/multidict-6.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da", + "url": "https://files.pythonhosted.org/packages/f9/79/722ca999a3a09a63b35aac12ec27dfa8e5bb3a38b0f857f7a1a209a88836/multidict-6.0.5.tar.gz" + } + ], + "project_name": "multidict", + "requires_dists": [], + "requires_python": ">=3.7", + "version": "6.0.5" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "5e05b1c973a9f858c74367553e236f287e749465f773328c8ef31abe18f691e1", + "url": "https://files.pythonhosted.org/packages/e4/f3/679b3a042a127de0d7c84874913c3e23bb84646eb3bc6ecab3f8c872edc9/numpy-1.23.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "9c88793f78fca17da0145455f0d7826bcb9f37da4764af27ac945488116efe63", + "url": "https://files.pythonhosted.org/packages/0f/ae/dad4b8e7c65494cbbd1c063de114efaf9acd0f5f6171f044f0d4b6299787/numpy-1.23.5-cp310-cp310-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "1b1766d6f397c18153d40015ddfc79ddb715cabadc04d2d228d4e5a8bc4ded1a", + "url": "https://files.pythonhosted.org/packages/42/38/775b43da55fa7473015eddc9a819571517d9a271a9f8134f68fb9be2f212/numpy-1.23.5.tar.gz" + }, + { + "algorithm": "sha256", + "hash": "e9f4c4e51567b616be64e05d517c79a8a22f3606499941d97bb76f2ca59f982d", + "url": "https://files.pythonhosted.org/packages/4d/39/d33202cc56c21123a50c6d5e160d00c18ff685ab864dbd4bf80dd40a7af9/numpy-1.23.5-cp310-cp310-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "7903ba8ab592b82014713c491f6c5d3a1cde5b4a3bf116404e08f5b52f6daf43", + "url": "https://files.pythonhosted.org/packages/67/6b/d7c93d458d16464da9b3f560a20c363a19e242ebbb019bd1e1d797523851/numpy-1.23.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + } + ], + "project_name": "numpy", + "requires_dists": [], + "requires_python": ">=3.8", + "version": "1.23.5" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "b8a81cc5d60e2d364f0b1b98f958dbd472887acaf1a5b05e21c28c31a2d6d3ac", + "url": "https://files.pythonhosted.org/packages/95/a9/4f25a14d23f0786b64875b91784607c2277eff25d48f915e39ff0cff505a/oauth2client-4.1.3-py2.py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "d486741e451287f69568a4d26d70d9acd73a2bbfa275746c535b4209891cccc6", + "url": "https://files.pythonhosted.org/packages/a6/7b/17244b1083e8e604bf154cf9b716aecd6388acd656dd01893d0d244c94d9/oauth2client-4.1.3.tar.gz" + } + ], + "project_name": "oauth2client", + "requires_dists": [ + "httplib2>=0.9.1", + "pyasn1-modules>=0.0.5", + "pyasn1>=0.1.7", + "rsa>=3.1.4", + "six>=1.6.1" + ], + "requires_python": null, + "version": "4.1.3" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "6251910e554f811fdd070164b0bc76d76b067b95576cb9dad4d52ae64fe014b5", + "url": "https://files.pythonhosted.org/packages/c6/7e/5031717c0636e6074764a2f61a459a3ecd46c20d8b83a1f1cd2513a76160/onnx-1.16.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "15abf94a7868eed6db15a8b5024ba570c891cae77ca4d0e7258dabdad76980df", + "url": "https://files.pythonhosted.org/packages/36/16/07a819f1139a75e67b0b31e1474e5770d1e7c93b69744c6f7434415a9f65/onnx-1.16.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "8299193f0f2a3849bfc069641aa8e4f93696602da8d165632af8ee48ec7556b6", + "url": "https://files.pythonhosted.org/packages/74/be/242d02ebf7fe115bd695166eeea58b2206c9fa62de22cf9cbf8986fa8d27/onnx-1.16.1.tar.gz" + }, + { + "algorithm": "sha256", + "hash": "bb2d392e5b7060082c2fb38eb5c44f67eb34ff5f0681bd6f45beff9abc6f7094", + "url": "https://files.pythonhosted.org/packages/7d/bf/810fe3215735ff55a2b65d0430ba9782b70916d67554d9c2c58cebeace45/onnx-1.16.1-cp310-cp310-macosx_11_0_universal2.whl" + } + ], + "project_name": "onnx", + "requires_dists": [ + "Pillow; extra == \"reference\"", + "google-re2; extra == \"reference\"", + "numpy>=1.20", + "protobuf>=3.20.2" + ], + "requires_python": ">=3.8", + "version": "1.16.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "9ace140fc6d647fbe1c692bcb2abce768973491222c067c131d80957c595b71f", + "url": "https://files.pythonhosted.org/packages/3f/a4/d2537f47fd7fcfba966bd806e3ec18e7ee1681056d4b0a9c8d983983e4d5/opencv_python-4.10.0.84-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "72d234e4582e9658ffea8e9cae5b63d488ad06994ef12d81dc303b17472f3526", + "url": "https://files.pythonhosted.org/packages/4a/e7/b70a2d9ab205110d715906fc8ec83fbb00404aeb3a37a0654fdb68eb0c8c/opencv-python-4.10.0.84.tar.gz" + }, + { + "algorithm": "sha256", + "hash": "71e575744f1d23f79741450254660442785f45a0797212852ee5199ef12eed98", + "url": "https://files.pythonhosted.org/packages/64/4a/016cda9ad7cf18c58ba074628a4eaae8aa55f3fd06a266398cef8831a5b9/opencv_python-4.10.0.84-cp37-abi3-macosx_12_0_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "fc182f8f4cda51b45f01c64e4cbedfc2f00aff799debebc305d8d0210c43f251", + "url": "https://files.pythonhosted.org/packages/66/82/564168a349148298aca281e342551404ef5521f33fba17b388ead0a84dc5/opencv_python-4.10.0.84-cp37-abi3-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "09a332b50488e2dda866a6c5573ee192fe3583239fb26ff2f7f9ceb0bc119ea6", + "url": "https://files.pythonhosted.org/packages/81/e4/7a987ebecfe5ceaf32db413b67ff18eb3092c598408862fff4d7cc3fd19b/opencv_python-4.10.0.84-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + } + ], + "project_name": "opencv-python", + "requires_dists": [ + "numpy>=1.13.3; python_version < \"3.7\"", + "numpy>=1.17.0; python_version >= \"3.7\"", + "numpy>=1.17.3; python_version >= \"3.8\"", + "numpy>=1.19.3; python_version >= \"3.6\" and platform_system == \"Linux\" and platform_machine == \"aarch64\"", + "numpy>=1.19.3; python_version >= \"3.9\"", + "numpy>=1.21.0; python_version <= \"3.9\" and platform_system == \"Darwin\" and platform_machine == \"arm64\"", + "numpy>=1.21.2; python_version >= \"3.10\"", + "numpy>=1.21.4; python_version >= \"3.10\" and platform_system == \"Darwin\"", + "numpy>=1.23.5; python_version >= \"3.11\"", + "numpy>=1.26.0; python_version >= \"3.12\"" + ], + "requires_python": ">=3.6", + "version": "4.10.0.84" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124", + "url": "https://files.pythonhosted.org/packages/08/aa/cc0199a5f0ad350994d660967a8efb233fe0416e4639146c089643407ce6/packaging-24.1-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002", + "url": "https://files.pythonhosted.org/packages/51/65/50db4dda066951078f0a96cf12f4b9ada6e4b811516bf0262c0f4f7064d4/packaging-24.1.tar.gz" + } + ], + "project_name": "packaging", + "requires_dists": [], + "requires_python": ">=3.8", + "version": "24.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee", + "url": "https://files.pythonhosted.org/packages/68/13/2aa1f0e1364feb2c9ef45302f387ac0bd81484e9c9a4c5688a322fbdfd08/platformdirs-4.2.2-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3", + "url": "https://files.pythonhosted.org/packages/f5/52/0763d1d976d5c262df53ddda8d8d4719eedf9594d046f117c25a27261a19/platformdirs-4.2.2.tar.gz" + } + ], + "project_name": "platformdirs", + "requires_dists": [ + "appdirs==1.4.4; extra == \"test\"", + "covdefaults>=2.3; extra == \"test\"", + "furo>=2023.9.10; extra == \"docs\"", + "mypy>=1.8; extra == \"type\"", + "proselint>=0.13; extra == \"docs\"", + "pytest-cov>=4.1; extra == \"test\"", + "pytest-mock>=3.12; extra == \"test\"", + "pytest>=7.4.3; extra == \"test\"", + "sphinx-autodoc-typehints>=1.25.2; extra == \"docs\"", + "sphinx>=7.2.6; extra == \"docs\"" + ], + "requires_python": ">=3.8", + "version": "4.2.2" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", + "url": "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", + "url": "https://files.pythonhosted.org/packages/96/2d/02d4312c973c6050a18b314a5ad0b3210edb65a906f868e31c111dede4a6/pluggy-1.5.0.tar.gz" + } + ], + "project_name": "pluggy", + "requires_dists": [ + "pre-commit; extra == \"dev\"", + "pytest-benchmark; extra == \"testing\"", + "pytest; extra == \"testing\"", + "tox; extra == \"dev\"" + ], + "requires_python": ">=3.8", + "version": "1.5.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "f0700d54bcf45424477e46a9f0944155b46fb0639d69728739c0e47bab83f2b9", + "url": "https://files.pythonhosted.org/packages/f4/d5/db585a5e8d64af6b384c7b3a63da13df2ff86933e486ba78431736c67c25/protobuf-4.25.3-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "7c8daa26095f82482307bc717364e7c13f4f1c99659be82890dcfc215194554d", + "url": "https://files.pythonhosted.org/packages/15/db/7f731524fe0e56c6b2eb57d05b55d3badd80ef7d1f1ed59db191b2fdd8ab/protobuf-4.25.3-cp37-abi3-manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "25b5d0b42fd000320bd7830b349e3b696435f3b329810427a6bcce6a5492cc5c", + "url": "https://files.pythonhosted.org/packages/5e/d8/65adb47d921ce828ba319d6587aa8758da022de509c3862a70177a958844/protobuf-4.25.3.tar.gz" + }, + { + "algorithm": "sha256", + "hash": "e7cb0ae90dd83727f0c0718634ed56837bfeeee29a5f82a7514c03ee1364c019", + "url": "https://files.pythonhosted.org/packages/d8/82/aefe901174b5a618daee511ddd00342193c1b545e3cd6a2cd6df9ba452b5/protobuf-4.25.3-cp37-abi3-manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "f1279ab38ecbfae7e456a108c5c0681e4956d5b1090027c1de0f934dfdb4b35c", + "url": "https://files.pythonhosted.org/packages/f3/bf/26deba06a4c910a85f78245cac7698f67cedd7efe00d04f6b3e1b3506a59/protobuf-4.25.3-cp37-abi3-macosx_10_9_universal2.whl" + } + ], + "project_name": "protobuf", + "requires_dists": [], + "requires_python": ">=3.8", + "version": "4.25.3" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "ffe7fc9b6b36beadc8c322f84e1caff51e8703b88eee1da46d1e3a6ae11b4fd0", + "url": "https://files.pythonhosted.org/packages/7c/06/63872a64c312a24fb9b4af123ee7007a306617da63ff13bcc1432386ead7/psutil-6.0.0-cp38-abi3-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "c588a7e9b1173b6e866756dde596fd4cad94f9399daf99ad8c3258b3cb2b47a0", + "url": "https://files.pythonhosted.org/packages/0b/37/f8da2fbd29690b3557cca414c1949f92162981920699cd62095a984983bf/psutil-6.0.0-cp36-abi3-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "8faae4f310b6d969fa26ca0545338b21f73c6b15db7c4a8d934a5482faa818f2", + "url": "https://files.pythonhosted.org/packages/18/c7/8c6872f7372eb6a6b2e4708b88419fb46b857f7a2e1892966b851cc79fc9/psutil-6.0.0.tar.gz" + }, + { + "algorithm": "sha256", + "hash": "5fd9a97c8e94059b0ef54a7d4baf13b405011176c3b6ff257c247cae0d560ecd", + "url": "https://files.pythonhosted.org/packages/19/74/f59e7e0d392bc1070e9a70e2f9190d652487ac115bb16e2eff6b22ad1d24/psutil-6.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "6ed2440ada7ef7d0d608f20ad89a04ec47d2d3ab7190896cd62ca5fc4fe08bf0", + "url": "https://files.pythonhosted.org/packages/35/56/72f86175e81c656a01c4401cd3b1c923f891b31fbcebe98985894176d7c9/psutil-6.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "e2e8d0054fc88153ca0544f5c4d554d42e33df2e009c4ff42284ac9ebdef4132", + "url": "https://files.pythonhosted.org/packages/cd/5f/60038e277ff0a9cc8f0c9ea3d0c5eb6ee1d2470ea3f9389d776432888e47/psutil-6.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + } + ], + "project_name": "psutil", + "requires_dists": [ + "enum34; python_version <= \"3.4\" and extra == \"test\"", + "ipaddress; python_version < \"3.0\" and extra == \"test\"", + "mock; python_version < \"3.0\" and extra == \"test\"", + "pywin32; sys_platform == \"win32\" and extra == \"test\"", + "wmi; sys_platform == \"win32\" and extra == \"test\"" + ], + "requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7", + "version": "6.0.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378", + "url": "https://files.pythonhosted.org/packages/f6/f0/10642828a8dfb741e5f3fbaac830550a518a775c7fff6f04a007259b0548/py-1.11.0-py2.py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719", + "url": "https://files.pythonhosted.org/packages/98/ff/fec109ceb715d2a6b4c4a85a61af3b40c723a961e8828319fbcb15b868dc/py-1.11.0.tar.gz" + } + ], + "project_name": "py", + "requires_dists": [], + "requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7", + "version": "1.11.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "859625bc251f64e21f077d099d4162689c762b5d6a4c3c97553d56241c9674d5", + "url": "https://files.pythonhosted.org/packages/e0/a9/023730ba63db1e494a271cb018dcd361bd2c917ba7004c3e49d5daf795a2/py_cpuinfo-9.0.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "3cdbbf3fac90dc6f118bfd64384f309edeadd902d7c8fb17f02ffa1fc3f49690", + "url": "https://files.pythonhosted.org/packages/37/a8/d832f7293ebb21690860d2e01d8115e5ff6f2ae8bbdc953f0eb0fa4bd2c7/py-cpuinfo-9.0.0.tar.gz" + } + ], + "project_name": "py-cpuinfo", + "requires_dists": [], + "requires_python": null, + "version": "9.0.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "cca4bb0f2df5504f02f6f8a775b6e416ff9b0b3b16f7ee80b5a3153d9b804473", + "url": "https://files.pythonhosted.org/packages/23/7e/5f50d07d5e70a2addbccd90ac2950f81d1edd0783630651d9268d7f1db49/pyasn1-0.6.0-py2.py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "3a35ab2c4b5ef98e17dfdec8ab074046fbda76e281c5a706ccd82328cfc8f64c", + "url": "https://files.pythonhosted.org/packages/4a/a3/d2157f333900747f20984553aca98008b6dc843eb62f3a36030140ccec0d/pyasn1-0.6.0.tar.gz" + } + ], + "project_name": "pyasn1", + "requires_dists": [], + "requires_python": ">=3.8", + "version": "0.6.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "be04f15b66c206eed667e0bb5ab27e2b1855ea54a842e5037738099e8ca4ae0b", + "url": "https://files.pythonhosted.org/packages/13/68/8906226b15ef38e71dc926c321d2fe99de8048e9098b5dfd38343011c886/pyasn1_modules-0.4.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "831dbcea1b177b28c9baddf4c6d1013c24c3accd14a1873fffaa6a2e905f17b6", + "url": "https://files.pythonhosted.org/packages/f7/00/e7bd1dec10667e3f2be602686537969a7ac92b0a7c5165be2e5875dc3971/pyasn1_modules-0.4.0.tar.gz" + } + ], + "project_name": "pyasn1-modules", + "requires_dists": [ + "pyasn1<0.7.0,>=0.4.6" + ], + "requires_python": ">=3.8", + "version": "0.4.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", + "url": "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", + "url": "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz" + } + ], + "project_name": "pycparser", + "requires_dists": [], + "requires_python": ">=3.8", + "version": "2.22" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "7d65fb222eea1294cfc8206d9e5754d476a1673eb2783c03c4f70e0455320274", + "url": "https://files.pythonhosted.org/packages/83/59/5b05cb1bff0c2341e01733b9c341eea8f1cc9cc893c8c429437bd90ee8bd/pygame-2.6.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "e5707aa9d029752495b3eddc1edff62e0e390a02f699b0f1ce77fe0b8c70ea4f", + "url": "https://files.pythonhosted.org/packages/2f/1c/e515c10196aed75dbef75b41ff3069897c9405f568169694a3b3f8fc0f4c/pygame-2.6.0-cp310-cp310-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "89be55b7e9e22e0eea08af9d6cfb97aed5da780f0b3a035803437d481a16d972", + "url": "https://files.pythonhosted.org/packages/4b/aa/2e9c10266df048f186ad86ec543fc788e13f99f1b8ccf6d47658f26d0b79/pygame-2.6.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "722d33ae676aa8533c1f955eded966411298831346b8d51a77dad22e46ba3e35", + "url": "https://files.pythonhosted.org/packages/72/49/bd2fcbadb6a55bb24284bad4f530189401c99ffc234d51ba54756a776eb2/pygame-2.6.0.tar.gz" + }, + { + "algorithm": "sha256", + "hash": "6050f3e95f1f16602153d616b52619c6a2041cee7040eb529f65689e9633fc3e", + "url": "https://files.pythonhosted.org/packages/7c/c8/be72ca148131b3eef3851245e2f081abadf634feffe33edea3c9f619f1ef/pygame-2.6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "d3ed0547368733b854c0d9981c982a3cdfabfa01b477d095c57bf47f2199da44", + "url": "https://files.pythonhosted.org/packages/cc/2f/270b3a9c5f1567d91255af15e9f9685d412461115fd96f393777be04b339/pygame-2.6.0-cp310-cp310-macosx_11_0_arm64.whl" + } + ], + "project_name": "pygame", + "requires_dists": [], + "requires_python": ">=3.6", + "version": "2.6.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "17ed5be5936449c5418d1cd269a1a9e9081bc54c17aed272b45856a3d3dc86ad", + "url": "https://files.pythonhosted.org/packages/54/a7/2104f674a5a6845b04c8ff01659becc6b8978ca410b82b94287e0b1e018b/pyOpenSSL-24.1.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "cabed4bfaa5df9f1a16c0ef64a0cb65318b5cd077a7eda7d6970131ca2f41a6f", + "url": "https://files.pythonhosted.org/packages/91/a8/cbeec652549e30103b9e6147ad433405fdd18807ac2d54e6dbb73184d8a1/pyOpenSSL-24.1.0.tar.gz" + } + ], + "project_name": "pyopenssl", + "requires_dists": [ + "cryptography<43,>=41.0.5", + "pretend; extra == \"test\"", + "pytest-rerunfailures; extra == \"test\"", + "pytest>=3.0.1; extra == \"test\"", + "sphinx!=5.2.0,!=5.2.0.post0,!=7.2.5; extra == \"docs\"", + "sphinx-rtd-theme; extra == \"docs\"" + ], + "requires_python": ">=3.7", + "version": "24.1.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742", + "url": "https://files.pythonhosted.org/packages/9d/ea/6d76df31432a0e6fdf81681a895f009a4bb47b3c39036db3e1b528191d52/pyparsing-3.1.2-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad", + "url": "https://files.pythonhosted.org/packages/46/3a/31fd28064d016a2182584d579e033ec95b809d8e220e74c4af6f0f2e8842/pyparsing-3.1.2.tar.gz" + } + ], + "project_name": "pyparsing", + "requires_dists": [ + "jinja2; extra == \"diagrams\"", + "railroad-diagrams; extra == \"diagrams\"" + ], + "requires_python": ">=3.6.8", + "version": "3.1.2" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343", + "url": "https://files.pythonhosted.org/packages/4e/e7/81ebdd666d3bff6670d27349b5053605d83d55548e6bd5711f3b0ae7dd23/pytest-8.2.2-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977", + "url": "https://files.pythonhosted.org/packages/a6/58/e993ca5357553c966b9e73cb3475d9c935fe9488746e13ebdf9b80fae508/pytest-8.2.2.tar.gz" + } + ], + "project_name": "pytest", + "requires_dists": [ + "argcomplete; extra == \"dev\"", + "attrs>=19.2; extra == \"dev\"", + "colorama; sys_platform == \"win32\"", + "exceptiongroup>=1.0.0rc8; python_version < \"3.11\"", + "hypothesis>=3.56; extra == \"dev\"", + "iniconfig", + "mock; extra == \"dev\"", + "packaging", + "pluggy<2.0,>=1.5", + "pygments>=2.7.2; extra == \"dev\"", + "requests; extra == \"dev\"", + "setuptools; extra == \"dev\"", + "tomli>=1; python_version < \"3.11\"", + "xmlschema; extra == \"dev\"" + ], + "requires_python": ">=3.8", + "version": "8.2.2" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "fdb7db64e31c8b277dff9850d2a2556d8b60bcb0ea6524e36e28ffd7c87f71d6", + "url": "https://files.pythonhosted.org/packages/4d/a1/3b70862b5b3f830f0422844f25a823d0470739d994466be9dbbbb414d85a/pytest_benchmark-4.0.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "fb0785b83efe599a6a956361c0691ae1dbb5318018561af10f3e915caa0048d1", + "url": "https://files.pythonhosted.org/packages/28/08/e6b0067efa9a1f2a1eb3043ecd8a0c48bfeb60d3255006dcc829d72d5da2/pytest-benchmark-4.0.0.tar.gz" + } + ], + "project_name": "pytest-benchmark", + "requires_dists": [ + "aspectlib; extra == \"aspect\"", + "elasticsearch; extra == \"elasticsearch\"", + "pathlib2; python_version < \"3.4\"", + "py-cpuinfo", + "pygal; extra == \"histogram\"", + "pygaljs; extra == \"histogram\"", + "pytest>=3.8", + "statistics; python_version < \"3.4\"" + ], + "requires_python": ">=3.7", + "version": "4.0.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "578d5d15ac4a25e5f961c938b85a05b09fdaae9deef3bb6de9a6e766622ca7a6", + "url": "https://files.pythonhosted.org/packages/20/49/b3e0edec68d81846f519c602ac38af9db86e1e71275528b3e814ae236063/pytest_cov-3.0.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "e7f0f5b1617d2210a2cabc266dfe2f4c75a8d32fb89eafb7ad9d06f6d076d470", + "url": "https://files.pythonhosted.org/packages/61/41/e046526849972555928a6d31c2068410e47a31fb5ab0a77f868596811329/pytest-cov-3.0.0.tar.gz" + } + ], + "project_name": "pytest-cov", + "requires_dists": [ + "coverage[toml]>=5.2.1", + "fields; extra == \"testing\"", + "hunter; extra == \"testing\"", + "process-tests; extra == \"testing\"", + "pytest-xdist; extra == \"testing\"", + "pytest>=4.6", + "six; extra == \"testing\"", + "virtualenv; extra == \"testing\"" + ], + "requires_python": ">=3.6", + "version": "3.0.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "810958f66a91afb1a1e2ae83089d8dc1cd2437ac96b12963042fbb9fb4d16af0", + "url": "https://files.pythonhosted.org/packages/f4/af/9c0bda43e486a3c9bf1e0f876d0f241bc3f229d7d65d09331a0868db9629/pytest_forked-1.6.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "4dafd46a9a600f65d822b8f605133ecf5b3e1941ebb3588e943b4e3eb71a5a3f", + "url": "https://files.pythonhosted.org/packages/8c/c9/93ad2ba2413057ee694884b88cf7467a46c50c438977720aeac26e73fdb7/pytest-forked-1.6.0.tar.gz" + } + ], + "project_name": "pytest-forked", + "requires_dists": [ + "py", + "pytest>=3.10" + ], + "requires_python": ">=3.7", + "version": "1.6.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "b05cb0bcd51a7cd0375bfbeeb3eaeb01fc85665e45b21fc9494a8a19137f4d32", + "url": "https://files.pythonhosted.org/packages/c5/d1/2ef73ee137add043df444fddf1c851b8ca70ab9c7b7f18e18c4c244fec6d/pytest_platform_markers-1.0.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "07ea92669114ba8083b6653995b5a9ab14d57ca16307fd2af22d6f7d295160e4", + "url": "https://files.pythonhosted.org/packages/b3/e7/174a22a8cb4cf4b64456cd799f472bb90206f1ce8d537edbc1d9659689a3/pytest-platform-markers-1.0.0.tar.gz" + } + ], + "project_name": "pytest-platform-markers", + "requires_dists": [ + "pytest>=3.6.0" + ], + "requires_python": null, + "version": "1.0.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "4197bdd2eaeffdbf50b5ea6e7236f47ff0e44d1def8dae08e409f536d84e7b32", + "url": "https://files.pythonhosted.org/packages/dc/e7/e75bd157331aecc190f5f8950d7ea3d2cf56c3c57fb44da70e60b221133f/pytest_rerunfailures-14.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "4a400bcbcd3c7a4ad151ab8afac123d90eca3abe27f98725dc4d9702887d2e92", + "url": "https://files.pythonhosted.org/packages/cc/a4/6de45fe850759e94aa9a55cda807c76245af1941047294df26c851dfb4a9/pytest-rerunfailures-14.0.tar.gz" + } + ], + "project_name": "pytest-rerunfailures", + "requires_dists": [ + "packaging>=17.1", + "pytest>=7.2" + ], + "requires_python": ">=3.8", + "version": "14.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "6fe5c74fec98906deb8f2d2b616b5c782022744978e7bd4695d39c8f42d0ce65", + "url": "https://files.pythonhosted.org/packages/21/08/b1945d4b4986eb1aa10cf84efc5293bba39da80a2f95db3573dd90678408/pytest_xdist-2.5.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "4580deca3ff04ddb2ac53eba39d76cb5dd5edeac050cb6fbc768b0dd712b4edf", + "url": "https://files.pythonhosted.org/packages/5d/43/9dbc32d297d6eae85d6c05dc8e8d3371061bd6cbe56a2f645d9ea4b53d9b/pytest-xdist-2.5.0.tar.gz" + } + ], + "project_name": "pytest-xdist", + "requires_dists": [ + "execnet>=1.1", + "filelock; extra == \"testing\"", + "psutil>=3.0; extra == \"psutil\"", + "pytest-forked", + "pytest>=6.2.0", + "setproctitle; extra == \"setproctitle\"" + ], + "requires_python": ">=3.6", + "version": "2.5.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "a3caa3a11842fc7d5746376f37195e6af5f17c0a15737538bb1cebf656fb306b", + "url": "https://files.pythonhosted.org/packages/29/b5/c1209e6cb77647bc2c9a6a1a953355720f34f3b006b725e303c70f3c0786/pyu2f-0.1.5.tar.gz" + } + ], + "project_name": "pyu2f", + "requires_dists": [ + "six" + ], + "requires_python": null, + "version": "0.1.5" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290", + "url": "https://files.pythonhosted.org/packages/07/91/45dfd0ef821a7f41d9d0136ea3608bb5b1653e42fd56a7970532cb5c003f/PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515", + "url": "https://files.pythonhosted.org/packages/29/61/bf33c6c85c55bc45a29eee3195848ff2d518d84735eb0e2d8cb42e0d285e/PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f", + "url": "https://files.pythonhosted.org/packages/5b/07/10033a403b23405a8fc48975444463d3d10a5c2736b7eb2550b07b367429/PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a", + "url": "https://files.pythonhosted.org/packages/96/06/4beb652c0fe16834032e54f0956443d4cc797fe645527acee59e7deaa0a2/PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d", + "url": "https://files.pythonhosted.org/packages/ba/91/090818dfa62e85181f3ae23dd1e8b7ea7f09684864a900cab72d29c57346/PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43", + "url": "https://files.pythonhosted.org/packages/cd/e5/af35f7ea75cf72f2cd079c95ee16797de7cd71f29ea7c68ae5ce7be1eda0/PyYAML-6.0.1.tar.gz" + }, + { + "algorithm": "sha256", + "hash": "69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938", + "url": "https://files.pythonhosted.org/packages/f1/26/55e4f21db1f72eaef092015d9017c11510e7e6301c62a6cfee91295d13c6/PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + } + ], + "project_name": "pyyaml", + "requires_dists": [], + "requires_python": ">=3.6", + "version": "6.0.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", + "url": "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", + "url": "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz" + } + ], + "project_name": "requests", + "requires_dists": [ + "PySocks!=1.5.7,>=1.5.6; extra == \"socks\"", + "certifi>=2017.4.17", + "chardet<6,>=3.0.2; extra == \"use-chardet-on-py3\"", + "charset-normalizer<4,>=2", + "idna<4,>=2.5", + "urllib3<3,>=1.21.1" + ], + "requires_python": ">=3.8", + "version": "2.32.3" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "e1e8ad02e518fe11073f2ea7d80b6b8be19daa27a60a1838aff7c731ddcf2ebe", + "url": "https://files.pythonhosted.org/packages/6e/e6/bedc75b264cbcbf6e6d0e5071d96d739f540fc09be31744a7a8824c02a8e/retry_decorator-1.1.1.tar.gz" + } + ], + "project_name": "retry-decorator", + "requires_dists": [], + "requires_python": null, + "version": "1.1.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "78f9a9bf4e7be0c5ded4583326e7461e3a3c5aae24073648b4bdfa797d78c9d2", + "url": "https://files.pythonhosted.org/packages/e9/93/0c0f002031f18b53af7a6166103c02b9c0667be528944137cc954ec921b3/rsa-4.7.2-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "9d689e6ca1b3038bc82bf8d23e944b6b6037bc02301a574935b2dd946e0353b9", + "url": "https://files.pythonhosted.org/packages/db/b5/475c45a58650b0580421746504b680cd2db4e81bc941e94ca53785250269/rsa-4.7.2.tar.gz" + } + ], + "project_name": "rsa", + "requires_dists": [ + "pyasn1>=0.1.3" + ], + "requires_python": "<4,>=3.5", + "version": "4.7.2" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "ef1b3d54eb715825657cd4bb3cb42bb4dc85087bac14c56b0fd8c21abd968c9a", + "url": "https://files.pythonhosted.org/packages/90/6a/a7d19d776ba9899c97acb223ceba4080ef9f5de9d7599203ae64b56ed597/sentry_sdk-2.7.1-py2.py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "25006c7e68b75aaa5e6b9c6a420ece22e8d7daec4b7a906ffd3a8607b67c037b", + "url": "https://files.pythonhosted.org/packages/b8/63/310d89868a0dab17f6d7c1f35eba9c304dd06c2a17d0d26905738763b614/sentry_sdk-2.7.1.tar.gz" + } + ], + "project_name": "sentry-sdk", + "requires_dists": [ + "aiohttp>=3.5; extra == \"aiohttp\"", + "anthropic>=0.16; extra == \"anthropic\"", + "apache-beam>=2.12; extra == \"beam\"", + "arq>=0.23; extra == \"arq\"", + "asttokens; extra == \"pure-eval\"", + "asyncpg>=0.23; extra == \"asyncpg\"", + "blinker>=1.1; extra == \"flask\"", + "blinker>=1.1; extra == \"quart\"", + "bottle>=0.12.13; extra == \"bottle\"", + "celery-redbeat>=2; extra == \"celery-redbeat\"", + "celery>=3; extra == \"celery\"", + "certifi", + "chalice>=1.16.0; extra == \"chalice\"", + "clickhouse-driver>=0.2.0; extra == \"clickhouse-driver\"", + "django>=1.8; extra == \"django\"", + "executing; extra == \"pure-eval\"", + "falcon>=1.4; extra == \"falcon\"", + "fastapi>=0.79.0; extra == \"fastapi\"", + "flask>=0.11; extra == \"flask\"", + "grpcio>=1.21.1; extra == \"grpcio\"", + "httpx>=0.16.0; extra == \"httpx\"", + "huey>=2; extra == \"huey\"", + "huggingface-hub>=0.22; extra == \"huggingface-hub\"", + "langchain>=0.0.210; extra == \"langchain\"", + "loguru>=0.5; extra == \"loguru\"", + "markupsafe; extra == \"flask\"", + "openai>=1.0.0; extra == \"openai\"", + "opentelemetry-distro>=0.35b0; extra == \"opentelemetry\"", + "opentelemetry-instrumentation-aio-pika==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-aiohttp-client==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-aiopg==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-asgi==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-asyncio==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-asyncpg==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-aws-lambda==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-boto3sqs==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-boto==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-botocore==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-cassandra==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-celery==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-confluent-kafka==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-dbapi==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-django==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-elasticsearch==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-falcon==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-fastapi==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-flask==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-grpc==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-httpx==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-jinja2==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-kafka-python==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-logging==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-mysql==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-mysqlclient==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-pika==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-psycopg2==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-psycopg==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-pymemcache==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-pymongo==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-pymysql==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-pyramid==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-redis==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-remoulade==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-requests==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-sklearn==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-sqlalchemy==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-sqlite3==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-starlette==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-system-metrics==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-threading==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-tornado==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-tortoiseorm==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-urllib3==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-urllib==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-wsgi==0.46b0; extra == \"opentelemetry-experimental\"", + "protobuf>=3.8.0; extra == \"grpcio\"", + "pure-eval; extra == \"pure-eval\"", + "pymongo>=3.1; extra == \"pymongo\"", + "pyspark>=2.4.4; extra == \"pyspark\"", + "quart>=0.16.1; extra == \"quart\"", + "rq>=0.6; extra == \"rq\"", + "sanic>=0.8; extra == \"sanic\"", + "sqlalchemy>=1.2; extra == \"sqlalchemy\"", + "starlette>=0.19.1; extra == \"starlette\"", + "starlite>=1.48; extra == \"starlite\"", + "tiktoken>=0.3.0; extra == \"openai\"", + "tornado>=6; extra == \"tornado\"", + "urllib3>=1.26.11" + ], + "requires_python": ">=3.6", + "version": "2.7.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "38ae9a02766dad331deb06855fb7a6ca15daea333b3967e214de12cfae8f0ef5", + "url": "https://files.pythonhosted.org/packages/70/1d/3b2249c833c7d52b59ff0602d760df0543dc1e6c272f145b949750edeb01/setproctitle-1.3.3-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "6b9e62ddb3db4b5205c0321dd69a406d8af9ee1693529d144e86bd43bcb4b6c0", + "url": "https://files.pythonhosted.org/packages/24/55/8b369b56007a5a2c7594cdb58cd4a09d7cca65b28483bb5582c6975663f1/setproctitle-1.3.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "9e3b99b338598de0bd6b2643bf8c343cf5ff70db3627af3ca427a5e1a1a90dd9", + "url": "https://files.pythonhosted.org/packages/35/30/ac99ecae8458ba995f85aa3aa911004679b405922e1487b0fba6fe8f4d37/setproctitle-1.3.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "da0d57edd4c95bf221b2ebbaa061e65b1788f1544977288bdf95831b6e44e44d", + "url": "https://files.pythonhosted.org/packages/3d/92/17168f4bb1a695094e93e73a1ef1f7b89953a6d91e8a7699a2c840ba712f/setproctitle-1.3.3-cp310-cp310-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "897a73208da48db41e687225f355ce993167079eda1260ba5e13c4e53be7f754", + "url": "https://files.pythonhosted.org/packages/4f/cc/c51e6371f640a9adbe693ddb89d68596e5a8e4b5e05b4d3c65ec504e2f6d/setproctitle-1.3.3-cp310-cp310-macosx_10_9_universal2.whl" + }, + { + "algorithm": "sha256", + "hash": "9617b676b95adb412bb69645d5b077d664b6882bb0d37bfdafbbb1b999568d85", + "url": "https://files.pythonhosted.org/packages/69/a7/2a77b68c11db87c22350381d6ce022011eb420076790e0e3697153e89458/setproctitle-1.3.3-cp310-cp310-musllinux_1_1_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "fc74e84fdfa96821580fb5e9c0b0777c1c4779434ce16d3d62a9c4d8c710df39", + "url": "https://files.pythonhosted.org/packages/79/e7/54b36be02aee8ad573be68f6f46fd62838735c2f007b22df50eb5e13a20d/setproctitle-1.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "1342f4fdb37f89d3e3c1c0a59d6ddbedbde838fff5c51178a7982993d238fe4f", + "url": "https://files.pythonhosted.org/packages/87/7b/69bdc791001250dff279a1a81904f3f563caece4fa1607a95b9fd5197d6e/setproctitle-1.3.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "38da436a0aaace9add67b999eb6abe4b84397edf4a78ec28f264e5b4c9d53cd5", + "url": "https://files.pythonhosted.org/packages/94/ad/4166381d79f6ae8138be9b49f05d193a8deb748debace9896dffad45a753/setproctitle-1.3.3-cp310-cp310-musllinux_1_1_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "bbbd6c7de0771c84b4aa30e70b409565eb1fc13627a723ca6be774ed6b9d9fa3", + "url": "https://files.pythonhosted.org/packages/9c/56/6f4a4e80b2810eb7ea9ab355022c780ef80457de368ab5b6b21b795e4f05/setproctitle-1.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "6a249415f5bb88b5e9e8c4db47f609e0bf0e20a75e8d744ea787f3092ba1f2d0", + "url": "https://files.pythonhosted.org/packages/9d/09/bc108723bbfb7c50c22fdf22191f3e32abcb5d6f46610018030b25f601c5/setproctitle-1.3.3-cp310-cp310-musllinux_1_1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "8c331e91a14ba4076f88c29c777ad6b58639530ed5b24b5564b5ed2fd7a95452", + "url": "https://files.pythonhosted.org/packages/c3/7d/d03f319e0f3b3a6e98731a56cd4d81478ed0c12531b822fd2c728b948edb/setproctitle-1.3.3-cp310-cp310-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "c05ac48ef16ee013b8a326c63e4610e2430dbec037ec5c5b58fcced550382b74", + "url": "https://files.pythonhosted.org/packages/d0/ae/010811bece9a59a8bba131d9e7acea9c2e3c3cbf544bf06d8b10b8c28ff5/setproctitle-1.3.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "c913e151e7ea01567837ff037a23ca8740192880198b7fbb90b16d181607caae", + "url": "https://files.pythonhosted.org/packages/ff/e1/b16b16a1aa12174349d15b73fd4b87e641a8ae3fb1163e80938dbbf6ae98/setproctitle-1.3.3.tar.gz" + } + ], + "project_name": "setproctitle", + "requires_dists": [ + "pytest; extra == \"test\"" + ], + "requires_python": ">=3.7", + "version": "1.3.3" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "6d10741ff20b89cd8c6a536ee9dc90d3002dec0226c78fb98605bfb9ef8a7adf", + "url": "https://files.pythonhosted.org/packages/40/a9/7deac76c58fa47c95360116a06b53b9b62f6db11336fe61b6ab53784d98b/setuptools-59.5.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "d144f85102f999444d06f9c0e8c737fd0194f10f2f7e5fdb77573f6e2fa4fad0", + "url": "https://files.pythonhosted.org/packages/e6/e2/f2bfdf364e016f7a464db709ea40d1101c4c5a463dd7019dae0a42dbd1c6/setuptools-59.5.0.tar.gz" + } + ], + "project_name": "setuptools", + "requires_dists": [ + "flake8-2020; extra == \"testing\"", + "furo; extra == \"docs\"", + "jaraco.envs>=2.2; extra == \"testing\"", + "jaraco.packaging>=8.2; extra == \"docs\"", + "jaraco.path>=3.2.0; extra == \"testing\"", + "jaraco.tidelift>=1.4; extra == \"docs\"", + "mock; extra == \"testing\"", + "paver; extra == \"testing\"", + "pip>=19.1; extra == \"testing\"", + "pygments-github-lexers==0.0.5; extra == \"docs\"", + "pytest-black>=0.3.7; platform_python_implementation != \"PyPy\" and extra == \"testing\"", + "pytest-checkdocs>=2.4; extra == \"testing\"", + "pytest-cov; extra == \"testing\"", + "pytest-enabler>=1.0.1; extra == \"testing\"", + "pytest-flake8; extra == \"testing\"", + "pytest-mypy; platform_python_implementation != \"PyPy\" and extra == \"testing\"", + "pytest-virtualenv>=1.2.7; extra == \"testing\"", + "pytest-xdist; extra == \"testing\"", + "pytest>=6; extra == \"testing\"", + "rst.linker>=1.9; extra == \"docs\"", + "sphinx-inline-tabs; extra == \"docs\"", + "sphinx; extra == \"docs\"", + "sphinx; extra == \"testing\"", + "sphinxcontrib-towncrier; extra == \"docs\"", + "virtualenv>=13.0.0; extra == \"testing\"", + "wheel; extra == \"testing\"" + ], + "requires_python": ">=3.6", + "version": "59.5.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254", + "url": "https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", + "url": "https://files.pythonhosted.org/packages/71/39/171f1c67cd00715f190ba0b100d606d440a28c93c7714febeca8b79af85e/six-1.16.0.tar.gz" + } + ], + "project_name": "six", + "requires_dists": [], + "requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7", + "version": "1.16.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da", + "url": "https://files.pythonhosted.org/packages/a7/a5/10f97f73544edcdef54409f1d839f6049a0d79df68adbc1ceb24d1aaca42/smmap-5.0.1-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62", + "url": "https://files.pythonhosted.org/packages/88/04/b5bf6d21dc4041000ccba7eb17dd3055feb237e7ffc2c20d3fae3af62baa/smmap-5.0.1.tar.gz" + } + ], + "project_name": "smmap", + "requires_dists": [], + "requires_python": ">=3.7", + "version": "5.0.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "859a499a9b1fb68a058858964486627100b71fcb21646861c61d31846a6478fb", + "url": "https://files.pythonhosted.org/packages/0a/32/2e8545fb0592f33e3aca5951e8b01008b76d61b440658cbdc37b4eaebf0b/tensorboard-2.17.0-py3-none-any.whl" + } + ], + "project_name": "tensorboard", + "requires_dists": [ + "absl-py>=0.4", + "grpcio>=1.48.2", + "markdown>=2.6.8", + "numpy>=1.12.0", + "protobuf!=4.24.0,<5.0.0,>=3.19.6", + "setuptools>=41.0.0", + "six>1.9", + "tensorboard-data-server<0.8.0,>=0.7.0", + "werkzeug>=1.0.1" + ], + "requires_python": ">=3.9", + "version": "2.17.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "ef687163c24185ae9754ed5650eb5bc4d84ff257aabdc33f0cc6f74d8ba54530", + "url": "https://files.pythonhosted.org/packages/73/c6/825dab04195756cf8ff2e12698f22513b3db2f64925bdd41671bfb33aaa5/tensorboard_data_server-0.7.2-py3-none-manylinux_2_31_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "7e0610d205889588983836ec05dc098e80f97b7e7bbff7e994ebb78f578d0ddb", + "url": "https://files.pythonhosted.org/packages/7a/13/e503968fefabd4c6b2650af21e110aa8466fe21432cd7c43a84577a89438/tensorboard_data_server-0.7.2-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "9fe5d24221b29625dbc7328b0436ca7fc1c23de4acf4d272f1180856e32f9f60", + "url": "https://files.pythonhosted.org/packages/b7/85/dabeaf902892922777492e1d253bb7e1264cadce3cea932f7ff599e53fea/tensorboard_data_server-0.7.2-py3-none-macosx_10_9_x86_64.whl" + } + ], + "project_name": "tensorboard-data-server", + "requires_dists": [], + "requires_python": ">=3.7", + "version": "0.7.2" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", + "url": "https://files.pythonhosted.org/packages/97/75/10a9ebee3fd790d20926a90a2547f0bf78f371b2f13aa822c759680ca7b9/tomli-2.0.1-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f", + "url": "https://files.pythonhosted.org/packages/c0/3f/d7af728f075fb08564c5949a9c95e44352e23dee646869fa104a3b2060a3/tomli-2.0.1.tar.gz" + } + ], + "project_name": "tomli", + "requires_dists": [], + "requires_python": ">=3.7", + "version": "2.0.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "74f5b137190a6face6859d630f129289e7fae6a4d9a747430b3b5d5c6297a3ae", + "url": "https://download.pytorch.org/whl/cu116/torch-1.12.0%2Bcu116-cp310-cp310-linux_x86_64.whl" + } + ], + "project_name": "torch", + "requires_dists": [ + "typing-extensions" + ], + "requires_python": ">=3.7.0", + "version": "1.12.0+cu116" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", + "url": "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8", + "url": "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz" + } + ], + "project_name": "typing-extensions", + "requires_dists": [], + "requires_python": ">=3.8", + "version": "4.12.2" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472", + "url": "https://files.pythonhosted.org/packages/ca/1c/89ffc63a9605b583d5df2be791a27bc1a42b7c32bab68d3c8f2f73a98cd4/urllib3-2.2.2-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168", + "url": "https://files.pythonhosted.org/packages/43/6d/fa469ae21497ddc8bc93e5877702dca7cb8f911e337aca7452b5724f1bb6/urllib3-2.2.2.tar.gz" + } + ], + "project_name": "urllib3", + "requires_dists": [ + "brotli>=1.0.9; platform_python_implementation == \"CPython\" and extra == \"brotli\"", + "brotlicffi>=0.8.0; platform_python_implementation != \"CPython\" and extra == \"brotli\"", + "h2<5,>=4; extra == \"h2\"", + "pysocks!=1.5.7,<2.0,>=1.5.6; extra == \"socks\"", + "zstandard>=0.18.0; extra == \"zstd\"" + ], + "requires_python": ">=3.8", + "version": "2.2.2" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "cdc18c87ed255235cddd4a89ad96624595871e24ccfe975211a375a16923759f", + "url": "https://files.pythonhosted.org/packages/14/1c/faf90318ff4bcb23d533b32ca3a9db6616532f312563f46d02a0c121ecff/wandb-0.17.3-py3-none-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "f6fe865b9ed7db74d67660973abaa236bbe469019a37b50d44a1be372122aced", + "url": "https://files.pythonhosted.org/packages/87/70/80a80709815dd60cba566dc4e84aa570e6b5c2790f7d2e498273c3619e59/wandb-0.17.3-py3-none-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "7b69eb8148dca4f04d1e9c11f7d651e374f429b8ed729562e3184ce989f376f2", + "url": "https://files.pythonhosted.org/packages/ac/86/470ea9af2337d3cc987939980180532afd6757107044ed6970363ef42bb7/wandb-0.17.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "df94581b299414c4929759b0d12578b00a84d3bb21bc01461edcb1a643b2719b", + "url": "https://files.pythonhosted.org/packages/f0/7a/4935fd9d0302046c1a73d9e866fbd5e7955185e3cbe73ca09510774c5452/wandb-0.17.3-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "36c4688c70bcd1d39e1575ab1664b22f67b40f685b087847f867b6e9302cd963", + "url": "https://files.pythonhosted.org/packages/fd/4c/c6a664af23e18696c44c526c056f95ca74bd869bc44c507f36ac3cf74d70/wandb-0.17.3-py3-none-macosx_11_0_arm64.whl" + } + ], + "project_name": "wandb", + "requires_dists": [ + "awscli; extra == \"launch\"", + "azure-containerregistry; extra == \"launch\"", + "azure-identity; extra == \"azure\"", + "azure-identity; extra == \"launch\"", + "azure-storage-blob; extra == \"azure\"", + "azure-storage-blob; extra == \"launch\"", + "bokeh; extra == \"media\"", + "boto3; extra == \"aws\"", + "boto3; extra == \"launch\"", + "botocore; extra == \"launch\"", + "chardet; extra == \"launch\"", + "click!=8.0.0,>=7.1", + "cloudpickle; extra == \"models\"", + "docker-pycreds>=0.4.0", + "filelock; extra == \"importers\"", + "gitpython!=3.1.29,>=1.0.0", + "google-auth; extra == \"launch\"", + "google-cloud-aiplatform; extra == \"launch\"", + "google-cloud-artifact-registry; extra == \"launch\"", + "google-cloud-compute; extra == \"launch\"", + "google-cloud-storage; extra == \"gcp\"", + "google-cloud-storage; extra == \"kubeflow\"", + "google-cloud-storage; extra == \"launch\"", + "iso8601; extra == \"launch\"", + "kubernetes-asyncio; extra == \"launch\"", + "kubernetes; extra == \"kubeflow\"", + "kubernetes; extra == \"launch\"", + "minio; extra == \"kubeflow\"", + "mlflow; extra == \"importers\"", + "moviepy; extra == \"media\"", + "nbconvert; extra == \"launch\"", + "nbformat; extra == \"launch\"", + "numpy; extra == \"media\"", + "optuna; extra == \"launch\"", + "orjson; extra == \"perf\"", + "pillow; extra == \"media\"", + "platformdirs", + "plotly>=5.18.0; extra == \"media\"", + "polars; extra == \"importers\"", + "protobuf!=4.21.0,<6,>=3.12.0; python_version < \"3.9\" and sys_platform == \"linux\"", + "protobuf!=4.21.0,<6,>=3.15.0; python_version == \"3.9\" and sys_platform == \"linux\"", + "protobuf!=4.21.0,<6,>=3.19.0; python_version > \"3.9\" and sys_platform == \"linux\"", + "protobuf!=4.21.0,<6,>=3.19.0; sys_platform != \"linux\"", + "psutil>=5.0.0", + "pydantic; extra == \"launch\"", + "pyyaml", + "pyyaml>=6.0.0; extra == \"launch\"", + "rdkit-pypi; extra == \"media\"", + "requests<3,>=2.0.0", + "rich; extra == \"importers\"", + "sentry-sdk>=1.0.0", + "setproctitle", + "setuptools", + "sh; extra == \"kubeflow\"", + "soundfile; extra == \"media\"", + "sweeps>=0.2.0; extra == \"sweeps\"", + "tenacity; extra == \"importers\"", + "tomli; extra == \"launch\"", + "typing-extensions; extra == \"launch\"", + "typing-extensions; python_version < \"3.10\"", + "wandb-workspaces; extra == \"workspaces\"" + ], + "requires_python": ">=3.7", + "version": "0.17.3" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "fc9645dc43e03e4d630d23143a04a7f947a9a3b5727cd535fdfe155a17cc48c8", + "url": "https://files.pythonhosted.org/packages/9d/6e/e792999e816d19d7fcbfa94c730936750036d65656a76a5a688b57a656c4/werkzeug-3.0.3-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "097e5bfda9f0aba8da6b8545146def481d06aa7d3266e7448e2cccf67dd8bd18", + "url": "https://files.pythonhosted.org/packages/02/51/2e0fc149e7a810d300422ab543f87f2bcf64d985eb6f1228c4efd6e4f8d4/werkzeug-3.0.3.tar.gz" + } + ], + "project_name": "werkzeug", + "requires_dists": [ + "MarkupSafe>=2.1.1", + "watchdog>=2.3; extra == \"watchdog\"" + ], + "requires_python": ">=3.8", + "version": "3.0.3" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad", + "url": "https://files.pythonhosted.org/packages/4d/05/4d79198ae568a92159de0f89e710a8d19e3fa267b719a236582eee921f4a/yarl-1.9.4-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "d5ff2c858f5f6a42c2a8e751100f237c5e869cbde669a724f2062d4c4ef93551", + "url": "https://files.pythonhosted.org/packages/0b/58/dd3c69651381a57ac991dba54b20ae2da359eb4b03a661e71c451d6525c6/yarl-1.9.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "e516dc8baf7b380e6c1c26792610230f37147bb754d6426462ab115a02944385", + "url": "https://files.pythonhosted.org/packages/0b/a3/7774786ec6e2dca0bb38b286f12a11af97957546e5fbcce71752a8d2cf07/yarl-1.9.4-cp310-cp310-musllinux_1_1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "d9e09c9d74f4566e905a0b8fa668c58109f7624db96a2171f21747abc7524234", + "url": "https://files.pythonhosted.org/packages/30/b5/215d586d5cb17ca9748d7a2d597c07147f210c0c0785257492094d083b65/yarl-1.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "54beabb809ffcacbd9d28ac57b0db46e42a6e341a030293fb3185c409e626b8b", + "url": "https://files.pythonhosted.org/packages/44/ae/fdbc9965ef69e650c3b5b04d60badef90ff0cde21a30770f0700e148b12f/yarl-1.9.4-cp310-cp310-musllinux_1_1_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "a8c1df72eb746f4136fe9a2e72b0c9dc1da1cbd23b5372f94b5820ff8ae30e0e", + "url": "https://files.pythonhosted.org/packages/6c/27/cda5a927df3a894eddfee4efacdd230c2d8486e322fc672194fd651f82c5/yarl-1.9.4-cp310-cp310-macosx_10_9_universal2.whl" + }, + { + "algorithm": "sha256", + "hash": "54525ae423d7b7a8ee81ba189f131054defdb122cde31ff17477951464c1691c", + "url": "https://files.pythonhosted.org/packages/6d/a1/db0bdf8cc48515e9c02daf04ae2916fc27ce6498eca21432fc9ffa63f71b/yarl-1.9.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "7d5aaac37d19b2904bb9dfe12cdb08c8443e7ba7d2852894ad448d4b8f442863", + "url": "https://files.pythonhosted.org/packages/70/a9/ef6d69ce9a4e82080290bcb6db735bb8a6d6db92f2bbb92b6951bde97e7c/yarl-1.9.4-cp310-cp310-musllinux_1_1_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "c38c9ddb6103ceae4e4498f9c08fac9b590c5c71b0370f98714768e22ac6fa66", + "url": "https://files.pythonhosted.org/packages/81/c6/06938036ea48fa74521713499fba1459b0eb60af9b9afbe8e0e9e1a96c36/yarl-1.9.4-cp310-cp310-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "801e9264d19643548651b9db361ce3287176671fb0117f96b5ac0ee1c3530d53", + "url": "https://files.pythonhosted.org/packages/b2/4f/796b0c73e9ff30a1047a7ee3390e157ab8424d4401b9f32a2624013a5b39/yarl-1.9.4-cp310-cp310-musllinux_1_1_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "357495293086c5b6d34ca9616a43d329317feab7917518bc97a08f9e55648455", + "url": "https://files.pythonhosted.org/packages/c3/a0/0ade1409d184cbc9e85acd403a386a7c0563b92ff0f26d138ff9e86e48b4/yarl-1.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "bac8d525a8dbc2a1507ec731d2867025d11ceadcb4dd421423a5d42c56818541", + "url": "https://files.pythonhosted.org/packages/cc/2a/abbaf1460becba856e163f2a1274f5d34b1969d476da8e68a8fc2aeb5661/yarl-1.9.4-cp310-cp310-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "a3a6ed1d525bfb91b3fc9b690c5a21bb52de28c018530ad85093cc488bee2dd2", + "url": "https://files.pythonhosted.org/packages/d5/fc/40b85bea1f5686092ea37f472c94c023d6347266852ffd55baa01c40f596/yarl-1.9.4-cp310-cp310-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "b8477c1ee4bd47c57d49621a062121c3023609f7a13b8a46953eb6c9716ca392", + "url": "https://files.pythonhosted.org/packages/dd/90/2958ae9f2e12084d616eef95b6a48c8e6d96448add04367c20dc53a33ff2/yarl-1.9.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf", + "url": "https://files.pythonhosted.org/packages/e0/ad/bedcdccbcbf91363fd425a948994f3340924145c2bc8ccb296f4a1e52c28/yarl-1.9.4.tar.gz" + } + ], + "project_name": "yarl", + "requires_dists": [ + "idna>=2.0", + "multidict>=4.0", + "typing-extensions>=3.7.4; python_version < \"3.8\"" + ], + "requires_python": ">=3.7", + "version": "1.9.4" + } + ], + "platform_tag": null + } + ], + "only_builds": [], + "only_wheels": [], + "path_mappings": {}, + "pex_version": "2.3.1", + "pip_version": "23.0.1", + "prefer_older_binary": false, + "requirements": [ + "atomicwrites>=1.4.0", + "box2d-py>=2.3.5", + "cloudpickle~=3.0", + "gsutil>=4.66", + "gymnasium>=0.27.1", + "numpy<1.24", + "onnx>=1.10", + "opencv-python>=3.0", + "protobuf>=4.0", + "psutil>=5.8.0", + "pygame>=2.1.0", + "pytest-benchmark==4.0.0", + "pytest-cov!=2.12.1,<3.1,>=2.12", + "pytest-platform-markers", + "pytest-rerunfailures", + "pytest-xdist<3,>=2.5", + "pytest~=8.0", + "setuptools==59.5", + "tensorboard>=2.8.0", + "torch==1.12.0", + "wandb>=0.14.0" + ], + "requires_python": [ + "<3.11,>=3.10" + ], + "resolver_version": "pip-2020-resolver", + "style": "universal", + "target_systems": [ + "linux", + "mac" + ], + "transitive": true, + "use_pep517": null +} diff --git a/locks/cpu.lock b/locks/cpu.lock new file mode 100644 index 00000000..93e997aa --- /dev/null +++ b/locks/cpu.lock @@ -0,0 +1,2872 @@ +// This lockfile was autogenerated by Pants. To regenerate, run: +// +// pants generate-lockfiles --resolve=cpu +// +// --- BEGIN PANTS LOCKFILE METADATA: DO NOT EDIT OR REMOVE --- +// { +// "version": 3, +// "valid_for_interpreter_constraints": [ +// "CPython<3.11,>=3.10" +// ], +// "generated_with_requirements": [ +// "atomicwrites>=1.4.0", +// "box2d-py>=2.3.5", +// "cloudpickle~=3.0", +// "gsutil>=4.66", +// "gymnasium>=0.27.1", +// "numpy<1.24", +// "onnx>=1.10", +// "opencv-python>=3.0", +// "protobuf>=4.0", +// "psutil>=5.8.0", +// "pygame>=2.1.0", +// "pytest-benchmark==4.0.0", +// "pytest-cov!=2.12.1,<3.1,>=2.12", +// "pytest-platform-markers", +// "pytest-rerunfailures", +// "pytest-xdist<3,>=2.5", +// "pytest~=8.0", +// "setuptools==59.5", +// "tensorboard>=2.8.0", +// "torch==1.12.0", +// "wandb>=0.14.0" +// ], +// "manylinux": "manylinux2014", +// "requirement_constraints": [], +// "only_binary": [], +// "no_binary": [] +// } +// --- END PANTS LOCKFILE METADATA --- + +{ + "allow_builds": true, + "allow_prereleases": false, + "allow_wheels": true, + "build_isolation": true, + "constraints": [], + "locked_resolves": [ + { + "locked_requirements": [ + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "526a04eadab8b4ee719ce68f204172ead1027549089702d99b9059f129ff1308", + "url": "https://files.pythonhosted.org/packages/a2/ad/e0d3c824784ff121c03cc031f944bc7e139a8f1870ffd2845cc2dd76f6c4/absl_py-2.1.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "7820790efbb316739cde8b4e19357243fc3608a152024288513dd968d7d959ff", + "url": "https://files.pythonhosted.org/packages/7a/8f/fc001b92ecc467cc32ab38398bd0bfb45df46e7523bf33c2ad22a505f06e/absl-py-2.1.0.tar.gz" + } + ], + "project_name": "absl-py", + "requires_dists": [], + "requires_python": ">=3.7", + "version": "2.1.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "702e2c7c187c1a498a4e2b03155d52658fdd6fda882d3d7fbb891a5cf108bb10", + "url": "https://files.pythonhosted.org/packages/25/00/d3d4a9e23e4d810a345f8ca24550caec0aaca7307fd692e0b939746b1d78/aiohttp-3.9.5-cp310-cp310-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "edea7d15772ceeb29db4aff55e482d4bcfb6ae160ce144f2682de02f6d693551", + "url": "https://files.pythonhosted.org/packages/04/a4/e3679773ea7eb5b37a2c998e25b017cc5349edf6ba2739d1f32855cfb11b/aiohttp-3.9.5.tar.gz" + }, + { + "algorithm": "sha256", + "hash": "c8a02fbeca6f63cb1f0475c799679057fc9268b77075ab7cf3f1c600e81dd46b", + "url": "https://files.pythonhosted.org/packages/6e/05/36471e8cbcf4c56d4917fcbe0c2c6d68119ba6e83b66d7173f39ee0125b6/aiohttp-3.9.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "ff84aeb864e0fac81f676be9f4685f0527b660f1efdc40dcede3c251ef1e867f", + "url": "https://files.pythonhosted.org/packages/77/4d/892098719e00bcf746a9fccc5f6854b1cfaf0d892de8ca5a646083eb12e2/aiohttp-3.9.5-cp310-cp310-musllinux_1_1_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "84dabd95154f43a2ea80deffec9cb44d2e301e38a0c9d331cc4aa0166fe28ae3", + "url": "https://files.pythonhosted.org/packages/7f/ee/0c83fd6ece4200145417da81565af7e7266b3a0591fbe32129b48187a472/aiohttp-3.9.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "c26959ca7b75ff768e2776d8055bf9582a6267e24556bb7f7bd29e677932be72", + "url": "https://files.pythonhosted.org/packages/a0/09/e7637f4f0760cad4d67347bbd8311c6ad0259a3fc01f04555af9e84bd378/aiohttp-3.9.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "c413016880e03e69d166efb5a1a95d40f83d5a3a648d16486592c49ffb76d0db", + "url": "https://files.pythonhosted.org/packages/a3/5c/322ffd8b6bb4a49d399685c1fccecb0bd0f7487bfefeef202c4f4c478bd0/aiohttp-3.9.5-cp310-cp310-musllinux_1_1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "6ae79c1bc12c34082d92bf9422764f799aee4746fd7a392db46b7fd357d4a17a", + "url": "https://files.pythonhosted.org/packages/a9/51/d95cab6dbee773c57ff590d218633e7b9d52a103bc51060483349f3c8e1e/aiohttp-3.9.5-cp310-cp310-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "4d3ebb9e1316ec74277d19c5f482f98cc65a73ccd5430540d6d11682cd857430", + "url": "https://files.pythonhosted.org/packages/ac/03/5da5d4b8e88d8af96f3b2f498141cafaad9acf3282831f0036993385b2d5/aiohttp-3.9.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "ad7f2919d7dac062f24d6f5fe95d401597fbb015a25771f85e692d043c9d7832", + "url": "https://files.pythonhosted.org/packages/b8/e6/17062e803031c760bc452117f0789f36545355d287258889ccfe6f57cce8/aiohttp-3.9.5-cp310-cp310-musllinux_1_1_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "fcde4c397f673fdec23e6b05ebf8d4751314fa7c24f93334bf1f1364c1c69ac7", + "url": "https://files.pythonhosted.org/packages/bb/6b/baa5886a66dc4a9fe60df3fff543ac0cdbac3d18347889f17023b15bdceb/aiohttp-3.9.5-cp310-cp310-macosx_10_9_universal2.whl" + }, + { + "algorithm": "sha256", + "hash": "e7a6a8354f1b62e15d48e04350f13e726fa08b62c3d7b8401c0a1314f02e3558", + "url": "https://files.pythonhosted.org/packages/db/fd/f390f2a538858c0ff5d74f11226d85956d6c52b16765cc485d4f7ba7d45d/aiohttp-3.9.5-cp310-cp310-musllinux_1_1_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "5d6b3f1fabe465e819aed2c421a6743d8debbde79b6a8600739300630a01bf2c", + "url": "https://files.pythonhosted.org/packages/e7/3d/557ca9d4867e0e17f69694e514999c3de0a63c11964701600c9719171b97/aiohttp-3.9.5-cp310-cp310-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "714d4e5231fed4ba2762ed489b4aec07b2b9953cf4ee31e9871caac895a839c0", + "url": "https://files.pythonhosted.org/packages/f4/46/c36596481a148014b0b6d4a62570baf5580aede5acc95901317b12cc3308/aiohttp-3.9.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + } + ], + "project_name": "aiohttp", + "requires_dists": [ + "Brotli; platform_python_implementation == \"CPython\" and extra == \"speedups\"", + "aiodns; (sys_platform == \"linux\" or sys_platform == \"darwin\") and extra == \"speedups\"", + "aiosignal>=1.1.2", + "async-timeout<5.0,>=4.0; python_version < \"3.11\"", + "attrs>=17.3.0", + "brotlicffi; platform_python_implementation != \"CPython\" and extra == \"speedups\"", + "frozenlist>=1.1.1", + "multidict<7.0,>=4.5", + "yarl<2.0,>=1.0" + ], + "requires_python": ">=3.8", + "version": "3.9.5" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17", + "url": "https://files.pythonhosted.org/packages/76/ac/a7305707cb852b7e16ff80eaf5692309bde30e2b1100a1fcacdc8f731d97/aiosignal-1.3.1-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc", + "url": "https://files.pythonhosted.org/packages/ae/67/0952ed97a9793b4958e5736f6d2b346b414a2cd63e82d05940032f45b32f/aiosignal-1.3.1.tar.gz" + } + ], + "project_name": "aiosignal", + "requires_dists": [ + "frozenlist>=1.1.0" + ], + "requires_python": ">=3.7", + "version": "1.3.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "69a79e083a716173e5532e0fa3bef45f793f4e61096cf52b5a42c0211c8b8aa5", + "url": "https://files.pythonhosted.org/packages/0b/29/cba741f3abc1700dda883c4a1dd83f4ae89e4e8654067929d89143df2c58/argcomplete-3.4.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "c2abcdfe1be8ace47ba777d4fce319eb13bf8ad9dace8d085dcad6eded88057f", + "url": "https://files.pythonhosted.org/packages/db/ca/45176b8362eb06b68f946c2bf1184b92fc98d739a3f8c790999a257db91f/argcomplete-3.4.0.tar.gz" + } + ], + "project_name": "argcomplete", + "requires_dists": [ + "coverage; extra == \"test\"", + "mypy; extra == \"test\"", + "pexpect; extra == \"test\"", + "ruff; extra == \"test\"", + "wheel; extra == \"test\"" + ], + "requires_python": ">=3.8", + "version": "3.4.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028", + "url": "https://files.pythonhosted.org/packages/a7/fa/e01228c2938de91d47b307831c62ab9e4001e747789d0b05baf779a6488c/async_timeout-4.0.3-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f", + "url": "https://files.pythonhosted.org/packages/87/d6/21b30a550dafea84b1b8eee21b5e23fa16d010ae006011221f33dcd8d7f8/async-timeout-4.0.3.tar.gz" + } + ], + "project_name": "async-timeout", + "requires_dists": [ + "typing-extensions>=3.6.5; python_version < \"3.8\"" + ], + "requires_python": ">=3.7", + "version": "4.0.3" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11", + "url": "https://files.pythonhosted.org/packages/87/c6/53da25344e3e3a9c01095a89f16dbcda021c609ddb42dd6d7c0528236fb2/atomicwrites-1.4.1.tar.gz" + } + ], + "project_name": "atomicwrites", + "requires_dists": [], + "requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7", + "version": "1.4.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1", + "url": "https://files.pythonhosted.org/packages/e0/44/827b2a91a5816512fcaf3cc4ebc465ccd5d598c45cefa6703fcf4a79018f/attrs-23.2.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30", + "url": "https://files.pythonhosted.org/packages/e3/fc/f800d51204003fa8ae392c4e8278f256206e7a919b708eef054f5f4b650d/attrs-23.2.0.tar.gz" + } + ], + "project_name": "attrs", + "requires_dists": [ + "attrs[tests-mypy]; extra == \"tests-no-zope\"", + "attrs[tests-no-zope]; extra == \"tests\"", + "attrs[tests]; extra == \"cov\"", + "attrs[tests]; extra == \"dev\"", + "cloudpickle; platform_python_implementation == \"CPython\" and extra == \"tests-no-zope\"", + "coverage[toml]>=5.3; extra == \"cov\"", + "furo; extra == \"docs\"", + "hypothesis; extra == \"tests-no-zope\"", + "importlib-metadata; python_version < \"3.8\"", + "mypy>=1.6; (platform_python_implementation == \"CPython\" and python_version >= \"3.8\") and extra == \"tests-mypy\"", + "myst-parser; extra == \"docs\"", + "pre-commit; extra == \"dev\"", + "pympler; extra == \"tests-no-zope\"", + "pytest-mypy-plugins; (platform_python_implementation == \"CPython\" and python_version >= \"3.8\") and extra == \"tests-mypy\"", + "pytest-xdist[psutil]; extra == \"tests-no-zope\"", + "pytest>=4.3.0; extra == \"tests-no-zope\"", + "sphinx-notfound-page; extra == \"docs\"", + "sphinx; extra == \"docs\"", + "sphinxcontrib-towncrier; extra == \"docs\"", + "towncrier; extra == \"docs\"", + "zope-interface; extra == \"docs\"", + "zope-interface; extra == \"tests\"" + ], + "requires_python": ">=3.7", + "version": "23.2.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "147758d41ae7240dc989f0039f27da8ca0d53734be0eb869ef16e3adcfa462e8", + "url": "https://files.pythonhosted.org/packages/23/10/c0b78c27298029e4454a472a1919bde20cb182dab1662cec7f2ca1dcc523/boto-2.49.0-py2.py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "ea0d3b40a2d852767be77ca343b58a9e3a4b00d9db440efb8da74b4e58025e5a", + "url": "https://files.pythonhosted.org/packages/c8/af/54a920ff4255664f5d238b5aebd8eedf7a07c7a5e71e27afcfe840b82f51/boto-2.49.0.tar.gz" + } + ], + "project_name": "boto", + "requires_dists": [], + "requires_python": null, + "version": "2.49.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "bdacfbbc56079bb317548efe49d3d5a86646885cc27f4a2ee97e4b2960921ab7", + "url": "https://files.pythonhosted.org/packages/98/c2/ab05b5329dc4416b5ee5530f0625a79c394a3e3c10abe0812b9345256451/box2d-py-2.3.8.tar.gz" + } + ], + "project_name": "box2d-py", + "requires_dists": [], + "requires_python": null, + "version": "2.3.8" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945", + "url": "https://files.pythonhosted.org/packages/fb/2b/a64c2d25a37aeb921fddb929111413049fc5f8b9a4c1aefaffaafe768d54/cachetools-5.3.3-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105", + "url": "https://files.pythonhosted.org/packages/b3/4d/27a3e6dd09011649ad5210bdf963765bc8fa81a0827a4fc01bafd2705c5b/cachetools-5.3.3.tar.gz" + } + ], + "project_name": "cachetools", + "requires_dists": [], + "requires_python": ">=3.7", + "version": "5.3.3" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56", + "url": "https://files.pythonhosted.org/packages/5b/11/1e78951465b4a225519b8c3ad29769c49e0d8d157a070f681d5b6d64737f/certifi-2024.6.2-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516", + "url": "https://files.pythonhosted.org/packages/07/b3/e02f4f397c81077ffc52a538e0aec464016f1860c472ed33bd2a1d220cc5/certifi-2024.6.2.tar.gz" + } + ], + "project_name": "certifi", + "requires_dists": [], + "requires_python": ">=3.6", + "version": "2024.6.2" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d", + "url": "https://files.pythonhosted.org/packages/ee/68/74a2b9f9432b70d97d1184cdabf32d7803124c228adef9481d280864a4a7/cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684", + "url": "https://files.pythonhosted.org/packages/22/05/43cfda378da7bb0aa19b3cf34fe54f8867b0d581294216339d87deefd69c/cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7", + "url": "https://files.pythonhosted.org/packages/54/49/b8875986beef2e74fc668b95f2df010e354f78e009d33d95b375912810c3/cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673", + "url": "https://files.pythonhosted.org/packages/57/3a/c263cf4d5b02880274866968fa2bf196a02c4486248bc164732319b4a4c0/cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0", + "url": "https://files.pythonhosted.org/packages/68/ce/95b0bae7968c65473e1298efb042e10cafc7bafc14d9e4f154008241c91d/cffi-1.16.0.tar.gz" + }, + { + "algorithm": "sha256", + "hash": "6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088", + "url": "https://files.pythonhosted.org/packages/aa/aa/1c43e48a6f361d1529f9e4602d6992659a0107b5f21cae567e2eddcf8d66/cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9", + "url": "https://files.pythonhosted.org/packages/c4/01/f5116266fe80c04d4d1cc96c3d355606943f9fb604a810e0b02228a0ce19/cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614", + "url": "https://files.pythonhosted.org/packages/c9/7c/43d81bdd5a915923c3bad5bb4bff401ea00ccc8e28433fb6083d2e3bf58e/cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743", + "url": "https://files.pythonhosted.org/packages/eb/de/4f644fc78a1144a897e1f908abfb2058f7be05a8e8e4fe90b7f41e9de36b/cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896", + "url": "https://files.pythonhosted.org/packages/f0/31/a6503a5c4874fb4d4c2053f73f09a957cb427b6943fab5a43b8e156df397/cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + } + ], + "project_name": "cffi", + "requires_dists": [ + "pycparser" + ], + "requires_python": ">=3.8", + "version": "1.16.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc", + "url": "https://files.pythonhosted.org/packages/28/76/e6222113b83e3622caa4bb41032d0b1bf785250607392e1b778aca0b8a7d/charset_normalizer-3.3.2-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e", + "url": "https://files.pythonhosted.org/packages/05/8c/eb854996d5fef5e4f33ad56927ad053d04dc820e4a3d39023f35cad72617/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3", + "url": "https://files.pythonhosted.org/packages/2b/61/095a0aa1a84d1481998b534177c8566fdc50bb1233ea9a0478cd3cc075bd/charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl" + }, + { + "algorithm": "sha256", + "hash": "beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c", + "url": "https://files.pythonhosted.org/packages/33/c3/3b96a435c5109dd5b6adc8a59ba1d678b302a97938f032e3770cc84cd354/charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537", + "url": "https://files.pythonhosted.org/packages/3f/ba/3f5e7be00b215fa10e13d64b1f6237eb6ebea66676a41b2bcdd09fe74323/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12", + "url": "https://files.pythonhosted.org/packages/43/05/3bf613e719efe68fb3a77f9c536a389f35b95d75424b96b426a47a45ef1d/charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03", + "url": "https://files.pythonhosted.org/packages/46/6a/d5c26c41c49b546860cc1acabdddf48b0b3fb2685f4f5617ac59261b44ae/charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f", + "url": "https://files.pythonhosted.org/packages/58/78/a0bc646900994df12e07b4ae5c713f2b3e5998f58b9d3720cce2aa45652f/charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5", + "url": "https://files.pythonhosted.org/packages/63/09/c1bc53dab74b1816a00d8d030de5bf98f724c52c1635e07681d312f20be8/charset-normalizer-3.3.2.tar.gz" + }, + { + "algorithm": "sha256", + "hash": "fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519", + "url": "https://files.pythonhosted.org/packages/a8/31/47d018ef89f95b8aded95c589a77c072c55e94b50a41aa99c0a2008a45a4/charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d", + "url": "https://files.pythonhosted.org/packages/b8/60/e2f67915a51be59d4539ed189eb0a2b0d292bf79270410746becb32bc2c3/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027", + "url": "https://files.pythonhosted.org/packages/cc/94/f7cf5e5134175de79ad2059edf2adce18e0685ebdb9227ff0139975d0e93/charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5", + "url": "https://files.pythonhosted.org/packages/da/f1/3702ba2a7470666a62fd81c58a4c40be00670e5006a67f4d626e57f013ae/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269", + "url": "https://files.pythonhosted.org/packages/eb/5c/97d97248af4920bc68687d9c3b3c0f47c910e21a8ff80af4565a576bd2f0/charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6", + "url": "https://files.pythonhosted.org/packages/f6/93/bb6cbeec3bf9da9b2eba458c15966658d1daa8b982c642f81c93ad9b40e1/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl" + } + ], + "project_name": "charset-normalizer", + "requires_dists": [], + "requires_python": ">=3.7.0", + "version": "3.3.2" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", + "url": "https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de", + "url": "https://files.pythonhosted.org/packages/96/d3/f04c7bfcf5c1862a2a5b845c6b2b360488cf47af55dfa79c98f6a6bf98b5/click-8.1.7.tar.gz" + } + ], + "project_name": "click", + "requires_dists": [ + "colorama; platform_system == \"Windows\"", + "importlib-metadata; python_version < \"3.8\"" + ], + "requires_python": ">=3.7", + "version": "8.1.7" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "246ee7d0c295602a036e86369c77fecda4ab17b506496730f2f576d9016fd9c7", + "url": "https://files.pythonhosted.org/packages/96/43/dae06432d0c4b1dc9e9149ad37b4ca8384cf6eb7700cd9215b177b914f0a/cloudpickle-3.0.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "996d9a482c6fb4f33c1a35335cf8afd065d2a56e973270364840712d9131a882", + "url": "https://files.pythonhosted.org/packages/c8/72/42a6570fc61b1f8913529728ad314c7cf5961540728dcad22c33fb2db6b6/cloudpickle-3.0.0.tar.gz" + } + ], + "project_name": "cloudpickle", + "requires_dists": [], + "requires_python": ">=3.8", + "version": "3.0.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "79b356f3dd5b26f3ad23b35c75dbdaf1f9e2450b6bcefc6d0825ea0aa3f86ca5", + "url": "https://files.pythonhosted.org/packages/7a/c3/a5b06a07b68795018f47b5d69b523ad473ac9ee66be3c22c4d3e5eadd91e/coverage-7.5.4-pp38.pp39.pp310-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "6cfb5a4f556bb51aba274588200a46e4dd6b505fb1a5f8c5ae408222eb416f99", + "url": "https://files.pythonhosted.org/packages/38/3d/9f9469f445789a170cb5bef3ad02ae9084ddd689f938797aa8ee793db404/coverage-7.5.4-cp310-cp310-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "5cd64adedf3be66f8ccee418473c2916492d53cbafbfcff851cbec5a8454b136", + "url": "https://files.pythonhosted.org/packages/44/ab/1ce64d6d01486b7e307ce0b25565b2337b9883d409fdb7655c94b0e80ae7/coverage-7.5.4-cp310-cp310-musllinux_1_2_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "2214ee920787d85db1b6a0bd9da5f8503ccc8fcd5814d90796c2f2493a2f4d2e", + "url": "https://files.pythonhosted.org/packages/99/49/0e8c8e8f9f7ea87ed94ddce70cdfe49224b13857ef3cbdb65a5eb29bba6f/coverage-7.5.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "b385d49609f8e9efc885790a5a0e89f2e3ae042cdf12958b6034cc442de428d3", + "url": "https://files.pythonhosted.org/packages/a2/78/d457df19baefbe3d38ef63cddfbda0f443d6546f3f56fa95cd884d612e8e/coverage-7.5.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "1137f46adb28e3813dec8c01fefadcb8c614f33576f672962e323b5128d9a68d", + "url": "https://files.pythonhosted.org/packages/a9/9a/79381c5dbc118b5cc0aac637352f65078766527ab0d23031d5421f2fb144/coverage-7.5.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "2174e7c23e0a454ffe12267a10732c273243b4f2d50d07544a91198f05c48f47", + "url": "https://files.pythonhosted.org/packages/b0/d8/b7bde23a5e94cfc1a45effad2dd4c45dc111c515f71c522986dd8ded31a1/coverage-7.5.4-cp310-cp310-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "a44963520b069e12789d0faea4e9fdb1e410cdc4aab89d94f7f55cbb7fef0353", + "url": "https://files.pythonhosted.org/packages/ef/05/31553dc038667012853d0a248b57987d8d70b2d67ea885605f87bcb1baba/coverage-7.5.4.tar.gz" + }, + { + "algorithm": "sha256", + "hash": "b4a474f799456e0eb46d78ab07303286a84a3140e9700b9e154cfebc8f527016", + "url": "https://files.pythonhosted.org/packages/ef/48/fccbf1b4ab5943e1b5bf5e29892531341b4c2731c448c6970349b0bb2f3b/coverage-7.5.4-cp310-cp310-musllinux_1_2_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "e564c2cf45d2f44a9da56f4e3a26b2236504a496eb4cb0ca7221cd4cc7a9aca9", + "url": "https://files.pythonhosted.org/packages/fd/a2/4db4030508e3f7267151155e2221487e1515eda167262d0aa88bce8d4b57/coverage-7.5.4-cp310-cp310-musllinux_1_2_x86_64.whl" + } + ], + "project_name": "coverage", + "requires_dists": [ + "tomli; python_full_version <= \"3.11.0a6\" and extra == \"toml\"" + ], + "requires_python": ">=3.8", + "version": "7.5.4" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "dc7051a0db5f2bd48665a990d3ec1cc305a466a77358ca4492826f41f283601e", + "url": "https://files.pythonhosted.org/packages/6b/b0/e595ce2a2527e169c3bcd6c33d2473c1918e0b7f6826a043ca1245dd4e5b/crcmod-1.7.tar.gz" + } + ], + "project_name": "crcmod", + "requires_dists": [], + "requires_python": null, + "version": "1.7" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "c9bb2ae11bfbab395bdd072985abde58ea9860ed84e59dbc0463a5d0159f5b71", + "url": "https://files.pythonhosted.org/packages/c1/e2/60b05e720766e185ef097d07068bd878a51d613ef91e4c241750f9c9192b/cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "6b7c4f03ce01afd3b76cf69a5455caa9cfa3de8c8f493e0d3ab7d20611c8dae9", + "url": "https://files.pythonhosted.org/packages/07/40/d6f6819c62e808ea74639c3c640f7edd636b86cce62cb14943996a15df92/cryptography-42.0.8-cp37-abi3-manylinux_2_28_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "cafb92b2bc622cd1aa6a1dce4b93307792633f4c5fe1f46c6b97cf67073ec961", + "url": "https://files.pythonhosted.org/packages/0f/38/85c74d0ac4c540780e072b1e6f148ecb718418c1062edcb20d22f3ec5bbb/cryptography-42.0.8-cp39-abi3-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "ad803773e9df0b92e0a817d22fd8a3675493f690b96130a5e24f1b8fabbea9c7", + "url": "https://files.pythonhosted.org/packages/25/c9/86f04e150c5d5d5e4a731a2c1e0e43da84d901f388e3fea3d5de98d689a7/cryptography-42.0.8-cp37-abi3-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "e599b53fd95357d92304510fb7bda8523ed1f79ca98dce2f43c115950aa78801", + "url": "https://files.pythonhosted.org/packages/35/66/2d87e9ca95c82c7ee5f2c09716fc4c4242c1ae6647b9bd27e55e920e9f10/cryptography-42.0.8-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "c4783183f7cb757b73b2ae9aed6599b96338eb957233c58ca8f49a49cc32fd5e", + "url": "https://files.pythonhosted.org/packages/43/c2/4a3eef67e009a522711ebd8ac89424c3a7fe591ece7035d964419ad52a1d/cryptography-42.0.8-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "a0608251135d0e03111152e41f0cc2392d1e74e35703960d4190b2e0f4ca9c70", + "url": "https://files.pythonhosted.org/packages/49/1c/9f6d13cc8041c05eebff1154e4e71bedd1db8e174fff999054435994187a/cryptography-42.0.8-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "2f66d9cd9147ee495a8374a45ca445819f8929a3efcd2e3df6428e46c3cbb10b", + "url": "https://files.pythonhosted.org/packages/53/c2/903014dafb7271fb148887d4355b2e90319cad6e810663be622b0c933fc9/cryptography-42.0.8-cp37-abi3-musllinux_1_2_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "2346b911eb349ab547076f47f2e035fc8ff2c02380a7cbbf8d87114fa0f1c583", + "url": "https://files.pythonhosted.org/packages/5c/46/de71d48abf2b6d3c808f4fbb0f4dc44a4e72786be23df0541aa2a3f6fd7e/cryptography-42.0.8-cp37-abi3-musllinux_1_1_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "e3ec3672626e1b9e55afd0df6d774ff0e953452886e06e0f1eb7eb0c832e8902", + "url": "https://files.pythonhosted.org/packages/5d/32/f6326c70a9f0f258a201d3b2632bca586ea24d214cec3cf36e374040e273/cryptography-42.0.8-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "dc0fdf6787f37b1c6b08e6dfc892d9d068b5bdb671198c72072828b80bd5fe4c", + "url": "https://files.pythonhosted.org/packages/5f/f9/c3d4f19b82bdb25a3d857fe96e7e571c981810e47e3f299cc13ac429066a/cryptography-42.0.8-cp39-abi3-manylinux_2_28_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "dea567d1b0e8bc5764b9443858b673b734100c2871dc93163f58c46a97a83d28", + "url": "https://files.pythonhosted.org/packages/60/12/f064af29190cdb1d38fe07f3db6126091639e1dece7ec77c4ff037d49193/cryptography-42.0.8-cp39-abi3-macosx_10_12_universal2.whl" + }, + { + "algorithm": "sha256", + "hash": "31f721658a29331f895a5a54e7e82075554ccfb8b163a18719d342f5ffe5ecb1", + "url": "https://files.pythonhosted.org/packages/89/f4/a8b982e88eb5350407ebdbf4717b55043271d878705329e107f4783555f2/cryptography-42.0.8-cp39-abi3-musllinux_1_2_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "8d09d05439ce7baa8e9e95b07ec5b6c886f548deb7e0f69ef25f64b3bce842f2", + "url": "https://files.pythonhosted.org/packages/93/a7/1498799a2ea06148463a9a2c10ab2f6a921a74fb19e231b27dc412a748e2/cryptography-42.0.8.tar.gz" + }, + { + "algorithm": "sha256", + "hash": "d45b940883a03e19e944456a558b67a41160e367a719833c53de6911cabba2b7", + "url": "https://files.pythonhosted.org/packages/95/26/82d704d988a193cbdc69ac3b41c687c36eaed1642cce52530ad810c35645/cryptography-42.0.8-cp37-abi3-musllinux_1_2_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "fff12c88a672ab9c9c1cf7b0c80e3ad9e2ebd9d828d955c126be4fd3e5578c9e", + "url": "https://files.pythonhosted.org/packages/a2/68/e16751f6b859bc120f53fddbf3ebada5c34f0e9689d8af32884d8b2e4b4c/cryptography-42.0.8-cp39-abi3-musllinux_1_1_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "ba4f0a211697362e89ad822e667d8d340b4d8d55fae72cdd619389fb5912eefe", + "url": "https://files.pythonhosted.org/packages/a3/fe/1e21699f0a7904e8a30d4fc6db262958f1edf5e505a02e7d97a5b419e482/cryptography-42.0.8-pp310-pypy310_pp73-macosx_10_12_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "5226d5d21ab681f432a9c1cf8b658c0cb02533eece706b155e5fbd8a0cdd3949", + "url": "https://files.pythonhosted.org/packages/c2/de/8083fa2e68d403553a01a9323f4f8b9d7ffed09928ba25635c29fb28c1e7/cryptography-42.0.8-cp37-abi3-manylinux_2_28_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "81884c4d096c272f00aeb1f11cf62ccd39763581645b0812e99a91505fa48e0c", + "url": "https://files.pythonhosted.org/packages/d5/f3/61b398b5ec61f4b6ffbf746227df7ebb421696458d9625d634043f236a13/cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "81d8a521705787afe7a18d5bfb47ea9d9cc068206270aad0b96a725022e18d2e", + "url": "https://files.pythonhosted.org/packages/f9/8b/1b929ba8139430e09e140e6939c2b29c18df1f2fc2149e41bdbdcdaf5d1f/cryptography-42.0.8-cp37-abi3-macosx_10_12_universal2.whl" + }, + { + "algorithm": "sha256", + "hash": "961e61cefdcb06e0c6d7e3a1b22ebe8b996eb2bf50614e89384be54c48c6b63d", + "url": "https://files.pythonhosted.org/packages/fa/5d/31d833daa800e4fab33209843095df7adb4a78ea536929145534cbc15026/cryptography-42.0.8-cp37-abi3-macosx_10_12_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "9c0c1716c8447ee7dbf08d6db2e5c41c688544c61074b54fc4564196f55c25a7", + "url": "https://files.pythonhosted.org/packages/fa/e2/b7e6e8c261536c489d9cf908769880d94bd5d9a187e166b0dc838d2e6a56/cryptography-42.0.8-cp39-abi3-manylinux_2_28_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "b297f90c5723d04bcc8265fc2a0f86d4ea2e0f7ab4b6994459548d3a6b992a14", + "url": "https://files.pythonhosted.org/packages/fd/2b/be327b580645927bb1a1f32d5a175b897a9b956bc085b095e15c40bac9ed/cryptography-42.0.8-cp39-abi3-musllinux_1_2_x86_64.whl" + } + ], + "project_name": "cryptography", + "requires_dists": [ + "bcrypt>=3.1.5; extra == \"ssh\"", + "build; extra == \"sdist\"", + "certifi; extra == \"test\"", + "cffi>=1.12; platform_python_implementation != \"PyPy\"", + "check-sdist; extra == \"pep8test\"", + "click; extra == \"pep8test\"", + "mypy; extra == \"pep8test\"", + "nox; extra == \"nox\"", + "pretend; extra == \"test\"", + "pyenchant>=1.6.11; extra == \"docstest\"", + "pytest-benchmark; extra == \"test\"", + "pytest-cov; extra == \"test\"", + "pytest-randomly; extra == \"test-randomorder\"", + "pytest-xdist; extra == \"test\"", + "pytest>=6.2.0; extra == \"test\"", + "readme-renderer; extra == \"docstest\"", + "ruff; extra == \"pep8test\"", + "sphinx-rtd-theme>=1.1.1; extra == \"docs\"", + "sphinx>=5.3.0; extra == \"docs\"", + "sphinxcontrib-spelling>=4.0.1; extra == \"docstest\"" + ], + "requires_python": ">=3.7", + "version": "42.0.8" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "7266112468627868005106ec19cd0d722702d2b7d5912a28e19b826c3d37af49", + "url": "https://files.pythonhosted.org/packages/f5/e8/f6bd1eee09314e7e6dee49cbe2c5e22314ccdb38db16c9fc72d2fa80d054/docker_pycreds-0.4.0-py2.py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "6ce3270bcaf404cc4c3e27e4b6c70d3521deae82fb508767870fdbf772d584d4", + "url": "https://files.pythonhosted.org/packages/c5/e6/d1f6c00b7221e2d7c4b470132c931325c8b22c51ca62417e300f5ce16009/docker-pycreds-0.4.0.tar.gz" + } + ], + "project_name": "docker-pycreds", + "requires_dists": [ + "six>=1.4.0" + ], + "requires_python": null, + "version": "0.4.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad", + "url": "https://files.pythonhosted.org/packages/01/90/79fe92dd413a9cab314ef5c591b5aa9b9ba787ae4cadab75055b0ae00b33/exceptiongroup-1.2.1-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16", + "url": "https://files.pythonhosted.org/packages/a0/65/d66b7fbaef021b3c954b3bbb196d21d8a4b97918ea524f82cfae474215af/exceptiongroup-1.2.1.tar.gz" + } + ], + "project_name": "exceptiongroup", + "requires_dists": [ + "pytest>=6; extra == \"test\"" + ], + "requires_python": ">=3.7", + "version": "1.2.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc", + "url": "https://files.pythonhosted.org/packages/43/09/2aea36ff60d16dd8879bdb2f5b3ee0ba8d08cbbdcdfe870e695ce3784385/execnet-2.1.1-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3", + "url": "https://files.pythonhosted.org/packages/bb/ff/b4c0dc78fbe20c3e59c0c7334de0c27eb4001a2b2017999af398bf730817/execnet-2.1.1.tar.gz" + } + ], + "project_name": "execnet", + "requires_dists": [ + "hatch; extra == \"testing\"", + "pre-commit; extra == \"testing\"", + "pytest; extra == \"testing\"", + "tox; extra == \"testing\"" + ], + "requires_python": ">=3.8", + "version": "2.1.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "14de931035a41961f7c056361dc7f980762a143d05791ef5794a751a2caf05ae", + "url": "https://files.pythonhosted.org/packages/05/2c/ffc08c54c05cdce6fbed2aeebc46348dbe180c6d2c541c7af7ba0aa5f5f8/Farama_Notifications-0.0.4-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "13fceff2d14314cf80703c8266462ebf3733c7d165336eee998fc58e545efd18", + "url": "https://files.pythonhosted.org/packages/2e/2c/8384832b7a6b1fd6ba95bbdcae26e7137bb3eedc955c42fd5cdcc086cfbf/Farama-Notifications-0.0.4.tar.gz" + } + ], + "project_name": "farama-notifications", + "requires_dists": [], + "requires_python": null, + "version": "0.0.4" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "758819cb5d94cdedf4e836988b74de396ceacb8e2794d21f82d131fd9ee77237", + "url": "https://files.pythonhosted.org/packages/61/bf/fd60001b3abc5222d8eaa4a204cd8c0ae78e75adc688f33ce4bf25b7fafa/fasteners-0.19-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "b4f37c3ac52d8a445af3a66bce57b33b5e90b97c696b7b984f530cf8f0ded09c", + "url": "https://files.pythonhosted.org/packages/5f/d4/e834d929be54bfadb1f3e3b931c38e956aaa3b235a46a3c764c26c774902/fasteners-0.19.tar.gz" + } + ], + "project_name": "fasteners", + "requires_dists": [], + "requires_python": ">=3.6", + "version": "0.19" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "04ced3e6a46b4cfffe20f9ae482818e34eba9b5fb0ce4056e4cc9b6e212d09b7", + "url": "https://files.pythonhosted.org/packages/83/10/466fe96dae1bff622021ee687f68e5524d6392b0a2f80d05001cd3a451ba/frozenlist-1.4.1-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "5c849d495bf5154cd8da18a9eb15db127d4dba2968d88831aff6f0331ea9bd4c", + "url": "https://files.pythonhosted.org/packages/36/ce/dc6f29e0352fa34ebe45421960c8e7352ca63b31630a576e8ffb381e9c08/frozenlist-1.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "9750cc7fe1ae3b1611bb8cfc3f9ec11d532244235d75901fb6b8e42ce9229dfe", + "url": "https://files.pythonhosted.org/packages/51/47/159ac53faf8a11ae5ee8bb9db10327575557504e549cfd76f447b969aa91/frozenlist-1.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "27657df69e8801be6c3638054e202a135c7f299267f1a55ed3a598934f6c0d75", + "url": "https://files.pythonhosted.org/packages/53/82/274e19f122e124aee6d113188615f63b0736b4242a875f482a81f91e07e2/frozenlist-1.4.1-cp310-cp310-musllinux_1_1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "4f57dab5fe3407b6c0c1cc907ac98e8a189f9e418f3b6e54d65a718aaafe3950", + "url": "https://files.pythonhosted.org/packages/6e/4f/b8a5a2f10c4a58c52a52a40cf6cf1ffcdbf3a3b64f276f41dab989bf3ab5/frozenlist-1.4.1-cp310-cp310-musllinux_1_1_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "f9aa1878d1083b276b0196f2dfbe00c9b7e752475ed3b682025ff20c1c1f51ac", + "url": "https://files.pythonhosted.org/packages/7a/35/1328c7b0f780d34f8afc1d87ebdc2bb065a123b24766a0b475f0d67da637/frozenlist-1.4.1-cp310-cp310-macosx_10_9_universal2.whl" + }, + { + "algorithm": "sha256", + "hash": "0633c8d5337cb5c77acbccc6357ac49a1770b8c487e5b3505c57b949b4b82e98", + "url": "https://files.pythonhosted.org/packages/97/94/a1305fa4716726ae0abf3b1069c2d922fcfd442538cb850f1be543f58766/frozenlist-1.4.1-cp310-cp310-musllinux_1_1_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "74fb4bee6880b529a0c6560885fce4dc95936920f9f20f53d99a213f7bf66776", + "url": "https://files.pythonhosted.org/packages/ae/83/bcdaa437a9bd693ba658a0310f8cdccff26bd78e45fccf8e49897904a5cd/frozenlist-1.4.1-cp310-cp310-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "e02a0e11cf6597299b9f3bbd3f93d79217cb90cfd1411aec33848b13f5c656cc", + "url": "https://files.pythonhosted.org/packages/b0/2c/7be3bdc59dbae444864dbd9cde82790314390ec54636baf6b9ce212627ad/frozenlist-1.4.1-cp310-cp310-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "f9a3ea26252bd92f570600098783d1371354d89d5f6b7dfd87359d669f2109b5", + "url": "https://files.pythonhosted.org/packages/b8/28/899931015b8cffbe155392fe9ca663f981a17e1adc69589ee0e1e7cdc9a2/frozenlist-1.4.1-cp310-cp310-musllinux_1_1_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b", + "url": "https://files.pythonhosted.org/packages/cf/3d/2102257e7acad73efc4a0c306ad3953f68c504c16982bbdfee3ad75d8085/frozenlist-1.4.1.tar.gz" + }, + { + "algorithm": "sha256", + "hash": "590344787a90ae57d62511dd7c736ed56b428f04cd8c161fcc5e7232c130c69a", + "url": "https://files.pythonhosted.org/packages/d4/e9/759043ab7d169b74fe05ebfbfa9ee5c881c303ebc838e308346204309cd0/frozenlist-1.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "a9b2de4cf0cdd5bd2dee4c4f63a653c61d2408055ab77b151c1957f221cabf2a", + "url": "https://files.pythonhosted.org/packages/ec/25/0c87df2e53c0c5d90f7517ca0ff7aca78d050a8ec4d32c4278e8c0e52e51/frozenlist-1.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "29acab3f66f0f24674b7dc4736477bcd4bc3ad4b896f5f45379a67bce8b96868", + "url": "https://files.pythonhosted.org/packages/f4/d6/ca016b0adcf8327714ccef969740688808c86e0287bf3a639ff582f24e82/frozenlist-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "068b63f23b17df8569b7fdca5517edef76171cf3897eb68beb01341131fbd2ad", + "url": "https://files.pythonhosted.org/packages/f8/ce/b9de7dc61e753dc318cf0de862181b484178210c5361eae6eaf06792264d/frozenlist-1.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + } + ], + "project_name": "frozenlist", + "requires_dists": [], + "requires_python": ">=3.8", + "version": "1.4.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "a46817f3abed2bc4f6b4b12b0de7c8bf5ff5f1822dc03c45fa1ae6ed7a455843", + "url": "https://files.pythonhosted.org/packages/8d/47/2106398c28d6f4346b6ec84cb092bb00b4d50a3b03653328d53e4ce1ac30/gcs-oauth2-boto-plugin-3.2.tar.gz" + } + ], + "project_name": "gcs-oauth2-boto-plugin", + "requires_dists": [ + "boto>=2.29.1", + "freezegun; extra == \"dev\"", + "google-auth-httplib2>=0.2.0", + "google-auth==2.17.0", + "google-reauth>=0.1.0", + "httplib2>=0.18", + "mock; python_version < \"3.3\" and extra == \"dev\"", + "oauth2client>=2.2.0", + "pyOpenSSL>=0.13", + "retry-decorator>=1.0.0", + "rsa==4.7.2", + "six>=1.12.0" + ], + "requires_python": null, + "version": "3.2" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "81a3407ddd2ee8df444cbacea00e2d038e40150acfa3001696fe0dcf1d3adfa4", + "url": "https://files.pythonhosted.org/packages/fd/5b/8f0c4a5bb9fd491c277c21eff7ccae71b47d43c4446c9d0c6cff2fe8c2c4/gitdb-4.0.11-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "bf5421126136d6d0af55bc1e7c1af1c397a34f5b7bd79e776cd3e89785c2b04b", + "url": "https://files.pythonhosted.org/packages/19/0d/bbb5b5ee188dec84647a4664f3e11b06ade2bde568dbd489d9d64adef8ed/gitdb-4.0.11.tar.gz" + } + ], + "project_name": "gitdb", + "requires_dists": [ + "smmap<6,>=3.0.1" + ], + "requires_python": ">=3.7", + "version": "4.0.11" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "eec7ec56b92aad751f9912a73404bc02ba212a23adb2c7098ee668417051a1ff", + "url": "https://files.pythonhosted.org/packages/e9/bd/cc3a402a6439c15c3d4294333e13042b915bbeab54edc457c723931fed3f/GitPython-3.1.43-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "35f314a9f878467f5453cc1fee295c3e18e52f1b99f10f6cf5b1682e968a9e7c", + "url": "https://files.pythonhosted.org/packages/b6/a1/106fd9fa2dd989b6fb36e5893961f82992cf676381707253e0bf93eb1662/GitPython-3.1.43.tar.gz" + } + ], + "project_name": "gitpython", + "requires_dists": [ + "coverage[toml]; extra == \"test\"", + "ddt!=1.4.3,>=1.1.1; extra == \"test\"", + "gitdb<5,>=4.0.1", + "mock; python_version < \"3.8\" and extra == \"test\"", + "mypy; extra == \"test\"", + "pre-commit; extra == \"test\"", + "pytest-cov; extra == \"test\"", + "pytest-instafail; extra == \"test\"", + "pytest-mock; extra == \"test\"", + "pytest-sugar; extra == \"test\"", + "pytest>=7.3.1; extra == \"test\"", + "sphinx-autodoc-typehints; extra == \"doc\"", + "sphinx-rtd-theme; extra == \"doc\"", + "sphinx==4.3.2; extra == \"doc\"", + "sphinxcontrib-applehelp<=1.0.4,>=1.0.2; extra == \"doc\"", + "sphinxcontrib-devhelp==1.0.2; extra == \"doc\"", + "sphinxcontrib-htmlhelp<=2.0.1,>=2.0.0; extra == \"doc\"", + "sphinxcontrib-qthelp==1.0.3; extra == \"doc\"", + "sphinxcontrib-serializinghtml==1.1.5; extra == \"doc\"", + "typing-extensions; python_version < \"3.11\" and extra == \"test\"", + "typing-extensions>=3.7.4.3; python_version < \"3.8\"" + ], + "requires_python": ">=3.7", + "version": "3.1.43" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "b78f74116558e0476e19501b5b4b2ac7c93261a69c5449c861ea95cbc853c688", + "url": "https://files.pythonhosted.org/packages/5e/cb/cb0311f2ec371c83d6510847476c665edc9cc97564a51923557bc8f0b680/google_apitools-0.5.32-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "c3763e52289f61e21c41d5531e20fbda9cc8484a088b8686fd460770db8bad13", + "url": "https://files.pythonhosted.org/packages/dc/eb/c26c36463a769a3a9f08847b9bf218cb629ca91877a911bbd6dcf37d9e62/google-apitools-0.5.32.tar.gz" + } + ], + "project_name": "google-apitools", + "requires_dists": [ + "fasteners>=0.14", + "httplib2>=0.8", + "mock>=1.0.1; extra == \"testing\"", + "oauth2client>=1.4.12", + "python-gflags>=3.0.6; extra == \"cli\"", + "six>=1.12.0" + ], + "requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7", + "version": "0.5.32" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "45ba9b4b3e49406de3c5451697820694b2f6ce8a6b75bb187852fdae231dab94", + "url": "https://files.pythonhosted.org/packages/b9/e6/d64f9f31c78fc405e82fdadc4e49b42a642cd3927a60b2fd063acd468a02/google_auth-2.17.0-py2.py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "f51d26ebb3e5d723b9a7dbd310b6c88654ef1ad1fc35750d1fdba48ca4d82f52", + "url": "https://files.pythonhosted.org/packages/e7/7a/85f8b331e6469d7737f083f6d899c8583c3715bafc3b034ad8f3b4afe457/google-auth-2.17.0.tar.gz" + } + ], + "project_name": "google-auth", + "requires_dists": [ + "aiohttp<4.0.0dev,>=3.6.2; python_version >= \"3.6\" and extra == \"aiohttp\"", + "cachetools<6.0,>=2.0.0", + "cryptography==36.0.2; extra == \"enterprise-cert\"", + "cryptography>=38.0.3; extra == \"pyopenssl\"", + "enum34>=1.1.10; python_version < \"3.4\"", + "pyasn1-modules>=0.2.1", + "pyopenssl==22.0.0; extra == \"enterprise-cert\"", + "pyopenssl>=20.0.0; extra == \"pyopenssl\"", + "pyu2f>=0.1.5; extra == \"reauth\"", + "requests<3.0.0dev,>=2.20.0; extra == \"aiohttp\"", + "requests<3.0.0dev,>=2.20.0; extra == \"requests\"", + "rsa<4.6; python_version < \"3.6\"", + "rsa<5,>=3.1.4; python_version >= \"3.6\"", + "six>=1.9.0" + ], + "requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7", + "version": "2.17.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "b65a0a2123300dd71281a7bf6e64d65a0759287df52729bdd1ae2e47dc311a3d", + "url": "https://files.pythonhosted.org/packages/be/8a/fe34d2f3f9470a27b01c9e76226965863f153d5fbe276f83608562e49c04/google_auth_httplib2-0.2.0-py2.py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "38aa7badf48f974f1eb9861794e9c0cb2a0511a4ec0679b1f886d108f5640e05", + "url": "https://files.pythonhosted.org/packages/56/be/217a598a818567b28e859ff087f347475c807a5649296fb5a817c58dacef/google-auth-httplib2-0.2.0.tar.gz" + } + ], + "project_name": "google-auth-httplib2", + "requires_dists": [ + "google-auth", + "httplib2>=0.19.0" + ], + "requires_python": null, + "version": "0.2.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "cb39074488d74c8853074dde47368bbf8f739d4a4338b89aab696c895b6d8368", + "url": "https://files.pythonhosted.org/packages/69/e1/67ffaa3a645b86318ce30717af7145070ebccec5eef5c623ae08b86129b8/google_reauth-0.1.1-py2.py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "f9f6852a55c2c5453d581cd01f3d1278e86147c03d008409800390a834235892", + "url": "https://files.pythonhosted.org/packages/7d/86/74242e08d24ec4c436b8325dabbd7c60422b4829dfb1ad6ec117bdebea76/google-reauth-0.1.1.tar.gz" + } + ], + "project_name": "google-reauth", + "requires_dists": [ + "oauth2client>=2.0.0; extra == \"oauth2client\"", + "pyu2f" + ], + "requires_python": null, + "version": "0.1.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "2981c7365a9353f9b5c864595c510c983251b1ab403e05b1ccc70a3d9541a73b", + "url": "https://files.pythonhosted.org/packages/3f/dd/f3ff5b2ae4f5675132a766ea883f5b3b631fa104ae5b146046e924a5839f/grpcio-1.64.1-cp310-cp310-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "0a2813093ddb27418a4c99f9b1c223fab0b053157176a64cc9db0f4557b69bd9", + "url": "https://files.pythonhosted.org/packages/1b/cb/6c3dada17b6360a235908bb5f9badff83e5ee60c0459ffcf97d3c1590646/grpcio-1.64.1-cp310-cp310-musllinux_1_1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "e7cd5c1325f6808b8ae31657d281aadb2a51ac11ab081ae335f4f7fc44c1721d", + "url": "https://files.pythonhosted.org/packages/5e/3b/459a477de3d899ffd4164d116a0a1db67468465ef5eaa81652f9319c27ab/grpcio-1.64.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "3b64ae304c175671efdaa7ec9ae2cc36996b681eb63ca39c464958396697daff", + "url": "https://files.pythonhosted.org/packages/62/46/2f080ed826b7641220ba1584960f90dd5354d71eb455a1e3e40c0614cd6b/grpcio-1.64.1-cp310-cp310-macosx_12_0_universal2.whl" + }, + { + "algorithm": "sha256", + "hash": "6c024ffc22d6dc59000faf8ad781696d81e8e38f4078cb0f2630b4a3cf231a90", + "url": "https://files.pythonhosted.org/packages/a3/0e/dd710c8033bc9d81c6f9a52e83e5b3ee803dab6c32d92b9abeee4141a860/grpcio-1.64.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "55697ecec192bc3f2f3cc13a295ab670f51de29884ca9ae6cd6247df55df2502", + "url": "https://files.pythonhosted.org/packages/b5/cb/4762ce391ff792f011dc288985b7754cc386bd5cd85e0c0a9486edfb323b/grpcio-1.64.1-cp310-cp310-linux_armv7l.whl" + }, + { + "algorithm": "sha256", + "hash": "bac71b4b28bc9af61efcdc7630b166440bbfbaa80940c9a697271b5e1dabbc61", + "url": "https://files.pythonhosted.org/packages/d8/af/14e95d1bf9e1fdbad332525653cff9fc9c9ed8f19854f8f69665862996b8/grpcio-1.64.1-cp310-cp310-manylinux_2_17_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "8d51dd1c59d5fa0f34266b80a3805ec29a1f26425c2a54736133f6d87fc4968a", + "url": "https://files.pythonhosted.org/packages/f5/9d/662a0c2181b2d7c1ec697ff06ec5ab9c37ed14e7f9e720e16f26443d233a/grpcio-1.64.1.tar.gz" + } + ], + "project_name": "grpcio", + "requires_dists": [ + "grpcio-tools>=1.64.1; extra == \"protobuf\"" + ], + "requires_python": ">=3.8", + "version": "1.64.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "ef29d47764d2a3c2436ce50c4e1827626725ba8dbfd3127b42a18641710e7d38", + "url": "https://files.pythonhosted.org/packages/11/a4/eb6bd231662c4a8c2b59576220c39d3db82cb294236d179869b759804b6f/gsutil-5.30.tar.gz" + } + ], + "project_name": "gsutil", + "requires_dists": [ + "argcomplete>=1.9.4", + "crcmod>=1.7", + "fasteners>=0.14.1", + "gcs-oauth2-boto-plugin>=3.2", + "google-apitools>=0.5.32", + "google-auth-httplib2>=0.2.0", + "google-auth[aiohttp]==2.17.0", + "google-reauth>=0.1.0", + "httplib2==0.20.4", + "mock<=3.0.5,>=2.0.0; python_version < \"3.3\"", + "monotonic>=1.4", + "pyOpenSSL>=0.13", + "retry-decorator>=1.0.0", + "six>=1.16.0" + ], + "requires_python": "!=2.*,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,<4", + "version": "5.30" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "61c3384b5575985bb7f85e43213bcb40f36fcdff388cae6bc229304c71f2843e", + "url": "https://files.pythonhosted.org/packages/a8/4d/3cbfd81ed84db450dbe73a89afcd8bc405273918415649ac6683356afe92/gymnasium-0.29.1-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "1a532752efcb7590478b1cc7aa04f608eb7a2fdad5570cd217b66b6a35274bb1", + "url": "https://files.pythonhosted.org/packages/0d/f8/5699ddb3e1c4f6d97b8930e573074849b921da8374fccd141f0f3a9bd713/gymnasium-0.29.1.tar.gz" + } + ], + "project_name": "gymnasium", + "requires_dists": [ + "autorom[accept-rom-license]~=0.4.2; extra == \"accept-rom-license\"", + "box2d-py==2.3.5; extra == \"all\"", + "box2d-py==2.3.5; extra == \"box2d\"", + "cloudpickle>=1.2.0", + "cython<3; extra == \"all\"", + "cython<3; extra == \"mujoco-py\"", + "cython<3; extra == \"mujoco-py\"", + "farama-notifications>=0.0.1", + "imageio>=2.14.1; extra == \"all\"", + "imageio>=2.14.1; extra == \"mujoco\"", + "importlib-metadata>=4.8.0; python_version < \"3.10\"", + "jax>=0.4.0; extra == \"all\"", + "jax>=0.4.0; extra == \"jax\"", + "jaxlib>=0.4.0; extra == \"all\"", + "jaxlib>=0.4.0; extra == \"jax\"", + "lz4>=3.1.0; extra == \"all\"", + "lz4>=3.1.0; extra == \"other\"", + "matplotlib>=3.0; extra == \"all\"", + "matplotlib>=3.0; extra == \"other\"", + "moviepy>=1.0.0; extra == \"all\"", + "moviepy>=1.0.0; extra == \"other\"", + "mujoco-py<2.2,>=2.1; extra == \"all\"", + "mujoco-py<2.2,>=2.1; extra == \"mujoco-py\"", + "mujoco-py<2.2,>=2.1; extra == \"mujoco-py\"", + "mujoco>=2.3.3; extra == \"all\"", + "mujoco>=2.3.3; extra == \"mujoco\"", + "numpy>=1.21.0", + "opencv-python>=3.0; extra == \"all\"", + "opencv-python>=3.0; extra == \"other\"", + "pygame>=2.1.3; extra == \"all\"", + "pygame>=2.1.3; extra == \"box2d\"", + "pygame>=2.1.3; extra == \"classic-control\"", + "pygame>=2.1.3; extra == \"classic-control\"", + "pygame>=2.1.3; extra == \"toy-text\"", + "pygame>=2.1.3; extra == \"toy-text\"", + "pytest==7.1.3; extra == \"testing\"", + "scipy>=1.7.3; extra == \"testing\"", + "shimmy[atari]<1.0,>=0.1.0; extra == \"all\"", + "shimmy[atari]<1.0,>=0.1.0; extra == \"atari\"", + "swig==4.*; extra == \"all\"", + "swig==4.*; extra == \"box2d\"", + "torch>=1.0.0; extra == \"all\"", + "torch>=1.0.0; extra == \"other\"", + "typing-extensions>=4.3.0" + ], + "requires_python": ">=3.8", + "version": "0.29.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "8b6a905cb1c79eefd03f8669fd993c36dc341f7c558f056cb5a33b5c2f458543", + "url": "https://files.pythonhosted.org/packages/59/0f/29725a9caf4b2618f524e0f28e2bda91aca8f880123ec77426ede6ea1ea4/httplib2-0.20.4-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "58a98e45b4b1a48273073f905d2961666ecf0fbac4250ea5b47aef259eb5c585", + "url": "https://files.pythonhosted.org/packages/9c/65/57ad964eb8d45cc3d1316ce5ada2632f74e35863a0e57a52398416a182a1/httplib2-0.20.4.tar.gz" + } + ], + "project_name": "httplib2", + "requires_dists": [ + "pyparsing!=3.0.0,!=3.0.1,!=3.0.2,!=3.0.3,<4,>=2.4.2; python_version > \"3.0\"", + "pyparsing<3,>=2.4.2; python_version < \"3.0\"" + ], + "requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7", + "version": "0.20.4" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0", + "url": "https://files.pythonhosted.org/packages/e5/3e/741d8c82801c347547f8a2a06aa57dbb1992be9e948df2ea0eda2c8b79e8/idna-3.7-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc", + "url": "https://files.pythonhosted.org/packages/21/ed/f86a79a07470cb07819390452f178b3bef1d375f2ec021ecfc709fc7cf07/idna-3.7.tar.gz" + } + ], + "project_name": "idna", + "requires_dists": [], + "requires_python": ">=3.5", + "version": "3.7" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374", + "url": "https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", + "url": "https://files.pythonhosted.org/packages/d7/4b/cbd8e699e64a6f16ca3a8220661b5f83792b3017d0f79807cb8708d33913/iniconfig-2.0.0.tar.gz" + } + ], + "project_name": "iniconfig", + "requires_dists": [], + "requires_python": ">=3.7", + "version": "2.0.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "48f276f4d8cfb8ce6527c8f79e2ee29708508bf4d40aa410fbc3b4ee832c850f", + "url": "https://files.pythonhosted.org/packages/fc/b3/0c0c994fe49cd661084f8d5dc06562af53818cc0abefaca35bdc894577c3/Markdown-3.6-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "ed4f41f6daecbeeb96e576ce414c41d2d876daa9a16cb35fa8ed8c2ddfad0224", + "url": "https://files.pythonhosted.org/packages/22/02/4785861427848cc11e452cc62bb541006a1087cf04a1de83aedd5530b948/Markdown-3.6.tar.gz" + } + ], + "project_name": "markdown", + "requires_dists": [ + "coverage; extra == \"testing\"", + "importlib-metadata>=4.4; python_version < \"3.10\"", + "mdx-gh-links>=0.2; extra == \"docs\"", + "mkdocs-gen-files; extra == \"docs\"", + "mkdocs-literate-nav; extra == \"docs\"", + "mkdocs-nature>=0.6; extra == \"docs\"", + "mkdocs-section-index; extra == \"docs\"", + "mkdocs>=1.5; extra == \"docs\"", + "mkdocstrings[python]; extra == \"docs\"", + "pyyaml; extra == \"testing\"" + ], + "requires_python": ">=3.8", + "version": "3.6" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd", + "url": "https://files.pythonhosted.org/packages/30/39/8d845dd7d0b0613d86e0ef89549bfb5f61ed781f59af45fc96496e897f3a/MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46", + "url": "https://files.pythonhosted.org/packages/0a/7b/85681ae3c33c385b10ac0f8dd025c30af83c78cec1c37a6aa3b55e67f5ec/MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900", + "url": "https://files.pythonhosted.org/packages/29/fe/a36ba8c7ca55621620b2d7c585313efd10729e63ef81e4e61f52330da781/MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff", + "url": "https://files.pythonhosted.org/packages/60/ae/9c60231cdfda003434e8bd27282b1f4e197ad5a710c14bee8bea8a9ca4f0/MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad", + "url": "https://files.pythonhosted.org/packages/65/dc/1510be4d179869f5dafe071aecb3f1f41b45d37c02329dfba01ff59e5ac5/MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5", + "url": "https://files.pythonhosted.org/packages/6a/4a/a4d49415e600bacae038c67f9fecc1d5433b9d3c71a4de6f33537b89654c/MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f", + "url": "https://files.pythonhosted.org/packages/7c/52/2b1b570f6b8b803cef5ac28fdf78c0da318916c7d2fe9402a84d591b394c/MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b", + "url": "https://files.pythonhosted.org/packages/87/5b/aae44c6655f3801e81aa3eef09dbbf012431987ba564d7231722f68df02d/MarkupSafe-2.1.5.tar.gz" + }, + { + "algorithm": "sha256", + "hash": "a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc", + "url": "https://files.pythonhosted.org/packages/e4/54/ad5eb37bf9d51800010a74e4665425831a9db4e7c4e0fde4352e391e808e/MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl" + } + ], + "project_name": "markupsafe", + "requires_dists": [], + "requires_python": ">=3.7", + "version": "2.1.5" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "68687e19a14f11f26d140dd5c86f3dba4bf5df58003000ed467e0e2a69bca96c", + "url": "https://files.pythonhosted.org/packages/9a/67/7e8406a29b6c45be7af7740456f7f37025f0506ae2e05fb9009a53946860/monotonic-1.6-py2.py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "3a55207bcfed53ddd5c5bae174524062935efed17792e9de2ad0205ce9ad63f7", + "url": "https://files.pythonhosted.org/packages/ea/ca/8e91948b782ddfbd194f323e7e7d9ba12e5877addf04fb2bf8fca38e86ac/monotonic-1.6.tar.gz" + } + ], + "project_name": "monotonic", + "requires_dists": [], + "requires_python": null, + "version": "1.6" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7", + "url": "https://files.pythonhosted.org/packages/fa/a2/17e1e23c6be0a916219c5292f509360c345b5fa6beeb50d743203c27532c/multidict-6.0.5-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "fe5d7785250541f7f5019ab9cba2c71169dc7d74d0f45253f8313f436458a4ef", + "url": "https://files.pythonhosted.org/packages/11/b7/bef33e84e3722bc42531af020d7ae8c31235ce8846bacaa852b6484cf868/multidict-6.0.5-cp310-cp310-musllinux_1_1_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "6939c95381e003f54cd4c5516740faba40cf5ad3eeff460c3ad1d3e0ea2549bf", + "url": "https://files.pythonhosted.org/packages/12/4d/99dfc36872dcc53956879f5da80a6505bbd29214cce90ce792a86e15fddf/multidict-6.0.5-cp310-cp310-musllinux_1_1_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "c1c1496e73051918fcd4f58ff2e0f2f3066d1c76a0c6aeffd9b45d53243702cc", + "url": "https://files.pythonhosted.org/packages/26/ce/f745a2d6104e56f7fa0d7d0756bb9ed27b771dd7b8d9d7348cd7f0f7b9de/multidict-6.0.5-cp310-cp310-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "21fd81c4ebdb4f214161be351eb5bcf385426bf023041da2fd9e60681f3cebae", + "url": "https://files.pythonhosted.org/packages/33/62/2c9085e571318d51212a6914566fe41dd0e33d7f268f7e2f23dcd3f06c56/multidict-6.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "7c6390cf87ff6234643428991b7359b5f59cc15155695deb4eda5c777d2b880f", + "url": "https://files.pythonhosted.org/packages/36/6d/d2f982fb485175727a193b4900b5f929d461e7aa87d6fb5a91a377fcc9c0/multidict-6.0.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "215ed703caf15f578dca76ee6f6b21b7603791ae090fbf1ef9d865571039ade5", + "url": "https://files.pythonhosted.org/packages/8d/ea/0230b6faa9a5bc10650fd50afcc4a86e6c37af2fe05bc679b74d79253732/multidict-6.0.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "411bf8515f3be9813d06004cac41ccf7d1cd46dfe233705933dd163b60e37600", + "url": "https://files.pythonhosted.org/packages/a4/eb/d8e7693c9064554a1585698d1902839440c6c695b0f53c9a8be5d9d4a3b8/multidict-6.0.5-cp310-cp310-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "228b644ae063c10e7f324ab1ab6b548bdf6f8b47f3ec234fef1093bc2735e5f9", + "url": "https://files.pythonhosted.org/packages/b7/36/48097b96135017ed1b806c5ea27b6cdc2ed3a6861c5372b793563206c586/multidict-6.0.5-cp310-cp310-macosx_10_9_universal2.whl" + }, + { + "algorithm": "sha256", + "hash": "766c8f7511df26d9f11cd3a8be623e59cca73d44643abab3f8c8c07620524e4a", + "url": "https://files.pythonhosted.org/packages/bc/84/9579004267e1cc5968ef2ef8718dab9d8950d99354d85b739dd67b09c273/multidict-6.0.5-cp310-cp310-musllinux_1_1_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "220dd781e3f7af2c2c1053da9fa96d9cf3072ca58f057f4c5adaaa1cab8fc442", + "url": "https://files.pythonhosted.org/packages/c2/5c/1e76b2c742cb9e0248d1e8c4ed420817879230c833fa27d890b5fd22290b/multidict-6.0.5-cp310-cp310-musllinux_1_1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "3cc2ad10255f903656017363cd59436f2111443a76f996584d1077e43ee51182", + "url": "https://files.pythonhosted.org/packages/ce/e2/88cdfeaf03eab3498f688a19b62ca704d371cd904cb74b682541ca7b20a7/multidict-6.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "896ebdcf62683551312c30e20614305f53125750803b614e9e6ce74a96232604", + "url": "https://files.pythonhosted.org/packages/d9/48/037440edb5d4a1c65e002925b2f24071d6c27754e6f4734f63037e3169d6/multidict-6.0.5-cp310-cp310-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "1d147090048129ce3c453f0292e7697d333db95e52616b3793922945804a433c", + "url": "https://files.pythonhosted.org/packages/f3/7d/fe7648d4b2f200f8854066ce6e56bf51889abfaf859814c62160dd0e32a9/multidict-6.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da", + "url": "https://files.pythonhosted.org/packages/f9/79/722ca999a3a09a63b35aac12ec27dfa8e5bb3a38b0f857f7a1a209a88836/multidict-6.0.5.tar.gz" + } + ], + "project_name": "multidict", + "requires_dists": [], + "requires_python": ">=3.7", + "version": "6.0.5" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "5e05b1c973a9f858c74367553e236f287e749465f773328c8ef31abe18f691e1", + "url": "https://files.pythonhosted.org/packages/e4/f3/679b3a042a127de0d7c84874913c3e23bb84646eb3bc6ecab3f8c872edc9/numpy-1.23.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "9c88793f78fca17da0145455f0d7826bcb9f37da4764af27ac945488116efe63", + "url": "https://files.pythonhosted.org/packages/0f/ae/dad4b8e7c65494cbbd1c063de114efaf9acd0f5f6171f044f0d4b6299787/numpy-1.23.5-cp310-cp310-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "1b1766d6f397c18153d40015ddfc79ddb715cabadc04d2d228d4e5a8bc4ded1a", + "url": "https://files.pythonhosted.org/packages/42/38/775b43da55fa7473015eddc9a819571517d9a271a9f8134f68fb9be2f212/numpy-1.23.5.tar.gz" + }, + { + "algorithm": "sha256", + "hash": "e9f4c4e51567b616be64e05d517c79a8a22f3606499941d97bb76f2ca59f982d", + "url": "https://files.pythonhosted.org/packages/4d/39/d33202cc56c21123a50c6d5e160d00c18ff685ab864dbd4bf80dd40a7af9/numpy-1.23.5-cp310-cp310-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "7903ba8ab592b82014713c491f6c5d3a1cde5b4a3bf116404e08f5b52f6daf43", + "url": "https://files.pythonhosted.org/packages/67/6b/d7c93d458d16464da9b3f560a20c363a19e242ebbb019bd1e1d797523851/numpy-1.23.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + } + ], + "project_name": "numpy", + "requires_dists": [], + "requires_python": ">=3.8", + "version": "1.23.5" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "b8a81cc5d60e2d364f0b1b98f958dbd472887acaf1a5b05e21c28c31a2d6d3ac", + "url": "https://files.pythonhosted.org/packages/95/a9/4f25a14d23f0786b64875b91784607c2277eff25d48f915e39ff0cff505a/oauth2client-4.1.3-py2.py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "d486741e451287f69568a4d26d70d9acd73a2bbfa275746c535b4209891cccc6", + "url": "https://files.pythonhosted.org/packages/a6/7b/17244b1083e8e604bf154cf9b716aecd6388acd656dd01893d0d244c94d9/oauth2client-4.1.3.tar.gz" + } + ], + "project_name": "oauth2client", + "requires_dists": [ + "httplib2>=0.9.1", + "pyasn1-modules>=0.0.5", + "pyasn1>=0.1.7", + "rsa>=3.1.4", + "six>=1.6.1" + ], + "requires_python": null, + "version": "4.1.3" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "6251910e554f811fdd070164b0bc76d76b067b95576cb9dad4d52ae64fe014b5", + "url": "https://files.pythonhosted.org/packages/c6/7e/5031717c0636e6074764a2f61a459a3ecd46c20d8b83a1f1cd2513a76160/onnx-1.16.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "15abf94a7868eed6db15a8b5024ba570c891cae77ca4d0e7258dabdad76980df", + "url": "https://files.pythonhosted.org/packages/36/16/07a819f1139a75e67b0b31e1474e5770d1e7c93b69744c6f7434415a9f65/onnx-1.16.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "8299193f0f2a3849bfc069641aa8e4f93696602da8d165632af8ee48ec7556b6", + "url": "https://files.pythonhosted.org/packages/74/be/242d02ebf7fe115bd695166eeea58b2206c9fa62de22cf9cbf8986fa8d27/onnx-1.16.1.tar.gz" + }, + { + "algorithm": "sha256", + "hash": "bb2d392e5b7060082c2fb38eb5c44f67eb34ff5f0681bd6f45beff9abc6f7094", + "url": "https://files.pythonhosted.org/packages/7d/bf/810fe3215735ff55a2b65d0430ba9782b70916d67554d9c2c58cebeace45/onnx-1.16.1-cp310-cp310-macosx_11_0_universal2.whl" + } + ], + "project_name": "onnx", + "requires_dists": [ + "Pillow; extra == \"reference\"", + "google-re2; extra == \"reference\"", + "numpy>=1.20", + "protobuf>=3.20.2" + ], + "requires_python": ">=3.8", + "version": "1.16.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "9ace140fc6d647fbe1c692bcb2abce768973491222c067c131d80957c595b71f", + "url": "https://files.pythonhosted.org/packages/3f/a4/d2537f47fd7fcfba966bd806e3ec18e7ee1681056d4b0a9c8d983983e4d5/opencv_python-4.10.0.84-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "72d234e4582e9658ffea8e9cae5b63d488ad06994ef12d81dc303b17472f3526", + "url": "https://files.pythonhosted.org/packages/4a/e7/b70a2d9ab205110d715906fc8ec83fbb00404aeb3a37a0654fdb68eb0c8c/opencv-python-4.10.0.84.tar.gz" + }, + { + "algorithm": "sha256", + "hash": "71e575744f1d23f79741450254660442785f45a0797212852ee5199ef12eed98", + "url": "https://files.pythonhosted.org/packages/64/4a/016cda9ad7cf18c58ba074628a4eaae8aa55f3fd06a266398cef8831a5b9/opencv_python-4.10.0.84-cp37-abi3-macosx_12_0_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "fc182f8f4cda51b45f01c64e4cbedfc2f00aff799debebc305d8d0210c43f251", + "url": "https://files.pythonhosted.org/packages/66/82/564168a349148298aca281e342551404ef5521f33fba17b388ead0a84dc5/opencv_python-4.10.0.84-cp37-abi3-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "09a332b50488e2dda866a6c5573ee192fe3583239fb26ff2f7f9ceb0bc119ea6", + "url": "https://files.pythonhosted.org/packages/81/e4/7a987ebecfe5ceaf32db413b67ff18eb3092c598408862fff4d7cc3fd19b/opencv_python-4.10.0.84-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + } + ], + "project_name": "opencv-python", + "requires_dists": [ + "numpy>=1.13.3; python_version < \"3.7\"", + "numpy>=1.17.0; python_version >= \"3.7\"", + "numpy>=1.17.3; python_version >= \"3.8\"", + "numpy>=1.19.3; python_version >= \"3.6\" and platform_system == \"Linux\" and platform_machine == \"aarch64\"", + "numpy>=1.19.3; python_version >= \"3.9\"", + "numpy>=1.21.0; python_version <= \"3.9\" and platform_system == \"Darwin\" and platform_machine == \"arm64\"", + "numpy>=1.21.2; python_version >= \"3.10\"", + "numpy>=1.21.4; python_version >= \"3.10\" and platform_system == \"Darwin\"", + "numpy>=1.23.5; python_version >= \"3.11\"", + "numpy>=1.26.0; python_version >= \"3.12\"" + ], + "requires_python": ">=3.6", + "version": "4.10.0.84" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124", + "url": "https://files.pythonhosted.org/packages/08/aa/cc0199a5f0ad350994d660967a8efb233fe0416e4639146c089643407ce6/packaging-24.1-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002", + "url": "https://files.pythonhosted.org/packages/51/65/50db4dda066951078f0a96cf12f4b9ada6e4b811516bf0262c0f4f7064d4/packaging-24.1.tar.gz" + } + ], + "project_name": "packaging", + "requires_dists": [], + "requires_python": ">=3.8", + "version": "24.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee", + "url": "https://files.pythonhosted.org/packages/68/13/2aa1f0e1364feb2c9ef45302f387ac0bd81484e9c9a4c5688a322fbdfd08/platformdirs-4.2.2-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3", + "url": "https://files.pythonhosted.org/packages/f5/52/0763d1d976d5c262df53ddda8d8d4719eedf9594d046f117c25a27261a19/platformdirs-4.2.2.tar.gz" + } + ], + "project_name": "platformdirs", + "requires_dists": [ + "appdirs==1.4.4; extra == \"test\"", + "covdefaults>=2.3; extra == \"test\"", + "furo>=2023.9.10; extra == \"docs\"", + "mypy>=1.8; extra == \"type\"", + "proselint>=0.13; extra == \"docs\"", + "pytest-cov>=4.1; extra == \"test\"", + "pytest-mock>=3.12; extra == \"test\"", + "pytest>=7.4.3; extra == \"test\"", + "sphinx-autodoc-typehints>=1.25.2; extra == \"docs\"", + "sphinx>=7.2.6; extra == \"docs\"" + ], + "requires_python": ">=3.8", + "version": "4.2.2" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", + "url": "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", + "url": "https://files.pythonhosted.org/packages/96/2d/02d4312c973c6050a18b314a5ad0b3210edb65a906f868e31c111dede4a6/pluggy-1.5.0.tar.gz" + } + ], + "project_name": "pluggy", + "requires_dists": [ + "pre-commit; extra == \"dev\"", + "pytest-benchmark; extra == \"testing\"", + "pytest; extra == \"testing\"", + "tox; extra == \"dev\"" + ], + "requires_python": ">=3.8", + "version": "1.5.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "f0700d54bcf45424477e46a9f0944155b46fb0639d69728739c0e47bab83f2b9", + "url": "https://files.pythonhosted.org/packages/f4/d5/db585a5e8d64af6b384c7b3a63da13df2ff86933e486ba78431736c67c25/protobuf-4.25.3-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "7c8daa26095f82482307bc717364e7c13f4f1c99659be82890dcfc215194554d", + "url": "https://files.pythonhosted.org/packages/15/db/7f731524fe0e56c6b2eb57d05b55d3badd80ef7d1f1ed59db191b2fdd8ab/protobuf-4.25.3-cp37-abi3-manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "25b5d0b42fd000320bd7830b349e3b696435f3b329810427a6bcce6a5492cc5c", + "url": "https://files.pythonhosted.org/packages/5e/d8/65adb47d921ce828ba319d6587aa8758da022de509c3862a70177a958844/protobuf-4.25.3.tar.gz" + }, + { + "algorithm": "sha256", + "hash": "e7cb0ae90dd83727f0c0718634ed56837bfeeee29a5f82a7514c03ee1364c019", + "url": "https://files.pythonhosted.org/packages/d8/82/aefe901174b5a618daee511ddd00342193c1b545e3cd6a2cd6df9ba452b5/protobuf-4.25.3-cp37-abi3-manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "f1279ab38ecbfae7e456a108c5c0681e4956d5b1090027c1de0f934dfdb4b35c", + "url": "https://files.pythonhosted.org/packages/f3/bf/26deba06a4c910a85f78245cac7698f67cedd7efe00d04f6b3e1b3506a59/protobuf-4.25.3-cp37-abi3-macosx_10_9_universal2.whl" + } + ], + "project_name": "protobuf", + "requires_dists": [], + "requires_python": ">=3.8", + "version": "4.25.3" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "ffe7fc9b6b36beadc8c322f84e1caff51e8703b88eee1da46d1e3a6ae11b4fd0", + "url": "https://files.pythonhosted.org/packages/7c/06/63872a64c312a24fb9b4af123ee7007a306617da63ff13bcc1432386ead7/psutil-6.0.0-cp38-abi3-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "c588a7e9b1173b6e866756dde596fd4cad94f9399daf99ad8c3258b3cb2b47a0", + "url": "https://files.pythonhosted.org/packages/0b/37/f8da2fbd29690b3557cca414c1949f92162981920699cd62095a984983bf/psutil-6.0.0-cp36-abi3-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "8faae4f310b6d969fa26ca0545338b21f73c6b15db7c4a8d934a5482faa818f2", + "url": "https://files.pythonhosted.org/packages/18/c7/8c6872f7372eb6a6b2e4708b88419fb46b857f7a2e1892966b851cc79fc9/psutil-6.0.0.tar.gz" + }, + { + "algorithm": "sha256", + "hash": "5fd9a97c8e94059b0ef54a7d4baf13b405011176c3b6ff257c247cae0d560ecd", + "url": "https://files.pythonhosted.org/packages/19/74/f59e7e0d392bc1070e9a70e2f9190d652487ac115bb16e2eff6b22ad1d24/psutil-6.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "6ed2440ada7ef7d0d608f20ad89a04ec47d2d3ab7190896cd62ca5fc4fe08bf0", + "url": "https://files.pythonhosted.org/packages/35/56/72f86175e81c656a01c4401cd3b1c923f891b31fbcebe98985894176d7c9/psutil-6.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "e2e8d0054fc88153ca0544f5c4d554d42e33df2e009c4ff42284ac9ebdef4132", + "url": "https://files.pythonhosted.org/packages/cd/5f/60038e277ff0a9cc8f0c9ea3d0c5eb6ee1d2470ea3f9389d776432888e47/psutil-6.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + } + ], + "project_name": "psutil", + "requires_dists": [ + "enum34; python_version <= \"3.4\" and extra == \"test\"", + "ipaddress; python_version < \"3.0\" and extra == \"test\"", + "mock; python_version < \"3.0\" and extra == \"test\"", + "pywin32; sys_platform == \"win32\" and extra == \"test\"", + "wmi; sys_platform == \"win32\" and extra == \"test\"" + ], + "requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7", + "version": "6.0.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378", + "url": "https://files.pythonhosted.org/packages/f6/f0/10642828a8dfb741e5f3fbaac830550a518a775c7fff6f04a007259b0548/py-1.11.0-py2.py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719", + "url": "https://files.pythonhosted.org/packages/98/ff/fec109ceb715d2a6b4c4a85a61af3b40c723a961e8828319fbcb15b868dc/py-1.11.0.tar.gz" + } + ], + "project_name": "py", + "requires_dists": [], + "requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7", + "version": "1.11.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "859625bc251f64e21f077d099d4162689c762b5d6a4c3c97553d56241c9674d5", + "url": "https://files.pythonhosted.org/packages/e0/a9/023730ba63db1e494a271cb018dcd361bd2c917ba7004c3e49d5daf795a2/py_cpuinfo-9.0.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "3cdbbf3fac90dc6f118bfd64384f309edeadd902d7c8fb17f02ffa1fc3f49690", + "url": "https://files.pythonhosted.org/packages/37/a8/d832f7293ebb21690860d2e01d8115e5ff6f2ae8bbdc953f0eb0fa4bd2c7/py-cpuinfo-9.0.0.tar.gz" + } + ], + "project_name": "py-cpuinfo", + "requires_dists": [], + "requires_python": null, + "version": "9.0.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "cca4bb0f2df5504f02f6f8a775b6e416ff9b0b3b16f7ee80b5a3153d9b804473", + "url": "https://files.pythonhosted.org/packages/23/7e/5f50d07d5e70a2addbccd90ac2950f81d1edd0783630651d9268d7f1db49/pyasn1-0.6.0-py2.py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "3a35ab2c4b5ef98e17dfdec8ab074046fbda76e281c5a706ccd82328cfc8f64c", + "url": "https://files.pythonhosted.org/packages/4a/a3/d2157f333900747f20984553aca98008b6dc843eb62f3a36030140ccec0d/pyasn1-0.6.0.tar.gz" + } + ], + "project_name": "pyasn1", + "requires_dists": [], + "requires_python": ">=3.8", + "version": "0.6.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "be04f15b66c206eed667e0bb5ab27e2b1855ea54a842e5037738099e8ca4ae0b", + "url": "https://files.pythonhosted.org/packages/13/68/8906226b15ef38e71dc926c321d2fe99de8048e9098b5dfd38343011c886/pyasn1_modules-0.4.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "831dbcea1b177b28c9baddf4c6d1013c24c3accd14a1873fffaa6a2e905f17b6", + "url": "https://files.pythonhosted.org/packages/f7/00/e7bd1dec10667e3f2be602686537969a7ac92b0a7c5165be2e5875dc3971/pyasn1_modules-0.4.0.tar.gz" + } + ], + "project_name": "pyasn1-modules", + "requires_dists": [ + "pyasn1<0.7.0,>=0.4.6" + ], + "requires_python": ">=3.8", + "version": "0.4.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", + "url": "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", + "url": "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz" + } + ], + "project_name": "pycparser", + "requires_dists": [], + "requires_python": ">=3.8", + "version": "2.22" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "7d65fb222eea1294cfc8206d9e5754d476a1673eb2783c03c4f70e0455320274", + "url": "https://files.pythonhosted.org/packages/83/59/5b05cb1bff0c2341e01733b9c341eea8f1cc9cc893c8c429437bd90ee8bd/pygame-2.6.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "e5707aa9d029752495b3eddc1edff62e0e390a02f699b0f1ce77fe0b8c70ea4f", + "url": "https://files.pythonhosted.org/packages/2f/1c/e515c10196aed75dbef75b41ff3069897c9405f568169694a3b3f8fc0f4c/pygame-2.6.0-cp310-cp310-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "89be55b7e9e22e0eea08af9d6cfb97aed5da780f0b3a035803437d481a16d972", + "url": "https://files.pythonhosted.org/packages/4b/aa/2e9c10266df048f186ad86ec543fc788e13f99f1b8ccf6d47658f26d0b79/pygame-2.6.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "722d33ae676aa8533c1f955eded966411298831346b8d51a77dad22e46ba3e35", + "url": "https://files.pythonhosted.org/packages/72/49/bd2fcbadb6a55bb24284bad4f530189401c99ffc234d51ba54756a776eb2/pygame-2.6.0.tar.gz" + }, + { + "algorithm": "sha256", + "hash": "6050f3e95f1f16602153d616b52619c6a2041cee7040eb529f65689e9633fc3e", + "url": "https://files.pythonhosted.org/packages/7c/c8/be72ca148131b3eef3851245e2f081abadf634feffe33edea3c9f619f1ef/pygame-2.6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "d3ed0547368733b854c0d9981c982a3cdfabfa01b477d095c57bf47f2199da44", + "url": "https://files.pythonhosted.org/packages/cc/2f/270b3a9c5f1567d91255af15e9f9685d412461115fd96f393777be04b339/pygame-2.6.0-cp310-cp310-macosx_11_0_arm64.whl" + } + ], + "project_name": "pygame", + "requires_dists": [], + "requires_python": ">=3.6", + "version": "2.6.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "17ed5be5936449c5418d1cd269a1a9e9081bc54c17aed272b45856a3d3dc86ad", + "url": "https://files.pythonhosted.org/packages/54/a7/2104f674a5a6845b04c8ff01659becc6b8978ca410b82b94287e0b1e018b/pyOpenSSL-24.1.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "cabed4bfaa5df9f1a16c0ef64a0cb65318b5cd077a7eda7d6970131ca2f41a6f", + "url": "https://files.pythonhosted.org/packages/91/a8/cbeec652549e30103b9e6147ad433405fdd18807ac2d54e6dbb73184d8a1/pyOpenSSL-24.1.0.tar.gz" + } + ], + "project_name": "pyopenssl", + "requires_dists": [ + "cryptography<43,>=41.0.5", + "pretend; extra == \"test\"", + "pytest-rerunfailures; extra == \"test\"", + "pytest>=3.0.1; extra == \"test\"", + "sphinx!=5.2.0,!=5.2.0.post0,!=7.2.5; extra == \"docs\"", + "sphinx-rtd-theme; extra == \"docs\"" + ], + "requires_python": ">=3.7", + "version": "24.1.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742", + "url": "https://files.pythonhosted.org/packages/9d/ea/6d76df31432a0e6fdf81681a895f009a4bb47b3c39036db3e1b528191d52/pyparsing-3.1.2-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad", + "url": "https://files.pythonhosted.org/packages/46/3a/31fd28064d016a2182584d579e033ec95b809d8e220e74c4af6f0f2e8842/pyparsing-3.1.2.tar.gz" + } + ], + "project_name": "pyparsing", + "requires_dists": [ + "jinja2; extra == \"diagrams\"", + "railroad-diagrams; extra == \"diagrams\"" + ], + "requires_python": ">=3.6.8", + "version": "3.1.2" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343", + "url": "https://files.pythonhosted.org/packages/4e/e7/81ebdd666d3bff6670d27349b5053605d83d55548e6bd5711f3b0ae7dd23/pytest-8.2.2-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977", + "url": "https://files.pythonhosted.org/packages/a6/58/e993ca5357553c966b9e73cb3475d9c935fe9488746e13ebdf9b80fae508/pytest-8.2.2.tar.gz" + } + ], + "project_name": "pytest", + "requires_dists": [ + "argcomplete; extra == \"dev\"", + "attrs>=19.2; extra == \"dev\"", + "colorama; sys_platform == \"win32\"", + "exceptiongroup>=1.0.0rc8; python_version < \"3.11\"", + "hypothesis>=3.56; extra == \"dev\"", + "iniconfig", + "mock; extra == \"dev\"", + "packaging", + "pluggy<2.0,>=1.5", + "pygments>=2.7.2; extra == \"dev\"", + "requests; extra == \"dev\"", + "setuptools; extra == \"dev\"", + "tomli>=1; python_version < \"3.11\"", + "xmlschema; extra == \"dev\"" + ], + "requires_python": ">=3.8", + "version": "8.2.2" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "fdb7db64e31c8b277dff9850d2a2556d8b60bcb0ea6524e36e28ffd7c87f71d6", + "url": "https://files.pythonhosted.org/packages/4d/a1/3b70862b5b3f830f0422844f25a823d0470739d994466be9dbbbb414d85a/pytest_benchmark-4.0.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "fb0785b83efe599a6a956361c0691ae1dbb5318018561af10f3e915caa0048d1", + "url": "https://files.pythonhosted.org/packages/28/08/e6b0067efa9a1f2a1eb3043ecd8a0c48bfeb60d3255006dcc829d72d5da2/pytest-benchmark-4.0.0.tar.gz" + } + ], + "project_name": "pytest-benchmark", + "requires_dists": [ + "aspectlib; extra == \"aspect\"", + "elasticsearch; extra == \"elasticsearch\"", + "pathlib2; python_version < \"3.4\"", + "py-cpuinfo", + "pygal; extra == \"histogram\"", + "pygaljs; extra == \"histogram\"", + "pytest>=3.8", + "statistics; python_version < \"3.4\"" + ], + "requires_python": ">=3.7", + "version": "4.0.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "578d5d15ac4a25e5f961c938b85a05b09fdaae9deef3bb6de9a6e766622ca7a6", + "url": "https://files.pythonhosted.org/packages/20/49/b3e0edec68d81846f519c602ac38af9db86e1e71275528b3e814ae236063/pytest_cov-3.0.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "e7f0f5b1617d2210a2cabc266dfe2f4c75a8d32fb89eafb7ad9d06f6d076d470", + "url": "https://files.pythonhosted.org/packages/61/41/e046526849972555928a6d31c2068410e47a31fb5ab0a77f868596811329/pytest-cov-3.0.0.tar.gz" + } + ], + "project_name": "pytest-cov", + "requires_dists": [ + "coverage[toml]>=5.2.1", + "fields; extra == \"testing\"", + "hunter; extra == \"testing\"", + "process-tests; extra == \"testing\"", + "pytest-xdist; extra == \"testing\"", + "pytest>=4.6", + "six; extra == \"testing\"", + "virtualenv; extra == \"testing\"" + ], + "requires_python": ">=3.6", + "version": "3.0.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "810958f66a91afb1a1e2ae83089d8dc1cd2437ac96b12963042fbb9fb4d16af0", + "url": "https://files.pythonhosted.org/packages/f4/af/9c0bda43e486a3c9bf1e0f876d0f241bc3f229d7d65d09331a0868db9629/pytest_forked-1.6.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "4dafd46a9a600f65d822b8f605133ecf5b3e1941ebb3588e943b4e3eb71a5a3f", + "url": "https://files.pythonhosted.org/packages/8c/c9/93ad2ba2413057ee694884b88cf7467a46c50c438977720aeac26e73fdb7/pytest-forked-1.6.0.tar.gz" + } + ], + "project_name": "pytest-forked", + "requires_dists": [ + "py", + "pytest>=3.10" + ], + "requires_python": ">=3.7", + "version": "1.6.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "b05cb0bcd51a7cd0375bfbeeb3eaeb01fc85665e45b21fc9494a8a19137f4d32", + "url": "https://files.pythonhosted.org/packages/c5/d1/2ef73ee137add043df444fddf1c851b8ca70ab9c7b7f18e18c4c244fec6d/pytest_platform_markers-1.0.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "07ea92669114ba8083b6653995b5a9ab14d57ca16307fd2af22d6f7d295160e4", + "url": "https://files.pythonhosted.org/packages/b3/e7/174a22a8cb4cf4b64456cd799f472bb90206f1ce8d537edbc1d9659689a3/pytest-platform-markers-1.0.0.tar.gz" + } + ], + "project_name": "pytest-platform-markers", + "requires_dists": [ + "pytest>=3.6.0" + ], + "requires_python": null, + "version": "1.0.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "4197bdd2eaeffdbf50b5ea6e7236f47ff0e44d1def8dae08e409f536d84e7b32", + "url": "https://files.pythonhosted.org/packages/dc/e7/e75bd157331aecc190f5f8950d7ea3d2cf56c3c57fb44da70e60b221133f/pytest_rerunfailures-14.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "4a400bcbcd3c7a4ad151ab8afac123d90eca3abe27f98725dc4d9702887d2e92", + "url": "https://files.pythonhosted.org/packages/cc/a4/6de45fe850759e94aa9a55cda807c76245af1941047294df26c851dfb4a9/pytest-rerunfailures-14.0.tar.gz" + } + ], + "project_name": "pytest-rerunfailures", + "requires_dists": [ + "packaging>=17.1", + "pytest>=7.2" + ], + "requires_python": ">=3.8", + "version": "14.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "6fe5c74fec98906deb8f2d2b616b5c782022744978e7bd4695d39c8f42d0ce65", + "url": "https://files.pythonhosted.org/packages/21/08/b1945d4b4986eb1aa10cf84efc5293bba39da80a2f95db3573dd90678408/pytest_xdist-2.5.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "4580deca3ff04ddb2ac53eba39d76cb5dd5edeac050cb6fbc768b0dd712b4edf", + "url": "https://files.pythonhosted.org/packages/5d/43/9dbc32d297d6eae85d6c05dc8e8d3371061bd6cbe56a2f645d9ea4b53d9b/pytest-xdist-2.5.0.tar.gz" + } + ], + "project_name": "pytest-xdist", + "requires_dists": [ + "execnet>=1.1", + "filelock; extra == \"testing\"", + "psutil>=3.0; extra == \"psutil\"", + "pytest-forked", + "pytest>=6.2.0", + "setproctitle; extra == \"setproctitle\"" + ], + "requires_python": ">=3.6", + "version": "2.5.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "a3caa3a11842fc7d5746376f37195e6af5f17c0a15737538bb1cebf656fb306b", + "url": "https://files.pythonhosted.org/packages/29/b5/c1209e6cb77647bc2c9a6a1a953355720f34f3b006b725e303c70f3c0786/pyu2f-0.1.5.tar.gz" + } + ], + "project_name": "pyu2f", + "requires_dists": [ + "six" + ], + "requires_python": null, + "version": "0.1.5" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290", + "url": "https://files.pythonhosted.org/packages/07/91/45dfd0ef821a7f41d9d0136ea3608bb5b1653e42fd56a7970532cb5c003f/PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515", + "url": "https://files.pythonhosted.org/packages/29/61/bf33c6c85c55bc45a29eee3195848ff2d518d84735eb0e2d8cb42e0d285e/PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f", + "url": "https://files.pythonhosted.org/packages/5b/07/10033a403b23405a8fc48975444463d3d10a5c2736b7eb2550b07b367429/PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a", + "url": "https://files.pythonhosted.org/packages/96/06/4beb652c0fe16834032e54f0956443d4cc797fe645527acee59e7deaa0a2/PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d", + "url": "https://files.pythonhosted.org/packages/ba/91/090818dfa62e85181f3ae23dd1e8b7ea7f09684864a900cab72d29c57346/PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43", + "url": "https://files.pythonhosted.org/packages/cd/e5/af35f7ea75cf72f2cd079c95ee16797de7cd71f29ea7c68ae5ce7be1eda0/PyYAML-6.0.1.tar.gz" + }, + { + "algorithm": "sha256", + "hash": "69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938", + "url": "https://files.pythonhosted.org/packages/f1/26/55e4f21db1f72eaef092015d9017c11510e7e6301c62a6cfee91295d13c6/PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + } + ], + "project_name": "pyyaml", + "requires_dists": [], + "requires_python": ">=3.6", + "version": "6.0.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", + "url": "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", + "url": "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz" + } + ], + "project_name": "requests", + "requires_dists": [ + "PySocks!=1.5.7,>=1.5.6; extra == \"socks\"", + "certifi>=2017.4.17", + "chardet<6,>=3.0.2; extra == \"use-chardet-on-py3\"", + "charset-normalizer<4,>=2", + "idna<4,>=2.5", + "urllib3<3,>=1.21.1" + ], + "requires_python": ">=3.8", + "version": "2.32.3" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "e1e8ad02e518fe11073f2ea7d80b6b8be19daa27a60a1838aff7c731ddcf2ebe", + "url": "https://files.pythonhosted.org/packages/6e/e6/bedc75b264cbcbf6e6d0e5071d96d739f540fc09be31744a7a8824c02a8e/retry_decorator-1.1.1.tar.gz" + } + ], + "project_name": "retry-decorator", + "requires_dists": [], + "requires_python": null, + "version": "1.1.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "78f9a9bf4e7be0c5ded4583326e7461e3a3c5aae24073648b4bdfa797d78c9d2", + "url": "https://files.pythonhosted.org/packages/e9/93/0c0f002031f18b53af7a6166103c02b9c0667be528944137cc954ec921b3/rsa-4.7.2-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "9d689e6ca1b3038bc82bf8d23e944b6b6037bc02301a574935b2dd946e0353b9", + "url": "https://files.pythonhosted.org/packages/db/b5/475c45a58650b0580421746504b680cd2db4e81bc941e94ca53785250269/rsa-4.7.2.tar.gz" + } + ], + "project_name": "rsa", + "requires_dists": [ + "pyasn1>=0.1.3" + ], + "requires_python": "<4,>=3.5", + "version": "4.7.2" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "ef1b3d54eb715825657cd4bb3cb42bb4dc85087bac14c56b0fd8c21abd968c9a", + "url": "https://files.pythonhosted.org/packages/90/6a/a7d19d776ba9899c97acb223ceba4080ef9f5de9d7599203ae64b56ed597/sentry_sdk-2.7.1-py2.py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "25006c7e68b75aaa5e6b9c6a420ece22e8d7daec4b7a906ffd3a8607b67c037b", + "url": "https://files.pythonhosted.org/packages/b8/63/310d89868a0dab17f6d7c1f35eba9c304dd06c2a17d0d26905738763b614/sentry_sdk-2.7.1.tar.gz" + } + ], + "project_name": "sentry-sdk", + "requires_dists": [ + "aiohttp>=3.5; extra == \"aiohttp\"", + "anthropic>=0.16; extra == \"anthropic\"", + "apache-beam>=2.12; extra == \"beam\"", + "arq>=0.23; extra == \"arq\"", + "asttokens; extra == \"pure-eval\"", + "asyncpg>=0.23; extra == \"asyncpg\"", + "blinker>=1.1; extra == \"flask\"", + "blinker>=1.1; extra == \"quart\"", + "bottle>=0.12.13; extra == \"bottle\"", + "celery-redbeat>=2; extra == \"celery-redbeat\"", + "celery>=3; extra == \"celery\"", + "certifi", + "chalice>=1.16.0; extra == \"chalice\"", + "clickhouse-driver>=0.2.0; extra == \"clickhouse-driver\"", + "django>=1.8; extra == \"django\"", + "executing; extra == \"pure-eval\"", + "falcon>=1.4; extra == \"falcon\"", + "fastapi>=0.79.0; extra == \"fastapi\"", + "flask>=0.11; extra == \"flask\"", + "grpcio>=1.21.1; extra == \"grpcio\"", + "httpx>=0.16.0; extra == \"httpx\"", + "huey>=2; extra == \"huey\"", + "huggingface-hub>=0.22; extra == \"huggingface-hub\"", + "langchain>=0.0.210; extra == \"langchain\"", + "loguru>=0.5; extra == \"loguru\"", + "markupsafe; extra == \"flask\"", + "openai>=1.0.0; extra == \"openai\"", + "opentelemetry-distro>=0.35b0; extra == \"opentelemetry\"", + "opentelemetry-instrumentation-aio-pika==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-aiohttp-client==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-aiopg==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-asgi==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-asyncio==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-asyncpg==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-aws-lambda==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-boto3sqs==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-boto==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-botocore==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-cassandra==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-celery==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-confluent-kafka==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-dbapi==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-django==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-elasticsearch==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-falcon==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-fastapi==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-flask==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-grpc==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-httpx==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-jinja2==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-kafka-python==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-logging==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-mysql==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-mysqlclient==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-pika==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-psycopg2==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-psycopg==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-pymemcache==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-pymongo==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-pymysql==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-pyramid==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-redis==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-remoulade==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-requests==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-sklearn==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-sqlalchemy==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-sqlite3==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-starlette==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-system-metrics==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-threading==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-tornado==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-tortoiseorm==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-urllib3==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-urllib==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-wsgi==0.46b0; extra == \"opentelemetry-experimental\"", + "protobuf>=3.8.0; extra == \"grpcio\"", + "pure-eval; extra == \"pure-eval\"", + "pymongo>=3.1; extra == \"pymongo\"", + "pyspark>=2.4.4; extra == \"pyspark\"", + "quart>=0.16.1; extra == \"quart\"", + "rq>=0.6; extra == \"rq\"", + "sanic>=0.8; extra == \"sanic\"", + "sqlalchemy>=1.2; extra == \"sqlalchemy\"", + "starlette>=0.19.1; extra == \"starlette\"", + "starlite>=1.48; extra == \"starlite\"", + "tiktoken>=0.3.0; extra == \"openai\"", + "tornado>=6; extra == \"tornado\"", + "urllib3>=1.26.11" + ], + "requires_python": ">=3.6", + "version": "2.7.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "38ae9a02766dad331deb06855fb7a6ca15daea333b3967e214de12cfae8f0ef5", + "url": "https://files.pythonhosted.org/packages/70/1d/3b2249c833c7d52b59ff0602d760df0543dc1e6c272f145b949750edeb01/setproctitle-1.3.3-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "6b9e62ddb3db4b5205c0321dd69a406d8af9ee1693529d144e86bd43bcb4b6c0", + "url": "https://files.pythonhosted.org/packages/24/55/8b369b56007a5a2c7594cdb58cd4a09d7cca65b28483bb5582c6975663f1/setproctitle-1.3.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "9e3b99b338598de0bd6b2643bf8c343cf5ff70db3627af3ca427a5e1a1a90dd9", + "url": "https://files.pythonhosted.org/packages/35/30/ac99ecae8458ba995f85aa3aa911004679b405922e1487b0fba6fe8f4d37/setproctitle-1.3.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "da0d57edd4c95bf221b2ebbaa061e65b1788f1544977288bdf95831b6e44e44d", + "url": "https://files.pythonhosted.org/packages/3d/92/17168f4bb1a695094e93e73a1ef1f7b89953a6d91e8a7699a2c840ba712f/setproctitle-1.3.3-cp310-cp310-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "897a73208da48db41e687225f355ce993167079eda1260ba5e13c4e53be7f754", + "url": "https://files.pythonhosted.org/packages/4f/cc/c51e6371f640a9adbe693ddb89d68596e5a8e4b5e05b4d3c65ec504e2f6d/setproctitle-1.3.3-cp310-cp310-macosx_10_9_universal2.whl" + }, + { + "algorithm": "sha256", + "hash": "9617b676b95adb412bb69645d5b077d664b6882bb0d37bfdafbbb1b999568d85", + "url": "https://files.pythonhosted.org/packages/69/a7/2a77b68c11db87c22350381d6ce022011eb420076790e0e3697153e89458/setproctitle-1.3.3-cp310-cp310-musllinux_1_1_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "fc74e84fdfa96821580fb5e9c0b0777c1c4779434ce16d3d62a9c4d8c710df39", + "url": "https://files.pythonhosted.org/packages/79/e7/54b36be02aee8ad573be68f6f46fd62838735c2f007b22df50eb5e13a20d/setproctitle-1.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "1342f4fdb37f89d3e3c1c0a59d6ddbedbde838fff5c51178a7982993d238fe4f", + "url": "https://files.pythonhosted.org/packages/87/7b/69bdc791001250dff279a1a81904f3f563caece4fa1607a95b9fd5197d6e/setproctitle-1.3.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "38da436a0aaace9add67b999eb6abe4b84397edf4a78ec28f264e5b4c9d53cd5", + "url": "https://files.pythonhosted.org/packages/94/ad/4166381d79f6ae8138be9b49f05d193a8deb748debace9896dffad45a753/setproctitle-1.3.3-cp310-cp310-musllinux_1_1_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "bbbd6c7de0771c84b4aa30e70b409565eb1fc13627a723ca6be774ed6b9d9fa3", + "url": "https://files.pythonhosted.org/packages/9c/56/6f4a4e80b2810eb7ea9ab355022c780ef80457de368ab5b6b21b795e4f05/setproctitle-1.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "6a249415f5bb88b5e9e8c4db47f609e0bf0e20a75e8d744ea787f3092ba1f2d0", + "url": "https://files.pythonhosted.org/packages/9d/09/bc108723bbfb7c50c22fdf22191f3e32abcb5d6f46610018030b25f601c5/setproctitle-1.3.3-cp310-cp310-musllinux_1_1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "8c331e91a14ba4076f88c29c777ad6b58639530ed5b24b5564b5ed2fd7a95452", + "url": "https://files.pythonhosted.org/packages/c3/7d/d03f319e0f3b3a6e98731a56cd4d81478ed0c12531b822fd2c728b948edb/setproctitle-1.3.3-cp310-cp310-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "c05ac48ef16ee013b8a326c63e4610e2430dbec037ec5c5b58fcced550382b74", + "url": "https://files.pythonhosted.org/packages/d0/ae/010811bece9a59a8bba131d9e7acea9c2e3c3cbf544bf06d8b10b8c28ff5/setproctitle-1.3.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "c913e151e7ea01567837ff037a23ca8740192880198b7fbb90b16d181607caae", + "url": "https://files.pythonhosted.org/packages/ff/e1/b16b16a1aa12174349d15b73fd4b87e641a8ae3fb1163e80938dbbf6ae98/setproctitle-1.3.3.tar.gz" + } + ], + "project_name": "setproctitle", + "requires_dists": [ + "pytest; extra == \"test\"" + ], + "requires_python": ">=3.7", + "version": "1.3.3" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "6d10741ff20b89cd8c6a536ee9dc90d3002dec0226c78fb98605bfb9ef8a7adf", + "url": "https://files.pythonhosted.org/packages/40/a9/7deac76c58fa47c95360116a06b53b9b62f6db11336fe61b6ab53784d98b/setuptools-59.5.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "d144f85102f999444d06f9c0e8c737fd0194f10f2f7e5fdb77573f6e2fa4fad0", + "url": "https://files.pythonhosted.org/packages/e6/e2/f2bfdf364e016f7a464db709ea40d1101c4c5a463dd7019dae0a42dbd1c6/setuptools-59.5.0.tar.gz" + } + ], + "project_name": "setuptools", + "requires_dists": [ + "flake8-2020; extra == \"testing\"", + "furo; extra == \"docs\"", + "jaraco.envs>=2.2; extra == \"testing\"", + "jaraco.packaging>=8.2; extra == \"docs\"", + "jaraco.path>=3.2.0; extra == \"testing\"", + "jaraco.tidelift>=1.4; extra == \"docs\"", + "mock; extra == \"testing\"", + "paver; extra == \"testing\"", + "pip>=19.1; extra == \"testing\"", + "pygments-github-lexers==0.0.5; extra == \"docs\"", + "pytest-black>=0.3.7; platform_python_implementation != \"PyPy\" and extra == \"testing\"", + "pytest-checkdocs>=2.4; extra == \"testing\"", + "pytest-cov; extra == \"testing\"", + "pytest-enabler>=1.0.1; extra == \"testing\"", + "pytest-flake8; extra == \"testing\"", + "pytest-mypy; platform_python_implementation != \"PyPy\" and extra == \"testing\"", + "pytest-virtualenv>=1.2.7; extra == \"testing\"", + "pytest-xdist; extra == \"testing\"", + "pytest>=6; extra == \"testing\"", + "rst.linker>=1.9; extra == \"docs\"", + "sphinx-inline-tabs; extra == \"docs\"", + "sphinx; extra == \"docs\"", + "sphinx; extra == \"testing\"", + "sphinxcontrib-towncrier; extra == \"docs\"", + "virtualenv>=13.0.0; extra == \"testing\"", + "wheel; extra == \"testing\"" + ], + "requires_python": ">=3.6", + "version": "59.5.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254", + "url": "https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", + "url": "https://files.pythonhosted.org/packages/71/39/171f1c67cd00715f190ba0b100d606d440a28c93c7714febeca8b79af85e/six-1.16.0.tar.gz" + } + ], + "project_name": "six", + "requires_dists": [], + "requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7", + "version": "1.16.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da", + "url": "https://files.pythonhosted.org/packages/a7/a5/10f97f73544edcdef54409f1d839f6049a0d79df68adbc1ceb24d1aaca42/smmap-5.0.1-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62", + "url": "https://files.pythonhosted.org/packages/88/04/b5bf6d21dc4041000ccba7eb17dd3055feb237e7ffc2c20d3fae3af62baa/smmap-5.0.1.tar.gz" + } + ], + "project_name": "smmap", + "requires_dists": [], + "requires_python": ">=3.7", + "version": "5.0.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "859a499a9b1fb68a058858964486627100b71fcb21646861c61d31846a6478fb", + "url": "https://files.pythonhosted.org/packages/0a/32/2e8545fb0592f33e3aca5951e8b01008b76d61b440658cbdc37b4eaebf0b/tensorboard-2.17.0-py3-none-any.whl" + } + ], + "project_name": "tensorboard", + "requires_dists": [ + "absl-py>=0.4", + "grpcio>=1.48.2", + "markdown>=2.6.8", + "numpy>=1.12.0", + "protobuf!=4.24.0,<5.0.0,>=3.19.6", + "setuptools>=41.0.0", + "six>1.9", + "tensorboard-data-server<0.8.0,>=0.7.0", + "werkzeug>=1.0.1" + ], + "requires_python": ">=3.9", + "version": "2.17.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "ef687163c24185ae9754ed5650eb5bc4d84ff257aabdc33f0cc6f74d8ba54530", + "url": "https://files.pythonhosted.org/packages/73/c6/825dab04195756cf8ff2e12698f22513b3db2f64925bdd41671bfb33aaa5/tensorboard_data_server-0.7.2-py3-none-manylinux_2_31_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "7e0610d205889588983836ec05dc098e80f97b7e7bbff7e994ebb78f578d0ddb", + "url": "https://files.pythonhosted.org/packages/7a/13/e503968fefabd4c6b2650af21e110aa8466fe21432cd7c43a84577a89438/tensorboard_data_server-0.7.2-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "9fe5d24221b29625dbc7328b0436ca7fc1c23de4acf4d272f1180856e32f9f60", + "url": "https://files.pythonhosted.org/packages/b7/85/dabeaf902892922777492e1d253bb7e1264cadce3cea932f7ff599e53fea/tensorboard_data_server-0.7.2-py3-none-macosx_10_9_x86_64.whl" + } + ], + "project_name": "tensorboard-data-server", + "requires_dists": [], + "requires_python": ">=3.7", + "version": "0.7.2" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", + "url": "https://files.pythonhosted.org/packages/97/75/10a9ebee3fd790d20926a90a2547f0bf78f371b2f13aa822c759680ca7b9/tomli-2.0.1-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f", + "url": "https://files.pythonhosted.org/packages/c0/3f/d7af728f075fb08564c5949a9c95e44352e23dee646869fa104a3b2060a3/tomli-2.0.1.tar.gz" + } + ], + "project_name": "tomli", + "requires_dists": [], + "requires_python": ">=3.7", + "version": "2.0.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "74f5b137190a6face6859d630f129289e7fae6a4d9a747430b3b5d5c6297a3ae", + "url": "https://download.pytorch.org/whl/cu116/torch-1.12.0%2Bcu116-cp310-cp310-linux_x86_64.whl" + } + ], + "project_name": "torch", + "requires_dists": [ + "typing-extensions" + ], + "requires_python": ">=3.7.0", + "version": "1.12.0+cu116" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", + "url": "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8", + "url": "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz" + } + ], + "project_name": "typing-extensions", + "requires_dists": [], + "requires_python": ">=3.8", + "version": "4.12.2" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472", + "url": "https://files.pythonhosted.org/packages/ca/1c/89ffc63a9605b583d5df2be791a27bc1a42b7c32bab68d3c8f2f73a98cd4/urllib3-2.2.2-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168", + "url": "https://files.pythonhosted.org/packages/43/6d/fa469ae21497ddc8bc93e5877702dca7cb8f911e337aca7452b5724f1bb6/urllib3-2.2.2.tar.gz" + } + ], + "project_name": "urllib3", + "requires_dists": [ + "brotli>=1.0.9; platform_python_implementation == \"CPython\" and extra == \"brotli\"", + "brotlicffi>=0.8.0; platform_python_implementation != \"CPython\" and extra == \"brotli\"", + "h2<5,>=4; extra == \"h2\"", + "pysocks!=1.5.7,<2.0,>=1.5.6; extra == \"socks\"", + "zstandard>=0.18.0; extra == \"zstd\"" + ], + "requires_python": ">=3.8", + "version": "2.2.2" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "cdc18c87ed255235cddd4a89ad96624595871e24ccfe975211a375a16923759f", + "url": "https://files.pythonhosted.org/packages/14/1c/faf90318ff4bcb23d533b32ca3a9db6616532f312563f46d02a0c121ecff/wandb-0.17.3-py3-none-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "f6fe865b9ed7db74d67660973abaa236bbe469019a37b50d44a1be372122aced", + "url": "https://files.pythonhosted.org/packages/87/70/80a80709815dd60cba566dc4e84aa570e6b5c2790f7d2e498273c3619e59/wandb-0.17.3-py3-none-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "7b69eb8148dca4f04d1e9c11f7d651e374f429b8ed729562e3184ce989f376f2", + "url": "https://files.pythonhosted.org/packages/ac/86/470ea9af2337d3cc987939980180532afd6757107044ed6970363ef42bb7/wandb-0.17.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "df94581b299414c4929759b0d12578b00a84d3bb21bc01461edcb1a643b2719b", + "url": "https://files.pythonhosted.org/packages/f0/7a/4935fd9d0302046c1a73d9e866fbd5e7955185e3cbe73ca09510774c5452/wandb-0.17.3-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "36c4688c70bcd1d39e1575ab1664b22f67b40f685b087847f867b6e9302cd963", + "url": "https://files.pythonhosted.org/packages/fd/4c/c6a664af23e18696c44c526c056f95ca74bd869bc44c507f36ac3cf74d70/wandb-0.17.3-py3-none-macosx_11_0_arm64.whl" + } + ], + "project_name": "wandb", + "requires_dists": [ + "awscli; extra == \"launch\"", + "azure-containerregistry; extra == \"launch\"", + "azure-identity; extra == \"azure\"", + "azure-identity; extra == \"launch\"", + "azure-storage-blob; extra == \"azure\"", + "azure-storage-blob; extra == \"launch\"", + "bokeh; extra == \"media\"", + "boto3; extra == \"aws\"", + "boto3; extra == \"launch\"", + "botocore; extra == \"launch\"", + "chardet; extra == \"launch\"", + "click!=8.0.0,>=7.1", + "cloudpickle; extra == \"models\"", + "docker-pycreds>=0.4.0", + "filelock; extra == \"importers\"", + "gitpython!=3.1.29,>=1.0.0", + "google-auth; extra == \"launch\"", + "google-cloud-aiplatform; extra == \"launch\"", + "google-cloud-artifact-registry; extra == \"launch\"", + "google-cloud-compute; extra == \"launch\"", + "google-cloud-storage; extra == \"gcp\"", + "google-cloud-storage; extra == \"kubeflow\"", + "google-cloud-storage; extra == \"launch\"", + "iso8601; extra == \"launch\"", + "kubernetes-asyncio; extra == \"launch\"", + "kubernetes; extra == \"kubeflow\"", + "kubernetes; extra == \"launch\"", + "minio; extra == \"kubeflow\"", + "mlflow; extra == \"importers\"", + "moviepy; extra == \"media\"", + "nbconvert; extra == \"launch\"", + "nbformat; extra == \"launch\"", + "numpy; extra == \"media\"", + "optuna; extra == \"launch\"", + "orjson; extra == \"perf\"", + "pillow; extra == \"media\"", + "platformdirs", + "plotly>=5.18.0; extra == \"media\"", + "polars; extra == \"importers\"", + "protobuf!=4.21.0,<6,>=3.12.0; python_version < \"3.9\" and sys_platform == \"linux\"", + "protobuf!=4.21.0,<6,>=3.15.0; python_version == \"3.9\" and sys_platform == \"linux\"", + "protobuf!=4.21.0,<6,>=3.19.0; python_version > \"3.9\" and sys_platform == \"linux\"", + "protobuf!=4.21.0,<6,>=3.19.0; sys_platform != \"linux\"", + "psutil>=5.0.0", + "pydantic; extra == \"launch\"", + "pyyaml", + "pyyaml>=6.0.0; extra == \"launch\"", + "rdkit-pypi; extra == \"media\"", + "requests<3,>=2.0.0", + "rich; extra == \"importers\"", + "sentry-sdk>=1.0.0", + "setproctitle", + "setuptools", + "sh; extra == \"kubeflow\"", + "soundfile; extra == \"media\"", + "sweeps>=0.2.0; extra == \"sweeps\"", + "tenacity; extra == \"importers\"", + "tomli; extra == \"launch\"", + "typing-extensions; extra == \"launch\"", + "typing-extensions; python_version < \"3.10\"", + "wandb-workspaces; extra == \"workspaces\"" + ], + "requires_python": ">=3.7", + "version": "0.17.3" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "fc9645dc43e03e4d630d23143a04a7f947a9a3b5727cd535fdfe155a17cc48c8", + "url": "https://files.pythonhosted.org/packages/9d/6e/e792999e816d19d7fcbfa94c730936750036d65656a76a5a688b57a656c4/werkzeug-3.0.3-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "097e5bfda9f0aba8da6b8545146def481d06aa7d3266e7448e2cccf67dd8bd18", + "url": "https://files.pythonhosted.org/packages/02/51/2e0fc149e7a810d300422ab543f87f2bcf64d985eb6f1228c4efd6e4f8d4/werkzeug-3.0.3.tar.gz" + } + ], + "project_name": "werkzeug", + "requires_dists": [ + "MarkupSafe>=2.1.1", + "watchdog>=2.3; extra == \"watchdog\"" + ], + "requires_python": ">=3.8", + "version": "3.0.3" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad", + "url": "https://files.pythonhosted.org/packages/4d/05/4d79198ae568a92159de0f89e710a8d19e3fa267b719a236582eee921f4a/yarl-1.9.4-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "d5ff2c858f5f6a42c2a8e751100f237c5e869cbde669a724f2062d4c4ef93551", + "url": "https://files.pythonhosted.org/packages/0b/58/dd3c69651381a57ac991dba54b20ae2da359eb4b03a661e71c451d6525c6/yarl-1.9.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "e516dc8baf7b380e6c1c26792610230f37147bb754d6426462ab115a02944385", + "url": "https://files.pythonhosted.org/packages/0b/a3/7774786ec6e2dca0bb38b286f12a11af97957546e5fbcce71752a8d2cf07/yarl-1.9.4-cp310-cp310-musllinux_1_1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "d9e09c9d74f4566e905a0b8fa668c58109f7624db96a2171f21747abc7524234", + "url": "https://files.pythonhosted.org/packages/30/b5/215d586d5cb17ca9748d7a2d597c07147f210c0c0785257492094d083b65/yarl-1.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "54beabb809ffcacbd9d28ac57b0db46e42a6e341a030293fb3185c409e626b8b", + "url": "https://files.pythonhosted.org/packages/44/ae/fdbc9965ef69e650c3b5b04d60badef90ff0cde21a30770f0700e148b12f/yarl-1.9.4-cp310-cp310-musllinux_1_1_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "a8c1df72eb746f4136fe9a2e72b0c9dc1da1cbd23b5372f94b5820ff8ae30e0e", + "url": "https://files.pythonhosted.org/packages/6c/27/cda5a927df3a894eddfee4efacdd230c2d8486e322fc672194fd651f82c5/yarl-1.9.4-cp310-cp310-macosx_10_9_universal2.whl" + }, + { + "algorithm": "sha256", + "hash": "54525ae423d7b7a8ee81ba189f131054defdb122cde31ff17477951464c1691c", + "url": "https://files.pythonhosted.org/packages/6d/a1/db0bdf8cc48515e9c02daf04ae2916fc27ce6498eca21432fc9ffa63f71b/yarl-1.9.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "7d5aaac37d19b2904bb9dfe12cdb08c8443e7ba7d2852894ad448d4b8f442863", + "url": "https://files.pythonhosted.org/packages/70/a9/ef6d69ce9a4e82080290bcb6db735bb8a6d6db92f2bbb92b6951bde97e7c/yarl-1.9.4-cp310-cp310-musllinux_1_1_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "c38c9ddb6103ceae4e4498f9c08fac9b590c5c71b0370f98714768e22ac6fa66", + "url": "https://files.pythonhosted.org/packages/81/c6/06938036ea48fa74521713499fba1459b0eb60af9b9afbe8e0e9e1a96c36/yarl-1.9.4-cp310-cp310-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "801e9264d19643548651b9db361ce3287176671fb0117f96b5ac0ee1c3530d53", + "url": "https://files.pythonhosted.org/packages/b2/4f/796b0c73e9ff30a1047a7ee3390e157ab8424d4401b9f32a2624013a5b39/yarl-1.9.4-cp310-cp310-musllinux_1_1_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "357495293086c5b6d34ca9616a43d329317feab7917518bc97a08f9e55648455", + "url": "https://files.pythonhosted.org/packages/c3/a0/0ade1409d184cbc9e85acd403a386a7c0563b92ff0f26d138ff9e86e48b4/yarl-1.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "bac8d525a8dbc2a1507ec731d2867025d11ceadcb4dd421423a5d42c56818541", + "url": "https://files.pythonhosted.org/packages/cc/2a/abbaf1460becba856e163f2a1274f5d34b1969d476da8e68a8fc2aeb5661/yarl-1.9.4-cp310-cp310-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "a3a6ed1d525bfb91b3fc9b690c5a21bb52de28c018530ad85093cc488bee2dd2", + "url": "https://files.pythonhosted.org/packages/d5/fc/40b85bea1f5686092ea37f472c94c023d6347266852ffd55baa01c40f596/yarl-1.9.4-cp310-cp310-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "b8477c1ee4bd47c57d49621a062121c3023609f7a13b8a46953eb6c9716ca392", + "url": "https://files.pythonhosted.org/packages/dd/90/2958ae9f2e12084d616eef95b6a48c8e6d96448add04367c20dc53a33ff2/yarl-1.9.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf", + "url": "https://files.pythonhosted.org/packages/e0/ad/bedcdccbcbf91363fd425a948994f3340924145c2bc8ccb296f4a1e52c28/yarl-1.9.4.tar.gz" + } + ], + "project_name": "yarl", + "requires_dists": [ + "idna>=2.0", + "multidict>=4.0", + "typing-extensions>=3.7.4; python_version < \"3.8\"" + ], + "requires_python": ">=3.7", + "version": "1.9.4" + } + ], + "platform_tag": null + } + ], + "only_builds": [], + "only_wheels": [], + "path_mappings": {}, + "pex_version": "2.3.1", + "pip_version": "23.0.1", + "prefer_older_binary": false, + "requirements": [ + "atomicwrites>=1.4.0", + "box2d-py>=2.3.5", + "cloudpickle~=3.0", + "gsutil>=4.66", + "gymnasium>=0.27.1", + "numpy<1.24", + "onnx>=1.10", + "opencv-python>=3.0", + "protobuf>=4.0", + "psutil>=5.8.0", + "pygame>=2.1.0", + "pytest-benchmark==4.0.0", + "pytest-cov!=2.12.1,<3.1,>=2.12", + "pytest-platform-markers", + "pytest-rerunfailures", + "pytest-xdist<3,>=2.5", + "pytest~=8.0", + "setuptools==59.5", + "tensorboard>=2.8.0", + "torch==1.12.0", + "wandb>=0.14.0" + ], + "requires_python": [ + "<3.11,>=3.10" + ], + "resolver_version": "pip-2020-resolver", + "style": "universal", + "target_systems": [ + "linux", + "mac" + ], + "transitive": true, + "use_pep517": null +} diff --git a/locks/gpu.lock b/locks/gpu.lock new file mode 100644 index 00000000..fe2bc5a7 --- /dev/null +++ b/locks/gpu.lock @@ -0,0 +1,2872 @@ +// This lockfile was autogenerated by Pants. To regenerate, run: +// +// pants generate-lockfiles --resolve=gpu +// +// --- BEGIN PANTS LOCKFILE METADATA: DO NOT EDIT OR REMOVE --- +// { +// "version": 3, +// "valid_for_interpreter_constraints": [ +// "CPython<3.11,>=3.10" +// ], +// "generated_with_requirements": [ +// "atomicwrites>=1.4.0", +// "box2d-py>=2.3.5", +// "cloudpickle~=3.0", +// "gsutil>=4.66", +// "gymnasium>=0.27.1", +// "numpy<1.24", +// "onnx>=1.10", +// "opencv-python>=3.0", +// "protobuf>=4.0", +// "psutil>=5.8.0", +// "pygame>=2.1.0", +// "pytest-benchmark==4.0.0", +// "pytest-cov!=2.12.1,<3.1,>=2.12", +// "pytest-platform-markers", +// "pytest-rerunfailures", +// "pytest-xdist<3,>=2.5", +// "pytest~=8.0", +// "setuptools==59.5", +// "tensorboard>=2.8.0", +// "torch==1.12.0", +// "wandb>=0.14.0" +// ], +// "manylinux": "manylinux2014", +// "requirement_constraints": [], +// "only_binary": [], +// "no_binary": [] +// } +// --- END PANTS LOCKFILE METADATA --- + +{ + "allow_builds": true, + "allow_prereleases": false, + "allow_wheels": true, + "build_isolation": true, + "constraints": [], + "locked_resolves": [ + { + "locked_requirements": [ + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "526a04eadab8b4ee719ce68f204172ead1027549089702d99b9059f129ff1308", + "url": "https://files.pythonhosted.org/packages/a2/ad/e0d3c824784ff121c03cc031f944bc7e139a8f1870ffd2845cc2dd76f6c4/absl_py-2.1.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "7820790efbb316739cde8b4e19357243fc3608a152024288513dd968d7d959ff", + "url": "https://files.pythonhosted.org/packages/7a/8f/fc001b92ecc467cc32ab38398bd0bfb45df46e7523bf33c2ad22a505f06e/absl-py-2.1.0.tar.gz" + } + ], + "project_name": "absl-py", + "requires_dists": [], + "requires_python": ">=3.7", + "version": "2.1.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "702e2c7c187c1a498a4e2b03155d52658fdd6fda882d3d7fbb891a5cf108bb10", + "url": "https://files.pythonhosted.org/packages/25/00/d3d4a9e23e4d810a345f8ca24550caec0aaca7307fd692e0b939746b1d78/aiohttp-3.9.5-cp310-cp310-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "edea7d15772ceeb29db4aff55e482d4bcfb6ae160ce144f2682de02f6d693551", + "url": "https://files.pythonhosted.org/packages/04/a4/e3679773ea7eb5b37a2c998e25b017cc5349edf6ba2739d1f32855cfb11b/aiohttp-3.9.5.tar.gz" + }, + { + "algorithm": "sha256", + "hash": "c8a02fbeca6f63cb1f0475c799679057fc9268b77075ab7cf3f1c600e81dd46b", + "url": "https://files.pythonhosted.org/packages/6e/05/36471e8cbcf4c56d4917fcbe0c2c6d68119ba6e83b66d7173f39ee0125b6/aiohttp-3.9.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "ff84aeb864e0fac81f676be9f4685f0527b660f1efdc40dcede3c251ef1e867f", + "url": "https://files.pythonhosted.org/packages/77/4d/892098719e00bcf746a9fccc5f6854b1cfaf0d892de8ca5a646083eb12e2/aiohttp-3.9.5-cp310-cp310-musllinux_1_1_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "84dabd95154f43a2ea80deffec9cb44d2e301e38a0c9d331cc4aa0166fe28ae3", + "url": "https://files.pythonhosted.org/packages/7f/ee/0c83fd6ece4200145417da81565af7e7266b3a0591fbe32129b48187a472/aiohttp-3.9.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "c26959ca7b75ff768e2776d8055bf9582a6267e24556bb7f7bd29e677932be72", + "url": "https://files.pythonhosted.org/packages/a0/09/e7637f4f0760cad4d67347bbd8311c6ad0259a3fc01f04555af9e84bd378/aiohttp-3.9.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "c413016880e03e69d166efb5a1a95d40f83d5a3a648d16486592c49ffb76d0db", + "url": "https://files.pythonhosted.org/packages/a3/5c/322ffd8b6bb4a49d399685c1fccecb0bd0f7487bfefeef202c4f4c478bd0/aiohttp-3.9.5-cp310-cp310-musllinux_1_1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "6ae79c1bc12c34082d92bf9422764f799aee4746fd7a392db46b7fd357d4a17a", + "url": "https://files.pythonhosted.org/packages/a9/51/d95cab6dbee773c57ff590d218633e7b9d52a103bc51060483349f3c8e1e/aiohttp-3.9.5-cp310-cp310-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "4d3ebb9e1316ec74277d19c5f482f98cc65a73ccd5430540d6d11682cd857430", + "url": "https://files.pythonhosted.org/packages/ac/03/5da5d4b8e88d8af96f3b2f498141cafaad9acf3282831f0036993385b2d5/aiohttp-3.9.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "ad7f2919d7dac062f24d6f5fe95d401597fbb015a25771f85e692d043c9d7832", + "url": "https://files.pythonhosted.org/packages/b8/e6/17062e803031c760bc452117f0789f36545355d287258889ccfe6f57cce8/aiohttp-3.9.5-cp310-cp310-musllinux_1_1_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "fcde4c397f673fdec23e6b05ebf8d4751314fa7c24f93334bf1f1364c1c69ac7", + "url": "https://files.pythonhosted.org/packages/bb/6b/baa5886a66dc4a9fe60df3fff543ac0cdbac3d18347889f17023b15bdceb/aiohttp-3.9.5-cp310-cp310-macosx_10_9_universal2.whl" + }, + { + "algorithm": "sha256", + "hash": "e7a6a8354f1b62e15d48e04350f13e726fa08b62c3d7b8401c0a1314f02e3558", + "url": "https://files.pythonhosted.org/packages/db/fd/f390f2a538858c0ff5d74f11226d85956d6c52b16765cc485d4f7ba7d45d/aiohttp-3.9.5-cp310-cp310-musllinux_1_1_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "5d6b3f1fabe465e819aed2c421a6743d8debbde79b6a8600739300630a01bf2c", + "url": "https://files.pythonhosted.org/packages/e7/3d/557ca9d4867e0e17f69694e514999c3de0a63c11964701600c9719171b97/aiohttp-3.9.5-cp310-cp310-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "714d4e5231fed4ba2762ed489b4aec07b2b9953cf4ee31e9871caac895a839c0", + "url": "https://files.pythonhosted.org/packages/f4/46/c36596481a148014b0b6d4a62570baf5580aede5acc95901317b12cc3308/aiohttp-3.9.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + } + ], + "project_name": "aiohttp", + "requires_dists": [ + "Brotli; platform_python_implementation == \"CPython\" and extra == \"speedups\"", + "aiodns; (sys_platform == \"linux\" or sys_platform == \"darwin\") and extra == \"speedups\"", + "aiosignal>=1.1.2", + "async-timeout<5.0,>=4.0; python_version < \"3.11\"", + "attrs>=17.3.0", + "brotlicffi; platform_python_implementation != \"CPython\" and extra == \"speedups\"", + "frozenlist>=1.1.1", + "multidict<7.0,>=4.5", + "yarl<2.0,>=1.0" + ], + "requires_python": ">=3.8", + "version": "3.9.5" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17", + "url": "https://files.pythonhosted.org/packages/76/ac/a7305707cb852b7e16ff80eaf5692309bde30e2b1100a1fcacdc8f731d97/aiosignal-1.3.1-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc", + "url": "https://files.pythonhosted.org/packages/ae/67/0952ed97a9793b4958e5736f6d2b346b414a2cd63e82d05940032f45b32f/aiosignal-1.3.1.tar.gz" + } + ], + "project_name": "aiosignal", + "requires_dists": [ + "frozenlist>=1.1.0" + ], + "requires_python": ">=3.7", + "version": "1.3.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "69a79e083a716173e5532e0fa3bef45f793f4e61096cf52b5a42c0211c8b8aa5", + "url": "https://files.pythonhosted.org/packages/0b/29/cba741f3abc1700dda883c4a1dd83f4ae89e4e8654067929d89143df2c58/argcomplete-3.4.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "c2abcdfe1be8ace47ba777d4fce319eb13bf8ad9dace8d085dcad6eded88057f", + "url": "https://files.pythonhosted.org/packages/db/ca/45176b8362eb06b68f946c2bf1184b92fc98d739a3f8c790999a257db91f/argcomplete-3.4.0.tar.gz" + } + ], + "project_name": "argcomplete", + "requires_dists": [ + "coverage; extra == \"test\"", + "mypy; extra == \"test\"", + "pexpect; extra == \"test\"", + "ruff; extra == \"test\"", + "wheel; extra == \"test\"" + ], + "requires_python": ">=3.8", + "version": "3.4.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028", + "url": "https://files.pythonhosted.org/packages/a7/fa/e01228c2938de91d47b307831c62ab9e4001e747789d0b05baf779a6488c/async_timeout-4.0.3-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f", + "url": "https://files.pythonhosted.org/packages/87/d6/21b30a550dafea84b1b8eee21b5e23fa16d010ae006011221f33dcd8d7f8/async-timeout-4.0.3.tar.gz" + } + ], + "project_name": "async-timeout", + "requires_dists": [ + "typing-extensions>=3.6.5; python_version < \"3.8\"" + ], + "requires_python": ">=3.7", + "version": "4.0.3" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11", + "url": "https://files.pythonhosted.org/packages/87/c6/53da25344e3e3a9c01095a89f16dbcda021c609ddb42dd6d7c0528236fb2/atomicwrites-1.4.1.tar.gz" + } + ], + "project_name": "atomicwrites", + "requires_dists": [], + "requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7", + "version": "1.4.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1", + "url": "https://files.pythonhosted.org/packages/e0/44/827b2a91a5816512fcaf3cc4ebc465ccd5d598c45cefa6703fcf4a79018f/attrs-23.2.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30", + "url": "https://files.pythonhosted.org/packages/e3/fc/f800d51204003fa8ae392c4e8278f256206e7a919b708eef054f5f4b650d/attrs-23.2.0.tar.gz" + } + ], + "project_name": "attrs", + "requires_dists": [ + "attrs[tests-mypy]; extra == \"tests-no-zope\"", + "attrs[tests-no-zope]; extra == \"tests\"", + "attrs[tests]; extra == \"cov\"", + "attrs[tests]; extra == \"dev\"", + "cloudpickle; platform_python_implementation == \"CPython\" and extra == \"tests-no-zope\"", + "coverage[toml]>=5.3; extra == \"cov\"", + "furo; extra == \"docs\"", + "hypothesis; extra == \"tests-no-zope\"", + "importlib-metadata; python_version < \"3.8\"", + "mypy>=1.6; (platform_python_implementation == \"CPython\" and python_version >= \"3.8\") and extra == \"tests-mypy\"", + "myst-parser; extra == \"docs\"", + "pre-commit; extra == \"dev\"", + "pympler; extra == \"tests-no-zope\"", + "pytest-mypy-plugins; (platform_python_implementation == \"CPython\" and python_version >= \"3.8\") and extra == \"tests-mypy\"", + "pytest-xdist[psutil]; extra == \"tests-no-zope\"", + "pytest>=4.3.0; extra == \"tests-no-zope\"", + "sphinx-notfound-page; extra == \"docs\"", + "sphinx; extra == \"docs\"", + "sphinxcontrib-towncrier; extra == \"docs\"", + "towncrier; extra == \"docs\"", + "zope-interface; extra == \"docs\"", + "zope-interface; extra == \"tests\"" + ], + "requires_python": ">=3.7", + "version": "23.2.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "147758d41ae7240dc989f0039f27da8ca0d53734be0eb869ef16e3adcfa462e8", + "url": "https://files.pythonhosted.org/packages/23/10/c0b78c27298029e4454a472a1919bde20cb182dab1662cec7f2ca1dcc523/boto-2.49.0-py2.py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "ea0d3b40a2d852767be77ca343b58a9e3a4b00d9db440efb8da74b4e58025e5a", + "url": "https://files.pythonhosted.org/packages/c8/af/54a920ff4255664f5d238b5aebd8eedf7a07c7a5e71e27afcfe840b82f51/boto-2.49.0.tar.gz" + } + ], + "project_name": "boto", + "requires_dists": [], + "requires_python": null, + "version": "2.49.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "bdacfbbc56079bb317548efe49d3d5a86646885cc27f4a2ee97e4b2960921ab7", + "url": "https://files.pythonhosted.org/packages/98/c2/ab05b5329dc4416b5ee5530f0625a79c394a3e3c10abe0812b9345256451/box2d-py-2.3.8.tar.gz" + } + ], + "project_name": "box2d-py", + "requires_dists": [], + "requires_python": null, + "version": "2.3.8" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945", + "url": "https://files.pythonhosted.org/packages/fb/2b/a64c2d25a37aeb921fddb929111413049fc5f8b9a4c1aefaffaafe768d54/cachetools-5.3.3-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105", + "url": "https://files.pythonhosted.org/packages/b3/4d/27a3e6dd09011649ad5210bdf963765bc8fa81a0827a4fc01bafd2705c5b/cachetools-5.3.3.tar.gz" + } + ], + "project_name": "cachetools", + "requires_dists": [], + "requires_python": ">=3.7", + "version": "5.3.3" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56", + "url": "https://files.pythonhosted.org/packages/5b/11/1e78951465b4a225519b8c3ad29769c49e0d8d157a070f681d5b6d64737f/certifi-2024.6.2-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516", + "url": "https://files.pythonhosted.org/packages/07/b3/e02f4f397c81077ffc52a538e0aec464016f1860c472ed33bd2a1d220cc5/certifi-2024.6.2.tar.gz" + } + ], + "project_name": "certifi", + "requires_dists": [], + "requires_python": ">=3.6", + "version": "2024.6.2" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d", + "url": "https://files.pythonhosted.org/packages/ee/68/74a2b9f9432b70d97d1184cdabf32d7803124c228adef9481d280864a4a7/cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684", + "url": "https://files.pythonhosted.org/packages/22/05/43cfda378da7bb0aa19b3cf34fe54f8867b0d581294216339d87deefd69c/cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7", + "url": "https://files.pythonhosted.org/packages/54/49/b8875986beef2e74fc668b95f2df010e354f78e009d33d95b375912810c3/cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673", + "url": "https://files.pythonhosted.org/packages/57/3a/c263cf4d5b02880274866968fa2bf196a02c4486248bc164732319b4a4c0/cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0", + "url": "https://files.pythonhosted.org/packages/68/ce/95b0bae7968c65473e1298efb042e10cafc7bafc14d9e4f154008241c91d/cffi-1.16.0.tar.gz" + }, + { + "algorithm": "sha256", + "hash": "6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088", + "url": "https://files.pythonhosted.org/packages/aa/aa/1c43e48a6f361d1529f9e4602d6992659a0107b5f21cae567e2eddcf8d66/cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9", + "url": "https://files.pythonhosted.org/packages/c4/01/f5116266fe80c04d4d1cc96c3d355606943f9fb604a810e0b02228a0ce19/cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614", + "url": "https://files.pythonhosted.org/packages/c9/7c/43d81bdd5a915923c3bad5bb4bff401ea00ccc8e28433fb6083d2e3bf58e/cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743", + "url": "https://files.pythonhosted.org/packages/eb/de/4f644fc78a1144a897e1f908abfb2058f7be05a8e8e4fe90b7f41e9de36b/cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896", + "url": "https://files.pythonhosted.org/packages/f0/31/a6503a5c4874fb4d4c2053f73f09a957cb427b6943fab5a43b8e156df397/cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + } + ], + "project_name": "cffi", + "requires_dists": [ + "pycparser" + ], + "requires_python": ">=3.8", + "version": "1.16.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc", + "url": "https://files.pythonhosted.org/packages/28/76/e6222113b83e3622caa4bb41032d0b1bf785250607392e1b778aca0b8a7d/charset_normalizer-3.3.2-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e", + "url": "https://files.pythonhosted.org/packages/05/8c/eb854996d5fef5e4f33ad56927ad053d04dc820e4a3d39023f35cad72617/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3", + "url": "https://files.pythonhosted.org/packages/2b/61/095a0aa1a84d1481998b534177c8566fdc50bb1233ea9a0478cd3cc075bd/charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl" + }, + { + "algorithm": "sha256", + "hash": "beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c", + "url": "https://files.pythonhosted.org/packages/33/c3/3b96a435c5109dd5b6adc8a59ba1d678b302a97938f032e3770cc84cd354/charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537", + "url": "https://files.pythonhosted.org/packages/3f/ba/3f5e7be00b215fa10e13d64b1f6237eb6ebea66676a41b2bcdd09fe74323/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12", + "url": "https://files.pythonhosted.org/packages/43/05/3bf613e719efe68fb3a77f9c536a389f35b95d75424b96b426a47a45ef1d/charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03", + "url": "https://files.pythonhosted.org/packages/46/6a/d5c26c41c49b546860cc1acabdddf48b0b3fb2685f4f5617ac59261b44ae/charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f", + "url": "https://files.pythonhosted.org/packages/58/78/a0bc646900994df12e07b4ae5c713f2b3e5998f58b9d3720cce2aa45652f/charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5", + "url": "https://files.pythonhosted.org/packages/63/09/c1bc53dab74b1816a00d8d030de5bf98f724c52c1635e07681d312f20be8/charset-normalizer-3.3.2.tar.gz" + }, + { + "algorithm": "sha256", + "hash": "fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519", + "url": "https://files.pythonhosted.org/packages/a8/31/47d018ef89f95b8aded95c589a77c072c55e94b50a41aa99c0a2008a45a4/charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d", + "url": "https://files.pythonhosted.org/packages/b8/60/e2f67915a51be59d4539ed189eb0a2b0d292bf79270410746becb32bc2c3/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027", + "url": "https://files.pythonhosted.org/packages/cc/94/f7cf5e5134175de79ad2059edf2adce18e0685ebdb9227ff0139975d0e93/charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5", + "url": "https://files.pythonhosted.org/packages/da/f1/3702ba2a7470666a62fd81c58a4c40be00670e5006a67f4d626e57f013ae/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269", + "url": "https://files.pythonhosted.org/packages/eb/5c/97d97248af4920bc68687d9c3b3c0f47c910e21a8ff80af4565a576bd2f0/charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6", + "url": "https://files.pythonhosted.org/packages/f6/93/bb6cbeec3bf9da9b2eba458c15966658d1daa8b982c642f81c93ad9b40e1/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl" + } + ], + "project_name": "charset-normalizer", + "requires_dists": [], + "requires_python": ">=3.7.0", + "version": "3.3.2" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", + "url": "https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de", + "url": "https://files.pythonhosted.org/packages/96/d3/f04c7bfcf5c1862a2a5b845c6b2b360488cf47af55dfa79c98f6a6bf98b5/click-8.1.7.tar.gz" + } + ], + "project_name": "click", + "requires_dists": [ + "colorama; platform_system == \"Windows\"", + "importlib-metadata; python_version < \"3.8\"" + ], + "requires_python": ">=3.7", + "version": "8.1.7" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "246ee7d0c295602a036e86369c77fecda4ab17b506496730f2f576d9016fd9c7", + "url": "https://files.pythonhosted.org/packages/96/43/dae06432d0c4b1dc9e9149ad37b4ca8384cf6eb7700cd9215b177b914f0a/cloudpickle-3.0.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "996d9a482c6fb4f33c1a35335cf8afd065d2a56e973270364840712d9131a882", + "url": "https://files.pythonhosted.org/packages/c8/72/42a6570fc61b1f8913529728ad314c7cf5961540728dcad22c33fb2db6b6/cloudpickle-3.0.0.tar.gz" + } + ], + "project_name": "cloudpickle", + "requires_dists": [], + "requires_python": ">=3.8", + "version": "3.0.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "79b356f3dd5b26f3ad23b35c75dbdaf1f9e2450b6bcefc6d0825ea0aa3f86ca5", + "url": "https://files.pythonhosted.org/packages/7a/c3/a5b06a07b68795018f47b5d69b523ad473ac9ee66be3c22c4d3e5eadd91e/coverage-7.5.4-pp38.pp39.pp310-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "6cfb5a4f556bb51aba274588200a46e4dd6b505fb1a5f8c5ae408222eb416f99", + "url": "https://files.pythonhosted.org/packages/38/3d/9f9469f445789a170cb5bef3ad02ae9084ddd689f938797aa8ee793db404/coverage-7.5.4-cp310-cp310-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "5cd64adedf3be66f8ccee418473c2916492d53cbafbfcff851cbec5a8454b136", + "url": "https://files.pythonhosted.org/packages/44/ab/1ce64d6d01486b7e307ce0b25565b2337b9883d409fdb7655c94b0e80ae7/coverage-7.5.4-cp310-cp310-musllinux_1_2_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "2214ee920787d85db1b6a0bd9da5f8503ccc8fcd5814d90796c2f2493a2f4d2e", + "url": "https://files.pythonhosted.org/packages/99/49/0e8c8e8f9f7ea87ed94ddce70cdfe49224b13857ef3cbdb65a5eb29bba6f/coverage-7.5.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "b385d49609f8e9efc885790a5a0e89f2e3ae042cdf12958b6034cc442de428d3", + "url": "https://files.pythonhosted.org/packages/a2/78/d457df19baefbe3d38ef63cddfbda0f443d6546f3f56fa95cd884d612e8e/coverage-7.5.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "1137f46adb28e3813dec8c01fefadcb8c614f33576f672962e323b5128d9a68d", + "url": "https://files.pythonhosted.org/packages/a9/9a/79381c5dbc118b5cc0aac637352f65078766527ab0d23031d5421f2fb144/coverage-7.5.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "2174e7c23e0a454ffe12267a10732c273243b4f2d50d07544a91198f05c48f47", + "url": "https://files.pythonhosted.org/packages/b0/d8/b7bde23a5e94cfc1a45effad2dd4c45dc111c515f71c522986dd8ded31a1/coverage-7.5.4-cp310-cp310-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "a44963520b069e12789d0faea4e9fdb1e410cdc4aab89d94f7f55cbb7fef0353", + "url": "https://files.pythonhosted.org/packages/ef/05/31553dc038667012853d0a248b57987d8d70b2d67ea885605f87bcb1baba/coverage-7.5.4.tar.gz" + }, + { + "algorithm": "sha256", + "hash": "b4a474f799456e0eb46d78ab07303286a84a3140e9700b9e154cfebc8f527016", + "url": "https://files.pythonhosted.org/packages/ef/48/fccbf1b4ab5943e1b5bf5e29892531341b4c2731c448c6970349b0bb2f3b/coverage-7.5.4-cp310-cp310-musllinux_1_2_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "e564c2cf45d2f44a9da56f4e3a26b2236504a496eb4cb0ca7221cd4cc7a9aca9", + "url": "https://files.pythonhosted.org/packages/fd/a2/4db4030508e3f7267151155e2221487e1515eda167262d0aa88bce8d4b57/coverage-7.5.4-cp310-cp310-musllinux_1_2_x86_64.whl" + } + ], + "project_name": "coverage", + "requires_dists": [ + "tomli; python_full_version <= \"3.11.0a6\" and extra == \"toml\"" + ], + "requires_python": ">=3.8", + "version": "7.5.4" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "dc7051a0db5f2bd48665a990d3ec1cc305a466a77358ca4492826f41f283601e", + "url": "https://files.pythonhosted.org/packages/6b/b0/e595ce2a2527e169c3bcd6c33d2473c1918e0b7f6826a043ca1245dd4e5b/crcmod-1.7.tar.gz" + } + ], + "project_name": "crcmod", + "requires_dists": [], + "requires_python": null, + "version": "1.7" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "c9bb2ae11bfbab395bdd072985abde58ea9860ed84e59dbc0463a5d0159f5b71", + "url": "https://files.pythonhosted.org/packages/c1/e2/60b05e720766e185ef097d07068bd878a51d613ef91e4c241750f9c9192b/cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "6b7c4f03ce01afd3b76cf69a5455caa9cfa3de8c8f493e0d3ab7d20611c8dae9", + "url": "https://files.pythonhosted.org/packages/07/40/d6f6819c62e808ea74639c3c640f7edd636b86cce62cb14943996a15df92/cryptography-42.0.8-cp37-abi3-manylinux_2_28_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "cafb92b2bc622cd1aa6a1dce4b93307792633f4c5fe1f46c6b97cf67073ec961", + "url": "https://files.pythonhosted.org/packages/0f/38/85c74d0ac4c540780e072b1e6f148ecb718418c1062edcb20d22f3ec5bbb/cryptography-42.0.8-cp39-abi3-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "ad803773e9df0b92e0a817d22fd8a3675493f690b96130a5e24f1b8fabbea9c7", + "url": "https://files.pythonhosted.org/packages/25/c9/86f04e150c5d5d5e4a731a2c1e0e43da84d901f388e3fea3d5de98d689a7/cryptography-42.0.8-cp37-abi3-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "e599b53fd95357d92304510fb7bda8523ed1f79ca98dce2f43c115950aa78801", + "url": "https://files.pythonhosted.org/packages/35/66/2d87e9ca95c82c7ee5f2c09716fc4c4242c1ae6647b9bd27e55e920e9f10/cryptography-42.0.8-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "c4783183f7cb757b73b2ae9aed6599b96338eb957233c58ca8f49a49cc32fd5e", + "url": "https://files.pythonhosted.org/packages/43/c2/4a3eef67e009a522711ebd8ac89424c3a7fe591ece7035d964419ad52a1d/cryptography-42.0.8-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "a0608251135d0e03111152e41f0cc2392d1e74e35703960d4190b2e0f4ca9c70", + "url": "https://files.pythonhosted.org/packages/49/1c/9f6d13cc8041c05eebff1154e4e71bedd1db8e174fff999054435994187a/cryptography-42.0.8-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "2f66d9cd9147ee495a8374a45ca445819f8929a3efcd2e3df6428e46c3cbb10b", + "url": "https://files.pythonhosted.org/packages/53/c2/903014dafb7271fb148887d4355b2e90319cad6e810663be622b0c933fc9/cryptography-42.0.8-cp37-abi3-musllinux_1_2_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "2346b911eb349ab547076f47f2e035fc8ff2c02380a7cbbf8d87114fa0f1c583", + "url": "https://files.pythonhosted.org/packages/5c/46/de71d48abf2b6d3c808f4fbb0f4dc44a4e72786be23df0541aa2a3f6fd7e/cryptography-42.0.8-cp37-abi3-musllinux_1_1_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "e3ec3672626e1b9e55afd0df6d774ff0e953452886e06e0f1eb7eb0c832e8902", + "url": "https://files.pythonhosted.org/packages/5d/32/f6326c70a9f0f258a201d3b2632bca586ea24d214cec3cf36e374040e273/cryptography-42.0.8-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "dc0fdf6787f37b1c6b08e6dfc892d9d068b5bdb671198c72072828b80bd5fe4c", + "url": "https://files.pythonhosted.org/packages/5f/f9/c3d4f19b82bdb25a3d857fe96e7e571c981810e47e3f299cc13ac429066a/cryptography-42.0.8-cp39-abi3-manylinux_2_28_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "dea567d1b0e8bc5764b9443858b673b734100c2871dc93163f58c46a97a83d28", + "url": "https://files.pythonhosted.org/packages/60/12/f064af29190cdb1d38fe07f3db6126091639e1dece7ec77c4ff037d49193/cryptography-42.0.8-cp39-abi3-macosx_10_12_universal2.whl" + }, + { + "algorithm": "sha256", + "hash": "31f721658a29331f895a5a54e7e82075554ccfb8b163a18719d342f5ffe5ecb1", + "url": "https://files.pythonhosted.org/packages/89/f4/a8b982e88eb5350407ebdbf4717b55043271d878705329e107f4783555f2/cryptography-42.0.8-cp39-abi3-musllinux_1_2_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "8d09d05439ce7baa8e9e95b07ec5b6c886f548deb7e0f69ef25f64b3bce842f2", + "url": "https://files.pythonhosted.org/packages/93/a7/1498799a2ea06148463a9a2c10ab2f6a921a74fb19e231b27dc412a748e2/cryptography-42.0.8.tar.gz" + }, + { + "algorithm": "sha256", + "hash": "d45b940883a03e19e944456a558b67a41160e367a719833c53de6911cabba2b7", + "url": "https://files.pythonhosted.org/packages/95/26/82d704d988a193cbdc69ac3b41c687c36eaed1642cce52530ad810c35645/cryptography-42.0.8-cp37-abi3-musllinux_1_2_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "fff12c88a672ab9c9c1cf7b0c80e3ad9e2ebd9d828d955c126be4fd3e5578c9e", + "url": "https://files.pythonhosted.org/packages/a2/68/e16751f6b859bc120f53fddbf3ebada5c34f0e9689d8af32884d8b2e4b4c/cryptography-42.0.8-cp39-abi3-musllinux_1_1_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "ba4f0a211697362e89ad822e667d8d340b4d8d55fae72cdd619389fb5912eefe", + "url": "https://files.pythonhosted.org/packages/a3/fe/1e21699f0a7904e8a30d4fc6db262958f1edf5e505a02e7d97a5b419e482/cryptography-42.0.8-pp310-pypy310_pp73-macosx_10_12_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "5226d5d21ab681f432a9c1cf8b658c0cb02533eece706b155e5fbd8a0cdd3949", + "url": "https://files.pythonhosted.org/packages/c2/de/8083fa2e68d403553a01a9323f4f8b9d7ffed09928ba25635c29fb28c1e7/cryptography-42.0.8-cp37-abi3-manylinux_2_28_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "81884c4d096c272f00aeb1f11cf62ccd39763581645b0812e99a91505fa48e0c", + "url": "https://files.pythonhosted.org/packages/d5/f3/61b398b5ec61f4b6ffbf746227df7ebb421696458d9625d634043f236a13/cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "81d8a521705787afe7a18d5bfb47ea9d9cc068206270aad0b96a725022e18d2e", + "url": "https://files.pythonhosted.org/packages/f9/8b/1b929ba8139430e09e140e6939c2b29c18df1f2fc2149e41bdbdcdaf5d1f/cryptography-42.0.8-cp37-abi3-macosx_10_12_universal2.whl" + }, + { + "algorithm": "sha256", + "hash": "961e61cefdcb06e0c6d7e3a1b22ebe8b996eb2bf50614e89384be54c48c6b63d", + "url": "https://files.pythonhosted.org/packages/fa/5d/31d833daa800e4fab33209843095df7adb4a78ea536929145534cbc15026/cryptography-42.0.8-cp37-abi3-macosx_10_12_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "9c0c1716c8447ee7dbf08d6db2e5c41c688544c61074b54fc4564196f55c25a7", + "url": "https://files.pythonhosted.org/packages/fa/e2/b7e6e8c261536c489d9cf908769880d94bd5d9a187e166b0dc838d2e6a56/cryptography-42.0.8-cp39-abi3-manylinux_2_28_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "b297f90c5723d04bcc8265fc2a0f86d4ea2e0f7ab4b6994459548d3a6b992a14", + "url": "https://files.pythonhosted.org/packages/fd/2b/be327b580645927bb1a1f32d5a175b897a9b956bc085b095e15c40bac9ed/cryptography-42.0.8-cp39-abi3-musllinux_1_2_x86_64.whl" + } + ], + "project_name": "cryptography", + "requires_dists": [ + "bcrypt>=3.1.5; extra == \"ssh\"", + "build; extra == \"sdist\"", + "certifi; extra == \"test\"", + "cffi>=1.12; platform_python_implementation != \"PyPy\"", + "check-sdist; extra == \"pep8test\"", + "click; extra == \"pep8test\"", + "mypy; extra == \"pep8test\"", + "nox; extra == \"nox\"", + "pretend; extra == \"test\"", + "pyenchant>=1.6.11; extra == \"docstest\"", + "pytest-benchmark; extra == \"test\"", + "pytest-cov; extra == \"test\"", + "pytest-randomly; extra == \"test-randomorder\"", + "pytest-xdist; extra == \"test\"", + "pytest>=6.2.0; extra == \"test\"", + "readme-renderer; extra == \"docstest\"", + "ruff; extra == \"pep8test\"", + "sphinx-rtd-theme>=1.1.1; extra == \"docs\"", + "sphinx>=5.3.0; extra == \"docs\"", + "sphinxcontrib-spelling>=4.0.1; extra == \"docstest\"" + ], + "requires_python": ">=3.7", + "version": "42.0.8" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "7266112468627868005106ec19cd0d722702d2b7d5912a28e19b826c3d37af49", + "url": "https://files.pythonhosted.org/packages/f5/e8/f6bd1eee09314e7e6dee49cbe2c5e22314ccdb38db16c9fc72d2fa80d054/docker_pycreds-0.4.0-py2.py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "6ce3270bcaf404cc4c3e27e4b6c70d3521deae82fb508767870fdbf772d584d4", + "url": "https://files.pythonhosted.org/packages/c5/e6/d1f6c00b7221e2d7c4b470132c931325c8b22c51ca62417e300f5ce16009/docker-pycreds-0.4.0.tar.gz" + } + ], + "project_name": "docker-pycreds", + "requires_dists": [ + "six>=1.4.0" + ], + "requires_python": null, + "version": "0.4.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad", + "url": "https://files.pythonhosted.org/packages/01/90/79fe92dd413a9cab314ef5c591b5aa9b9ba787ae4cadab75055b0ae00b33/exceptiongroup-1.2.1-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16", + "url": "https://files.pythonhosted.org/packages/a0/65/d66b7fbaef021b3c954b3bbb196d21d8a4b97918ea524f82cfae474215af/exceptiongroup-1.2.1.tar.gz" + } + ], + "project_name": "exceptiongroup", + "requires_dists": [ + "pytest>=6; extra == \"test\"" + ], + "requires_python": ">=3.7", + "version": "1.2.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc", + "url": "https://files.pythonhosted.org/packages/43/09/2aea36ff60d16dd8879bdb2f5b3ee0ba8d08cbbdcdfe870e695ce3784385/execnet-2.1.1-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3", + "url": "https://files.pythonhosted.org/packages/bb/ff/b4c0dc78fbe20c3e59c0c7334de0c27eb4001a2b2017999af398bf730817/execnet-2.1.1.tar.gz" + } + ], + "project_name": "execnet", + "requires_dists": [ + "hatch; extra == \"testing\"", + "pre-commit; extra == \"testing\"", + "pytest; extra == \"testing\"", + "tox; extra == \"testing\"" + ], + "requires_python": ">=3.8", + "version": "2.1.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "14de931035a41961f7c056361dc7f980762a143d05791ef5794a751a2caf05ae", + "url": "https://files.pythonhosted.org/packages/05/2c/ffc08c54c05cdce6fbed2aeebc46348dbe180c6d2c541c7af7ba0aa5f5f8/Farama_Notifications-0.0.4-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "13fceff2d14314cf80703c8266462ebf3733c7d165336eee998fc58e545efd18", + "url": "https://files.pythonhosted.org/packages/2e/2c/8384832b7a6b1fd6ba95bbdcae26e7137bb3eedc955c42fd5cdcc086cfbf/Farama-Notifications-0.0.4.tar.gz" + } + ], + "project_name": "farama-notifications", + "requires_dists": [], + "requires_python": null, + "version": "0.0.4" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "758819cb5d94cdedf4e836988b74de396ceacb8e2794d21f82d131fd9ee77237", + "url": "https://files.pythonhosted.org/packages/61/bf/fd60001b3abc5222d8eaa4a204cd8c0ae78e75adc688f33ce4bf25b7fafa/fasteners-0.19-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "b4f37c3ac52d8a445af3a66bce57b33b5e90b97c696b7b984f530cf8f0ded09c", + "url": "https://files.pythonhosted.org/packages/5f/d4/e834d929be54bfadb1f3e3b931c38e956aaa3b235a46a3c764c26c774902/fasteners-0.19.tar.gz" + } + ], + "project_name": "fasteners", + "requires_dists": [], + "requires_python": ">=3.6", + "version": "0.19" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "04ced3e6a46b4cfffe20f9ae482818e34eba9b5fb0ce4056e4cc9b6e212d09b7", + "url": "https://files.pythonhosted.org/packages/83/10/466fe96dae1bff622021ee687f68e5524d6392b0a2f80d05001cd3a451ba/frozenlist-1.4.1-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "5c849d495bf5154cd8da18a9eb15db127d4dba2968d88831aff6f0331ea9bd4c", + "url": "https://files.pythonhosted.org/packages/36/ce/dc6f29e0352fa34ebe45421960c8e7352ca63b31630a576e8ffb381e9c08/frozenlist-1.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "9750cc7fe1ae3b1611bb8cfc3f9ec11d532244235d75901fb6b8e42ce9229dfe", + "url": "https://files.pythonhosted.org/packages/51/47/159ac53faf8a11ae5ee8bb9db10327575557504e549cfd76f447b969aa91/frozenlist-1.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "27657df69e8801be6c3638054e202a135c7f299267f1a55ed3a598934f6c0d75", + "url": "https://files.pythonhosted.org/packages/53/82/274e19f122e124aee6d113188615f63b0736b4242a875f482a81f91e07e2/frozenlist-1.4.1-cp310-cp310-musllinux_1_1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "4f57dab5fe3407b6c0c1cc907ac98e8a189f9e418f3b6e54d65a718aaafe3950", + "url": "https://files.pythonhosted.org/packages/6e/4f/b8a5a2f10c4a58c52a52a40cf6cf1ffcdbf3a3b64f276f41dab989bf3ab5/frozenlist-1.4.1-cp310-cp310-musllinux_1_1_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "f9aa1878d1083b276b0196f2dfbe00c9b7e752475ed3b682025ff20c1c1f51ac", + "url": "https://files.pythonhosted.org/packages/7a/35/1328c7b0f780d34f8afc1d87ebdc2bb065a123b24766a0b475f0d67da637/frozenlist-1.4.1-cp310-cp310-macosx_10_9_universal2.whl" + }, + { + "algorithm": "sha256", + "hash": "0633c8d5337cb5c77acbccc6357ac49a1770b8c487e5b3505c57b949b4b82e98", + "url": "https://files.pythonhosted.org/packages/97/94/a1305fa4716726ae0abf3b1069c2d922fcfd442538cb850f1be543f58766/frozenlist-1.4.1-cp310-cp310-musllinux_1_1_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "74fb4bee6880b529a0c6560885fce4dc95936920f9f20f53d99a213f7bf66776", + "url": "https://files.pythonhosted.org/packages/ae/83/bcdaa437a9bd693ba658a0310f8cdccff26bd78e45fccf8e49897904a5cd/frozenlist-1.4.1-cp310-cp310-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "e02a0e11cf6597299b9f3bbd3f93d79217cb90cfd1411aec33848b13f5c656cc", + "url": "https://files.pythonhosted.org/packages/b0/2c/7be3bdc59dbae444864dbd9cde82790314390ec54636baf6b9ce212627ad/frozenlist-1.4.1-cp310-cp310-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "f9a3ea26252bd92f570600098783d1371354d89d5f6b7dfd87359d669f2109b5", + "url": "https://files.pythonhosted.org/packages/b8/28/899931015b8cffbe155392fe9ca663f981a17e1adc69589ee0e1e7cdc9a2/frozenlist-1.4.1-cp310-cp310-musllinux_1_1_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b", + "url": "https://files.pythonhosted.org/packages/cf/3d/2102257e7acad73efc4a0c306ad3953f68c504c16982bbdfee3ad75d8085/frozenlist-1.4.1.tar.gz" + }, + { + "algorithm": "sha256", + "hash": "590344787a90ae57d62511dd7c736ed56b428f04cd8c161fcc5e7232c130c69a", + "url": "https://files.pythonhosted.org/packages/d4/e9/759043ab7d169b74fe05ebfbfa9ee5c881c303ebc838e308346204309cd0/frozenlist-1.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "a9b2de4cf0cdd5bd2dee4c4f63a653c61d2408055ab77b151c1957f221cabf2a", + "url": "https://files.pythonhosted.org/packages/ec/25/0c87df2e53c0c5d90f7517ca0ff7aca78d050a8ec4d32c4278e8c0e52e51/frozenlist-1.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "29acab3f66f0f24674b7dc4736477bcd4bc3ad4b896f5f45379a67bce8b96868", + "url": "https://files.pythonhosted.org/packages/f4/d6/ca016b0adcf8327714ccef969740688808c86e0287bf3a639ff582f24e82/frozenlist-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "068b63f23b17df8569b7fdca5517edef76171cf3897eb68beb01341131fbd2ad", + "url": "https://files.pythonhosted.org/packages/f8/ce/b9de7dc61e753dc318cf0de862181b484178210c5361eae6eaf06792264d/frozenlist-1.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + } + ], + "project_name": "frozenlist", + "requires_dists": [], + "requires_python": ">=3.8", + "version": "1.4.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "a46817f3abed2bc4f6b4b12b0de7c8bf5ff5f1822dc03c45fa1ae6ed7a455843", + "url": "https://files.pythonhosted.org/packages/8d/47/2106398c28d6f4346b6ec84cb092bb00b4d50a3b03653328d53e4ce1ac30/gcs-oauth2-boto-plugin-3.2.tar.gz" + } + ], + "project_name": "gcs-oauth2-boto-plugin", + "requires_dists": [ + "boto>=2.29.1", + "freezegun; extra == \"dev\"", + "google-auth-httplib2>=0.2.0", + "google-auth==2.17.0", + "google-reauth>=0.1.0", + "httplib2>=0.18", + "mock; python_version < \"3.3\" and extra == \"dev\"", + "oauth2client>=2.2.0", + "pyOpenSSL>=0.13", + "retry-decorator>=1.0.0", + "rsa==4.7.2", + "six>=1.12.0" + ], + "requires_python": null, + "version": "3.2" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "81a3407ddd2ee8df444cbacea00e2d038e40150acfa3001696fe0dcf1d3adfa4", + "url": "https://files.pythonhosted.org/packages/fd/5b/8f0c4a5bb9fd491c277c21eff7ccae71b47d43c4446c9d0c6cff2fe8c2c4/gitdb-4.0.11-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "bf5421126136d6d0af55bc1e7c1af1c397a34f5b7bd79e776cd3e89785c2b04b", + "url": "https://files.pythonhosted.org/packages/19/0d/bbb5b5ee188dec84647a4664f3e11b06ade2bde568dbd489d9d64adef8ed/gitdb-4.0.11.tar.gz" + } + ], + "project_name": "gitdb", + "requires_dists": [ + "smmap<6,>=3.0.1" + ], + "requires_python": ">=3.7", + "version": "4.0.11" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "eec7ec56b92aad751f9912a73404bc02ba212a23adb2c7098ee668417051a1ff", + "url": "https://files.pythonhosted.org/packages/e9/bd/cc3a402a6439c15c3d4294333e13042b915bbeab54edc457c723931fed3f/GitPython-3.1.43-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "35f314a9f878467f5453cc1fee295c3e18e52f1b99f10f6cf5b1682e968a9e7c", + "url": "https://files.pythonhosted.org/packages/b6/a1/106fd9fa2dd989b6fb36e5893961f82992cf676381707253e0bf93eb1662/GitPython-3.1.43.tar.gz" + } + ], + "project_name": "gitpython", + "requires_dists": [ + "coverage[toml]; extra == \"test\"", + "ddt!=1.4.3,>=1.1.1; extra == \"test\"", + "gitdb<5,>=4.0.1", + "mock; python_version < \"3.8\" and extra == \"test\"", + "mypy; extra == \"test\"", + "pre-commit; extra == \"test\"", + "pytest-cov; extra == \"test\"", + "pytest-instafail; extra == \"test\"", + "pytest-mock; extra == \"test\"", + "pytest-sugar; extra == \"test\"", + "pytest>=7.3.1; extra == \"test\"", + "sphinx-autodoc-typehints; extra == \"doc\"", + "sphinx-rtd-theme; extra == \"doc\"", + "sphinx==4.3.2; extra == \"doc\"", + "sphinxcontrib-applehelp<=1.0.4,>=1.0.2; extra == \"doc\"", + "sphinxcontrib-devhelp==1.0.2; extra == \"doc\"", + "sphinxcontrib-htmlhelp<=2.0.1,>=2.0.0; extra == \"doc\"", + "sphinxcontrib-qthelp==1.0.3; extra == \"doc\"", + "sphinxcontrib-serializinghtml==1.1.5; extra == \"doc\"", + "typing-extensions; python_version < \"3.11\" and extra == \"test\"", + "typing-extensions>=3.7.4.3; python_version < \"3.8\"" + ], + "requires_python": ">=3.7", + "version": "3.1.43" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "b78f74116558e0476e19501b5b4b2ac7c93261a69c5449c861ea95cbc853c688", + "url": "https://files.pythonhosted.org/packages/5e/cb/cb0311f2ec371c83d6510847476c665edc9cc97564a51923557bc8f0b680/google_apitools-0.5.32-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "c3763e52289f61e21c41d5531e20fbda9cc8484a088b8686fd460770db8bad13", + "url": "https://files.pythonhosted.org/packages/dc/eb/c26c36463a769a3a9f08847b9bf218cb629ca91877a911bbd6dcf37d9e62/google-apitools-0.5.32.tar.gz" + } + ], + "project_name": "google-apitools", + "requires_dists": [ + "fasteners>=0.14", + "httplib2>=0.8", + "mock>=1.0.1; extra == \"testing\"", + "oauth2client>=1.4.12", + "python-gflags>=3.0.6; extra == \"cli\"", + "six>=1.12.0" + ], + "requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7", + "version": "0.5.32" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "45ba9b4b3e49406de3c5451697820694b2f6ce8a6b75bb187852fdae231dab94", + "url": "https://files.pythonhosted.org/packages/b9/e6/d64f9f31c78fc405e82fdadc4e49b42a642cd3927a60b2fd063acd468a02/google_auth-2.17.0-py2.py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "f51d26ebb3e5d723b9a7dbd310b6c88654ef1ad1fc35750d1fdba48ca4d82f52", + "url": "https://files.pythonhosted.org/packages/e7/7a/85f8b331e6469d7737f083f6d899c8583c3715bafc3b034ad8f3b4afe457/google-auth-2.17.0.tar.gz" + } + ], + "project_name": "google-auth", + "requires_dists": [ + "aiohttp<4.0.0dev,>=3.6.2; python_version >= \"3.6\" and extra == \"aiohttp\"", + "cachetools<6.0,>=2.0.0", + "cryptography==36.0.2; extra == \"enterprise-cert\"", + "cryptography>=38.0.3; extra == \"pyopenssl\"", + "enum34>=1.1.10; python_version < \"3.4\"", + "pyasn1-modules>=0.2.1", + "pyopenssl==22.0.0; extra == \"enterprise-cert\"", + "pyopenssl>=20.0.0; extra == \"pyopenssl\"", + "pyu2f>=0.1.5; extra == \"reauth\"", + "requests<3.0.0dev,>=2.20.0; extra == \"aiohttp\"", + "requests<3.0.0dev,>=2.20.0; extra == \"requests\"", + "rsa<4.6; python_version < \"3.6\"", + "rsa<5,>=3.1.4; python_version >= \"3.6\"", + "six>=1.9.0" + ], + "requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7", + "version": "2.17.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "b65a0a2123300dd71281a7bf6e64d65a0759287df52729bdd1ae2e47dc311a3d", + "url": "https://files.pythonhosted.org/packages/be/8a/fe34d2f3f9470a27b01c9e76226965863f153d5fbe276f83608562e49c04/google_auth_httplib2-0.2.0-py2.py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "38aa7badf48f974f1eb9861794e9c0cb2a0511a4ec0679b1f886d108f5640e05", + "url": "https://files.pythonhosted.org/packages/56/be/217a598a818567b28e859ff087f347475c807a5649296fb5a817c58dacef/google-auth-httplib2-0.2.0.tar.gz" + } + ], + "project_name": "google-auth-httplib2", + "requires_dists": [ + "google-auth", + "httplib2>=0.19.0" + ], + "requires_python": null, + "version": "0.2.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "cb39074488d74c8853074dde47368bbf8f739d4a4338b89aab696c895b6d8368", + "url": "https://files.pythonhosted.org/packages/69/e1/67ffaa3a645b86318ce30717af7145070ebccec5eef5c623ae08b86129b8/google_reauth-0.1.1-py2.py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "f9f6852a55c2c5453d581cd01f3d1278e86147c03d008409800390a834235892", + "url": "https://files.pythonhosted.org/packages/7d/86/74242e08d24ec4c436b8325dabbd7c60422b4829dfb1ad6ec117bdebea76/google-reauth-0.1.1.tar.gz" + } + ], + "project_name": "google-reauth", + "requires_dists": [ + "oauth2client>=2.0.0; extra == \"oauth2client\"", + "pyu2f" + ], + "requires_python": null, + "version": "0.1.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "2981c7365a9353f9b5c864595c510c983251b1ab403e05b1ccc70a3d9541a73b", + "url": "https://files.pythonhosted.org/packages/3f/dd/f3ff5b2ae4f5675132a766ea883f5b3b631fa104ae5b146046e924a5839f/grpcio-1.64.1-cp310-cp310-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "0a2813093ddb27418a4c99f9b1c223fab0b053157176a64cc9db0f4557b69bd9", + "url": "https://files.pythonhosted.org/packages/1b/cb/6c3dada17b6360a235908bb5f9badff83e5ee60c0459ffcf97d3c1590646/grpcio-1.64.1-cp310-cp310-musllinux_1_1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "e7cd5c1325f6808b8ae31657d281aadb2a51ac11ab081ae335f4f7fc44c1721d", + "url": "https://files.pythonhosted.org/packages/5e/3b/459a477de3d899ffd4164d116a0a1db67468465ef5eaa81652f9319c27ab/grpcio-1.64.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "3b64ae304c175671efdaa7ec9ae2cc36996b681eb63ca39c464958396697daff", + "url": "https://files.pythonhosted.org/packages/62/46/2f080ed826b7641220ba1584960f90dd5354d71eb455a1e3e40c0614cd6b/grpcio-1.64.1-cp310-cp310-macosx_12_0_universal2.whl" + }, + { + "algorithm": "sha256", + "hash": "6c024ffc22d6dc59000faf8ad781696d81e8e38f4078cb0f2630b4a3cf231a90", + "url": "https://files.pythonhosted.org/packages/a3/0e/dd710c8033bc9d81c6f9a52e83e5b3ee803dab6c32d92b9abeee4141a860/grpcio-1.64.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "55697ecec192bc3f2f3cc13a295ab670f51de29884ca9ae6cd6247df55df2502", + "url": "https://files.pythonhosted.org/packages/b5/cb/4762ce391ff792f011dc288985b7754cc386bd5cd85e0c0a9486edfb323b/grpcio-1.64.1-cp310-cp310-linux_armv7l.whl" + }, + { + "algorithm": "sha256", + "hash": "bac71b4b28bc9af61efcdc7630b166440bbfbaa80940c9a697271b5e1dabbc61", + "url": "https://files.pythonhosted.org/packages/d8/af/14e95d1bf9e1fdbad332525653cff9fc9c9ed8f19854f8f69665862996b8/grpcio-1.64.1-cp310-cp310-manylinux_2_17_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "8d51dd1c59d5fa0f34266b80a3805ec29a1f26425c2a54736133f6d87fc4968a", + "url": "https://files.pythonhosted.org/packages/f5/9d/662a0c2181b2d7c1ec697ff06ec5ab9c37ed14e7f9e720e16f26443d233a/grpcio-1.64.1.tar.gz" + } + ], + "project_name": "grpcio", + "requires_dists": [ + "grpcio-tools>=1.64.1; extra == \"protobuf\"" + ], + "requires_python": ">=3.8", + "version": "1.64.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "ef29d47764d2a3c2436ce50c4e1827626725ba8dbfd3127b42a18641710e7d38", + "url": "https://files.pythonhosted.org/packages/11/a4/eb6bd231662c4a8c2b59576220c39d3db82cb294236d179869b759804b6f/gsutil-5.30.tar.gz" + } + ], + "project_name": "gsutil", + "requires_dists": [ + "argcomplete>=1.9.4", + "crcmod>=1.7", + "fasteners>=0.14.1", + "gcs-oauth2-boto-plugin>=3.2", + "google-apitools>=0.5.32", + "google-auth-httplib2>=0.2.0", + "google-auth[aiohttp]==2.17.0", + "google-reauth>=0.1.0", + "httplib2==0.20.4", + "mock<=3.0.5,>=2.0.0; python_version < \"3.3\"", + "monotonic>=1.4", + "pyOpenSSL>=0.13", + "retry-decorator>=1.0.0", + "six>=1.16.0" + ], + "requires_python": "!=2.*,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,<4", + "version": "5.30" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "61c3384b5575985bb7f85e43213bcb40f36fcdff388cae6bc229304c71f2843e", + "url": "https://files.pythonhosted.org/packages/a8/4d/3cbfd81ed84db450dbe73a89afcd8bc405273918415649ac6683356afe92/gymnasium-0.29.1-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "1a532752efcb7590478b1cc7aa04f608eb7a2fdad5570cd217b66b6a35274bb1", + "url": "https://files.pythonhosted.org/packages/0d/f8/5699ddb3e1c4f6d97b8930e573074849b921da8374fccd141f0f3a9bd713/gymnasium-0.29.1.tar.gz" + } + ], + "project_name": "gymnasium", + "requires_dists": [ + "autorom[accept-rom-license]~=0.4.2; extra == \"accept-rom-license\"", + "box2d-py==2.3.5; extra == \"all\"", + "box2d-py==2.3.5; extra == \"box2d\"", + "cloudpickle>=1.2.0", + "cython<3; extra == \"all\"", + "cython<3; extra == \"mujoco-py\"", + "cython<3; extra == \"mujoco-py\"", + "farama-notifications>=0.0.1", + "imageio>=2.14.1; extra == \"all\"", + "imageio>=2.14.1; extra == \"mujoco\"", + "importlib-metadata>=4.8.0; python_version < \"3.10\"", + "jax>=0.4.0; extra == \"all\"", + "jax>=0.4.0; extra == \"jax\"", + "jaxlib>=0.4.0; extra == \"all\"", + "jaxlib>=0.4.0; extra == \"jax\"", + "lz4>=3.1.0; extra == \"all\"", + "lz4>=3.1.0; extra == \"other\"", + "matplotlib>=3.0; extra == \"all\"", + "matplotlib>=3.0; extra == \"other\"", + "moviepy>=1.0.0; extra == \"all\"", + "moviepy>=1.0.0; extra == \"other\"", + "mujoco-py<2.2,>=2.1; extra == \"all\"", + "mujoco-py<2.2,>=2.1; extra == \"mujoco-py\"", + "mujoco-py<2.2,>=2.1; extra == \"mujoco-py\"", + "mujoco>=2.3.3; extra == \"all\"", + "mujoco>=2.3.3; extra == \"mujoco\"", + "numpy>=1.21.0", + "opencv-python>=3.0; extra == \"all\"", + "opencv-python>=3.0; extra == \"other\"", + "pygame>=2.1.3; extra == \"all\"", + "pygame>=2.1.3; extra == \"box2d\"", + "pygame>=2.1.3; extra == \"classic-control\"", + "pygame>=2.1.3; extra == \"classic-control\"", + "pygame>=2.1.3; extra == \"toy-text\"", + "pygame>=2.1.3; extra == \"toy-text\"", + "pytest==7.1.3; extra == \"testing\"", + "scipy>=1.7.3; extra == \"testing\"", + "shimmy[atari]<1.0,>=0.1.0; extra == \"all\"", + "shimmy[atari]<1.0,>=0.1.0; extra == \"atari\"", + "swig==4.*; extra == \"all\"", + "swig==4.*; extra == \"box2d\"", + "torch>=1.0.0; extra == \"all\"", + "torch>=1.0.0; extra == \"other\"", + "typing-extensions>=4.3.0" + ], + "requires_python": ">=3.8", + "version": "0.29.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "8b6a905cb1c79eefd03f8669fd993c36dc341f7c558f056cb5a33b5c2f458543", + "url": "https://files.pythonhosted.org/packages/59/0f/29725a9caf4b2618f524e0f28e2bda91aca8f880123ec77426ede6ea1ea4/httplib2-0.20.4-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "58a98e45b4b1a48273073f905d2961666ecf0fbac4250ea5b47aef259eb5c585", + "url": "https://files.pythonhosted.org/packages/9c/65/57ad964eb8d45cc3d1316ce5ada2632f74e35863a0e57a52398416a182a1/httplib2-0.20.4.tar.gz" + } + ], + "project_name": "httplib2", + "requires_dists": [ + "pyparsing!=3.0.0,!=3.0.1,!=3.0.2,!=3.0.3,<4,>=2.4.2; python_version > \"3.0\"", + "pyparsing<3,>=2.4.2; python_version < \"3.0\"" + ], + "requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7", + "version": "0.20.4" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0", + "url": "https://files.pythonhosted.org/packages/e5/3e/741d8c82801c347547f8a2a06aa57dbb1992be9e948df2ea0eda2c8b79e8/idna-3.7-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc", + "url": "https://files.pythonhosted.org/packages/21/ed/f86a79a07470cb07819390452f178b3bef1d375f2ec021ecfc709fc7cf07/idna-3.7.tar.gz" + } + ], + "project_name": "idna", + "requires_dists": [], + "requires_python": ">=3.5", + "version": "3.7" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374", + "url": "https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", + "url": "https://files.pythonhosted.org/packages/d7/4b/cbd8e699e64a6f16ca3a8220661b5f83792b3017d0f79807cb8708d33913/iniconfig-2.0.0.tar.gz" + } + ], + "project_name": "iniconfig", + "requires_dists": [], + "requires_python": ">=3.7", + "version": "2.0.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "48f276f4d8cfb8ce6527c8f79e2ee29708508bf4d40aa410fbc3b4ee832c850f", + "url": "https://files.pythonhosted.org/packages/fc/b3/0c0c994fe49cd661084f8d5dc06562af53818cc0abefaca35bdc894577c3/Markdown-3.6-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "ed4f41f6daecbeeb96e576ce414c41d2d876daa9a16cb35fa8ed8c2ddfad0224", + "url": "https://files.pythonhosted.org/packages/22/02/4785861427848cc11e452cc62bb541006a1087cf04a1de83aedd5530b948/Markdown-3.6.tar.gz" + } + ], + "project_name": "markdown", + "requires_dists": [ + "coverage; extra == \"testing\"", + "importlib-metadata>=4.4; python_version < \"3.10\"", + "mdx-gh-links>=0.2; extra == \"docs\"", + "mkdocs-gen-files; extra == \"docs\"", + "mkdocs-literate-nav; extra == \"docs\"", + "mkdocs-nature>=0.6; extra == \"docs\"", + "mkdocs-section-index; extra == \"docs\"", + "mkdocs>=1.5; extra == \"docs\"", + "mkdocstrings[python]; extra == \"docs\"", + "pyyaml; extra == \"testing\"" + ], + "requires_python": ">=3.8", + "version": "3.6" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd", + "url": "https://files.pythonhosted.org/packages/30/39/8d845dd7d0b0613d86e0ef89549bfb5f61ed781f59af45fc96496e897f3a/MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46", + "url": "https://files.pythonhosted.org/packages/0a/7b/85681ae3c33c385b10ac0f8dd025c30af83c78cec1c37a6aa3b55e67f5ec/MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900", + "url": "https://files.pythonhosted.org/packages/29/fe/a36ba8c7ca55621620b2d7c585313efd10729e63ef81e4e61f52330da781/MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff", + "url": "https://files.pythonhosted.org/packages/60/ae/9c60231cdfda003434e8bd27282b1f4e197ad5a710c14bee8bea8a9ca4f0/MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad", + "url": "https://files.pythonhosted.org/packages/65/dc/1510be4d179869f5dafe071aecb3f1f41b45d37c02329dfba01ff59e5ac5/MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5", + "url": "https://files.pythonhosted.org/packages/6a/4a/a4d49415e600bacae038c67f9fecc1d5433b9d3c71a4de6f33537b89654c/MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f", + "url": "https://files.pythonhosted.org/packages/7c/52/2b1b570f6b8b803cef5ac28fdf78c0da318916c7d2fe9402a84d591b394c/MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b", + "url": "https://files.pythonhosted.org/packages/87/5b/aae44c6655f3801e81aa3eef09dbbf012431987ba564d7231722f68df02d/MarkupSafe-2.1.5.tar.gz" + }, + { + "algorithm": "sha256", + "hash": "a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc", + "url": "https://files.pythonhosted.org/packages/e4/54/ad5eb37bf9d51800010a74e4665425831a9db4e7c4e0fde4352e391e808e/MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl" + } + ], + "project_name": "markupsafe", + "requires_dists": [], + "requires_python": ">=3.7", + "version": "2.1.5" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "68687e19a14f11f26d140dd5c86f3dba4bf5df58003000ed467e0e2a69bca96c", + "url": "https://files.pythonhosted.org/packages/9a/67/7e8406a29b6c45be7af7740456f7f37025f0506ae2e05fb9009a53946860/monotonic-1.6-py2.py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "3a55207bcfed53ddd5c5bae174524062935efed17792e9de2ad0205ce9ad63f7", + "url": "https://files.pythonhosted.org/packages/ea/ca/8e91948b782ddfbd194f323e7e7d9ba12e5877addf04fb2bf8fca38e86ac/monotonic-1.6.tar.gz" + } + ], + "project_name": "monotonic", + "requires_dists": [], + "requires_python": null, + "version": "1.6" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7", + "url": "https://files.pythonhosted.org/packages/fa/a2/17e1e23c6be0a916219c5292f509360c345b5fa6beeb50d743203c27532c/multidict-6.0.5-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "fe5d7785250541f7f5019ab9cba2c71169dc7d74d0f45253f8313f436458a4ef", + "url": "https://files.pythonhosted.org/packages/11/b7/bef33e84e3722bc42531af020d7ae8c31235ce8846bacaa852b6484cf868/multidict-6.0.5-cp310-cp310-musllinux_1_1_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "6939c95381e003f54cd4c5516740faba40cf5ad3eeff460c3ad1d3e0ea2549bf", + "url": "https://files.pythonhosted.org/packages/12/4d/99dfc36872dcc53956879f5da80a6505bbd29214cce90ce792a86e15fddf/multidict-6.0.5-cp310-cp310-musllinux_1_1_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "c1c1496e73051918fcd4f58ff2e0f2f3066d1c76a0c6aeffd9b45d53243702cc", + "url": "https://files.pythonhosted.org/packages/26/ce/f745a2d6104e56f7fa0d7d0756bb9ed27b771dd7b8d9d7348cd7f0f7b9de/multidict-6.0.5-cp310-cp310-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "21fd81c4ebdb4f214161be351eb5bcf385426bf023041da2fd9e60681f3cebae", + "url": "https://files.pythonhosted.org/packages/33/62/2c9085e571318d51212a6914566fe41dd0e33d7f268f7e2f23dcd3f06c56/multidict-6.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "7c6390cf87ff6234643428991b7359b5f59cc15155695deb4eda5c777d2b880f", + "url": "https://files.pythonhosted.org/packages/36/6d/d2f982fb485175727a193b4900b5f929d461e7aa87d6fb5a91a377fcc9c0/multidict-6.0.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "215ed703caf15f578dca76ee6f6b21b7603791ae090fbf1ef9d865571039ade5", + "url": "https://files.pythonhosted.org/packages/8d/ea/0230b6faa9a5bc10650fd50afcc4a86e6c37af2fe05bc679b74d79253732/multidict-6.0.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "411bf8515f3be9813d06004cac41ccf7d1cd46dfe233705933dd163b60e37600", + "url": "https://files.pythonhosted.org/packages/a4/eb/d8e7693c9064554a1585698d1902839440c6c695b0f53c9a8be5d9d4a3b8/multidict-6.0.5-cp310-cp310-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "228b644ae063c10e7f324ab1ab6b548bdf6f8b47f3ec234fef1093bc2735e5f9", + "url": "https://files.pythonhosted.org/packages/b7/36/48097b96135017ed1b806c5ea27b6cdc2ed3a6861c5372b793563206c586/multidict-6.0.5-cp310-cp310-macosx_10_9_universal2.whl" + }, + { + "algorithm": "sha256", + "hash": "766c8f7511df26d9f11cd3a8be623e59cca73d44643abab3f8c8c07620524e4a", + "url": "https://files.pythonhosted.org/packages/bc/84/9579004267e1cc5968ef2ef8718dab9d8950d99354d85b739dd67b09c273/multidict-6.0.5-cp310-cp310-musllinux_1_1_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "220dd781e3f7af2c2c1053da9fa96d9cf3072ca58f057f4c5adaaa1cab8fc442", + "url": "https://files.pythonhosted.org/packages/c2/5c/1e76b2c742cb9e0248d1e8c4ed420817879230c833fa27d890b5fd22290b/multidict-6.0.5-cp310-cp310-musllinux_1_1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "3cc2ad10255f903656017363cd59436f2111443a76f996584d1077e43ee51182", + "url": "https://files.pythonhosted.org/packages/ce/e2/88cdfeaf03eab3498f688a19b62ca704d371cd904cb74b682541ca7b20a7/multidict-6.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "896ebdcf62683551312c30e20614305f53125750803b614e9e6ce74a96232604", + "url": "https://files.pythonhosted.org/packages/d9/48/037440edb5d4a1c65e002925b2f24071d6c27754e6f4734f63037e3169d6/multidict-6.0.5-cp310-cp310-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "1d147090048129ce3c453f0292e7697d333db95e52616b3793922945804a433c", + "url": "https://files.pythonhosted.org/packages/f3/7d/fe7648d4b2f200f8854066ce6e56bf51889abfaf859814c62160dd0e32a9/multidict-6.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da", + "url": "https://files.pythonhosted.org/packages/f9/79/722ca999a3a09a63b35aac12ec27dfa8e5bb3a38b0f857f7a1a209a88836/multidict-6.0.5.tar.gz" + } + ], + "project_name": "multidict", + "requires_dists": [], + "requires_python": ">=3.7", + "version": "6.0.5" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "5e05b1c973a9f858c74367553e236f287e749465f773328c8ef31abe18f691e1", + "url": "https://files.pythonhosted.org/packages/e4/f3/679b3a042a127de0d7c84874913c3e23bb84646eb3bc6ecab3f8c872edc9/numpy-1.23.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "9c88793f78fca17da0145455f0d7826bcb9f37da4764af27ac945488116efe63", + "url": "https://files.pythonhosted.org/packages/0f/ae/dad4b8e7c65494cbbd1c063de114efaf9acd0f5f6171f044f0d4b6299787/numpy-1.23.5-cp310-cp310-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "1b1766d6f397c18153d40015ddfc79ddb715cabadc04d2d228d4e5a8bc4ded1a", + "url": "https://files.pythonhosted.org/packages/42/38/775b43da55fa7473015eddc9a819571517d9a271a9f8134f68fb9be2f212/numpy-1.23.5.tar.gz" + }, + { + "algorithm": "sha256", + "hash": "e9f4c4e51567b616be64e05d517c79a8a22f3606499941d97bb76f2ca59f982d", + "url": "https://files.pythonhosted.org/packages/4d/39/d33202cc56c21123a50c6d5e160d00c18ff685ab864dbd4bf80dd40a7af9/numpy-1.23.5-cp310-cp310-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "7903ba8ab592b82014713c491f6c5d3a1cde5b4a3bf116404e08f5b52f6daf43", + "url": "https://files.pythonhosted.org/packages/67/6b/d7c93d458d16464da9b3f560a20c363a19e242ebbb019bd1e1d797523851/numpy-1.23.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + } + ], + "project_name": "numpy", + "requires_dists": [], + "requires_python": ">=3.8", + "version": "1.23.5" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "b8a81cc5d60e2d364f0b1b98f958dbd472887acaf1a5b05e21c28c31a2d6d3ac", + "url": "https://files.pythonhosted.org/packages/95/a9/4f25a14d23f0786b64875b91784607c2277eff25d48f915e39ff0cff505a/oauth2client-4.1.3-py2.py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "d486741e451287f69568a4d26d70d9acd73a2bbfa275746c535b4209891cccc6", + "url": "https://files.pythonhosted.org/packages/a6/7b/17244b1083e8e604bf154cf9b716aecd6388acd656dd01893d0d244c94d9/oauth2client-4.1.3.tar.gz" + } + ], + "project_name": "oauth2client", + "requires_dists": [ + "httplib2>=0.9.1", + "pyasn1-modules>=0.0.5", + "pyasn1>=0.1.7", + "rsa>=3.1.4", + "six>=1.6.1" + ], + "requires_python": null, + "version": "4.1.3" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "6251910e554f811fdd070164b0bc76d76b067b95576cb9dad4d52ae64fe014b5", + "url": "https://files.pythonhosted.org/packages/c6/7e/5031717c0636e6074764a2f61a459a3ecd46c20d8b83a1f1cd2513a76160/onnx-1.16.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "15abf94a7868eed6db15a8b5024ba570c891cae77ca4d0e7258dabdad76980df", + "url": "https://files.pythonhosted.org/packages/36/16/07a819f1139a75e67b0b31e1474e5770d1e7c93b69744c6f7434415a9f65/onnx-1.16.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "8299193f0f2a3849bfc069641aa8e4f93696602da8d165632af8ee48ec7556b6", + "url": "https://files.pythonhosted.org/packages/74/be/242d02ebf7fe115bd695166eeea58b2206c9fa62de22cf9cbf8986fa8d27/onnx-1.16.1.tar.gz" + }, + { + "algorithm": "sha256", + "hash": "bb2d392e5b7060082c2fb38eb5c44f67eb34ff5f0681bd6f45beff9abc6f7094", + "url": "https://files.pythonhosted.org/packages/7d/bf/810fe3215735ff55a2b65d0430ba9782b70916d67554d9c2c58cebeace45/onnx-1.16.1-cp310-cp310-macosx_11_0_universal2.whl" + } + ], + "project_name": "onnx", + "requires_dists": [ + "Pillow; extra == \"reference\"", + "google-re2; extra == \"reference\"", + "numpy>=1.20", + "protobuf>=3.20.2" + ], + "requires_python": ">=3.8", + "version": "1.16.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "9ace140fc6d647fbe1c692bcb2abce768973491222c067c131d80957c595b71f", + "url": "https://files.pythonhosted.org/packages/3f/a4/d2537f47fd7fcfba966bd806e3ec18e7ee1681056d4b0a9c8d983983e4d5/opencv_python-4.10.0.84-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "72d234e4582e9658ffea8e9cae5b63d488ad06994ef12d81dc303b17472f3526", + "url": "https://files.pythonhosted.org/packages/4a/e7/b70a2d9ab205110d715906fc8ec83fbb00404aeb3a37a0654fdb68eb0c8c/opencv-python-4.10.0.84.tar.gz" + }, + { + "algorithm": "sha256", + "hash": "71e575744f1d23f79741450254660442785f45a0797212852ee5199ef12eed98", + "url": "https://files.pythonhosted.org/packages/64/4a/016cda9ad7cf18c58ba074628a4eaae8aa55f3fd06a266398cef8831a5b9/opencv_python-4.10.0.84-cp37-abi3-macosx_12_0_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "fc182f8f4cda51b45f01c64e4cbedfc2f00aff799debebc305d8d0210c43f251", + "url": "https://files.pythonhosted.org/packages/66/82/564168a349148298aca281e342551404ef5521f33fba17b388ead0a84dc5/opencv_python-4.10.0.84-cp37-abi3-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "09a332b50488e2dda866a6c5573ee192fe3583239fb26ff2f7f9ceb0bc119ea6", + "url": "https://files.pythonhosted.org/packages/81/e4/7a987ebecfe5ceaf32db413b67ff18eb3092c598408862fff4d7cc3fd19b/opencv_python-4.10.0.84-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + } + ], + "project_name": "opencv-python", + "requires_dists": [ + "numpy>=1.13.3; python_version < \"3.7\"", + "numpy>=1.17.0; python_version >= \"3.7\"", + "numpy>=1.17.3; python_version >= \"3.8\"", + "numpy>=1.19.3; python_version >= \"3.6\" and platform_system == \"Linux\" and platform_machine == \"aarch64\"", + "numpy>=1.19.3; python_version >= \"3.9\"", + "numpy>=1.21.0; python_version <= \"3.9\" and platform_system == \"Darwin\" and platform_machine == \"arm64\"", + "numpy>=1.21.2; python_version >= \"3.10\"", + "numpy>=1.21.4; python_version >= \"3.10\" and platform_system == \"Darwin\"", + "numpy>=1.23.5; python_version >= \"3.11\"", + "numpy>=1.26.0; python_version >= \"3.12\"" + ], + "requires_python": ">=3.6", + "version": "4.10.0.84" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124", + "url": "https://files.pythonhosted.org/packages/08/aa/cc0199a5f0ad350994d660967a8efb233fe0416e4639146c089643407ce6/packaging-24.1-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002", + "url": "https://files.pythonhosted.org/packages/51/65/50db4dda066951078f0a96cf12f4b9ada6e4b811516bf0262c0f4f7064d4/packaging-24.1.tar.gz" + } + ], + "project_name": "packaging", + "requires_dists": [], + "requires_python": ">=3.8", + "version": "24.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee", + "url": "https://files.pythonhosted.org/packages/68/13/2aa1f0e1364feb2c9ef45302f387ac0bd81484e9c9a4c5688a322fbdfd08/platformdirs-4.2.2-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3", + "url": "https://files.pythonhosted.org/packages/f5/52/0763d1d976d5c262df53ddda8d8d4719eedf9594d046f117c25a27261a19/platformdirs-4.2.2.tar.gz" + } + ], + "project_name": "platformdirs", + "requires_dists": [ + "appdirs==1.4.4; extra == \"test\"", + "covdefaults>=2.3; extra == \"test\"", + "furo>=2023.9.10; extra == \"docs\"", + "mypy>=1.8; extra == \"type\"", + "proselint>=0.13; extra == \"docs\"", + "pytest-cov>=4.1; extra == \"test\"", + "pytest-mock>=3.12; extra == \"test\"", + "pytest>=7.4.3; extra == \"test\"", + "sphinx-autodoc-typehints>=1.25.2; extra == \"docs\"", + "sphinx>=7.2.6; extra == \"docs\"" + ], + "requires_python": ">=3.8", + "version": "4.2.2" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", + "url": "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", + "url": "https://files.pythonhosted.org/packages/96/2d/02d4312c973c6050a18b314a5ad0b3210edb65a906f868e31c111dede4a6/pluggy-1.5.0.tar.gz" + } + ], + "project_name": "pluggy", + "requires_dists": [ + "pre-commit; extra == \"dev\"", + "pytest-benchmark; extra == \"testing\"", + "pytest; extra == \"testing\"", + "tox; extra == \"dev\"" + ], + "requires_python": ">=3.8", + "version": "1.5.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "f0700d54bcf45424477e46a9f0944155b46fb0639d69728739c0e47bab83f2b9", + "url": "https://files.pythonhosted.org/packages/f4/d5/db585a5e8d64af6b384c7b3a63da13df2ff86933e486ba78431736c67c25/protobuf-4.25.3-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "7c8daa26095f82482307bc717364e7c13f4f1c99659be82890dcfc215194554d", + "url": "https://files.pythonhosted.org/packages/15/db/7f731524fe0e56c6b2eb57d05b55d3badd80ef7d1f1ed59db191b2fdd8ab/protobuf-4.25.3-cp37-abi3-manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "25b5d0b42fd000320bd7830b349e3b696435f3b329810427a6bcce6a5492cc5c", + "url": "https://files.pythonhosted.org/packages/5e/d8/65adb47d921ce828ba319d6587aa8758da022de509c3862a70177a958844/protobuf-4.25.3.tar.gz" + }, + { + "algorithm": "sha256", + "hash": "e7cb0ae90dd83727f0c0718634ed56837bfeeee29a5f82a7514c03ee1364c019", + "url": "https://files.pythonhosted.org/packages/d8/82/aefe901174b5a618daee511ddd00342193c1b545e3cd6a2cd6df9ba452b5/protobuf-4.25.3-cp37-abi3-manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "f1279ab38ecbfae7e456a108c5c0681e4956d5b1090027c1de0f934dfdb4b35c", + "url": "https://files.pythonhosted.org/packages/f3/bf/26deba06a4c910a85f78245cac7698f67cedd7efe00d04f6b3e1b3506a59/protobuf-4.25.3-cp37-abi3-macosx_10_9_universal2.whl" + } + ], + "project_name": "protobuf", + "requires_dists": [], + "requires_python": ">=3.8", + "version": "4.25.3" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "ffe7fc9b6b36beadc8c322f84e1caff51e8703b88eee1da46d1e3a6ae11b4fd0", + "url": "https://files.pythonhosted.org/packages/7c/06/63872a64c312a24fb9b4af123ee7007a306617da63ff13bcc1432386ead7/psutil-6.0.0-cp38-abi3-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "c588a7e9b1173b6e866756dde596fd4cad94f9399daf99ad8c3258b3cb2b47a0", + "url": "https://files.pythonhosted.org/packages/0b/37/f8da2fbd29690b3557cca414c1949f92162981920699cd62095a984983bf/psutil-6.0.0-cp36-abi3-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "8faae4f310b6d969fa26ca0545338b21f73c6b15db7c4a8d934a5482faa818f2", + "url": "https://files.pythonhosted.org/packages/18/c7/8c6872f7372eb6a6b2e4708b88419fb46b857f7a2e1892966b851cc79fc9/psutil-6.0.0.tar.gz" + }, + { + "algorithm": "sha256", + "hash": "5fd9a97c8e94059b0ef54a7d4baf13b405011176c3b6ff257c247cae0d560ecd", + "url": "https://files.pythonhosted.org/packages/19/74/f59e7e0d392bc1070e9a70e2f9190d652487ac115bb16e2eff6b22ad1d24/psutil-6.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "6ed2440ada7ef7d0d608f20ad89a04ec47d2d3ab7190896cd62ca5fc4fe08bf0", + "url": "https://files.pythonhosted.org/packages/35/56/72f86175e81c656a01c4401cd3b1c923f891b31fbcebe98985894176d7c9/psutil-6.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "e2e8d0054fc88153ca0544f5c4d554d42e33df2e009c4ff42284ac9ebdef4132", + "url": "https://files.pythonhosted.org/packages/cd/5f/60038e277ff0a9cc8f0c9ea3d0c5eb6ee1d2470ea3f9389d776432888e47/psutil-6.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + } + ], + "project_name": "psutil", + "requires_dists": [ + "enum34; python_version <= \"3.4\" and extra == \"test\"", + "ipaddress; python_version < \"3.0\" and extra == \"test\"", + "mock; python_version < \"3.0\" and extra == \"test\"", + "pywin32; sys_platform == \"win32\" and extra == \"test\"", + "wmi; sys_platform == \"win32\" and extra == \"test\"" + ], + "requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7", + "version": "6.0.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378", + "url": "https://files.pythonhosted.org/packages/f6/f0/10642828a8dfb741e5f3fbaac830550a518a775c7fff6f04a007259b0548/py-1.11.0-py2.py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719", + "url": "https://files.pythonhosted.org/packages/98/ff/fec109ceb715d2a6b4c4a85a61af3b40c723a961e8828319fbcb15b868dc/py-1.11.0.tar.gz" + } + ], + "project_name": "py", + "requires_dists": [], + "requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7", + "version": "1.11.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "859625bc251f64e21f077d099d4162689c762b5d6a4c3c97553d56241c9674d5", + "url": "https://files.pythonhosted.org/packages/e0/a9/023730ba63db1e494a271cb018dcd361bd2c917ba7004c3e49d5daf795a2/py_cpuinfo-9.0.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "3cdbbf3fac90dc6f118bfd64384f309edeadd902d7c8fb17f02ffa1fc3f49690", + "url": "https://files.pythonhosted.org/packages/37/a8/d832f7293ebb21690860d2e01d8115e5ff6f2ae8bbdc953f0eb0fa4bd2c7/py-cpuinfo-9.0.0.tar.gz" + } + ], + "project_name": "py-cpuinfo", + "requires_dists": [], + "requires_python": null, + "version": "9.0.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "cca4bb0f2df5504f02f6f8a775b6e416ff9b0b3b16f7ee80b5a3153d9b804473", + "url": "https://files.pythonhosted.org/packages/23/7e/5f50d07d5e70a2addbccd90ac2950f81d1edd0783630651d9268d7f1db49/pyasn1-0.6.0-py2.py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "3a35ab2c4b5ef98e17dfdec8ab074046fbda76e281c5a706ccd82328cfc8f64c", + "url": "https://files.pythonhosted.org/packages/4a/a3/d2157f333900747f20984553aca98008b6dc843eb62f3a36030140ccec0d/pyasn1-0.6.0.tar.gz" + } + ], + "project_name": "pyasn1", + "requires_dists": [], + "requires_python": ">=3.8", + "version": "0.6.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "be04f15b66c206eed667e0bb5ab27e2b1855ea54a842e5037738099e8ca4ae0b", + "url": "https://files.pythonhosted.org/packages/13/68/8906226b15ef38e71dc926c321d2fe99de8048e9098b5dfd38343011c886/pyasn1_modules-0.4.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "831dbcea1b177b28c9baddf4c6d1013c24c3accd14a1873fffaa6a2e905f17b6", + "url": "https://files.pythonhosted.org/packages/f7/00/e7bd1dec10667e3f2be602686537969a7ac92b0a7c5165be2e5875dc3971/pyasn1_modules-0.4.0.tar.gz" + } + ], + "project_name": "pyasn1-modules", + "requires_dists": [ + "pyasn1<0.7.0,>=0.4.6" + ], + "requires_python": ">=3.8", + "version": "0.4.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", + "url": "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", + "url": "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz" + } + ], + "project_name": "pycparser", + "requires_dists": [], + "requires_python": ">=3.8", + "version": "2.22" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "7d65fb222eea1294cfc8206d9e5754d476a1673eb2783c03c4f70e0455320274", + "url": "https://files.pythonhosted.org/packages/83/59/5b05cb1bff0c2341e01733b9c341eea8f1cc9cc893c8c429437bd90ee8bd/pygame-2.6.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "e5707aa9d029752495b3eddc1edff62e0e390a02f699b0f1ce77fe0b8c70ea4f", + "url": "https://files.pythonhosted.org/packages/2f/1c/e515c10196aed75dbef75b41ff3069897c9405f568169694a3b3f8fc0f4c/pygame-2.6.0-cp310-cp310-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "89be55b7e9e22e0eea08af9d6cfb97aed5da780f0b3a035803437d481a16d972", + "url": "https://files.pythonhosted.org/packages/4b/aa/2e9c10266df048f186ad86ec543fc788e13f99f1b8ccf6d47658f26d0b79/pygame-2.6.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "722d33ae676aa8533c1f955eded966411298831346b8d51a77dad22e46ba3e35", + "url": "https://files.pythonhosted.org/packages/72/49/bd2fcbadb6a55bb24284bad4f530189401c99ffc234d51ba54756a776eb2/pygame-2.6.0.tar.gz" + }, + { + "algorithm": "sha256", + "hash": "6050f3e95f1f16602153d616b52619c6a2041cee7040eb529f65689e9633fc3e", + "url": "https://files.pythonhosted.org/packages/7c/c8/be72ca148131b3eef3851245e2f081abadf634feffe33edea3c9f619f1ef/pygame-2.6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "d3ed0547368733b854c0d9981c982a3cdfabfa01b477d095c57bf47f2199da44", + "url": "https://files.pythonhosted.org/packages/cc/2f/270b3a9c5f1567d91255af15e9f9685d412461115fd96f393777be04b339/pygame-2.6.0-cp310-cp310-macosx_11_0_arm64.whl" + } + ], + "project_name": "pygame", + "requires_dists": [], + "requires_python": ">=3.6", + "version": "2.6.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "17ed5be5936449c5418d1cd269a1a9e9081bc54c17aed272b45856a3d3dc86ad", + "url": "https://files.pythonhosted.org/packages/54/a7/2104f674a5a6845b04c8ff01659becc6b8978ca410b82b94287e0b1e018b/pyOpenSSL-24.1.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "cabed4bfaa5df9f1a16c0ef64a0cb65318b5cd077a7eda7d6970131ca2f41a6f", + "url": "https://files.pythonhosted.org/packages/91/a8/cbeec652549e30103b9e6147ad433405fdd18807ac2d54e6dbb73184d8a1/pyOpenSSL-24.1.0.tar.gz" + } + ], + "project_name": "pyopenssl", + "requires_dists": [ + "cryptography<43,>=41.0.5", + "pretend; extra == \"test\"", + "pytest-rerunfailures; extra == \"test\"", + "pytest>=3.0.1; extra == \"test\"", + "sphinx!=5.2.0,!=5.2.0.post0,!=7.2.5; extra == \"docs\"", + "sphinx-rtd-theme; extra == \"docs\"" + ], + "requires_python": ">=3.7", + "version": "24.1.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742", + "url": "https://files.pythonhosted.org/packages/9d/ea/6d76df31432a0e6fdf81681a895f009a4bb47b3c39036db3e1b528191d52/pyparsing-3.1.2-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad", + "url": "https://files.pythonhosted.org/packages/46/3a/31fd28064d016a2182584d579e033ec95b809d8e220e74c4af6f0f2e8842/pyparsing-3.1.2.tar.gz" + } + ], + "project_name": "pyparsing", + "requires_dists": [ + "jinja2; extra == \"diagrams\"", + "railroad-diagrams; extra == \"diagrams\"" + ], + "requires_python": ">=3.6.8", + "version": "3.1.2" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343", + "url": "https://files.pythonhosted.org/packages/4e/e7/81ebdd666d3bff6670d27349b5053605d83d55548e6bd5711f3b0ae7dd23/pytest-8.2.2-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977", + "url": "https://files.pythonhosted.org/packages/a6/58/e993ca5357553c966b9e73cb3475d9c935fe9488746e13ebdf9b80fae508/pytest-8.2.2.tar.gz" + } + ], + "project_name": "pytest", + "requires_dists": [ + "argcomplete; extra == \"dev\"", + "attrs>=19.2; extra == \"dev\"", + "colorama; sys_platform == \"win32\"", + "exceptiongroup>=1.0.0rc8; python_version < \"3.11\"", + "hypothesis>=3.56; extra == \"dev\"", + "iniconfig", + "mock; extra == \"dev\"", + "packaging", + "pluggy<2.0,>=1.5", + "pygments>=2.7.2; extra == \"dev\"", + "requests; extra == \"dev\"", + "setuptools; extra == \"dev\"", + "tomli>=1; python_version < \"3.11\"", + "xmlschema; extra == \"dev\"" + ], + "requires_python": ">=3.8", + "version": "8.2.2" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "fdb7db64e31c8b277dff9850d2a2556d8b60bcb0ea6524e36e28ffd7c87f71d6", + "url": "https://files.pythonhosted.org/packages/4d/a1/3b70862b5b3f830f0422844f25a823d0470739d994466be9dbbbb414d85a/pytest_benchmark-4.0.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "fb0785b83efe599a6a956361c0691ae1dbb5318018561af10f3e915caa0048d1", + "url": "https://files.pythonhosted.org/packages/28/08/e6b0067efa9a1f2a1eb3043ecd8a0c48bfeb60d3255006dcc829d72d5da2/pytest-benchmark-4.0.0.tar.gz" + } + ], + "project_name": "pytest-benchmark", + "requires_dists": [ + "aspectlib; extra == \"aspect\"", + "elasticsearch; extra == \"elasticsearch\"", + "pathlib2; python_version < \"3.4\"", + "py-cpuinfo", + "pygal; extra == \"histogram\"", + "pygaljs; extra == \"histogram\"", + "pytest>=3.8", + "statistics; python_version < \"3.4\"" + ], + "requires_python": ">=3.7", + "version": "4.0.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "578d5d15ac4a25e5f961c938b85a05b09fdaae9deef3bb6de9a6e766622ca7a6", + "url": "https://files.pythonhosted.org/packages/20/49/b3e0edec68d81846f519c602ac38af9db86e1e71275528b3e814ae236063/pytest_cov-3.0.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "e7f0f5b1617d2210a2cabc266dfe2f4c75a8d32fb89eafb7ad9d06f6d076d470", + "url": "https://files.pythonhosted.org/packages/61/41/e046526849972555928a6d31c2068410e47a31fb5ab0a77f868596811329/pytest-cov-3.0.0.tar.gz" + } + ], + "project_name": "pytest-cov", + "requires_dists": [ + "coverage[toml]>=5.2.1", + "fields; extra == \"testing\"", + "hunter; extra == \"testing\"", + "process-tests; extra == \"testing\"", + "pytest-xdist; extra == \"testing\"", + "pytest>=4.6", + "six; extra == \"testing\"", + "virtualenv; extra == \"testing\"" + ], + "requires_python": ">=3.6", + "version": "3.0.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "810958f66a91afb1a1e2ae83089d8dc1cd2437ac96b12963042fbb9fb4d16af0", + "url": "https://files.pythonhosted.org/packages/f4/af/9c0bda43e486a3c9bf1e0f876d0f241bc3f229d7d65d09331a0868db9629/pytest_forked-1.6.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "4dafd46a9a600f65d822b8f605133ecf5b3e1941ebb3588e943b4e3eb71a5a3f", + "url": "https://files.pythonhosted.org/packages/8c/c9/93ad2ba2413057ee694884b88cf7467a46c50c438977720aeac26e73fdb7/pytest-forked-1.6.0.tar.gz" + } + ], + "project_name": "pytest-forked", + "requires_dists": [ + "py", + "pytest>=3.10" + ], + "requires_python": ">=3.7", + "version": "1.6.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "b05cb0bcd51a7cd0375bfbeeb3eaeb01fc85665e45b21fc9494a8a19137f4d32", + "url": "https://files.pythonhosted.org/packages/c5/d1/2ef73ee137add043df444fddf1c851b8ca70ab9c7b7f18e18c4c244fec6d/pytest_platform_markers-1.0.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "07ea92669114ba8083b6653995b5a9ab14d57ca16307fd2af22d6f7d295160e4", + "url": "https://files.pythonhosted.org/packages/b3/e7/174a22a8cb4cf4b64456cd799f472bb90206f1ce8d537edbc1d9659689a3/pytest-platform-markers-1.0.0.tar.gz" + } + ], + "project_name": "pytest-platform-markers", + "requires_dists": [ + "pytest>=3.6.0" + ], + "requires_python": null, + "version": "1.0.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "4197bdd2eaeffdbf50b5ea6e7236f47ff0e44d1def8dae08e409f536d84e7b32", + "url": "https://files.pythonhosted.org/packages/dc/e7/e75bd157331aecc190f5f8950d7ea3d2cf56c3c57fb44da70e60b221133f/pytest_rerunfailures-14.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "4a400bcbcd3c7a4ad151ab8afac123d90eca3abe27f98725dc4d9702887d2e92", + "url": "https://files.pythonhosted.org/packages/cc/a4/6de45fe850759e94aa9a55cda807c76245af1941047294df26c851dfb4a9/pytest-rerunfailures-14.0.tar.gz" + } + ], + "project_name": "pytest-rerunfailures", + "requires_dists": [ + "packaging>=17.1", + "pytest>=7.2" + ], + "requires_python": ">=3.8", + "version": "14.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "6fe5c74fec98906deb8f2d2b616b5c782022744978e7bd4695d39c8f42d0ce65", + "url": "https://files.pythonhosted.org/packages/21/08/b1945d4b4986eb1aa10cf84efc5293bba39da80a2f95db3573dd90678408/pytest_xdist-2.5.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "4580deca3ff04ddb2ac53eba39d76cb5dd5edeac050cb6fbc768b0dd712b4edf", + "url": "https://files.pythonhosted.org/packages/5d/43/9dbc32d297d6eae85d6c05dc8e8d3371061bd6cbe56a2f645d9ea4b53d9b/pytest-xdist-2.5.0.tar.gz" + } + ], + "project_name": "pytest-xdist", + "requires_dists": [ + "execnet>=1.1", + "filelock; extra == \"testing\"", + "psutil>=3.0; extra == \"psutil\"", + "pytest-forked", + "pytest>=6.2.0", + "setproctitle; extra == \"setproctitle\"" + ], + "requires_python": ">=3.6", + "version": "2.5.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "a3caa3a11842fc7d5746376f37195e6af5f17c0a15737538bb1cebf656fb306b", + "url": "https://files.pythonhosted.org/packages/29/b5/c1209e6cb77647bc2c9a6a1a953355720f34f3b006b725e303c70f3c0786/pyu2f-0.1.5.tar.gz" + } + ], + "project_name": "pyu2f", + "requires_dists": [ + "six" + ], + "requires_python": null, + "version": "0.1.5" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290", + "url": "https://files.pythonhosted.org/packages/07/91/45dfd0ef821a7f41d9d0136ea3608bb5b1653e42fd56a7970532cb5c003f/PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515", + "url": "https://files.pythonhosted.org/packages/29/61/bf33c6c85c55bc45a29eee3195848ff2d518d84735eb0e2d8cb42e0d285e/PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f", + "url": "https://files.pythonhosted.org/packages/5b/07/10033a403b23405a8fc48975444463d3d10a5c2736b7eb2550b07b367429/PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a", + "url": "https://files.pythonhosted.org/packages/96/06/4beb652c0fe16834032e54f0956443d4cc797fe645527acee59e7deaa0a2/PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d", + "url": "https://files.pythonhosted.org/packages/ba/91/090818dfa62e85181f3ae23dd1e8b7ea7f09684864a900cab72d29c57346/PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43", + "url": "https://files.pythonhosted.org/packages/cd/e5/af35f7ea75cf72f2cd079c95ee16797de7cd71f29ea7c68ae5ce7be1eda0/PyYAML-6.0.1.tar.gz" + }, + { + "algorithm": "sha256", + "hash": "69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938", + "url": "https://files.pythonhosted.org/packages/f1/26/55e4f21db1f72eaef092015d9017c11510e7e6301c62a6cfee91295d13c6/PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + } + ], + "project_name": "pyyaml", + "requires_dists": [], + "requires_python": ">=3.6", + "version": "6.0.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", + "url": "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", + "url": "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz" + } + ], + "project_name": "requests", + "requires_dists": [ + "PySocks!=1.5.7,>=1.5.6; extra == \"socks\"", + "certifi>=2017.4.17", + "chardet<6,>=3.0.2; extra == \"use-chardet-on-py3\"", + "charset-normalizer<4,>=2", + "idna<4,>=2.5", + "urllib3<3,>=1.21.1" + ], + "requires_python": ">=3.8", + "version": "2.32.3" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "e1e8ad02e518fe11073f2ea7d80b6b8be19daa27a60a1838aff7c731ddcf2ebe", + "url": "https://files.pythonhosted.org/packages/6e/e6/bedc75b264cbcbf6e6d0e5071d96d739f540fc09be31744a7a8824c02a8e/retry_decorator-1.1.1.tar.gz" + } + ], + "project_name": "retry-decorator", + "requires_dists": [], + "requires_python": null, + "version": "1.1.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "78f9a9bf4e7be0c5ded4583326e7461e3a3c5aae24073648b4bdfa797d78c9d2", + "url": "https://files.pythonhosted.org/packages/e9/93/0c0f002031f18b53af7a6166103c02b9c0667be528944137cc954ec921b3/rsa-4.7.2-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "9d689e6ca1b3038bc82bf8d23e944b6b6037bc02301a574935b2dd946e0353b9", + "url": "https://files.pythonhosted.org/packages/db/b5/475c45a58650b0580421746504b680cd2db4e81bc941e94ca53785250269/rsa-4.7.2.tar.gz" + } + ], + "project_name": "rsa", + "requires_dists": [ + "pyasn1>=0.1.3" + ], + "requires_python": "<4,>=3.5", + "version": "4.7.2" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "ef1b3d54eb715825657cd4bb3cb42bb4dc85087bac14c56b0fd8c21abd968c9a", + "url": "https://files.pythonhosted.org/packages/90/6a/a7d19d776ba9899c97acb223ceba4080ef9f5de9d7599203ae64b56ed597/sentry_sdk-2.7.1-py2.py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "25006c7e68b75aaa5e6b9c6a420ece22e8d7daec4b7a906ffd3a8607b67c037b", + "url": "https://files.pythonhosted.org/packages/b8/63/310d89868a0dab17f6d7c1f35eba9c304dd06c2a17d0d26905738763b614/sentry_sdk-2.7.1.tar.gz" + } + ], + "project_name": "sentry-sdk", + "requires_dists": [ + "aiohttp>=3.5; extra == \"aiohttp\"", + "anthropic>=0.16; extra == \"anthropic\"", + "apache-beam>=2.12; extra == \"beam\"", + "arq>=0.23; extra == \"arq\"", + "asttokens; extra == \"pure-eval\"", + "asyncpg>=0.23; extra == \"asyncpg\"", + "blinker>=1.1; extra == \"flask\"", + "blinker>=1.1; extra == \"quart\"", + "bottle>=0.12.13; extra == \"bottle\"", + "celery-redbeat>=2; extra == \"celery-redbeat\"", + "celery>=3; extra == \"celery\"", + "certifi", + "chalice>=1.16.0; extra == \"chalice\"", + "clickhouse-driver>=0.2.0; extra == \"clickhouse-driver\"", + "django>=1.8; extra == \"django\"", + "executing; extra == \"pure-eval\"", + "falcon>=1.4; extra == \"falcon\"", + "fastapi>=0.79.0; extra == \"fastapi\"", + "flask>=0.11; extra == \"flask\"", + "grpcio>=1.21.1; extra == \"grpcio\"", + "httpx>=0.16.0; extra == \"httpx\"", + "huey>=2; extra == \"huey\"", + "huggingface-hub>=0.22; extra == \"huggingface-hub\"", + "langchain>=0.0.210; extra == \"langchain\"", + "loguru>=0.5; extra == \"loguru\"", + "markupsafe; extra == \"flask\"", + "openai>=1.0.0; extra == \"openai\"", + "opentelemetry-distro>=0.35b0; extra == \"opentelemetry\"", + "opentelemetry-instrumentation-aio-pika==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-aiohttp-client==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-aiopg==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-asgi==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-asyncio==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-asyncpg==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-aws-lambda==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-boto3sqs==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-boto==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-botocore==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-cassandra==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-celery==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-confluent-kafka==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-dbapi==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-django==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-elasticsearch==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-falcon==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-fastapi==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-flask==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-grpc==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-httpx==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-jinja2==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-kafka-python==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-logging==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-mysql==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-mysqlclient==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-pika==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-psycopg2==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-psycopg==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-pymemcache==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-pymongo==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-pymysql==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-pyramid==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-redis==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-remoulade==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-requests==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-sklearn==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-sqlalchemy==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-sqlite3==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-starlette==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-system-metrics==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-threading==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-tornado==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-tortoiseorm==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-urllib3==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-urllib==0.46b0; extra == \"opentelemetry-experimental\"", + "opentelemetry-instrumentation-wsgi==0.46b0; extra == \"opentelemetry-experimental\"", + "protobuf>=3.8.0; extra == \"grpcio\"", + "pure-eval; extra == \"pure-eval\"", + "pymongo>=3.1; extra == \"pymongo\"", + "pyspark>=2.4.4; extra == \"pyspark\"", + "quart>=0.16.1; extra == \"quart\"", + "rq>=0.6; extra == \"rq\"", + "sanic>=0.8; extra == \"sanic\"", + "sqlalchemy>=1.2; extra == \"sqlalchemy\"", + "starlette>=0.19.1; extra == \"starlette\"", + "starlite>=1.48; extra == \"starlite\"", + "tiktoken>=0.3.0; extra == \"openai\"", + "tornado>=6; extra == \"tornado\"", + "urllib3>=1.26.11" + ], + "requires_python": ">=3.6", + "version": "2.7.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "38ae9a02766dad331deb06855fb7a6ca15daea333b3967e214de12cfae8f0ef5", + "url": "https://files.pythonhosted.org/packages/70/1d/3b2249c833c7d52b59ff0602d760df0543dc1e6c272f145b949750edeb01/setproctitle-1.3.3-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "6b9e62ddb3db4b5205c0321dd69a406d8af9ee1693529d144e86bd43bcb4b6c0", + "url": "https://files.pythonhosted.org/packages/24/55/8b369b56007a5a2c7594cdb58cd4a09d7cca65b28483bb5582c6975663f1/setproctitle-1.3.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "9e3b99b338598de0bd6b2643bf8c343cf5ff70db3627af3ca427a5e1a1a90dd9", + "url": "https://files.pythonhosted.org/packages/35/30/ac99ecae8458ba995f85aa3aa911004679b405922e1487b0fba6fe8f4d37/setproctitle-1.3.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "da0d57edd4c95bf221b2ebbaa061e65b1788f1544977288bdf95831b6e44e44d", + "url": "https://files.pythonhosted.org/packages/3d/92/17168f4bb1a695094e93e73a1ef1f7b89953a6d91e8a7699a2c840ba712f/setproctitle-1.3.3-cp310-cp310-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "897a73208da48db41e687225f355ce993167079eda1260ba5e13c4e53be7f754", + "url": "https://files.pythonhosted.org/packages/4f/cc/c51e6371f640a9adbe693ddb89d68596e5a8e4b5e05b4d3c65ec504e2f6d/setproctitle-1.3.3-cp310-cp310-macosx_10_9_universal2.whl" + }, + { + "algorithm": "sha256", + "hash": "9617b676b95adb412bb69645d5b077d664b6882bb0d37bfdafbbb1b999568d85", + "url": "https://files.pythonhosted.org/packages/69/a7/2a77b68c11db87c22350381d6ce022011eb420076790e0e3697153e89458/setproctitle-1.3.3-cp310-cp310-musllinux_1_1_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "fc74e84fdfa96821580fb5e9c0b0777c1c4779434ce16d3d62a9c4d8c710df39", + "url": "https://files.pythonhosted.org/packages/79/e7/54b36be02aee8ad573be68f6f46fd62838735c2f007b22df50eb5e13a20d/setproctitle-1.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "1342f4fdb37f89d3e3c1c0a59d6ddbedbde838fff5c51178a7982993d238fe4f", + "url": "https://files.pythonhosted.org/packages/87/7b/69bdc791001250dff279a1a81904f3f563caece4fa1607a95b9fd5197d6e/setproctitle-1.3.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "38da436a0aaace9add67b999eb6abe4b84397edf4a78ec28f264e5b4c9d53cd5", + "url": "https://files.pythonhosted.org/packages/94/ad/4166381d79f6ae8138be9b49f05d193a8deb748debace9896dffad45a753/setproctitle-1.3.3-cp310-cp310-musllinux_1_1_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "bbbd6c7de0771c84b4aa30e70b409565eb1fc13627a723ca6be774ed6b9d9fa3", + "url": "https://files.pythonhosted.org/packages/9c/56/6f4a4e80b2810eb7ea9ab355022c780ef80457de368ab5b6b21b795e4f05/setproctitle-1.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "6a249415f5bb88b5e9e8c4db47f609e0bf0e20a75e8d744ea787f3092ba1f2d0", + "url": "https://files.pythonhosted.org/packages/9d/09/bc108723bbfb7c50c22fdf22191f3e32abcb5d6f46610018030b25f601c5/setproctitle-1.3.3-cp310-cp310-musllinux_1_1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "8c331e91a14ba4076f88c29c777ad6b58639530ed5b24b5564b5ed2fd7a95452", + "url": "https://files.pythonhosted.org/packages/c3/7d/d03f319e0f3b3a6e98731a56cd4d81478ed0c12531b822fd2c728b948edb/setproctitle-1.3.3-cp310-cp310-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "c05ac48ef16ee013b8a326c63e4610e2430dbec037ec5c5b58fcced550382b74", + "url": "https://files.pythonhosted.org/packages/d0/ae/010811bece9a59a8bba131d9e7acea9c2e3c3cbf544bf06d8b10b8c28ff5/setproctitle-1.3.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "c913e151e7ea01567837ff037a23ca8740192880198b7fbb90b16d181607caae", + "url": "https://files.pythonhosted.org/packages/ff/e1/b16b16a1aa12174349d15b73fd4b87e641a8ae3fb1163e80938dbbf6ae98/setproctitle-1.3.3.tar.gz" + } + ], + "project_name": "setproctitle", + "requires_dists": [ + "pytest; extra == \"test\"" + ], + "requires_python": ">=3.7", + "version": "1.3.3" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "6d10741ff20b89cd8c6a536ee9dc90d3002dec0226c78fb98605bfb9ef8a7adf", + "url": "https://files.pythonhosted.org/packages/40/a9/7deac76c58fa47c95360116a06b53b9b62f6db11336fe61b6ab53784d98b/setuptools-59.5.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "d144f85102f999444d06f9c0e8c737fd0194f10f2f7e5fdb77573f6e2fa4fad0", + "url": "https://files.pythonhosted.org/packages/e6/e2/f2bfdf364e016f7a464db709ea40d1101c4c5a463dd7019dae0a42dbd1c6/setuptools-59.5.0.tar.gz" + } + ], + "project_name": "setuptools", + "requires_dists": [ + "flake8-2020; extra == \"testing\"", + "furo; extra == \"docs\"", + "jaraco.envs>=2.2; extra == \"testing\"", + "jaraco.packaging>=8.2; extra == \"docs\"", + "jaraco.path>=3.2.0; extra == \"testing\"", + "jaraco.tidelift>=1.4; extra == \"docs\"", + "mock; extra == \"testing\"", + "paver; extra == \"testing\"", + "pip>=19.1; extra == \"testing\"", + "pygments-github-lexers==0.0.5; extra == \"docs\"", + "pytest-black>=0.3.7; platform_python_implementation != \"PyPy\" and extra == \"testing\"", + "pytest-checkdocs>=2.4; extra == \"testing\"", + "pytest-cov; extra == \"testing\"", + "pytest-enabler>=1.0.1; extra == \"testing\"", + "pytest-flake8; extra == \"testing\"", + "pytest-mypy; platform_python_implementation != \"PyPy\" and extra == \"testing\"", + "pytest-virtualenv>=1.2.7; extra == \"testing\"", + "pytest-xdist; extra == \"testing\"", + "pytest>=6; extra == \"testing\"", + "rst.linker>=1.9; extra == \"docs\"", + "sphinx-inline-tabs; extra == \"docs\"", + "sphinx; extra == \"docs\"", + "sphinx; extra == \"testing\"", + "sphinxcontrib-towncrier; extra == \"docs\"", + "virtualenv>=13.0.0; extra == \"testing\"", + "wheel; extra == \"testing\"" + ], + "requires_python": ">=3.6", + "version": "59.5.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254", + "url": "https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", + "url": "https://files.pythonhosted.org/packages/71/39/171f1c67cd00715f190ba0b100d606d440a28c93c7714febeca8b79af85e/six-1.16.0.tar.gz" + } + ], + "project_name": "six", + "requires_dists": [], + "requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7", + "version": "1.16.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da", + "url": "https://files.pythonhosted.org/packages/a7/a5/10f97f73544edcdef54409f1d839f6049a0d79df68adbc1ceb24d1aaca42/smmap-5.0.1-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62", + "url": "https://files.pythonhosted.org/packages/88/04/b5bf6d21dc4041000ccba7eb17dd3055feb237e7ffc2c20d3fae3af62baa/smmap-5.0.1.tar.gz" + } + ], + "project_name": "smmap", + "requires_dists": [], + "requires_python": ">=3.7", + "version": "5.0.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "859a499a9b1fb68a058858964486627100b71fcb21646861c61d31846a6478fb", + "url": "https://files.pythonhosted.org/packages/0a/32/2e8545fb0592f33e3aca5951e8b01008b76d61b440658cbdc37b4eaebf0b/tensorboard-2.17.0-py3-none-any.whl" + } + ], + "project_name": "tensorboard", + "requires_dists": [ + "absl-py>=0.4", + "grpcio>=1.48.2", + "markdown>=2.6.8", + "numpy>=1.12.0", + "protobuf!=4.24.0,<5.0.0,>=3.19.6", + "setuptools>=41.0.0", + "six>1.9", + "tensorboard-data-server<0.8.0,>=0.7.0", + "werkzeug>=1.0.1" + ], + "requires_python": ">=3.9", + "version": "2.17.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "ef687163c24185ae9754ed5650eb5bc4d84ff257aabdc33f0cc6f74d8ba54530", + "url": "https://files.pythonhosted.org/packages/73/c6/825dab04195756cf8ff2e12698f22513b3db2f64925bdd41671bfb33aaa5/tensorboard_data_server-0.7.2-py3-none-manylinux_2_31_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "7e0610d205889588983836ec05dc098e80f97b7e7bbff7e994ebb78f578d0ddb", + "url": "https://files.pythonhosted.org/packages/7a/13/e503968fefabd4c6b2650af21e110aa8466fe21432cd7c43a84577a89438/tensorboard_data_server-0.7.2-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "9fe5d24221b29625dbc7328b0436ca7fc1c23de4acf4d272f1180856e32f9f60", + "url": "https://files.pythonhosted.org/packages/b7/85/dabeaf902892922777492e1d253bb7e1264cadce3cea932f7ff599e53fea/tensorboard_data_server-0.7.2-py3-none-macosx_10_9_x86_64.whl" + } + ], + "project_name": "tensorboard-data-server", + "requires_dists": [], + "requires_python": ">=3.7", + "version": "0.7.2" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", + "url": "https://files.pythonhosted.org/packages/97/75/10a9ebee3fd790d20926a90a2547f0bf78f371b2f13aa822c759680ca7b9/tomli-2.0.1-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f", + "url": "https://files.pythonhosted.org/packages/c0/3f/d7af728f075fb08564c5949a9c95e44352e23dee646869fa104a3b2060a3/tomli-2.0.1.tar.gz" + } + ], + "project_name": "tomli", + "requires_dists": [], + "requires_python": ">=3.7", + "version": "2.0.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "74f5b137190a6face6859d630f129289e7fae6a4d9a747430b3b5d5c6297a3ae", + "url": "https://download.pytorch.org/whl/cu116/torch-1.12.0%2Bcu116-cp310-cp310-linux_x86_64.whl" + } + ], + "project_name": "torch", + "requires_dists": [ + "typing-extensions" + ], + "requires_python": ">=3.7.0", + "version": "1.12.0+cu116" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", + "url": "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8", + "url": "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz" + } + ], + "project_name": "typing-extensions", + "requires_dists": [], + "requires_python": ">=3.8", + "version": "4.12.2" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472", + "url": "https://files.pythonhosted.org/packages/ca/1c/89ffc63a9605b583d5df2be791a27bc1a42b7c32bab68d3c8f2f73a98cd4/urllib3-2.2.2-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168", + "url": "https://files.pythonhosted.org/packages/43/6d/fa469ae21497ddc8bc93e5877702dca7cb8f911e337aca7452b5724f1bb6/urllib3-2.2.2.tar.gz" + } + ], + "project_name": "urllib3", + "requires_dists": [ + "brotli>=1.0.9; platform_python_implementation == \"CPython\" and extra == \"brotli\"", + "brotlicffi>=0.8.0; platform_python_implementation != \"CPython\" and extra == \"brotli\"", + "h2<5,>=4; extra == \"h2\"", + "pysocks!=1.5.7,<2.0,>=1.5.6; extra == \"socks\"", + "zstandard>=0.18.0; extra == \"zstd\"" + ], + "requires_python": ">=3.8", + "version": "2.2.2" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "cdc18c87ed255235cddd4a89ad96624595871e24ccfe975211a375a16923759f", + "url": "https://files.pythonhosted.org/packages/14/1c/faf90318ff4bcb23d533b32ca3a9db6616532f312563f46d02a0c121ecff/wandb-0.17.3-py3-none-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "f6fe865b9ed7db74d67660973abaa236bbe469019a37b50d44a1be372122aced", + "url": "https://files.pythonhosted.org/packages/87/70/80a80709815dd60cba566dc4e84aa570e6b5c2790f7d2e498273c3619e59/wandb-0.17.3-py3-none-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "7b69eb8148dca4f04d1e9c11f7d651e374f429b8ed729562e3184ce989f376f2", + "url": "https://files.pythonhosted.org/packages/ac/86/470ea9af2337d3cc987939980180532afd6757107044ed6970363ef42bb7/wandb-0.17.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "df94581b299414c4929759b0d12578b00a84d3bb21bc01461edcb1a643b2719b", + "url": "https://files.pythonhosted.org/packages/f0/7a/4935fd9d0302046c1a73d9e866fbd5e7955185e3cbe73ca09510774c5452/wandb-0.17.3-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "36c4688c70bcd1d39e1575ab1664b22f67b40f685b087847f867b6e9302cd963", + "url": "https://files.pythonhosted.org/packages/fd/4c/c6a664af23e18696c44c526c056f95ca74bd869bc44c507f36ac3cf74d70/wandb-0.17.3-py3-none-macosx_11_0_arm64.whl" + } + ], + "project_name": "wandb", + "requires_dists": [ + "awscli; extra == \"launch\"", + "azure-containerregistry; extra == \"launch\"", + "azure-identity; extra == \"azure\"", + "azure-identity; extra == \"launch\"", + "azure-storage-blob; extra == \"azure\"", + "azure-storage-blob; extra == \"launch\"", + "bokeh; extra == \"media\"", + "boto3; extra == \"aws\"", + "boto3; extra == \"launch\"", + "botocore; extra == \"launch\"", + "chardet; extra == \"launch\"", + "click!=8.0.0,>=7.1", + "cloudpickle; extra == \"models\"", + "docker-pycreds>=0.4.0", + "filelock; extra == \"importers\"", + "gitpython!=3.1.29,>=1.0.0", + "google-auth; extra == \"launch\"", + "google-cloud-aiplatform; extra == \"launch\"", + "google-cloud-artifact-registry; extra == \"launch\"", + "google-cloud-compute; extra == \"launch\"", + "google-cloud-storage; extra == \"gcp\"", + "google-cloud-storage; extra == \"kubeflow\"", + "google-cloud-storage; extra == \"launch\"", + "iso8601; extra == \"launch\"", + "kubernetes-asyncio; extra == \"launch\"", + "kubernetes; extra == \"kubeflow\"", + "kubernetes; extra == \"launch\"", + "minio; extra == \"kubeflow\"", + "mlflow; extra == \"importers\"", + "moviepy; extra == \"media\"", + "nbconvert; extra == \"launch\"", + "nbformat; extra == \"launch\"", + "numpy; extra == \"media\"", + "optuna; extra == \"launch\"", + "orjson; extra == \"perf\"", + "pillow; extra == \"media\"", + "platformdirs", + "plotly>=5.18.0; extra == \"media\"", + "polars; extra == \"importers\"", + "protobuf!=4.21.0,<6,>=3.12.0; python_version < \"3.9\" and sys_platform == \"linux\"", + "protobuf!=4.21.0,<6,>=3.15.0; python_version == \"3.9\" and sys_platform == \"linux\"", + "protobuf!=4.21.0,<6,>=3.19.0; python_version > \"3.9\" and sys_platform == \"linux\"", + "protobuf!=4.21.0,<6,>=3.19.0; sys_platform != \"linux\"", + "psutil>=5.0.0", + "pydantic; extra == \"launch\"", + "pyyaml", + "pyyaml>=6.0.0; extra == \"launch\"", + "rdkit-pypi; extra == \"media\"", + "requests<3,>=2.0.0", + "rich; extra == \"importers\"", + "sentry-sdk>=1.0.0", + "setproctitle", + "setuptools", + "sh; extra == \"kubeflow\"", + "soundfile; extra == \"media\"", + "sweeps>=0.2.0; extra == \"sweeps\"", + "tenacity; extra == \"importers\"", + "tomli; extra == \"launch\"", + "typing-extensions; extra == \"launch\"", + "typing-extensions; python_version < \"3.10\"", + "wandb-workspaces; extra == \"workspaces\"" + ], + "requires_python": ">=3.7", + "version": "0.17.3" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "fc9645dc43e03e4d630d23143a04a7f947a9a3b5727cd535fdfe155a17cc48c8", + "url": "https://files.pythonhosted.org/packages/9d/6e/e792999e816d19d7fcbfa94c730936750036d65656a76a5a688b57a656c4/werkzeug-3.0.3-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "097e5bfda9f0aba8da6b8545146def481d06aa7d3266e7448e2cccf67dd8bd18", + "url": "https://files.pythonhosted.org/packages/02/51/2e0fc149e7a810d300422ab543f87f2bcf64d985eb6f1228c4efd6e4f8d4/werkzeug-3.0.3.tar.gz" + } + ], + "project_name": "werkzeug", + "requires_dists": [ + "MarkupSafe>=2.1.1", + "watchdog>=2.3; extra == \"watchdog\"" + ], + "requires_python": ">=3.8", + "version": "3.0.3" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad", + "url": "https://files.pythonhosted.org/packages/4d/05/4d79198ae568a92159de0f89e710a8d19e3fa267b719a236582eee921f4a/yarl-1.9.4-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "d5ff2c858f5f6a42c2a8e751100f237c5e869cbde669a724f2062d4c4ef93551", + "url": "https://files.pythonhosted.org/packages/0b/58/dd3c69651381a57ac991dba54b20ae2da359eb4b03a661e71c451d6525c6/yarl-1.9.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "e516dc8baf7b380e6c1c26792610230f37147bb754d6426462ab115a02944385", + "url": "https://files.pythonhosted.org/packages/0b/a3/7774786ec6e2dca0bb38b286f12a11af97957546e5fbcce71752a8d2cf07/yarl-1.9.4-cp310-cp310-musllinux_1_1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "d9e09c9d74f4566e905a0b8fa668c58109f7624db96a2171f21747abc7524234", + "url": "https://files.pythonhosted.org/packages/30/b5/215d586d5cb17ca9748d7a2d597c07147f210c0c0785257492094d083b65/yarl-1.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "54beabb809ffcacbd9d28ac57b0db46e42a6e341a030293fb3185c409e626b8b", + "url": "https://files.pythonhosted.org/packages/44/ae/fdbc9965ef69e650c3b5b04d60badef90ff0cde21a30770f0700e148b12f/yarl-1.9.4-cp310-cp310-musllinux_1_1_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "a8c1df72eb746f4136fe9a2e72b0c9dc1da1cbd23b5372f94b5820ff8ae30e0e", + "url": "https://files.pythonhosted.org/packages/6c/27/cda5a927df3a894eddfee4efacdd230c2d8486e322fc672194fd651f82c5/yarl-1.9.4-cp310-cp310-macosx_10_9_universal2.whl" + }, + { + "algorithm": "sha256", + "hash": "54525ae423d7b7a8ee81ba189f131054defdb122cde31ff17477951464c1691c", + "url": "https://files.pythonhosted.org/packages/6d/a1/db0bdf8cc48515e9c02daf04ae2916fc27ce6498eca21432fc9ffa63f71b/yarl-1.9.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "7d5aaac37d19b2904bb9dfe12cdb08c8443e7ba7d2852894ad448d4b8f442863", + "url": "https://files.pythonhosted.org/packages/70/a9/ef6d69ce9a4e82080290bcb6db735bb8a6d6db92f2bbb92b6951bde97e7c/yarl-1.9.4-cp310-cp310-musllinux_1_1_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "c38c9ddb6103ceae4e4498f9c08fac9b590c5c71b0370f98714768e22ac6fa66", + "url": "https://files.pythonhosted.org/packages/81/c6/06938036ea48fa74521713499fba1459b0eb60af9b9afbe8e0e9e1a96c36/yarl-1.9.4-cp310-cp310-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "801e9264d19643548651b9db361ce3287176671fb0117f96b5ac0ee1c3530d53", + "url": "https://files.pythonhosted.org/packages/b2/4f/796b0c73e9ff30a1047a7ee3390e157ab8424d4401b9f32a2624013a5b39/yarl-1.9.4-cp310-cp310-musllinux_1_1_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "357495293086c5b6d34ca9616a43d329317feab7917518bc97a08f9e55648455", + "url": "https://files.pythonhosted.org/packages/c3/a0/0ade1409d184cbc9e85acd403a386a7c0563b92ff0f26d138ff9e86e48b4/yarl-1.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "bac8d525a8dbc2a1507ec731d2867025d11ceadcb4dd421423a5d42c56818541", + "url": "https://files.pythonhosted.org/packages/cc/2a/abbaf1460becba856e163f2a1274f5d34b1969d476da8e68a8fc2aeb5661/yarl-1.9.4-cp310-cp310-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "a3a6ed1d525bfb91b3fc9b690c5a21bb52de28c018530ad85093cc488bee2dd2", + "url": "https://files.pythonhosted.org/packages/d5/fc/40b85bea1f5686092ea37f472c94c023d6347266852ffd55baa01c40f596/yarl-1.9.4-cp310-cp310-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "b8477c1ee4bd47c57d49621a062121c3023609f7a13b8a46953eb6c9716ca392", + "url": "https://files.pythonhosted.org/packages/dd/90/2958ae9f2e12084d616eef95b6a48c8e6d96448add04367c20dc53a33ff2/yarl-1.9.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf", + "url": "https://files.pythonhosted.org/packages/e0/ad/bedcdccbcbf91363fd425a948994f3340924145c2bc8ccb296f4a1e52c28/yarl-1.9.4.tar.gz" + } + ], + "project_name": "yarl", + "requires_dists": [ + "idna>=2.0", + "multidict>=4.0", + "typing-extensions>=3.7.4; python_version < \"3.8\"" + ], + "requires_python": ">=3.7", + "version": "1.9.4" + } + ], + "platform_tag": null + } + ], + "only_builds": [], + "only_wheels": [], + "path_mappings": {}, + "pex_version": "2.3.1", + "pip_version": "23.0.1", + "prefer_older_binary": false, + "requirements": [ + "atomicwrites>=1.4.0", + "box2d-py>=2.3.5", + "cloudpickle~=3.0", + "gsutil>=4.66", + "gymnasium>=0.27.1", + "numpy<1.24", + "onnx>=1.10", + "opencv-python>=3.0", + "protobuf>=4.0", + "psutil>=5.8.0", + "pygame>=2.1.0", + "pytest-benchmark==4.0.0", + "pytest-cov!=2.12.1,<3.1,>=2.12", + "pytest-platform-markers", + "pytest-rerunfailures", + "pytest-xdist<3,>=2.5", + "pytest~=8.0", + "setuptools==59.5", + "tensorboard>=2.8.0", + "torch==1.12.0", + "wandb>=0.14.0" + ], + "requires_python": [ + "<3.11,>=3.10" + ], + "resolver_version": "pip-2020-resolver", + "style": "universal", + "target_systems": [ + "linux", + "mac" + ], + "transitive": true, + "use_pep517": null +} diff --git a/locks/tools/apibook.lock b/locks/tools/apibook.lock new file mode 100644 index 00000000..9d4f5d95 --- /dev/null +++ b/locks/tools/apibook.lock @@ -0,0 +1,198 @@ +// This lockfile was autogenerated by Pants. To regenerate, run: +// +// pants generate-lockfiles --resolve=apibook +// +// --- BEGIN PANTS LOCKFILE METADATA: DO NOT EDIT OR REMOVE --- +// { +// "version": 3, +// "valid_for_interpreter_constraints": [ +// "CPython<3.11,>=3.10" +// ], +// "generated_with_requirements": [ +// "apibook~=0.1.0" +// ], +// "manylinux": "manylinux2014", +// "requirement_constraints": [], +// "only_binary": [], +// "no_binary": [] +// } +// --- END PANTS LOCKFILE METADATA --- + +{ + "allow_builds": true, + "allow_prereleases": false, + "allow_wheels": true, + "build_isolation": true, + "constraints": [], + "locked_resolves": [ + { + "locked_requirements": [ + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "da1fcaf0d95dd59b122d9ba20338fadcf04455a2924100271696f5d818d760a5", + "url": "https://files.pythonhosted.org/packages/09/b0/bdce6e7ff7a1a610bde1f60a158b9715134ecdcacdd6e9530da4213272b1/apibook-0.1.2-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "56fa204d28923fd21bfc564c94a0c34956f3d80ed03859f50007587abeb6c6f8", + "url": "https://files.pythonhosted.org/packages/c9/50/6c5e054186680ed613ff073a941152fb233a853c38f0276363cc8c90f277/apibook-0.1.2.tar.gz" + } + ], + "project_name": "apibook", + "requires_dists": [ + "docstring_parser", + "rich" + ], + "requires_python": ">=3.9", + "version": "0.1.2" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "bf0a1387354d3691d102edef7ec124f219ef639982d096e26e3b60aeffa90637", + "url": "https://files.pythonhosted.org/packages/d5/7c/e9fcff7623954d86bdc17782036cbf715ecab1bec4847c008557affe1ca8/docstring_parser-0.16-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "538beabd0af1e2db0146b6bd3caa526c35a34d61af9fd2887f3a8a27a739aa6e", + "url": "https://files.pythonhosted.org/packages/08/12/9c22a58c0b1e29271051222d8906257616da84135af9ed167c9e28f85cb3/docstring_parser-0.16.tar.gz" + } + ], + "project_name": "docstring-parser", + "requires_dists": [], + "requires_python": "<4.0,>=3.6", + "version": "0.16" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", + "url": "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", + "url": "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz" + } + ], + "project_name": "markdown-it-py", + "requires_dists": [ + "commonmark~=0.9; extra == \"compare\"", + "coverage; extra == \"testing\"", + "gprof2dot; extra == \"profiling\"", + "jupyter_sphinx; extra == \"rtd\"", + "linkify-it-py<3,>=1; extra == \"linkify\"", + "markdown~=3.4; extra == \"compare\"", + "mdit-py-plugins; extra == \"plugins\"", + "mdit-py-plugins; extra == \"rtd\"", + "mdurl~=0.1", + "mistletoe~=1.0; extra == \"compare\"", + "mistune~=2.0; extra == \"compare\"", + "myst-parser; extra == \"rtd\"", + "panflute~=2.3; extra == \"compare\"", + "pre-commit~=3.0; extra == \"code-style\"", + "psutil; extra == \"benchmarking\"", + "pytest-benchmark; extra == \"benchmarking\"", + "pytest-cov; extra == \"testing\"", + "pytest-regressions; extra == \"testing\"", + "pytest; extra == \"benchmarking\"", + "pytest; extra == \"testing\"", + "pyyaml; extra == \"rtd\"", + "sphinx-copybutton; extra == \"rtd\"", + "sphinx-design; extra == \"rtd\"", + "sphinx; extra == \"rtd\"", + "sphinx_book_theme; extra == \"rtd\"" + ], + "requires_python": ">=3.8", + "version": "3.0.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", + "url": "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", + "url": "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz" + } + ], + "project_name": "mdurl", + "requires_dists": [], + "requires_python": ">=3.7", + "version": "0.1.2" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a", + "url": "https://files.pythonhosted.org/packages/f7/3f/01c8b82017c199075f8f788d0d906b9ffbbc5a47dc9918a945e13d5a2bda/pygments-2.18.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199", + "url": "https://files.pythonhosted.org/packages/8e/62/8336eff65bcbc8e4cb5d05b55faf041285951b6e80f33e2bff2024788f31/pygments-2.18.0.tar.gz" + } + ], + "project_name": "pygments", + "requires_dists": [ + "colorama>=0.4.6; extra == \"windows-terminal\"" + ], + "requires_python": ">=3.8", + "version": "2.18.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "4edbae314f59eb482f54e9e30bf00d33350aaa94f4bfcd4e9e3110e64d0d7222", + "url": "https://files.pythonhosted.org/packages/87/67/a37f6214d0e9fe57f6ae54b2956d550ca8365857f42a1ce0392bb21d9410/rich-13.7.1-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "9be308cb1fe2f1f57d67ce99e95af38a1e2bc71ad9813b0e247cf7ffbcc3a432", + "url": "https://files.pythonhosted.org/packages/b3/01/c954e134dc440ab5f96952fe52b4fdc64225530320a910473c1fe270d9aa/rich-13.7.1.tar.gz" + } + ], + "project_name": "rich", + "requires_dists": [ + "ipywidgets<9,>=7.5.1; extra == \"jupyter\"", + "markdown-it-py>=2.2.0", + "pygments<3.0.0,>=2.13.0", + "typing-extensions<5.0,>=4.0.0; python_version < \"3.9\"" + ], + "requires_python": ">=3.7.0", + "version": "13.7.1" + } + ], + "platform_tag": null + } + ], + "only_builds": [], + "only_wheels": [], + "path_mappings": {}, + "pex_version": "2.3.1", + "pip_version": "23.0.1", + "prefer_older_binary": false, + "requirements": [ + "apibook~=0.1.0" + ], + "requires_python": [ + "<3.11,>=3.10" + ], + "resolver_version": "pip-2020-resolver", + "style": "universal", + "target_systems": [ + "linux", + "mac" + ], + "transitive": true, + "use_pep517": null +} diff --git a/locks/tools/bandit.lock b/locks/tools/bandit.lock new file mode 100644 index 00000000..8bd2fbec --- /dev/null +++ b/locks/tools/bandit.lock @@ -0,0 +1,44 @@ +// This lockfile was autogenerated by Pants. To regenerate, run: +// +// pants generate-lockfiles --resolve=bandit +// +// --- BEGIN PANTS LOCKFILE METADATA: DO NOT EDIT OR REMOVE --- +// { +// "version": 3, +// "valid_for_interpreter_constraints": [ +// "CPython<3.11,>=3.10" +// ], +// "generated_with_requirements": [], +// "manylinux": "manylinux2014", +// "requirement_constraints": [], +// "only_binary": [], +// "no_binary": [] +// } +// --- END PANTS LOCKFILE METADATA --- + +{ + "allow_builds": true, + "allow_prereleases": false, + "allow_wheels": true, + "build_isolation": true, + "constraints": [], + "locked_resolves": [], + "only_builds": [], + "only_wheels": [], + "path_mappings": {}, + "pex_version": "2.3.1", + "pip_version": "23.0.1", + "prefer_older_binary": false, + "requirements": [], + "requires_python": [ + "<3.11,>=3.10" + ], + "resolver_version": "pip-2020-resolver", + "style": "universal", + "target_systems": [ + "linux", + "mac" + ], + "transitive": true, + "use_pep517": null +} diff --git a/locks/tools/black.lock b/locks/tools/black.lock new file mode 100644 index 00000000..1414aa6d --- /dev/null +++ b/locks/tools/black.lock @@ -0,0 +1,241 @@ +// This lockfile was autogenerated by Pants. To regenerate, run: +// +// pants generate-lockfiles --resolve=black +// +// --- BEGIN PANTS LOCKFILE METADATA: DO NOT EDIT OR REMOVE --- +// { +// "version": 3, +// "valid_for_interpreter_constraints": [ +// "CPython<3.11,>=3.10" +// ], +// "generated_with_requirements": [ +// "black<24,>=22.6.0" +// ], +// "manylinux": "manylinux2014", +// "requirement_constraints": [], +// "only_binary": [], +// "no_binary": [] +// } +// --- END PANTS LOCKFILE METADATA --- + +{ + "allow_builds": true, + "allow_prereleases": false, + "allow_wheels": true, + "build_isolation": true, + "constraints": [], + "locked_resolves": [ + { + "locked_requirements": [ + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "78baad24af0f033958cad29731e27363183e140962595def56423e626f4bee3e", + "url": "https://files.pythonhosted.org/packages/7b/14/4da7b12a9abc43a601c215cb5a3d176734578da109f0dbf0a832ed78be09/black-23.12.1-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "c88b3711d12905b74206227109272673edce0cb29f27e1385f33b0163c414bba", + "url": "https://files.pythonhosted.org/packages/11/92/522a4f1e4b2b8da62e4ec0cb8acf2d257e6d39b31f4214f0fd94d2eeb5bd/black-23.12.1-cp310-cp310-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "a920b569dc6b3472513ba6ddea21f440d4b4c699494d2e972a1753cdc25df7b0", + "url": "https://files.pythonhosted.org/packages/a4/dc/af67d8281e9a24f73d24b060f3f03f6d9ad6be259b3c6acef2845e17d09c/black-23.12.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "e0aaf6041986767a5e0ce663c7a2f0e9eaf21e6ff87a5f95cbf3675bfd4c41d2", + "url": "https://files.pythonhosted.org/packages/fb/58/677da52d845b59505a8a787ff22eff9cfd9046b5789aa2bd387b236db5c5/black-23.12.1-cp310-cp310-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "4ce3ef14ebe8d9509188014d96af1c456a910d5b5cbf434a09fef7e024b3d0d5", + "url": "https://files.pythonhosted.org/packages/fd/f4/a57cde4b60da0e249073009f4a9087e9e0a955deae78d3c2a493208d0c5c/black-23.12.1.tar.gz" + } + ], + "project_name": "black", + "requires_dists": [ + "aiohttp!=3.9.0,>=3.7.4; (sys_platform == \"win32\" and implementation_name == \"pypy\") and extra == \"d\"", + "aiohttp>=3.7.4; (sys_platform != \"win32\" or implementation_name != \"pypy\") and extra == \"d\"", + "click>=8.0.0", + "colorama>=0.4.3; extra == \"colorama\"", + "ipython>=7.8.0; extra == \"jupyter\"", + "mypy-extensions>=0.4.3", + "packaging>=22.0", + "pathspec>=0.9.0", + "platformdirs>=2", + "tokenize-rt>=3.2.0; extra == \"jupyter\"", + "tomli>=1.1.0; python_version < \"3.11\"", + "typing-extensions>=4.0.1; python_version < \"3.11\"", + "uvloop>=0.15.2; extra == \"uvloop\"" + ], + "requires_python": ">=3.8", + "version": "23.12.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", + "url": "https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de", + "url": "https://files.pythonhosted.org/packages/96/d3/f04c7bfcf5c1862a2a5b845c6b2b360488cf47af55dfa79c98f6a6bf98b5/click-8.1.7.tar.gz" + } + ], + "project_name": "click", + "requires_dists": [ + "colorama; platform_system == \"Windows\"", + "importlib-metadata; python_version < \"3.8\"" + ], + "requires_python": ">=3.7", + "version": "8.1.7" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", + "url": "https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782", + "url": "https://files.pythonhosted.org/packages/98/a4/1ab47638b92648243faf97a5aeb6ea83059cc3624972ab6b8d2316078d3f/mypy_extensions-1.0.0.tar.gz" + } + ], + "project_name": "mypy-extensions", + "requires_dists": [], + "requires_python": ">=3.5", + "version": "1.0.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124", + "url": "https://files.pythonhosted.org/packages/08/aa/cc0199a5f0ad350994d660967a8efb233fe0416e4639146c089643407ce6/packaging-24.1-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002", + "url": "https://files.pythonhosted.org/packages/51/65/50db4dda066951078f0a96cf12f4b9ada6e4b811516bf0262c0f4f7064d4/packaging-24.1.tar.gz" + } + ], + "project_name": "packaging", + "requires_dists": [], + "requires_python": ">=3.8", + "version": "24.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", + "url": "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", + "url": "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz" + } + ], + "project_name": "pathspec", + "requires_dists": [], + "requires_python": ">=3.8", + "version": "0.12.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee", + "url": "https://files.pythonhosted.org/packages/68/13/2aa1f0e1364feb2c9ef45302f387ac0bd81484e9c9a4c5688a322fbdfd08/platformdirs-4.2.2-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3", + "url": "https://files.pythonhosted.org/packages/f5/52/0763d1d976d5c262df53ddda8d8d4719eedf9594d046f117c25a27261a19/platformdirs-4.2.2.tar.gz" + } + ], + "project_name": "platformdirs", + "requires_dists": [ + "appdirs==1.4.4; extra == \"test\"", + "covdefaults>=2.3; extra == \"test\"", + "furo>=2023.9.10; extra == \"docs\"", + "mypy>=1.8; extra == \"type\"", + "proselint>=0.13; extra == \"docs\"", + "pytest-cov>=4.1; extra == \"test\"", + "pytest-mock>=3.12; extra == \"test\"", + "pytest>=7.4.3; extra == \"test\"", + "sphinx-autodoc-typehints>=1.25.2; extra == \"docs\"", + "sphinx>=7.2.6; extra == \"docs\"" + ], + "requires_python": ">=3.8", + "version": "4.2.2" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", + "url": "https://files.pythonhosted.org/packages/97/75/10a9ebee3fd790d20926a90a2547f0bf78f371b2f13aa822c759680ca7b9/tomli-2.0.1-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f", + "url": "https://files.pythonhosted.org/packages/c0/3f/d7af728f075fb08564c5949a9c95e44352e23dee646869fa104a3b2060a3/tomli-2.0.1.tar.gz" + } + ], + "project_name": "tomli", + "requires_dists": [], + "requires_python": ">=3.7", + "version": "2.0.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", + "url": "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8", + "url": "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz" + } + ], + "project_name": "typing-extensions", + "requires_dists": [], + "requires_python": ">=3.8", + "version": "4.12.2" + } + ], + "platform_tag": null + } + ], + "only_builds": [], + "only_wheels": [], + "path_mappings": {}, + "pex_version": "2.3.1", + "pip_version": "23.0.1", + "prefer_older_binary": false, + "requirements": [ + "black<24,>=22.6.0" + ], + "requires_python": [ + "<3.11,>=3.10" + ], + "resolver_version": "pip-2020-resolver", + "style": "universal", + "target_systems": [ + "linux", + "mac" + ], + "transitive": true, + "use_pep517": null +} diff --git a/locks/tools/docformatter.lock b/locks/tools/docformatter.lock new file mode 100644 index 00000000..8425ff4c --- /dev/null +++ b/locks/tools/docformatter.lock @@ -0,0 +1,190 @@ +// This lockfile was autogenerated by Pants. To regenerate, run: +// +// pants generate-lockfiles --resolve=docformatter +// +// --- BEGIN PANTS LOCKFILE METADATA: DO NOT EDIT OR REMOVE --- +// { +// "version": 3, +// "valid_for_interpreter_constraints": [ +// "CPython<3.11,>=3.10" +// ], +// "generated_with_requirements": [ +// "docformatter[tomli]" +// ], +// "manylinux": "manylinux2014", +// "requirement_constraints": [], +// "only_binary": [], +// "no_binary": [] +// } +// --- END PANTS LOCKFILE METADATA --- + +{ + "allow_builds": true, + "allow_prereleases": false, + "allow_wheels": true, + "build_isolation": true, + "constraints": [], + "locked_resolves": [ + { + "locked_requirements": [ + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc", + "url": "https://files.pythonhosted.org/packages/28/76/e6222113b83e3622caa4bb41032d0b1bf785250607392e1b778aca0b8a7d/charset_normalizer-3.3.2-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e", + "url": "https://files.pythonhosted.org/packages/05/8c/eb854996d5fef5e4f33ad56927ad053d04dc820e4a3d39023f35cad72617/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3", + "url": "https://files.pythonhosted.org/packages/2b/61/095a0aa1a84d1481998b534177c8566fdc50bb1233ea9a0478cd3cc075bd/charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl" + }, + { + "algorithm": "sha256", + "hash": "beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c", + "url": "https://files.pythonhosted.org/packages/33/c3/3b96a435c5109dd5b6adc8a59ba1d678b302a97938f032e3770cc84cd354/charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537", + "url": "https://files.pythonhosted.org/packages/3f/ba/3f5e7be00b215fa10e13d64b1f6237eb6ebea66676a41b2bcdd09fe74323/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12", + "url": "https://files.pythonhosted.org/packages/43/05/3bf613e719efe68fb3a77f9c536a389f35b95d75424b96b426a47a45ef1d/charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03", + "url": "https://files.pythonhosted.org/packages/46/6a/d5c26c41c49b546860cc1acabdddf48b0b3fb2685f4f5617ac59261b44ae/charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f", + "url": "https://files.pythonhosted.org/packages/58/78/a0bc646900994df12e07b4ae5c713f2b3e5998f58b9d3720cce2aa45652f/charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5", + "url": "https://files.pythonhosted.org/packages/63/09/c1bc53dab74b1816a00d8d030de5bf98f724c52c1635e07681d312f20be8/charset-normalizer-3.3.2.tar.gz" + }, + { + "algorithm": "sha256", + "hash": "fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519", + "url": "https://files.pythonhosted.org/packages/a8/31/47d018ef89f95b8aded95c589a77c072c55e94b50a41aa99c0a2008a45a4/charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d", + "url": "https://files.pythonhosted.org/packages/b8/60/e2f67915a51be59d4539ed189eb0a2b0d292bf79270410746becb32bc2c3/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027", + "url": "https://files.pythonhosted.org/packages/cc/94/f7cf5e5134175de79ad2059edf2adce18e0685ebdb9227ff0139975d0e93/charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5", + "url": "https://files.pythonhosted.org/packages/da/f1/3702ba2a7470666a62fd81c58a4c40be00670e5006a67f4d626e57f013ae/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269", + "url": "https://files.pythonhosted.org/packages/eb/5c/97d97248af4920bc68687d9c3b3c0f47c910e21a8ff80af4565a576bd2f0/charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6", + "url": "https://files.pythonhosted.org/packages/f6/93/bb6cbeec3bf9da9b2eba458c15966658d1daa8b982c642f81c93ad9b40e1/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl" + } + ], + "project_name": "charset-normalizer", + "requires_dists": [], + "requires_python": ">=3.7.0", + "version": "3.3.2" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "a24f5545ed1f30af00d106f5d85dc2fce4959295687c24c8f39f5263afaf9186", + "url": "https://files.pythonhosted.org/packages/8b/95/568a2fca29df365b82012b09b64964a05f4f20ac83c2137b262f3fa3188f/docformatter-1.7.5-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "ffed3da0daffa2e77f80ccba4f0e50bfa2755e1c10e130102571c890a61b246e", + "url": "https://files.pythonhosted.org/packages/f4/44/aba2c40cf796121b35835ea8c00bc5d93f2f70730eca53b36b8bbbfaefe1/docformatter-1.7.5.tar.gz" + } + ], + "project_name": "docformatter", + "requires_dists": [ + "charset_normalizer<4.0.0,>=3.0.0", + "tomli<3.0.0,>=2.0.0; python_version < \"3.11\" and extra == \"tomli\"", + "untokenize<0.2.0,>=0.1.1" + ], + "requires_python": "<4.0,>=3.7", + "version": "1.7.5" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", + "url": "https://files.pythonhosted.org/packages/97/75/10a9ebee3fd790d20926a90a2547f0bf78f371b2f13aa822c759680ca7b9/tomli-2.0.1-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f", + "url": "https://files.pythonhosted.org/packages/c0/3f/d7af728f075fb08564c5949a9c95e44352e23dee646869fa104a3b2060a3/tomli-2.0.1.tar.gz" + } + ], + "project_name": "tomli", + "requires_dists": [], + "requires_python": ">=3.7", + "version": "2.0.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "3865dbbbb8efb4bb5eaa72f1be7f3e0be00ea8b7f125c69cbd1f5fda926f37a2", + "url": "https://files.pythonhosted.org/packages/f7/46/e7cea8159199096e1df52da20a57a6665da80c37fb8aeb848a3e47442c32/untokenize-0.1.1.tar.gz" + } + ], + "project_name": "untokenize", + "requires_dists": [], + "requires_python": null, + "version": "0.1.1" + } + ], + "platform_tag": null + } + ], + "only_builds": [], + "only_wheels": [], + "path_mappings": {}, + "pex_version": "2.3.1", + "pip_version": "23.0.1", + "prefer_older_binary": false, + "requirements": [ + "docformatter[tomli]" + ], + "requires_python": [ + "<3.11,>=3.10" + ], + "resolver_version": "pip-2020-resolver", + "style": "universal", + "target_systems": [ + "linux", + "mac" + ], + "transitive": true, + "use_pep517": null +} diff --git a/locks/tools/ipython.lock b/locks/tools/ipython.lock new file mode 100644 index 00000000..6bb2fa87 --- /dev/null +++ b/locks/tools/ipython.lock @@ -0,0 +1,469 @@ +// This lockfile was autogenerated by Pants. To regenerate, run: +// +// pants generate-lockfiles --resolve=ipython +// +// --- BEGIN PANTS LOCKFILE METADATA: DO NOT EDIT OR REMOVE --- +// { +// "version": 3, +// "valid_for_interpreter_constraints": [ +// "CPython<3.11,>=3.10" +// ], +// "generated_with_requirements": [ +// "ipython<8,>=7.27.0" +// ], +// "manylinux": "manylinux2014", +// "requirement_constraints": [], +// "only_binary": [], +// "no_binary": [] +// } +// --- END PANTS LOCKFILE METADATA --- + +{ + "allow_builds": true, + "allow_prereleases": false, + "allow_wheels": true, + "build_isolation": true, + "constraints": [], + "locked_resolves": [ + { + "locked_requirements": [ + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c", + "url": "https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee", + "url": "https://files.pythonhosted.org/packages/35/5d/752690df9ef5b76e169e68d6a129fa6d08a7100ca7f754c89495db3c6019/appnope-0.1.4.tar.gz" + } + ], + "project_name": "appnope", + "requires_dists": [], + "requires_python": ">=3.6", + "version": "0.1.4" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255", + "url": "https://files.pythonhosted.org/packages/4c/1c/ff6546b6c12603d8dd1070aa3c3d273ad4c07f5771689a7b69a550e8c951/backcall-0.2.0-py2.py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e", + "url": "https://files.pythonhosted.org/packages/a2/40/764a663805d84deee23043e1426a9175567db89c8b3287b5c2ad9f71aa93/backcall-0.2.0.tar.gz" + } + ], + "project_name": "backcall", + "requires_dists": [], + "requires_python": null, + "version": "0.2.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186", + "url": "https://files.pythonhosted.org/packages/d5/50/83c593b07763e1161326b3b8c6686f0f4b0f24d5526546bee538c89837d6/decorator-5.1.1-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330", + "url": "https://files.pythonhosted.org/packages/66/0c/8d907af351aa16b42caae42f9d6aa37b900c67308052d10fdce809f8d952/decorator-5.1.1.tar.gz" + } + ], + "project_name": "decorator", + "requires_dists": [], + "requires_python": ">=3.5", + "version": "5.1.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "c175d2440a1caff76116eb719d40538fbb316e214eda85c5515c303aacbfb23e", + "url": "https://files.pythonhosted.org/packages/7c/6a/1f1365f4bf9fcb349fcaa5b61edfcefa721aa13ff37c5631296b12fab8e5/ipython-7.34.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "af3bdb46aa292bce5615b1b2ebc76c2080c5f77f54bda2ec72461317273e7cd6", + "url": "https://files.pythonhosted.org/packages/db/6c/3fcf0b8ee46656796099ac4b7b72497af5f090da3e43fd305f2a24c73915/ipython-7.34.0.tar.gz" + } + ], + "project_name": "ipython", + "requires_dists": [ + "Sphinx>=1.3; extra == \"all\"", + "Sphinx>=1.3; extra == \"doc\"", + "appnope; sys_platform == \"darwin\"", + "backcall", + "colorama; sys_platform == \"win32\"", + "decorator", + "ipykernel; extra == \"all\"", + "ipykernel; extra == \"kernel\"", + "ipykernel; extra == \"test\"", + "ipyparallel; extra == \"all\"", + "ipyparallel; extra == \"parallel\"", + "ipywidgets; extra == \"all\"", + "ipywidgets; extra == \"notebook\"", + "jedi>=0.16", + "matplotlib-inline", + "nbconvert; extra == \"all\"", + "nbconvert; extra == \"nbconvert\"", + "nbformat; extra == \"all\"", + "nbformat; extra == \"nbformat\"", + "nbformat; extra == \"test\"", + "nose>=0.10.1; extra == \"all\"", + "nose>=0.10.1; extra == \"test\"", + "notebook; extra == \"all\"", + "notebook; extra == \"notebook\"", + "numpy>=1.17; extra == \"all\"", + "numpy>=1.17; extra == \"test\"", + "pexpect>4.3; sys_platform != \"win32\"", + "pickleshare", + "prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0", + "pygments", + "pygments; extra == \"all\"", + "pygments; extra == \"test\"", + "qtconsole; extra == \"all\"", + "qtconsole; extra == \"qtconsole\"", + "requests; extra == \"all\"", + "requests; extra == \"test\"", + "setuptools>=18.5", + "testpath; extra == \"all\"", + "testpath; extra == \"test\"", + "traitlets>=4.2" + ], + "requires_python": ">=3.7", + "version": "7.34.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0", + "url": "https://files.pythonhosted.org/packages/20/9f/bc63f0f0737ad7a60800bfd472a4836661adae21f9c2535f3957b1e54ceb/jedi-0.19.1-py2.py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd", + "url": "https://files.pythonhosted.org/packages/d6/99/99b493cec4bf43176b678de30f81ed003fd6a647a301b9c927280c600f0a/jedi-0.19.1.tar.gz" + } + ], + "project_name": "jedi", + "requires_dists": [ + "Django; extra == \"testing\"", + "Jinja2==2.11.3; extra == \"docs\"", + "MarkupSafe==1.1.1; extra == \"docs\"", + "Pygments==2.8.1; extra == \"docs\"", + "alabaster==0.7.12; extra == \"docs\"", + "attrs; extra == \"testing\"", + "babel==2.9.1; extra == \"docs\"", + "chardet==4.0.0; extra == \"docs\"", + "colorama; extra == \"testing\"", + "commonmark==0.8.1; extra == \"docs\"", + "docopt; extra == \"testing\"", + "docutils==0.17.1; extra == \"docs\"", + "flake8==5.0.4; extra == \"qa\"", + "future==0.18.2; extra == \"docs\"", + "idna==2.10; extra == \"docs\"", + "imagesize==1.2.0; extra == \"docs\"", + "mock==1.0.1; extra == \"docs\"", + "mypy==0.971; extra == \"qa\"", + "packaging==20.9; extra == \"docs\"", + "parso<0.9.0,>=0.8.3", + "pyparsing==2.4.7; extra == \"docs\"", + "pytest<7.0.0; extra == \"testing\"", + "pytz==2021.1; extra == \"docs\"", + "readthedocs-sphinx-ext==2.1.4; extra == \"docs\"", + "recommonmark==0.5.0; extra == \"docs\"", + "requests==2.25.1; extra == \"docs\"", + "six==1.15.0; extra == \"docs\"", + "snowballstemmer==2.1.0; extra == \"docs\"", + "sphinx-rtd-theme==0.4.3; extra == \"docs\"", + "sphinx==1.8.5; extra == \"docs\"", + "sphinxcontrib-serializinghtml==1.1.4; extra == \"docs\"", + "sphinxcontrib-websupport==1.2.4; extra == \"docs\"", + "types-setuptools==67.2.0.1; extra == \"qa\"", + "urllib3==1.26.4; extra == \"docs\"" + ], + "requires_python": ">=3.6", + "version": "0.19.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca", + "url": "https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90", + "url": "https://files.pythonhosted.org/packages/99/5b/a36a337438a14116b16480db471ad061c36c3694df7c2084a0da7ba538b7/matplotlib_inline-0.1.7.tar.gz" + } + ], + "project_name": "matplotlib-inline", + "requires_dists": [ + "traitlets" + ], + "requires_python": ">=3.8", + "version": "0.1.7" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18", + "url": "https://files.pythonhosted.org/packages/c6/ac/dac4a63f978e4dcb3c6d3a78c4d8e0192a113d288502a1216950c41b1027/parso-0.8.4-py2.py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d", + "url": "https://files.pythonhosted.org/packages/66/94/68e2e17afaa9169cf6412ab0f28623903be73d1b32e208d9e8e541bb086d/parso-0.8.4.tar.gz" + } + ], + "project_name": "parso", + "requires_dists": [ + "docopt; extra == \"testing\"", + "flake8==5.0.4; extra == \"qa\"", + "mypy==0.971; extra == \"qa\"", + "pytest; extra == \"testing\"", + "types-setuptools==67.2.0.1; extra == \"qa\"" + ], + "requires_python": ">=3.6", + "version": "0.8.4" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", + "url": "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", + "url": "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz" + } + ], + "project_name": "pexpect", + "requires_dists": [ + "ptyprocess>=0.5" + ], + "requires_python": null, + "version": "4.9.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56", + "url": "https://files.pythonhosted.org/packages/9a/41/220f49aaea88bc6fa6cba8d05ecf24676326156c23b991e80b3f2fc24c77/pickleshare-0.7.5-py2.py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca", + "url": "https://files.pythonhosted.org/packages/d8/b6/df3c1c9b616e9c0edbc4fbab6ddd09df9535849c64ba51fcb6531c32d4d8/pickleshare-0.7.5.tar.gz" + } + ], + "project_name": "pickleshare", + "requires_dists": [ + "pathlib2; python_version in \"2.6 2.7 3.2 3.3\"" + ], + "requires_python": null, + "version": "0.7.5" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "0d7bfa67001d5e39d02c224b663abc33687405033a8c422d0d675a5a13361d10", + "url": "https://files.pythonhosted.org/packages/e8/23/22750c4b768f09386d1c3cc4337953e8936f48a888fa6dddfb669b2c9088/prompt_toolkit-3.0.47-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "1e1b29cb58080b1e69f207c893a1a7bf16d127a5c30c9d17a25a5d77792e5360", + "url": "https://files.pythonhosted.org/packages/47/6d/0279b119dafc74c1220420028d490c4399b790fc1256998666e3a341879f/prompt_toolkit-3.0.47.tar.gz" + } + ], + "project_name": "prompt-toolkit", + "requires_dists": [ + "wcwidth" + ], + "requires_python": ">=3.7.0", + "version": "3.0.47" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", + "url": "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", + "url": "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz" + } + ], + "project_name": "ptyprocess", + "requires_dists": [], + "requires_python": null, + "version": "0.7.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a", + "url": "https://files.pythonhosted.org/packages/f7/3f/01c8b82017c199075f8f788d0d906b9ffbbc5a47dc9918a945e13d5a2bda/pygments-2.18.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199", + "url": "https://files.pythonhosted.org/packages/8e/62/8336eff65bcbc8e4cb5d05b55faf041285951b6e80f33e2bff2024788f31/pygments-2.18.0.tar.gz" + } + ], + "project_name": "pygments", + "requires_dists": [ + "colorama>=0.4.6; extra == \"windows-terminal\"" + ], + "requires_python": ">=3.8", + "version": "2.18.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "b8b8060bb426838fbe942479c90296ce976249451118ef566a5a0b7d8b78fb05", + "url": "https://files.pythonhosted.org/packages/42/54/2a8ecfcc9a714a6fbf86559a4b0f50b126a4ac4269ea8134f2c75c3e73de/setuptools-70.2.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "bd63e505105011b25c3c11f753f7e3b8465ea739efddaccef8f0efac2137bac1", + "url": "https://files.pythonhosted.org/packages/8d/e6/2fc95aec377988ff3ca882aa58d4f6ab35ff59a12b1611a9fe3075eb3019/setuptools-70.2.0.tar.gz" + } + ], + "project_name": "setuptools", + "requires_dists": [ + "build[virtualenv]>=1.0.3; extra == \"test\"", + "filelock>=3.4.0; extra == \"test\"", + "furo; extra == \"doc\"", + "importlib-metadata; extra == \"test\"", + "ini2toml[lite]>=0.14; extra == \"test\"", + "jaraco.develop>=7.21; (python_version >= \"3.9\" and sys_platform != \"cygwin\") and extra == \"test\"", + "jaraco.envs>=2.2; extra == \"test\"", + "jaraco.packaging>=9.3; extra == \"doc\"", + "jaraco.path>=3.2.0; extra == \"test\"", + "jaraco.test; extra == \"test\"", + "jaraco.tidelift>=1.4; extra == \"doc\"", + "mypy==1.10.0; extra == \"test\"", + "packaging>=23.2; extra == \"test\"", + "pip>=19.1; extra == \"test\"", + "pygments-github-lexers==0.0.5; extra == \"doc\"", + "pyproject-hooks!=1.1; extra == \"doc\"", + "pyproject-hooks!=1.1; extra == \"test\"", + "pytest!=8.1.*,>=6; extra == \"test\"", + "pytest-checkdocs>=2.4; extra == \"test\"", + "pytest-cov; extra == \"test\"", + "pytest-enabler>=2.2; extra == \"test\"", + "pytest-home>=0.5; extra == \"test\"", + "pytest-mypy; extra == \"test\"", + "pytest-perf; sys_platform != \"cygwin\" and extra == \"test\"", + "pytest-ruff>=0.3.2; sys_platform != \"cygwin\" and extra == \"test\"", + "pytest-subprocess; extra == \"test\"", + "pytest-timeout; extra == \"test\"", + "pytest-xdist>=3; extra == \"test\"", + "rst.linker>=1.9; extra == \"doc\"", + "sphinx-favicon; extra == \"doc\"", + "sphinx-inline-tabs; extra == \"doc\"", + "sphinx-lint; extra == \"doc\"", + "sphinx-notfound-page<2,>=1; extra == \"doc\"", + "sphinx-reredirects; extra == \"doc\"", + "sphinx>=3.5; extra == \"doc\"", + "sphinxcontrib-towncrier; extra == \"doc\"", + "tomli-w>=1.0.0; extra == \"test\"", + "tomli; extra == \"test\"", + "virtualenv>=13.0.0; extra == \"test\"", + "wheel; extra == \"test\"" + ], + "requires_python": ">=3.8", + "version": "70.2.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", + "url": "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", + "url": "https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz" + } + ], + "project_name": "traitlets", + "requires_dists": [ + "argcomplete>=3.0.3; extra == \"test\"", + "mypy>=1.7.0; extra == \"test\"", + "myst-parser; extra == \"docs\"", + "pre-commit; extra == \"test\"", + "pydata-sphinx-theme; extra == \"docs\"", + "pytest-mock; extra == \"test\"", + "pytest-mypy-testing; extra == \"test\"", + "pytest<8.2,>=7.0; extra == \"test\"", + "sphinx; extra == \"docs\"" + ], + "requires_python": ">=3.8", + "version": "5.14.3" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", + "url": "https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5", + "url": "https://files.pythonhosted.org/packages/6c/63/53559446a878410fc5a5974feb13d31d78d752eb18aeba59c7fef1af7598/wcwidth-0.2.13.tar.gz" + } + ], + "project_name": "wcwidth", + "requires_dists": [ + "backports.functools-lru-cache>=1.2.1; python_version < \"3.2\"" + ], + "requires_python": null, + "version": "0.2.13" + } + ], + "platform_tag": null + } + ], + "only_builds": [], + "only_wheels": [], + "path_mappings": {}, + "pex_version": "2.3.1", + "pip_version": "23.0.1", + "prefer_older_binary": false, + "requirements": [ + "ipython<8,>=7.27.0" + ], + "requires_python": [ + "<3.11,>=3.10" + ], + "resolver_version": "pip-2020-resolver", + "style": "universal", + "target_systems": [ + "linux", + "mac" + ], + "transitive": true, + "use_pep517": null +} diff --git a/locks/tools/isort.lock b/locks/tools/isort.lock new file mode 100644 index 00000000..1df7b2ca --- /dev/null +++ b/locks/tools/isort.lock @@ -0,0 +1,97 @@ +// This lockfile was autogenerated by Pants. To regenerate, run: +// +// pants generate-lockfiles --resolve=isort +// +// --- BEGIN PANTS LOCKFILE METADATA: DO NOT EDIT OR REMOVE --- +// { +// "version": 3, +// "valid_for_interpreter_constraints": [ +// "CPython<3.11,>=3.10" +// ], +// "generated_with_requirements": [ +// "isort[colors,pyproject]<6.0,>=5.9.3" +// ], +// "manylinux": "manylinux2014", +// "requirement_constraints": [], +// "only_binary": [], +// "no_binary": [] +// } +// --- END PANTS LOCKFILE METADATA --- + +{ + "allow_builds": true, + "allow_prereleases": false, + "allow_wheels": true, + "build_isolation": true, + "constraints": [], + "locked_resolves": [ + { + "locked_requirements": [ + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", + "url": "https://download.pytorch.org/whl/colorama-0.4.6-py2.py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", + "url": "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", + "url": "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz" + } + ], + "project_name": "colorama", + "requires_dists": [], + "requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7", + "version": "0.4.6" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6", + "url": "https://files.pythonhosted.org/packages/d1/b3/8def84f539e7d2289a02f0524b944b15d7c75dab7628bedf1c4f0992029c/isort-5.13.2-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109", + "url": "https://files.pythonhosted.org/packages/87/f9/c1eb8635a24e87ade2efce21e3ce8cd6b8630bb685ddc9cdaca1349b2eb5/isort-5.13.2.tar.gz" + } + ], + "project_name": "isort", + "requires_dists": [ + "colorama>=0.4.6; extra == \"colors\"" + ], + "requires_python": ">=3.8.0", + "version": "5.13.2" + } + ], + "platform_tag": null + } + ], + "only_builds": [], + "only_wheels": [], + "path_mappings": {}, + "pex_version": "2.3.1", + "pip_version": "23.0.1", + "prefer_older_binary": false, + "requirements": [ + "isort[colors,pyproject]<6.0,>=5.9.3" + ], + "requires_python": [ + "<3.11,>=3.10" + ], + "resolver_version": "pip-2020-resolver", + "style": "universal", + "target_systems": [ + "linux", + "mac" + ], + "transitive": true, + "use_pep517": null +} diff --git a/locks/tools/pytest.lock b/locks/tools/pytest.lock new file mode 100644 index 00000000..83eb1dca --- /dev/null +++ b/locks/tools/pytest.lock @@ -0,0 +1,454 @@ +// This lockfile was autogenerated by Pants. To regenerate, run: +// +// pants generate-lockfiles --resolve=pytest +// +// --- BEGIN PANTS LOCKFILE METADATA: DO NOT EDIT OR REMOVE --- +// { +// "version": 3, +// "valid_for_interpreter_constraints": [ +// "CPython<3.11,>=3.10" +// ], +// "generated_with_requirements": [ +// "pytest-benchmark==4.0.0", +// "pytest-cov!=2.12.1,<3.1,>=2.12", +// "pytest-platform-markers", +// "pytest-rerunfailures", +// "pytest-xdist<3,>=2.5", +// "pytest~=8.0" +// ], +// "manylinux": "manylinux2014", +// "requirement_constraints": [], +// "only_binary": [], +// "no_binary": [] +// } +// --- END PANTS LOCKFILE METADATA --- + +{ + "allow_builds": true, + "allow_prereleases": false, + "allow_wheels": true, + "build_isolation": true, + "constraints": [], + "locked_resolves": [ + { + "locked_requirements": [ + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "79b356f3dd5b26f3ad23b35c75dbdaf1f9e2450b6bcefc6d0825ea0aa3f86ca5", + "url": "https://files.pythonhosted.org/packages/7a/c3/a5b06a07b68795018f47b5d69b523ad473ac9ee66be3c22c4d3e5eadd91e/coverage-7.5.4-pp38.pp39.pp310-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "6cfb5a4f556bb51aba274588200a46e4dd6b505fb1a5f8c5ae408222eb416f99", + "url": "https://files.pythonhosted.org/packages/38/3d/9f9469f445789a170cb5bef3ad02ae9084ddd689f938797aa8ee793db404/coverage-7.5.4-cp310-cp310-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "5cd64adedf3be66f8ccee418473c2916492d53cbafbfcff851cbec5a8454b136", + "url": "https://files.pythonhosted.org/packages/44/ab/1ce64d6d01486b7e307ce0b25565b2337b9883d409fdb7655c94b0e80ae7/coverage-7.5.4-cp310-cp310-musllinux_1_2_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "2214ee920787d85db1b6a0bd9da5f8503ccc8fcd5814d90796c2f2493a2f4d2e", + "url": "https://files.pythonhosted.org/packages/99/49/0e8c8e8f9f7ea87ed94ddce70cdfe49224b13857ef3cbdb65a5eb29bba6f/coverage-7.5.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "b385d49609f8e9efc885790a5a0e89f2e3ae042cdf12958b6034cc442de428d3", + "url": "https://files.pythonhosted.org/packages/a2/78/d457df19baefbe3d38ef63cddfbda0f443d6546f3f56fa95cd884d612e8e/coverage-7.5.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "1137f46adb28e3813dec8c01fefadcb8c614f33576f672962e323b5128d9a68d", + "url": "https://files.pythonhosted.org/packages/a9/9a/79381c5dbc118b5cc0aac637352f65078766527ab0d23031d5421f2fb144/coverage-7.5.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "2174e7c23e0a454ffe12267a10732c273243b4f2d50d07544a91198f05c48f47", + "url": "https://files.pythonhosted.org/packages/b0/d8/b7bde23a5e94cfc1a45effad2dd4c45dc111c515f71c522986dd8ded31a1/coverage-7.5.4-cp310-cp310-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "a44963520b069e12789d0faea4e9fdb1e410cdc4aab89d94f7f55cbb7fef0353", + "url": "https://files.pythonhosted.org/packages/ef/05/31553dc038667012853d0a248b57987d8d70b2d67ea885605f87bcb1baba/coverage-7.5.4.tar.gz" + }, + { + "algorithm": "sha256", + "hash": "b4a474f799456e0eb46d78ab07303286a84a3140e9700b9e154cfebc8f527016", + "url": "https://files.pythonhosted.org/packages/ef/48/fccbf1b4ab5943e1b5bf5e29892531341b4c2731c448c6970349b0bb2f3b/coverage-7.5.4-cp310-cp310-musllinux_1_2_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "e564c2cf45d2f44a9da56f4e3a26b2236504a496eb4cb0ca7221cd4cc7a9aca9", + "url": "https://files.pythonhosted.org/packages/fd/a2/4db4030508e3f7267151155e2221487e1515eda167262d0aa88bce8d4b57/coverage-7.5.4-cp310-cp310-musllinux_1_2_x86_64.whl" + } + ], + "project_name": "coverage", + "requires_dists": [ + "tomli; python_full_version <= \"3.11.0a6\" and extra == \"toml\"" + ], + "requires_python": ">=3.8", + "version": "7.5.4" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad", + "url": "https://files.pythonhosted.org/packages/01/90/79fe92dd413a9cab314ef5c591b5aa9b9ba787ae4cadab75055b0ae00b33/exceptiongroup-1.2.1-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16", + "url": "https://files.pythonhosted.org/packages/a0/65/d66b7fbaef021b3c954b3bbb196d21d8a4b97918ea524f82cfae474215af/exceptiongroup-1.2.1.tar.gz" + } + ], + "project_name": "exceptiongroup", + "requires_dists": [ + "pytest>=6; extra == \"test\"" + ], + "requires_python": ">=3.7", + "version": "1.2.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc", + "url": "https://files.pythonhosted.org/packages/43/09/2aea36ff60d16dd8879bdb2f5b3ee0ba8d08cbbdcdfe870e695ce3784385/execnet-2.1.1-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3", + "url": "https://files.pythonhosted.org/packages/bb/ff/b4c0dc78fbe20c3e59c0c7334de0c27eb4001a2b2017999af398bf730817/execnet-2.1.1.tar.gz" + } + ], + "project_name": "execnet", + "requires_dists": [ + "hatch; extra == \"testing\"", + "pre-commit; extra == \"testing\"", + "pytest; extra == \"testing\"", + "tox; extra == \"testing\"" + ], + "requires_python": ">=3.8", + "version": "2.1.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374", + "url": "https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", + "url": "https://files.pythonhosted.org/packages/d7/4b/cbd8e699e64a6f16ca3a8220661b5f83792b3017d0f79807cb8708d33913/iniconfig-2.0.0.tar.gz" + } + ], + "project_name": "iniconfig", + "requires_dists": [], + "requires_python": ">=3.7", + "version": "2.0.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124", + "url": "https://files.pythonhosted.org/packages/08/aa/cc0199a5f0ad350994d660967a8efb233fe0416e4639146c089643407ce6/packaging-24.1-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002", + "url": "https://files.pythonhosted.org/packages/51/65/50db4dda066951078f0a96cf12f4b9ada6e4b811516bf0262c0f4f7064d4/packaging-24.1.tar.gz" + } + ], + "project_name": "packaging", + "requires_dists": [], + "requires_python": ">=3.8", + "version": "24.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", + "url": "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", + "url": "https://files.pythonhosted.org/packages/96/2d/02d4312c973c6050a18b314a5ad0b3210edb65a906f868e31c111dede4a6/pluggy-1.5.0.tar.gz" + } + ], + "project_name": "pluggy", + "requires_dists": [ + "pre-commit; extra == \"dev\"", + "pytest-benchmark; extra == \"testing\"", + "pytest; extra == \"testing\"", + "tox; extra == \"dev\"" + ], + "requires_python": ">=3.8", + "version": "1.5.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378", + "url": "https://files.pythonhosted.org/packages/f6/f0/10642828a8dfb741e5f3fbaac830550a518a775c7fff6f04a007259b0548/py-1.11.0-py2.py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719", + "url": "https://files.pythonhosted.org/packages/98/ff/fec109ceb715d2a6b4c4a85a61af3b40c723a961e8828319fbcb15b868dc/py-1.11.0.tar.gz" + } + ], + "project_name": "py", + "requires_dists": [], + "requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7", + "version": "1.11.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "859625bc251f64e21f077d099d4162689c762b5d6a4c3c97553d56241c9674d5", + "url": "https://files.pythonhosted.org/packages/e0/a9/023730ba63db1e494a271cb018dcd361bd2c917ba7004c3e49d5daf795a2/py_cpuinfo-9.0.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "3cdbbf3fac90dc6f118bfd64384f309edeadd902d7c8fb17f02ffa1fc3f49690", + "url": "https://files.pythonhosted.org/packages/37/a8/d832f7293ebb21690860d2e01d8115e5ff6f2ae8bbdc953f0eb0fa4bd2c7/py-cpuinfo-9.0.0.tar.gz" + } + ], + "project_name": "py-cpuinfo", + "requires_dists": [], + "requires_python": null, + "version": "9.0.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343", + "url": "https://files.pythonhosted.org/packages/4e/e7/81ebdd666d3bff6670d27349b5053605d83d55548e6bd5711f3b0ae7dd23/pytest-8.2.2-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977", + "url": "https://files.pythonhosted.org/packages/a6/58/e993ca5357553c966b9e73cb3475d9c935fe9488746e13ebdf9b80fae508/pytest-8.2.2.tar.gz" + } + ], + "project_name": "pytest", + "requires_dists": [ + "argcomplete; extra == \"dev\"", + "attrs>=19.2; extra == \"dev\"", + "colorama; sys_platform == \"win32\"", + "exceptiongroup>=1.0.0rc8; python_version < \"3.11\"", + "hypothesis>=3.56; extra == \"dev\"", + "iniconfig", + "mock; extra == \"dev\"", + "packaging", + "pluggy<2.0,>=1.5", + "pygments>=2.7.2; extra == \"dev\"", + "requests; extra == \"dev\"", + "setuptools; extra == \"dev\"", + "tomli>=1; python_version < \"3.11\"", + "xmlschema; extra == \"dev\"" + ], + "requires_python": ">=3.8", + "version": "8.2.2" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "fdb7db64e31c8b277dff9850d2a2556d8b60bcb0ea6524e36e28ffd7c87f71d6", + "url": "https://files.pythonhosted.org/packages/4d/a1/3b70862b5b3f830f0422844f25a823d0470739d994466be9dbbbb414d85a/pytest_benchmark-4.0.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "fb0785b83efe599a6a956361c0691ae1dbb5318018561af10f3e915caa0048d1", + "url": "https://files.pythonhosted.org/packages/28/08/e6b0067efa9a1f2a1eb3043ecd8a0c48bfeb60d3255006dcc829d72d5da2/pytest-benchmark-4.0.0.tar.gz" + } + ], + "project_name": "pytest-benchmark", + "requires_dists": [ + "aspectlib; extra == \"aspect\"", + "elasticsearch; extra == \"elasticsearch\"", + "pathlib2; python_version < \"3.4\"", + "py-cpuinfo", + "pygal; extra == \"histogram\"", + "pygaljs; extra == \"histogram\"", + "pytest>=3.8", + "statistics; python_version < \"3.4\"" + ], + "requires_python": ">=3.7", + "version": "4.0.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "578d5d15ac4a25e5f961c938b85a05b09fdaae9deef3bb6de9a6e766622ca7a6", + "url": "https://files.pythonhosted.org/packages/20/49/b3e0edec68d81846f519c602ac38af9db86e1e71275528b3e814ae236063/pytest_cov-3.0.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "e7f0f5b1617d2210a2cabc266dfe2f4c75a8d32fb89eafb7ad9d06f6d076d470", + "url": "https://files.pythonhosted.org/packages/61/41/e046526849972555928a6d31c2068410e47a31fb5ab0a77f868596811329/pytest-cov-3.0.0.tar.gz" + } + ], + "project_name": "pytest-cov", + "requires_dists": [ + "coverage[toml]>=5.2.1", + "fields; extra == \"testing\"", + "hunter; extra == \"testing\"", + "process-tests; extra == \"testing\"", + "pytest-xdist; extra == \"testing\"", + "pytest>=4.6", + "six; extra == \"testing\"", + "virtualenv; extra == \"testing\"" + ], + "requires_python": ">=3.6", + "version": "3.0.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "810958f66a91afb1a1e2ae83089d8dc1cd2437ac96b12963042fbb9fb4d16af0", + "url": "https://files.pythonhosted.org/packages/f4/af/9c0bda43e486a3c9bf1e0f876d0f241bc3f229d7d65d09331a0868db9629/pytest_forked-1.6.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "4dafd46a9a600f65d822b8f605133ecf5b3e1941ebb3588e943b4e3eb71a5a3f", + "url": "https://files.pythonhosted.org/packages/8c/c9/93ad2ba2413057ee694884b88cf7467a46c50c438977720aeac26e73fdb7/pytest-forked-1.6.0.tar.gz" + } + ], + "project_name": "pytest-forked", + "requires_dists": [ + "py", + "pytest>=3.10" + ], + "requires_python": ">=3.7", + "version": "1.6.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "b05cb0bcd51a7cd0375bfbeeb3eaeb01fc85665e45b21fc9494a8a19137f4d32", + "url": "https://files.pythonhosted.org/packages/c5/d1/2ef73ee137add043df444fddf1c851b8ca70ab9c7b7f18e18c4c244fec6d/pytest_platform_markers-1.0.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "07ea92669114ba8083b6653995b5a9ab14d57ca16307fd2af22d6f7d295160e4", + "url": "https://files.pythonhosted.org/packages/b3/e7/174a22a8cb4cf4b64456cd799f472bb90206f1ce8d537edbc1d9659689a3/pytest-platform-markers-1.0.0.tar.gz" + } + ], + "project_name": "pytest-platform-markers", + "requires_dists": [ + "pytest>=3.6.0" + ], + "requires_python": null, + "version": "1.0.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "4197bdd2eaeffdbf50b5ea6e7236f47ff0e44d1def8dae08e409f536d84e7b32", + "url": "https://files.pythonhosted.org/packages/dc/e7/e75bd157331aecc190f5f8950d7ea3d2cf56c3c57fb44da70e60b221133f/pytest_rerunfailures-14.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "4a400bcbcd3c7a4ad151ab8afac123d90eca3abe27f98725dc4d9702887d2e92", + "url": "https://files.pythonhosted.org/packages/cc/a4/6de45fe850759e94aa9a55cda807c76245af1941047294df26c851dfb4a9/pytest-rerunfailures-14.0.tar.gz" + } + ], + "project_name": "pytest-rerunfailures", + "requires_dists": [ + "packaging>=17.1", + "pytest>=7.2" + ], + "requires_python": ">=3.8", + "version": "14.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "6fe5c74fec98906deb8f2d2b616b5c782022744978e7bd4695d39c8f42d0ce65", + "url": "https://files.pythonhosted.org/packages/21/08/b1945d4b4986eb1aa10cf84efc5293bba39da80a2f95db3573dd90678408/pytest_xdist-2.5.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "4580deca3ff04ddb2ac53eba39d76cb5dd5edeac050cb6fbc768b0dd712b4edf", + "url": "https://files.pythonhosted.org/packages/5d/43/9dbc32d297d6eae85d6c05dc8e8d3371061bd6cbe56a2f645d9ea4b53d9b/pytest-xdist-2.5.0.tar.gz" + } + ], + "project_name": "pytest-xdist", + "requires_dists": [ + "execnet>=1.1", + "filelock; extra == \"testing\"", + "psutil>=3.0; extra == \"psutil\"", + "pytest-forked", + "pytest>=6.2.0", + "setproctitle; extra == \"setproctitle\"" + ], + "requires_python": ">=3.6", + "version": "2.5.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", + "url": "https://files.pythonhosted.org/packages/97/75/10a9ebee3fd790d20926a90a2547f0bf78f371b2f13aa822c759680ca7b9/tomli-2.0.1-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f", + "url": "https://files.pythonhosted.org/packages/c0/3f/d7af728f075fb08564c5949a9c95e44352e23dee646869fa104a3b2060a3/tomli-2.0.1.tar.gz" + } + ], + "project_name": "tomli", + "requires_dists": [], + "requires_python": ">=3.7", + "version": "2.0.1" + } + ], + "platform_tag": null + } + ], + "only_builds": [], + "only_wheels": [], + "path_mappings": {}, + "pex_version": "2.3.1", + "pip_version": "23.0.1", + "prefer_older_binary": false, + "requirements": [ + "pytest-benchmark==4.0.0", + "pytest-cov!=2.12.1,<3.1,>=2.12", + "pytest-platform-markers", + "pytest-rerunfailures", + "pytest-xdist<3,>=2.5", + "pytest~=8.0" + ], + "requires_python": [ + "<3.11,>=3.10" + ], + "resolver_version": "pip-2020-resolver", + "style": "universal", + "target_systems": [ + "linux", + "mac" + ], + "transitive": true, + "use_pep517": null +} diff --git a/manifest.json b/manifest.json deleted file mode 100644 index e48da42a..00000000 --- a/manifest.json +++ /dev/null @@ -1,538 +0,0 @@ -{ - "links": [ - { - "link": "file:///${PROJECT_ROOT}/plugins/pdm-plugin-torch", - "path": "/home/ts/.cache/pdm/http/c/7/0/9/6/c709603354993ece73006925396d41ac9297ace4375f0ec25dc5b94b" - }, - { - "checksum": "58B71CFC4304FE428F9718C05034EC0359265D46C4CD346BD471F6DAAB95A7FB", - "link": "https://files.pythonhosted.org/packages/40/a9/7deac76c58fa47c95360116a06b53b9b62f6db11336fe61b6ab53784d98b/setuptools-59.5.0-py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/9/e/e/3/9/9ee39e4d6988b7ed2391265a8d0bee2e10e91e6793ade4f1c29f0978" - }, - { - "checksum": "EEB29B06C59EAD747FF6B8DF3EEFA50A9CD29C2FC444DC06658C9277C7B9DF66", - "link": "https://files.pythonhosted.org/packages/da/eb/ff828f4ec32c85e10d9c344e6b7f11bcacfb5d70f2fd16bea6fc1ae6df06/bandit-1.7.4-py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/e/2/a/1/4/e2a144a5fcaacb85e4d6a5719567c0c45e37969142832e27b6aaa435" - }, - { - "checksum": "1CB881C12764586B54DE11EDBCD471FAD112477C764C01C03CC787F977AAF0D5", - "link": "https://files.pythonhosted.org/packages/d0/5a/5f31494e3acbb6319ee60c3a3a09d3e536a3fd2353f76af9cbff799c4999/black-22.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "path": "/home/ts/.cache/pdm/http/5/7/8/e/5/578e500d42da9d42520bd52343199de224b1a9e7701e95012fe067d5" - }, - { - "checksum": "92A19AA4AD8D4849E050542E386D4C53F37FDC6CC15D324003ED32C9FE310174", - "link": "https://files.pythonhosted.org/packages/e9/db/13dbca8b3544092739740406e00b63dbbee7af1f95dcab3e59e4700b9e88/gsutil-5.16.tar.gz", - "path": "/home/ts/.cache/pdm/http/1/3/5/d/3/135d30437dca1ff59895f1f5995b7beeaba45e4a01cc3d2e30db4c1b" - }, - { - "checksum": "329E971FAAC0A8539FD16867032787133E446847659FE5EA51EE2A75678C66A5", - "link": "https://files.pythonhosted.org/packages/b8/5b/f18e227df38b94b4ee30d2502fd531bebac23946a2497e5595067a561274/isort-5.10.1-py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/c/c/f/a/8/ccfa8123c616f95b502c06d5f470f21fdbb28adcaa7631dd68c6c9ef" - }, - { - "checksum": "E4889623844EDCA0A9D318AB11BC46DD2E9FDCA07BFE4C02E9A735D3618800D6", - "link": "https://files.pythonhosted.org/packages/72/fd/594c936c65e707deda5670e8fff5ca2c948a12e922813eab5d316694e9ca/myst_parser-0.18.1-py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/7/b/5/7/5/7b5759eeda697fcdd1d25f7bf473c84ca24e041c97032d1097937868" - }, - { - "checksum": "29179AAAAEB610C711E455C9D823791FBB6A75B0F0726D1CECD7C3004ADE2B82", - "link": "https://files.pythonhosted.org/packages/91/96/9cbbc7103fb482d5809fe4976ecb9b627058210d02817fcbfeebeaa8f762/Sphinx-4.5.0-py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/a/9/d/2/c/a9d2cb3ba6828e3513ba202f490cb93216d89fc7791195bbfffc8a06" - }, - { - "checksum": "2BC4B5B3B6E00AD70AEC1632647671BE1AEBC96F96EAC3C6BD06DCAB0B66E4F5", - "link": "https://files.pythonhosted.org/packages/40/76/86f886e750b81a4357b6ed606b2bcf0ce6d6c27ad3c09ebf63ed674fc86e/pytest-6.2.5-py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/0/7/a/0/9/07a09bbe61bd4fc1d8dc2e00117d5a89be4f99b19a5a45f6816e7251" - }, - { - "checksum": "8D91FE449D670D45407C1BFCDB24BC3A6D45BB2616AD40B6ADFC76BD9C3CD5F4", - "link": "https://files.pythonhosted.org/packages/57/fc/bfadc16f4046de2f0069217d7202942bf47fe004853cb59fbd3138367a60/sphinx_autodoc_typehints-1.19.1-py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/3/6/a/6/9/36a69fe30e94ba0536cdbf8834b283844e7d51b12d97bf1f4f7cf540" - }, - { - "checksum": "425AE9F1563054AB4A54EF4596D98DB46050146ABC8B997F902094C023F6CAA0", - "link": "https://files.pythonhosted.org/packages/e0/d2/3818e4730e314719e27f639c44164419e40eed826d63753dc480262036e8/sphinx_rtd_theme-1.0.0-py2.py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/c/9/7/1/5/c9715de146fb7ec7746a75e1c20e42e45c8260fc4628bb462d21794f" - }, - { - "checksum": "CF51301669574E1E9FBC324AFA419AF1B3AECA1A28646028DD970DB08716645C", - "link": "https://files.pythonhosted.org/packages/60/8d/a426a9f7f9ffc8e02d377ca82e3f005817ccf0141b85dbb8653aad13901b/sphinxcontrib_apidoc-0.3.0-py2.py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/c/e/6/1/9/ce619d576f6a58c1525bf6a01266f38787fcfe7c3d52f7e75ba298a0" - }, - { - "checksum": "567265C34C2B488C5D46049050314947FAA0E113F34CE8AB089CBFBBDE162AD2", - "link": "https://files.pythonhosted.org/packages/80/49/a5ec29886ef823718c8ae54ed0b3ad7e19066b5bf21cec5038427e6a04c4/tensorboard-2.10.1-py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/5/6/5/4/e/5654e8c24fe14ac27f52f3120ddbb8312a28cb0ac65501f04b67a754" - }, - { - "checksum": "487D042F56F8C7098E2FC2F90F481AFBD672E120604AC617E92E019FC45DB99E", - "link": "https://download.pytorch.org/whl/cpu/torch-1.10.2%2Bcpu-cp38-cp38-linux_x86_64.whl", - "path": "/home/ts/.cache/pdm/http/2/d/a/f/2/2daf262723282e1487be1ac3815fbad33fb0020aa797bb6442a2f301" - }, - { - "checksum": "C7DABFC275CDB9AACA4DF1162262DB5F49F9B0BECBFB9920F4B1B5E929FA9446", - "link": "https://files.pythonhosted.org/packages/4c/5e/6003a0d1f37725ec2ebd4046b657abb9372202655f96e76795dca8c0063c/docutils-0.17.1-py2.py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/c/2/f/c/2/c2fc22b947ba630f6c09f8d40cd8837cde30f74cf517b6e1b6826d30" - }, - { - "checksum": "DCCC9AC417A7EF0D7B86D7BFEDCC882EC4183625254A0858795CAD205A45CF93", - "link": "https://files.pythonhosted.org/packages/ca/91/6d9b8ccacd0412c08820f72cebaa4f0c0441b5cda699c90f618b6f8a1b42/requests-2.28.1-py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/c/9/0/b/b/c90bb0115354cf181593ff0acef8fbcd6ad9a2e04a5cca1a5e83cf85" - }, - { - "checksum": "9AAFD775AA6A39B60EF2934B3AD005D557FD149C16D6C54F0B6C93FEEBF3923B", - "link": "https://files.pythonhosted.org/packages/10/ad/00b090d23a222943eb0eda509720a404f531a439e803f6538f35136cae9e/alabaster-0.7.12-py2.py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/6/6/5/8/2/665825fa26811c9040bca81ac7d85a493af4039e8e045c592289183e" - }, - { - "checksum": "41C9FD7B7995F7F738D6C7323D74E32F1AC16502416210CC48B424A155E4BFA5", - "link": "https://files.pythonhosted.org/packages/98/dc/ab7e2156ec6a33c66d85986178abc7944f40804d7558cd544ccb114af6a9/google_auth-2.13.0-py2.py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/5/1/2/4/e/5124e2e48e43161bd446ca2008971a729f3dfebbe058e2fc7714551d" - }, - { - "checksum": "687C046B085898EA88F7080009CC83338707167DACCC40A4EFF790B90A83D53C", - "link": "https://files.pythonhosted.org/packages/b1/0e/0636cc1448a7abc444fb1b3a63655e294e0d2d49092dc3de05241be6d43c/google_auth_oauthlib-0.4.6-py2.py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/8/a/1/5/1/8a1513cb41921926eee8f98381a7d7ff6765ea38d07320c7874f8f30" - }, - { - "checksum": "2576FB828DDEDBC0D05A52C82832DAD95698A3446EB548F897AB6AB89302DA68", - "link": "https://files.pythonhosted.org/packages/f9/3f/ecd1b708973b9a3e4574b43cffc1ce8eb98696da34f1a1c44a68c3c0d737/markdown_it_py-2.1.0-py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/0/8/2/b/6/082b66d9c67a5f21f3529e0af84a4804ca57c3a7a17431e48d5318ae" - }, - { - "checksum": "498BA4AA851598E4377C9E5FDE4B9D1EEE14CE8E8AFD0CC3F5EAEDB9BB40EAB1", - "link": "https://files.pythonhosted.org/packages/9e/01/f38e2ff29715251cf25532b9082a1589ab7e4f571ced434f98d0139336dc/pluggy-1.0.0-py2.py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/5/f/7/4/c/5f74c5211430b8925581fc44318efa9aca28952093223006bf59a1ba" - }, - { - "checksum": "51E5A1E158C677FC528024A52F941CDE096497B7BA653771B88C7DD62F82894E", - "link": "https://files.pythonhosted.org/packages/3c/f8/b6d7fd81464553e24a07f9d444126db3beb902b6bff6fcd6524d8284097f/protobuf-3.19.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "path": "/home/ts/.cache/pdm/http/1/4/1/b/c/141bc74a9131e29b6b2a1e87c55c915400d233e9d0ee64a420d7311d" - }, - { - "checksum": "95F9DA46B340D6C342B8BDAC74C659465BBBCDF9CB8543A291EB643D67337B3E", - "link": "https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/3/f/4/9/c/3f49c19c42525485da2c265d82244e942d3619ff5626136ee23992d0" - }, - { - "checksum": "A512B142ED9B8B6E53292EA1EEDBFEBA811539B5806227D726480528A689D95E", - "link": "https://files.pythonhosted.org/packages/60/f9/802efd84988bffd9f644c03b6e66fde8e76c3aa33db4279ddd11c5d61f4b/tensorboard_data_server-0.6.1-py3-none-manylinux2010_x86_64.whl", - "path": "/home/ts/.cache/pdm/http/7/4/8/6/1/74861effbbd89b3070ca5fb5b8cd7cafc5ecfd90c405a992356d6bd2" - }, - { - "checksum": "C14EE070B697A0A7EAC64D6DBAE3261F219334AB275EA562B1AFE3E1FA9AE29C", - "link": "https://files.pythonhosted.org/packages/2c/39/ba081c6f7837366a39c9286fa1bc9dbf217249df80e133f25c62b05d1a53/absl_py-1.3.0-py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/1/c/2/3/9/1c23949811f90c3ce0ead9a0e3fcf839ef041c3a531086e6167bb0e6" - }, - { - "checksum": "35248B872888022C1234A5185561F06C97AD7F8FF7180DCDD6F2F2D786A8B596", - "link": "https://files.pythonhosted.org/packages/d3/e5/c5509683462e51b070df9e83e7f72c1ccfe3f733f328b4a0f06804c27278/argcomplete-2.0.0-py2.py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/0/f/d/7/b/0fd7b40ed8d3903b79c13551e53175e21f4a992ac413cc60c3060311" - }, - { - "checksum": "145165244EEE7FE2E0887C13E69516FE346A219BA5349191567B1475F8DEC794", - "link": "https://files.pythonhosted.org/packages/f2/bc/d817287d1aa01878af07c19505fafd1165cd6a119e9d0821ca1d1c20312d/attrs-22.1.0-py2.py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/f/8/3/3/1/f833179ab7a61ade6678030671eae554ff5d68b7767eb2d31bfdf31a" - }, - { - "checksum": "AE6DABFBA781B7594BE62DD87527BD3AD30E174006C44F4EEE41FCB349374164", - "link": "https://files.pythonhosted.org/packages/2e/57/a4177e24f8ed700c037e1eca7620097fdfbb1c9b358601e40169adf6d364/Babel-2.10.3-py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/6/f/4/0/0/6f400073f1f5953f4813fd3db3f0bbc7287323ad826c6d3aff14d9ea" - }, - { - "checksum": "825393548F18747A9C0752AAB1700893927774F4443C03049CDCEB95A69A2E45", - "link": "https://files.pythonhosted.org/packages/72/42/6a8e18a93f75c84fd065cc9b57a4117219fa3c5a002a80cab8f339883ec8/Box2D-2.3.10-cp38-cp38-manylinux1_x86_64.whl", - "path": "/home/ts/.cache/pdm/http/d/1/0/f/4/d10f4579cdf059e08acdfd974f23d11147db25fced1f5e73c334c72b" - }, - { - "checksum": "E8D8ED1A31A112E4B6E0F74B93CD98DF4571F1A2DB25C07BC72C140F11088CFE", - "link": "https://files.pythonhosted.org/packages/c2/f1/df59e28c642d583f7dacffb1e0965d0e00b218e0186d7858ac5233dce840/click-8.1.3-py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/c/e/0/b/8/ce0b863dd6f9fe26fb2bdcdb08a17f0fb0c044bac2cc256d212517bd" - }, - { - "checksum": "5B311ADB55BEB679011260800D9E5EAD105F127F6FC0FD2E4D424ECC531E6624", - "link": "https://files.pythonhosted.org/packages/6b/b0/e595ce2a2527e169c3bcd6c33d2473c1918e0b7f6826a043ca1245dd4e5b/crcmod-1.7.tar.gz", - "path": "/home/ts/.cache/pdm/http/c/5/c/e/3/c5ce385ba73dc040d721ec15aed0b905d51c5bcc61b9d071b6a8dd88" - }, - { - "checksum": "221B8658201EDECE3E6313AAFE005A2A951A29D7E83D689375F2789C3D0D94BD", - "link": "https://files.pythonhosted.org/packages/bc/a2/7d35ba2c8d9963398fcec49cd814e50a6b920d213928f06fdbbf8aa3289b/fasteners-0.18-py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/7/1/3/b/e/713be7a75d41722b90b9a9a317ffeba2564b7e6fd6c7a6c733097df8" - }, - { - "checksum": "627827A99516A1AE5BA2A3613303D3BB8BB8991D4ED2F3F6A5101ADA182CB414", - "link": "https://files.pythonhosted.org/packages/05/e5/3162be0abab32f152f331423426471935f286dd4ad70fa704f2a34ea3c1e/gcs-oauth2-boto-plugin-3.0.tar.gz", - "path": "/home/ts/.cache/pdm/http/6/c/0/6/1/6c0613427049f9a93f0119c003eae710f4283aba36e58c8b097ea42b" - }, - { - "checksum": "EFE2B28AE75B379C05E0BE4E9D56B4711A784DF6E30BAE11B4141C3EB27C52B7", - "link": "https://files.pythonhosted.org/packages/e9/93/0c0f002031f18b53af7a6166103c02b9c0667be528944137cc954ec921b3/rsa-4.7.2-py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/2/e/3/6/3/2e363792b29d6c9d6d8633780d28cc8fb6b0260e3746877d76616760" - }, - { - "checksum": "AF60021AE43EE0BE01D4862F60FD55B36E120BCC3A3CEF53D1340AA8BCFDE28F", - "link": "https://files.pythonhosted.org/packages/69/e1/67ffaa3a645b86318ce30717af7145070ebccec5eef5c623ae08b86129b8/google_reauth-0.1.1-py2.py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/f/8/c/1/7/f8c170f3e19d08c3419d0ba6865bc524ddbed743396e1f4502c353aa" - }, - { - "checksum": "3B5B4508FDAEBC173B164FA25237F92B51A7CCEFFEDD8995584669F2375B9F74", - "link": "https://files.pythonhosted.org/packages/59/0f/29725a9caf4b2618f524e0f28e2bda91aca8f880123ec77426ede6ea1ea4/httplib2-0.20.4-py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/5/b/7/e/7/5b7e78180aa786e1ebc511bb9ab7c21659984dbcd630c86e643a8087" - }, - { - "checksum": "44DBA288E84486CDFB57A6BF8EFB9D42F6A764056EAFCF9E5364161BB7F7FA9E", - "link": "https://files.pythonhosted.org/packages/00/3f/ea5cfb789dddb327e6d2cf9377c36d9d8607af85530af0e7001165587ae7/pyOpenSSL-22.1.0-py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/9/3/3/7/d/9337d0625c985a24d7d99f59f2ef106b11b6984c77c610b1c6445942" - }, - { - "checksum": "CAF636F81360243DC07867C9D09224FCB3250A6C7D625B10A2811191A0AC1DD4", - "link": "https://files.pythonhosted.org/packages/6e/e6/bedc75b264cbcbf6e6d0e5071d96d739f540fc09be31744a7a8824c02a8e/retry_decorator-1.1.1.tar.gz", - "path": "/home/ts/.cache/pdm/http/e/3/e/a/b/e3eab0a07f336d2c9bbcb29a4021028bfc04cd039034d20b7838797f" - }, - { - "checksum": "33894AA40F35CC24BD9CA69F7B0CDE4E0B63F5F85CE6E62D45E8A052BBF93155", - "link": "https://files.pythonhosted.org/packages/1f/d3/020efb312a7d25fa00e144497a33378d415552e5581be080a99017af6d39/GitPython-3.1.29-py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/d/9/3/1/2/d93123b027d5bc4157320df7afdf324e88babdfab8bdf242f2ef676b" - }, - { - "checksum": "DCC156AEE0948911394B117D3B8EBC8C5902D52296BB88626C6A875B3B23B725", - "link": "https://files.pythonhosted.org/packages/5e/cb/cb0311f2ec371c83d6510847476c665edc9cc97564a51923557bc8f0b680/google_apitools-0.5.32-py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/f/c/1/6/b/fc16bfe24812e331fb237e42ea35642dc28a462233893f7e4a0fef2c" - }, - { - "checksum": "41C9FD7B7995F7F738D6C7323D74E32F1AC16502416210CC48B424A155E4BFA5", - "link": "https://files.pythonhosted.org/packages/98/dc/ab7e2156ec6a33c66d85986178abc7944f40804d7558cd544ccb114af6a9/google_auth-2.13.0-py2.py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/5/1/2/4/e/5124e2e48e43161bd446ca2008971a729f3dfebbe058e2fc7714551d" - }, - { - "checksum": "737597EDC2917D1148D5E8FD598DB2A1C896296DAD5C028FDD42F5F9277214D9", - "link": "https://files.pythonhosted.org/packages/15/f8/d7c51107c55dda09d3a90a7750bfa4e670df076a9baec780d1da0db54373/grpcio-1.50.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "path": "/home/ts/.cache/pdm/http/3/e/6/b/f/3e6bfb3e46134ac83a290629fd04206bd49a46f32171195d5928b721" - }, - { - "checksum": "C5670885CA3631E9EC575BA50EDCD50F40367C55F2D9B380D5140BE20873F9F5", - "link": "https://files.pythonhosted.org/packages/87/86/3f5467531428b6ce6f3c12d3121b4304d2ea1536a50775a4df036add37b8/gym-0.23.1.tar.gz", - "path": "/home/ts/.cache/pdm/http/f/8/a/d/7/f8ad7e62c09bf668b0c3dfdbbe0af1607c9b850cc382d7059a871074" - }, - { - "checksum": "A07D04A14A5C0329F629450045C4588D73A8AC200D0D0A189E8899CA4472E0B3", - "link": "https://files.pythonhosted.org/packages/ba/a3/6888bb6d57678a6acf754dfed589cb0dbe85086bce607dd580ab4b50cad9/pygame-2.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "path": "/home/ts/.cache/pdm/http/e/f/f/e/6/effe6be0f5853241f8fbeadb9591745746fe7f4b1583786eddfc7c58" - }, - { - "checksum": "C5670885CA3631E9EC575BA50EDCD50F40367C55F2D9B380D5140BE20873F9F5", - "link": "https://files.pythonhosted.org/packages/87/86/3f5467531428b6ce6f3c12d3121b4304d2ea1536a50775a4df036add37b8/gym-0.23.1.tar.gz", - "path": "/home/ts/.cache/pdm/http/f/8/a/d/7/f8ad7e62c09bf668b0c3dfdbbe0af1607c9b850cc382d7059a871074" - }, - { - "checksum": "885D6FEF9BE937E0F6757EEBE23D01C63EB4C653CE5433013947E201DFFA874A", - "link": "https://files.pythonhosted.org/packages/b5/64/ef29a63cf08f047bb7fb22ab0f1f774b87eed0bb46d067a5a524798a4af8/importlib_metadata-5.0.0-py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/a/3/c/5/8/a3c58cfd1110ccdbae351f2a5f035b1e29e1267e20a134b4c7badefa" - }, - { - "checksum": "0B531325BF2D7B23FEED55EE693D9AD29505877F35C31E71A3C233A01B961568", - "link": "https://files.pythonhosted.org/packages/56/df/2f6016171ebce9875e7de0292a2131bea86e0340607a313a04b332d35c8e/numpy-1.23.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "path": "/home/ts/.cache/pdm/http/c/5/c/0/1/c5c013a411d220ef6639170a189fd9735e3833b8a99702ed61d2bae9" - }, - { - "checksum": "835E24F945CD02AA32FF0A4E55F292048A8CB357BCF1BE4EEFA78F285FE33C07", - "link": "https://files.pythonhosted.org/packages/bc/c3/f068337a370801f372f2f8f6bad74a5c140f6fda3d9de154052708dd3c65/Jinja2-3.1.2-py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/0/5/c/5/1/05c5175540a79929333624d5f5af8e38d9f10cd290d98fc53321668b" - }, - { - "checksum": "9CAAF4DE1576E03AC30A8164FAEE0E0434F2AB877FC9EF20DD76AF1038EB5AB1", - "link": "https://files.pythonhosted.org/packages/86/be/ad281f7a3686b38dd8a307fa33210cdf2130404dfef668a37a4166d737ca/Markdown-3.4.1-py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/9/3/e/9/9/93e99dbbbb9d66f95e8eb36149fb7ae4820cf3b3dd6fc8e0beb27b41" - }, - { - "checksum": "97AEC9E237D4F9EDA769019EC258D6C66203821464143D98B02C61810F60068D", - "link": "https://files.pythonhosted.org/packages/de/d9/20870f611989b8dcfd2395eddefdd4b1983d6c36513cce7fbbe9eb345768/mdit_py_plugins-0.3.1-py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/0/2/2/3/e/0223e36632db842a1fb2320b1a5096d181d0c0dadbd491f52d258ddf" - }, - { - "checksum": "136DD9E6A279A3C0941057EC986B05293C1BDAC4BABE833855C25951215B332A", - "link": "https://files.pythonhosted.org/packages/9a/67/7e8406a29b6c45be7af7740456f7f37025f0506ae2e05fb9009a53946860/monotonic-1.6-py2.py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/1/a/6/d/7/1a6d74fbbf12dc165f66de93af05f20b8f48ad34936c01c6f2403a96" - }, - { - "checksum": "A965C803BDB0F42C73732838FEF09B103E92F83BEE45B9477BD4C1E1BF38867E", - "link": "https://files.pythonhosted.org/packages/5c/eb/975c7c080f3223a5cdaff09612f3a5221e4ba534f7039db34c35d95fa6a5/mypy_extensions-0.4.3-py2.py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/c/c/1/2/4/cc124d091a9f7029e6050acb10ec88d47d6bd7bbaeb947e98c5ba7e6" - }, - { - "checksum": "28A3A08969C4CEF839D90D1CDFB95A1FA097834AF3BC9E2AC62967AB8AAE87A2", - "link": "https://files.pythonhosted.org/packages/63/82/2179fdc39bc1bb43296f638ae1dfe2581ec2617b4e87c28b0d23d44b997f/pathspec-0.10.1-py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/4/9/d/d/1/49dd16d115265e5bc36eda651b3109478e00152a83132f4c5722e574" - }, - { - "checksum": "95534CC294FA8DAA9EA253488563D3543796E0224CC385BCB91588443824283D", - "link": "https://files.pythonhosted.org/packages/ed/22/967181c94c3a4063fe64e15331b4cb366bdd7dfbf46fcb8ad89650026fec/platformdirs-2.5.2-py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/9/7/a/2/9/97a29306d42c71fd63f3813805610c0458f4d6e611e3e84d7fa1d801" - }, - { - "checksum": "5399CBD176BCDB94F708435D3AFCDB9EEEB43397BA928F4FED60706A0A62D404", - "link": "https://files.pythonhosted.org/packages/f6/f0/10642828a8dfb741e5f3fbaac830550a518a775c7fff6f04a007259b0548/py-1.11.0-py2.py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/7/b/1/9/0/7b190e5eaec57a227a216cb9d3086ae5e31258699bccb82572891e4a" - }, - { - "checksum": "DD8A474C0D03B8FDE0DA653CA84204D46C5C58512CDAB150146B8A86DEFDB31B", - "link": "https://files.pythonhosted.org/packages/4f/82/672cd382e5b39ab1cd422a672382f08a1fb3d08d9e0c0f3707f33a52063b/Pygments-2.13.0-py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/8/3/0/8/7/83087ee84a96520ad4581cf19866c467b99f3b91baa73f357a760e29" - }, - { - "checksum": "3BC9DB3FA656613C03313F653F803F6EDC3798BDF190EE02E68A4933854A617E", - "link": "https://files.pythonhosted.org/packages/d7/42/7ad4b6d67a16229496d4f6e74201bdbebcf4bc1e87d5a70c9297d4961bd2/PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", - "path": "/home/ts/.cache/pdm/http/5/d/e/7/d/5de7dece5fae93f94c655bfefba73904dbed635e3ec129d9345fb87e" - }, - { - "checksum": "D3BD3D4143F778DDE7269E6C5C1BC5BE980A7A76535D3C782712E247B839234F", - "link": "https://files.pythonhosted.org/packages/ed/dc/c02e01294f7265e63a7315fe086dd1df7dacb9f840a804da846b96d01b96/snowballstemmer-2.2.0-py2.py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/9/a/c/c/c/9accc01db704343eb4a64e4c404a68dcccef24a7390d1a161d53b00d" - }, - { - "checksum": "6C726A70F737999A1471B997DA0D6D52698D69B75D0012B9EDA71F119D9DAA0F", - "link": "https://files.pythonhosted.org/packages/63/40/c854ef09500e25f6432dcbad0f37df87fd7046d376272292d8654cc71c95/sphinxcontrib_htmlhelp-2.0.0-py2.py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/0/0/9/0/e/0090e050a088ab83badc29b723a8890f871fb80081b1ba0bee16b009" - }, - { - "checksum": "167882E6237B830FB938D67B01712EFD157F3AD6BE1E939210A4E78D9A830325", - "link": "https://files.pythonhosted.org/packages/c6/77/5464ec50dd0f1c1037e3c93249b040c8fc8078fdda97530eeb02424b6eea/sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/2/a/b/2/d/2ab2ddaa1849f11e92ae373973654f63c6bf05d04199004b6fdd869d" - }, - { - "checksum": "F9607ADABE23AAC65E837503FB11984FE74BE90A243F23A93D60D3FE0E3AD755", - "link": "https://files.pythonhosted.org/packages/1e/ec/147ee629ff89cef1184293682a9a97ffeeef87daa180ce788b8980bbe8fd/stevedore-4.1.0-py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/b/d/3/b/4/bd3b436bb05b405201129e745080a043330a2fc5d49a0c9e93925d75" - }, - { - "checksum": "BF5E549B107266E95A8F10B18D485DD308E5CE87DFF90951713C04AE2B116319", - "link": "https://files.pythonhosted.org/packages/e5/37/10e8a53f196cf0bcb93008daed42e2c47c7876430a7efd044ff4d647f30a/pbr-5.11.0-py2.py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/3/a/c/1/3/3ac13485f130e60c122e0cf1eff48d496a3b752760f0bd3dc399fdc3" - }, - { - "checksum": "827758C3AD88FC17451952212927D3749B43D0540DE5D823D6D30BA8661174CA", - "link": "https://files.pythonhosted.org/packages/e0/68/e8ecfac5dd594b676c23a7f07ea34c197d7d69b3313afdf8ac1b0a9905a2/tensorboard_plugin_wit-1.8.1-py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/e/3/5/c/d/e35cd74dcf8b813301097cb5bda0326e869f42490e2b5c95e7bab7d7" - }, - { - "checksum": "BDBB766B2CF16D1B8D0CC97FAD5F47A59BCF649371E94E6A3DA916BACBCD7269", - "link": "https://files.pythonhosted.org/packages/97/75/10a9ebee3fd790d20926a90a2547f0bf78f371b2f13aa822c759680ca7b9/tomli-2.0.1-py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/6/4/9/8/a/6498a97ba33d5bdd385aa8f5ea5d4d15aa22b0d23b6bd2e36e941896" - }, - { - "checksum": "72A42B5572A81F7998262C45D544F4D10E26A549BD7D37E9E3C76ADEBC264CB0", - "link": "https://files.pythonhosted.org/packages/0b/8e/f1a0a5a76cfef77e1eb6004cb49e5f8d72634da638420b9ea492ce8305e8/typing_extensions-4.4.0-py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/b/1/f/2/3/b1f23cf704b79451e9a6783dd4724fdea64ad62ade55a29d17d17f3b" - }, - { - "checksum": "4990B56C548DEDD30C9C8B1191B902C094A4295DA685CC8D103502AAACA03461", - "link": "https://files.pythonhosted.org/packages/c8/27/be6ddbcf60115305205de79c29004a0c6bc53cec814f733467b1bb89386d/Werkzeug-2.2.2-py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/f/e/b/4/a/feb4aa06895efd58677b51777a51011e26e29579e7ebcc383c1dea3e" - }, - { - "checksum": "633685BC5127E30B1F744011CEB22FF40BA615C09242555521BA2E3C4FDE0BF4", - "link": "https://files.pythonhosted.org/packages/27/d6/003e593296a85fd6ed616ed962795b2f87709c3eee2bca4f6d0fe55c6d00/wheel-0.37.1-py2.py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/e/9/0/9/8/e909845026a6059abd99600e070e720b0e8069818f409a5176263a17" - }, - { - "checksum": "4B25002DB6F8A95158B31A0BA0FA139FB3FD61C3AE17C114EF5440BD9273C02E", - "link": "https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/d/5/a/b/7/d5ab7b472d3d9dd618be7183cdbae0b98ade73b54e34d0704cff7e54" - }, - { - "checksum": "EAC5A462CEDF88B60F2B72772A9C6907B442A0DEFA1BB4092E80B880992EA4DB", - "link": "https://files.pythonhosted.org/packages/9b/dd/b3c12c6d707058fa947864b67f0c4e0c39ef8610988d7baea9578f3c48f3/iniconfig-1.1.1-py2.py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/5/3/6/4/6/53646c06930b6aadbd649b2cd6aeaa9621d4658d3407c5975edc532c" - }, - { - "checksum": "F6CF60D36548516DD179355E3BC8599513293ABD88C2E787B5952A165D1DCDC0", - "link": "https://files.pythonhosted.org/packages/05/8e/8de486cbd03baba4deef4142bd643a3e7bbe954a784dc1bb17142572d127/packaging-21.3-py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/2/e/8/a/f/2e8af9fab412753e2c1530130af0cd7cc78f774c33af473939472e3c" - }, - { - "checksum": "DE7FD7AC600765349D9288DA519916AC1E8204CB41EDB1E3CC7F79A80A80687E", - "link": "https://files.pythonhosted.org/packages/dc/47/86022665a9433d89a66f5911b558ddff69861766807ba685de2e324bd6ed/sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/f/6/8/c/4/f68c47cfada89f7eefa1e5aaa02defc33b653f0e87da398bab39dacd" - }, - { - "checksum": "4CDC8343EA308F0C7000F3F8EFA9C729848050AF106B12395B629EA4824AB07E", - "link": "https://files.pythonhosted.org/packages/c5/09/5de5ed43a521387f18bdf5f5af31d099605c992fd25372b2b9b825ce48ee/sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/2/a/b/8/c/2ab8c404a847ace969db494e32167fca222b5e86818ee04d605702a0" - }, - { - "checksum": "B0E38EAE5502B31EDCDC35D94A4A434AD7ED72BE81FE9570D4DEC72E57EC2788", - "link": "https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/b/8/f/7/8/b8f788dcf236ceec5fc14676febe2934be2e199e2ced6a96d12dc301" - }, - { - "checksum": "CEC8B52EA32AA3A15DF1A418BBC47D2DFF1B44EEAAAA6FBC08A762DC18703DF3", - "link": "https://files.pythonhosted.org/packages/2b/14/05f9206cf4e9cfca1afb5fd224c7cd434dcc3a433d6d9e4e0264d29c6cdb/sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/2/4/8/9/7/248970186e1e283b13f96e132cafaa148980c1b8a02c660fabe87fb1" - }, - { - "checksum": "404D70D8C047A832BE0E29EE9AF78B1B4E4AB542C9808DF057A47D40F20303F5", - "link": "https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/d/2/2/5/5/d2255f00783b7286163a5eaa1883e6b713954c895a2b209c4908fc09" - }, - { - "checksum": "B62F97616FAB83D53F76033F903D71EABF7C9E6B2388CA691001CF3A1D449CFF", - "link": "https://files.pythonhosted.org/packages/6c/10/a7d0fa5baea8fe7b50f448ab742f26f52b80bfca85ac2be9d35cdd9a3246/pyparsing-3.0.9-py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/2/6/5/9/b/2659b2168ae7c94a30c19ebcff1c5e6d7949653ba6766bc4299576f3" - }, - { - "checksum": "EE757033C05216A63F0AAA8DA7E81CE8AD338E7DE47C57256FB8BEDBA108A72E", - "link": "https://files.pythonhosted.org/packages/af/d6/248ad502c6049011e7851e1474dd0a58175895388bed15f7f67dcb9187d9/aiohttp-3.8.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "path": "/home/ts/.cache/pdm/http/2/5/8/1/e/2581ef568afd062c5a1e929c0fab8425997179486f289baf7cfdef26" - }, - { - "checksum": "20E0B2B7C40626BE2C75212630120E4A32A4882C84B69C720DC55EB08CDE38D5", - "link": "https://files.pythonhosted.org/packages/db/51/a507c856293ab05cdc1db77ff4bc1268ddd39f29e7dc4919aa497f0adbec/charset_normalizer-2.1.1-py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/7/b/c/b/2/7bcb21ae39dcbaa6ef2ec164e30fe8d58ad45d81fc957ba55edaacd9" - }, - { - "checksum": "6A681CAAD1D61BFCD52204850275DEE712BCE7D4ACFB4D83BEF3134BCC00060C", - "link": "https://files.pythonhosted.org/packages/68/aa/5fc646cae6e997c3adf3b0a7e257cda75cff21fcba15354dffd67789b7bb/cachetools-5.2.0-py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/3/6/1/3/f/3613fe1740ab47073df987615e4ed0f8ba73fe63bc9e319e23195d9e" - }, - { - "checksum": "B2C4781435A1136CBEA6310F83B3A00629A88E4FCD29F84D42544E2F481CF49B", - "link": "https://files.pythonhosted.org/packages/d2/42/2b5be637a08a0d83057bbce4c2cd904271a6b2fb46b6cd4abcb6f2df222c/cryptography-38.0.1-cp36-abi3-manylinux_2_28_x86_64.whl", - "path": "/home/ts/.cache/pdm/http/1/1/2/1/1/112115fd47c409ab52820aac7ce27cfbb2d49bc3d2ce364b2fbf348a" - }, - { - "checksum": "1E2B4AAC7BEA4F4D179A305FE2107C64C62F1291390A33EBF0B9F142D3E79EFA", - "link": "https://files.pythonhosted.org/packages/a3/7c/5d747655049bfbf75b5fcec57c8115896cb78d6fafa84f6d3ef4c0f13a98/gitdb-4.0.9-py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/3/3/c/1/6/33c16ef2fd985b923cbaa1211322682268a3d4bb1bd225eba9190b45" - }, - { - "checksum": "143C247370AB58ED7A68109EA37445AB4A363D06FAE13FEA591D3979AC0F89F9", - "link": "https://files.pythonhosted.org/packages/fc/34/3030de6f1370931b9dbb4dad48f6ab1015ab1d32447850b9fc94e60097be/idna-3.4-py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/2/a/9/d/4/2a9d41394769b7808a8f1d6d81b1ec01457bf0144bc0ff446d2cf3f3" - }, - { - "checksum": "5166D01496234D3E6850680BCAD99C77633FE6CE11346CC9E7638CC50D137811", - "link": "https://files.pythonhosted.org/packages/fd/f4/524d2e8f5a3727cf309c2b7df7c732038375322df1376c9e9ef3aa92fcaf/MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "path": "/home/ts/.cache/pdm/http/a/9/7/3/4/a973418e2ee67d8459d86f121e0723cb38f185f17fa80aff657c9d25" - }, - { - "checksum": "693910B81078509197B49A657369ADD76F68D7092BB20209166443902A787E3F", - "link": "https://files.pythonhosted.org/packages/95/a9/4f25a14d23f0786b64875b91784607c2277eff25d48f915e39ff0cff505a/oauth2client-4.1.3-py2.py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/6/9/c/8/7/69c87977c90a9d9e120f0f9b17badc23e88dcb0f446acf7d60075c47" - }, - { - "checksum": "AF98021DC16DE5A487DCE7CACEBA53BBBBFA010BA6EBB4BC1407E15BB192711E", - "link": "https://files.pythonhosted.org/packages/95/de/214830a981892a3e286c3794f41ae67a4495df1108c3da8a9f62159b9a9d/pyasn1_modules-0.2.8-py2.py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/9/3/5/f/0/935f0d2e534766430ea25ff8c2b29c7c1722a9a7f9fb53b07742711c" - }, - { - "checksum": "6DD9F68DE6342FED08A4A5ED1BDE3968A51698A1AD768ACF7360ECC5C47A73A9", - "link": "https://files.pythonhosted.org/packages/6f/de/5be2e3eed8426f871b170663333a0f627fc2924cc386cd41be065e7ea870/urllib3-1.26.12-py2.py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/3/f/a/1/3/3fa13dd8303c58dfcc7d01540885227a2d0b33b71f7251b489afc7a9" - }, - { - "checksum": "124B81A9651523CB23B77B291E713CADAF94D95FA4906BADFBD62E099A5E63AC", - "link": "https://files.pythonhosted.org/packages/d4/d8/9ee7bc0e8682328bf91bca45991ff189a15bf24540cb341b53e3af9c0628/ale_py-0.7.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "path": "/home/ts/.cache/pdm/http/c/d/f/7/7/cdf7718c42c44c3761aae07fa86241bc03fb586cf78b5bd73eaa81d3" - }, - { - "checksum": "44F6590DA64BEF3A534A70BB458CCF2CE957F177FEE30154529019C68C2E44A9", - "link": "https://files.pythonhosted.org/packages/23/10/c0b78c27298029e4454a472a1919bde20cb182dab1662cec7f2ca1dcc523/boto-2.49.0-py2.py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/8/f/f/e/2/8ffe28f7b3c3b3cc9ab4be0fbfc1785b0b3e66f9c850ed6ee25a49c6" - }, - { - "checksum": "B518594B55AD83A4DF92AB201ABF483AF0E25EC62A816964BA05D531B64B8390", - "link": "https://files.pythonhosted.org/packages/1d/38/fa96a426e0c0e68aabc68e896584b83ad1eec779265a028e156ce509630e/certifi-2022.9.24-py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/3/0/7/e/7/307e72e5234e5506130a63623f1cef663a9d469fb9cef46cff6e9f53" - }, - { - "checksum": "5533EC5B16957E6994A176BBD73350D923F3368E2145DFEBCAE210F35C6CD400", - "link": "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/b/e/d/4/e/bed4e7c2b407105e5c80f6f3c9c9ce06074cd1bc90409700e4489759" - }, - { - "checksum": "9124F51102B5ED5159D246A9760146291B17914901EE817F8CD1A51E1A859F3C", - "link": "https://files.pythonhosted.org/packages/b5/d7/91fd8911d22e7fac794803095dd192bf1ebd70c7603272085230d915e738/pytz-2022.5-py2.py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/e/7/5/1/2/e7512c612f5888bdf8bd76655c93824c120ab23da0e1ab2f76958b07" - }, - { - "checksum": "3ACA7B3D8A95F47A1A31D6E27681072E34A17970FDBD4B21EDAD7FC6BB17BA8F", - "link": "https://files.pythonhosted.org/packages/6f/bb/5deac77a9af870143c684ab46a7934038a53eb4aa975bc0687ed6ca2c610/requests_oauthlib-1.3.1-py2.py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/0/d/9/7/7/0d977317bcfea4cc21a4d6dc7ac665ec6ff4b7d39d5b5bcf31569995" - }, - { - "checksum": "6207392045F0A854D73174FE99FF93D46CA3465BB5FF35B33B87FCADFE6F2512", - "link": "https://files.pythonhosted.org/packages/40/8a/d63273ed0fa4a3d06f77e7b043f6577d8894e95515b0c187c52e2c0efabb/zipp-3.10.0-py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/0/3/7/d/6/037d62723900b36d2830bf32bf50260478b444d96152244a975d9a10" - }, - { - "checksum": "60E7BBD93AD5453E6655E43512919954D4EE08395046B8D1AC23477DE58E29AF", - "link": "https://files.pythonhosted.org/packages/29/b5/c1209e6cb77647bc2c9a6a1a953355720f34f3b006b725e303c70f3c0786/pyu2f-0.1.5.tar.gz", - "path": "/home/ts/.cache/pdm/http/f/9/6/8/d/f968d99414c85de988151abff4a4031f2cda684e971ec8360eb79632" - }, - { - "checksum": "5198EA194079670799164A83762C5415E54B14777FB46F98FDB4F6501FCB55D9", - "link": "https://files.pythonhosted.org/packages/62/1e/a94a8d635fa3ce4cfc7f506003548d0a2447ae76fd5ca53932970fe3053f/pyasn1-0.4.8-py2.py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/0/8/e/5/4/08e54b1ba309af11fa80393efe6859b7b3f074a70e8321df6c65e48e" - }, - { - "checksum": "62DBEFBF71FEF036DF1E30DFD12EE0E0BD05BC9BB11297F04CC067EE3F981DC0", - "link": "https://files.pythonhosted.org/packages/d6/c1/8991e7c5385b897b8c020cdaad718c5b087a6626d1d11a23e1ea87e325a7/async_timeout-4.0.2-py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/e/7/5/5/d/e755dc72b7dd5fe8e75225d67b2dacdd5cb3fea2efb68de15dd0df1d" - }, - { - "checksum": "4CC997416EE52D37F428DF4C0B091AC2C9D20E5AB23216AA3E4CA4E7EA348ECB", - "link": "https://files.pythonhosted.org/packages/8f/39/a7e04961b4c00d68aba337e3fdef9fd4f666dcd98f41725067a1de5d3399/multidict-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "path": "/home/ts/.cache/pdm/http/a/d/0/3/5/ad03517e9d9d8c46ab074935da623ab71a672605e167418da0e71ddb" - }, - { - "checksum": "0078C98F1A64CB54200636C43BEA80437FCC4E30693315894C2AE7CE382D50D2", - "link": "https://files.pythonhosted.org/packages/6d/01/7caa71608bc29952ae09b0be63a539e50d2484bc37747797a66a60679856/smmap-5.0.0-py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/9/8/c/7/2/98c7208b4386f316894fdd67235ee90a6556a155028467a48354cbcd" - }, - { - "checksum": "558A0FC56A94AF78FB8BE20F47FC85549CF2DBA4C2476FF15726A6FA97931F82", - "link": "https://files.pythonhosted.org/packages/dd/cf/5e7d506b9b5add77548252d6938380e08caf59ba808ac3cf0f0635629d1a/yarl-1.8.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "path": "/home/ts/.cache/pdm/http/b/f/4/0/7/bf407531940b41e2846999bfed22fb35d3f8d0fa25284ae28be5850b" - }, - { - "checksum": "3B2CCF5171EF3A6D3D0D63FF3C5C84136706338D09965BCB9BB1B2142604FFAE", - "link": "https://files.pythonhosted.org/packages/3b/87/fe94898f2d44a93a35d5aa74671ed28094d80753a1113d68b799fab6dc22/aiosignal-1.2.0-py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/3/a/1/c/7/3a1c7e5b34dd8a6bdceee04a81c455dcf546aebfcb73c7a0c36e2356" - }, - { - "checksum": "80A0E4C8840A1846FE1A2C4D5EC7F4EB7A9B83F3AE9C938C117E515AC29BE51F", - "link": "https://files.pythonhosted.org/packages/29/ec/5715f872eac10ba488a389f0f2680dafa94f115b823b3ed1cdea31026297/frozenlist-1.3.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "path": "/home/ts/.cache/pdm/http/6/d/d/4/c/6dd4c117bfe542545ba22ab3f2f57c50e64549c2a8514ccc5abcdee6" - }, - { - "checksum": "7F56B25D06A0DAA8BAC5228D1F450E3F6CDD6AEC1C24EC10076F4792D005CC05", - "link": "https://files.pythonhosted.org/packages/b7/8b/06f30caa03b5b3ac006de4f93478dbd0239e2a16566d81a106c322dc4f79/cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "path": "/home/ts/.cache/pdm/http/2/6/a/8/a/26a8aaa8bbe426a727b86866f093f819a4f368db4b59f8a4bbc67929" - }, - { - "checksum": "1D6BD5B175105EB69A90091F99C7F4FD6011B749F5BF31CCF951F40A617D0027", - "link": "https://files.pythonhosted.org/packages/cf/26/cd6c4177273ee35f7a31245893489c68bc340988f12ca315b392f1f18a93/cloudpickle-2.2.0-py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/3/0/7/c/4/307c4286aac2f4cc0b8b7cb83c46c96172fe049d796c43c115803980" - }, - { - "checksum": "CAEDBF7885C2BA17032345BDF696DF8B3ED7790D5B5B6E8B777ADA8ACB3C67B2", - "link": "https://files.pythonhosted.org/packages/25/26/d786c6bec30fe6110fd3d22c9a273a2a0e56c0b73b93e25ea1af5a53243b/gym_notices-0.0.8-py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/5/e/6/1/6/5e61604d174460f240702163a4cd332e28f22ecb0f6a303ca89e62aa" - }, - { - "checksum": "9033842F1494A514F726FFCFAE4C6578C36A82CC5E7846BA4F0E59F283F0F527", - "link": "https://files.pythonhosted.org/packages/7e/80/cab10959dc1faead58dc8384a781dfbf93cb4d33d50988f7a69f1b7c9bbe/oauthlib-3.2.2-py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/5/5/b/4/1/55b4162a49c3e2db653e3012107709c652597c7f433d539732e71850" - }, - { - "checksum": "A9AAEC3ADE7B319FA281B4A41A149A1BB3E257AC27F4FE0436DED890255232F0", - "link": "https://files.pythonhosted.org/packages/c8/47/6bfe2147eae436391916b3741a2cd9a76763e9671703a0d1d8e83142816e/importlib_resources-5.10.0-py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/f/5/7/0/a/f570a9156e2178ed9fbcbc0b6eb1de95aa0d4e59c8a0a64a9b78f740" - }, - { - "checksum": "396E44F3E4DDFE4F330386DD37B015A5430D66DCBC9A498D7C0CBA2E049500DE", - "link": "https://files.pythonhosted.org/packages/62/d5/5f610ebe421e85889f2e55e33b7f9a6795bd982198517d912eb1c76e1a53/pycparser-2.21-py2.py3-none-any.whl", - "path": "/home/ts/.cache/pdm/http/7/5/8/e/0/758e07d7bdfb8212737d84f4f36245f9f40d44fd1c9ad0df0cf25708" - } - ] -} diff --git a/pants-plugins/BUILD b/pants-plugins/BUILD new file mode 100644 index 00000000..db46e8d6 --- /dev/null +++ b/pants-plugins/BUILD @@ -0,0 +1 @@ +python_sources() diff --git a/pants-plugins/macros.py b/pants-plugins/macros.py new file mode 100644 index 00000000..9bf8e02a --- /dev/null +++ b/pants-plugins/macros.py @@ -0,0 +1,12 @@ +def is_standalone(): + return True + + +def emote_dependency_path(suffix: str) -> str: + if suffix.startswith("/"): + return f"/{suffix}" + return f"//{suffix}" + + +def emote_root_dir() -> str: + return "." diff --git a/pants.ci.toml b/pants.ci.toml new file mode 100644 index 00000000..74195ecf --- /dev/null +++ b/pants.ci.toml @@ -0,0 +1,40 @@ +[GLOBAL] +colors = true +print_stacktrace = true +plugins.add = [ + "hdrhistogram", +] + +backend_packages.add = [ + "pants.backend.python.providers.experimental.pyenv", + "pants.backend.experimental.python", +] + +[stats] +log = true + +[test] +use_coverage = true + +[coverage-py] +report = ["json"] +global_report = true + +[pytest] +args = ["-vv", "--no-header", "--benchmark-disable"] + +[python] +default_resolve = "cpu" + +[pyenv-python-provider] +installation_extra_env_vars = [ + "PYTHON_CONFIGURE_OPTS=--with-lto=thin", + "PYTHON_CFLAGS=-march=native -mtune=native", +] + +[python-repos] +indexes = [ + "https://pypi.org/simple/", + "https://tgolsson.github.io/torch-index/cpu/", + "https://tgolsson.github.io/torch-index/cu116/", +] diff --git a/pants.toml b/pants.toml new file mode 100644 index 00000000..06463ec6 --- /dev/null +++ b/pants.toml @@ -0,0 +1,90 @@ +[GLOBAL] +pants_version = "2.21.0" + +plugins = [ + "pants_backend_mdbook==0.4.1", +] +backend_packages = [ + "pants.backend.python", + + "pants.backend.python.lint.black", + "pants.backend.python.lint.isort", + "pants.backend.python.lint.flake8", + "pants.backend.python.lint.docformatter", + "pants.backend.python.lint.bandit", + + "pants.backend.shell", + "pants.backend.shell.lint.shellcheck", + "pants.backend.shell.lint.shfmt", + + "pants.backend.tools.taplo", + "pants.backend.experimental.adhoc", + "pants.backend.experimental.python", + + "pants_backend_mdbook", +] + +build_file_prelude_globs = ["pants-plugins/macros.py"] + +[cli.alias] +precommit = "fmt lint tailor test" +--all-changed = "--changed-since=origin/main --changed-dependees=transitive" + +[source] +root_patterns = ["/", "/docs/"] + +[python-bootstrap] +search_path.add = [""] + +[python] +interpreter_constraints = [">=3.10,<3.11"] +pip_version = "23.0.1" +enable_resolves = true +default_resolve = "base" + +[python.resolves] +base = "locks/base.lock" +cpu = "locks/cpu.lock" +gpu = "locks/gpu.lock" + +apibook = "locks/tools/apibook.lock" +pytest = "locks/tools/pytest.lock" +isort = "locks/tools/isort.lock" +ipython = "locks/tools/ipython.lock" +black = "locks/tools/black.lock" +docformatter = "locks/tools/docformatter.lock" +bandit = "locks/tools/bandit.lock" + +[python-repos] +indexes = [ + "https://pypi.org/simple/", + "https://tgolsson.github.io/torch-index/cpu/", + "https://tgolsson.github.io/torch-index/cu116/", +] + +[repl] +shell = "ipython" + +[black] +install_from_resolve = "black" +interpreter_constraints = ["==3.10.*"] + +[ipython] +install_from_resolve = "ipython" + +[isort] +install_from_resolve = "isort" +args = ['--resolve-all-configs'] +interpreter_constraints = ["==3.10.*"] + +[pytest] +args = ["--no-header"] +execution_slot_var = "TEST_EXECUTION_SLOT" +install_from_resolve = "pytest" + +[docformatter] +install_from_resolve = "docformatter" +interpreter_constraints = ["==3.10.*"] + +[bandit] +args = ["-r", "-ll", "--quiet"] diff --git a/pdm.lock b/pdm.lock deleted file mode 100644 index cc8bf9cc..00000000 --- a/pdm.lock +++ /dev/null @@ -1,1779 +0,0 @@ -# This file is @generated by PDM. -# It is not intended for manual editing. - -[metadata] -groups = ["default", "atari", "ci", "docs", "tools", "torch", "wandb"] -strategy = ["cross_platform"] -lock_version = "4.4" -content_hash = "sha256:ccf14072947761c5b620a20b89e0c260ac3823f0904b37a23f6e596f628306ed" - -[[package]] -name = "absl-py" -version = "2.0.0" -requires_python = ">=3.7" -summary = "Abseil Python Common Libraries, see https://github.com/abseil/abseil-py." -files = [ - {file = "absl-py-2.0.0.tar.gz", hash = "sha256:d9690211c5fcfefcdd1a45470ac2b5c5acd45241c3af71eed96bc5441746c0d5"}, - {file = "absl_py-2.0.0-py3-none-any.whl", hash = "sha256:9a28abb62774ae4e8edbe2dd4c49ffcd45a6a848952a5eccc6a49f3f0fc1e2f3"}, -] - -[[package]] -name = "aiohttp" -version = "3.9.0" -requires_python = ">=3.8" -summary = "Async http client/server framework (asyncio)" -dependencies = [ - "aiosignal>=1.1.2", - "async-timeout<5.0,>=4.0; python_version < \"3.11\"", - "attrs>=17.3.0", - "frozenlist>=1.1.1", - "multidict<7.0,>=4.5", - "yarl<2.0,>=1.0", -] -files = [ - {file = "aiohttp-3.9.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6896b8416be9ada4d22cd359d7cb98955576ce863eadad5596b7cdfbf3e17c6c"}, - {file = "aiohttp-3.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1736d87dad8ef46a8ec9cddd349fa9f7bd3a064c47dd6469c0d6763d3d49a4fc"}, - {file = "aiohttp-3.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8c9e5f4d7208cda1a2bb600e29069eecf857e6980d0ccc922ccf9d1372c16f4b"}, - {file = "aiohttp-3.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8488519aa05e636c5997719fe543c8daf19f538f4fa044f3ce94bee608817cff"}, - {file = "aiohttp-3.9.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ab16c254e2312efeb799bc3c06897f65a133b38b69682bf75d1f1ee1a9c43a9"}, - {file = "aiohttp-3.9.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7a94bde005a8f926d0fa38b88092a03dea4b4875a61fbcd9ac6f4351df1b57cd"}, - {file = "aiohttp-3.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b777c9286b6c6a94f50ddb3a6e730deec327e9e2256cb08b5530db0f7d40fd8"}, - {file = "aiohttp-3.9.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:571760ad7736b34d05597a1fd38cbc7d47f7b65deb722cb8e86fd827404d1f6b"}, - {file = "aiohttp-3.9.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:deac0a32aec29608eb25d730f4bc5a261a65b6c48ded1ed861d2a1852577c932"}, - {file = "aiohttp-3.9.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:4ee1b4152bc3190cc40ddd6a14715e3004944263ea208229ab4c297712aa3075"}, - {file = "aiohttp-3.9.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:3607375053df58ed6f23903aa10cf3112b1240e8c799d243bbad0f7be0666986"}, - {file = "aiohttp-3.9.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:65b0a70a25456d329a5e1426702dde67be0fb7a4ead718005ba2ca582d023a94"}, - {file = "aiohttp-3.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5a2eb5311a37fe105aa35f62f75a078537e1a9e4e1d78c86ec9893a3c97d7a30"}, - {file = "aiohttp-3.9.0-cp310-cp310-win32.whl", hash = "sha256:2cbc14a13fb6b42d344e4f27746a4b03a2cb0c1c3c5b932b0d6ad8881aa390e3"}, - {file = "aiohttp-3.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:ac9669990e2016d644ba8ae4758688534aabde8dbbc81f9af129c3f5f01ca9cd"}, - {file = "aiohttp-3.9.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f8e05f5163528962ce1d1806fce763ab893b1c5b7ace0a3538cd81a90622f844"}, - {file = "aiohttp-3.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4afa8f71dba3a5a2e1e1282a51cba7341ae76585345c43d8f0e624882b622218"}, - {file = "aiohttp-3.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f929f4c9b9a00f3e6cc0587abb95ab9c05681f8b14e0fe1daecfa83ea90f8318"}, - {file = "aiohttp-3.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28185e36a78d247c55e9fbea2332d16aefa14c5276a582ce7a896231c6b1c208"}, - {file = "aiohttp-3.9.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a486ddf57ab98b6d19ad36458b9f09e6022de0381674fe00228ca7b741aacb2f"}, - {file = "aiohttp-3.9.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:70e851f596c00f40a2f00a46126c95c2e04e146015af05a9da3e4867cfc55911"}, - {file = "aiohttp-3.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c5b7bf8fe4d39886adc34311a233a2e01bc10eb4e842220235ed1de57541a896"}, - {file = "aiohttp-3.9.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c67a51ea415192c2e53e4e048c78bab82d21955b4281d297f517707dc836bf3d"}, - {file = "aiohttp-3.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:694df243f394629bcae2d8ed94c589a181e8ba8604159e6e45e7b22e58291113"}, - {file = "aiohttp-3.9.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3dd8119752dd30dd7bca7d4bc2a92a59be6a003e4e5c2cf7e248b89751b8f4b7"}, - {file = "aiohttp-3.9.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:eb6dfd52063186ac97b4caa25764cdbcdb4b10d97f5c5f66b0fa95052e744eb7"}, - {file = "aiohttp-3.9.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:d97c3e286d0ac9af6223bc132dc4bad6540b37c8d6c0a15fe1e70fb34f9ec411"}, - {file = "aiohttp-3.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:816f4db40555026e4cdda604a1088577c1fb957d02f3f1292e0221353403f192"}, - {file = "aiohttp-3.9.0-cp311-cp311-win32.whl", hash = "sha256:3abf0551874fecf95f93b58f25ef4fc9a250669a2257753f38f8f592db85ddea"}, - {file = "aiohttp-3.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:e18d92c3e9e22553a73e33784fcb0ed484c9874e9a3e96c16a8d6a1e74a0217b"}, - {file = "aiohttp-3.9.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:99ae01fb13a618b9942376df77a1f50c20a281390dad3c56a6ec2942e266220d"}, - {file = "aiohttp-3.9.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:05857848da443c8c12110d99285d499b4e84d59918a21132e45c3f0804876994"}, - {file = "aiohttp-3.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:317719d7f824eba55857fe0729363af58e27c066c731bc62cd97bc9c3d9c7ea4"}, - {file = "aiohttp-3.9.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1e3b3c107ccb0e537f309f719994a55621acd2c8fdf6d5ce5152aed788fb940"}, - {file = "aiohttp-3.9.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:45820ddbb276113ead8d4907a7802adb77548087ff5465d5c554f9aa3928ae7d"}, - {file = "aiohttp-3.9.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:05a183f1978802588711aed0dea31e697d760ce9055292db9dc1604daa9a8ded"}, - {file = "aiohttp-3.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51a4cd44788ea0b5e6bb8fa704597af3a30be75503a7ed1098bc5b8ffdf6c982"}, - {file = "aiohttp-3.9.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:673343fbc0c1ac44d0d2640addc56e97a052504beacd7ade0dc5e76d3a4c16e8"}, - {file = "aiohttp-3.9.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7e8a3b79b6d186a9c99761fd4a5e8dd575a48d96021f220ac5b5fa856e5dd029"}, - {file = "aiohttp-3.9.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6777a390e41e78e7c45dab43a4a0196c55c3b8c30eebe017b152939372a83253"}, - {file = "aiohttp-3.9.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7ae5f99a32c53731c93ac3075abd3e1e5cfbe72fc3eaac4c27c9dd64ba3b19fe"}, - {file = "aiohttp-3.9.0-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:f1e4f254e9c35d8965d377e065c4a8a55d396fe87c8e7e8429bcfdeeb229bfb3"}, - {file = "aiohttp-3.9.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:11ca808f9a6b63485059f5f6e164ef7ec826483c1212a44f268b3653c91237d8"}, - {file = "aiohttp-3.9.0-cp312-cp312-win32.whl", hash = "sha256:de3cc86f4ea8b4c34a6e43a7306c40c1275e52bfa9748d869c6b7d54aa6dad80"}, - {file = "aiohttp-3.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:ca4fddf84ac7d8a7d0866664936f93318ff01ee33e32381a115b19fb5a4d1202"}, - {file = "aiohttp-3.9.0.tar.gz", hash = "sha256:09f23292d29135025e19e8ff4f0a68df078fe4ee013bca0105b2e803989de92d"}, -] - -[[package]] -name = "aiosignal" -version = "1.3.1" -requires_python = ">=3.7" -summary = "aiosignal: a list of registered asynchronous callbacks" -dependencies = [ - "frozenlist>=1.1.0", -] -files = [ - {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, - {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, -] - -[[package]] -name = "alabaster" -version = "0.7.13" -requires_python = ">=3.6" -summary = "A configurable sidebar-enabled Sphinx theme" -files = [ - {file = "alabaster-0.7.13-py3-none-any.whl", hash = "sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3"}, - {file = "alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2"}, -] - -[[package]] -name = "appdirs" -version = "1.4.4" -summary = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -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 = "argcomplete" -version = "3.1.6" -requires_python = ">=3.8" -summary = "Bash tab completion for argparse" -files = [ - {file = "argcomplete-3.1.6-py3-none-any.whl", hash = "sha256:71f4683bc9e6b0be85f2b2c1224c47680f210903e23512cfebfe5a41edfd883a"}, - {file = "argcomplete-3.1.6.tar.gz", hash = "sha256:3b1f07d133332547a53c79437527c00be48cca3807b1d4ca5cab1b26313386a6"}, -] - -[[package]] -name = "async-timeout" -version = "4.0.3" -requires_python = ">=3.7" -summary = "Timeout context manager for asyncio programs" -files = [ - {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, - {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, -] - -[[package]] -name = "atomicwrites" -version = "1.4.1" -requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -summary = "Atomic file writes." -files = [ - {file = "atomicwrites-1.4.1.tar.gz", hash = "sha256:81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11"}, -] - -[[package]] -name = "attrs" -version = "23.1.0" -requires_python = ">=3.7" -summary = "Classes Without Boilerplate" -files = [ - {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, - {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, -] - -[[package]] -name = "babel" -version = "2.13.1" -requires_python = ">=3.7" -summary = "Internationalization utilities" -dependencies = [ - "setuptools; python_version >= \"3.12\"", -] -files = [ - {file = "Babel-2.13.1-py3-none-any.whl", hash = "sha256:7077a4984b02b6727ac10f1f7294484f737443d7e2e66c5e4380e41a3ae0b4ed"}, - {file = "Babel-2.13.1.tar.gz", hash = "sha256:33e0952d7dd6374af8dbf6768cc4ddf3ccfefc244f9986d4074704f2fbd18900"}, -] - -[[package]] -name = "bandit" -version = "1.7.5" -requires_python = ">=3.7" -summary = "Security oriented static analyser for python code." -dependencies = [ - "GitPython>=1.0.1", - "PyYAML>=5.3.1", - "colorama>=0.3.9; platform_system == \"Windows\"", - "rich", - "stevedore>=1.20.0", -] -files = [ - {file = "bandit-1.7.5-py3-none-any.whl", hash = "sha256:75665181dc1e0096369112541a056c59d1c5f66f9bb74a8d686c3c362b83f549"}, - {file = "bandit-1.7.5.tar.gz", hash = "sha256:bdfc739baa03b880c2d15d0431b31c658ffc348e907fe197e54e0389dd59e11e"}, -] - -[[package]] -name = "black" -version = "22.12.0" -requires_python = ">=3.7" -summary = "The uncompromising code formatter." -dependencies = [ - "click>=8.0.0", - "mypy-extensions>=0.4.3", - "pathspec>=0.9.0", - "platformdirs>=2", - "tomli>=1.1.0; python_full_version < \"3.11.0a7\"", -] -files = [ - {file = "black-22.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eedd20838bd5d75b80c9f5487dbcb06836a43833a37846cf1d8c1cc01cef59d"}, - {file = "black-22.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:159a46a4947f73387b4d83e87ea006dbb2337eab6c879620a3ba52699b1f4351"}, - {file = "black-22.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d30b212bffeb1e252b31dd269dfae69dd17e06d92b87ad26e23890f3efea366f"}, - {file = "black-22.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:7412e75863aa5c5411886804678b7d083c7c28421210180d67dfd8cf1221e1f4"}, - {file = "black-22.12.0-py3-none-any.whl", hash = "sha256:436cc9167dd28040ad90d3b404aec22cedf24a6e4d7de221bec2730ec0c97bcf"}, - {file = "black-22.12.0.tar.gz", hash = "sha256:229351e5a18ca30f447bf724d007f890f97e13af070bb6ad4c0a441cd7596a2f"}, -] - -[[package]] -name = "boto" -version = "2.49.0" -summary = "Amazon Web Services Library" -files = [ - {file = "boto-2.49.0-py2.py3-none-any.whl", hash = "sha256:147758d41ae7240dc989f0039f27da8ca0d53734be0eb869ef16e3adcfa462e8"}, - {file = "boto-2.49.0.tar.gz", hash = "sha256:ea0d3b40a2d852767be77ca343b58a9e3a4b00d9db440efb8da74b4e58025e5a"}, -] - -[[package]] -name = "box2d-py" -version = "2.3.8" -summary = "Python Box2D" -files = [ - {file = "box2d-py-2.3.8.tar.gz", hash = "sha256:bdacfbbc56079bb317548efe49d3d5a86646885cc27f4a2ee97e4b2960921ab7"}, -] - -[[package]] -name = "cachetools" -version = "5.3.2" -requires_python = ">=3.7" -summary = "Extensible memoizing collections and decorators" -files = [ - {file = "cachetools-5.3.2-py3-none-any.whl", hash = "sha256:861f35a13a451f94e301ce2bec7cac63e881232ccce7ed67fab9b5df4d3beaa1"}, - {file = "cachetools-5.3.2.tar.gz", hash = "sha256:086ee420196f7b2ab9ca2db2520aca326318b68fe5ba8bc4d49cca91add450f2"}, -] - -[[package]] -name = "certifi" -version = "2023.11.17" -requires_python = ">=3.6" -summary = "Python package for providing Mozilla's CA Bundle." -files = [ - {file = "certifi-2023.11.17-py3-none-any.whl", hash = "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474"}, - {file = "certifi-2023.11.17.tar.gz", hash = "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1"}, -] - -[[package]] -name = "cffi" -version = "1.16.0" -requires_python = ">=3.8" -summary = "Foreign Function Interface for Python calling C code." -dependencies = [ - "pycparser", -] -files = [ - {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, - {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, - {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, - {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, - {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, - {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, - {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, - {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, - {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, - {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, - {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, - {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, - {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, - {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, - {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, - {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, - {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, - {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, -] - -[[package]] -name = "charset-normalizer" -version = "3.3.2" -requires_python = ">=3.7.0" -summary = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -files = [ - {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, - {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, -] - -[[package]] -name = "click" -version = "8.1.7" -requires_python = ">=3.7" -summary = "Composable command line interface toolkit" -dependencies = [ - "colorama; platform_system == \"Windows\"", -] -files = [ - {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, - {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, -] - -[[package]] -name = "cloudpickle" -version = "3.0.0" -requires_python = ">=3.8" -summary = "Pickler class to extend the standard pickle.Pickler functionality" -files = [ - {file = "cloudpickle-3.0.0-py3-none-any.whl", hash = "sha256:246ee7d0c295602a036e86369c77fecda4ab17b506496730f2f576d9016fd9c7"}, - {file = "cloudpickle-3.0.0.tar.gz", hash = "sha256:996d9a482c6fb4f33c1a35335cf8afd065d2a56e973270364840712d9131a882"}, -] - -[[package]] -name = "colorama" -version = "0.4.6" -requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -summary = "Cross-platform colored terminal text." -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 = "crcmod" -version = "1.7" -summary = "CRC Generator" -files = [ - {file = "crcmod-1.7.tar.gz", hash = "sha256:dc7051a0db5f2bd48665a990d3ec1cc305a466a77358ca4492826f41f283601e"}, -] - -[[package]] -name = "cryptography" -version = "41.0.5" -requires_python = ">=3.7" -summary = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." -dependencies = [ - "cffi>=1.12", -] -files = [ - {file = "cryptography-41.0.5-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:da6a0ff8f1016ccc7477e6339e1d50ce5f59b88905585f77193ebd5068f1e797"}, - {file = "cryptography-41.0.5-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:b948e09fe5fb18517d99994184854ebd50b57248736fd4c720ad540560174ec5"}, - {file = "cryptography-41.0.5-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d38e6031e113b7421db1de0c1b1f7739564a88f1684c6b89234fbf6c11b75147"}, - {file = "cryptography-41.0.5-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e270c04f4d9b5671ebcc792b3ba5d4488bf7c42c3c241a3748e2599776f29696"}, - {file = "cryptography-41.0.5-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ec3b055ff8f1dce8e6ef28f626e0972981475173d7973d63f271b29c8a2897da"}, - {file = "cryptography-41.0.5-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:7d208c21e47940369accfc9e85f0de7693d9a5d843c2509b3846b2db170dfd20"}, - {file = "cryptography-41.0.5-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:8254962e6ba1f4d2090c44daf50a547cd5f0bf446dc658a8e5f8156cae0d8548"}, - {file = "cryptography-41.0.5-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:a48e74dad1fb349f3dc1d449ed88e0017d792997a7ad2ec9587ed17405667e6d"}, - {file = "cryptography-41.0.5-cp37-abi3-win32.whl", hash = "sha256:d3977f0e276f6f5bf245c403156673db103283266601405376f075c849a0b936"}, - {file = "cryptography-41.0.5-cp37-abi3-win_amd64.whl", hash = "sha256:73801ac9736741f220e20435f84ecec75ed70eda90f781a148f1bad546963d81"}, - {file = "cryptography-41.0.5-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3be3ca726e1572517d2bef99a818378bbcf7d7799d5372a46c79c29eb8d166c1"}, - {file = "cryptography-41.0.5-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:e886098619d3815e0ad5790c973afeee2c0e6e04b4da90b88e6bd06e2a0b1b72"}, - {file = "cryptography-41.0.5-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:573eb7128cbca75f9157dcde974781209463ce56b5804983e11a1c462f0f4e88"}, - {file = "cryptography-41.0.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:0c327cac00f082013c7c9fb6c46b7cc9fa3c288ca702c74773968173bda421bf"}, - {file = "cryptography-41.0.5-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:227ec057cd32a41c6651701abc0328135e472ed450f47c2766f23267b792a88e"}, - {file = "cryptography-41.0.5-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:22892cc830d8b2c89ea60148227631bb96a7da0c1b722f2aac8824b1b7c0b6b8"}, - {file = "cryptography-41.0.5-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:5a70187954ba7292c7876734183e810b728b4f3965fbe571421cb2434d279179"}, - {file = "cryptography-41.0.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:88417bff20162f635f24f849ab182b092697922088b477a7abd6664ddd82291d"}, - {file = "cryptography-41.0.5-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c707f7afd813478e2019ae32a7c49cd932dd60ab2d2a93e796f68236b7e1fbf1"}, - {file = "cryptography-41.0.5-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:580afc7b7216deeb87a098ef0674d6ee34ab55993140838b14c9b83312b37b86"}, - {file = "cryptography-41.0.5-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:fba1e91467c65fe64a82c689dc6cf58151158993b13eb7a7f3f4b7f395636723"}, - {file = "cryptography-41.0.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0d2a6a598847c46e3e321a7aef8af1436f11c27f1254933746304ff014664d84"}, - {file = "cryptography-41.0.5.tar.gz", hash = "sha256:392cb88b597247177172e02da6b7a63deeff1937fa6fec3bbf902ebd75d97ec7"}, -] - -[[package]] -name = "docker-pycreds" -version = "0.4.0" -summary = "Python bindings for the docker credentials store API" -dependencies = [ - "six>=1.4.0", -] -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]] -name = "docutils" -version = "0.17.1" -requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -summary = "Docutils -- Python Documentation Utilities" -files = [ - {file = "docutils-0.17.1-py2.py3-none-any.whl", hash = "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61"}, - {file = "docutils-0.17.1.tar.gz", hash = "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125"}, -] - -[[package]] -name = "farama-notifications" -version = "0.0.4" -summary = "Notifications for all Farama Foundation maintained libraries." -files = [ - {file = "Farama-Notifications-0.0.4.tar.gz", hash = "sha256:13fceff2d14314cf80703c8266462ebf3733c7d165336eee998fc58e545efd18"}, - {file = "Farama_Notifications-0.0.4-py3-none-any.whl", hash = "sha256:14de931035a41961f7c056361dc7f980762a143d05791ef5794a751a2caf05ae"}, -] - -[[package]] -name = "fasteners" -version = "0.19" -requires_python = ">=3.6" -summary = "A python package that provides useful locks" -files = [ - {file = "fasteners-0.19-py3-none-any.whl", hash = "sha256:758819cb5d94cdedf4e836988b74de396ceacb8e2794d21f82d131fd9ee77237"}, - {file = "fasteners-0.19.tar.gz", hash = "sha256:b4f37c3ac52d8a445af3a66bce57b33b5e90b97c696b7b984f530cf8f0ded09c"}, -] - -[[package]] -name = "flake8" -version = "6.1.0" -requires_python = ">=3.8.1" -summary = "the modular source code checker: pep8 pyflakes and co" -dependencies = [ - "mccabe<0.8.0,>=0.7.0", - "pycodestyle<2.12.0,>=2.11.0", - "pyflakes<3.2.0,>=3.1.0", -] -files = [ - {file = "flake8-6.1.0-py2.py3-none-any.whl", hash = "sha256:ffdfce58ea94c6580c77888a86506937f9a1a227dfcd15f245d694ae20a6b6e5"}, - {file = "flake8-6.1.0.tar.gz", hash = "sha256:d5b3857f07c030bdb5bf41c7f53799571d75c4491748a3adcd47de929e34cd23"}, -] - -[[package]] -name = "frozenlist" -version = "1.4.0" -requires_python = ">=3.8" -summary = "A list-like structure which implements collections.abc.MutableSequence" -files = [ - {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:764226ceef3125e53ea2cb275000e309c0aa5464d43bd72abd661e27fffc26ab"}, - {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d6484756b12f40003c6128bfcc3fa9f0d49a687e171186c2d85ec82e3758c559"}, - {file = "frozenlist-1.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9ac08e601308e41eb533f232dbf6b7e4cea762f9f84f6357136eed926c15d12c"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d081f13b095d74b67d550de04df1c756831f3b83dc9881c38985834387487f1b"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:71932b597f9895f011f47f17d6428252fc728ba2ae6024e13c3398a087c2cdea"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:981b9ab5a0a3178ff413bca62526bb784249421c24ad7381e39d67981be2c326"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e41f3de4df3e80de75845d3e743b3f1c4c8613c3997a912dbf0229fc61a8b963"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6918d49b1f90821e93069682c06ffde41829c346c66b721e65a5c62b4bab0300"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0e5c8764c7829343d919cc2dfc587a8db01c4f70a4ebbc49abde5d4b158b007b"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8d0edd6b1c7fb94922bf569c9b092ee187a83f03fb1a63076e7774b60f9481a8"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e29cda763f752553fa14c68fb2195150bfab22b352572cb36c43c47bedba70eb"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:0c7c1b47859ee2cac3846fde1c1dc0f15da6cec5a0e5c72d101e0f83dcb67ff9"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:901289d524fdd571be1c7be054f48b1f88ce8dddcbdf1ec698b27d4b8b9e5d62"}, - {file = "frozenlist-1.4.0-cp310-cp310-win32.whl", hash = "sha256:1a0848b52815006ea6596c395f87449f693dc419061cc21e970f139d466dc0a0"}, - {file = "frozenlist-1.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:b206646d176a007466358aa21d85cd8600a415c67c9bd15403336c331a10d956"}, - {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:de343e75f40e972bae1ef6090267f8260c1446a1695e77096db6cfa25e759a95"}, - {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ad2a9eb6d9839ae241701d0918f54c51365a51407fd80f6b8289e2dfca977cc3"}, - {file = "frozenlist-1.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bd7bd3b3830247580de99c99ea2a01416dfc3c34471ca1298bccabf86d0ff4dc"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bdf1847068c362f16b353163391210269e4f0569a3c166bc6a9f74ccbfc7e839"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38461d02d66de17455072c9ba981d35f1d2a73024bee7790ac2f9e361ef1cd0c"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5a32087d720c608f42caed0ef36d2b3ea61a9d09ee59a5142d6070da9041b8f"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dd65632acaf0d47608190a71bfe46b209719bf2beb59507db08ccdbe712f969b"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261b9f5d17cac914531331ff1b1d452125bf5daa05faf73b71d935485b0c510b"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b89ac9768b82205936771f8d2eb3ce88503b1556324c9f903e7156669f521472"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:008eb8b31b3ea6896da16c38c1b136cb9fec9e249e77f6211d479db79a4eaf01"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e74b0506fa5aa5598ac6a975a12aa8928cbb58e1f5ac8360792ef15de1aa848f"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:490132667476f6781b4c9458298b0c1cddf237488abd228b0b3650e5ecba7467"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:76d4711f6f6d08551a7e9ef28c722f4a50dd0fc204c56b4bcd95c6cc05ce6fbb"}, - {file = "frozenlist-1.4.0-cp311-cp311-win32.whl", hash = "sha256:a02eb8ab2b8f200179b5f62b59757685ae9987996ae549ccf30f983f40602431"}, - {file = "frozenlist-1.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:515e1abc578dd3b275d6a5114030b1330ba044ffba03f94091842852f806f1c1"}, - {file = "frozenlist-1.4.0.tar.gz", hash = "sha256:09163bdf0b2907454042edb19f887c6d33806adc71fbd54afc14908bfdc22251"}, -] - -[[package]] -name = "gcs-oauth2-boto-plugin" -version = "3.0" -summary = "Auth plugin allowing use the use of OAuth 2.0 credentials for Google Cloud Storage in the Boto library." -dependencies = [ - "boto>=2.29.1", - "google-reauth>=0.1.0", - "httplib2>=0.18", - "oauth2client>=2.2.0", - "pyOpenSSL>=0.13", - "retry-decorator>=1.0.0", - "rsa==4.7.2", - "six>=1.12.0", -] -files = [ - {file = "gcs-oauth2-boto-plugin-3.0.tar.gz", hash = "sha256:f4120b08b7f8d32904674c98f07d4caf4083a58343c0c0fa0016e0f0254dfe31"}, -] - -[[package]] -name = "gitdb" -version = "4.0.11" -requires_python = ">=3.7" -summary = "Git Object Database" -dependencies = [ - "smmap<6,>=3.0.1", -] -files = [ - {file = "gitdb-4.0.11-py3-none-any.whl", hash = "sha256:81a3407ddd2ee8df444cbacea00e2d038e40150acfa3001696fe0dcf1d3adfa4"}, - {file = "gitdb-4.0.11.tar.gz", hash = "sha256:bf5421126136d6d0af55bc1e7c1af1c397a34f5b7bd79e776cd3e89785c2b04b"}, -] - -[[package]] -name = "gitpython" -version = "3.1.40" -requires_python = ">=3.7" -summary = "GitPython is a Python library used to interact with Git repositories" -dependencies = [ - "gitdb<5,>=4.0.1", -] -files = [ - {file = "GitPython-3.1.40-py3-none-any.whl", hash = "sha256:cf14627d5a8049ffbf49915732e5eddbe8134c3bdb9d476e6182b676fc573f8a"}, - {file = "GitPython-3.1.40.tar.gz", hash = "sha256:22b126e9ffb671fdd0c129796343a02bf67bf2994b35449ffc9321aa755e18a4"}, -] - -[[package]] -name = "google-apitools" -version = "0.5.32" -requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -summary = "client libraries for humans" -dependencies = [ - "fasteners>=0.14", - "httplib2>=0.8", - "oauth2client>=1.4.12", - "six>=1.12.0", -] -files = [ - {file = "google-apitools-0.5.32.tar.gz", hash = "sha256:c3763e52289f61e21c41d5531e20fbda9cc8484a088b8686fd460770db8bad13"}, - {file = "google_apitools-0.5.32-py3-none-any.whl", hash = "sha256:b78f74116558e0476e19501b5b4b2ac7c93261a69c5449c861ea95cbc853c688"}, -] - -[[package]] -name = "google-auth" -version = "2.23.4" -requires_python = ">=3.7" -summary = "Google Authentication Library" -dependencies = [ - "cachetools<6.0,>=2.0.0", - "pyasn1-modules>=0.2.1", - "rsa<5,>=3.1.4", -] -files = [ - {file = "google-auth-2.23.4.tar.gz", hash = "sha256:79905d6b1652187def79d491d6e23d0cbb3a21d3c7ba0dbaa9c8a01906b13ff3"}, - {file = "google_auth-2.23.4-py2.py3-none-any.whl", hash = "sha256:d4bbc92fe4b8bfd2f3e8d88e5ba7085935da208ee38a134fc280e7ce682a05f2"}, -] - -[[package]] -name = "google-auth-oauthlib" -version = "1.1.0" -requires_python = ">=3.6" -summary = "Google Authentication Library" -dependencies = [ - "google-auth>=2.15.0", - "requests-oauthlib>=0.7.0", -] -files = [ - {file = "google-auth-oauthlib-1.1.0.tar.gz", hash = "sha256:83ea8c3b0881e453790baff4448e8a6112ac8778d1de9da0b68010b843937afb"}, - {file = "google_auth_oauthlib-1.1.0-py2.py3-none-any.whl", hash = "sha256:089c6e587d36f4803ac7e0720c045c6a8b1fd1790088b8424975b90d0ee61c12"}, -] - -[[package]] -name = "google-auth" -version = "2.23.4" -extras = ["aiohttp"] -requires_python = ">=3.7" -summary = "Google Authentication Library" -dependencies = [ - "aiohttp<4.0.0.dev0,>=3.6.2", - "google-auth==2.23.4", - "requests<3.0.0.dev0,>=2.20.0", -] -files = [ - {file = "google-auth-2.23.4.tar.gz", hash = "sha256:79905d6b1652187def79d491d6e23d0cbb3a21d3c7ba0dbaa9c8a01906b13ff3"}, - {file = "google_auth-2.23.4-py2.py3-none-any.whl", hash = "sha256:d4bbc92fe4b8bfd2f3e8d88e5ba7085935da208ee38a134fc280e7ce682a05f2"}, -] - -[[package]] -name = "google-reauth" -version = "0.1.1" -summary = "Google Reauth Library" -dependencies = [ - "pyu2f", -] -files = [ - {file = "google-reauth-0.1.1.tar.gz", hash = "sha256:f9f6852a55c2c5453d581cd01f3d1278e86147c03d008409800390a834235892"}, - {file = "google_reauth-0.1.1-py2.py3-none-any.whl", hash = "sha256:cb39074488d74c8853074dde47368bbf8f739d4a4338b89aab696c895b6d8368"}, -] - -[[package]] -name = "grpcio" -version = "1.59.3" -requires_python = ">=3.7" -summary = "HTTP/2-based RPC framework" -files = [ - {file = "grpcio-1.59.3-cp310-cp310-linux_armv7l.whl", hash = "sha256:aca028a6c7806e5b61e5f9f4232432c52856f7fcb98e330b20b6bc95d657bdcc"}, - {file = "grpcio-1.59.3-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:19ad26a7967f7999c8960d2b9fe382dae74c55b0c508c613a6c2ba21cddf2354"}, - {file = "grpcio-1.59.3-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:72b71dad2a3d1650e69ad42a5c4edbc59ee017f08c32c95694172bc501def23c"}, - {file = "grpcio-1.59.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c0f0a11d82d0253656cc42e04b6a149521e02e755fe2e4edd21123de610fd1d4"}, - {file = "grpcio-1.59.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60cddafb70f9a2c81ba251b53b4007e07cca7389e704f86266e22c4bffd8bf1d"}, - {file = "grpcio-1.59.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6c75a1fa0e677c1d2b6d4196ad395a5c381dfb8385f07ed034ef667cdcdbcc25"}, - {file = "grpcio-1.59.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e1d8e01438d5964a11167eec1edb5f85ed8e475648f36c834ed5db4ffba24ac8"}, - {file = "grpcio-1.59.3-cp310-cp310-win32.whl", hash = "sha256:c4b0076f0bf29ee62335b055a9599f52000b7941f577daa001c7ef961a1fbeab"}, - {file = "grpcio-1.59.3-cp310-cp310-win_amd64.whl", hash = "sha256:b1f00a3e6e0c3dccccffb5579fc76ebfe4eb40405ba308505b41ef92f747746a"}, - {file = "grpcio-1.59.3-cp311-cp311-linux_armv7l.whl", hash = "sha256:3996aaa21231451161dc29df6a43fcaa8b332042b6150482c119a678d007dd86"}, - {file = "grpcio-1.59.3-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:cb4e9cbd9b7388fcb06412da9f188c7803742d06d6f626304eb838d1707ec7e3"}, - {file = "grpcio-1.59.3-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:8022ca303d6c694a0d7acfb2b472add920217618d3a99eb4b14edc7c6a7e8fcf"}, - {file = "grpcio-1.59.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b36683fad5664283755a7f4e2e804e243633634e93cd798a46247b8e54e3cb0d"}, - {file = "grpcio-1.59.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8239b853226e4824e769517e1b5232e7c4dda3815b200534500338960fcc6118"}, - {file = "grpcio-1.59.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0511af8653fbda489ff11d542a08505d56023e63cafbda60e6e00d4e0bae86ea"}, - {file = "grpcio-1.59.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e78dc982bda74cef2ddfce1c91d29b96864c4c680c634e279ed204d51e227473"}, - {file = "grpcio-1.59.3-cp311-cp311-win32.whl", hash = "sha256:6a5c3a96405966c023e139c3bcccb2c7c776a6f256ac6d70f8558c9041bdccc3"}, - {file = "grpcio-1.59.3-cp311-cp311-win_amd64.whl", hash = "sha256:ed26826ee423b11477297b187371cdf4fa1eca874eb1156422ef3c9a60590dd9"}, - {file = "grpcio-1.59.3-cp312-cp312-linux_armv7l.whl", hash = "sha256:45dddc5cb5227d30fa43652d8872dc87f086d81ab4b500be99413bad0ae198d7"}, - {file = "grpcio-1.59.3-cp312-cp312-macosx_10_10_universal2.whl", hash = "sha256:1736496d74682e53dd0907fd515f2694d8e6a96c9a359b4080b2504bf2b2d91b"}, - {file = "grpcio-1.59.3-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:ddbd1a16138e52e66229047624de364f88a948a4d92ba20e4e25ad7d22eef025"}, - {file = "grpcio-1.59.3-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fcfa56f8d031ffda902c258c84c4b88707f3a4be4827b4e3ab8ec7c24676320d"}, - {file = "grpcio-1.59.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2eb8f0c7c0c62f7a547ad7a91ba627a5aa32a5ae8d930783f7ee61680d7eb8d"}, - {file = "grpcio-1.59.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8d993399cc65e3a34f8fd48dd9ad7a376734564b822e0160dd18b3d00c1a33f9"}, - {file = "grpcio-1.59.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c0bd141f4f41907eb90bda74d969c3cb21c1c62779419782a5b3f5e4b5835718"}, - {file = "grpcio-1.59.3-cp312-cp312-win32.whl", hash = "sha256:33b8fd65d4e97efa62baec6171ce51f9cf68f3a8ba9f866f4abc9d62b5c97b79"}, - {file = "grpcio-1.59.3-cp312-cp312-win_amd64.whl", hash = "sha256:0e735ed002f50d4f3cb9ecfe8ac82403f5d842d274c92d99db64cfc998515e07"}, - {file = "grpcio-1.59.3.tar.gz", hash = "sha256:7800f99568a74a06ebdccd419dd1b6e639b477dcaf6da77ea702f8fb14ce5f80"}, -] - -[[package]] -name = "gsutil" -version = "5.27" -requires_python = "!=2.*, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" -summary = "A command line tool for interacting with cloud storage services." -dependencies = [ - "argcomplete>=1.9.4", - "crcmod>=1.7", - "fasteners>=0.14.1", - "gcs-oauth2-boto-plugin>=3.0", - "google-apitools>=0.5.32", - "google-auth[aiohttp]>=2.5.0", - "google-reauth>=0.1.0", - "httplib2==0.20.4", - "monotonic>=1.4", - "pyOpenSSL>=0.13", - "retry-decorator>=1.0.0", - "six>=1.16.0", -] -files = [ - {file = "gsutil-5.27.tar.gz", hash = "sha256:681a2d844acdf05fac989da6dd406944ae11cb27a4cf3c9edef74d2585ab5f05"}, -] - -[[package]] -name = "gymnasium" -version = "0.29.1" -requires_python = ">=3.8" -summary = "A standard API for reinforcement learning and a diverse set of reference environments (formerly Gym)." -dependencies = [ - "cloudpickle>=1.2.0", - "farama-notifications>=0.0.1", - "numpy>=1.21.0", - "typing-extensions>=4.3.0", -] -files = [ - {file = "gymnasium-0.29.1-py3-none-any.whl", hash = "sha256:61c3384b5575985bb7f85e43213bcb40f36fcdff388cae6bc229304c71f2843e"}, - {file = "gymnasium-0.29.1.tar.gz", hash = "sha256:1a532752efcb7590478b1cc7aa04f608eb7a2fdad5570cd217b66b6a35274bb1"}, -] - -[[package]] -name = "httplib2" -version = "0.20.4" -requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -summary = "A comprehensive HTTP client library." -dependencies = [ - "pyparsing!=3.0.0,!=3.0.1,!=3.0.2,!=3.0.3,<4,>=2.4.2; python_version > \"3.0\"", -] -files = [ - {file = "httplib2-0.20.4-py3-none-any.whl", hash = "sha256:8b6a905cb1c79eefd03f8669fd993c36dc341f7c558f056cb5a33b5c2f458543"}, - {file = "httplib2-0.20.4.tar.gz", hash = "sha256:58a98e45b4b1a48273073f905d2961666ecf0fbac4250ea5b47aef259eb5c585"}, -] - -[[package]] -name = "idna" -version = "3.4" -requires_python = ">=3.5" -summary = "Internationalized Domain Names in Applications (IDNA)" -files = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, -] - -[[package]] -name = "imagesize" -version = "1.4.1" -requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -summary = "Getting image size from png/jpeg/jpeg2000/gif file" -files = [ - {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"}, - {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, -] - -[[package]] -name = "iniconfig" -version = "2.0.0" -requires_python = ">=3.7" -summary = "brain-dead simple config-ini parsing" -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.12.0" -requires_python = ">=3.8.0" -summary = "A Python utility / library to sort Python imports." -files = [ - {file = "isort-5.12.0-py3-none-any.whl", hash = "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6"}, - {file = "isort-5.12.0.tar.gz", hash = "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504"}, -] - -[[package]] -name = "jinja2" -version = "3.1.2" -requires_python = ">=3.7" -summary = "A very fast and expressive template engine." -dependencies = [ - "MarkupSafe>=2.0", -] -files = [ - {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, - {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, -] - -[[package]] -name = "markdown" -version = "3.5.1" -requires_python = ">=3.8" -summary = "Python implementation of John Gruber's Markdown." -files = [ - {file = "Markdown-3.5.1-py3-none-any.whl", hash = "sha256:5874b47d4ee3f0b14d764324d2c94c03ea66bee56f2d929da9f2508d65e722dc"}, - {file = "Markdown-3.5.1.tar.gz", hash = "sha256:b65d7beb248dc22f2e8a31fb706d93798093c308dc1aba295aedeb9d41a813bd"}, -] - -[[package]] -name = "markdown-it-py" -version = "2.2.0" -requires_python = ">=3.7" -summary = "Python port of markdown-it. Markdown parsing, done right!" -dependencies = [ - "mdurl~=0.1", -] -files = [ - {file = "markdown-it-py-2.2.0.tar.gz", hash = "sha256:7c9a5e412688bc771c67432cbfebcdd686c93ce6484913dccf06cb5a0bea35a1"}, - {file = "markdown_it_py-2.2.0-py3-none-any.whl", hash = "sha256:5a35f8d1870171d9acc47b99612dc146129b631baf04970128b568f190d0cc30"}, -] - -[[package]] -name = "markupsafe" -version = "2.1.3" -requires_python = ">=3.7" -summary = "Safely add untrusted strings to HTML/XML markup." -files = [ - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, - {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, -] - -[[package]] -name = "mccabe" -version = "0.7.0" -requires_python = ">=3.6" -summary = "McCabe checker, plugin for flake8" -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 = "mdit-py-plugins" -version = "0.3.5" -requires_python = ">=3.7" -summary = "Collection of plugins for markdown-it-py" -dependencies = [ - "markdown-it-py<3.0.0,>=1.0.0", -] -files = [ - {file = "mdit-py-plugins-0.3.5.tar.gz", hash = "sha256:eee0adc7195e5827e17e02d2a258a2ba159944a0748f59c5099a4a27f78fcf6a"}, - {file = "mdit_py_plugins-0.3.5-py3-none-any.whl", hash = "sha256:ca9a0714ea59a24b2b044a1831f48d817dd0c817e84339f20e7889f392d77c4e"}, -] - -[[package]] -name = "mdurl" -version = "0.1.2" -requires_python = ">=3.7" -summary = "Markdown URL utilities" -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 = "monotonic" -version = "1.6" -summary = "An implementation of time.monotonic() for Python 2 & < 3.3" -files = [ - {file = "monotonic-1.6-py2.py3-none-any.whl", hash = "sha256:68687e19a14f11f26d140dd5c86f3dba4bf5df58003000ed467e0e2a69bca96c"}, - {file = "monotonic-1.6.tar.gz", hash = "sha256:3a55207bcfed53ddd5c5bae174524062935efed17792e9de2ad0205ce9ad63f7"}, -] - -[[package]] -name = "multidict" -version = "6.0.4" -requires_python = ">=3.7" -summary = "multidict implementation" -files = [ - {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8"}, - {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171"}, - {file = "multidict-6.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5"}, - {file = "multidict-6.0.4-cp310-cp310-win32.whl", hash = "sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8"}, - {file = "multidict-6.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461"}, - {file = "multidict-6.0.4-cp311-cp311-win32.whl", hash = "sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636"}, - {file = "multidict-6.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0"}, - {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"}, -] - -[[package]] -name = "mypy-extensions" -version = "1.0.0" -requires_python = ">=3.5" -summary = "Type system extensions for programs checked with the mypy type checker." -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 = "myst-parser" -version = "0.18.1" -requires_python = ">=3.7" -summary = "An extended commonmark compliant parser, with bridges to docutils & sphinx." -dependencies = [ - "docutils<0.20,>=0.15", - "jinja2", - "markdown-it-py<3.0.0,>=1.0.0", - "mdit-py-plugins~=0.3.1", - "pyyaml", - "sphinx<6,>=4", - "typing-extensions", -] -files = [ - {file = "myst-parser-0.18.1.tar.gz", hash = "sha256:79317f4bb2c13053dd6e64f9da1ba1da6cd9c40c8a430c447a7b146a594c246d"}, - {file = "myst_parser-0.18.1-py3-none-any.whl", hash = "sha256:61b275b85d9f58aa327f370913ae1bec26ebad372cc99f3ab85c8ec3ee8d9fb8"}, -] - -[[package]] -name = "numpy" -version = "1.23.5" -requires_python = ">=3.8" -summary = "NumPy is the fundamental package for array computing with Python." -files = [ - {file = "numpy-1.23.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9c88793f78fca17da0145455f0d7826bcb9f37da4764af27ac945488116efe63"}, - {file = "numpy-1.23.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e9f4c4e51567b616be64e05d517c79a8a22f3606499941d97bb76f2ca59f982d"}, - {file = "numpy-1.23.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7903ba8ab592b82014713c491f6c5d3a1cde5b4a3bf116404e08f5b52f6daf43"}, - {file = "numpy-1.23.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e05b1c973a9f858c74367553e236f287e749465f773328c8ef31abe18f691e1"}, - {file = "numpy-1.23.5-cp310-cp310-win32.whl", hash = "sha256:522e26bbf6377e4d76403826ed689c295b0b238f46c28a7251ab94716da0b280"}, - {file = "numpy-1.23.5-cp310-cp310-win_amd64.whl", hash = "sha256:dbee87b469018961d1ad79b1a5d50c0ae850000b639bcb1b694e9981083243b6"}, - {file = "numpy-1.23.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ce571367b6dfe60af04e04a1834ca2dc5f46004ac1cc756fb95319f64c095a96"}, - {file = "numpy-1.23.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56e454c7833e94ec9769fa0f86e6ff8e42ee38ce0ce1fa4cbb747ea7e06d56aa"}, - {file = "numpy-1.23.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5039f55555e1eab31124a5768898c9e22c25a65c1e0037f4d7c495a45778c9f2"}, - {file = "numpy-1.23.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58f545efd1108e647604a1b5aa809591ccd2540f468a880bedb97247e72db387"}, - {file = "numpy-1.23.5-cp311-cp311-win32.whl", hash = "sha256:b2a9ab7c279c91974f756c84c365a669a887efa287365a8e2c418f8b3ba73fb0"}, - {file = "numpy-1.23.5-cp311-cp311-win_amd64.whl", hash = "sha256:0cbe9848fad08baf71de1a39e12d1b6310f1d5b2d0ea4de051058e6e1076852d"}, - {file = "numpy-1.23.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:abdde9f795cf292fb9651ed48185503a2ff29be87770c3b8e2a14b0cd7aa16f8"}, - {file = "numpy-1.23.5-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9a909a8bae284d46bbfdefbdd4a262ba19d3bc9921b1e76126b1d21c3c34135"}, - {file = "numpy-1.23.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:01dd17cbb340bf0fc23981e52e1d18a9d4050792e8fb8363cecbf066a84b827d"}, - {file = "numpy-1.23.5.tar.gz", hash = "sha256:1b1766d6f397c18153d40015ddfc79ddb715cabadc04d2d228d4e5a8bc4ded1a"}, -] - -[[package]] -name = "oauth2client" -version = "4.1.3" -summary = "OAuth 2.0 client library" -dependencies = [ - "httplib2>=0.9.1", - "pyasn1-modules>=0.0.5", - "pyasn1>=0.1.7", - "rsa>=3.1.4", - "six>=1.6.1", -] -files = [ - {file = "oauth2client-4.1.3-py2.py3-none-any.whl", hash = "sha256:b8a81cc5d60e2d364f0b1b98f958dbd472887acaf1a5b05e21c28c31a2d6d3ac"}, - {file = "oauth2client-4.1.3.tar.gz", hash = "sha256:d486741e451287f69568a4d26d70d9acd73a2bbfa275746c535b4209891cccc6"}, -] - -[[package]] -name = "oauthlib" -version = "3.2.2" -requires_python = ">=3.6" -summary = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" -files = [ - {file = "oauthlib-3.2.2-py3-none-any.whl", hash = "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca"}, - {file = "oauthlib-3.2.2.tar.gz", hash = "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918"}, -] - -[[package]] -name = "onnx" -version = "1.15.0" -requires_python = ">=3.8" -summary = "Open Neural Network Exchange" -dependencies = [ - "numpy", - "protobuf>=3.20.2", -] -files = [ - {file = "onnx-1.15.0-cp310-cp310-macosx_10_12_universal2.whl", hash = "sha256:51cacb6aafba308aaf462252ced562111f6991cdc7bc57a6c554c3519453a8ff"}, - {file = "onnx-1.15.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:0aee26b6f7f7da7e840de75ad9195a77a147d0662c94eaa6483be13ba468ffc1"}, - {file = "onnx-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:baf6ef6c93b3b843edb97a8d5b3d229a1301984f3f8dee859c29634d2083e6f9"}, - {file = "onnx-1.15.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96ed899fe6000edc05bb2828863d3841cfddd5a7cf04c1a771f112e94de75d9f"}, - {file = "onnx-1.15.0-cp310-cp310-win32.whl", hash = "sha256:f1ad3d77fc2f4b4296f0ac2c8cadd8c1dcf765fc586b737462d3a0fe8f7c696a"}, - {file = "onnx-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:ca4ebc4f47109bfb12c8c9e83dd99ec5c9f07d2e5f05976356c6ccdce3552010"}, - {file = "onnx-1.15.0-cp311-cp311-macosx_10_12_universal2.whl", hash = "sha256:233ffdb5ca8cc2d960b10965a763910c0830b64b450376da59207f454701f343"}, - {file = "onnx-1.15.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:51fa79c9ea9af033638ec51f9177b8e76c55fad65bb83ea96ee88fafade18ee7"}, - {file = "onnx-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f277d4861729f5253a51fa41ce91bfec1c4574ee41b5637056b43500917295ce"}, - {file = "onnx-1.15.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8a7c94d2ebead8f739fdb70d1ce5a71726f4e17b3e5b8ad64455ea1b2801a85"}, - {file = "onnx-1.15.0-cp311-cp311-win32.whl", hash = "sha256:17dcfb86a8c6bdc3971443c29b023dd9c90ff1d15d8baecee0747a6b7f74e650"}, - {file = "onnx-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:60a3e28747e305cd2e766e6a53a0a6d952cf9e72005ec6023ce5e07666676a4e"}, - {file = "onnx-1.15.0.tar.gz", hash = "sha256:b18461a7d38f286618ca2a6e78062a2a9c634ce498e631e708a8041b00094825"}, -] - -[[package]] -name = "packaging" -version = "23.2" -requires_python = ">=3.7" -summary = "Core utilities for Python packages" -files = [ - {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, - {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, -] - -[[package]] -name = "pathspec" -version = "0.11.2" -requires_python = ">=3.7" -summary = "Utility library for gitignore style pattern matching of file paths." -files = [ - {file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"}, - {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"}, -] - -[[package]] -name = "pbr" -version = "6.0.0" -requires_python = ">=2.6" -summary = "Python Build Reasonableness" -files = [ - {file = "pbr-6.0.0-py2.py3-none-any.whl", hash = "sha256:4a7317d5e3b17a3dccb6a8cfe67dab65b20551404c52c8ed41279fa4f0cb4cda"}, - {file = "pbr-6.0.0.tar.gz", hash = "sha256:d1377122a5a00e2f940ee482999518efe16d745d423a670c27773dfbc3c9a7d9"}, -] - -[[package]] -name = "platformdirs" -version = "4.0.0" -requires_python = ">=3.7" -summary = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -files = [ - {file = "platformdirs-4.0.0-py3-none-any.whl", hash = "sha256:118c954d7e949b35437270383a3f2531e99dd93cf7ce4dc8340d3356d30f173b"}, - {file = "platformdirs-4.0.0.tar.gz", hash = "sha256:cb633b2bcf10c51af60beb0ab06d2f1d69064b43abf4c185ca6b28865f3f9731"}, -] - -[[package]] -name = "pluggy" -version = "1.3.0" -requires_python = ">=3.8" -summary = "plugin and hook calling mechanisms for python" -files = [ - {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, - {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, -] - -[[package]] -name = "protobuf" -version = "4.23.4" -requires_python = ">=3.7" -summary = "" -files = [ - {file = "protobuf-4.23.4-cp310-abi3-win32.whl", hash = "sha256:5fea3c64d41ea5ecf5697b83e41d09b9589e6f20b677ab3c48e5f242d9b7897b"}, - {file = "protobuf-4.23.4-cp310-abi3-win_amd64.whl", hash = "sha256:7b19b6266d92ca6a2a87effa88ecc4af73ebc5cfde194dc737cf8ef23a9a3b12"}, - {file = "protobuf-4.23.4-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:8547bf44fe8cec3c69e3042f5c4fb3e36eb2a7a013bb0a44c018fc1e427aafbd"}, - {file = "protobuf-4.23.4-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:fee88269a090ada09ca63551bf2f573eb2424035bcf2cb1b121895b01a46594a"}, - {file = "protobuf-4.23.4-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:effeac51ab79332d44fba74660d40ae79985901ac21bca408f8dc335a81aa597"}, - {file = "protobuf-4.23.4-py3-none-any.whl", hash = "sha256:e9d0be5bf34b275b9f87ba7407796556abeeba635455d036c7351f7c183ef8ff"}, - {file = "protobuf-4.23.4.tar.gz", hash = "sha256:ccd9430c0719dce806b93f89c91de7977304729e55377f872a92465d548329a9"}, -] - -[[package]] -name = "psutil" -version = "5.9.6" -requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" -summary = "Cross-platform lib for process and system monitoring in Python." -files = [ - {file = "psutil-5.9.6-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c69596f9fc2f8acd574a12d5f8b7b1ba3765a641ea5d60fb4736bf3c08a8214a"}, - {file = "psutil-5.9.6-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:92e0cc43c524834af53e9d3369245e6cc3b130e78e26100d1f63cdb0abeb3d3c"}, - {file = "psutil-5.9.6-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:748c9dd2583ed86347ed65d0035f45fa8c851e8d90354c122ab72319b5f366f4"}, - {file = "psutil-5.9.6-cp37-abi3-win32.whl", hash = "sha256:a6f01f03bf1843280f4ad16f4bde26b817847b4c1a0db59bf6419807bc5ce05c"}, - {file = "psutil-5.9.6-cp37-abi3-win_amd64.whl", hash = "sha256:6e5fb8dc711a514da83098bc5234264e551ad980cec5f85dabf4d38ed6f15e9a"}, - {file = "psutil-5.9.6-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:daecbcbd29b289aac14ece28eca6a3e60aa361754cf6da3dfb20d4d32b6c7f57"}, - {file = "psutil-5.9.6.tar.gz", hash = "sha256:e4b92ddcd7dd4cdd3f900180ea1e104932c7bce234fb88976e2a3b296441225a"}, -] - -[[package]] -name = "py" -version = "1.11.0" -requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -summary = "library with cross-python path, ini-parsing, io, code, log facilities" -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 = "pyasn1" -version = "0.5.0" -requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" -summary = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" -files = [ - {file = "pyasn1-0.5.0-py2.py3-none-any.whl", hash = "sha256:87a2121042a1ac9358cabcaf1d07680ff97ee6404333bacca15f76aa8ad01a57"}, - {file = "pyasn1-0.5.0.tar.gz", hash = "sha256:97b7290ca68e62a832558ec3976f15cbf911bf5d7c7039d8b861c2a0ece69fde"}, -] - -[[package]] -name = "pyasn1-modules" -version = "0.3.0" -requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" -summary = "A collection of ASN.1-based protocols modules" -dependencies = [ - "pyasn1<0.6.0,>=0.4.6", -] -files = [ - {file = "pyasn1_modules-0.3.0-py2.py3-none-any.whl", hash = "sha256:d3ccd6ed470d9ffbc716be08bd90efbd44d0734bc9303818f7336070984a162d"}, - {file = "pyasn1_modules-0.3.0.tar.gz", hash = "sha256:5bd01446b736eb9d31512a30d46c1ac3395d676c6f3cafa4c03eb54b9925631c"}, -] - -[[package]] -name = "pycodestyle" -version = "2.11.1" -requires_python = ">=3.8" -summary = "Python style guide checker" -files = [ - {file = "pycodestyle-2.11.1-py2.py3-none-any.whl", hash = "sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67"}, - {file = "pycodestyle-2.11.1.tar.gz", hash = "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f"}, -] - -[[package]] -name = "pycparser" -version = "2.21" -requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -summary = "C parser in Python" -files = [ - {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, - {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, -] - -[[package]] -name = "pyflakes" -version = "3.1.0" -requires_python = ">=3.8" -summary = "passive checker of Python programs" -files = [ - {file = "pyflakes-3.1.0-py2.py3-none-any.whl", hash = "sha256:4132f6d49cb4dae6819e5379898f2b8cce3c5f23994194c24b77d5da2e36f774"}, - {file = "pyflakes-3.1.0.tar.gz", hash = "sha256:a0aae034c444db0071aa077972ba4768d40c830d9539fd45bf4cd3f8f6992efc"}, -] - -[[package]] -name = "pygame" -version = "2.5.2" -requires_python = ">=3.6" -summary = "Python Game Development" -files = [ - {file = "pygame-2.5.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a0769eb628c818761755eb0a0ca8216b95270ea8cbcbc82227e39ac9644643da"}, - {file = "pygame-2.5.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ed9a3d98adafa0805ccbaaff5d2996a2b5795381285d8437a4a5d248dbd12b4a"}, - {file = "pygame-2.5.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f30d1618672a55e8c6669281ba264464b3ab563158e40d89e8c8b3faa0febebd"}, - {file = "pygame-2.5.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:39690e9be9baf58b7359d1f3b2336e1fd6f92fedbbce42987be5df27f8d30718"}, - {file = "pygame-2.5.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03879ec299c9f4ba23901b2649a96b2143f0a5d787f0b6c39469989e2320caf1"}, - {file = "pygame-2.5.2-cp310-cp310-win32.whl", hash = "sha256:74e1d6284100e294f445832e6f6343be4fe4748decc4f8a51131ae197dae8584"}, - {file = "pygame-2.5.2-cp310-cp310-win_amd64.whl", hash = "sha256:485239c7d32265fd35b76ae8f64f34b0637ae11e69d76de15710c4b9edcc7c8d"}, - {file = "pygame-2.5.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:34646ca20e163dc6f6cf8170f1e12a2e41726780112594ac061fa448cf7ccd75"}, - {file = "pygame-2.5.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3b8a6e351665ed26ea791f0e1fd649d3f483e8681892caef9d471f488f9ea5ee"}, - {file = "pygame-2.5.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc346965847aef00013fa2364f41a64f068cd096dcc7778fc306ca3735f0eedf"}, - {file = "pygame-2.5.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:35632035fd81261f2d797fa810ea8c46111bd78ceb6089d52b61ed7dc3c5d05f"}, - {file = "pygame-2.5.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e24d05184e4195fe5ebcdce8b18ecb086f00182b9ae460a86682d312ce8d31f"}, - {file = "pygame-2.5.2-cp311-cp311-win32.whl", hash = "sha256:f02c1c7505af18d426d355ac9872bd5c916b27f7b0fe224749930662bea47a50"}, - {file = "pygame-2.5.2-cp311-cp311-win_amd64.whl", hash = "sha256:6d58c8cf937815d3b7cdc0fa9590c5129cb2c9658b72d00e8a4568dea2ff1d42"}, - {file = "pygame-2.5.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1a2a43802bb5e89ce2b3b775744e78db4f9a201bf8d059b946c61722840ceea8"}, - {file = "pygame-2.5.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1c289f2613c44fe70a1e40769de4a49c5ab5a29b9376f1692bb1a15c9c1c9bfa"}, - {file = "pygame-2.5.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:074aa6c6e110c925f7f27f00c7733c6303407edc61d738882985091d1eb2ef17"}, - {file = "pygame-2.5.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe0228501ec616779a0b9c4299e837877783e18df294dd690b9ab0eed3d8aaab"}, - {file = "pygame-2.5.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31648d38ecdc2335ffc0e38fb18a84b3339730521505dac68514f83a1092e3f4"}, - {file = "pygame-2.5.2-cp312-cp312-win32.whl", hash = "sha256:224c308856334bc792f696e9278e50d099a87c116f7fc314cd6aa3ff99d21592"}, - {file = "pygame-2.5.2-cp312-cp312-win_amd64.whl", hash = "sha256:dd2d2650faf54f9a0f5bd0db8409f79609319725f8f08af6507a0609deadcad4"}, - {file = "pygame-2.5.2-pp36-pypy36_pp73-win32.whl", hash = "sha256:e708fc8f709a0fe1d1876489345f2e443d47f3976d33455e2e1e937f972f8677"}, - {file = "pygame-2.5.2-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c13edebc43c240fb0532969e914f0ccefff5ae7e50b0b788d08ad2c15ef793e4"}, - {file = "pygame-2.5.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:263b4a7cbfc9fe2055abc21b0251cc17dea6dff750f0e1c598919ff350cdbffe"}, - {file = "pygame-2.5.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e58e2b0c791041e4bccafa5bd7650623ba1592b8fe62ae0a276b7d0ecb314b6c"}, - {file = "pygame-2.5.2-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a0bd67426c02ffe6c9827fc4bcbda9442fbc451d29b17c83a3c088c56fef2c90"}, - {file = "pygame-2.5.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9dcff6cbba1584cf7732ce1dbdd044406cd4f6e296d13bcb7fba963fb4aeefc9"}, - {file = "pygame-2.5.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ce4b6c0bfe44d00bb0998a6517bd0cf9455f642f30f91bc671ad41c05bf6f6ae"}, - {file = "pygame-2.5.2-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68c4e8e60b725ffc7a6c6ecd9bb5fcc5ed2d6e0e2a2c4a29a8454856ef16ad63"}, - {file = "pygame-2.5.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f3849f97372a3381c66955f99a0d58485ccd513c3d00c030b869094ce6997a6"}, - {file = "pygame-2.5.2.tar.gz", hash = "sha256:c1b89eb5d539e7ac5cf75513125fb5f2f0a2d918b1fd6e981f23bf0ac1b1c24a"}, -] - -[[package]] -name = "pygments" -version = "2.17.1" -requires_python = ">=3.7" -summary = "Pygments is a syntax highlighting package written in Python." -files = [ - {file = "pygments-2.17.1-py3-none-any.whl", hash = "sha256:1b37f1b1e1bff2af52ecaf28cc601e2ef7077000b227a0675da25aef85784bc4"}, - {file = "pygments-2.17.1.tar.gz", hash = "sha256:e45a0e74bf9c530f564ca81b8952343be986a29f6afe7f5ad95c5f06b7bdf5e8"}, -] - -[[package]] -name = "pyopenssl" -version = "23.3.0" -requires_python = ">=3.7" -summary = "Python wrapper module around the OpenSSL library" -dependencies = [ - "cryptography<42,>=41.0.5", -] -files = [ - {file = "pyOpenSSL-23.3.0-py3-none-any.whl", hash = "sha256:6756834481d9ed5470f4a9393455154bc92fe7a64b7bc6ee2c804e78c52099b2"}, - {file = "pyOpenSSL-23.3.0.tar.gz", hash = "sha256:6b2cba5cc46e822750ec3e5a81ee12819850b11303630d575e98108a079c2b12"}, -] - -[[package]] -name = "pyparsing" -version = "3.1.1" -requires_python = ">=3.6.8" -summary = "pyparsing module - Classes and methods to define and execute parsing grammars" -files = [ - {file = "pyparsing-3.1.1-py3-none-any.whl", hash = "sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb"}, - {file = "pyparsing-3.1.1.tar.gz", hash = "sha256:ede28a1a32462f5a9705e07aea48001a08f7cf81a021585011deba701581a0db"}, -] - -[[package]] -name = "pytest" -version = "6.2.5" -requires_python = ">=3.6" -summary = "pytest: simple powerful testing with Python" -dependencies = [ - "atomicwrites>=1.0; sys_platform == \"win32\"", - "attrs>=19.2.0", - "colorama; sys_platform == \"win32\"", - "iniconfig", - "packaging", - "pluggy<2.0,>=0.12", - "py>=1.8.2", - "toml", -] -files = [ - {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, - {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, -] - -[[package]] -name = "pyu2f" -version = "0.1.5" -summary = "U2F host library for interacting with a U2F device over USB." -dependencies = [ - "six", -] -files = [ - {file = "pyu2f-0.1.5.tar.gz", hash = "sha256:a3caa3a11842fc7d5746376f37195e6af5f17c0a15737538bb1cebf656fb306b"}, -] - -[[package]] -name = "pyyaml" -version = "6.0.1" -requires_python = ">=3.6" -summary = "YAML parser and emitter for Python" -files = [ - {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, - {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, - {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, - {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, - {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, - {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, - {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, - {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, - {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, - {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, - {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, - {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, -] - -[[package]] -name = "requests" -version = "2.31.0" -requires_python = ">=3.7" -summary = "Python HTTP for Humans." -dependencies = [ - "certifi>=2017.4.17", - "charset-normalizer<4,>=2", - "idna<4,>=2.5", - "urllib3<3,>=1.21.1", -] -files = [ - {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, - {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, -] - -[[package]] -name = "requests-oauthlib" -version = "1.3.1" -requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -summary = "OAuthlib authentication support for Requests." -dependencies = [ - "oauthlib>=3.0.0", - "requests>=2.0.0", -] -files = [ - {file = "requests-oauthlib-1.3.1.tar.gz", hash = "sha256:75beac4a47881eeb94d5ea5d6ad31ef88856affe2332b9aafb52c6452ccf0d7a"}, - {file = "requests_oauthlib-1.3.1-py2.py3-none-any.whl", hash = "sha256:2577c501a2fb8d05a304c09d090d6e47c306fef15809d102b327cf8364bddab5"}, -] - -[[package]] -name = "retry-decorator" -version = "1.1.1" -summary = "Retry Decorator" -files = [ - {file = "retry_decorator-1.1.1.tar.gz", hash = "sha256:e1e8ad02e518fe11073f2ea7d80b6b8be19daa27a60a1838aff7c731ddcf2ebe"}, -] - -[[package]] -name = "rich" -version = "13.7.0" -requires_python = ">=3.7.0" -summary = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" -dependencies = [ - "markdown-it-py>=2.2.0", - "pygments<3.0.0,>=2.13.0", -] -files = [ - {file = "rich-13.7.0-py3-none-any.whl", hash = "sha256:6da14c108c4866ee9520bbffa71f6fe3962e193b7da68720583850cd4548e235"}, - {file = "rich-13.7.0.tar.gz", hash = "sha256:5cb5123b5cf9ee70584244246816e9114227e0b98ad9176eede6ad54bf5403fa"}, -] - -[[package]] -name = "rsa" -version = "4.7.2" -requires_python = ">=3.5, <4" -summary = "Pure-Python RSA implementation" -dependencies = [ - "pyasn1>=0.1.3", -] -files = [ - {file = "rsa-4.7.2-py3-none-any.whl", hash = "sha256:78f9a9bf4e7be0c5ded4583326e7461e3a3c5aae24073648b4bdfa797d78c9d2"}, - {file = "rsa-4.7.2.tar.gz", hash = "sha256:9d689e6ca1b3038bc82bf8d23e944b6b6037bc02301a574935b2dd946e0353b9"}, -] - -[[package]] -name = "sentry-sdk" -version = "1.35.0" -summary = "Python client for Sentry (https://sentry.io)" -dependencies = [ - "certifi", - "urllib3>=1.26.11; python_version >= \"3.6\"", -] -files = [ - {file = "sentry-sdk-1.35.0.tar.gz", hash = "sha256:04e392db9a0d59bd49a51b9e3a92410ac5867556820465057c2ef89a38e953e9"}, - {file = "sentry_sdk-1.35.0-py2.py3-none-any.whl", hash = "sha256:a7865952701e46d38b41315c16c075367675c48d049b90a4cc2e41991ebc7efa"}, -] - -[[package]] -name = "setproctitle" -version = "1.3.3" -requires_python = ">=3.7" -summary = "A Python module to customize the process title" -files = [ - {file = "setproctitle-1.3.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:897a73208da48db41e687225f355ce993167079eda1260ba5e13c4e53be7f754"}, - {file = "setproctitle-1.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8c331e91a14ba4076f88c29c777ad6b58639530ed5b24b5564b5ed2fd7a95452"}, - {file = "setproctitle-1.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbbd6c7de0771c84b4aa30e70b409565eb1fc13627a723ca6be774ed6b9d9fa3"}, - {file = "setproctitle-1.3.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c05ac48ef16ee013b8a326c63e4610e2430dbec037ec5c5b58fcced550382b74"}, - {file = "setproctitle-1.3.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1342f4fdb37f89d3e3c1c0a59d6ddbedbde838fff5c51178a7982993d238fe4f"}, - {file = "setproctitle-1.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc74e84fdfa96821580fb5e9c0b0777c1c4779434ce16d3d62a9c4d8c710df39"}, - {file = "setproctitle-1.3.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9617b676b95adb412bb69645d5b077d664b6882bb0d37bfdafbbb1b999568d85"}, - {file = "setproctitle-1.3.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6a249415f5bb88b5e9e8c4db47f609e0bf0e20a75e8d744ea787f3092ba1f2d0"}, - {file = "setproctitle-1.3.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:38da436a0aaace9add67b999eb6abe4b84397edf4a78ec28f264e5b4c9d53cd5"}, - {file = "setproctitle-1.3.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:da0d57edd4c95bf221b2ebbaa061e65b1788f1544977288bdf95831b6e44e44d"}, - {file = "setproctitle-1.3.3-cp310-cp310-win32.whl", hash = "sha256:a1fcac43918b836ace25f69b1dca8c9395253ad8152b625064415b1d2f9be4fb"}, - {file = "setproctitle-1.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:200620c3b15388d7f3f97e0ae26599c0c378fdf07ae9ac5a13616e933cbd2086"}, - {file = "setproctitle-1.3.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:334f7ed39895d692f753a443102dd5fed180c571eb6a48b2a5b7f5b3564908c8"}, - {file = "setproctitle-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:950f6476d56ff7817a8fed4ab207727fc5260af83481b2a4b125f32844df513a"}, - {file = "setproctitle-1.3.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:195c961f54a09eb2acabbfc90c413955cf16c6e2f8caa2adbf2237d1019c7dd8"}, - {file = "setproctitle-1.3.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f05e66746bf9fe6a3397ec246fe481096664a9c97eb3fea6004735a4daf867fd"}, - {file = "setproctitle-1.3.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b5901a31012a40ec913265b64e48c2a4059278d9f4e6be628441482dd13fb8b5"}, - {file = "setproctitle-1.3.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64286f8a995f2cd934082b398fc63fca7d5ffe31f0e27e75b3ca6b4efda4e353"}, - {file = "setproctitle-1.3.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:184239903bbc6b813b1a8fc86394dc6ca7d20e2ebe6f69f716bec301e4b0199d"}, - {file = "setproctitle-1.3.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:664698ae0013f986118064b6676d7dcd28fefd0d7d5a5ae9497cbc10cba48fa5"}, - {file = "setproctitle-1.3.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e5119a211c2e98ff18b9908ba62a3bd0e3fabb02a29277a7232a6fb4b2560aa0"}, - {file = "setproctitle-1.3.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:417de6b2e214e837827067048f61841f5d7fc27926f2e43954567094051aff18"}, - {file = "setproctitle-1.3.3-cp311-cp311-win32.whl", hash = "sha256:6a143b31d758296dc2f440175f6c8e0b5301ced3b0f477b84ca43cdcf7f2f476"}, - {file = "setproctitle-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:a680d62c399fa4b44899094027ec9a1bdaf6f31c650e44183b50d4c4d0ccc085"}, - {file = "setproctitle-1.3.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d4460795a8a7a391e3567b902ec5bdf6c60a47d791c3b1d27080fc203d11c9dc"}, - {file = "setproctitle-1.3.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:bdfd7254745bb737ca1384dee57e6523651892f0ea2a7344490e9caefcc35e64"}, - {file = "setproctitle-1.3.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:477d3da48e216d7fc04bddab67b0dcde633e19f484a146fd2a34bb0e9dbb4a1e"}, - {file = "setproctitle-1.3.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ab2900d111e93aff5df9fddc64cf51ca4ef2c9f98702ce26524f1acc5a786ae7"}, - {file = "setproctitle-1.3.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:088b9efc62d5aa5d6edf6cba1cf0c81f4488b5ce1c0342a8b67ae39d64001120"}, - {file = "setproctitle-1.3.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6d50252377db62d6a0bb82cc898089916457f2db2041e1d03ce7fadd4a07381"}, - {file = "setproctitle-1.3.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:87e668f9561fd3a457ba189edfc9e37709261287b52293c115ae3487a24b92f6"}, - {file = "setproctitle-1.3.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:287490eb90e7a0ddd22e74c89a92cc922389daa95babc833c08cf80c84c4df0a"}, - {file = "setproctitle-1.3.3-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:4fe1c49486109f72d502f8be569972e27f385fe632bd8895f4730df3c87d5ac8"}, - {file = "setproctitle-1.3.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4a6ba2494a6449b1f477bd3e67935c2b7b0274f2f6dcd0f7c6aceae10c6c6ba3"}, - {file = "setproctitle-1.3.3-cp312-cp312-win32.whl", hash = "sha256:2df2b67e4b1d7498632e18c56722851ba4db5d6a0c91aaf0fd395111e51cdcf4"}, - {file = "setproctitle-1.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:f38d48abc121263f3b62943f84cbaede05749047e428409c2c199664feb6abc7"}, - {file = "setproctitle-1.3.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6b9e62ddb3db4b5205c0321dd69a406d8af9ee1693529d144e86bd43bcb4b6c0"}, - {file = "setproctitle-1.3.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e3b99b338598de0bd6b2643bf8c343cf5ff70db3627af3ca427a5e1a1a90dd9"}, - {file = "setproctitle-1.3.3-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ae9a02766dad331deb06855fb7a6ca15daea333b3967e214de12cfae8f0ef5"}, - {file = "setproctitle-1.3.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:200ede6fd11233085ba9b764eb055a2a191fb4ffb950c68675ac53c874c22e20"}, - {file = "setproctitle-1.3.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0d3a953c50776751e80fe755a380a64cb14d61e8762bd43041ab3f8cc436092f"}, - {file = "setproctitle-1.3.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5e08e232b78ba3ac6bc0d23ce9e2bee8fad2be391b7e2da834fc9a45129eb87"}, - {file = "setproctitle-1.3.3-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1da82c3e11284da4fcbf54957dafbf0655d2389cd3d54e4eaba636faf6d117a"}, - {file = "setproctitle-1.3.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:aeaa71fb9568ebe9b911ddb490c644fbd2006e8c940f21cb9a1e9425bd709574"}, - {file = "setproctitle-1.3.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:59335d000c6250c35989394661eb6287187854e94ac79ea22315469ee4f4c244"}, - {file = "setproctitle-1.3.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3ba57029c9c50ecaf0c92bb127224cc2ea9fda057b5d99d3f348c9ec2855ad3"}, - {file = "setproctitle-1.3.3-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d876d355c53d975c2ef9c4f2487c8f83dad6aeaaee1b6571453cb0ee992f55f6"}, - {file = "setproctitle-1.3.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:224602f0939e6fb9d5dd881be1229d485f3257b540f8a900d4271a2c2aa4e5f4"}, - {file = "setproctitle-1.3.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d7f27e0268af2d7503386e0e6be87fb9b6657afd96f5726b733837121146750d"}, - {file = "setproctitle-1.3.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f5e7266498cd31a4572378c61920af9f6b4676a73c299fce8ba93afd694f8ae7"}, - {file = "setproctitle-1.3.3-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33c5609ad51cd99d388e55651b19148ea99727516132fb44680e1f28dd0d1de9"}, - {file = "setproctitle-1.3.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:eae8988e78192fd1a3245a6f4f382390b61bce6cfcc93f3809726e4c885fa68d"}, - {file = "setproctitle-1.3.3.tar.gz", hash = "sha256:c913e151e7ea01567837ff037a23ca8740192880198b7fbb90b16d181607caae"}, -] - -[[package]] -name = "setuptools" -version = "59.5.0" -requires_python = ">=3.6" -summary = "Easily download, build, install, upgrade, and uninstall Python packages" -files = [ - {file = "setuptools-59.5.0-py3-none-any.whl", hash = "sha256:6d10741ff20b89cd8c6a536ee9dc90d3002dec0226c78fb98605bfb9ef8a7adf"}, - {file = "setuptools-59.5.0.tar.gz", hash = "sha256:d144f85102f999444d06f9c0e8c737fd0194f10f2f7e5fdb77573f6e2fa4fad0"}, -] - -[[package]] -name = "six" -version = "1.16.0" -requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" -summary = "Python 2 and 3 compatibility utilities" -files = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] - -[[package]] -name = "smmap" -version = "5.0.1" -requires_python = ">=3.7" -summary = "A pure Python implementation of a sliding window memory map manager" -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 = "snowballstemmer" -version = "2.2.0" -summary = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." -files = [ - {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, - {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, -] - -[[package]] -name = "sphinx" -version = "4.5.0" -requires_python = ">=3.6" -summary = "Python documentation generator" -dependencies = [ - "Jinja2>=2.3", - "Pygments>=2.0", - "alabaster<0.8,>=0.7", - "babel>=1.3", - "colorama>=0.3.5; sys_platform == \"win32\"", - "docutils<0.18,>=0.14", - "imagesize", - "packaging", - "requests>=2.5.0", - "snowballstemmer>=1.1", - "sphinxcontrib-applehelp", - "sphinxcontrib-devhelp", - "sphinxcontrib-htmlhelp>=2.0.0", - "sphinxcontrib-jsmath", - "sphinxcontrib-qthelp", - "sphinxcontrib-serializinghtml>=1.1.5", -] -files = [ - {file = "Sphinx-4.5.0-py3-none-any.whl", hash = "sha256:ebf612653238bcc8f4359627a9b7ce44ede6fdd75d9d30f68255c7383d3a6226"}, - {file = "Sphinx-4.5.0.tar.gz", hash = "sha256:7bf8ca9637a4ee15af412d1a1d9689fec70523a68ca9bb9127c2f3eeb344e2e6"}, -] - -[[package]] -name = "sphinx-autodoc-typehints" -version = "1.19.1" -requires_python = ">=3.7" -summary = "Type hints (PEP 484) support for the Sphinx autodoc extension" -dependencies = [ - "Sphinx>=4.5", -] -files = [ - {file = "sphinx_autodoc_typehints-1.19.1-py3-none-any.whl", hash = "sha256:9be46aeeb1b315eb5df1f3a7cb262149895d16c7d7dcd77b92513c3c3a1e85e6"}, - {file = "sphinx_autodoc_typehints-1.19.1.tar.gz", hash = "sha256:6c841db55e0e9be0483ff3962a2152b60e79306f4288d8c4e7e86ac84486a5ea"}, -] - -[[package]] -name = "sphinx-rtd-theme" -version = "1.0.0" -requires_python = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" -summary = "Read the Docs theme for Sphinx" -dependencies = [ - "docutils<0.18", - "sphinx>=1.6", -] -files = [ - {file = "sphinx_rtd_theme-1.0.0-py2.py3-none-any.whl", hash = "sha256:4d35a56f4508cfee4c4fb604373ede6feae2a306731d533f409ef5c3496fdbd8"}, - {file = "sphinx_rtd_theme-1.0.0.tar.gz", hash = "sha256:eec6d497e4c2195fa0e8b2016b337532b8a699a68bcb22a512870e16925c6a5c"}, -] - -[[package]] -name = "sphinxcontrib-apidoc" -version = "0.3.0" -summary = "A Sphinx extension for running 'sphinx-apidoc' on each build" -dependencies = [ - "Sphinx>=1.6.0", - "pbr", -] -files = [ - {file = "sphinxcontrib-apidoc-0.3.0.tar.gz", hash = "sha256:729bf592cf7b7dd57c4c05794f732dc026127275d785c2a5494521fdde773fb9"}, - {file = "sphinxcontrib_apidoc-0.3.0-py2.py3-none-any.whl", hash = "sha256:6671a46b2c6c5b0dca3d8a147849d159065e50443df79614f921b42fbd15cb09"}, -] - -[[package]] -name = "sphinxcontrib-applehelp" -version = "1.0.4" -requires_python = ">=3.8" -summary = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" -files = [ - {file = "sphinxcontrib-applehelp-1.0.4.tar.gz", hash = "sha256:828f867945bbe39817c210a1abfd1bc4895c8b73fcaade56d45357a348a07d7e"}, - {file = "sphinxcontrib_applehelp-1.0.4-py3-none-any.whl", hash = "sha256:29d341f67fb0f6f586b23ad80e072c8e6ad0b48417db2bde114a4c9746feb228"}, -] - -[[package]] -name = "sphinxcontrib-devhelp" -version = "1.0.2" -requires_python = ">=3.5" -summary = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." -files = [ - {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, - {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, -] - -[[package]] -name = "sphinxcontrib-htmlhelp" -version = "2.0.1" -requires_python = ">=3.8" -summary = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" -files = [ - {file = "sphinxcontrib-htmlhelp-2.0.1.tar.gz", hash = "sha256:0cbdd302815330058422b98a113195c9249825d681e18f11e8b1f78a2f11efff"}, - {file = "sphinxcontrib_htmlhelp-2.0.1-py3-none-any.whl", hash = "sha256:c38cb46dccf316c79de6e5515e1770414b797162b23cd3d06e67020e1d2a6903"}, -] - -[[package]] -name = "sphinxcontrib-jsmath" -version = "1.0.1" -requires_python = ">=3.5" -summary = "A sphinx extension which renders display math in HTML via JavaScript" -files = [ - {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, - {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, -] - -[[package]] -name = "sphinxcontrib-qthelp" -version = "1.0.3" -requires_python = ">=3.5" -summary = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." -files = [ - {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, - {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, -] - -[[package]] -name = "sphinxcontrib-serializinghtml" -version = "1.1.5" -requires_python = ">=3.5" -summary = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." -files = [ - {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, - {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, -] - -[[package]] -name = "stevedore" -version = "5.1.0" -requires_python = ">=3.8" -summary = "Manage dynamic plugins for Python applications" -dependencies = [ - "pbr!=2.1.0,>=2.0.0", -] -files = [ - {file = "stevedore-5.1.0-py3-none-any.whl", hash = "sha256:8cc040628f3cea5d7128f2e76cf486b2251a4e543c7b938f58d9a377f6694a2d"}, - {file = "stevedore-5.1.0.tar.gz", hash = "sha256:a54534acf9b89bc7ed264807013b505bf07f74dbe4bcfa37d32bd063870b087c"}, -] - -[[package]] -name = "tensorboard" -version = "2.15.1" -requires_python = ">=3.9" -summary = "TensorBoard lets you watch Tensors Flow" -dependencies = [ - "absl-py>=0.4", - "google-auth-oauthlib<2,>=0.5", - "google-auth<3,>=1.6.3", - "grpcio>=1.48.2", - "markdown>=2.6.8", - "numpy>=1.12.0", - "protobuf<4.24,>=3.19.6", - "requests<3,>=2.21.0", - "setuptools>=41.0.0", - "six>1.9", - "tensorboard-data-server<0.8.0,>=0.7.0", - "werkzeug>=1.0.1", -] -files = [ - {file = "tensorboard-2.15.1-py3-none-any.whl", hash = "sha256:c46c1d1cf13a458c429868a78b2531d8ff5f682058d69ec0840b0bc7a38f1c0f"}, -] - -[[package]] -name = "tensorboard-data-server" -version = "0.7.2" -requires_python = ">=3.7" -summary = "Fast data loading for TensorBoard" -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 = "toml" -version = "0.10.2" -requires_python = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" -summary = "Python Library for Tom's Obvious, Minimal Language" -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.0.1" -requires_python = ">=3.7" -summary = "A lil' TOML parser" -files = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, -] - -[[package]] -name = "torch" -version = "1.12.0" -requires_python = ">=3.7.0" -summary = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" -dependencies = [ - "typing-extensions", -] -files = [ - {file = "torch-1.12.0-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:3322d33a06e440d715bb214334bd41314c94632d9a2f07d22006bf21da3a2be4"}, - {file = "torch-1.12.0-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:2568f011dddeb5990d8698cc375d237f14568ffa8489854e3b94113b4b6b7c8b"}, - {file = "torch-1.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:e3e8348edca3e3cee5a67a2b452b85c57712efe1cc3ffdb87c128b3dde54534e"}, - {file = "torch-1.12.0-cp310-none-macosx_10_9_x86_64.whl", hash = "sha256:349ea3ba0c0e789e0507876c023181f13b35307aebc2e771efd0e045b8e03e84"}, - {file = "torch-1.12.0-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:13c7cca6b2ea3704d775444f02af53c5f072d145247e17b8cd7813ac57869f03"}, -] - -[[package]] -name = "typing-extensions" -version = "4.8.0" -requires_python = ">=3.8" -summary = "Backported and Experimental Type Hints for Python 3.8+" -files = [ - {file = "typing_extensions-4.8.0-py3-none-any.whl", hash = "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0"}, - {file = "typing_extensions-4.8.0.tar.gz", hash = "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef"}, -] - -[[package]] -name = "urllib3" -version = "2.1.0" -requires_python = ">=3.8" -summary = "HTTP library with thread-safe connection pooling, file post, and more." -files = [ - {file = "urllib3-2.1.0-py3-none-any.whl", hash = "sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3"}, - {file = "urllib3-2.1.0.tar.gz", hash = "sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54"}, -] - -[[package]] -name = "wandb" -version = "0.16.0" -requires_python = ">=3.7" -summary = "A CLI and library for interacting with the Weights & Biases API." -dependencies = [ - "Click!=8.0.0,>=7.1", - "GitPython!=3.1.29,>=1.0.0", - "PyYAML", - "appdirs>=1.4.3", - "docker-pycreds>=0.4.0", - "protobuf!=4.21.0,<5,>=3.19.0; python_version > \"3.9\" and sys_platform == \"linux\"", - "protobuf!=4.21.0,<5,>=3.19.0; sys_platform != \"linux\"", - "psutil>=5.0.0", - "requests<3,>=2.0.0", - "sentry-sdk>=1.0.0", - "setproctitle", - "setuptools", -] -files = [ - {file = "wandb-0.16.0-py3-none-any.whl", hash = "sha256:e103142a5ecdb158d29441c2bf9f935ae149ed562377f7cebffd2a6f7c9de949"}, - {file = "wandb-0.16.0.tar.gz", hash = "sha256:8d9875f1d8d75fee32dc51f6727bc277ce4f3869d7319ccf5f36ce596597402a"}, -] - -[[package]] -name = "werkzeug" -version = "3.0.1" -requires_python = ">=3.8" -summary = "The comprehensive WSGI web application library." -dependencies = [ - "MarkupSafe>=2.1.1", -] -files = [ - {file = "werkzeug-3.0.1-py3-none-any.whl", hash = "sha256:90a285dc0e42ad56b34e696398b8122ee4c681833fb35b8334a095d82c56da10"}, - {file = "werkzeug-3.0.1.tar.gz", hash = "sha256:507e811ecea72b18a404947aded4b3390e1db8f826b494d76550ef45bb3b1dcc"}, -] - -[[package]] -name = "yarl" -version = "1.9.2" -requires_python = ">=3.7" -summary = "Yet another URL library" -dependencies = [ - "idna>=2.0", - "multidict>=4.0", -] -files = [ - {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c2ad583743d16ddbdf6bb14b5cd76bf43b0d0006e918809d5d4ddf7bde8dd82"}, - {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82aa6264b36c50acfb2424ad5ca537a2060ab6de158a5bd2a72a032cc75b9eb8"}, - {file = "yarl-1.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c0c77533b5ed4bcc38e943178ccae29b9bcf48ffd1063f5821192f23a1bd27b9"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee4afac41415d52d53a9833ebae7e32b344be72835bbb589018c9e938045a560"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bf345c3a4f5ba7f766430f97f9cc1320786f19584acc7086491f45524a551ac"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a96c19c52ff442a808c105901d0bdfd2e28575b3d5f82e2f5fd67e20dc5f4ea"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:891c0e3ec5ec881541f6c5113d8df0315ce5440e244a716b95f2525b7b9f3608"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3a53ba34a636a256d767c086ceb111358876e1fb6b50dfc4d3f4951d40133d5"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:566185e8ebc0898b11f8026447eacd02e46226716229cea8db37496c8cdd26e0"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2b0738fb871812722a0ac2154be1f049c6223b9f6f22eec352996b69775b36d4"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:32f1d071b3f362c80f1a7d322bfd7b2d11e33d2adf395cc1dd4df36c9c243095"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e9fdc7ac0d42bc3ea78818557fab03af6181e076a2944f43c38684b4b6bed8e3"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56ff08ab5df8429901ebdc5d15941b59f6253393cb5da07b4170beefcf1b2528"}, - {file = "yarl-1.9.2-cp310-cp310-win32.whl", hash = "sha256:8ea48e0a2f931064469bdabca50c2f578b565fc446f302a79ba6cc0ee7f384d3"}, - {file = "yarl-1.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:50f33040f3836e912ed16d212f6cc1efb3231a8a60526a407aeb66c1c1956dde"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:646d663eb2232d7909e6601f1a9107e66f9791f290a1b3dc7057818fe44fc2b6"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aff634b15beff8902d1f918012fc2a42e0dbae6f469fce134c8a0dc51ca423bb"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a83503934c6273806aed765035716216cc9ab4e0364f7f066227e1aaea90b8d0"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b25322201585c69abc7b0e89e72790469f7dad90d26754717f3310bfe30331c2"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22a94666751778629f1ec4280b08eb11815783c63f52092a5953faf73be24191"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ec53a0ea2a80c5cd1ab397925f94bff59222aa3cf9c6da938ce05c9ec20428d"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:159d81f22d7a43e6eabc36d7194cb53f2f15f498dbbfa8edc8a3239350f59fe7"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:832b7e711027c114d79dffb92576acd1bd2decc467dec60e1cac96912602d0e6"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:95d2ecefbcf4e744ea952d073c6922e72ee650ffc79028eb1e320e732898d7e8"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d4e2c6d555e77b37288eaf45b8f60f0737c9efa3452c6c44626a5455aeb250b9"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:783185c75c12a017cc345015ea359cc801c3b29a2966c2655cd12b233bf5a2be"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:b8cc1863402472f16c600e3e93d542b7e7542a540f95c30afd472e8e549fc3f7"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:822b30a0f22e588b32d3120f6d41e4ed021806418b4c9f0bc3048b8c8cb3f92a"}, - {file = "yarl-1.9.2-cp311-cp311-win32.whl", hash = "sha256:a60347f234c2212a9f0361955007fcf4033a75bf600a33c88a0a8e91af77c0e8"}, - {file = "yarl-1.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:be6b3fdec5c62f2a67cb3f8c6dbf56bbf3f61c0f046f84645cd1ca73532ea051"}, - {file = "yarl-1.9.2.tar.gz", hash = "sha256:04ab9d4b9f587c06d801c2abfe9317b77cdf996c65a90d5e84ecc45010823571"}, -] diff --git a/pyproject.toml b/pyproject.toml index d7449525..3efef997 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -2,12 +2,10 @@ name = "emote-rl" version = "23.0.0" description = "A modular reinforcement learning library" -authors = [ - {name = "Embark Studios", email = "python@embark-studios.com"}, -] +authors = [{ name = "Embark Studios", email = "python@embark-studios.com" }] requires-python = ">=3.10" readme = "README.md" -license = {text = "MIT"} +license = { text = "MIT" } dependencies = [ "tensorboard>=2.8.0", @@ -16,77 +14,25 @@ dependencies = [ "onnx>=1.10", "atomicwrites>=1.4.0", "numpy<1.24", + "cloudpickle~=3.0", ] + [project.optional-dependencies] torch = ["torch==1.12.0"] atari = [ "gymnasium>=0.27.1", "box2d-py>=2.3.5", - "pygame>=2.1.0" + "pygame>=2.1.0", + "opencv-python>=3.0", ] wandb = ["wandb>=0.14.0"] -ci = ["gsutil>=4.66", "emote-rl[atari, wandb]"] - -[tool.pdm.dev-dependencies] -tools = [ - "pytest~=6.0", - "black~=22.1", - "bandit~=1.7", - "isort~=5.10", - "flake8>=6,<7", -] - -docs = [ - "Sphinx~=4.4", - "sphinxcontrib-apidoc~=0.3", - "sphinx-autodoc-typehints~=1.17", - "sphinx-rtd-theme~=1.0.0", - "myst-parser~=0.18.0" -] +protobuf = ["protobuf>=4.0"] +ci = ["gsutil>=4.66"] [project.urls] repository = "https://github.com/EmbarkStudios/emote" -[tool.pdm] -plugins = [ - "pdm-plugin-torch>=23.4.0" -] - -[tool.pdm.plugin.torch] -dependencies = [ - "torch==1.12.0" -] -lockfile = "torch.lock" -enable-cpu = true - -enable-rocm = false # there's no +rocm variants for mac where it'd be useful, so this is a bit shot. -rocm-versions = ["5.0"] - -enable-cuda = true -cuda-versions = ["cu116"] - -[tool.pdm.scripts] -docs = "bash -c 'cd docs && rm -rf _build/dirhtml/ && make dirhtml'" -docs-serve = "python -m http.server --directory docs/_build/dirhtml" - -test = "pytest tests" - -flake8_ = "flake8 emote experiments tests" -bandit_ = "bandit --r -ll emote experiments tests" -lint.composite = ["bandit_", "flake8_"] - -black_ = "black emote experiments tests" -isort_ = "isort emote experiments tests" -fmt.composite = ["black_", "isort_"] -foo = "pdm -V" - -precommit.composite = ["fmt", "lint", "test"] - -[build-system] -requires = ["pdm-backend>=2.0.0"] -build-backend = "pdm.backend" - [tool.pytest.ini_options] minversion = "6.0" log_cli = true @@ -95,7 +41,7 @@ log_format = "%(asctime)s:\t%(message)s" log_date_format = "%H:%M:%S" [tool.isort] -py_version = 39 +py_version = 310 profile = "black" combine_as_imports = true lines_between_types = 1 @@ -105,7 +51,7 @@ known_first_party = ["emote"] line_length = 100 [tool.black] -target-version = ['py39'] +target-version = ['py310'] line-length = 100 [tool.mypy] diff --git a/taplo.toml b/taplo.toml new file mode 100644 index 00000000..8f8054d3 --- /dev/null +++ b/taplo.toml @@ -0,0 +1,3 @@ +[formatting] +array_auto_collapse = false +indent_string = " " diff --git a/tests/BUILD b/tests/BUILD new file mode 100644 index 00000000..d4a3d9b3 --- /dev/null +++ b/tests/BUILD @@ -0,0 +1,19 @@ +python_test_utils( + name="test_utils", +) + +python_tests( + overrides={ + "test_memory_exports.py": { + "dependencies": [ + ":memory-artifact", + ] + }, + }, +) + + +resource( + name="memory-artifact", + source="data/export-v1.zip", +) diff --git a/tests/conftest.py b/tests/conftest.py index a82315d9..2748c7a8 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,6 +1,4 @@ -""" - -""" +"""""" import builtins diff --git a/tests/gym/BUILD b/tests/gym/BUILD new file mode 100644 index 00000000..e7e0ca9c --- /dev/null +++ b/tests/gym/BUILD @@ -0,0 +1,9 @@ +python_sources() + +python_requirement( + name="atari", + dependencies=[ + emote_dependency_path("/pyproject.toml:package_data#atari"), + ], + requirements=[], +) diff --git a/tests/gym/collector.py b/tests/gym/collector.py index 439d5508..58e95e40 100644 --- a/tests/gym/collector.py +++ b/tests/gym/collector.py @@ -1,6 +1,4 @@ -""" -Collectors for running OpenAI gym environments -""" +"""Collectors for running OpenAI gym environments.""" import threading @@ -34,7 +32,7 @@ def __init__( self._warmup_steps = warmup_steps def collect_data(self): - """Collect a single rollout""" + """Collect a single rollout.""" if self._render: self._env.render() actions = self._agent(self._obs) @@ -47,7 +45,7 @@ def collect_data(self): self.log_scalar("episode/reward", ep_info["reward"]) def collect_multiple(self, count: int): - """Collect multiple rollouts + """Collect multiple rollouts. :param count: Number of rollouts to collect """ @@ -82,7 +80,7 @@ def __init__( self._thread = None def collect_forever(self): - """Collect rollouts forever + """Collect rollouts forever. .. warning:: @@ -90,7 +88,6 @@ def collect_forever(self): signal, internal or external, that'll cause this loop to end. You probably want to implement a loop that calls `collect_data` or `collect_multiple` while checking exit conditions. - """ # FIXME[tsolberg]: Works OK when subprocs are not involved, might want # to signal this (somehow). Responsibility of parent to wrap somehow? diff --git a/tests/test_amp.py b/tests/test_amp.py index 2d79fd23..7e7411b4 100644 --- a/tests/test_amp.py +++ b/tests/test_amp.py @@ -26,7 +26,6 @@ def state_map_fn(obs: Tensor): def test_gradient_loss(): - x = torch.ones(10, 3, requires_grad=True) x = x * torch.rand(10, 3) y = torch.sum(4 * x * x + torch.sin(x), dim=1) diff --git a/tests/test_checkpoints.py b/tests/test_checkpoints.py index 72dcd40f..dc62989f 100644 --- a/tests/test_checkpoints.py +++ b/tests/test_checkpoints.py @@ -2,6 +2,7 @@ from tempfile import mkdtemp from typing import Generator +import pytest import torch from torch import nn @@ -57,7 +58,7 @@ def test_networks_checkpoint(): ) c1 = [ Checkpointer( - callbacks=[loss_cb], + restorees=[loss_cb], run_root=run_root, checkpoint_interval=1, ) @@ -76,7 +77,7 @@ def test_networks_checkpoint(): c2 = [ CheckpointLoader( - callbacks=[loss_cb], + restorees=[loss_cb], run_root=run_root, checkpoint_index=0, ), @@ -107,7 +108,7 @@ def test_qloss_checkpoints(): ql1 = QLoss(name="q", q=q1, opt=Adam(q1.parameters())) c1 = [ ql1, - Checkpointer(callbacks=[ql1], run_root=run_root, checkpoint_interval=1), + Checkpointer(restorees=[ql1], run_root=run_root, checkpoint_interval=1), ] t1 = Trainer(c1, random_onestep_dataloader()) @@ -123,8 +124,25 @@ def test_qloss_checkpoints(): ql2 = QLoss(name="q", q=q2, opt=Adam(q1.parameters())) c2 = [ ql2, - CheckpointLoader(callbacks=[ql2], run_root=run_root, checkpoint_index=0), + CheckpointLoader(restorees=[ql2], run_root=run_root, checkpoint_index=0), ] t2 = Trainer(c2, nostep_dataloader()) t2.train() assert torch.allclose(q1(test_act, test_obs), q2(test_act, test_obs)) + + +def test_duplicate_name_checkpoints(): + chkpt_dir = mkdtemp() + run_root = join(chkpt_dir, "chkpt") + q1 = QNet(2, 1) + q2 = QNet(2, 1) + ql1 = QLoss(name="q1", q=q1, opt=Adam(q1.parameters())) + ql2 = QLoss(name="q2", q=q2, opt=Adam(q2.parameters())) + + Checkpointer(restorees=[ql1, ql2], run_root=run_root, checkpoint_interval=1) + + b1 = BackPropStepsTerminator(1) + b2 = BackPropStepsTerminator(1) + + with pytest.raises(ValueError): + Checkpointer(restorees=[b1, b2], run_root=run_root, checkpoint_interval=1) diff --git a/tests/test_genrl.py b/tests/test_genrl.py index bd74494f..effd5e3b 100644 --- a/tests/test_genrl.py +++ b/tests/test_genrl.py @@ -6,7 +6,7 @@ from emote.algorithms.genrl.proxies import MemoryProxyWithEncoder from emote.algorithms.genrl.wrappers import DecoderWrapper, EncoderWrapper, PolicyWrapper -from emote.memory.builder import DictObsTable +from emote.memory.builder import DictObsMemoryTable from emote.nn.action_value_mlp import ActionValueMlp from emote.nn.gaussian_policy import GaussianMlpPolicy from emote.typing import DictObservation, DictResponse, EpisodeState @@ -59,7 +59,6 @@ def __init__( def forward( self, data: torch.Tensor, condition: torch.Tensor = None ) -> tuple[torch.Tensor, torch.Tensor]: - if condition is not None: data = torch.cat((data, condition), dim=len(data.shape) - 1) @@ -129,7 +128,6 @@ def forward(self, latent: torch.Tensor, condition: torch.Tensor = None) -> torch def test_genrl(): - cfn = get_conditioning_fn(CONDITION_SIZE) device = torch.device("cpu") @@ -154,7 +152,6 @@ def test_genrl(): def test_memory_proxy(): - cfn = get_conditioning_fn(CONDITION_SIZE) device = torch.device("cpu") @@ -167,10 +164,10 @@ def test_memory_proxy(): state=DictSpace(spaces={"obs": BoxSpace(dtype=np.float32, shape=(OBSERVATION_SIZE,))}), ) - table = DictObsTable(spaces=space, maxlen=1000, device=device) + memory_table = DictObsMemoryTable(spaces=space, maxlen=1000, device=device) proxy = MemoryProxyWithEncoder( - table=table, + memory_table=memory_table, encoder=encoder_wrapper, minimum_length_threshold=1, use_terminal=True, diff --git a/tests/test_gym_collector.py b/tests/test_gym_collector.py index f23efe89..837b1b1c 100644 --- a/tests/test_gym_collector.py +++ b/tests/test_gym_collector.py @@ -7,8 +7,8 @@ from emote import Trainer from emote.algorithms.sac import FeatureAgentProxy from emote.callback import BatchCallback -from emote.memory import MemoryLoader, TableMemoryProxy -from emote.memory.builder import DictObsTable +from emote.memory import MemoryLoader, MemoryTableProxy +from emote.memory.builder import DictObsMemoryTable from emote.trainer import TrainingShutdownException @@ -85,15 +85,15 @@ def test_gym_collector(): batch_size = 5 rollout_length = 1 # The test only works for rollout_length = 1 env = DictGymWrapper(AsyncVectorEnv(10 * [HitTheMiddle])) - table = DictObsTable( + memory_table = DictObsMemoryTable( spaces=env.dict_space, use_terminal_column=False, maxlen=1000000, device=device, ) - memory_proxy = TableMemoryProxy(table) + memory_proxy = MemoryTableProxy(memory_table) dataloader = MemoryLoader( - table=table, + memory_table=memory_table, rollout_count=batch_size // rollout_length, rollout_length=rollout_length, size_key="batch_size", diff --git a/tests/test_htm.py b/tests/test_htm.py index 6a425b82..fdf502dc 100644 --- a/tests/test_htm.py +++ b/tests/test_htm.py @@ -9,8 +9,8 @@ from emote.callbacks.logging import TerminalLogger from emote.callbacks.testing import FinalRewardTestCheck from emote.extra.onnx_exporter import OnnxExporter -from emote.memory import MemoryLoader, TableMemoryProxy -from emote.memory.builder import DictObsTable +from emote.memory import MemoryLoader, MemoryTableProxy +from emote.memory.builder import DictObsMemoryTable from emote.nn.gaussian_policy import GaussianMlpPolicy as Policy from .gym import DictGymWrapper, HitTheMiddle, SimpleGymCollector @@ -38,9 +38,9 @@ def forward(self, action, obs): def test_htm(): device = torch.device("cpu") env = DictGymWrapper(AsyncVectorEnv(10 * [HitTheMiddle])) - table = DictObsTable(spaces=env.dict_space, maxlen=1000, device=device) - memory_proxy = TableMemoryProxy(table) - dataloader = MemoryLoader(table, 100, 2, "batch_size") + memory_table = DictObsMemoryTable(spaces=env.dict_space, maxlen=1000, device=device) + memory_proxy = MemoryTableProxy(memory_table) + dataloader = MemoryLoader(memory_table, 100, 2, "batch_size") q1 = QNet(2, 1) q2 = QNet(2, 1) @@ -71,9 +71,9 @@ def test_htm(): def test_htm_onnx(tmpdir): device = torch.device("cpu") env = DictGymWrapper(AsyncVectorEnv(10 * [HitTheMiddle])) - table = DictObsTable(spaces=env.dict_space, maxlen=1000, device=device) - memory_proxy = TableMemoryProxy(table) - dataloader = MemoryLoader(table, 100, 2, "batch_size") + memory_table = DictObsMemoryTable(spaces=env.dict_space, maxlen=1000, device=device) + memory_proxy = MemoryTableProxy(memory_table) + dataloader = MemoryLoader(memory_table, 100, 2, "batch_size") q1 = QNet(2, 1) q2 = QNet(2, 1) diff --git a/tests/test_lunar_lander.py b/tests/test_lunar_lander.py index 468871a4..0ce77858 100644 --- a/tests/test_lunar_lander.py +++ b/tests/test_lunar_lander.py @@ -14,8 +14,8 @@ from emote.algorithms.sac import AlphaLoss, FeatureAgentProxy, PolicyLoss, QLoss, QTarget from emote.callbacks.logging import TensorboardLogger from emote.callbacks.testing import FinalLossTestCheck -from emote.memory import MemoryLoader, TableMemoryProxy -from emote.memory.builder import DictObsNStepTable +from emote.memory import MemoryLoader, MemoryTableProxy +from emote.memory.builder import DictObsNStepMemoryTable from emote.nn.gaussian_policy import GaussianPolicyHead from emote.nn.initialization import ortho_init_ @@ -79,14 +79,14 @@ def setup_lunar_lander(): max_grad_norm = 1 env = DictGymWrapper(AsyncVectorEnv([_make_env() for _ in range(n_env)])) - table = DictObsNStepTable( + memory_table = DictObsNStepMemoryTable( spaces=env.dict_space, use_terminal_column=True, maxlen=4_000_000, device=device, ) - memory_proxy = TableMemoryProxy(table, use_terminal=True) - dataloader = MemoryLoader(table, batch_size // rollout_len, rollout_len, "batch_size") + memory_proxy = MemoryTableProxy(memory_table, use_terminal=True) + dataloader = MemoryLoader(memory_table, batch_size // rollout_len, rollout_len, "batch_size") num_actions = env.dict_space.actions.shape[0] num_obs = list(env.dict_space.state.spaces.values())[0].shape[0] @@ -148,7 +148,7 @@ def setup_lunar_lander(): def test_lunar_lander_quick(): - """Quick test that the code runs""" + """Quick test that the code runs.""" experiment_name = "lunar_lander_test_" + str(time.time()) logged_cbs, dataloader = setup_lunar_lander() diff --git a/tests/test_mbrl.py b/tests/test_mbrl.py index 36fdd21b..f8854ba8 100644 --- a/tests/test_mbrl.py +++ b/tests/test_mbrl.py @@ -9,8 +9,8 @@ from emote.algorithms.sac import FeatureAgentProxy from emote.callbacks import BackPropStepsTerminator from emote.extra.schedules import BPStepScheduler -from emote.memory import MemoryLoader, TableMemoryProxy -from emote.memory.builder import DictObsTable +from emote.memory import MemoryLoader, MemoryTableProxy +from emote.memory.builder import DictObsMemoryTable from emote.models.callbacks import LossProgressCheck, ModelBasedCollector, ModelLoss from emote.models.ensemble import EnsembleOfGaussian from emote.models.model import DynamicModel @@ -64,7 +64,7 @@ def create_memory( data_group: str, device: torch.device, ): - """Creates memory and data_loader for the RL training + """Creates memory and data_loader for the RL training. Arguments: space (MDPSpace): the MDP space @@ -74,18 +74,17 @@ def create_memory( data_group (str): the data group for uploading the data device (torch.device): the device to upload the data Returns: - (tuple[TableMemoryProxy, MemoryLoader]): A proxy for the memory and a dataloader - + (tuple[MemoryTableProxy, MemoryLoader]): A proxy for the memory and a dataloader """ - table = DictObsTable( + memory_table = DictObsMemoryTable( spaces=space, use_terminal_column=False, maxlen=memory_size, device=device, ) - memory_proxy = TableMemoryProxy(table=table, use_terminal=False) + memory_proxy = MemoryTableProxy(memory_table=memory_table, use_terminal=False) data_loader = MemoryLoader( - table=table, + memory_table=memory_table, rollout_count=batch_size // len_rollout, rollout_length=len_rollout, size_key="batch_size", @@ -100,15 +99,14 @@ def create_memory( def test_model_collector(): - """The function tests unrolling a dynamic model and storing the rollouts in a replay buffer. - The fake dynamic model simply multiplies the inputs by a fixed (rand) number, i.e., - next_obs = obs x rand_number, - rewards = actions x rand_number. + """The function tests unrolling a dynamic model and storing the rollouts in + a replay buffer. The fake dynamic model simply multiplies the inputs by a + fixed (rand) number, i.e., next_obs = obs x rand_number, rewards = actions + x rand_number. The test checks the following: * the replay buffer contains a correct number of samples, * stored samples are the ones generated by the fake model. - """ batch_size = 10 rollout_size = 5 @@ -166,17 +164,19 @@ def test_model_collector(): def test_ensemble_training(): - """The function tests ensemble training. The test will pass if the loss goes down according - to the given criterion. + """The function tests ensemble training. + + The test will pass if the loss goes down according to the given + criterion. """ device = torch.device("cpu") batch_size = 200 rollout_length = 1 env = DictGymWrapper(AsyncVectorEnv(10 * [HitTheMiddle])) - table = DictObsTable(spaces=env.dict_space, maxlen=10000, device=device) - memory_proxy = TableMemoryProxy(table) + table = DictObsMemoryTable(spaces=env.dict_space, maxlen=10000, device=device) + memory_proxy = MemoryTableProxy(table) dataloader = MemoryLoader( - table=table, + memory_table=table, rollout_count=batch_size // rollout_length, rollout_length=rollout_length, size_key="batch_size", diff --git a/tests/test_memory_exporter.py b/tests/test_memory_exporter.py index 48e526b9..ffcae718 100644 --- a/tests/test_memory_exporter.py +++ b/tests/test_memory_exporter.py @@ -10,8 +10,8 @@ from emote import Trainer from emote.algorithms.sac import FeatureAgentProxy from emote.callbacks import BackPropStepsTerminator -from emote.memory import MemoryExporterProxyWrapper, MemoryLoader, TableMemoryProxy -from emote.memory.builder import DictObsTable +from emote.memory import MemoryExporterProxyWrapper, MemoryLoader, MemoryTableProxy +from emote.memory.builder import DictObsMemoryTable from emote.memory.callbacks import MemoryImporterCallback from emote.memory.storage import BaseStorage from emote.nn.gaussian_policy import GaussianMlpPolicy as Policy @@ -24,8 +24,8 @@ def test_memory_export(tmpdir): device = torch.device("cpu") env = DictGymWrapper(AsyncVectorEnv(10 * [HitTheMiddle])) - table = DictObsTable(spaces=env.dict_space, maxlen=10000, device=device) - memory_proxy = TableMemoryProxy(table) + memory_table = DictObsMemoryTable(spaces=env.dict_space, maxlen=10000, device=device) + memory_proxy = MemoryTableProxy(memory_table) memory_proxy = MemoryExporterProxyWrapper( memory=memory_proxy, target_memory_name="memory", @@ -33,7 +33,7 @@ def test_memory_export(tmpdir): experiment_root_path=tmpdir, min_time_per_export=1, ) - dataloader = MemoryLoader(table, 100, 2, "batch_size") + dataloader = MemoryLoader(memory_table, 100, 2, "batch_size") policy = Policy(2, 1, [N_HIDDEN, N_HIDDEN]) agent_proxy = FeatureAgentProxy(policy, device) @@ -46,18 +46,18 @@ def test_memory_export(tmpdir): trainer.train() importer = MemoryImporterCallback( - memory=DictObsTable(spaces=env.dict_space, maxlen=10000, device=device), + memory_table=DictObsMemoryTable(spaces=env.dict_space, maxlen=10000, device=device), target_memory_name="memory", experiment_load_dir=tmpdir, ) - importer.memory.restore(os.path.join(tmpdir, "memory_export")) + importer.memory_table.restore(os.path.join(tmpdir, "memory_export")) - for column in importer.memory._columns.values(): - if isinstance(importer.memory._data[column.name], BaseStorage): - for key in importer.memory._data[column.name]: + for column in importer.memory_table._columns.values(): + if isinstance(importer.memory_table._data[column.name], BaseStorage): + for key in importer.memory_table._data[column.name]: assert ( - importer.memory._data[column.name][key].all() + importer.memory_table._data[column.name][key].all() == memory_proxy._inner._table._data[column.name][key].all() ) @@ -68,8 +68,8 @@ def test_memory_export(tmpdir): def test_memory_export_permissions(tmpdir): device = torch.device("cpu") env = DictGymWrapper(AsyncVectorEnv(10 * [HitTheMiddle])) - table = DictObsTable(spaces=env.dict_space, maxlen=10000, device=device) - memory_proxy = TableMemoryProxy(table) + memory_table = DictObsMemoryTable(spaces=env.dict_space, maxlen=10000, device=device) + memory_proxy = MemoryTableProxy(memory_table) memory_proxy = MemoryExporterProxyWrapper( memory=memory_proxy, target_memory_name="memory", @@ -77,7 +77,7 @@ def test_memory_export_permissions(tmpdir): experiment_root_path=tmpdir, min_time_per_export=1, ) - dataloader = MemoryLoader(table, 100, 2, "batch_size") + dataloader = MemoryLoader(memory_table, 100, 2, "batch_size") policy = Policy(2, 1, [N_HIDDEN, N_HIDDEN]) agent_proxy = FeatureAgentProxy(policy, device) diff --git a/tests/test_memory_exports.py b/tests/test_memory_exports.py index e1f6a2d6..e7b5e4f1 100644 --- a/tests/test_memory_exports.py +++ b/tests/test_memory_exports.py @@ -7,7 +7,7 @@ from emote.memory.column import Column, VirtualColumn from emote.memory.fifo_strategy import FifoEjectionStrategy from emote.memory.storage import SyntheticDones -from emote.memory.table import ArrayTable, TableSerializationVersion +from emote.memory.table import ArrayMemoryTable, TableSerializationVersion from emote.memory.uniform_strategy import UniformSampleStrategy @@ -32,7 +32,7 @@ def memory(): ), ] - memory = ArrayTable( + memory_table = ArrayMemoryTable( columns=spec, maxlen=10_000, sampler=UniformSampleStrategy(), @@ -41,7 +41,7 @@ def memory(): device="cpu", ) - return memory + return memory_table def test_export_base(memory, tmpdir): diff --git a/tests/test_memory_loading.py b/tests/test_memory_loading.py index 6598eacc..171ef335 100644 --- a/tests/test_memory_loading.py +++ b/tests/test_memory_loading.py @@ -4,13 +4,13 @@ from emote.memory.column import Column from emote.memory.fifo_strategy import FifoEjectionStrategy from emote.memory.memory import JointMemoryLoader, JointMemoryLoaderWithDataGroup, MemoryLoader -from emote.memory.table import ArrayTable +from emote.memory.table import ArrayMemoryTable from emote.memory.uniform_strategy import UniformSampleStrategy @pytest.fixture def a_dummy_table(): - tab = ArrayTable( + memory_table = ArrayMemoryTable( columns=[Column("state", (), np.float32), Column("action", (), np.float32)], maxlen=1_000, sampler=UniformSampleStrategy(), @@ -18,7 +18,7 @@ def a_dummy_table(): length_key="action", device="cpu", ) - tab.add_sequence( + memory_table.add_sequence( 0, { "state": [5.0, 6.0], @@ -26,12 +26,12 @@ def a_dummy_table(): }, ) - return tab + return memory_table @pytest.fixture def another_dummy_table(): - tab = ArrayTable( + memory_table = ArrayMemoryTable( columns=[Column("state", (), np.float32), Column("action", (), np.float32)], maxlen=1_000, sampler=UniformSampleStrategy(), @@ -39,7 +39,7 @@ def another_dummy_table(): length_key="action", device="cpu", ) - tab.add_sequence( + memory_table.add_sequence( 0, { "state": [5.0, 6.0], @@ -47,19 +47,21 @@ def another_dummy_table(): }, ) - return tab + return memory_table -def test_joint_memory_loader(a_dummy_table: ArrayTable, another_dummy_table: ArrayTable): +def test_joint_memory_loader( + a_dummy_table: ArrayMemoryTable, another_dummy_table: ArrayMemoryTable +): a_loader = MemoryLoader( - table=a_dummy_table, + memory_table=a_dummy_table, rollout_count=1, rollout_length=1, size_key="batch_size", data_group="a", ) another_loader = MemoryLoader( - table=another_dummy_table, + memory_table=another_dummy_table, rollout_count=1, rollout_length=1, size_key="batch_size", @@ -72,16 +74,18 @@ def test_joint_memory_loader(a_dummy_table: ArrayTable, another_dummy_table: Arr assert "a" in data and "another" in data, "JointMemoryLoader did not yield expected memory data" -def test_joint_memory_loader_datagroup(a_dummy_table: ArrayTable, another_dummy_table: ArrayTable): +def test_joint_memory_loader_datagroup( + a_dummy_table: ArrayMemoryTable, another_dummy_table: ArrayMemoryTable +): a_loader = MemoryLoader( - table=a_dummy_table, + memory_table=a_dummy_table, rollout_count=1, rollout_length=1, size_key="batch_size", data_group="a", ) another_loader = MemoryLoader( - table=another_dummy_table, + memory_table=another_dummy_table, rollout_count=1, rollout_length=1, size_key="batch_size", @@ -103,16 +107,16 @@ def test_joint_memory_loader_datagroup(a_dummy_table: ArrayTable, another_dummy_ ), "Expected joint dataloader to actually place data in its datagroup, but it is empty." -def test_joint_memory_loader_nonunique_loaders_trigger_exception(a_dummy_table: ArrayTable): +def test_joint_memory_loader_nonunique_loaders_trigger_exception(a_dummy_table: ArrayMemoryTable): loader1 = MemoryLoader( - table=a_dummy_table, + memory_table=a_dummy_table, rollout_count=1, rollout_length=1, size_key="batch_size", data_group="a", ) loader2 = MemoryLoader( - table=a_dummy_table, + memory_table=a_dummy_table, rollout_count=1, rollout_length=1, size_key="batch_size", diff --git a/tests/test_memory_logger.py b/tests/test_memory_logger.py index e1a888e3..0ec0ee8a 100644 --- a/tests/test_memory_logger.py +++ b/tests/test_memory_logger.py @@ -1,12 +1,17 @@ -from __future__ import annotations +from os.path import join +from typing import Generator import pytest +import torch from gymnasium.vector import AsyncVectorEnv from torch.utils.tensorboard import SummaryWriter -from emote.memory import LoggingProxyWrapper, TableMemoryProxy -from emote.memory.builder import DictObsTable +from emote import Trainer +from emote.callbacks.checkpointing import Checkpointer, CheckpointLoader +from emote.memory import LoggingProxyWrapper, MemoryTableProxy +from emote.memory.builder import DictObsMemoryTable +from emote.trainer import TrainingShutdownException from emote.typing import DictObservation, DictResponse, EpisodeState, MetaData from .gym import DictGymWrapper, HitTheMiddle @@ -15,8 +20,8 @@ @pytest.fixture def table_proxy(): env = DictGymWrapper(AsyncVectorEnv(10 * [HitTheMiddle])) - table = DictObsTable(spaces=env.dict_space, maxlen=1000, device="cpu") - return TableMemoryProxy(table, 0, False) + table = DictObsMemoryTable(spaces=env.dict_space, maxlen=1000, device="cpu") + return MemoryTableProxy(table, 0, False) def test_construct(table_proxy, tmpdir): @@ -191,3 +196,73 @@ def test_end_cycle(table_proxy, tmpdir): state = EpisodeState.RUNNING if s < 8 else EpisodeState.TERMINAL proxy._end_cycle() + + +def test_checkpoints(table_proxy, tmpdir): + def random_onestep_dataloader() -> Generator: + yield { + "default": { + "observation": {"obs": torch.rand(3, 2)}, + "actions": torch.rand(3, 1), + "q_target": torch.ones(3, 1), + }, + } + raise TrainingShutdownException() + + def nostep_dataloader() -> Generator: + raise TrainingShutdownException() + yield {} # Needed to make this a generator. + + proxy1 = LoggingProxyWrapper( + table_proxy, + SummaryWriter( + log_dir=tmpdir, + ), + 2, + ) + + state = EpisodeState.INITIAL + for s in range(10): + proxy1.add( + { + 0: DictObservation( + episode_state=state, + array_data={"obs": [1.0]}, + rewards={"reward": None}, + metadata=MetaData(info={"episode/reward": 10.0}, info_lists={}), + ) + }, + {0: DictResponse({"actions": [0.0]}, {})} if s < 9 else {}, + ) + + state = EpisodeState.RUNNING if s < 8 else EpisodeState.TERMINAL + + assert proxy1.completed_episodes == 1 + + run_root = join(tmpdir, "chkpt") + c1 = [ + Checkpointer(restorees=[proxy1], run_root=run_root, checkpoint_interval=1), + ] + + t1 = Trainer(c1, random_onestep_dataloader()) + t1.state["inf_step"] = 0 + t1.state["bp_step"] = 0 + t1.state["batch_size"] = 0 + t1.train() + proxy2 = LoggingProxyWrapper( + table_proxy, + SummaryWriter( + log_dir=tmpdir, + ), + 2, + ) + + assert proxy2.completed_episodes == 0 + + c2 = [ + CheckpointLoader(restorees=[proxy2], run_root=run_root, checkpoint_index=0), + ] + t2 = Trainer(c2, nostep_dataloader()) + t2.train() + + assert proxy2.completed_episodes == 1 diff --git a/tests/test_memory_sampling.py b/tests/test_memory_sampling.py index bc18268c..2395cc2b 100644 --- a/tests/test_memory_sampling.py +++ b/tests/test_memory_sampling.py @@ -1,5 +1,6 @@ -""" -Test to validate the behavior of `CoverageBasedSampleStrategy`. Tests how the `alpha` parameter influences the sampling distribution between two waves of data. +"""Test to validate the behavior of `CoverageBasedSampleStrategy`. Tests how +the `alpha` parameter influences the sampling distribution between two waves of +data. Wave 1 and Wave 2: Two separate sets of data points added to the memory. After each wave, a series of samples are drawn from the memory. @@ -14,7 +15,7 @@ import numpy as np import torch -from emote.memory.builder import DictObsNStepTable +from emote.memory.builder import DictObsNStepMemoryTable from emote.memory.coverage_based_strategy import CoverageBasedSampleStrategy from emote.utils.spaces import BoxSpace, DictSpace, MDPSpace @@ -34,7 +35,7 @@ def create_sample_space() -> MDPSpace: return MDPSpace(rewards=reward_space, actions=action_space, state=state_space) -def populate_table(table: DictObsNStepTable, sequence_len: int, start: int, end: int): +def populate_table(memory_table: DictObsNStepMemoryTable, sequence_len: int, start: int, end: int): for i in range(start, end): sequence = { "obs": [np.random.rand(2) for _ in range(sequence_len + 1)], @@ -42,22 +43,24 @@ def populate_table(table: DictObsNStepTable, sequence_len: int, start: int, end: "rewards": [np.random.rand(1) for _ in range(sequence_len)], } - table.add_sequence( + memory_table.add_sequence( identity=i, sequence=sequence, ) -def sample_table(table: DictObsNStepTable, sample_amount: int, count: int, sequence_length: int): +def sample_table( + memory_table: DictObsNStepMemoryTable, sample_amount: int, count: int, sequence_length: int +): for _ in range(sample_amount): - table.sample(count, sequence_length) + memory_table.sample(count, sequence_length) def test_memory_export(): device = torch.device("cpu") space = create_sample_space() for alpha in ALPHAS: - table = DictObsNStepTable( + memory_table = DictObsNStepMemoryTable( spaces=space, use_terminal_column=False, maxlen=TABLE_MAX_LEN, @@ -68,23 +71,32 @@ def test_memory_export(): wave_length = int(TABLE_MAX_LEN / (2 * SEQUENCE_LEN)) # Wave 1 - populate_table(table=table, sequence_len=SEQUENCE_LEN, start=0, end=wave_length) - sample_table(table=table, sample_amount=SAMPLE_AMOUNT, count=5, sequence_length=8) - pre_second_wave_sample_counts = table._sampler._sample_count.copy() + populate_table( + memory_table=memory_table, sequence_len=SEQUENCE_LEN, start=0, end=wave_length + ) + sample_table( + memory_table=memory_table, sample_amount=SAMPLE_AMOUNT, count=5, sequence_length=8 + ) + pre_second_wave_sample_counts = memory_table._sampler._sample_count.copy() # Wave 2 populate_table( - table=table, sequence_len=SEQUENCE_LEN, start=wave_length, end=wave_length * 2 + memory_table=memory_table, + sequence_len=SEQUENCE_LEN, + start=wave_length, + end=wave_length * 2, + ) + sample_table( + memory_table=memory_table, sample_amount=SAMPLE_AMOUNT, count=5, sequence_length=8 ) - sample_table(table=table, sample_amount=SAMPLE_AMOUNT, count=5, sequence_length=8) second_wave_samples = sum( - table._sampler._sample_count[id] - pre_second_wave_sample_counts.get(id, 0) + memory_table._sampler._sample_count[id] - pre_second_wave_sample_counts.get(id, 0) for id in range(wave_length, wave_length * 2) ) total_new_samples = sum( - table._sampler._sample_count[id] - pre_second_wave_sample_counts.get(id, 0) - for id in table._sampler._sample_count.keys() + memory_table._sampler._sample_count[id] - pre_second_wave_sample_counts.get(id, 0) + for id in memory_table._sampler._sample_count.keys() ) proportion_second_wave = second_wave_samples / total_new_samples diff --git a/tests/test_modified_adamw.py b/tests/test_modified_adamw.py index d17249b7..9af3b1eb 100644 --- a/tests/test_modified_adamw.py +++ b/tests/test_modified_adamw.py @@ -58,7 +58,8 @@ def num_groups(param_groups): def test_module_separation(): - """Validate that all parameters are added to either "decay" or "no_decay".""" + """Validate that all parameters are added to either "decay" or + "no_decay".""" q = QNet(2, 2, [2, 2]) decay, no_decay = separate_modules_for_weight_decay( diff --git a/tests/test_next_n_element_wrapper.py b/tests/test_next_n_element_wrapper.py index f2d76c4d..95667add 100644 --- a/tests/test_next_n_element_wrapper.py +++ b/tests/test_next_n_element_wrapper.py @@ -52,3 +52,42 @@ def test_next_n_element_tuple(batch_dim, n, storage): assert np.all(next_0_0 == storage[batch_dim][(n, n)]) assert np.all(next_1_0 == storage[batch_dim][(1 + n, n)]) assert np.all(next_1_1 == storage[batch_dim][(1 + n, 1 + n)]) + + +@pytest.mark.parametrize(("batch_dim", "n"), ((0, 2), (1, 2))) +def test_next_n_element_access_single_out_of_bounds_raises(batch_dim, n, storage): + wrapper = NextNElementWrapper.with_n(n)(storage, (1,), np.float32)[batch_dim] + array_len = storage.shape[1] + + with pytest.raises(IndexError): + wrapper[array_len - 2] + with pytest.raises(IndexError): + wrapper[array_len - 1] + with pytest.raises(IndexError): + wrapper[array_len] + with pytest.raises(IndexError): + wrapper[array_len + 1] + + +@pytest.mark.parametrize(("batch_dim", "n"), ((0, 2), (1, 2))) +def test_next_n_element_access_slice_out_of_bounds_raises(batch_dim, n, storage): + wrapper = NextNElementWrapper.with_n(n)(storage, (1,), np.float32)[batch_dim] + array_len = storage.shape[1] + + with pytest.raises(IndexError): + wrapper[array_len - 2 : array_len] + with pytest.raises(IndexError): + wrapper[array_len + 2 : array_len + 4] + + +@pytest.mark.parametrize(("batch_dim", "n"), ((0, 2), (1, 2))) +def test_next_n_element_access_tuple_out_of_bounds_raises(batch_dim, n, storage): + storage = np.reshape(storage, (2, 4, 4)) + + wrapper = NextNElementWrapper.with_n(n)(storage, (1,), np.float32)[batch_dim] + + with pytest.raises(IndexError): + wrapper[(3, 3)] + + with pytest.raises(IndexError): + wrapper[(4, 4)] diff --git a/tests/test_system_logger.py b/tests/test_system_logger.py index 288b203b..b2eec67f 100644 --- a/tests/test_system_logger.py +++ b/tests/test_system_logger.py @@ -19,4 +19,4 @@ def test_records_all_metrics(): # we allocated 2 M ints, each 28 bytes large. assert logger.scalar_logs["system/ram_usage_growth_mb_step"] > (2 * 28) # we just pinned the thread for 1 second so this should be close to 100 - assert logger.scalar_logs["system/cpu_load"] > 80.0 + assert logger.scalar_logs["system/cpu_load"] > 10.0 diff --git a/tests/test_table.py b/tests/test_table.py index 1a41cd73..8124c623 100644 --- a/tests/test_table.py +++ b/tests/test_table.py @@ -5,7 +5,7 @@ from emote.memory.adaptors import TerminalAdaptor from emote.memory.fifo_strategy import FifoEjectionStrategy from emote.memory.storage import SyntheticDones -from emote.memory.table import ArrayTable, Column, TagColumn, VirtualColumn +from emote.memory.table import ArrayMemoryTable, Column, TagColumn, VirtualColumn from emote.memory.uniform_strategy import UniformSampleStrategy @@ -25,7 +25,7 @@ def table(): TagColumn(name="terminal", shape=(), dtype=np.float32), ] - table = ArrayTable( + memory_table = ArrayMemoryTable( columns=spec, maxlen=10_000, sampler=UniformSampleStrategy(), @@ -35,10 +35,10 @@ def table(): device="cpu", ) - return table + return memory_table -def test_sampled_data_is_always_copied(table: ArrayTable): +def test_sampled_data_is_always_copied(table: ArrayMemoryTable): for ii in range(0, 600): table.add_sequence( ii, diff --git a/torch.lock b/torch.lock deleted file mode 100644 index d4a322b2..00000000 --- a/torch.lock +++ /dev/null @@ -1,59 +0,0 @@ -[cu116] -[cu116.metadata] -groups = [] -strategy = ["static_urls"] - -[[cu116.package]] -name = "torch" -version = "1.12.0+cu116" -requires_python = ">=3.7.0" -summary = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" -dependencies = [ - "typing-extensions", -] -files = [ - {url = "https://download.pytorch.org/whl/cu116/torch-1.12.0%2Bcu116-cp310-cp310-linux_x86_64.whl", hash = "sha256:74f5b137190a6face6859d630f129289e7fae6a4d9a747430b3b5d5c6297a3ae"}, - {url = "https://download.pytorch.org/whl/cu116/torch-1.12.0%2Bcu116-cp310-cp310-win_amd64.whl", hash = "sha256:97d63afcb6358071737f8325aa933e9db2f30cd2f068591d27d4ea72f3cabad2"}, -] - -[[cu116.package]] -name = "typing-extensions" -version = "4.8.0" -requires_python = ">=3.8" -summary = "Backported and Experimental Type Hints for Python 3.8+" -files = [ - {url = "https://files.pythonhosted.org/packages/1f/7a/8b94bb016069caa12fc9f587b28080ac33b4fbb8ca369b98bc0a4828543e/typing_extensions-4.8.0.tar.gz", hash = "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef"}, - {url = "https://files.pythonhosted.org/packages/24/21/7d397a4b7934ff4028987914ac1044d3b7d52712f30e2ac7a2ae5bc86dd0/typing_extensions-4.8.0-py3-none-any.whl", hash = "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0"}, -] - -[cpu] -[cpu.metadata] -groups = [] -strategy = ["static_urls"] - -[[cpu.package]] -name = "torch" -version = "1.12.0+cpu" -requires_python = ">=3.7.0" -summary = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" -dependencies = [ - "typing-extensions", -] -files = [ - {url = "https://download.pytorch.org/whl/cpu/torch-1.12.0%2Bcpu-cp310-cp310-linux_x86_64.whl", hash = "sha256:37f14f640b91effe41db244b932c2dd697ca2b51ae241a534259b9d9f7f51f6f"}, - {url = "https://download.pytorch.org/whl/cpu/torch-1.12.0%2Bcpu-cp310-cp310-win_amd64.whl", hash = "sha256:69afe17ea3f1bd3dd5c88ede3e275c7395463293739965e9b206f94c575d8c99"}, -] - -[[cpu.package]] -name = "typing-extensions" -version = "4.8.0" -requires_python = ">=3.8" -summary = "Backported and Experimental Type Hints for Python 3.8+" -files = [ - {url = "https://files.pythonhosted.org/packages/1f/7a/8b94bb016069caa12fc9f587b28080ac33b4fbb8ca369b98bc0a4828543e/typing_extensions-4.8.0.tar.gz", hash = "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef"}, - {url = "https://files.pythonhosted.org/packages/24/21/7d397a4b7934ff4028987914ac1044d3b7d52712f30e2ac7a2ae5bc86dd0/typing_extensions-4.8.0-py3-none-any.whl", hash = "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0"}, -] - -[metadata] -lock_version = "4.4" -content_hash = "sha256:ccf14072947761c5b620a20b89e0c260ac3823f0904b37a23f6e596f628306ed"