diff --git a/.github/workflows/add-issues-to-octue-board.yml b/.github/workflows/add-issues-to-octue-board.yml index bce55eae7..daf9f0165 100644 --- a/.github/workflows/add-issues-to-octue-board.yml +++ b/.github/workflows/add-issues-to-octue-board.yml @@ -6,6 +6,10 @@ on: jobs: add-issues-to-octue-board: - uses: octue/.github/.github/workflows/reusable-add-issues-to-octue-board.yml@main - secrets: - github-token: ${{ secrets.PROJECT_AUTOMATION_GITHUB_TOKEN_2 }} + runs-on: ubuntu-latest + steps: + - name: Add to Board + uses: actions/add-to-project@v0.5.0 + with: + project-url: https://github.com/orgs/octue/projects/22 + github-token: ${{ secrets.OCTUE_PROJECT_ISSUES_TOKEN }} diff --git a/.github/workflows/python-ci.yml b/.github/workflows/python-ci.yml index 9b4414a51..6ee800108 100644 --- a/.github/workflows/python-ci.yml +++ b/.github/workflows/python-ci.yml @@ -77,6 +77,9 @@ jobs: if: "!contains(github.event.head_commit.message, 'skipci')" runs-on: ubuntu-latest needs: [check-semantic-version, run-tests] + permissions: + id-token: write + contents: read steps: - name: Checkout Repository uses: actions/checkout@v3 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index de591556d..38b4f8d35 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -101,24 +101,3 @@ jobs: - name: Publish package distributions to PyPI uses: pypa/gh-action-pypi-publish@v1.8.10 - - docker: - runs-on: ubuntu-latest - needs: [run-tests, release] - timeout-minutes: 300 - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Log in to DockerHub - uses: docker/login-action@v1 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - - name: Build and push - uses: docker/build-push-action@v2.8.0 - with: - context: . - push: true - tags: octue/octue-sdk-python:${{ needs.run-tests.outputs.package_version }}-slim,octue/octue-sdk-python:latest diff --git a/.readthedocs.yaml b/.readthedocs.yaml new file mode 100644 index 000000000..71a0bcbdb --- /dev/null +++ b/.readthedocs.yaml @@ -0,0 +1,16 @@ +# Read the Docs configuration file for Sphinx projects +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +version: 2 + +build: + os: ubuntu-22.04 + tools: + python: "3.10" + +sphinx: + configuration: docs/source/conf.py + +python: + install: + - requirements: docs/requirements.txt diff --git a/docs/source/asking_questions.rst b/docs/source/asking_questions.rst index 4c918dcf0..129cf59d9 100644 --- a/docs/source/asking_questions.rst +++ b/docs/source/asking_questions.rst @@ -48,7 +48,7 @@ You can also set the following options when you call :mod:`Child.ask `_. Up until version ``0.51.0``, services running nearly +all versions of ``octue`` could communicate with each other compatibly. To allow a significant infrastructure upgrade, +version ``0.51.0`` introduced a number of breaking changes to the standard meaning services running ``0.51.0`` or +greater are only able to communicate with other services running ``0.51.0`` or greater. The table below shows which +``octue`` versions parents can run (rows) to send questions compatible with versions children are running (columns). +Note that this table does not display whether children's responses are compatible with the parent, just that a child is +able to accept a question. **Key** - ``0`` = incompatible - ``1`` = compatible -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| | 0.50.1 | 0.50.0 | 0.49.2 | 0.49.1 | 0.49.0 | 0.48.0 | 0.47.2 | 0.47.1 | 0.47.0 | 0.46.3 | 0.46.2 | 0.46.1 | 0.46.0 | 0.45.0 | 0.44.0 | 0.43.7 | 0.43.6 | 0.43.5 | 0.43.4 | 0.43.3 | 0.43.2 | 0.43.1 | 0.43.0 | 0.42.1 | 0.42.0 | 0.41.1 | 0.41.0 | 0.40.2 | 0.40.1 | 0.40.0 | 0.39.0 | 0.38.1 | 0.38.0 | 0.37.0 | 0.36.0 | 0.35.0 | 0.34.1 | 0.34.0 | 0.33.0 | 0.32.0 | 0.31.0 | 0.30.0 | 0.29.9 | 0.29.8 | 0.29.7 | 0.29.6 | 0.29.5 | 0.29.4 | 0.29.3 | 0.29.2 | 0.29.11 | 0.29.10 | 0.29.1 | 0.29.0 | 0.28.2 | 0.28.1 | 0.28.0 | 0.27.3 | 0.27.2 | 0.27.1 | 0.27.0 | 0.26.2 | 0.26.1 | 0.26.0 | 0.25.0 | 0.24.1 | 0.24.0 | 0.23.6 | 0.23.5 | 0.23.4 | 0.23.3 | 0.23.2 | 0.23.1 | 0.23.0 | 0.22.1 | 0.22.0 | 0.21.0 | 0.20.0 | 0.19.0 | 0.18.2 | 0.18.1 | 0.18.0 | 0.17.0 | 0.16.0 | -+=========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+===========+===========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+ -| 0.50.1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.50.0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.49.2 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.49.1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.49.0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.48.0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.47.2 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.47.1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.47.0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.46.3 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.46.2 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.46.1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.46.0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.45.0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.44.0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.43.7 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.43.6 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.43.5 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.43.4 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.43.3 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.43.2 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.43.1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.43.0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.42.1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.42.0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.41.1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.41.0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.40.2 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.40.1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.40.0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.39.0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.38.1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.38.0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.37.0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.36.0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.35.0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.34.1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.34.0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.33.0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.32.0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.31.0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.30.0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.29.9 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.29.8 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.29.7 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.29.6 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.29.5 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.29.4 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.29.3 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.29.2 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.29.11 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.29.10 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.29.1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.29.0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.28.2 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.28.1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.28.0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.27.3 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.27.2 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.27.1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.27.0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.26.2 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.26.1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.26.0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.25.0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.24.1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.24.0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.23.6 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.23.5 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.23.4 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.23.3 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.23.2 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.23.1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.23.0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.22.1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.22.0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.21.0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.20.0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.19.0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.18.2 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.18.1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.18.0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.17.0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.16.0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| | 0.51.0 | 0.50.1 | 0.50.0 | 0.49.2 | 0.49.1 | 0.49.0 | 0.48.0 | 0.47.2 | 0.47.1 | 0.47.0 | 0.46.3 | 0.46.2 | 0.46.1 | 0.46.0 | 0.45.0 | 0.44.0 | 0.43.7 | 0.43.6 | 0.43.5 | 0.43.4 | 0.43.3 | 0.43.2 | 0.43.1 | 0.43.0 | 0.42.1 | 0.42.0 | 0.41.1 | 0.41.0 | 0.40.2 | 0.40.1 | 0.40.0 | 0.39.0 | 0.38.1 | 0.38.0 | 0.37.0 | 0.36.0 | 0.35.0 | 0.34.1 | 0.34.0 | 0.33.0 | 0.32.0 | 0.31.0 | 0.30.0 | ++========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+ +| 0.51.0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.50.1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.50.0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.49.2 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.49.1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.49.0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.48.0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.47.2 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.47.1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.47.0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.46.3 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.46.2 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.46.1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.46.0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.45.0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.44.0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.43.7 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.43.6 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.43.5 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.43.4 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.43.3 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.43.2 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.43.1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.43.0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.42.1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.42.0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.41.1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.41.0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.40.2 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.40.1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.40.0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.39.0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.38.1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.38.0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.37.0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.36.0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.35.0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.34.1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.34.0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.33.0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.32.0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.31.0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.30.0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ diff --git a/docs/source/services.rst b/docs/source/services.rst index b83f719d5..2a71acd72 100644 --- a/docs/source/services.rst +++ b/docs/source/services.rst @@ -88,3 +88,12 @@ They look like ``namespace/name:tag`` where the tag is often a semantic version name. It can be used to ask a question to a service without specifying a specific revision of it. This enables asking questions to, for example, the service ``octue/my-service`` and automatically having them routed to its default (usually latest) revision. :ref:`See here for more info`. + + +Service communication standard +============================== + +Octue services communicate according to the service communication standard. The JSON schema defining this can be found +`here `_. Messages received by services are validated against it +and invalid messages are rejected. The schema is in beta, so (rare) breaking changes are reflected in the minor version +number. diff --git a/docs/source/troubleshooting_services.rst b/docs/source/troubleshooting_services.rst index fd20b598e..e861a572d 100644 --- a/docs/source/troubleshooting_services.rst +++ b/docs/source/troubleshooting_services.rst @@ -15,7 +15,7 @@ Services save the following data to the cloud if they crash while processing a q .. important:: - For this feature to be enabled, the child must have the ``crash_diagnostics_cloud_path`` field in its service + For this feature to be enabled, the child must have the ``diagnostics_cloud_path`` field in its service configuration (:ref:`octue.yaml ` file) set to a Google Cloud Storage path. @@ -111,7 +111,7 @@ your service to fail. Disabling crash diagnostics =========================== When asking a question to a child, parents can disable crash diagnostics upload in the child on a question-by-question -basis by setting ``allow_save_diagnostics_data_on_crash`` to ``False`` in :mod:`Child.ask `. +basis by setting ``save_diagnostics`` to ``"SAVE_DIAGNOSTICS_OFF"`` in :mod:`Child.ask `. For example: .. code-block:: python @@ -123,5 +123,5 @@ For example: answer = child.ask( input_values={"height": 32, "width": 3}, - allow_save_diagnostics_data_on_crash=False, + save_diagnostics="SAVE_DIAGNOSTICS_OFF", ) diff --git a/octue/__init__.py b/octue/__init__.py index 877d997da..138e91f2c 100644 --- a/octue/__init__.py +++ b/octue/__init__.py @@ -5,6 +5,7 @@ __all__ = ("Runner",) + REPOSITORY_ROOT = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) diff --git a/octue/cli.py b/octue/cli.py index 0713bc3d9..643209551 100644 --- a/octue/cli.py +++ b/octue/cli.py @@ -12,7 +12,7 @@ from octue.cloud import storage from octue.cloud.pub_sub import Subscription, Topic -from octue.cloud.pub_sub.service import Service +from octue.cloud.pub_sub.service import PARENT_SENDER_TYPE, Service from octue.cloud.service_id import convert_service_id_to_pub_sub_form, create_sruid, get_sruid_parts from octue.cloud.storage import GoogleCloudStorageClient from octue.configuration import load_service_and_app_configuration @@ -22,7 +22,6 @@ from octue.resources import Manifest, service_backends from octue.runner import Runner from octue.utils.encoders import OctueJSONEncoder -from twined import Twine logger = logging.getLogger(__name__) @@ -129,16 +128,7 @@ def run(service_config, input_dir, output_file, output_manifest_file, monitor_me if os.path.exists(input_manifest_path): input_manifest = input_manifest_path - runner = Runner( - app_src=service_configuration.app_source_path, - twine=Twine(source=service_configuration.twine_path), - configuration_values=app_configuration.configuration_values, - configuration_manifest=app_configuration.configuration_manifest, - children=app_configuration.children, - output_location=app_configuration.output_location, - crash_diagnostics_cloud_path=service_configuration.crash_diagnostics_cloud_path, - service_registries=service_configuration.service_registries, - ) + runner = Runner.from_configuration(service_configuration=service_configuration, app_configuration=app_configuration) if monitor_messages_file: if not os.path.exists(os.path.dirname(monitor_messages_file)): @@ -229,14 +219,9 @@ def start(service_config, revision_tag, timeout, no_rm): revision_tag=service_revision_tag_override or service_revision_tag, ) - runner = Runner( - app_src=service_configuration.app_source_path, - twine=Twine(source=service_configuration.twine_path), - configuration_values=app_configuration.configuration_values, - configuration_manifest=app_configuration.configuration_manifest, - children=app_configuration.children, - output_location=app_configuration.output_location, - crash_diagnostics_cloud_path=service_configuration.crash_diagnostics_cloud_path, + runner = Runner.from_configuration( + service_configuration=service_configuration, + app_configuration=app_configuration, service_id=service_sruid, ) @@ -296,12 +281,12 @@ def start(service_config, revision_tag, timeout, no_rm): @click.option( "--download-datasets", is_flag=True, - help="If provided, download any datasets from the crash diagnostics and update their paths in the configuration and " + help="If provided, download any datasets from the diagnostics and update their paths in the configuration and " "input manifests to the new local paths.", ) -def get_crash_diagnostics(cloud_path, local_path, download_datasets): - """Download crash diagnostics for an analysis from the given directory in Google Cloud Storage. The cloud path - should end in the analysis ID. +def get_diagnostics(cloud_path, local_path, download_datasets): + """Download diagnostics for a question from the given directory in Google Cloud Storage. The cloud path should end + in the question ID. CLOUD_PATH: The path to the directory in Google Cloud Storage containing the diagnostics data. """ @@ -344,7 +329,7 @@ def get_crash_diagnostics(cloud_path, local_path, download_datasets): manifest.to_file(manifest_path) - logger.info("Downloaded crash diagnostics from %r to %r.", cloud_path, local_path) + logger.info("Downloaded diagnostics from %r to %r.", cloud_path, local_path) @octue_cli.group() @@ -409,6 +394,7 @@ def create_push_subscription( name=pub_sub_sruid, topic=topic, project_name=project_name, + filter=f'attributes.sender_type = "{PARENT_SENDER_TYPE}"', expiration_time=expiration_time, push_endpoint=push_endpoint, ) diff --git a/octue/cloud/deployment/google/answer_pub_sub_question.py b/octue/cloud/deployment/google/answer_pub_sub_question.py index e95d96e3c..167832582 100644 --- a/octue/cloud/deployment/google/answer_pub_sub_question.py +++ b/octue/cloud/deployment/google/answer_pub_sub_question.py @@ -1,7 +1,8 @@ import logging +from octue.cloud.pub_sub import Topic from octue.cloud.pub_sub.service import Service -from octue.cloud.service_id import create_sruid, get_sruid_parts +from octue.cloud.service_id import convert_service_id_to_pub_sub_form, create_sruid, get_sruid_parts from octue.configuration import load_service_and_app_configuration from octue.resources.service_backends import GCPPubSubBackend from octue.runner import Runner @@ -17,7 +18,7 @@ def answer_question(question, project_name): """Answer a question sent to an app deployed in Google Cloud. - :param dict|tuple|apache_beam.io.gcp.pubsub.PubsubMessage question: + :param dict|tuple question: :param str project_name: :return None: """ @@ -31,30 +32,24 @@ def answer_question(question, project_name): ) service = Service(service_id=service_sruid, backend=GCPPubSubBackend(project_name=project_name)) - question_uuid = get_nested_attribute(question, "attributes.question_uuid") - answer_topic = service.instantiate_answer_topic(question_uuid) try: - runner = Runner( - app_src=service_configuration.app_source_path, - twine=service_configuration.twine_path, - configuration_values=app_configuration.configuration_values, - configuration_manifest=app_configuration.configuration_manifest, - children=app_configuration.children, - output_location=app_configuration.output_location, - crash_diagnostics_cloud_path=service_configuration.crash_diagnostics_cloud_path, + runner = Runner.from_configuration( + service_configuration=service_configuration, + app_configuration=app_configuration, project_name=project_name, service_id=service_sruid, - service_registries=service_configuration.service_registries, ) service.run_function = runner.run - - service.answer(question, answer_topic=answer_topic) + service.answer(question) logger.info("Analysis successfully run and response sent for question %r.", question_uuid) - # Forward any errors in the deployment configuration (errors in the analysis are already forwarded by the service). except BaseException as error: # noqa - service.send_exception(topic=answer_topic) + service.send_exception( + topic=Topic(name=convert_service_id_to_pub_sub_form(service_sruid), project_name=project_name), + question_uuid=question_uuid, + ) + logger.exception(error) diff --git a/octue/cloud/emulators/_pub_sub.py b/octue/cloud/emulators/_pub_sub.py index b63319860..2ae70833a 100644 --- a/octue/cloud/emulators/_pub_sub.py +++ b/octue/cloud/emulators/_pub_sub.py @@ -5,14 +5,15 @@ import google.api_core from octue.cloud.pub_sub import Subscription, Topic -from octue.cloud.pub_sub.service import Service +from octue.cloud.pub_sub.service import ANSWERS_NAMESPACE, PARENT_SENDER_TYPE, Service +from octue.cloud.service_id import convert_service_id_to_pub_sub_form from octue.resources import Manifest from octue.utils.encoders import OctueJSONEncoder logger = logging.getLogger(__name__) -MESSAGES = {} +TOPICS = {} SUBSCRIPTIONS = {} @@ -31,7 +32,7 @@ def create(self, allow_existing=False): raise google.api_core.exceptions.AlreadyExists(f"Topic {self.path!r} already exists.") if not self.exists(): - MESSAGES[self.name] = [] + TOPICS[self.name] = [] self._created = True def delete(self): @@ -40,7 +41,7 @@ def delete(self): :return None: """ try: - del MESSAGES[self.name] + del TOPICS[self.name] except KeyError: pass @@ -50,7 +51,7 @@ def exists(self, timeout=10): :param float timeout: :return bool: """ - return self.name in MESSAGES + return self.name in TOPICS class MockSubscription(Subscription): @@ -144,7 +145,8 @@ def publish(self, topic, data, retry=None, **attributes): :param google.api_core.retry.Retry|None retry: :return MockFuture: """ - MESSAGES[get_service_id(topic)].append(MockMessage(data=data, **attributes)) + subscription_name = ".".join((get_pub_sub_resource_name(topic), ANSWERS_NAMESPACE, attributes["question_uuid"])) + SUBSCRIPTIONS[subscription_name].append(MockMessage(data=data, attributes=attributes)) return MockFuture() @@ -188,10 +190,15 @@ def pull(self, request, timeout=None, retry=None): if self.closed: raise ValueError("ValueError: Cannot invoke RPC: Channel closed!") + subscription_name = get_pub_sub_resource_name(request["subscription"]) + try: return MockPullResponse( - received_messages=[MockMessageWrapper(message=MESSAGES[get_service_id(request["subscription"])].pop(0))] + received_messages=[ + MockMessageWrapper(message=SUBSCRIPTIONS[subscription_name].pop(0)), + ] ) + except IndexError: return MockPullResponse(received_messages=[]) @@ -239,15 +246,40 @@ class MockMessage: """A mock Pub/Sub message containing serialised data and any number of attributes. :param bytes data: + :param dict|None attributes: :return None: """ - def __init__(self, data, **attributes): + def __init__(self, data, attributes=None): self.data = data - self.attributes = {} - for key, value in attributes.items(): + self.attributes = attributes or {} + + # Encode the attributes as they would be in a real Pub/Sub message. + for key, value in self.attributes.items(): + if isinstance(value, bool): + value = str(int(value)) + elif isinstance(value, (int, float)): + value = str(value) + self.attributes[key] = value + @classmethod + def from_primitive(cls, data, attributes): + """Instantiate a mock message from data in the form of a JSON-serialisable python primitive. + + :param any data: + :param dict attributes: + :return MockMessage: + """ + return cls(data=json.dumps(data, cls=OctueJSONEncoder).encode(), attributes=attributes) + + def __repr__(self): + """Represent a mock message as a string. + + :return str: the mock message as a string + """ + return f"<{type(self).__name__}(data={self.data!r})>" + def ack(self): """Do nothing. @@ -284,7 +316,7 @@ def ask( children=None, subscribe_to_logs=True, allow_local_files=False, - allow_save_diagnostics_data_on_crash=True, + save_diagnostics="SAVE_DIAGNOSTICS_ON_CRASH", question_uuid=None, push_endpoint=None, timeout=86400, @@ -299,7 +331,7 @@ def ask( :param list(dict)|None children: :param bool subscribe_to_logs: :param bool allow_local_files: - :param bool allow_save_diagnostics_data_on_crash: + :param str save_diagnostics: :param str|None question_uuid: :param str|None push_endpoint: :param float|None timeout: @@ -312,28 +344,42 @@ def ask( children=children, subscribe_to_logs=subscribe_to_logs, allow_local_files=allow_local_files, - allow_save_diagnostics_data_on_crash=allow_save_diagnostics_data_on_crash, + save_diagnostics=save_diagnostics, question_uuid=question_uuid, push_endpoint=push_endpoint, timeout=timeout, ) + # Delete question from messages sent to subscription so the parent doesn't pick it up as a response message. We + # do this as subscription filtering isn't implemented in this set of mocks. + subscription_name = ".".join((convert_service_id_to_pub_sub_form(service_id), ANSWERS_NAMESPACE, question_uuid)) + SUBSCRIPTIONS["octue.services." + subscription_name].pop(0) + + question = {"kind": "question"} + + if input_values is not None: + question["input_values"] = input_values + # Ignore any errors from the answering service as they will be raised on the remote service in practice, not # locally as is done in this mock. if input_manifest is not None: - input_manifest = input_manifest.serialise() + question["input_manifest"] = input_manifest.to_primitive() + + if children is not None: + question["children"] = children try: self.children[service_id].answer( - MockMessage( - data=json.dumps( - {"input_values": input_values, "input_manifest": input_manifest, "children": children}, - cls=OctueJSONEncoder, - ).encode(), - question_uuid=question_uuid, - forward_logs=subscribe_to_logs, - octue_sdk_version=parent_sdk_version, - allow_save_diagnostics_data_on_crash=allow_save_diagnostics_data_on_crash, + MockMessage.from_primitive( + data=question, + attributes={ + "sender_type": PARENT_SENDER_TYPE, + "question_uuid": question_uuid, + "forward_logs": subscribe_to_logs, + "version": parent_sdk_version, + "save_diagnostics": save_diagnostics, + "message_number": 0, + }, ) ) except Exception as e: # noqa @@ -347,7 +393,7 @@ class MockMessagePuller: initialisation. This is meant for patching `octue.cloud.pub_sub.message_handler.OrderedMessageHandler._pull_and_enqueue_message` in tests. - :param iter(dict) messages: + :param iter(octue.cloud.pub_sub.emulators._pub_sub.MockMessage) messages: :param octue.cloud.pub_sub.message_handler.OrderedMessageHandler message_handler: :return None: """ @@ -355,7 +401,7 @@ class MockMessagePuller: def __init__(self, messages, message_handler): self.messages = messages self.message_handler = message_handler - self.message_number = 0 + self.current_message = 0 def pull(self, timeout): """Get the next message from the messages given at instantiation and enqueue it for handling in the message @@ -364,12 +410,13 @@ def pull(self, timeout): :return None: """ try: - message = self.messages[self.message_number] + message = self.messages[self.current_message] except IndexError: return - self.message_handler._waiting_messages[int(message["message_number"])] = message - self.message_number += 1 + message_number = int(message.attributes["message_number"]) + self.message_handler.waiting_messages[message_number] = json.loads(message.data.decode()) + self.current_message += 1 class MockAnalysis: @@ -406,9 +453,9 @@ def __init__(self, request): self.__dict__ = vars(request) -def get_service_id(path): - """Get the service ID (e.g. octue.services.) from a topic or subscription path (e.g. - projects//topics/octue.services.) +def get_pub_sub_resource_name(path): + """Get the Pub/Sub resource name of the topic or subscription (e.g. "octue.services.") from its path (e.g. + "projects//topics/octue.services."). :param str path: :return str: diff --git a/octue/cloud/emulators/child.py b/octue/cloud/emulators/child.py index 19f66c92e..4e9f21e9b 100644 --- a/octue/cloud/emulators/child.py +++ b/octue/cloud/emulators/child.py @@ -49,7 +49,7 @@ def __init__(self, id=None, backend=None, internal_service_name="local/local:loc "result": self._handle_result, } - self._valid_message_types = set(self._message_handlers.keys()) + self._valid_message_kinds = set(self._message_handlers.keys()) @classmethod def from_file(cls, path): @@ -138,7 +138,7 @@ def _emulate_analysis( children, analysis_log_handler, handle_monitor_message, - allow_save_diagnostics_data_on_crash, + save_diagnostics, ): """Emulate analysis of a question by handling the messages given at instantiation in the order given. @@ -148,12 +148,12 @@ def _emulate_analysis( :param list(dict)|None children: a list of children for the child to use instead of its default children (if it uses children). These should be in the same format as in an app's app configuration file and have the same keys. (this is ignored by the emulator) :param logging.Handler|None analysis_log_handler: the `logging.Handler` instance which will be used to handle logs for this analysis run (this is ignored by the emulator) :param callable|None handle_monitor_message: a function that sends monitor messages to the parent that requested the analysis - :param bool allow_save_diagnostics_data_on_crash: if `True`, allow the input values and manifest (and its datasets) to be saved if the analysis fails + :param str save_diagnostics: must be one of {"SAVE_DIAGNOSTICS_OFF", "SAVE_DIAGNOSTICS_ON_CRASH", "SAVE_DIAGNOSTICS_ON"}; if turned on, allow the input values and manifest (and its datasets) to be saved by the child either all the time or just if the analysis fails :return octue.resources.analysis.Analysis: """ for message in self.messages: self._validate_message(message) - handler = self._message_handlers[message["type"]] + handler = self._message_handlers[message["kind"]] result = handler( message, @@ -163,7 +163,7 @@ def _emulate_analysis( children=children, analysis_log_handler=analysis_log_handler, handle_monitor_message=handle_monitor_message, - allow_save_diagnostics_data_on_crash=allow_save_diagnostics_data_on_crash, + save_diagnostics=save_diagnostics, ) if result: @@ -185,28 +185,28 @@ def _validate_message(self, message): :param dict message: :raise TypeError: if the message isn't a dictionary - :raise ValueError: if the message doesn't contain a 'type' key or if the 'type' key maps to an invalid value + :raise ValueError: if the message doesn't contain a 'kind' key or if the 'kind' key maps to an invalid value :return None: """ if not isinstance(message, dict): raise TypeError("Each message must be a dictionary.") - if "type" not in message: + if "kind" not in message: raise ValueError( - f"Each message must contain a 'type' key mapping to one of: {self._valid_message_types!r}." + f"Each message must contain a 'kind' key mapping to one of: {self._valid_message_kinds!r}." ) - if message["type"] not in self._valid_message_types: + if message["kind"] not in self._valid_message_kinds: raise ValueError( - f"{message['type']!r} is an invalid message type for the ChildEmulator. The valid types are: " - f"{self._valid_message_types!r}." + f"{message['kind']!r} is an invalid message kind for the ChildEmulator. The valid kinds are: " + f"{self._valid_message_kinds!r}." ) def _handle_delivery_acknowledgement(self, message, **kwargs): """A no-operation handler for delivery acknowledgement messages (these messages are ignored by the child emulator). - :param dict message: a dictionary containing the key "delivery_time" + :param dict message: a dictionary containing the key "datetime" :param kwargs: this should be empty :return None: """ @@ -215,7 +215,7 @@ def _handle_delivery_acknowledgement(self, message, **kwargs): def _handle_heartbeat(self, message, **kwargs): """A no-operation handler for heartbeat messages (these messages are ignored by the child emulator). - :param dict message: a dictionary containing the key "time" + :param dict message: a dictionary containing the key "datetime" :param kwargs: this should be empty :return None: """ @@ -253,7 +253,7 @@ def _handle_monitor_message(self, message, **kwargs): :param kwargs: must include the "handle_monitor_message" key :return None: """ - kwargs.get("handle_monitor_message")(json.loads(message["data"])) + kwargs.get("handle_monitor_message")(message["data"]) def _handle_exception(self, message, **kwargs): """Raise the given exception. @@ -286,29 +286,24 @@ def _handle_result(self, message, **kwargs): :raise ValueError: if the result doesn't contain the "output_values" and "output_manifest" keys :return octue.resources.analysis.Analysis: an `Analysis` instance containing the emulated outputs """ + input_manifest = kwargs.get("input_manifest") output_manifest = message.get("output_manifest") + if input_manifest and not isinstance(input_manifest, Manifest): + input_manifest = Manifest.deserialise(input_manifest) + if output_manifest and not isinstance(output_manifest, Manifest): output_manifest = Manifest.deserialise(output_manifest) - try: - if kwargs["input_manifest"] is not None: - kwargs["input_manifest"] = Manifest.deserialise(kwargs["input_manifest"]) - - return Analysis( - id=kwargs["analysis_id"], - twine={}, - handle_monitor_message=kwargs["handle_monitor_message"], - input_values=kwargs["input_values"], - input_manifest=kwargs["input_manifest"], - output_values=message["output_values"], - output_manifest=output_manifest, - ) - - except KeyError: - raise ValueError( - "Result messages must be dictionaries containing the keys 'output_values' and 'output_manifest'." - ) + return Analysis( + id=kwargs["analysis_id"], + twine={}, + handle_monitor_message=kwargs["handle_monitor_message"], + input_values=kwargs["input_values"], + input_manifest=input_manifest, + output_values=message.get("output_values"), + output_manifest=output_manifest, + ) class ServicePatcher(MultiPatcher): diff --git a/octue/cloud/pub_sub/events.py b/octue/cloud/pub_sub/events.py new file mode 100644 index 000000000..d61af3876 --- /dev/null +++ b/octue/cloud/pub_sub/events.py @@ -0,0 +1,38 @@ +import base64 +import json + +from octue.utils.decoders import OctueJSONDecoder +from octue.utils.objects import getattr_or_subscribe + + +def extract_event_and_attributes_from_pub_sub(message): + """Extract an Octue service event and its attributes from a Google Pub/Sub message in either direct Pub/Sub format + or in the Google Cloud Run format. + + :param dict|google.cloud.pubsub_v1.subscriber.message.Message message: the message in Google Cloud Run format or Google Pub/Sub format + :return (any, dict): the extracted event and its attributes + """ + # Cast attributes to a dictionary to avoid defaultdict-like behaviour from Pub/Sub message attributes container. + attributes = dict(getattr_or_subscribe(message, "attributes")) + + converted_attributes = { + "sender_type": attributes["sender_type"], + "question_uuid": attributes["question_uuid"], + "message_number": int(attributes["message_number"]), + "version": attributes["version"], + } + + if "forward_logs" in attributes: + converted_attributes["forward_logs"] = bool(int(attributes["forward_logs"])) + + if "save_diagnostics" in attributes: + converted_attributes["save_diagnostics"] = attributes["save_diagnostics"] + + try: + # Parse event directly from Pub/Sub or Dataflow. + event = json.loads(message.data.decode(), cls=OctueJSONDecoder) + except Exception: + # Parse event from Google Cloud Run. + event = json.loads(base64.b64decode(message["data"]).decode("utf-8").strip(), cls=OctueJSONDecoder) + + return event, converted_attributes diff --git a/octue/cloud/pub_sub/logging.py b/octue/cloud/pub_sub/logging.py index db97679f0..286269cd0 100644 --- a/octue/cloud/pub_sub/logging.py +++ b/octue/cloud/pub_sub/logging.py @@ -10,15 +10,15 @@ class GooglePubSubHandler(logging.Handler): :param callable message_sender: the `_send_message` method of the service that instantiated this instance :param octue.cloud.pub_sub.topic.Topic topic: topic to publish log records to - :param str analysis_id: the UUID of the analysis the instance is handling the log records for + :param str question_uuid: the UUID of the question to handle log records for :param float timeout: timeout in seconds for attempting to publish each log record :return None: """ - def __init__(self, message_sender, topic, analysis_id, timeout=60, *args, **kwargs): + def __init__(self, message_sender, topic, question_uuid, timeout=60, *args, **kwargs): super().__init__(*args, **kwargs) self.topic = topic - self.analysis_id = analysis_id + self.question_uuid = question_uuid self.timeout = timeout self._send_message = message_sender @@ -31,12 +31,14 @@ def emit(self, record): try: self._send_message( { - "type": "log_record", + "kind": "log_record", "log_record": self._convert_log_record_to_primitives(record), - "analysis_id": self.analysis_id, - "message_number": self.topic.messages_published, }, topic=self.topic, + attributes={ + "question_uuid": self.question_uuid, + "sender_type": "CHILD", # The sender type is repeated here as a string to avoid a circular import. + }, ) except Exception: # noqa diff --git a/octue/cloud/pub_sub/message_handler.py b/octue/cloud/pub_sub/message_handler.py index ce10e2e26..d4b2b4498 100644 --- a/octue/cloud/pub_sub/message_handler.py +++ b/octue/cloud/pub_sub/message_handler.py @@ -1,5 +1,4 @@ import importlib.metadata -import json import logging import math import os @@ -11,11 +10,11 @@ from google.cloud.pubsub_v1 import SubscriberClient from octue.cloud import EXCEPTIONS_MAPPING -from octue.compatibility import warn_if_incompatible +from octue.cloud.pub_sub.events import extract_event_and_attributes_from_pub_sub +from octue.cloud.validation import SERVICE_COMMUNICATION_SCHEMA, is_event_valid from octue.definitions import GOOGLE_COMPUTE_PROVIDERS from octue.log_handlers import COLOUR_PALETTE from octue.resources.manifest import Manifest -from octue.utils.decoders import OctueJSONDecoder from octue.utils.threads import RepeatingTimer @@ -25,7 +24,6 @@ else: from octue.utils.colour import colourise - logger = logging.getLogger(__name__) @@ -39,6 +37,7 @@ class OrderedMessageHandler: :param bool record_messages: if `True`, record received messages in the `received_messages` attribute :param str service_name: an arbitrary name to refer to the service subscribed to by (used for labelling its remote log messages) :param dict|None message_handlers: a mapping of message type names to callables that handle each type of message. The handlers should not mutate the messages. + :param dict|str schema: the JSON schema (or URI of one) to validate messages against :return None: """ @@ -50,6 +49,7 @@ def __init__( record_messages=True, service_name="REMOTE", message_handlers=None, + schema=SERVICE_COMMUNICATION_SCHEMA, ): self.subscription = subscription self.receiving_service = receiving_service @@ -57,15 +57,20 @@ def __init__( self.record_messages = record_messages self.service_name = service_name - self.question_uuid = self.subscription.topic.path.split(".")[-1] + if isinstance(schema, str): + self.schema = {"$ref": schema} + else: + self.schema = schema + + self.question_uuid = self.subscription.path.split(".")[-1] self.handled_messages = [] + self.waiting_messages = None self._subscriber = SubscriberClient() self._child_sdk_version = None self._heartbeat_checker = None self._last_heartbeat = None self._alive = True self._start_time = None - self._waiting_messages = None self._previous_message_number = -1 self._earliest_message_number_received = math.inf @@ -114,7 +119,7 @@ def handle_messages(self, timeout=60, maximum_heartbeat_interval=300, skip_first :return dict: the first result returned by a message handler """ self._start_time = time.perf_counter() - self._waiting_messages = {} + self.waiting_messages = {} self._previous_message_number = -1 self._heartbeat_checker = RepeatingTimer( @@ -182,7 +187,7 @@ def _check_timeout_and_get_pull_timeout(self, timeout): return timeout - total_run_time def _pull_and_enqueue_message(self, timeout): - """Pull a message from the subscription and enqueue it in `self._waiting_messages`, raising a `TimeoutError` if + """Pull a message from the subscription and enqueue it in `self.waiting_messages`, raising a `TimeoutError` if the timeout is exceeded before succeeding. :param float|None timeout: how long to wait in seconds for the message before raising a `TimeoutError` @@ -218,19 +223,24 @@ def _pull_and_enqueue_message(self, timeout): self._subscriber.acknowledge(request={"subscription": self.subscription.path, "ack_ids": [answer.ack_id]}) logger.debug("%r received a message related to question %r.", self.receiving_service, self.question_uuid) - # Get the child's Octue SDK version from the first message. - if not self._child_sdk_version: - self._child_sdk_version = answer.message.attributes.get("octue_sdk_version") + event, attributes = extract_event_and_attributes_from_pub_sub(answer.message) - # If the child hasn't provided its Octue SDK version, it's too old to send heartbeats - so, cancel the - # heartbeat checker to maintain compatibility. - if not self._child_sdk_version: - self._heartbeat_checker.cancel() + if not is_event_valid( + event=event, + attributes=attributes, + receiving_service=self.receiving_service, + parent_sdk_version=importlib.metadata.version("octue"), + child_sdk_version=attributes.get("version"), + schema=self.schema, + ): + return - message = json.loads(answer.message.data.decode(), cls=OctueJSONDecoder) + # Get the child's Octue SDK version from the first message. + if not self._child_sdk_version: + self._child_sdk_version = attributes["version"] - message_number = int(message["message_number"]) - self._waiting_messages[message_number] = message + message_number = attributes["message_number"] + self.waiting_messages[message_number] = event self._earliest_message_number_received = min(self._earliest_message_number_received, message_number) def _attempt_to_handle_queued_messages(self, skip_first_messages_after=60): @@ -242,9 +252,9 @@ def _attempt_to_handle_queued_messages(self, skip_first_messages_after=60): :param int|float skip_first_messages_after: the number of seconds after which to skip the first n messages if they haven't arrived but subsequent messages have :return any|None: either a non-`None` result from a message handler or `None` if nothing was returned by the message handlers or if the next in-order message hasn't been received yet """ - while self._waiting_messages: + while self.waiting_messages: try: - message = self._waiting_messages.pop(self._previous_message_number + 1) + message = self.waiting_messages.pop(self._previous_message_number + 1) except KeyError: @@ -270,7 +280,7 @@ def _get_and_start_from_earliest_received_message(self, skip_first_messages_afte :return dict|None: """ try: - message = self._waiting_messages.pop(self._earliest_message_number_received) + message = self.waiting_messages.pop(self._earliest_message_number_received) except KeyError: return @@ -299,35 +309,8 @@ def _handle_message(self, message): if self.record_messages: self.handled_messages.append(message) - try: - return self._message_handlers[message["type"]](message) - except Exception as error: - self._warn_of_or_raise_invalid_message_error(message, error) - - def _warn_of_or_raise_invalid_message_error(self, message, error): - """Issue a warning if the error is due to a message of an unknown type or raise the error if it's due to - anything else. Issue an additional warning if the parent and child SDK versions are incompatible. - - :param dict message: the message whose handling has caused an error - :param Exception error: the error caused by handling the message - :return None: - """ - warn_if_incompatible( - parent_sdk_version=importlib.metadata.version("octue"), - child_sdk_version=self._child_sdk_version, - ) - - # Just log a warning if an unknown message type has been received - it's likely not to be a big problem. - if isinstance(error, KeyError): - logger.warning( - "%r received a message of unknown type %r.", - self.receiving_service, - message.get("type", "unknown"), - ) - return - - # Raise all other errors. - raise error + handler = self._message_handlers[message["kind"]] + return handler(message) def _handle_delivery_acknowledgement(self, message): """Mark the question as delivered to prevent resending it. @@ -335,7 +318,7 @@ def _handle_delivery_acknowledgement(self, message): :param dict message: :return None: """ - logger.info("%r's question was delivered at %s.", self.receiving_service, message["delivery_time"]) + logger.info("%r's question was delivered at %s.", self.receiving_service, message["datetime"]) def _handle_heartbeat(self, message): """Record the time the heartbeat was received. @@ -355,7 +338,7 @@ def _handle_monitor_message(self, message): logger.debug("%r received a monitor message.", self.receiving_service) if self.handle_monitor_message is not None: - self.handle_monitor_message(json.loads(message["data"], cls=OctueJSONDecoder)) + self.handle_monitor_message(message["data"]) def _handle_log_message(self, message): """Deserialise the message into a log record and pass it to the local log handlers, adding [] to @@ -369,7 +352,7 @@ def _handle_log_message(self, message): # Add information about the immediate child sending the message and colour it with the first colour in the # colour palette. immediate_child_analysis_section = colourise( - f"[{self.service_name} | analysis-{message['analysis_id']}]", + f"[{self.service_name} | analysis-{self.question_uuid}]", text_colour=self._log_message_colours[0], ) @@ -398,7 +381,7 @@ def _handle_exception(self, message): ( message["exception_message"], f"The following traceback was captured from the remote service {self.service_name!r}:", - "".join(message["traceback"]), + "".join(message["exception_traceback"]), ) ) @@ -419,9 +402,9 @@ def _handle_result(self, message): """ logger.info("%r received an answer to question %r.", self.receiving_service, self.question_uuid) - if message["output_manifest"] is None: - output_manifest = None + if message.get("output_manifest"): + output_manifest = Manifest.deserialise(message["output_manifest"]) else: - output_manifest = Manifest.deserialise(message["output_manifest"], from_string=True) + output_manifest = None - return {"output_values": message["output_values"], "output_manifest": output_manifest} + return {"output_values": message.get("output_values"), "output_manifest": output_manifest} diff --git a/octue/cloud/pub_sub/service.py b/octue/cloud/pub_sub/service.py index 3ee8ffb55..f7e6d1959 100644 --- a/octue/cloud/pub_sub/service.py +++ b/octue/cloud/pub_sub/service.py @@ -1,5 +1,5 @@ -import base64 import concurrent.futures +import copy import datetime import functools import importlib.metadata @@ -9,11 +9,13 @@ import uuid import google.api_core.exceptions +import jsonschema from google.api_core import retry from google.cloud import pubsub_v1 import octue.exceptions from octue.cloud.pub_sub import Subscription, Topic +from octue.cloud.pub_sub.events import extract_event_and_attributes_from_pub_sub from octue.cloud.pub_sub.logging import GooglePubSubHandler from octue.cloud.pub_sub.message_handler import OrderedMessageHandler from octue.cloud.service_id import ( @@ -24,11 +26,10 @@ split_service_id, validate_sruid, ) +from octue.cloud.validation import raise_if_event_is_invalid from octue.compatibility import warn_if_incompatible -from octue.utils.decoders import OctueJSONDecoder from octue.utils.encoders import OctueJSONEncoder from octue.utils.exceptions import convert_exception_to_primitives -from octue.utils.objects import get_nested_attribute from octue.utils.threads import RepeatingTimer @@ -43,6 +44,9 @@ # microservices publishing single messages in a request-response sequence. BATCH_SETTINGS = pubsub_v1.types.BatchSettings(max_bytes=10 * 1000 * 1000, max_latency=0.01, max_messages=1) +PARENT_SENDER_TYPE = "PARENT" +CHILD_SENDER_TYPE = "CHILD" + class Service: """An Octue service that can be used as a data service or digital twin in one of two modes: @@ -128,13 +132,13 @@ def serve(self, timeout=None, delete_topic_and_subscription_on_exit=False, allow :return (google.cloud.pubsub_v1.subscriber.futures.StreamingPullFuture, google.cloud.pubsub_v1.SubscriberClient): """ logger.info("Starting %r.", self) - topic = Topic(name=self._pub_sub_id, project_name=self.backend.project_name) subscription = Subscription( name=self._pub_sub_id, topic=topic, project_name=self.backend.project_name, + filter=f'attributes.sender_type = "{PARENT_SENDER_TYPE}"', expiration_time=None, ) @@ -180,69 +184,77 @@ def serve(self, timeout=None, delete_topic_and_subscription_on_exit=False, allow return future, subscriber - def answer(self, question, answer_topic=None, heartbeat_interval=120, timeout=30): + def answer(self, question, heartbeat_interval=120, timeout=30): """Answer a question from a parent - i.e. run the child's app on the given data and return the output values. Answers conform to the output values and output manifest schemas specified in the child's Twine file. - :param dict|Message question: - :param octue.cloud.pub_sub.topic.Topic|None answer_topic: provide if messages need to be sent to the parent from outside the `Service` instance (e.g. in octue.cloud.deployment.google.cloud_run.flask_app) + :param dict|google.cloud.pubsub_v1.subscriber.message.Message question: :param int|float heartbeat_interval: the time interval, in seconds, at which to send heartbeats :param float|None timeout: time in seconds to keep retrying sending of the answer once it has been calculated :raise Exception: if any exception arises during running analysis and sending its results :return None: """ - ( - data, - question_uuid, - forward_logs, - parent_sdk_version, - allow_save_diagnostics_data_on_crash, - ) = self._parse_question(question) - - topic = answer_topic or self.instantiate_answer_topic(question_uuid) - self._send_delivery_acknowledgment(topic) - - heartbeater = RepeatingTimer( - interval=heartbeat_interval, - function=self._send_heartbeat, - kwargs={"topic": topic}, - ) + try: + ( + question, + question_uuid, + forward_logs, + parent_sdk_version, + save_diagnostics, + ) = self._parse_question(question) + except jsonschema.ValidationError: + return - heartbeater.daemon = True - heartbeater.start() + topic = Topic(name=self._pub_sub_id, project_name=self.backend.project_name) + heartbeater = None try: + self._send_delivery_acknowledgment(topic, question_uuid) + + heartbeater = RepeatingTimer( + interval=heartbeat_interval, + function=self._send_heartbeat, + kwargs={"topic": topic, "question_uuid": question_uuid}, + ) + + heartbeater.daemon = True + heartbeater.start() + if forward_logs: analysis_log_handler = GooglePubSubHandler( message_sender=self._send_message, topic=topic, - analysis_id=question_uuid, + question_uuid=question_uuid, ) else: analysis_log_handler = None analysis = self.run_function( analysis_id=question_uuid, - input_values=data["input_values"], - input_manifest=data["input_manifest"], - children=data.get("children"), + input_values=question.get("input_values"), + input_manifest=question.get("input_manifest"), + children=question.get("children"), analysis_log_handler=analysis_log_handler, - handle_monitor_message=functools.partial(self._send_monitor_message, topic=topic), - allow_save_diagnostics_data_on_crash=allow_save_diagnostics_data_on_crash, + handle_monitor_message=functools.partial( + self._send_monitor_message, + topic=topic, + question_uuid=question_uuid, + ), + save_diagnostics=save_diagnostics, ) - if analysis.output_manifest is None: - serialised_output_manifest = None - else: - serialised_output_manifest = analysis.output_manifest.serialise() + result = {"kind": "result"} + + if analysis.output_values is not None: + result["output_values"] = analysis.output_values + + if analysis.output_manifest is not None: + result["output_manifest"] = analysis.output_manifest.to_primitive() self._send_message( - { - "type": "result", - "output_values": analysis.output_values, - "output_manifest": serialised_output_manifest, - }, + message=result, topic=topic, + attributes={"question_uuid": question_uuid, "sender_type": CHILD_SENDER_TYPE}, timeout=timeout, ) @@ -250,9 +262,11 @@ def answer(self, question, answer_topic=None, heartbeat_interval=120, timeout=30 logger.info("%r answered question %r.", self, question_uuid) except BaseException as error: # noqa - heartbeater.cancel() + if heartbeater is not None: + heartbeater.cancel() + warn_if_incompatible(child_sdk_version=self._local_sdk_version, parent_sdk_version=parent_sdk_version) - self.send_exception(topic, timeout) + self.send_exception(topic, question_uuid, timeout=timeout) raise error def ask( @@ -263,7 +277,7 @@ def ask( children=None, subscribe_to_logs=True, allow_local_files=False, - allow_save_diagnostics_data_on_crash=True, + save_diagnostics="SAVE_DIAGNOSTICS_ON_CRASH", # This is repeated as a string here to avoid a circular import. question_uuid=None, push_endpoint=None, timeout=86400, @@ -278,7 +292,7 @@ def ask( :param list(dict)|None children: a list of children for the child to use instead of its default children (if it uses children). These should be in the same format as in an app's app configuration file and have the same keys. :param bool subscribe_to_logs: if `True`, subscribe to the child's logs and handle them with the local log handlers :param bool allow_local_files: if `True`, allow the input manifest to contain references to local files - this should only be set to `True` if the child will be able to access these local files - :param bool allow_save_diagnostics_data_on_crash: if `True`, allow the input values and manifest (and its datasets) to be saved by the child if it fails while processing them + :param str save_diagnostics: must be one of {"SAVE_DIAGNOSTICS_OFF", "SAVE_DIAGNOSTICS_ON_CRASH", "SAVE_DIAGNOSTICS_ON"}; if turned on, allow the input values and manifest (and its datasets) to be saved by the child either all the time or just if it fails while processing them :param str|None question_uuid: the UUID to use for the question if a specific one is needed; a UUID is generated if not :param str|None push_endpoint: if answers to the question should be pushed to an endpoint, provide its URL here; if they should be pulled, leave this as `None` :param float|None timeout: time in seconds to keep retrying sending the question @@ -310,34 +324,43 @@ def ask( ) pub_sub_service_id = convert_service_id_to_pub_sub_form(service_id) - question_topic = Topic(name=pub_sub_service_id, project_name=self.backend.project_name) + topic = Topic(name=pub_sub_service_id, project_name=self.backend.project_name) - if not question_topic.exists(timeout=timeout): + if not topic.exists(timeout=timeout): raise octue.exceptions.ServiceNotFound(f"Service with ID {service_id!r} cannot be found.") question_uuid = question_uuid or str(uuid.uuid4()) - answer_topic = self.instantiate_answer_topic(question_uuid, pub_sub_service_id) - answer_topic.create(allow_existing=False) - answer_subscription = Subscription( - name=answer_topic.name, - topic=answer_topic, + name=".".join((topic.name, ANSWERS_NAMESPACE, question_uuid)), + topic=topic, project_name=self.backend.project_name, + filter=f'attributes.question_uuid = "{question_uuid}" AND attributes.sender_type = "{CHILD_SENDER_TYPE}"', push_endpoint=push_endpoint, ) answer_subscription.create(allow_existing=False) + question = {"kind": "question"} + + if input_values is not None: + question["input_values"] = input_values + if input_manifest is not None: input_manifest.use_signed_urls_for_datasets() - input_manifest = input_manifest.to_primitive() + question["input_manifest"] = input_manifest.to_primitive() + + if children is not None: + question["children"] = children self._send_message( - {"input_values": input_values, "input_manifest": input_manifest, "children": children}, - topic=question_topic, - question_uuid=question_uuid, - forward_logs=subscribe_to_logs, - allow_save_diagnostics_data_on_crash=allow_save_diagnostics_data_on_crash, + message=question, + topic=topic, + attributes={ + "question_uuid": question_uuid, + "sender_type": PARENT_SENDER_TYPE, + "forward_logs": subscribe_to_logs, + "save_diagnostics": save_diagnostics, + }, ) logger.info("%r asked a question %r to service %r.", self, question_uuid, service_id) @@ -388,22 +411,11 @@ def wait_for_answer( finally: subscription.delete() - def instantiate_answer_topic(self, question_uuid, service_id=None): - """Instantiate the answer topic for the given question UUID and child service ID. - - :param str question_uuid: - :param str|None service_id: the ID of the child to ask the question to in Pub/Sub form - :return octue.cloud.pub_sub.topic.Topic: - """ - return Topic( - name=".".join((service_id or self._pub_sub_id, ANSWERS_NAMESPACE, question_uuid)), - project_name=self.backend.project_name, - ) - - def send_exception(self, topic, timeout=30): + def send_exception(self, topic, question_uuid, timeout=30): """Serialise and send the exception being handled to the parent. :param octue.cloud.pub_sub.topic.Topic topic: + :param str question_uuid: :param float|None timeout: time in seconds to keep retrying sending of the exception :return None: """ @@ -412,30 +424,30 @@ def send_exception(self, topic, timeout=30): self._send_message( { - "type": "exception", + "kind": "exception", "exception_type": exception["type"], "exception_message": exception_message, - "traceback": exception["traceback"], + "exception_traceback": exception["traceback"], }, topic=topic, + attributes={"question_uuid": question_uuid, "sender_type": CHILD_SENDER_TYPE}, timeout=timeout, ) - def _send_message(self, message, topic, timeout=30, **attributes): + def _send_message(self, message, topic, attributes=None, timeout=30): """Send a JSON-serialised message to the given topic with optional message attributes. :param dict message: JSON-serialisable data to send as a message :param octue.cloud.pub_sub.topic.Topic topic: the Pub/Sub topic to send the message to + :param dict|None attributes: key-value pairs to attach to the message - the values must be strings or bytes :param int|float timeout: the timeout for sending the message in seconds - :param attributes: key-value pairs to attach to the message - the values must be strings or bytes :return None: """ - with send_message_lock: - attributes["octue_sdk_version"] = self._local_sdk_version + attributes = attributes or {} - # This would be better placed in the Pub/Sub message's attributes but has been left in `message` for - # inter-service backwards compatibility. - message["message_number"] = topic.messages_published + with send_message_lock: + attributes["version"] = self._local_sdk_version + attributes["message_number"] = topic.messages_published converted_attributes = {} for key, value in attributes.items(): @@ -455,100 +467,93 @@ def _send_message(self, message, topic, timeout=30, **attributes): topic.messages_published += 1 - def _send_delivery_acknowledgment(self, topic, timeout=30): + def _send_delivery_acknowledgment(self, topic, question_uuid, timeout=30): """Send an acknowledgement of question receipt to the parent. :param octue.cloud.pub_sub.topic.Topic topic: topic to send the acknowledgement to + :param str question_uuid: :param float timeout: time in seconds after which to give up sending :return None: """ self._send_message( { - "type": "delivery_acknowledgement", - "delivery_time": str(datetime.datetime.now()), + "kind": "delivery_acknowledgement", + "datetime": datetime.datetime.utcnow().isoformat(), }, topic=topic, timeout=timeout, + attributes={"question_uuid": question_uuid, "sender_type": CHILD_SENDER_TYPE}, ) logger.info("%r acknowledged receipt of question.", self) - def _send_heartbeat(self, topic, timeout=30): + def _send_heartbeat(self, topic, question_uuid, timeout=30): """Send a heartbeat to the parent, indicating that the service is alive. :param octue.cloud.pub_sub.topic.Topic topic: topic to send the heartbeat to + :param str question_uuid: :param float timeout: time in seconds after which to give up sending :return None: """ self._send_message( { - "type": "heartbeat", - "time": str(datetime.datetime.now()), + "kind": "heartbeat", + "datetime": datetime.datetime.utcnow().isoformat(), }, topic=topic, timeout=timeout, + attributes={"question_uuid": question_uuid, "sender_type": CHILD_SENDER_TYPE}, ) logger.debug("Heartbeat sent by %r.", self) - def _send_monitor_message(self, data, topic, timeout=30): + def _send_monitor_message(self, data, topic, question_uuid, timeout=30): """Send a monitor message to the parent. :param any data: the data to send as a monitor message :param octue.cloud.pub_sub.topic.Topic topic: the topic to send the message to + :param str question_uuid: :param float timeout: time in seconds to retry sending the message :return None: """ self._send_message( - { - "type": "monitor_message", - "data": json.dumps(data, cls=OctueJSONEncoder), - }, + {"kind": "monitor_message", "data": data}, topic=topic, timeout=timeout, + attributes={"question_uuid": question_uuid, "sender_type": CHILD_SENDER_TYPE}, ) logger.debug("Monitor message sent by %r.", self) def _parse_question(self, question): - """Parse a question in the Google Cloud Pub/Sub or Google Cloud Run format. + """Parse a question in the Google Cloud Run or Google Pub/Sub format. - :param dict|Message question: - :return (dict, str, bool, str|None, bool): + :param dict|google.cloud.pubsub_v1.subscriber.message.Message question: the question to parse in Google Cloud Run or Google Pub/Sub format + :return (dict, str, bool, str, str): the question's event and its attributes (question UUID, whether to forward logs, the Octue SDK version of the parent, and whether to save diagnostics) """ logger.info("%r received a question.", self) - try: - # Parse question directly from Pub/Sub or Dataflow. - data = json.loads(question.data.decode(), cls=OctueJSONDecoder) + # Acknowledge it if it's directly from Pub/Sub + if hasattr(question, "ack"): + question.ack() - # Acknowledge it if it's directly from Pub/Sub - if hasattr(question, "ack"): - question.ack() + event, attributes = extract_event_and_attributes_from_pub_sub(question) + event_for_validation = copy.deepcopy(event) - except Exception: - # Parse question from Google Cloud Run. - data = json.loads(base64.b64decode(question["data"]).decode("utf-8").strip(), cls=OctueJSONDecoder) - - # Keep backwards compatibility with questions from Octue services running `octue<0.41.1`. - if isinstance(data["input_manifest"], str): - data["input_manifest"] = json.loads(data["input_manifest"], cls=OctueJSONDecoder) - - question_uuid = get_nested_attribute(question, "attributes.question_uuid") - forward_logs = bool(int(get_nested_attribute(question, "attributes.forward_logs"))) - - try: - parent_sdk_version = get_nested_attribute(question, "attributes.octue_sdk_version") - except AttributeError: - parent_sdk_version = None - - try: - allow_save_diagnostics_data_on_crash = get_nested_attribute( - question, - "attributes.allow_save_diagnostics_data_on_crash", - ) - except AttributeError: - allow_save_diagnostics_data_on_crash = False + raise_if_event_is_invalid( + event=event_for_validation, + attributes=attributes, + receiving_service=self, + parent_sdk_version=attributes.get("version"), + child_sdk_version=importlib.metadata.version("octue"), + ) logger.info("%r parsed the question successfully.", self) - return data, question_uuid, forward_logs, parent_sdk_version, allow_save_diagnostics_data_on_crash + + return ( + event, + attributes["question_uuid"], + attributes["forward_logs"], + attributes["version"], + attributes["save_diagnostics"], + ) diff --git a/octue/cloud/pub_sub/subscription.py b/octue/cloud/pub_sub/subscription.py index cc3f9ccd6..560f7da42 100644 --- a/octue/cloud/pub_sub/subscription.py +++ b/octue/cloud/pub_sub/subscription.py @@ -28,6 +28,7 @@ class Subscription: :param str name: the name of the subscription excluding "projects//subscriptions/" :param octue.cloud.pub_sub.topic.Topic topic: the topic the subscription is attached to :param str project_name: the name of the Google Cloud project that the subscription belongs to + :param str|None filter: if provided, only receive messages matching the filter (see here for filter syntax: https://cloud.google.com/pubsub/docs/subscription-message-filter#filtering_syntax) :param int ack_deadline: the time in seconds after which, if the subscriber hasn't acknowledged a message, to retry sending it to the subscription :param int message_retention_duration: unacknowledged message retention time in seconds :param int|float|None expiration_time: number of seconds of inactivity after which the subscription is deleted (infinite time if `None`) @@ -42,6 +43,7 @@ def __init__( name, topic, project_name, + filter=None, ack_deadline=600, message_retention_duration=600, expiration_time=THIRTY_ONE_DAYS, @@ -55,6 +57,7 @@ def __init__( self.name = name self.topic = topic + self.filter = filter self.path = self.generate_subscription_path(project_name, self.name) self.ack_deadline = ack_deadline self.message_retention_duration = Duration(seconds=message_retention_duration) @@ -105,7 +108,7 @@ def __repr__(self): :return str: """ - return f"<{type(self).__name__}({self.name})>" + return f"<{type(self).__name__}(name={self.name!r}, filter={self.filter!r})>" def create(self, allow_existing=False): """Create a Google Pub/Sub subscription that can be subscribed to. @@ -189,6 +192,7 @@ def _create_proto_message_subscription(self): mapping=None, name=self.path, # noqa topic=self.topic.path, + filter=self.filter, # noqa ack_deadline_seconds=self.ack_deadline, # noqa message_retention_duration=self.message_retention_duration, # noqa expiration_policy=self.expiration_policy, # noqa diff --git a/octue/cloud/service_id.py b/octue/cloud/service_id.py index 9ef39e395..92e581388 100644 --- a/octue/cloud/service_id.py +++ b/octue/cloud/service_id.py @@ -251,8 +251,9 @@ def get_default_sruid(namespace, name, service_registries): response = requests.get(f"{registry['endpoint']}/{service_id}") if response.ok: - logger.info("Found revision for service %r in %r registry.", service_id, registry["name"]) - return create_sruid(namespace=namespace, name=name, revision_tag=response.json()["revision_tag"]) + revision_tag = response.json()["revision_tag"] + logger.info("Found service revision '%s:%s' in %r registry.", service_id, revision_tag, registry["name"]) + return create_sruid(namespace=namespace, name=name, revision_tag=revision_tag) raise octue.exceptions.ServiceNotFound( f"No revisions for the service {service_id!r} were found in any of the specified service registries: " diff --git a/octue/cloud/validation.py b/octue/cloud/validation.py new file mode 100644 index 000000000..35677a2fe --- /dev/null +++ b/octue/cloud/validation.py @@ -0,0 +1,77 @@ +import logging +import os + +import jsonschema + +from octue.compatibility import warn_if_incompatible + + +logger = logging.getLogger(__name__) + +SERVICE_COMMUNICATION_SCHEMA = "https://jsonschema.registry.octue.com/octue/service-communication/0.8.2.json" +SERVICE_COMMUNICATION_SCHEMA_INFO_URL = "https://strands.octue.com/octue/service-communication" +SERVICE_COMMUNICATION_SCHEMA_VERSION = os.path.splitext(SERVICE_COMMUNICATION_SCHEMA)[0].split("/")[-1] + + +def is_event_valid(event, attributes, receiving_service, parent_sdk_version, child_sdk_version, schema=None): + """Check if the event and its attributes are valid according to the Octue services communication schema. + + :param dict event: the event to validate + :param dict attributes: the attributes of the event to validate + :param octue.cloud.pub_sub.service.Service receiving_service: the service receiving and validating the event + :param str parent_sdk_version: the semantic version of Octue SDK running on the parent + :param str child_sdk_version: the semantic version of Octue SDK running on the child + :param dict|None schema: the schema to validate the event and its attributes against; if `None`, this defaults to the service communication schema used in this version of Octue SDK + :return bool: `True` if the event and its attributes are valid + """ + try: + raise_if_event_is_invalid( + event, + attributes, + receiving_service, + parent_sdk_version, + child_sdk_version, + schema=schema, + ) + except jsonschema.ValidationError: + return False + + return True + + +def raise_if_event_is_invalid( + event, + attributes, + receiving_service, + parent_sdk_version, + child_sdk_version, + schema=None, +): + """Raise an error if the event or its attributes aren't valid according to the Octue services communication schema. + + :param dict event: the event to validate + :param dict attributes: the attributes of the event to validate + :param octue.cloud.pub_sub.service.Service receiving_service: the service receiving and validating the event + :param str parent_sdk_version: the semantic version of Octue SDK running on the parent + :param str child_sdk_version: the semantic version of Octue SDK running on the child + :param dict|None schema: the schema to validate the event and its attributes against; if `None`, this defaults to the service communication schema used in this version of Octue SDK + :raise jsonschema.ValidationError: if the event or its attributes are invalid + :return None: + """ + if schema is None: + schema = {"$ref": SERVICE_COMMUNICATION_SCHEMA} + + try: + jsonschema.validate({"event": event, "attributes": dict(attributes)}, schema) + except jsonschema.ValidationError as error: + warn_if_incompatible(parent_sdk_version=parent_sdk_version, child_sdk_version=child_sdk_version) + + logger.exception( + "%r received an event that doesn't conform with version %s of the service communication schema (%s): %r.", + receiving_service, + SERVICE_COMMUNICATION_SCHEMA_VERSION, + SERVICE_COMMUNICATION_SCHEMA_INFO_URL, + event, + ) + + raise error diff --git a/octue/configuration.py b/octue/configuration.py index f1368f75a..1a1f2f7d1 100644 --- a/octue/configuration.py +++ b/octue/configuration.py @@ -16,8 +16,9 @@ class ServiceConfiguration: :param str app_source_path: the path to the directory containing the app's source code :param str twine_path: the path to the twine file defining the schema for input, output, and configuration data for the service :param str|None app_configuration_path: the path to the app configuration file containing configuration data for the service; if this is `None`, the default application configuration is used - :param str|None crash_diagnostics_cloud_path: the path to a cloud directory to store crash diagnostics in the event that the service fails while processing a question (this includes the configuration, input values and manifest, and logs) + :param str|None diagnostics_cloud_path: the path to a cloud directory to store diagnostics (this includes the configuration, input values and manifest, and logs) :param iter(dict)|None service_registries: the names and endpoints of the registries used to resolve service revisions when asking questions; these should be in priority order (highest priority first) + :param str|None directory: if provided, find the app source, twine, and app configuration relative to this directory :return None: """ @@ -28,16 +29,39 @@ def __init__( app_source_path=".", twine_path="twine.json", app_configuration_path=None, - crash_diagnostics_cloud_path=None, + diagnostics_cloud_path=None, service_registries=None, + directory=None, **kwargs, ): self.name = name self.namespace = namespace - self.app_source_path = app_source_path - self.twine_path = twine_path - self.app_configuration_path = app_configuration_path - self.crash_diagnostics_cloud_path = crash_diagnostics_cloud_path + + if directory: + directory = os.path.abspath(directory) + + if app_source_path == ".": + self.app_source_path = directory + else: + self.app_source_path = os.path.join(directory, app_source_path) + + self.twine_path = os.path.join(directory, twine_path) + + if app_configuration_path: + self.app_configuration_path = os.path.join(directory, app_configuration_path) + else: + self.app_configuration_path = None + + else: + self.app_source_path = os.path.abspath(app_source_path) + self.twine_path = os.path.abspath(twine_path) + + if app_configuration_path: + self.app_configuration_path = os.path.abspath(app_configuration_path) + else: + self.app_configuration_path = None + + self.diagnostics_cloud_path = diagnostics_cloud_path self.service_registries = service_registries if kwargs: @@ -53,10 +77,11 @@ def from_file(cls, path): with open(path) as f: raw_service_configuration = yaml.load(f, Loader=yaml.SafeLoader) - logger.info("Service configuration loaded from %r.", os.path.abspath(path)) + absolute_path = os.path.abspath(path) + logger.info("Service configuration loaded from %r.", absolute_path) # Ignore services other than the first for now. - return cls(**raw_service_configuration["services"][0]) + return cls(**raw_service_configuration["services"][0], directory=os.path.dirname(absolute_path)) class AppConfiguration: diff --git a/octue/crash_diagnostics.py b/octue/diagnostics.py similarity index 84% rename from octue/crash_diagnostics.py rename to octue/diagnostics.py index 51ca3ae24..6ee72e342 100644 --- a/octue/crash_diagnostics.py +++ b/octue/diagnostics.py @@ -13,9 +13,9 @@ logger = logging.getLogger(__name__) -class CrashDiagnostics: - """A handler for crash diagnostics that allows uploading of explicitly added configuration and input data and any - questions asked to the cloud. +class Diagnostics: + """A handler for question diagnostics that allows uploading of explicitly added configuration and input data and any + questions asked to other services. :param str cloud_path: the cloud path of a directory to upload any added data into :return None: @@ -40,11 +40,11 @@ def add_data( input_manifest=None, ): """Add an analysis ID, configuration values, a configuration manifest, input values, and/or an input manifest to - the crash diagnostics. The values and manifests are deep-copied before being added. This method can be called + the diagnostics. The values and manifests are deep-copied before being added. This method can be called multiple times as data becomes available. Calling again with the same keyword arguments will overwrite any data of that type added previously. - :param str analysis_id: the ID of the analysis to save crash diagnostics for + :param str analysis_id: the ID of the analysis to save diagnostics for :param any configuration_values: configuration values to save :param any configuration_manifest: a configuration manifest to save :param any input_values: input values to save @@ -75,15 +75,15 @@ def add_question(self, question): self.questions.append(question) def upload(self): - """Check that a cloud path has been provided before uploading any added data to the crash diagnostics cloud + """Check that a cloud path has been provided before uploading any added data to the diagnostics cloud path. Any errors encountered during upload are caught and logged. :return None: """ if not self.cloud_path: logger.warning( - "Cannot upload crash diagnostics as the child doesn't have the `crash_diagnostics_cloud_path` field " - "set in its service configuration (`octue.yaml` file)." + "Cannot upload diagnostics as the child doesn't have the `diagnostics_cloud_path` field set in its " + "service configuration (`octue.yaml` file)." ) return @@ -92,17 +92,17 @@ def upload(self): try: self._upload() - logger.info("Crash diagnostics uploaded.") + logger.info("Diagnostics uploaded.") except Exception: - logger.exception("Failed to upload crash diagnostics.") + logger.exception("Failed to upload diagnostics.") def _upload(self): - """Upload any added data to the crash diagnostics cloud path. + """Upload any added data to the diagnostics cloud path. :return None: """ question_diagnostics_path = storage.path.join(self.cloud_path, self.analysis_id) - logger.warning("App failed - saving crash diagnostics to %r.", question_diagnostics_path) + logger.warning("App failed - saving diagnostics to %r.", question_diagnostics_path) for data_type in ("configuration", "input"): values_type = f"{data_type}_values" @@ -123,7 +123,7 @@ def _upload(self): self._upload_manifest(manifest_type, question_diagnostics_path) - # Upload the messages received from any children before the crash. + # Upload the messages received from any children. self._storage_client.upload_from_string( string=json.dumps(self.questions, cls=OctueJSONEncoder), cloud_path=storage.path.join(question_diagnostics_path, "questions.json"), @@ -142,7 +142,7 @@ def _attempt_deserialise_json(string): return string def _upload_values(self, values_type, question_diagnostics_path): - """Upload the values of the given type as part of the crash diagnostics. + """Upload the values of the given type as part of the diagnostics. :param str values_type: one of "configuration_values" or "input_values" :param str question_diagnostics_path: the path to a cloud directory to upload the values into @@ -156,7 +156,7 @@ def _upload_values(self, values_type, question_diagnostics_path): ) def _upload_manifest(self, manifest_type, question_diagnostics_path): - """Upload the serialised manifest of the given type and its datasets as part of the crash diagnostics. + """Upload the serialised manifest of the given type and its datasets as part of the diagnostics. :param str manifest_type: one of "configuration_manifest" or "input_manifest" :param str question_diagnostics_path: the path to a cloud directory to upload the manifest into diff --git a/octue/metadata/recorded_questions.jsonl b/octue/metadata/recorded_questions.jsonl index 79cfb7d9e..964913905 100644 --- a/octue/metadata/recorded_questions.jsonl +++ b/octue/metadata/recorded_questions.jsonl @@ -1,45 +1,3 @@ -{"parent_sdk_version": "0.16.0", "question": {"data": "{\"input_values\": {\"height\": 4, \"width\": 72}, \"input_manifest\": \"{\\n \\\"datasets\\\": {\\n \\\"my_dataset\\\": {\\n \\\"files\\\": [\\n {\\n \\\"_cloud_metadata\\\": {},\\n \\\"cloud_path\\\": null,\\n \\\"id\\\": \\\"d04f8c48-c0b4-4ed6-a5ce-308d69ab0d3f\\\",\\n \\\"labels\\\": [],\\n \\\"name\\\": \\\"a_test_file.csv\\\",\\n \\\"path\\\": \\\"/var/folders/sk/hf5fbp616c77tsys9lz55qn40000gp/T/tmphspb3xz1/path-within-dataset/a_test_file.csv\\\",\\n \\\"tags\\\": {},\\n \\\"timestamp\\\": null\\n },\\n {\\n \\\"_cloud_metadata\\\": {},\\n \\\"cloud_path\\\": null,\\n \\\"id\\\": \\\"b3492362-59b3-4d17-b08f-b88ebd1bd2cd\\\",\\n \\\"labels\\\": [],\\n \\\"name\\\": \\\"another_test_file.csv\\\",\\n \\\"path\\\": \\\"/var/folders/sk/hf5fbp616c77tsys9lz55qn40000gp/T/tmphspb3xz1/path-within-dataset/another_test_file.csv\\\",\\n \\\"tags\\\": {},\\n \\\"timestamp\\\": null\\n }\\n ],\\n \\\"id\\\": \\\"59eb7ee8-3908-4a23-8c08-568b0f6d24dd\\\",\\n \\\"labels\\\": [],\\n \\\"name\\\": \\\"tmphspb3xz1\\\",\\n \\\"path\\\": \\\"/var/folders/sk/hf5fbp616c77tsys9lz55qn40000gp/T/tmphspb3xz1\\\",\\n \\\"tags\\\": {}\\n }\\n },\\n \\\"id\\\": \\\"6a9c77d9-3f25-4fa6-8657-e3c44761c624\\\",\\n \\\"keys\\\": null,\\n \\\"name\\\": null,\\n \\\"path\\\": \\\".\\\"\\n}\"}", "attributes": {"question_uuid": "694169c2-16a6-488e-bc23-bef05c1cfdac", "forward_logs": "1"}}} -{"parent_sdk_version": "0.17.0", "question": {"data": "{\"input_values\": {\"height\": 4, \"width\": 72}, \"input_manifest\": \"{\\n \\\"datasets\\\": {\\n \\\"my_dataset\\\": \\\"/var/folders/sk/hf5fbp616c77tsys9lz55qn40000gp/T/tmp5az2xpjx\\\"\\n },\\n \\\"id\\\": \\\"9c7cde00-f78f-4c01-b46f-80dd738ab95f\\\",\\n \\\"name\\\": null\\n}\"}", "attributes": {"question_uuid": "b9a02ab8-c5e2-4182-9979-f65923beef8e", "forward_logs": "1"}}} -{"parent_sdk_version": "0.18.0", "question": {"data": "{\"input_values\": {\"height\": 4, \"width\": 72}, \"input_manifest\": \"{\\n \\\"datasets\\\": {\\n \\\"my_dataset\\\": \\\"/var/folders/sk/hf5fbp616c77tsys9lz55qn40000gp/T/tmps9q2ixgq\\\"\\n },\\n \\\"id\\\": \\\"4b7d24bd-137f-4b07-ab3c-a559f92d6f77\\\",\\n \\\"name\\\": null\\n}\"}", "attributes": {"question_uuid": "33504c32-b697-4386-8288-7ed68f9973b5", "forward_logs": "1"}}} -{"parent_sdk_version": "0.18.1", "question": {"data": "{\"input_values\": {\"height\": 4, \"width\": 72}, \"input_manifest\": \"{\\n \\\"datasets\\\": {\\n \\\"my_dataset\\\": \\\"/var/folders/sk/hf5fbp616c77tsys9lz55qn40000gp/T/tmpkh7jfrn7\\\"\\n },\\n \\\"id\\\": \\\"61792dc5-fe7a-4677-844e-846e5f2179b2\\\",\\n \\\"name\\\": null\\n}\"}", "attributes": {"question_uuid": "c6ee81cb-4f13-47ce-b794-f6afeee2868c", "forward_logs": "1"}}} -{"parent_sdk_version": "0.18.2", "question": {"data": "{\"input_values\": {\"height\": 4, \"width\": 72}, \"input_manifest\": \"{\\n \\\"datasets\\\": {\\n \\\"my_dataset\\\": \\\"/var/folders/sk/hf5fbp616c77tsys9lz55qn40000gp/T/tmpxxv5r28e\\\"\\n },\\n \\\"id\\\": \\\"bd77d67e-1dc5-4815-9880-9ed30ba75375\\\",\\n \\\"name\\\": null\\n}\"}", "attributes": {"question_uuid": "ca7a5e50-91f6-422f-bdb0-fadc716b9ff1", "forward_logs": "1"}}} -{"parent_sdk_version": "0.19.0", "question": {"data": "{\"input_values\": {\"height\": 4, \"width\": 72}, \"input_manifest\": \"{\\n \\\"datasets\\\": {\\n \\\"my_dataset\\\": \\\"/var/folders/sk/hf5fbp616c77tsys9lz55qn40000gp/T/tmpkny_ferx\\\"\\n },\\n \\\"id\\\": \\\"3da9c75d-b669-4cea-9959-b5aac0c068e3\\\",\\n \\\"name\\\": null\\n}\"}", "attributes": {"question_uuid": "fe32d107-ebf3-4074-ac41-060646a6caf1", "forward_logs": "1"}}} -{"parent_sdk_version": "0.20.0", "question": {"data": "{\"input_values\": {\"height\": 4, \"width\": 72}, \"input_manifest\": \"{\\n \\\"datasets\\\": {\\n \\\"my_dataset\\\": \\\"/var/folders/sk/hf5fbp616c77tsys9lz55qn40000gp/T/tmpsvwn3hv8\\\"\\n },\\n \\\"id\\\": \\\"58999532-9548-4a95-8c5b-224f0a7c46a6\\\",\\n \\\"name\\\": null\\n}\"}", "attributes": {"question_uuid": "fc4290e3-e089-41a5-b490-cd4993668ac5", "forward_logs": "1"}}} -{"parent_sdk_version": "0.21.0", "question": {"data": "{\"input_values\": {\"height\": 4, \"width\": 72}, \"input_manifest\": \"{\\n \\\"datasets\\\": {\\n \\\"my_dataset\\\": \\\"/var/folders/sk/hf5fbp616c77tsys9lz55qn40000gp/T/tmpkpaey6bk\\\"\\n },\\n \\\"id\\\": \\\"3dcd830c-e317-4c73-b9ef-645168d97a0f\\\",\\n \\\"name\\\": null\\n}\"}", "attributes": {"question_uuid": "c9b199f9-ef04-42b0-b95c-cabf8c916d14", "forward_logs": "1"}}} -{"parent_sdk_version": "0.22.0", "question": {"data": "{\"input_values\": {\"height\": 4, \"width\": 72}, \"input_manifest\": \"{\\n \\\"datasets\\\": {\\n \\\"my_dataset\\\": \\\"/var/folders/sk/hf5fbp616c77tsys9lz55qn40000gp/T/tmpg5lfoxcr\\\"\\n },\\n \\\"id\\\": \\\"4e64e00c-2d8b-4227-9da9-d19cf9e98f63\\\",\\n \\\"name\\\": null\\n}\"}", "attributes": {"question_uuid": "d70c8b87-6d20-414f-836b-82a1378b8a6f", "forward_logs": "1"}}} -{"parent_sdk_version": "0.22.1", "question": {"data": "{\"input_values\": {\"height\": 4, \"width\": 72}, \"input_manifest\": \"{\\n \\\"datasets\\\": {\\n \\\"my_dataset\\\": \\\"/var/folders/sk/hf5fbp616c77tsys9lz55qn40000gp/T/tmplw027xyt\\\"\\n },\\n \\\"id\\\": \\\"13caddf4-821b-48fc-9ab2-1e1795ad74e7\\\",\\n \\\"name\\\": null\\n}\"}", "attributes": {"question_uuid": "1de52a4b-bba8-49ad-8df2-962a7550da0c", "forward_logs": "1"}}} -{"parent_sdk_version": "0.23.0", "question": {"data": "{\"input_values\": {\"height\": 4, \"width\": 72}, \"input_manifest\": \"{\\n \\\"datasets\\\": {\\n \\\"my_dataset\\\": \\\"/var/folders/sk/hf5fbp616c77tsys9lz55qn40000gp/T/tmpcqpghne2\\\"\\n },\\n \\\"id\\\": \\\"d498c36e-dff1-4e4c-9eb2-674793eb8a39\\\",\\n \\\"name\\\": null\\n}\"}", "attributes": {"question_uuid": "981a026f-a67a-4395-8e70-a34ae9df56b4", "forward_logs": "1"}}} -{"parent_sdk_version": "0.23.1", "question": {"data": "{\"input_values\": {\"height\": 4, \"width\": 72}, \"input_manifest\": \"{\\n \\\"datasets\\\": {\\n \\\"my_dataset\\\": \\\"/var/folders/sk/hf5fbp616c77tsys9lz55qn40000gp/T/tmp000v709y\\\"\\n },\\n \\\"id\\\": \\\"87a0903a-c568-4dd5-bd77-c2c6a7f6db9d\\\",\\n \\\"name\\\": null\\n}\"}", "attributes": {"question_uuid": "1af1c828-2213-49f1-8352-71126f2dd642", "forward_logs": "1"}}} -{"parent_sdk_version": "0.23.2", "question": {"data": "{\"input_values\": {\"height\": 4, \"width\": 72}, \"input_manifest\": \"{\\n \\\"datasets\\\": {\\n \\\"my_dataset\\\": \\\"/var/folders/sk/hf5fbp616c77tsys9lz55qn40000gp/T/tmpdxfg77kr\\\"\\n },\\n \\\"id\\\": \\\"f2ab9d21-44c6-4fa9-8056-f07fa95ab9a4\\\",\\n \\\"name\\\": null\\n}\"}", "attributes": {"question_uuid": "02223710-70c7-41c5-b5c6-4cef2c6eb736", "forward_logs": "1"}}} -{"parent_sdk_version": "0.23.3", "question": {"data": "{\"input_values\": {\"height\": 4, \"width\": 72}, \"input_manifest\": \"{\\n \\\"datasets\\\": {\\n \\\"my_dataset\\\": \\\"/var/folders/sk/hf5fbp616c77tsys9lz55qn40000gp/T/tmpi8eh9krv\\\"\\n },\\n \\\"id\\\": \\\"20a649e7-5a7d-4b8b-9087-4a985f83cc64\\\",\\n \\\"name\\\": null\\n}\"}", "attributes": {"question_uuid": "1e91855d-308a-4201-9455-c2050bf99a99", "forward_logs": "1"}}} -{"parent_sdk_version": "0.23.4", "question": {"data": "{\"input_values\": {\"height\": 4, \"width\": 72}, \"input_manifest\": \"{\\n \\\"datasets\\\": {\\n \\\"my_dataset\\\": \\\"/var/folders/sk/hf5fbp616c77tsys9lz55qn40000gp/T/tmp598ywbpa\\\"\\n },\\n \\\"id\\\": \\\"9c5b7c04-dc37-4de3-83f8-5fe3593480f1\\\",\\n \\\"name\\\": null\\n}\"}", "attributes": {"question_uuid": "7adca4d9-6c76-436b-9dbe-f0df43d939b5", "forward_logs": "1"}}} -{"parent_sdk_version": "0.23.5", "question": {"data": "{\"input_values\": {\"height\": 4, \"width\": 72}, \"input_manifest\": \"{\\n \\\"datasets\\\": {\\n \\\"my_dataset\\\": \\\"/var/folders/sk/hf5fbp616c77tsys9lz55qn40000gp/T/tmpi9ineqwl\\\"\\n },\\n \\\"id\\\": \\\"9855c644-2b25-488c-9f71-0915207322f7\\\",\\n \\\"name\\\": null\\n}\"}", "attributes": {"question_uuid": "07747471-3286-4e56-81df-bd2f078d3efa", "forward_logs": "1"}}} -{"parent_sdk_version": "0.23.6", "question": {"data": "{\"input_values\": {\"height\": 4, \"width\": 72}, \"input_manifest\": \"{\\n \\\"datasets\\\": {\\n \\\"my_dataset\\\": \\\"/var/folders/sk/hf5fbp616c77tsys9lz55qn40000gp/T/tmp56wxyd5_\\\"\\n },\\n \\\"id\\\": \\\"45a80ac7-1d8b-4551-9bed-73c25481a73b\\\",\\n \\\"name\\\": null\\n}\"}", "attributes": {"question_uuid": "5075368d-6b3d-4124-8e25-780202ce691e", "forward_logs": "1"}}} -{"parent_sdk_version": "0.24.0", "question": {"data": "{\"input_values\": {\"height\": 4, \"width\": 72}, \"input_manifest\": \"{\\n \\\"datasets\\\": {\\n \\\"my_dataset\\\": \\\"/var/folders/sk/hf5fbp616c77tsys9lz55qn40000gp/T/tmpnvomaho8\\\"\\n },\\n \\\"id\\\": \\\"27adf87e-25b2-400b-a079-ec272725277d\\\",\\n \\\"name\\\": null\\n}\"}", "attributes": {"question_uuid": "56b512fc-4d8f-45cc-8d5e-cf94c0316bc2", "forward_logs": "1"}}} -{"parent_sdk_version": "0.24.1", "question": {"data": "{\"input_values\": {\"height\": 4, \"width\": 72}, \"input_manifest\": \"{\\n \\\"datasets\\\": {\\n \\\"my_dataset\\\": \\\"/var/folders/sk/hf5fbp616c77tsys9lz55qn40000gp/T/tmphdia2ry9\\\"\\n },\\n \\\"id\\\": \\\"4b6b08b8-ef1d-4bba-9b75-9c413edfb3f5\\\",\\n \\\"name\\\": null\\n}\"}", "attributes": {"question_uuid": "28e3b3e3-b112-42ec-a77c-9667376ea29b", "forward_logs": "1"}}} -{"parent_sdk_version": "0.25.0", "question": {"data": "{\"input_values\": {\"height\": 4, \"width\": 72}, \"input_manifest\": \"{\\n \\\"datasets\\\": {\\n \\\"my_dataset\\\": \\\"/var/folders/sk/hf5fbp616c77tsys9lz55qn40000gp/T/tmphvu5b_xn\\\"\\n },\\n \\\"id\\\": \\\"e6953716-e889-4d64-98e9-2cc61d97d972\\\",\\n \\\"name\\\": null\\n}\"}", "attributes": {"question_uuid": "42a2650b-7b7c-4196-b2ac-a7c69e702910", "forward_logs": "1"}}} -{"parent_sdk_version": "0.26.0", "question": {"data": "{\"input_values\": {\"height\": 4, \"width\": 72}, \"input_manifest\": \"{\\n \\\"datasets\\\": {\\n \\\"my_dataset\\\": \\\"/var/folders/sk/hf5fbp616c77tsys9lz55qn40000gp/T/tmp38jx_68i\\\"\\n },\\n \\\"id\\\": \\\"cc58ce67-6577-44e2-9547-695a1ee15e1f\\\",\\n \\\"name\\\": null\\n}\"}", "attributes": {"question_uuid": "db403227-cf1c-4c9d-b10b-a1bf46b084f5", "forward_logs": "1"}}} -{"parent_sdk_version": "0.26.1", "question": {"data": "{\"input_values\": {\"height\": 4, \"width\": 72}, \"input_manifest\": \"{\\n \\\"datasets\\\": {\\n \\\"my_dataset\\\": \\\"/var/folders/sk/hf5fbp616c77tsys9lz55qn40000gp/T/tmpg73jjadb\\\"\\n },\\n \\\"id\\\": \\\"07d02990-1dbc-49ed-9384-3699286bb6b2\\\",\\n \\\"name\\\": null\\n}\"}", "attributes": {"question_uuid": "f272c64d-58e1-4a0d-a4eb-6b596fe92ddc", "forward_logs": "1"}}} -{"parent_sdk_version": "0.26.2", "question": {"data": "{\"input_values\": {\"height\": 4, \"width\": 72}, \"input_manifest\": \"{\\n \\\"datasets\\\": {\\n \\\"my_dataset\\\": \\\"/var/folders/sk/hf5fbp616c77tsys9lz55qn40000gp/T/tmpw4l94d7v\\\"\\n },\\n \\\"id\\\": \\\"f594afe5-306b-4061-9e74-14605dd7cb6c\\\",\\n \\\"name\\\": null\\n}\"}", "attributes": {"question_uuid": "cfa15429-5678-4409-ac32-5e8c49f6e27a", "forward_logs": "1", "octue_sdk_version": "0.26.2"}}} -{"parent_sdk_version": "0.27.0", "question": {"data": "{\"input_values\": {\"height\": 4, \"width\": 72}, \"input_manifest\": \"{\\n \\\"datasets\\\": {\\n \\\"my_dataset\\\": \\\"/var/folders/sk/hf5fbp616c77tsys9lz55qn40000gp/T/tmp46ve0p8l\\\"\\n },\\n \\\"id\\\": \\\"1afefc0a-8a0e-4d11-aa71-f900927fc318\\\",\\n \\\"name\\\": null\\n}\"}", "attributes": {"question_uuid": "aa4fd3ca-dd7a-47cf-bf45-6ae23a751afb", "forward_logs": "1", "octue_sdk_version": "0.27.0"}}} -{"parent_sdk_version": "0.27.1", "question": {"data": "{\"input_values\": {\"height\": 4, \"width\": 72}, \"input_manifest\": \"{\\n \\\"datasets\\\": {\\n \\\"my_dataset\\\": \\\"/var/folders/sk/hf5fbp616c77tsys9lz55qn40000gp/T/tmpx7bl_b06\\\"\\n },\\n \\\"id\\\": \\\"097f9ff1-7cc7-4b7a-987f-e80b1bdbc785\\\",\\n \\\"name\\\": null\\n}\"}", "attributes": {"question_uuid": "023b5f85-7a03-42f8-9b4c-fc58b41a2aa5", "forward_logs": "1", "octue_sdk_version": "0.27.1"}}} -{"parent_sdk_version": "0.27.2", "question": {"data": "{\"input_values\": {\"height\": 4, \"width\": 72}, \"input_manifest\": \"{\\n \\\"datasets\\\": {\\n \\\"my_dataset\\\": \\\"/var/folders/sk/hf5fbp616c77tsys9lz55qn40000gp/T/tmpwdtgqbct\\\"\\n },\\n \\\"id\\\": \\\"19f7d4f8-7898-4c0b-b3dd-42685292093f\\\",\\n \\\"name\\\": null\\n}\"}", "attributes": {"question_uuid": "2bc7708c-d59c-4bf6-a14f-eb6bf0616ae8", "forward_logs": "1", "octue_sdk_version": "0.27.2"}}} -{"parent_sdk_version": "0.27.3", "question": {"data": "{\"input_values\": {\"height\": 4, \"width\": 72}, \"input_manifest\": \"{\\n \\\"datasets\\\": {\\n \\\"my_dataset\\\": \\\"/var/folders/sk/hf5fbp616c77tsys9lz55qn40000gp/T/tmpk7gopmox\\\"\\n },\\n \\\"id\\\": \\\"8c8af814-c103-4e7e-8567-71189d39cd67\\\",\\n \\\"name\\\": null\\n}\"}", "attributes": {"question_uuid": "bb89f308-af0b-4fa2-9850-953198cd52bc", "forward_logs": "1", "octue_sdk_version": "0.27.3"}}} -{"parent_sdk_version": "0.28.0", "question": {"data": "{\"input_values\": {\"height\": 4, \"width\": 72}, \"input_manifest\": \"{\\n \\\"datasets\\\": {\\n \\\"my_dataset\\\": \\\"/var/folders/sk/hf5fbp616c77tsys9lz55qn40000gp/T/tmpo7ogamvn\\\"\\n },\\n \\\"id\\\": \\\"37288165-9dc7-48a5-90bd-7ac51e2d5e0f\\\",\\n \\\"name\\\": null\\n}\"}", "attributes": {"question_uuid": "ea2a6af7-bf8e-4684-aa4a-acea31bfcb0f", "forward_logs": "1", "octue_sdk_version": "0.28.0"}}} -{"parent_sdk_version": "0.28.1", "question": {"data": "{\"input_values\": {\"height\": 4, \"width\": 72}, \"input_manifest\": \"{\\n \\\"datasets\\\": {\\n \\\"my_dataset\\\": \\\"/var/folders/sk/hf5fbp616c77tsys9lz55qn40000gp/T/tmpdpiczvsi\\\"\\n },\\n \\\"id\\\": \\\"08fccbb4-c720-4b7d-962e-fcfdcb1faf44\\\",\\n \\\"name\\\": null\\n}\"}", "attributes": {"question_uuid": "9d2ac715-c831-4fac-9271-2ca3bcf9f0a2", "forward_logs": "1", "octue_sdk_version": "0.28.1"}}} -{"parent_sdk_version": "0.28.2", "question": {"data": "{\"input_values\": {\"height\": 4, \"width\": 72}, \"input_manifest\": \"{\\n \\\"datasets\\\": {\\n \\\"my_dataset\\\": \\\"/var/folders/sk/hf5fbp616c77tsys9lz55qn40000gp/T/tmpfiudyb7o\\\"\\n },\\n \\\"id\\\": \\\"3427cdc6-b019-4e1e-a503-e41ef002d267\\\",\\n \\\"name\\\": null\\n}\"}", "attributes": {"question_uuid": "a3b69538-e691-4095-84c9-558d58932bed", "forward_logs": "1", "octue_sdk_version": "0.28.2"}}} -{"parent_sdk_version": "0.29.0", "question": {"data": "{\"input_values\": {\"height\": 4, \"width\": 72}, \"input_manifest\": \"{\\n \\\"datasets\\\": {\\n \\\"my_dataset\\\": \\\"/var/folders/sk/hf5fbp616c77tsys9lz55qn40000gp/T/tmpke5g_lb2\\\"\\n },\\n \\\"id\\\": \\\"47325dcb-85a4-4493-8946-8e470bf1dd0e\\\",\\n \\\"name\\\": null\\n}\"}", "attributes": {"question_uuid": "c7ff46cd-85c6-48b7-8e17-d9cf3368c9a6", "forward_logs": "1", "octue_sdk_version": "0.29.0"}}} -{"parent_sdk_version": "0.29.1", "question": {"data": "{\"input_values\": {\"height\": 4, \"width\": 72}, \"input_manifest\": \"{\\n \\\"datasets\\\": {\\n \\\"my_dataset\\\": \\\"/var/folders/sk/hf5fbp616c77tsys9lz55qn40000gp/T/tmpr43qhdhq\\\"\\n },\\n \\\"id\\\": \\\"9d33d30a-87b6-43be-87b8-67c8420cac59\\\",\\n \\\"name\\\": null\\n}\"}", "attributes": {"question_uuid": "dab60e77-13cb-4d0d-b4de-04c416117826", "forward_logs": "1", "octue_sdk_version": "0.29.1"}}} -{"parent_sdk_version": "0.29.10", "question": {"data": "{\"input_values\": {\"height\": 4, \"width\": 72}, \"input_manifest\": \"{\\n \\\"datasets\\\": {\\n \\\"my_dataset\\\": \\\"/var/folders/sk/hf5fbp616c77tsys9lz55qn40000gp/T/tmphwp7l7gm\\\"\\n },\\n \\\"id\\\": \\\"1041e1ac-405a-4f9d-8a26-d1e9bf9ee806\\\",\\n \\\"name\\\": null\\n}\"}", "attributes": {"question_uuid": "ca859dfa-6e2b-439e-be6b-87a3ceb26c54", "forward_logs": "1", "octue_sdk_version": "0.29.10"}}} -{"parent_sdk_version": "0.29.11", "question": {"data": "{\"input_values\": {\"height\": 4, \"width\": 72}, \"input_manifest\": \"{\\n \\\"datasets\\\": {\\n \\\"my_dataset\\\": \\\"/var/folders/sk/hf5fbp616c77tsys9lz55qn40000gp/T/tmpoyp8b7aw\\\"\\n },\\n \\\"id\\\": \\\"b925c38e-74a7-44c8-9021-e76763295494\\\",\\n \\\"name\\\": null\\n}\"}", "attributes": {"question_uuid": "ddc8ac82-a6e1-4bd3-8385-debcfe81e33b", "forward_logs": "1", "octue_sdk_version": "0.29.11"}}} -{"parent_sdk_version": "0.29.2", "question": {"data": "{\"input_values\": {\"height\": 4, \"width\": 72}, \"input_manifest\": \"{\\n \\\"datasets\\\": {\\n \\\"my_dataset\\\": \\\"/var/folders/sk/hf5fbp616c77tsys9lz55qn40000gp/T/tmpo76vc891\\\"\\n },\\n \\\"id\\\": \\\"e0792359-be79-454f-a302-2eb22e30afc0\\\",\\n \\\"name\\\": null\\n}\"}", "attributes": {"question_uuid": "5b7efdef-e9e5-4c60-864c-01c4c6bfc0b3", "forward_logs": "1", "octue_sdk_version": "0.29.2"}}} -{"parent_sdk_version": "0.29.3", "question": {"data": "{\"input_values\": {\"height\": 4, \"width\": 72}, \"input_manifest\": \"{\\n \\\"datasets\\\": {\\n \\\"my_dataset\\\": \\\"/var/folders/sk/hf5fbp616c77tsys9lz55qn40000gp/T/tmptipd39of\\\"\\n },\\n \\\"id\\\": \\\"2efa36c1-55ce-4aae-917e-f3c4eea2469e\\\",\\n \\\"name\\\": null\\n}\"}", "attributes": {"question_uuid": "63a0bf69-9dd6-4cd7-92e8-e2d0bf492d76", "forward_logs": "1", "octue_sdk_version": "0.29.3"}}} -{"parent_sdk_version": "0.29.4", "question": {"data": "{\"input_values\": {\"height\": 4, \"width\": 72}, \"input_manifest\": \"{\\n \\\"datasets\\\": {\\n \\\"my_dataset\\\": \\\"/var/folders/sk/hf5fbp616c77tsys9lz55qn40000gp/T/tmpbcspzwyo\\\"\\n },\\n \\\"id\\\": \\\"2eda7712-aed7-4ee9-8345-e6c751683d3b\\\",\\n \\\"name\\\": null\\n}\"}", "attributes": {"question_uuid": "da0af8ba-fe4a-44f5-8a7b-fad3bf35c8d1", "forward_logs": "1", "octue_sdk_version": "0.29.4"}}} -{"parent_sdk_version": "0.29.5", "question": {"data": "{\"input_values\": {\"height\": 4, \"width\": 72}, \"input_manifest\": \"{\\n \\\"datasets\\\": {\\n \\\"my_dataset\\\": \\\"/var/folders/sk/hf5fbp616c77tsys9lz55qn40000gp/T/tmpy76oi_27\\\"\\n },\\n \\\"id\\\": \\\"dd132920-06a9-478b-8392-9bf04fb2625d\\\",\\n \\\"name\\\": null\\n}\"}", "attributes": {"question_uuid": "310cce29-1673-4a02-a976-67e865beca0d", "forward_logs": "1", "octue_sdk_version": "0.29.5"}}} -{"parent_sdk_version": "0.29.6", "question": {"data": "{\"input_values\": {\"height\": 4, \"width\": 72}, \"input_manifest\": \"{\\n \\\"datasets\\\": {\\n \\\"my_dataset\\\": \\\"/var/folders/sk/hf5fbp616c77tsys9lz55qn40000gp/T/tmp4xke_i5b\\\"\\n },\\n \\\"id\\\": \\\"e3efdf42-4f88-4b45-a3db-327c29a045cd\\\",\\n \\\"name\\\": null\\n}\"}", "attributes": {"question_uuid": "0c56631c-e441-44dd-b5f2-518a6ab963dc", "forward_logs": "1", "octue_sdk_version": "0.29.6"}}} -{"parent_sdk_version": "0.29.7", "question": {"data": "{\"input_values\": {\"height\": 4, \"width\": 72}, \"input_manifest\": \"{\\n \\\"datasets\\\": {\\n \\\"my_dataset\\\": \\\"/var/folders/sk/hf5fbp616c77tsys9lz55qn40000gp/T/tmphk_t9z1n\\\"\\n },\\n \\\"id\\\": \\\"9efd71ec-babd-4ab0-b7ee-f998bc42c408\\\",\\n \\\"name\\\": null\\n}\"}", "attributes": {"question_uuid": "26ce26c8-ad0c-46f2-a353-7e5a6ab20593", "forward_logs": "1", "octue_sdk_version": "0.29.7"}}} -{"parent_sdk_version": "0.29.8", "question": {"data": "{\"input_values\": {\"height\": 4, \"width\": 72}, \"input_manifest\": \"{\\n \\\"datasets\\\": {\\n \\\"my_dataset\\\": \\\"/var/folders/sk/hf5fbp616c77tsys9lz55qn40000gp/T/tmpyj5_o6ub\\\"\\n },\\n \\\"id\\\": \\\"619e0548-d2e5-45dc-acaf-9ac77e19a874\\\",\\n \\\"name\\\": null\\n}\"}", "attributes": {"question_uuid": "78bf1a07-18d9-4178-8056-81bb58683bd8", "forward_logs": "1", "octue_sdk_version": "0.29.8"}}} -{"parent_sdk_version": "0.29.9", "question": {"data": "{\"input_values\": {\"height\": 4, \"width\": 72}, \"input_manifest\": \"{\\n \\\"datasets\\\": {\\n \\\"my_dataset\\\": \\\"/var/folders/sk/hf5fbp616c77tsys9lz55qn40000gp/T/tmpiorgsxjg\\\"\\n },\\n \\\"id\\\": \\\"2456d2a1-c762-4fc8-b3a7-272bfc52f776\\\",\\n \\\"name\\\": null\\n}\"}", "attributes": {"question_uuid": "589aa106-a4a6-4b0c-b37f-17a1026a5d01", "forward_logs": "1", "octue_sdk_version": "0.29.9"}}} {"parent_sdk_version": "0.30.0", "question": {"data": "{\"input_values\": {\"height\": 4, \"width\": 72}, \"input_manifest\": \"{\\n \\\"datasets\\\": {\\n \\\"my_dataset\\\": \\\"/var/folders/sk/hf5fbp616c77tsys9lz55qn40000gp/T/tmpw94cjhfq\\\"\\n },\\n \\\"id\\\": \\\"cf38d606-c9d2-4f54-a806-6337b1fa30fb\\\",\\n \\\"name\\\": null\\n}\"}", "attributes": {"question_uuid": "8157304e-e056-4ec9-80ef-dce540c27191", "forward_logs": "1", "octue_sdk_version": "0.30.0"}}} {"parent_sdk_version": "0.31.0", "question": {"data": "{\"input_values\": {\"height\": 4, \"width\": 72}, \"input_manifest\": \"{\\n \\\"datasets\\\": {\\n \\\"my_dataset\\\": \\\"/var/folders/sk/hf5fbp616c77tsys9lz55qn40000gp/T/tmpzrl_zrel\\\"\\n },\\n \\\"id\\\": \\\"b2d0a0cf-cdc6-48d8-92a7-d7cbee14807f\\\",\\n \\\"name\\\": null\\n}\"}", "attributes": {"question_uuid": "130b92bb-4486-4785-92ab-96f641367b69", "forward_logs": "1", "octue_sdk_version": "0.31.0", "allow_save_diagnostics_data_on_crash": "1"}}} {"parent_sdk_version": "0.32.0", "question": {"data": "{\"input_values\": {\"height\": 4, \"width\": 72}, \"input_manifest\": \"{\\n \\\"datasets\\\": {\\n \\\"my_dataset\\\": \\\"/var/folders/sk/hf5fbp616c77tsys9lz55qn40000gp/T/tmpg9dgmfjy\\\"\\n },\\n \\\"id\\\": \\\"7f33f9f5-79e6-46af-b450-50c1b7ad19d5\\\",\\n \\\"name\\\": null\\n}\"}", "attributes": {"question_uuid": "9e982e65-5937-4e89-9c69-d86640805ce4", "forward_logs": "1", "octue_sdk_version": "0.32.0", "allow_save_diagnostics_data_on_crash": "1"}}} @@ -81,4 +39,3 @@ {"parent_sdk_version": "0.49.1", "question": {"data": "{\"input_values\": {\"height\": 4, \"width\": 72}, \"input_manifest\": {\"id\": \"34216d6d-e32e-4c40-8b05-ee9bd71966c9\", \"name\": null, \"datasets\": {\"my_dataset\": \"/var/folders/sk/hf5fbp616c77tsys9lz55qn40000gp/T/tmppi1e5t2n\"}}, \"children\": null, \"message_number\": 0}", "attributes": {"question_uuid": "3b1224da-8e7f-4b1b-8ef3-c5cf1a5e698c", "forward_logs": "1", "allow_save_diagnostics_data_on_crash": "1", "octue_sdk_version": "0.49.1"}}} {"parent_sdk_version": "0.49.2", "question": {"data": "{\"input_values\": {\"height\": 4, \"width\": 72}, \"input_manifest\": {\"id\": \"bdadcd12-a51b-4571-9db3-9d240bd15faa\", \"name\": null, \"datasets\": {\"my_dataset\": \"/var/folders/sk/hf5fbp616c77tsys9lz55qn40000gp/T/tmpw3232ii0\"}}, \"children\": null, \"message_number\": 0}", "attributes": {"question_uuid": "0b57da2c-38e2-4f8b-9368-fe35125da8fb", "forward_logs": "1", "allow_save_diagnostics_data_on_crash": "1", "octue_sdk_version": "0.49.2"}}} {"parent_sdk_version": "0.50.0", "question": {"data": "{\"input_values\": {\"height\": 4, \"width\": 72}, \"input_manifest\": {\"id\": \"2d618d16-2a2b-437b-8db7-d5139e1645f2\", \"name\": null, \"datasets\": {\"my_dataset\": \"/var/folders/sk/hf5fbp616c77tsys9lz55qn40000gp/T/tmpr7jpj4sp\"}}, \"children\": null, \"message_number\": 0}", "attributes": {"question_uuid": "7bc572dc-ab8b-4aed-a132-b0b509caceb3", "forward_logs": "1", "allow_save_diagnostics_data_on_crash": "1", "octue_sdk_version": "0.50.0"}}} -{"parent_sdk_version": "0.50.1", "question": {"data": "{\"input_values\": {\"height\": 4, \"width\": 72}, \"input_manifest\": {\"id\": \"64fd48b8-8c81-4c7b-9cd3-466b8e612b60\", \"name\": null, \"datasets\": {\"my_dataset\": \"/var/folders/sk/hf5fbp616c77tsys9lz55qn40000gp/T/tmpya5m1ib5\"}}, \"children\": null, \"message_number\": 0}", "attributes": {"question_uuid": "d54e9568-c88f-4233-a217-636bf3a77f74", "forward_logs": "1", "allow_save_diagnostics_data_on_crash": "1", "octue_sdk_version": "0.50.1"}}} diff --git a/octue/metadata/version_compatibilities.json b/octue/metadata/version_compatibilities.json index 08ec0808f..302109633 100644 --- a/octue/metadata/version_compatibilities.json +++ b/octue/metadata/version_compatibilities.json @@ -9,48 +9,6 @@ "0.32.0": true, "0.31.0": true, "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, "0.36.0": true, "0.37.0": true, "0.38.0": true, @@ -83,3535 +41,10 @@ "0.49.1": true, "0.49.2": true, "0.50.0": true, - "0.50.1": true - }, - "0.34.1": { - "0.40.1": true, - "0.38.1": true, - "0.35.0": true, - "0.34.1": true, - "0.34.0": true, - "0.33.0": true, - "0.32.0": true, - "0.31.0": true, - "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, - "0.36.0": true, - "0.37.0": true, - "0.38.0": true, - "0.39.0": true, - "0.40.0": true, - "0.40.2": true, - "0.41.0": true, - "0.41.1": true, - "0.42.0": true, - "0.42.1": true, - "0.43.0": true, - "0.43.1": true, - "0.43.2": true, - "0.43.3": true, - "0.43.4": true, - "0.43.5": true, - "0.43.6": true, - "0.43.7": true, - "0.44.0": true, - "0.45.0": true, - "0.46.0": true, - "0.46.1": true, - "0.46.2": true, - "0.46.3": true, - "0.47.0": true, - "0.47.1": true, - "0.47.2": true, - "0.48.0": true, - "0.49.0": true, - "0.49.1": true, - "0.49.2": true, - "0.50.0": true, - "0.50.1": true - }, - "0.34.0": { - "0.40.1": true, - "0.38.1": true, - "0.35.0": true, - "0.34.1": true, - "0.34.0": true, - "0.33.0": true, - "0.32.0": true, - "0.31.0": true, - "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, - "0.36.0": true, - "0.37.0": true, - "0.38.0": true, - "0.39.0": true, - "0.40.0": true, - "0.40.2": true, - "0.41.0": true, - "0.41.1": true, - "0.42.0": true, - "0.42.1": true, - "0.43.0": true, - "0.43.1": true, - "0.43.2": true, - "0.43.3": true, - "0.43.4": true, - "0.43.5": true, - "0.43.6": true, - "0.43.7": true, - "0.44.0": true, - "0.45.0": true, - "0.46.0": true, - "0.46.1": true, - "0.46.2": true, - "0.46.3": true, - "0.47.0": true, - "0.47.1": true, - "0.47.2": true, - "0.48.0": true, - "0.49.0": true, - "0.49.1": true, - "0.49.2": true, - "0.50.0": true, - "0.50.1": true - }, - "0.33.0": { - "0.40.1": true, - "0.38.1": true, - "0.35.0": true, - "0.34.1": true, - "0.34.0": true, - "0.33.0": true, - "0.32.0": true, - "0.31.0": true, - "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, - "0.36.0": true, - "0.37.0": true, - "0.38.0": true, - "0.39.0": true, - "0.40.0": true, - "0.40.2": true, - "0.41.0": true, - "0.41.1": true, - "0.42.0": true, - "0.42.1": true, - "0.43.0": true, - "0.43.1": true, - "0.43.2": true, - "0.43.3": true, - "0.43.4": true, - "0.43.5": true, - "0.43.6": true, - "0.43.7": true, - "0.44.0": true, - "0.45.0": true, - "0.46.0": true, - "0.46.1": true, - "0.46.2": true, - "0.46.3": true, - "0.47.0": true, - "0.47.1": true, - "0.47.2": true, - "0.48.0": true, - "0.49.0": true, - "0.49.1": true, - "0.49.2": true, - "0.50.0": true, - "0.50.1": true - }, - "0.32.0": { - "0.40.1": true, - "0.38.1": true, - "0.35.0": true, - "0.34.1": true, - "0.34.0": true, - "0.33.0": true, - "0.32.0": true, - "0.31.0": true, - "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, - "0.36.0": true, - "0.37.0": true, - "0.38.0": true, - "0.39.0": true, - "0.40.0": true, - "0.40.2": true, - "0.41.0": true, - "0.41.1": true, - "0.42.0": true, - "0.42.1": true, - "0.43.0": true, - "0.43.1": true, - "0.43.2": true, - "0.43.3": true, - "0.43.4": true, - "0.43.5": true, - "0.43.6": true, - "0.43.7": true, - "0.44.0": true, - "0.45.0": true, - "0.46.0": true, - "0.46.1": true, - "0.46.2": true, - "0.46.3": true, - "0.47.0": true, - "0.47.1": true, - "0.47.2": true, - "0.48.0": true, - "0.49.0": true, - "0.49.1": true, - "0.49.2": true, - "0.50.0": true, - "0.50.1": true - }, - "0.31.0": { - "0.40.1": true, - "0.38.1": true, - "0.35.0": true, - "0.34.1": true, - "0.34.0": true, - "0.33.0": true, - "0.32.0": true, - "0.31.0": true, - "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, - "0.36.0": true, - "0.37.0": true, - "0.38.0": true, - "0.39.0": true, - "0.40.0": true, - "0.40.2": true, - "0.41.0": true, - "0.41.1": true, - "0.42.0": true, - "0.42.1": true, - "0.43.0": true, - "0.43.1": true, - "0.43.2": true, - "0.43.3": true, - "0.43.4": true, - "0.43.5": true, - "0.43.6": true, - "0.43.7": true, - "0.44.0": true, - "0.45.0": true, - "0.46.0": true, - "0.46.1": true, - "0.46.2": true, - "0.46.3": true, - "0.47.0": true, - "0.47.1": true, - "0.47.2": true, - "0.48.0": true, - "0.49.0": true, - "0.49.1": true, - "0.49.2": true, - "0.50.0": true, - "0.50.1": true - }, - "0.30.0": { - "0.40.1": true, - "0.38.1": true, - "0.35.0": true, - "0.34.1": true, - "0.34.0": true, - "0.33.0": true, - "0.32.0": true, - "0.31.0": true, - "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, - "0.36.0": true, - "0.37.0": true, - "0.38.0": true, - "0.39.0": true, - "0.40.0": true, - "0.40.2": true, - "0.41.0": true, - "0.41.1": true, - "0.42.0": true, - "0.42.1": true, - "0.43.0": true, - "0.43.1": true, - "0.43.2": true, - "0.43.3": true, - "0.43.4": true, - "0.43.5": true, - "0.43.6": true, - "0.43.7": true, - "0.44.0": true, - "0.45.0": true, - "0.46.0": true, - "0.46.1": true, - "0.46.2": true, - "0.46.3": true, - "0.47.0": true, - "0.47.1": true, - "0.47.2": true, - "0.48.0": true, - "0.49.0": true, - "0.49.1": true, - "0.49.2": true, - "0.50.0": true, - "0.50.1": true - }, - "0.29.11": { - "0.40.1": true, - "0.38.1": true, - "0.35.0": true, - "0.34.1": true, - "0.34.0": true, - "0.33.0": true, - "0.32.0": true, - "0.31.0": true, - "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, - "0.36.0": true, - "0.37.0": true, - "0.38.0": true, - "0.39.0": true, - "0.40.0": true, - "0.40.2": true, - "0.41.0": true, - "0.41.1": true, - "0.42.0": true, - "0.42.1": true, - "0.43.0": true, - "0.43.1": true, - "0.43.2": true, - "0.43.3": true, - "0.43.4": true, - "0.43.5": true, - "0.43.6": true, - "0.43.7": true, - "0.44.0": true, - "0.45.0": true, - "0.46.0": true, - "0.46.1": true, - "0.46.2": true, - "0.46.3": true, - "0.47.0": true, - "0.47.1": true, - "0.47.2": true, - "0.48.0": true, - "0.49.0": true, - "0.49.1": true, - "0.49.2": true, - "0.50.0": true, - "0.50.1": true - }, - "0.29.10": { - "0.40.1": true, - "0.38.1": true, - "0.35.0": true, - "0.34.1": true, - "0.34.0": true, - "0.33.0": true, - "0.32.0": true, - "0.31.0": true, - "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, - "0.36.0": true, - "0.37.0": true, - "0.38.0": true, - "0.39.0": true, - "0.40.0": true, - "0.40.2": true, - "0.41.0": true, - "0.41.1": true, - "0.42.0": true, - "0.42.1": true, - "0.43.0": true, - "0.43.1": true, - "0.43.2": true, - "0.43.3": true, - "0.43.4": true, - "0.43.5": true, - "0.43.6": true, - "0.43.7": true, - "0.44.0": true, - "0.45.0": true, - "0.46.0": true, - "0.46.1": true, - "0.46.2": true, - "0.46.3": true, - "0.47.0": true, - "0.47.1": true, - "0.47.2": true, - "0.48.0": true, - "0.49.0": true, - "0.49.1": true, - "0.49.2": true, - "0.50.0": true, - "0.50.1": true - }, - "0.29.9": { - "0.40.1": true, - "0.38.1": true, - "0.35.0": true, - "0.34.1": true, - "0.34.0": true, - "0.33.0": true, - "0.32.0": true, - "0.31.0": true, - "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, - "0.36.0": true, - "0.37.0": true, - "0.38.0": true, - "0.39.0": true, - "0.40.0": true, - "0.40.2": true, - "0.41.0": true, - "0.41.1": true, - "0.42.0": true, - "0.42.1": true, - "0.43.0": true, - "0.43.1": true, - "0.43.2": true, - "0.43.3": true, - "0.43.4": true, - "0.43.5": true, - "0.43.6": true, - "0.43.7": true, - "0.44.0": true, - "0.45.0": true, - "0.46.0": true, - "0.46.1": true, - "0.46.2": true, - "0.46.3": true, - "0.47.0": true, - "0.47.1": true, - "0.47.2": true, - "0.48.0": true, - "0.49.0": true, - "0.49.1": true, - "0.49.2": true, - "0.50.0": true, - "0.50.1": true - }, - "0.29.8": { - "0.40.1": true, - "0.38.1": true, - "0.35.0": true, - "0.34.1": true, - "0.34.0": true, - "0.33.0": true, - "0.32.0": true, - "0.31.0": true, - "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, - "0.36.0": true, - "0.37.0": true, - "0.38.0": true, - "0.39.0": true, - "0.40.0": true, - "0.40.2": true, - "0.41.0": true, - "0.41.1": true, - "0.42.0": true, - "0.42.1": true, - "0.43.0": true, - "0.43.1": true, - "0.43.2": true, - "0.43.3": true, - "0.43.4": true, - "0.43.5": true, - "0.43.6": true, - "0.43.7": true, - "0.44.0": true, - "0.45.0": true, - "0.46.0": true, - "0.46.1": true, - "0.46.2": true, - "0.46.3": true, - "0.47.0": true, - "0.47.1": true, - "0.47.2": true, - "0.48.0": true, - "0.49.0": true, - "0.49.1": true, - "0.49.2": true, - "0.50.0": true, - "0.50.1": true - }, - "0.29.7": { - "0.40.1": true, - "0.38.1": true, - "0.35.0": true, - "0.34.1": true, - "0.34.0": true, - "0.33.0": true, - "0.32.0": true, - "0.31.0": true, - "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, - "0.36.0": true, - "0.37.0": true, - "0.38.0": true, - "0.39.0": true, - "0.40.0": true, - "0.40.2": true, - "0.41.0": true, - "0.41.1": true, - "0.42.0": true, - "0.42.1": true, - "0.43.0": true, - "0.43.1": true, - "0.43.2": true, - "0.43.3": true, - "0.43.4": true, - "0.43.5": true, - "0.43.6": true, - "0.43.7": true, - "0.44.0": true, - "0.45.0": true, - "0.46.0": true, - "0.46.1": true, - "0.46.2": true, - "0.46.3": true, - "0.47.0": true, - "0.47.1": true, - "0.47.2": true, - "0.48.0": true, - "0.49.0": true, - "0.49.1": true, - "0.49.2": true, - "0.50.0": true, - "0.50.1": true - }, - "0.29.6": { - "0.40.1": true, - "0.38.1": true, - "0.35.0": true, - "0.34.1": true, - "0.34.0": true, - "0.33.0": true, - "0.32.0": true, - "0.31.0": true, - "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, - "0.36.0": true, - "0.37.0": true, - "0.38.0": true, - "0.39.0": true, - "0.40.0": true, - "0.40.2": true, - "0.41.0": true, - "0.41.1": true, - "0.42.0": true, - "0.42.1": true, - "0.43.0": true, - "0.43.1": true, - "0.43.2": true, - "0.43.3": true, - "0.43.4": true, - "0.43.5": true, - "0.43.6": true, - "0.43.7": true, - "0.44.0": true, - "0.45.0": true, - "0.46.0": true, - "0.46.1": true, - "0.46.2": true, - "0.46.3": true, - "0.47.0": true, - "0.47.1": true, - "0.47.2": true, - "0.48.0": true, - "0.49.0": true, - "0.49.1": true, - "0.49.2": true, - "0.50.0": true, - "0.50.1": true - }, - "0.29.5": { - "0.40.1": true, - "0.38.1": true, - "0.35.0": true, - "0.34.1": true, - "0.34.0": true, - "0.33.0": true, - "0.32.0": true, - "0.31.0": true, - "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, - "0.36.0": true, - "0.37.0": true, - "0.38.0": true, - "0.39.0": true, - "0.40.0": true, - "0.40.2": true, - "0.41.0": true, - "0.41.1": true, - "0.42.0": true, - "0.42.1": true, - "0.43.0": true, - "0.43.1": true, - "0.43.2": true, - "0.43.3": true, - "0.43.4": true, - "0.43.5": true, - "0.43.6": true, - "0.43.7": true, - "0.44.0": true, - "0.45.0": true, - "0.46.0": true, - "0.46.1": true, - "0.46.2": true, - "0.46.3": true, - "0.47.0": true, - "0.47.1": true, - "0.47.2": true, - "0.48.0": true, - "0.49.0": true, - "0.49.1": true, - "0.49.2": true, - "0.50.0": true, - "0.50.1": true - }, - "0.29.4": { - "0.40.1": true, - "0.38.1": true, - "0.35.0": true, - "0.34.1": true, - "0.34.0": true, - "0.33.0": true, - "0.32.0": true, - "0.31.0": true, - "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, - "0.36.0": true, - "0.37.0": true, - "0.38.0": true, - "0.39.0": true, - "0.40.0": true, - "0.40.2": true, - "0.41.0": true, - "0.41.1": true, - "0.42.0": true, - "0.42.1": true, - "0.43.0": true, - "0.43.1": true, - "0.43.2": true, - "0.43.3": true, - "0.43.4": true, - "0.43.5": true, - "0.43.6": true, - "0.43.7": true, - "0.44.0": true, - "0.45.0": true, - "0.46.0": true, - "0.46.1": true, - "0.46.2": true, - "0.46.3": true, - "0.47.0": true, - "0.47.1": true, - "0.47.2": true, - "0.48.0": true, - "0.49.0": true, - "0.49.1": true, - "0.49.2": true, - "0.50.0": true, - "0.50.1": true - }, - "0.29.3": { - "0.40.1": true, - "0.38.1": true, - "0.35.0": true, - "0.34.1": true, - "0.34.0": true, - "0.33.0": true, - "0.32.0": true, - "0.31.0": true, - "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, - "0.36.0": true, - "0.37.0": true, - "0.38.0": true, - "0.39.0": true, - "0.40.0": true, - "0.40.2": true, - "0.41.0": true, - "0.41.1": true, - "0.42.0": true, - "0.42.1": true, - "0.43.0": true, - "0.43.1": true, - "0.43.2": true, - "0.43.3": true, - "0.43.4": true, - "0.43.5": true, - "0.43.6": true, - "0.43.7": true, - "0.44.0": true, - "0.45.0": true, - "0.46.0": true, - "0.46.1": true, - "0.46.2": true, - "0.46.3": true, - "0.47.0": true, - "0.47.1": true, - "0.47.2": true, - "0.48.0": true, - "0.49.0": true, - "0.49.1": true, - "0.49.2": true, - "0.50.0": true, - "0.50.1": true - }, - "0.29.2": { - "0.40.1": true, - "0.38.1": true, - "0.35.0": true, - "0.34.1": true, - "0.34.0": true, - "0.33.0": true, - "0.32.0": true, - "0.31.0": true, - "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, - "0.36.0": true, - "0.37.0": true, - "0.38.0": true, - "0.39.0": true, - "0.40.0": true, - "0.40.2": true, - "0.41.0": true, - "0.41.1": true, - "0.42.0": true, - "0.42.1": true, - "0.43.0": true, - "0.43.1": true, - "0.43.2": true, - "0.43.3": true, - "0.43.4": true, - "0.43.5": true, - "0.43.6": true, - "0.43.7": true, - "0.44.0": true, - "0.45.0": true, - "0.46.0": true, - "0.46.1": true, - "0.46.2": true, - "0.46.3": true, - "0.47.0": true, - "0.47.1": true, - "0.47.2": true, - "0.48.0": true, - "0.49.0": true, - "0.49.1": true, - "0.49.2": true, - "0.50.0": true, - "0.50.1": true - }, - "0.29.1": { - "0.40.1": true, - "0.38.1": true, - "0.35.0": true, - "0.34.1": true, - "0.34.0": true, - "0.33.0": true, - "0.32.0": true, - "0.31.0": true, - "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, - "0.36.0": true, - "0.37.0": true, - "0.38.0": true, - "0.39.0": true, - "0.40.0": true, - "0.40.2": true, - "0.41.0": true, - "0.41.1": true, - "0.42.0": true, - "0.42.1": true, - "0.43.0": true, - "0.43.1": true, - "0.43.2": true, - "0.43.3": true, - "0.43.4": true, - "0.43.5": true, - "0.43.6": true, - "0.43.7": true, - "0.44.0": true, - "0.45.0": true, - "0.46.0": true, - "0.46.1": true, - "0.46.2": true, - "0.46.3": true, - "0.47.0": true, - "0.47.1": true, - "0.47.2": true, - "0.48.0": true, - "0.49.0": true, - "0.49.1": true, - "0.49.2": true, - "0.50.0": true, - "0.50.1": true - }, - "0.29.0": { - "0.40.1": true, - "0.38.1": true, - "0.35.0": true, - "0.34.1": true, - "0.34.0": true, - "0.33.0": true, - "0.32.0": true, - "0.31.0": true, - "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, - "0.36.0": true, - "0.37.0": true, - "0.38.0": true, - "0.39.0": true, - "0.40.0": true, - "0.40.2": true, - "0.41.0": true, - "0.41.1": true, - "0.42.0": true, - "0.42.1": true, - "0.43.0": true, - "0.43.1": true, - "0.43.2": true, - "0.43.3": true, - "0.43.4": true, - "0.43.5": true, - "0.43.6": true, - "0.43.7": true, - "0.44.0": true, - "0.45.0": true, - "0.46.0": true, - "0.46.1": true, - "0.46.2": true, - "0.46.3": true, - "0.47.0": true, - "0.47.1": true, - "0.47.2": true, - "0.48.0": true, - "0.49.0": true, - "0.49.1": true, - "0.49.2": true, - "0.50.0": true, - "0.50.1": true - }, - "0.28.2": { - "0.40.1": true, - "0.38.1": true, - "0.35.0": true, - "0.34.1": true, - "0.34.0": true, - "0.33.0": true, - "0.32.0": true, - "0.31.0": true, - "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, - "0.36.0": true, - "0.37.0": true, - "0.38.0": true, - "0.39.0": true, - "0.40.0": true, - "0.40.2": true, - "0.41.0": true, - "0.41.1": true, - "0.42.0": true, - "0.42.1": true, - "0.43.0": true, - "0.43.1": true, - "0.43.2": true, - "0.43.3": true, - "0.43.4": true, - "0.43.5": true, - "0.43.6": true, - "0.43.7": true, - "0.44.0": true, - "0.45.0": true, - "0.46.0": true, - "0.46.1": true, - "0.46.2": true, - "0.46.3": true, - "0.47.0": true, - "0.47.1": true, - "0.47.2": true, - "0.48.0": true, - "0.49.0": true, - "0.49.1": true, - "0.49.2": true, - "0.50.0": true, - "0.50.1": true - }, - "0.28.1": { - "0.40.1": true, - "0.38.1": true, - "0.35.0": true, - "0.34.1": true, - "0.34.0": true, - "0.33.0": true, - "0.32.0": true, - "0.31.0": true, - "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, - "0.36.0": true, - "0.37.0": true, - "0.38.0": true, - "0.39.0": true, - "0.40.0": true, - "0.40.2": true, - "0.41.0": true, - "0.41.1": true, - "0.42.0": true, - "0.42.1": true, - "0.43.0": true, - "0.43.1": true, - "0.43.2": true, - "0.43.3": true, - "0.43.4": true, - "0.43.5": true, - "0.43.6": true, - "0.43.7": true, - "0.44.0": true, - "0.45.0": true, - "0.46.0": true, - "0.46.1": true, - "0.46.2": true, - "0.46.3": true, - "0.47.0": true, - "0.47.1": true, - "0.47.2": true, - "0.48.0": true, - "0.49.0": true, - "0.49.1": true, - "0.49.2": true, - "0.50.0": true, - "0.50.1": true - }, - "0.28.0": { - "0.40.1": true, - "0.38.1": true, - "0.35.0": true, - "0.34.1": true, - "0.34.0": true, - "0.33.0": true, - "0.32.0": true, - "0.31.0": true, - "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, - "0.36.0": true, - "0.37.0": true, - "0.38.0": true, - "0.39.0": true, - "0.40.0": true, - "0.40.2": true, - "0.41.0": true, - "0.41.1": true, - "0.42.0": true, - "0.42.1": true, - "0.43.0": true, - "0.43.1": true, - "0.43.2": true, - "0.43.3": true, - "0.43.4": true, - "0.43.5": true, - "0.43.6": true, - "0.43.7": true, - "0.44.0": true, - "0.45.0": true, - "0.46.0": true, - "0.46.1": true, - "0.46.2": true, - "0.46.3": true, - "0.47.0": true, - "0.47.1": true, - "0.47.2": true, - "0.48.0": true, - "0.49.0": true, - "0.49.1": true, - "0.49.2": true, - "0.50.0": true, - "0.50.1": true - }, - "0.27.3": { - "0.40.1": true, - "0.38.1": true, - "0.35.0": true, - "0.34.1": true, - "0.34.0": true, - "0.33.0": true, - "0.32.0": true, - "0.31.0": true, - "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, - "0.36.0": true, - "0.37.0": true, - "0.38.0": true, - "0.39.0": true, - "0.40.0": true, - "0.40.2": true, - "0.41.0": true, - "0.41.1": true, - "0.42.0": true, - "0.42.1": true, - "0.43.0": true, - "0.43.1": true, - "0.43.2": true, - "0.43.3": true, - "0.43.4": true, - "0.43.5": true, - "0.43.6": true, - "0.43.7": true, - "0.44.0": true, - "0.45.0": true, - "0.46.0": true, - "0.46.1": true, - "0.46.2": true, - "0.46.3": true, - "0.47.0": true, - "0.47.1": true, - "0.47.2": true, - "0.48.0": true, - "0.49.0": true, - "0.49.1": true, - "0.49.2": true, - "0.50.0": true, - "0.50.1": true - }, - "0.27.2": { - "0.40.1": true, - "0.38.1": true, - "0.35.0": true, - "0.34.1": true, - "0.34.0": true, - "0.33.0": true, - "0.32.0": true, - "0.31.0": true, - "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, - "0.36.0": true, - "0.37.0": true, - "0.38.0": true, - "0.39.0": true, - "0.40.0": true, - "0.40.2": true, - "0.41.0": true, - "0.41.1": true, - "0.42.0": true, - "0.42.1": true, - "0.43.0": true, - "0.43.1": true, - "0.43.2": true, - "0.43.3": true, - "0.43.4": true, - "0.43.5": true, - "0.43.6": true, - "0.43.7": true, - "0.44.0": true, - "0.45.0": true, - "0.46.0": true, - "0.46.1": true, - "0.46.2": true, - "0.46.3": true, - "0.47.0": true, - "0.47.1": true, - "0.47.2": true, - "0.48.0": true, - "0.49.0": true, - "0.49.1": true, - "0.49.2": true, - "0.50.0": true, - "0.50.1": true - }, - "0.27.1": { - "0.40.1": true, - "0.38.1": true, - "0.35.0": true, - "0.34.1": true, - "0.34.0": true, - "0.33.0": true, - "0.32.0": true, - "0.31.0": true, - "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, - "0.36.0": true, - "0.37.0": true, - "0.38.0": true, - "0.39.0": true, - "0.40.0": true, - "0.40.2": true, - "0.41.0": true, - "0.41.1": true, - "0.42.0": true, - "0.42.1": true, - "0.43.0": true, - "0.43.1": true, - "0.43.2": true, - "0.43.3": true, - "0.43.4": true, - "0.43.5": true, - "0.43.6": true, - "0.43.7": true, - "0.44.0": true, - "0.45.0": true, - "0.46.0": true, - "0.46.1": true, - "0.46.2": true, - "0.46.3": true, - "0.47.0": true, - "0.47.1": true, - "0.47.2": true, - "0.48.0": true, - "0.49.0": true, - "0.49.1": true, - "0.49.2": true, - "0.50.0": true, - "0.50.1": true - }, - "0.27.0": { - "0.40.1": true, - "0.38.1": true, - "0.35.0": true, - "0.34.1": true, - "0.34.0": true, - "0.33.0": true, - "0.32.0": true, - "0.31.0": true, - "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, - "0.36.0": true, - "0.37.0": true, - "0.38.0": true, - "0.39.0": true, - "0.40.0": true, - "0.40.2": true, - "0.41.0": true, - "0.41.1": true, - "0.42.0": true, - "0.42.1": true, - "0.43.0": true, - "0.43.1": true, - "0.43.2": true, - "0.43.3": true, - "0.43.4": true, - "0.43.5": true, - "0.43.6": true, - "0.43.7": true, - "0.44.0": true, - "0.45.0": true, - "0.46.0": true, - "0.46.1": true, - "0.46.2": true, - "0.46.3": true, - "0.47.0": true, - "0.47.1": true, - "0.47.2": true, - "0.48.0": true, - "0.49.0": true, - "0.49.1": true, - "0.49.2": true, - "0.50.0": true, - "0.50.1": true - }, - "0.26.2": { - "0.40.1": true, - "0.38.1": true, - "0.35.0": true, - "0.34.1": true, - "0.34.0": true, - "0.33.0": true, - "0.32.0": true, - "0.31.0": true, - "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, - "0.36.0": true, - "0.37.0": true, - "0.38.0": true, - "0.39.0": true, - "0.40.0": true, - "0.40.2": true, - "0.41.0": true, - "0.41.1": true, - "0.42.0": true, - "0.42.1": true, - "0.43.0": true, - "0.43.1": true, - "0.43.2": true, - "0.43.3": true, - "0.43.4": true, - "0.43.5": true, - "0.43.6": true, - "0.43.7": true, - "0.44.0": true, - "0.45.0": true, - "0.46.0": true, - "0.46.1": true, - "0.46.2": true, - "0.46.3": true, - "0.47.0": true, - "0.47.1": true, - "0.47.2": true, - "0.48.0": true, - "0.49.0": true, - "0.49.1": true, - "0.49.2": true, - "0.50.0": true, - "0.50.1": true - }, - "0.26.1": { - "0.40.1": true, - "0.38.1": true, - "0.35.0": true, - "0.34.1": true, - "0.34.0": true, - "0.33.0": true, - "0.32.0": true, - "0.31.0": true, - "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, - "0.36.0": true, - "0.37.0": true, - "0.38.0": true, - "0.39.0": true, - "0.40.0": true, - "0.40.2": true, - "0.41.0": true, - "0.41.1": true, - "0.42.0": true, - "0.42.1": true, - "0.43.0": true, - "0.43.1": true, - "0.43.2": true, - "0.43.3": true, - "0.43.4": true, - "0.43.5": true, - "0.43.6": true, - "0.43.7": true, - "0.44.0": true, - "0.45.0": true, - "0.46.0": true, - "0.46.1": true, - "0.46.2": true, - "0.46.3": true, - "0.47.0": true, - "0.47.1": true, - "0.47.2": true, - "0.48.0": true, - "0.49.0": true, - "0.49.1": true, - "0.49.2": true, - "0.50.0": true, - "0.50.1": true - }, - "0.26.0": { - "0.40.1": true, - "0.38.1": true, - "0.35.0": true, - "0.34.1": true, - "0.34.0": true, - "0.33.0": true, - "0.32.0": true, - "0.31.0": true, - "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, - "0.36.0": true, - "0.37.0": true, - "0.38.0": true, - "0.39.0": true, - "0.40.0": true, - "0.40.2": true, - "0.41.0": true, - "0.41.1": true, - "0.42.0": true, - "0.42.1": true, - "0.43.0": true, - "0.43.1": true, - "0.43.2": true, - "0.43.3": true, - "0.43.4": true, - "0.43.5": true, - "0.43.6": true, - "0.43.7": true, - "0.44.0": true, - "0.45.0": true, - "0.46.0": true, - "0.46.1": true, - "0.46.2": true, - "0.46.3": true, - "0.47.0": true, - "0.47.1": true, - "0.47.2": true, - "0.48.0": true, - "0.49.0": true, - "0.49.1": true, - "0.49.2": true, - "0.50.0": true, - "0.50.1": true - }, - "0.25.0": { - "0.40.1": true, - "0.38.1": true, - "0.35.0": true, - "0.34.1": true, - "0.34.0": true, - "0.33.0": true, - "0.32.0": true, - "0.31.0": true, - "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, - "0.36.0": true, - "0.37.0": true, - "0.38.0": true, - "0.39.0": true, - "0.40.0": true, - "0.40.2": true, - "0.41.0": true, - "0.41.1": true, - "0.42.0": true, - "0.42.1": true, - "0.43.0": true, - "0.43.1": true, - "0.43.2": true, - "0.43.3": true, - "0.43.4": true, - "0.43.5": true, - "0.43.6": true, - "0.43.7": true, - "0.44.0": true, - "0.45.0": true, - "0.46.0": true, - "0.46.1": true, - "0.46.2": true, - "0.46.3": true, - "0.47.0": true, - "0.47.1": true, - "0.47.2": true, - "0.48.0": true, - "0.49.0": true, - "0.49.1": true, - "0.49.2": true, - "0.50.0": true, - "0.50.1": true - }, - "0.24.1": { - "0.40.1": true, - "0.38.1": true, - "0.35.0": true, - "0.34.1": true, - "0.34.0": true, - "0.33.0": true, - "0.32.0": true, - "0.31.0": true, - "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, - "0.36.0": true, - "0.37.0": true, - "0.38.0": true, - "0.39.0": true, - "0.40.0": true, - "0.40.2": true, - "0.41.0": true, - "0.41.1": true, - "0.42.0": true, - "0.42.1": true, - "0.43.0": true, - "0.43.1": true, - "0.43.2": true, - "0.43.3": true, - "0.43.4": true, - "0.43.5": true, - "0.43.6": true, - "0.43.7": true, - "0.44.0": true, - "0.45.0": true, - "0.46.0": true, - "0.46.1": true, - "0.46.2": true, - "0.46.3": true, - "0.47.0": true, - "0.47.1": true, - "0.47.2": true, - "0.48.0": true, - "0.49.0": true, - "0.49.1": true, - "0.49.2": true, - "0.50.0": true, - "0.50.1": true - }, - "0.24.0": { - "0.40.1": true, - "0.38.1": true, - "0.35.0": true, - "0.34.1": true, - "0.34.0": true, - "0.33.0": true, - "0.32.0": true, - "0.31.0": true, - "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, - "0.36.0": true, - "0.37.0": true, - "0.38.0": true, - "0.39.0": true, - "0.40.0": true, - "0.40.2": true, - "0.41.0": true, - "0.41.1": true, - "0.42.0": true, - "0.42.1": true, - "0.43.0": true, - "0.43.1": true, - "0.43.2": true, - "0.43.3": true, - "0.43.4": true, - "0.43.5": true, - "0.43.6": true, - "0.43.7": true, - "0.44.0": true, - "0.45.0": true, - "0.46.0": true, - "0.46.1": true, - "0.46.2": true, - "0.46.3": true, - "0.47.0": true, - "0.47.1": true, - "0.47.2": true, - "0.48.0": true, - "0.49.0": true, - "0.49.1": true, - "0.49.2": true, - "0.50.0": true, - "0.50.1": true - }, - "0.23.6": { - "0.40.1": true, - "0.38.1": true, - "0.35.0": true, - "0.34.1": true, - "0.34.0": true, - "0.33.0": true, - "0.32.0": true, - "0.31.0": true, - "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, - "0.36.0": true, - "0.37.0": true, - "0.38.0": true, - "0.39.0": true, - "0.40.0": true, - "0.40.2": true, - "0.41.0": true, - "0.41.1": true, - "0.42.0": true, - "0.42.1": true, - "0.43.0": true, - "0.43.1": true, - "0.43.2": true, - "0.43.3": true, - "0.43.4": true, - "0.43.5": true, - "0.43.6": true, - "0.43.7": true, - "0.44.0": true, - "0.45.0": true, - "0.46.0": true, - "0.46.1": true, - "0.46.2": true, - "0.46.3": true, - "0.47.0": true, - "0.47.1": true, - "0.47.2": true, - "0.48.0": true, - "0.49.0": true, - "0.49.1": true, - "0.49.2": true, - "0.50.0": true, - "0.50.1": true - }, - "0.23.5": { - "0.40.1": true, - "0.38.1": true, - "0.35.0": true, - "0.34.1": true, - "0.34.0": true, - "0.33.0": true, - "0.32.0": true, - "0.31.0": true, - "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, - "0.36.0": true, - "0.37.0": true, - "0.38.0": true, - "0.39.0": true, - "0.40.0": true, - "0.40.2": true, - "0.41.0": true, - "0.41.1": true, - "0.42.0": true, - "0.42.1": true, - "0.43.0": true, - "0.43.1": true, - "0.43.2": true, - "0.43.3": true, - "0.43.4": true, - "0.43.5": true, - "0.43.6": true, - "0.43.7": true, - "0.44.0": true, - "0.45.0": true, - "0.46.0": true, - "0.46.1": true, - "0.46.2": true, - "0.46.3": true, - "0.47.0": true, - "0.47.1": true, - "0.47.2": true, - "0.48.0": true, - "0.49.0": true, - "0.49.1": true, - "0.49.2": true, - "0.50.0": true, - "0.50.1": true - }, - "0.23.4": { - "0.40.1": true, - "0.38.1": true, - "0.35.0": true, - "0.34.1": true, - "0.34.0": true, - "0.33.0": true, - "0.32.0": true, - "0.31.0": true, - "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, - "0.36.0": true, - "0.37.0": true, - "0.38.0": true, - "0.39.0": true, - "0.40.0": true, - "0.40.2": true, - "0.41.0": true, - "0.41.1": true, - "0.42.0": true, - "0.42.1": true, - "0.43.0": true, - "0.43.1": true, - "0.43.2": true, - "0.43.3": true, - "0.43.4": true, - "0.43.5": true, - "0.43.6": true, - "0.43.7": true, - "0.44.0": true, - "0.45.0": true, - "0.46.0": true, - "0.46.1": true, - "0.46.2": true, - "0.46.3": true, - "0.47.0": true, - "0.47.1": true, - "0.47.2": true, - "0.48.0": true, - "0.49.0": true, - "0.49.1": true, - "0.49.2": true, - "0.50.0": true, - "0.50.1": true - }, - "0.23.3": { - "0.40.1": true, - "0.38.1": true, - "0.35.0": true, - "0.34.1": true, - "0.34.0": true, - "0.33.0": true, - "0.32.0": true, - "0.31.0": true, - "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, - "0.36.0": true, - "0.37.0": true, - "0.38.0": true, - "0.39.0": true, - "0.40.0": true, - "0.40.2": true, - "0.41.0": true, - "0.41.1": true, - "0.42.0": true, - "0.42.1": true, - "0.43.0": true, - "0.43.1": true, - "0.43.2": true, - "0.43.3": true, - "0.43.4": true, - "0.43.5": true, - "0.43.6": true, - "0.43.7": true, - "0.44.0": true, - "0.45.0": true, - "0.46.0": true, - "0.46.1": true, - "0.46.2": true, - "0.46.3": true, - "0.47.0": true, - "0.47.1": true, - "0.47.2": true, - "0.48.0": true, - "0.49.0": true, - "0.49.1": true, - "0.49.2": true, - "0.50.0": true, - "0.50.1": true - }, - "0.23.2": { - "0.40.1": true, - "0.38.1": true, - "0.35.0": true, - "0.34.1": true, - "0.34.0": true, - "0.33.0": true, - "0.32.0": true, - "0.31.0": true, - "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, - "0.36.0": true, - "0.37.0": true, - "0.38.0": true, - "0.39.0": true, - "0.40.0": true, - "0.40.2": true, - "0.41.0": true, - "0.41.1": true, - "0.42.0": true, - "0.42.1": true, - "0.43.0": true, - "0.43.1": true, - "0.43.2": true, - "0.43.3": true, - "0.43.4": true, - "0.43.5": true, - "0.43.6": true, - "0.43.7": true, - "0.44.0": true, - "0.45.0": true, - "0.46.0": true, - "0.46.1": true, - "0.46.2": true, - "0.46.3": true, - "0.47.0": true, - "0.47.1": true, - "0.47.2": true, - "0.48.0": true, - "0.49.0": true, - "0.49.1": true, - "0.49.2": true, - "0.50.0": true, - "0.50.1": true - }, - "0.23.1": { - "0.40.1": true, - "0.38.1": true, - "0.35.0": true, - "0.34.1": true, - "0.34.0": true, - "0.33.0": true, - "0.32.0": true, - "0.31.0": true, - "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, - "0.36.0": true, - "0.37.0": true, - "0.38.0": true, - "0.39.0": true, - "0.40.0": true, - "0.40.2": true, - "0.41.0": true, - "0.41.1": true, - "0.42.0": true, - "0.42.1": true, - "0.43.0": true, - "0.43.1": true, - "0.43.2": true, - "0.43.3": true, - "0.43.4": true, - "0.43.5": true, - "0.43.6": true, - "0.43.7": true, - "0.44.0": true, - "0.45.0": true, - "0.46.0": true, - "0.46.1": true, - "0.46.2": true, - "0.46.3": true, - "0.47.0": true, - "0.47.1": true, - "0.47.2": true, - "0.48.0": true, - "0.49.0": true, - "0.49.1": true, - "0.49.2": true, - "0.50.0": true, - "0.50.1": true - }, - "0.23.0": { - "0.40.1": true, - "0.38.1": true, - "0.35.0": true, - "0.34.1": true, - "0.34.0": true, - "0.33.0": true, - "0.32.0": true, - "0.31.0": true, - "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, - "0.36.0": true, - "0.37.0": true, - "0.38.0": true, - "0.39.0": true, - "0.40.0": true, - "0.40.2": true, - "0.41.0": true, - "0.41.1": true, - "0.42.0": true, - "0.42.1": true, - "0.43.0": true, - "0.43.1": true, - "0.43.2": true, - "0.43.3": true, - "0.43.4": true, - "0.43.5": true, - "0.43.6": true, - "0.43.7": true, - "0.44.0": true, - "0.45.0": true, - "0.46.0": true, - "0.46.1": true, - "0.46.2": true, - "0.46.3": true, - "0.47.0": true, - "0.47.1": true, - "0.47.2": true, - "0.48.0": true, - "0.49.0": true, - "0.49.1": true, - "0.49.2": true, - "0.50.0": true, - "0.50.1": true - }, - "0.22.1": { - "0.40.1": true, - "0.38.1": true, - "0.35.0": true, - "0.34.1": true, - "0.34.0": true, - "0.33.0": true, - "0.32.0": true, - "0.31.0": true, - "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, - "0.36.0": true, - "0.37.0": true, - "0.38.0": true, - "0.39.0": true, - "0.40.0": true, - "0.40.2": true, - "0.41.0": true, - "0.41.1": true, - "0.42.0": true, - "0.42.1": true, - "0.43.0": true, - "0.43.1": true, - "0.43.2": true, - "0.43.3": true, - "0.43.4": true, - "0.43.5": true, - "0.43.6": true, - "0.43.7": true, - "0.44.0": true, - "0.45.0": true, - "0.46.0": true, - "0.46.1": true, - "0.46.2": true, - "0.46.3": true, - "0.47.0": true, - "0.47.1": true, - "0.47.2": true, - "0.48.0": true, - "0.49.0": true, - "0.49.1": true, - "0.49.2": true, - "0.50.0": true, - "0.50.1": true - }, - "0.22.0": { - "0.40.1": true, - "0.38.1": true, - "0.35.0": true, - "0.34.1": true, - "0.34.0": true, - "0.33.0": true, - "0.32.0": true, - "0.31.0": true, - "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, - "0.36.0": true, - "0.37.0": true, - "0.38.0": true, - "0.39.0": true, - "0.40.0": true, - "0.40.2": true, - "0.41.0": true, - "0.41.1": true, - "0.42.0": true, - "0.42.1": true, - "0.43.0": true, - "0.43.1": true, - "0.43.2": true, - "0.43.3": true, - "0.43.4": true, - "0.43.5": true, - "0.43.6": true, - "0.43.7": true, - "0.44.0": true, - "0.45.0": true, - "0.46.0": true, - "0.46.1": true, - "0.46.2": true, - "0.46.3": true, - "0.47.0": true, - "0.47.1": true, - "0.47.2": true, - "0.48.0": true, - "0.49.0": true, - "0.49.1": true, - "0.49.2": true, - "0.50.0": true, - "0.50.1": true - }, - "0.21.0": { - "0.40.1": true, - "0.38.1": true, - "0.35.0": true, - "0.34.1": true, - "0.34.0": true, - "0.33.0": true, - "0.32.0": true, - "0.31.0": true, - "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, - "0.36.0": true, - "0.37.0": true, - "0.38.0": true, - "0.39.0": true, - "0.40.0": true, - "0.40.2": true, - "0.41.0": true, - "0.41.1": true, - "0.42.0": true, - "0.42.1": true, - "0.43.0": true, - "0.43.1": true, - "0.43.2": true, - "0.43.3": true, - "0.43.4": true, - "0.43.5": true, - "0.43.6": true, - "0.43.7": true, - "0.44.0": true, - "0.45.0": true, - "0.46.0": true, - "0.46.1": true, - "0.46.2": true, - "0.46.3": true, - "0.47.0": true, - "0.47.1": true, - "0.47.2": true, - "0.48.0": true, - "0.49.0": true, - "0.49.1": true, - "0.49.2": true, - "0.50.0": true, - "0.50.1": true + "0.50.1": true, + "0.51.0": false }, - "0.20.0": { + "0.34.1": { "0.40.1": true, "0.38.1": true, "0.35.0": true, @@ -3621,48 +54,6 @@ "0.32.0": true, "0.31.0": true, "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, "0.36.0": true, "0.37.0": true, "0.38.0": true, @@ -3695,9 +86,10 @@ "0.49.1": true, "0.49.2": true, "0.50.0": true, - "0.50.1": true + "0.50.1": true, + "0.51.0": false }, - "0.19.0": { + "0.34.0": { "0.40.1": true, "0.38.1": true, "0.35.0": true, @@ -3707,48 +99,6 @@ "0.32.0": true, "0.31.0": true, "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, "0.36.0": true, "0.37.0": true, "0.38.0": true, @@ -3781,9 +131,10 @@ "0.49.1": true, "0.49.2": true, "0.50.0": true, - "0.50.1": true + "0.50.1": true, + "0.51.0": false }, - "0.18.2": { + "0.33.0": { "0.40.1": true, "0.38.1": true, "0.35.0": true, @@ -3793,48 +144,6 @@ "0.32.0": true, "0.31.0": true, "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, "0.36.0": true, "0.37.0": true, "0.38.0": true, @@ -3867,9 +176,10 @@ "0.49.1": true, "0.49.2": true, "0.50.0": true, - "0.50.1": true + "0.50.1": true, + "0.51.0": false }, - "0.18.1": { + "0.32.0": { "0.40.1": true, "0.38.1": true, "0.35.0": true, @@ -3879,48 +189,6 @@ "0.32.0": true, "0.31.0": true, "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, "0.36.0": true, "0.37.0": true, "0.38.0": true, @@ -3953,9 +221,10 @@ "0.49.1": true, "0.49.2": true, "0.50.0": true, - "0.50.1": true + "0.50.1": true, + "0.51.0": false }, - "0.18.0": { + "0.31.0": { "0.40.1": true, "0.38.1": true, "0.35.0": true, @@ -3965,48 +234,6 @@ "0.32.0": true, "0.31.0": true, "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, "0.36.0": true, "0.37.0": true, "0.38.0": true, @@ -4039,9 +266,10 @@ "0.49.1": true, "0.49.2": true, "0.50.0": true, - "0.50.1": true + "0.50.1": true, + "0.51.0": false }, - "0.17.0": { + "0.30.0": { "0.40.1": true, "0.38.1": true, "0.35.0": true, @@ -4051,48 +279,6 @@ "0.32.0": true, "0.31.0": true, "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, "0.36.0": true, "0.37.0": true, "0.38.0": true, @@ -4125,93 +311,8 @@ "0.49.1": true, "0.49.2": true, "0.50.0": true, - "0.50.1": true - }, - "0.16.0": { - "0.35.0": false, - "0.34.1": false, - "0.34.0": false, - "0.33.0": false, - "0.32.0": false, - "0.31.0": false, - "0.30.0": false, - "0.29.11": false, - "0.29.10": false, - "0.29.9": false, - "0.29.8": false, - "0.29.7": false, - "0.29.6": false, - "0.29.5": false, - "0.29.4": false, - "0.29.3": false, - "0.29.2": false, - "0.29.1": false, - "0.29.0": false, - "0.28.2": false, - "0.28.1": false, - "0.28.0": false, - "0.27.3": false, - "0.27.2": false, - "0.27.1": false, - "0.27.0": false, - "0.26.2": false, - "0.26.1": false, - "0.26.0": false, - "0.25.0": false, - "0.24.1": false, - "0.24.0": false, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": true, - "0.36.0": false, - "0.37.0": false, - "0.38.0": false, - "0.38.1": false, - "0.39.0": false, - "0.40.0": false, - "0.40.1": false, - "0.40.2": false, - "0.41.0": false, - "0.41.1": false, - "0.42.0": false, - "0.42.1": false, - "0.43.0": false, - "0.43.1": false, - "0.43.2": false, - "0.43.3": false, - "0.43.4": false, - "0.43.5": false, - "0.43.6": false, - "0.43.7": false, - "0.44.0": false, - "0.45.0": false, - "0.46.0": false, - "0.46.1": false, - "0.46.2": false, - "0.46.3": false, - "0.47.0": false, - "0.47.1": false, - "0.47.2": false, - "0.48.0": false, - "0.49.0": false, - "0.49.1": false, - "0.49.2": false, - "0.50.0": false, - "0.50.1": false + "0.50.1": true, + "0.51.0": false }, "0.36.0": { "0.40.1": true, @@ -4224,48 +325,6 @@ "0.32.0": true, "0.31.0": true, "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, "0.37.0": true, "0.38.0": true, "0.39.0": true, @@ -4297,7 +356,8 @@ "0.49.1": true, "0.49.2": true, "0.50.0": true, - "0.50.1": true + "0.50.1": true, + "0.51.0": false }, "0.37.0": { "0.40.1": true, @@ -4311,48 +371,6 @@ "0.32.0": true, "0.31.0": true, "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, "0.38.0": true, "0.39.0": true, "0.40.0": true, @@ -4383,7 +401,8 @@ "0.49.1": true, "0.49.2": true, "0.50.0": true, - "0.50.1": true + "0.50.1": true, + "0.51.0": false }, "0.38.0": { "0.40.1": true, @@ -4398,48 +417,6 @@ "0.32.0": true, "0.31.0": true, "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, "0.39.0": true, "0.40.0": true, "0.40.2": true, @@ -4469,7 +446,8 @@ "0.49.1": true, "0.49.2": true, "0.50.0": true, - "0.50.1": true + "0.50.1": true, + "0.51.0": false }, "0.38.1": { "0.40.1": true, @@ -4484,48 +462,6 @@ "0.32.0": true, "0.31.0": true, "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, "0.39.0": true, "0.40.0": true, "0.40.2": true, @@ -4555,7 +491,8 @@ "0.49.1": true, "0.49.2": true, "0.50.0": true, - "0.50.1": true + "0.50.1": true, + "0.51.0": false }, "0.39.0": { "0.40.1": true, @@ -4571,48 +508,6 @@ "0.32.0": true, "0.31.0": true, "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, "0.40.0": true, "0.40.2": true, "0.41.0": true, @@ -4641,7 +536,8 @@ "0.49.1": true, "0.49.2": true, "0.50.0": true, - "0.50.1": true + "0.50.1": true, + "0.51.0": false }, "0.40.0": { "0.40.1": true, @@ -4658,48 +554,6 @@ "0.32.0": true, "0.31.0": true, "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, "0.40.2": true, "0.41.0": true, "0.41.1": true, @@ -4727,7 +581,8 @@ "0.49.1": true, "0.49.2": true, "0.50.0": true, - "0.50.1": true + "0.50.1": true, + "0.51.0": false }, "0.40.1": { "0.40.1": true, @@ -4744,48 +599,6 @@ "0.32.0": true, "0.31.0": true, "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, "0.40.2": true, "0.41.0": true, "0.41.1": true, @@ -4813,7 +626,8 @@ "0.49.1": true, "0.49.2": true, "0.50.0": true, - "0.50.1": true + "0.50.1": true, + "0.51.0": false }, "0.40.2": { "0.41.0": true, @@ -4832,48 +646,6 @@ "0.32.0": true, "0.31.0": true, "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, "0.41.1": true, "0.42.0": true, "0.42.1": true, @@ -4899,7 +671,8 @@ "0.49.1": true, "0.49.2": true, "0.50.0": true, - "0.50.1": true + "0.50.1": true, + "0.51.0": false }, "0.41.0": { "0.41.0": true, @@ -4918,48 +691,6 @@ "0.32.0": true, "0.31.0": true, "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, "0.41.1": true, "0.42.0": true, "0.42.1": true, @@ -4985,7 +716,8 @@ "0.49.1": true, "0.49.2": true, "0.50.0": true, - "0.50.1": true + "0.50.1": true, + "0.51.0": false }, "0.41.1": { "0.41.1": true, @@ -5005,48 +737,6 @@ "0.32.0": true, "0.31.0": true, "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, "0.42.0": true, "0.42.1": true, "0.43.0": true, @@ -5071,7 +761,8 @@ "0.49.1": true, "0.49.2": true, "0.50.0": true, - "0.50.1": true + "0.50.1": true, + "0.51.0": false }, "0.42.0": { "0.42.0": true, @@ -5092,48 +783,6 @@ "0.32.0": true, "0.31.0": true, "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, "0.42.1": true, "0.43.0": true, "0.43.1": true, @@ -5157,7 +806,8 @@ "0.49.1": true, "0.49.2": true, "0.50.0": true, - "0.50.1": true + "0.50.1": true, + "0.51.0": false }, "0.42.1": { "0.43.2": true, @@ -5182,48 +832,6 @@ "0.32.0": true, "0.31.0": true, "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, "0.43.3": true, "0.43.4": true, "0.43.5": true, @@ -5243,7 +851,8 @@ "0.49.1": true, "0.49.2": true, "0.50.0": true, - "0.50.1": true + "0.50.1": true, + "0.51.0": false }, "0.43.0": { "0.43.2": true, @@ -5268,48 +877,6 @@ "0.32.0": true, "0.31.0": true, "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, "0.43.3": true, "0.43.4": true, "0.43.5": true, @@ -5329,7 +896,8 @@ "0.49.1": true, "0.49.2": true, "0.50.0": true, - "0.50.1": true + "0.50.1": true, + "0.51.0": false }, "0.43.1": { "0.43.2": true, @@ -5354,48 +922,6 @@ "0.32.0": true, "0.31.0": true, "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, "0.43.3": true, "0.43.4": true, "0.43.5": true, @@ -5415,7 +941,8 @@ "0.49.1": true, "0.49.2": true, "0.50.0": true, - "0.50.1": true + "0.50.1": true, + "0.51.0": false }, "0.43.2": { "0.43.2": true, @@ -5440,48 +967,6 @@ "0.32.0": true, "0.31.0": true, "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, "0.43.3": true, "0.43.4": true, "0.43.5": true, @@ -5501,7 +986,8 @@ "0.49.1": true, "0.49.2": true, "0.50.0": true, - "0.50.1": true + "0.50.1": true, + "0.51.0": false }, "0.43.3": { "0.43.3": true, @@ -5527,48 +1013,6 @@ "0.32.0": true, "0.31.0": true, "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, "0.43.4": true, "0.43.5": true, "0.43.6": true, @@ -5587,7 +1031,8 @@ "0.49.1": true, "0.49.2": true, "0.50.0": true, - "0.50.1": true + "0.50.1": true, + "0.51.0": false }, "0.43.4": { "0.43.4": true, @@ -5614,48 +1059,6 @@ "0.32.0": true, "0.31.0": true, "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, "0.43.5": true, "0.43.6": true, "0.43.7": true, @@ -5673,7 +1076,8 @@ "0.49.1": true, "0.49.2": true, "0.50.0": true, - "0.50.1": true + "0.50.1": true, + "0.51.0": false }, "0.43.5": { "0.43.5": true, @@ -5701,48 +1105,6 @@ "0.32.0": true, "0.31.0": true, "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, "0.43.6": true, "0.43.7": true, "0.44.0": true, @@ -5759,7 +1121,8 @@ "0.49.1": true, "0.49.2": true, "0.50.0": true, - "0.50.1": true + "0.50.1": true, + "0.51.0": false }, "0.43.6": { "0.43.6": true, @@ -5788,48 +1151,6 @@ "0.32.0": true, "0.31.0": true, "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, "0.43.7": true, "0.44.0": true, "0.45.0": true, @@ -5845,7 +1166,8 @@ "0.49.1": true, "0.49.2": true, "0.50.0": true, - "0.50.1": true + "0.50.1": true, + "0.51.0": false }, "0.43.7": { "0.43.7": true, @@ -5875,48 +1197,6 @@ "0.32.0": true, "0.31.0": true, "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, "0.44.0": true, "0.45.0": true, "0.46.0": true, @@ -5931,7 +1211,8 @@ "0.49.1": true, "0.49.2": true, "0.50.0": true, - "0.50.1": true + "0.50.1": true, + "0.51.0": false }, "0.44.0": { "0.44.0": true, @@ -5962,48 +1243,6 @@ "0.32.0": true, "0.31.0": true, "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, "0.45.0": true, "0.46.0": true, "0.46.1": true, @@ -6017,7 +1256,8 @@ "0.49.1": true, "0.49.2": true, "0.50.0": true, - "0.50.1": true + "0.50.1": true, + "0.51.0": false }, "0.45.0": { "0.45.0": true, @@ -6049,48 +1289,6 @@ "0.32.0": true, "0.31.0": true, "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, "0.46.0": true, "0.46.1": true, "0.46.2": true, @@ -6103,7 +1301,8 @@ "0.49.1": true, "0.49.2": true, "0.50.0": true, - "0.50.1": true + "0.50.1": true, + "0.51.0": false }, "0.46.0": { "0.46.0": true, @@ -6136,48 +1335,6 @@ "0.32.0": true, "0.31.0": true, "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, "0.46.1": true, "0.46.2": true, "0.46.3": true, @@ -6189,7 +1346,8 @@ "0.49.1": true, "0.49.2": true, "0.50.0": true, - "0.50.1": true + "0.50.1": true, + "0.51.0": false }, "0.46.1": { "0.46.1": true, @@ -6223,48 +1381,6 @@ "0.32.0": true, "0.31.0": true, "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, "0.46.2": true, "0.46.3": true, "0.47.0": true, @@ -6275,7 +1391,8 @@ "0.49.1": true, "0.49.2": true, "0.50.0": true, - "0.50.1": true + "0.50.1": true, + "0.51.0": false }, "0.46.2": { "0.46.2": true, @@ -6310,48 +1427,6 @@ "0.32.0": true, "0.31.0": true, "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, "0.46.3": true, "0.47.0": true, "0.47.1": true, @@ -6361,7 +1436,8 @@ "0.49.1": true, "0.49.2": true, "0.50.0": true, - "0.50.1": true + "0.50.1": true, + "0.51.0": false }, "0.46.3": { "0.46.3": true, @@ -6397,48 +1473,6 @@ "0.32.0": true, "0.31.0": true, "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, "0.47.0": true, "0.47.1": true, "0.47.2": true, @@ -6447,7 +1481,8 @@ "0.49.1": true, "0.49.2": true, "0.50.0": true, - "0.50.1": true + "0.50.1": true, + "0.51.0": false }, "0.47.0": { "0.47.0": true, @@ -6484,48 +1519,6 @@ "0.32.0": true, "0.31.0": true, "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, "0.47.1": true, "0.47.2": true, "0.48.0": true, @@ -6533,7 +1526,8 @@ "0.49.1": true, "0.49.2": true, "0.50.0": true, - "0.50.1": true + "0.50.1": true, + "0.51.0": false }, "0.47.1": { "0.47.1": true, @@ -6571,55 +1565,14 @@ "0.32.0": true, "0.31.0": true, "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, "0.47.2": true, "0.48.0": true, "0.49.0": true, "0.49.1": true, "0.49.2": true, "0.50.0": true, - "0.50.1": true + "0.50.1": true, + "0.51.0": false }, "0.47.2": { "0.47.2": true, @@ -6658,54 +1611,13 @@ "0.32.0": true, "0.31.0": true, "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, "0.48.0": true, "0.49.0": true, "0.49.1": true, "0.49.2": true, "0.50.0": true, - "0.50.1": true + "0.50.1": true, + "0.51.0": false }, "0.48.0": { "0.48.0": true, @@ -6745,53 +1657,12 @@ "0.32.0": true, "0.31.0": true, "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, "0.49.0": true, "0.49.1": true, "0.49.2": true, "0.50.0": true, - "0.50.1": true + "0.50.1": true, + "0.51.0": false }, "0.49.0": { "0.49.1": true, @@ -6833,51 +1704,10 @@ "0.32.0": true, "0.31.0": true, "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, "0.49.2": true, "0.50.0": true, - "0.50.1": true + "0.50.1": true, + "0.51.0": false }, "0.49.1": { "0.49.1": true, @@ -6919,51 +1749,10 @@ "0.32.0": true, "0.31.0": true, "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, "0.49.2": true, "0.50.0": true, - "0.50.1": true + "0.50.1": true, + "0.51.0": false }, "0.49.2": { "0.49.2": true, @@ -7006,54 +1795,14 @@ "0.32.0": true, "0.31.0": true, "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false, "0.50.0": true, - "0.50.1": true + "0.50.1": true, + "0.51.0": false }, "0.50.0": { - "0.50.1": true, "0.50.0": true, + "0.50.1": true, + "0.51.0": false, "0.49.2": true, "0.49.1": true, "0.49.0": true, @@ -7093,51 +1842,10 @@ "0.33.0": true, "0.32.0": true, "0.31.0": true, - "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false + "0.30.0": true }, "0.50.1": { + "0.51.0": false, "0.50.1": true, "0.50.0": true, "0.49.2": true, @@ -7179,48 +1887,51 @@ "0.33.0": true, "0.32.0": true, "0.31.0": true, - "0.30.0": true, - "0.29.11": true, - "0.29.10": true, - "0.29.9": true, - "0.29.8": true, - "0.29.7": true, - "0.29.6": true, - "0.29.5": true, - "0.29.4": true, - "0.29.3": true, - "0.29.2": true, - "0.29.1": true, - "0.29.0": true, - "0.28.2": true, - "0.28.1": true, - "0.28.0": true, - "0.27.3": true, - "0.27.2": true, - "0.27.1": true, - "0.27.0": true, - "0.26.2": true, - "0.26.1": true, - "0.26.0": true, - "0.25.0": true, - "0.24.1": true, - "0.24.0": true, - "0.23.6": true, - "0.23.5": true, - "0.23.4": true, - "0.23.3": true, - "0.23.2": true, - "0.23.1": true, - "0.23.0": true, - "0.22.1": true, - "0.22.0": true, - "0.21.0": true, - "0.20.0": true, - "0.19.0": true, - "0.18.2": true, - "0.18.1": true, - "0.18.0": true, - "0.17.0": true, - "0.16.0": false + "0.30.0": true + }, + "0.51.0": { + "0.51.0": true, + "0.50.1": false, + "0.50.0": false, + "0.49.2": false, + "0.49.1": false, + "0.49.0": false, + "0.48.0": false, + "0.47.2": false, + "0.47.1": false, + "0.47.0": false, + "0.46.3": false, + "0.46.2": false, + "0.46.1": false, + "0.46.0": false, + "0.45.0": false, + "0.44.0": false, + "0.43.7": false, + "0.43.6": false, + "0.43.5": false, + "0.43.4": false, + "0.43.3": false, + "0.43.2": false, + "0.43.1": false, + "0.43.0": false, + "0.42.1": false, + "0.42.0": false, + "0.41.1": false, + "0.41.0": false, + "0.40.2": false, + "0.40.1": false, + "0.40.0": false, + "0.39.0": false, + "0.38.1": false, + "0.38.0": false, + "0.37.0": false, + "0.36.0": false, + "0.35.0": false, + "0.34.1": false, + "0.34.0": false, + "0.33.0": false, + "0.32.0": false, + "0.31.0": false, + "0.30.0": false } } diff --git a/octue/resources/child.py b/octue/resources/child.py index 0e14a2914..d28c6308a 100644 --- a/octue/resources/child.py +++ b/octue/resources/child.py @@ -60,7 +60,7 @@ def ask( allow_local_files=False, handle_monitor_message=None, record_messages=True, - allow_save_diagnostics_data_on_crash=True, + save_diagnostics="SAVE_DIAGNOSTICS_ON_CRASH", # This is repeated as a string here to avoid a circular import. question_uuid=None, timeout=86400, maximum_heartbeat_interval=300, @@ -76,10 +76,9 @@ def ask( :param bool allow_local_files: if `True`, allow the input manifest to contain references to local files - this should only be set to `True` if the child will have access to these local files :param callable|None handle_monitor_message: a function to handle monitor messages (e.g. send them to an endpoint for plotting or displaying) - this function should take a single JSON-compatible python primitive as an argument (note that this could be an array or object) :param bool record_messages: if `True`, record messages received from the child in the `received_messages` property - :param bool allow_save_diagnostics_data_on_crash: if `True`, allow the input values and manifest (and its datasets) to be saved by the child if it fails while processing them + :param str save_diagnostics: must be one of {"SAVE_DIAGNOSTICS_OFF", "SAVE_DIAGNOSTICS_ON_CRASH", "SAVE_DIAGNOSTICS_ON"}; if turned on, allow the input values and manifest (and its datasets) to be saved by the child either all the time or just if it fails while processing them :param str|None question_uuid: the UUID to use for the question if a specific one is needed; a UUID is generated if not :param float timeout: time in seconds to wait for an answer before raising a timeout error - :param float|int delivery_acknowledgement_timeout: how long in seconds to wait for a delivery acknowledgement before aborting :param float|int maximum_heartbeat_interval: the maximum amount of time (in seconds) allowed between child heartbeats before an error is raised :raise TimeoutError: if the timeout is exceeded while waiting for an answer :return dict: a dictionary containing the keys "output_values" and "output_manifest" @@ -91,7 +90,7 @@ def ask( children=children, subscribe_to_logs=subscribe_to_logs, allow_local_files=allow_local_files, - allow_save_diagnostics_data_on_crash=allow_save_diagnostics_data_on_crash, + save_diagnostics=save_diagnostics, question_uuid=question_uuid, timeout=timeout, ) @@ -120,9 +119,6 @@ def ask_multiple(self, *questions, raise_errors=True, max_retries=0, prevent_ret """ prevent_retries_when = prevent_retries_when or [] - def ask(question): - return self.ask(**question) - # Answers will come out of order, so use a dictionary to store them against their questions' original index. answers = {} max_workers = min(32, len(questions)) @@ -130,7 +126,7 @@ def ask(question): with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor: future_to_question_index_mapping = { - executor.submit(ask, question): i for i, question in enumerate(questions) + executor.submit(self.ask, **question): i for i, question in enumerate(questions) } for i, future in enumerate(concurrent.futures.as_completed(future_to_question_index_mapping)): diff --git a/octue/runner.py b/octue/runner.py index 2535ecce4..d1fac55d3 100644 --- a/octue/runner.py +++ b/octue/runner.py @@ -12,7 +12,7 @@ import twined.exceptions from octue import exceptions from octue.app_loading import AppFrom -from octue.crash_diagnostics import CrashDiagnostics +from octue.diagnostics import Diagnostics from octue.log_handlers import AnalysisLogFormatterSwitcher from octue.resources import Child from octue.resources.analysis import CLASS_MAP, Analysis @@ -21,6 +21,12 @@ from twined import Twine +SAVE_DIAGNOSTICS_OFF = "SAVE_DIAGNOSTICS_OFF" +SAVE_DIAGNOSTICS_ON_CRASH = "SAVE_DIAGNOSTICS_ON_CRASH" +SAVE_DIAGNOSTICS_ON = "SAVE_DIAGNOSTICS_ON" +SAVE_DIAGNOSTICS_MODES = {SAVE_DIAGNOSTICS_OFF, SAVE_DIAGNOSTICS_ON_CRASH, SAVE_DIAGNOSTICS_ON} + + logger = logging.getLogger(__name__) @@ -36,7 +42,7 @@ class Runner: :param str|dict|None configuration_manifest: The strand data. Can be expressed as a string path of a *.json file (relative or absolute), as an open file-like object (containing json data), as a string of json data or as an already-parsed dict. :param str|list(dict)|None children: The children strand data. Can be expressed as a string path of a *.json file (relative or absolute), as an open file-like object (containing json data), as a string of json data or as an already-parsed dict. :param str|None output_location: the path to a cloud directory to save output datasets at - :param str|None crash_diagnostics_cloud_path: the path to a cloud directory to store crash diagnostics in the event that the service fails while processing a question (this includes the configuration, input values and manifest, and logs) + :param str|None diagnostics_cloud_path: the path to a cloud directory to store diagnostics in the event that the service fails while processing a question (this includes the configuration, input values and manifest, and logs) :param str|None project_name: name of Google Cloud project to get credentials from :param str|None service_id: the ID of the service being run :param bool delete_local_files: if `True`, delete any files downloaded during the call to `Runner.run` once the analysis has finished @@ -51,7 +57,7 @@ def __init__( configuration_manifest=None, children=None, output_location=None, - crash_diagnostics_cloud_path=None, + diagnostics_cloud_path=None, project_name=None, service_id=None, service_registries=None, @@ -68,9 +74,9 @@ def __init__( self.output_location = output_location # Get configuration before any transformations have been applied. - self.crash_diagnostics = CrashDiagnostics(cloud_path=crash_diagnostics_cloud_path) + self.diagnostics = Diagnostics(cloud_path=diagnostics_cloud_path) - self.crash_diagnostics.add_data( + self.diagnostics.add_data( configuration_values=configuration_values, configuration_manifest=configuration_manifest, ) @@ -98,6 +104,29 @@ def __init__( self.delete_local_files = delete_local_files self._project_name = project_name + @classmethod + def from_configuration(cls, service_configuration, app_configuration, project_name=None, service_id=None): + """Instantiate a runner from a service and app configuration. + + :param octue.configuration.ServiceConfiguration service_configuration: + :param octue.configuration.AppConfiguration app_configuration: + :param str|None project_name: name of Google Cloud project to get credentials from + :param str|None service_id: the ID of the service being run + :return octue.runner.Runner: a runner configured with the given service and app configuration + """ + return cls( + app_src=service_configuration.app_source_path, + twine=service_configuration.twine_path, + configuration_values=app_configuration.configuration_values, + configuration_manifest=app_configuration.configuration_manifest, + children=app_configuration.children, + output_location=app_configuration.output_location, + diagnostics_cloud_path=service_configuration.diagnostics_cloud_path, + project_name=project_name, + service_id=service_id, + service_registries=service_configuration.service_registries, + ) + def __repr__(self): """Represent the runner as a string. @@ -114,7 +143,7 @@ def run( analysis_log_level=logging.INFO, analysis_log_handler=None, handle_monitor_message=None, - allow_save_diagnostics_data_on_crash=True, + save_diagnostics=SAVE_DIAGNOSTICS_ON_CRASH, ): """Run an analysis. @@ -125,11 +154,16 @@ def run( :param str analysis_log_level: the level below which to ignore log messages :param logging.Handler|None analysis_log_handler: the logging.Handler instance which will be used to handle logs for this analysis run. Handlers can be created as per the logging cookbook https://docs.python.org/3/howto/logging-cookbook.html but should use the format defined above in LOG_FORMAT. :param callable|None handle_monitor_message: a function that sends monitor messages to the parent that requested the analysis - :param bool allow_save_diagnostics_data_on_crash: if `True`, allow the input values and manifest (and its datasets) to be saved if the analysis fails + :param str save_diagnostics: must be one of {"SAVE_DIAGNOSTICS_OFF", "SAVE_DIAGNOSTICS_ON_CRASH", "SAVE_DIAGNOSTICS_ON"}; if turned on, allow the input values and manifest (and its datasets) to be saved either all the time or just if the analysis fails :return octue.resources.analysis.Analysis: """ + if save_diagnostics not in SAVE_DIAGNOSTICS_MODES: + raise ValueError( + f"`save_diagnostics` must be one of {SAVE_DIAGNOSTICS_MODES!r}; received {save_diagnostics!r}." + ) + # Get inputs before any transformations have been applied. - self.crash_diagnostics.add_data( + self.diagnostics.add_data( analysis_id=analysis_id, input_values=input_values, input_manifest=input_manifest, @@ -201,8 +235,8 @@ def run( raise ModuleNotFoundError(f"{e.msg} in {os.path.abspath(self.app_source)!r}.") except Exception as analysis_error: - if allow_save_diagnostics_data_on_crash: - self.crash_diagnostics.upload() + if save_diagnostics in {SAVE_DIAGNOSTICS_ON_CRASH, SAVE_DIAGNOSTICS_ON}: + self.diagnostics.upload() raise analysis_error @@ -214,6 +248,9 @@ def run( if not analysis.finalised: analysis.finalise() + if save_diagnostics == SAVE_DIAGNOSTICS_ON: + self.diagnostics.upload() + if self.delete_local_files and downloaded_files: logger.warning( "Deleting files downloaded during analysis. This is not thread-safe - set " @@ -296,7 +333,7 @@ def _validate_dataset_file_tags(self, manifest_kind, manifest): def _instantiate_children(self, serialised_children): """Instantiate children from their serialised form (e.g. as given in the app configuration) so they are ready - to be asked questions. For crash diagnostics, each child's `ask` method is wrapped so the runner can record the + to be asked questions. For diagnostics, each child's `ask` method is wrapped so the runner can record the questions asked by the app, the responses received to each question, and the order the questions are asked in. :param list(dict) serialised_children: serialised children from e.g. the app configuration file @@ -320,7 +357,7 @@ def _instantiate_children(self, serialised_children): def _add_child_question_and_response_recording(self, child, key): """Add question and response recording to the `ask` method of the given child. This allows the runner to record the questions asked by the app, the responses received to each question, and the order the questions are asked - in for crash diagnostics. + in for diagnostics. :param octue.resources.child.Child child: the child to add question and response recording to :param str key: the key used to identify the child within the service @@ -337,7 +374,7 @@ def wrapper(*args, **kwargs): try: return original_ask_method(**kwargs) finally: - self.crash_diagnostics.add_question( + self.diagnostics.add_question( {"id": child.id, "key": key, **kwargs, "messages": child.received_messages} ) diff --git a/octue/templates/template-child-services/elevation_service/requirements.txt b/octue/templates/template-child-services/elevation_service/requirements.txt index 3767ee63e..1952cd8ae 100644 --- a/octue/templates/template-child-services/elevation_service/requirements.txt +++ b/octue/templates/template-child-services/elevation_service/requirements.txt @@ -1 +1 @@ -octue==0.29.0 +octue==0.50.1 diff --git a/octue/templates/template-child-services/parent_service/requirements.txt b/octue/templates/template-child-services/parent_service/requirements.txt index 3767ee63e..1952cd8ae 100644 --- a/octue/templates/template-child-services/parent_service/requirements.txt +++ b/octue/templates/template-child-services/parent_service/requirements.txt @@ -1 +1 @@ -octue==0.29.0 +octue==0.50.1 diff --git a/octue/templates/template-child-services/wind_speed_service/requirements.txt b/octue/templates/template-child-services/wind_speed_service/requirements.txt index 3767ee63e..1952cd8ae 100644 --- a/octue/templates/template-child-services/wind_speed_service/requirements.txt +++ b/octue/templates/template-child-services/wind_speed_service/requirements.txt @@ -1 +1 @@ -octue==0.29.0 +octue==0.50.1 diff --git a/octue/templates/template-fractal/requirements.txt b/octue/templates/template-fractal/requirements.txt index 5ef595799..e33624f70 100644 --- a/octue/templates/template-fractal/requirements.txt +++ b/octue/templates/template-fractal/requirements.txt @@ -1,4 +1,4 @@ -octue==0.29.0 +octue==0.50.1 # A numerical manipulation library numpy==1.21.0 diff --git a/octue/templates/template-using-manifests/requirements.txt b/octue/templates/template-using-manifests/requirements.txt index 4290903bf..78ae300c8 100644 --- a/octue/templates/template-using-manifests/requirements.txt +++ b/octue/templates/template-using-manifests/requirements.txt @@ -1,4 +1,4 @@ -octue==0.29.0 +octue==0.50.1 # A numerical manipulation library numpy==1.21.0 diff --git a/octue/utils/testing.py b/octue/utils/testing.py index 6ff5aa885..b1bc8deb6 100644 --- a/octue/utils/testing.py +++ b/octue/utils/testing.py @@ -6,14 +6,14 @@ from octue.resources import Manifest -def load_test_fixture_from_crash_diagnostics(path): - """Load a test fixture from service crash diagnostics downloaded using the `octue get-crash-diagnostics` CLI +def load_test_fixture_from_diagnostics(path): + """Load a test fixture from service diagnostics downloaded using the `octue get-diagnostics` CLI command. The configuration values, configuration manifest, input values, and input manifest are returned if available. A tuple of child emulators is returned if the service has children and asked questions to any of them. Each child emulator corresponds to one question asked to a child. The child emulators are in the same order as the questions were asked by the service during its analysis. - :param str path: the path to a local directory containing downloaded crash diagnostics data + :param str path: the path to a local directory containing downloaded diagnostics data :return (any|None, octue.resources.manifest.Manifest|None, any|None, octue.resources.manifest.Manifest|None, tuple(octue.cloud.emulators.child.ChildEmulator)): the configuration values, configuration manifest, input values, input manifest (each if available), and a tuple of child emulators corresponding to the questions asked by the service """ return ( @@ -28,7 +28,7 @@ def load_test_fixture_from_crash_diagnostics(path): def _load_values(path, stage): """Load values from a JSON file in the directory specified by `path`. - :param str path: the path to the crash diagnostics directory + :param str path: the path to the diagnostics directory :param str stage: one of "configuration" or "input" :return any|None: the values or `None` if no relevant file exists in the directory specified by `path` """ @@ -44,7 +44,7 @@ def _load_values(path, stage): def _load_manifest(path, stage): """Load a manifest from a JSON file in the directory specified by `path`. - :param str path: the path to the crash diagnostics directory + :param str path: the path to the diagnostics directory :param str stage: one of "configuration" or "input" :return any|None: the manifest or `None` if no relevant file exists in the directory specified by `path` """ @@ -59,7 +59,7 @@ def _load_manifest(path, stage): def _load_child_emulators(path): """Load child emulators from a JSON file in the directory specified by `path`. - :param str path: the path to the crash diagnostics directory + :param str path: the path to the diagnostics directory :return tuple(octue.resources.child.Child): """ with open(os.path.join(path, "questions.json")) as f: diff --git a/poetry.lock b/poetry.lock index 0ff27cfa1..adc30a35e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. [[package]] name = "alabaster" @@ -13,18 +13,17 @@ files = [ [[package]] name = "apeye" -version = "1.4.0" +version = "1.4.1" description = "Handy tools for working with URLs and APIs." optional = false python-versions = ">=3.6.1" files = [ - {file = "apeye-1.4.0-py3-none-any.whl", hash = "sha256:32f10f5629c39a0d2a4bc00b16827b43b912c56510395329cb4cc823954ec2be"}, - {file = "apeye-1.4.0.tar.gz", hash = "sha256:db616f14f1e7c09c5ff76230b6a78ebada6e34bed80596bbb9f1146d94107cdb"}, + {file = "apeye-1.4.1-py3-none-any.whl", hash = "sha256:44e58a9104ec189bf42e76b3a7fe91e2b2879d96d48e9a77e5e32ff699c9204e"}, + {file = "apeye-1.4.1.tar.gz", hash = "sha256:14ea542fad689e3bfdbda2189a354a4908e90aee4bf84c15ab75d68453d76a36"}, ] [package.dependencies] apeye-core = ">=1.0.0b2" -cryptography = {version = "<40", markers = "implementation_name == \"pypy\" and python_version <= \"3.7\""} domdf-python-tools = ">=2.6.0" platformdirs = ">=2.3.0" requests = ">=2.24.0" @@ -96,17 +95,21 @@ Sphinx = ">=2.2,<8.0" [[package]] name = "babel" -version = "2.12.1" +version = "2.13.1" description = "Internationalization utilities" optional = false python-versions = ">=3.7" files = [ - {file = "Babel-2.12.1-py3-none-any.whl", hash = "sha256:b4246fb7677d3b98f501a39d43396d3cafdc8eadb045f4a31be01863f655c610"}, - {file = "Babel-2.12.1.tar.gz", hash = "sha256:cc2d99999cd01d44420ae725a21c9e3711b3aadc7976d6147f622d8581963455"}, + {file = "Babel-2.13.1-py3-none-any.whl", hash = "sha256:7077a4984b02b6727ac10f1f7294484f737443d7e2e66c5e4380e41a3ae0b4ed"}, + {file = "Babel-2.13.1.tar.gz", hash = "sha256:33e0952d7dd6374af8dbf6768cc4ddf3ccfefc244f9986d4074704f2fbd18900"}, ] [package.dependencies] pytz = {version = ">=2015.7", markers = "python_version < \"3.9\""} +setuptools = {version = "*", markers = "python_version >= \"3.12\""} + +[package.extras] +dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] [[package]] name = "backports-zoneinfo" @@ -224,13 +227,13 @@ redis = ["redis (>=2.10.5)"] [[package]] name = "cachetools" -version = "5.3.1" +version = "5.3.2" description = "Extensible memoizing collections and decorators" optional = false python-versions = ">=3.7" files = [ - {file = "cachetools-5.3.1-py3-none-any.whl", hash = "sha256:95ef631eeaea14ba2e36f06437f36463aac3a096799e876ee55e5cdccb102590"}, - {file = "cachetools-5.3.1.tar.gz", hash = "sha256:dce83f2d9b4e1f732a8cd44af8e8fab2dbe46201467fc98b3ef8f269092bf62b"}, + {file = "cachetools-5.3.2-py3-none-any.whl", hash = "sha256:861f35a13a451f94e301ce2bec7cac63e881232ccce7ed67fab9b5df4d3beaa1"}, + {file = "cachetools-5.3.2.tar.gz", hash = "sha256:086ee420196f7b2ab9ca2db2520aca326318b68fe5ba8bc4d49cca91add450f2"}, ] [[package]] @@ -244,82 +247,6 @@ files = [ {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, ] -[[package]] -name = "cffi" -version = "1.15.1" -description = "Foreign Function Interface for Python calling C code." -optional = false -python-versions = "*" -files = [ - {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, - {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, - {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, - {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, - {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, - {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, - {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, - {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, - {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, - {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, - {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, - {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, - {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, - {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, - {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, - {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, - {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, - {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, - {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, -] - -[package.dependencies] -pycparser = "*" - [[package]] name = "cfgv" version = "3.3.1" @@ -333,97 +260,112 @@ files = [ [[package]] name = "charset-normalizer" -version = "3.2.0" +version = "3.3.2" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7.0" files = [ - {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, - {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, + {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-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, ] [[package]] name = "click" -version = "8.1.6" +version = "8.1.7" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" files = [ - {file = "click-8.1.6-py3-none-any.whl", hash = "sha256:fa244bb30b3b5ee2cae3da8f55c9e5e0c0e86093306301fb418eb9dc40fbded5"}, - {file = "click-8.1.6.tar.gz", hash = "sha256:48ee849951919527a045bfe3bf7baa8a959c423134e1a5b98c05c20ba75a1cbd"}, + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, ] [package.dependencies] @@ -516,51 +458,6 @@ files = [ [package.extras] toml = ["toml"] -[[package]] -name = "cryptography" -version = "39.0.2" -description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." -optional = false -python-versions = ">=3.6" -files = [ - {file = "cryptography-39.0.2-cp36-abi3-macosx_10_12_universal2.whl", hash = "sha256:2725672bb53bb92dc7b4150d233cd4b8c59615cd8288d495eaa86db00d4e5c06"}, - {file = "cryptography-39.0.2-cp36-abi3-macosx_10_12_x86_64.whl", hash = "sha256:23df8ca3f24699167daf3e23e51f7ba7334d504af63a94af468f468b975b7dd7"}, - {file = "cryptography-39.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:eb40fe69cfc6f5cdab9a5ebd022131ba21453cf7b8a7fd3631f45bbf52bed612"}, - {file = "cryptography-39.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc0521cce2c1d541634b19f3ac661d7a64f9555135e9d8af3980965be717fd4a"}, - {file = "cryptography-39.0.2-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffd394c7896ed7821a6d13b24657c6a34b6e2650bd84ae063cf11ccffa4f1a97"}, - {file = "cryptography-39.0.2-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:e8a0772016feeb106efd28d4a328e77dc2edae84dfbac06061319fdb669ff828"}, - {file = "cryptography-39.0.2-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:8f35c17bd4faed2bc7797d2a66cbb4f986242ce2e30340ab832e5d99ae60e011"}, - {file = "cryptography-39.0.2-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:b49a88ff802e1993b7f749b1eeb31134f03c8d5c956e3c125c75558955cda536"}, - {file = "cryptography-39.0.2-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:5f8c682e736513db7d04349b4f6693690170f95aac449c56f97415c6980edef5"}, - {file = "cryptography-39.0.2-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:d7d84a512a59f4412ca8549b01f94be4161c94efc598bf09d027d67826beddc0"}, - {file = "cryptography-39.0.2-cp36-abi3-win32.whl", hash = "sha256:c43ac224aabcbf83a947eeb8b17eaf1547bce3767ee2d70093b461f31729a480"}, - {file = "cryptography-39.0.2-cp36-abi3-win_amd64.whl", hash = "sha256:788b3921d763ee35dfdb04248d0e3de11e3ca8eb22e2e48fef880c42e1f3c8f9"}, - {file = "cryptography-39.0.2-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:d15809e0dbdad486f4ad0979753518f47980020b7a34e9fc56e8be4f60702fac"}, - {file = "cryptography-39.0.2-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:50cadb9b2f961757e712a9737ef33d89b8190c3ea34d0fb6675e00edbe35d074"}, - {file = "cryptography-39.0.2-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:103e8f7155f3ce2ffa0049fe60169878d47a4364b277906386f8de21c9234aa1"}, - {file = "cryptography-39.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:6236a9610c912b129610eb1a274bdc1350b5df834d124fa84729ebeaf7da42c3"}, - {file = "cryptography-39.0.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e944fe07b6f229f4c1a06a7ef906a19652bdd9fd54c761b0ff87e83ae7a30354"}, - {file = "cryptography-39.0.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:35d658536b0a4117c885728d1a7032bdc9a5974722ae298d6c533755a6ee3915"}, - {file = "cryptography-39.0.2-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:30b1d1bfd00f6fc80d11300a29f1d8ab2b8d9febb6ed4a38a76880ec564fae84"}, - {file = "cryptography-39.0.2-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:e029b844c21116564b8b61216befabca4b500e6816fa9f0ba49527653cae2108"}, - {file = "cryptography-39.0.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:fa507318e427169ade4e9eccef39e9011cdc19534f55ca2f36ec3f388c1f70f3"}, - {file = "cryptography-39.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:8bc0008ef798231fac03fe7d26e82d601d15bd16f3afaad1c6113771566570f3"}, - {file = "cryptography-39.0.2.tar.gz", hash = "sha256:bc5b871e977c8ee5a1bbc42fa8d19bcc08baf0c51cbf1586b0e87a2694dde42f"}, -] - -[package.dependencies] -cffi = ">=1.12" - -[package.extras] -docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] -docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] -pep8test = ["black", "check-manifest", "mypy", "ruff", "types-pytz", "types-requests"] -sdist = ["setuptools-rust (>=0.11.4)"] -ssh = ["bcrypt (>=3.1.5)"] -test = ["hypothesis (>=1.11.4,!=3.79.2)", "iso8601", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-shard (>=0.1.2)", "pytest-subtests", "pytest-xdist", "pytz"] -test-randomorder = ["pytest-randomly"] -tox = ["tox"] - [[package]] name = "cssutils" version = "2.7.1" @@ -640,13 +537,13 @@ files = [ [[package]] name = "domdf-python-tools" -version = "3.6.1" +version = "3.7.0" description = "Helpful functions for Python 🐍 🛠️" optional = false python-versions = ">=3.6" files = [ - {file = "domdf_python_tools-3.6.1-py3-none-any.whl", hash = "sha256:e18158460850957f18e740eb94ede56f580ddb0cb162ab9d9834ed8bbb1b6431"}, - {file = "domdf_python_tools-3.6.1.tar.gz", hash = "sha256:acc04563d23bce4d437dd08af6b9bea788328c412772a044d8ca428a7ad861be"}, + {file = "domdf_python_tools-3.7.0-py3-none-any.whl", hash = "sha256:7b4d1c3bdb7402b872d43953824bf921ae2e52f893adbe5c0052a21a6efa2fe4"}, + {file = "domdf_python_tools-3.7.0.tar.gz", hash = "sha256:df1af9a91649af0fb2a4e7b3a4b0a0936e4f78389dd7280dd6fd2f53a339ca71"}, ] [package.dependencies] @@ -660,13 +557,13 @@ dates = ["pytz (>=2019.1)"] [[package]] name = "exceptiongroup" -version = "1.1.2" +version = "1.1.3" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.1.2-py3-none-any.whl", hash = "sha256:e346e69d186172ca7cf029c8c1d16235aa0e04035e5750b4b95039e65204328f"}, - {file = "exceptiongroup-1.1.2.tar.gz", hash = "sha256:12c3e887d6485d16943a309616de20ae5582633e0a2eda17f4e10fd61c1e8af5"}, + {file = "exceptiongroup-1.1.3-py3-none-any.whl", hash = "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3"}, + {file = "exceptiongroup-1.1.3.tar.gz", hash = "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9"}, ] [package.extras] @@ -762,25 +659,25 @@ google-crc32c = "1.3.0" [[package]] name = "google-api-core" -version = "2.11.1" +version = "2.14.0" description = "Google API client core library" optional = false python-versions = ">=3.7" files = [ - {file = "google-api-core-2.11.1.tar.gz", hash = "sha256:25d29e05a0058ed5f19c61c0a78b1b53adea4d9364b464d014fbda941f6d1c9a"}, - {file = "google_api_core-2.11.1-py3-none-any.whl", hash = "sha256:d92a5a92dc36dd4f4b9ee4e55528a90e432b059f93aee6ad857f9de8cc7ae94a"}, + {file = "google-api-core-2.14.0.tar.gz", hash = "sha256:5368a4502b793d9bbf812a5912e13e4e69f9bd87f6efb508460c43f5bbd1ce41"}, + {file = "google_api_core-2.14.0-py3-none-any.whl", hash = "sha256:de2fb50ed34d47ddbb2bd2dcf680ee8fead46279f4ed6b16de362aca23a18952"}, ] [package.dependencies] google-auth = ">=2.14.1,<3.0.dev0" googleapis-common-protos = ">=1.56.2,<2.0.dev0" grpcio = [ - {version = ">=1.33.2,<2.0dev", optional = true, markers = "extra == \"grpc\""}, {version = ">=1.49.1,<2.0dev", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, + {version = ">=1.33.2,<2.0dev", optional = true, markers = "python_version < \"3.11\" and extra == \"grpc\""}, ] grpcio-status = [ - {version = ">=1.33.2,<2.0.dev0", optional = true, markers = "extra == \"grpc\""}, {version = ">=1.49.1,<2.0.dev0", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, + {version = ">=1.33.2,<2.0.dev0", optional = true, markers = "python_version < \"3.11\" and extra == \"grpc\""}, ] protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0.dev0" requests = ">=2.18.0,<3.0.0.dev0" @@ -792,21 +689,19 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] [[package]] name = "google-auth" -version = "2.22.0" +version = "2.23.4" description = "Google Authentication Library" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "google-auth-2.22.0.tar.gz", hash = "sha256:164cba9af4e6e4e40c3a4f90a1a6c12ee56f14c0b4868d1ca91b32826ab334ce"}, - {file = "google_auth-2.22.0-py2.py3-none-any.whl", hash = "sha256:d61d1b40897407b574da67da1a833bdc10d5a11642566e506565d1b1a46ba873"}, + {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.dependencies] cachetools = ">=2.0.0,<6.0" pyasn1-modules = ">=0.2.1" rsa = ">=3.1.4,<5" -six = ">=1.9.0" -urllib3 = "<2.0" [package.extras] aiohttp = ["aiohttp (>=3.6.2,<4.0.0.dev0)", "requests (>=2.20.0,<3.0.0.dev0)"] @@ -835,13 +730,13 @@ grpc = ["grpcio (>=1.38.0,<2.0dev)"] [[package]] name = "google-cloud-pubsub" -version = "2.18.0" +version = "2.18.4" description = "Google Cloud Pub/Sub API client library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-pubsub-2.18.0.tar.gz", hash = "sha256:7a70df4111d9cb694a25cecdd2328827159c5213ae1e6304cb3abb38f379dd29"}, - {file = "google_cloud_pubsub-2.18.0-py2.py3-none-any.whl", hash = "sha256:c2aeec5cc80d55c94689cd72db74273cf5a5fba5f00771a623271086dfde161c"}, + {file = "google-cloud-pubsub-2.18.4.tar.gz", hash = "sha256:32eb61fd4c1dc6c842f594d69d9afa80544e3b327aa640a164eb6fb0201eaf2d"}, + {file = "google_cloud_pubsub-2.18.4-py2.py3-none-any.whl", hash = "sha256:f32144ad9ed32331a80a2f8379a3ca7526bbc01e7bd76de2e8ab52e492d21f50"}, ] [package.dependencies] @@ -850,8 +745,8 @@ grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" grpcio = ">=1.51.3,<2.0dev" grpcio-status = ">=1.33.2" proto-plus = [ - {version = ">=1.22.0,<2.0.0dev", markers = "python_version < \"3.11\""}, {version = ">=1.22.2,<2.0.0dev", markers = "python_version >= \"3.11\""}, + {version = ">=1.22.0,<2.0.0dev", markers = "python_version < \"3.11\""}, ] protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" @@ -860,40 +755,41 @@ libcst = ["libcst (>=0.3.10)"] [[package]] name = "google-cloud-secret-manager" -version = "2.16.2" +version = "2.16.4" description = "Google Cloud Secret Manager API client library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-secret-manager-2.16.2.tar.gz", hash = "sha256:596521091c39b94a260d814776421c8a009f6463b392880041efa80283b5fd29"}, - {file = "google_cloud_secret_manager-2.16.2-py2.py3-none-any.whl", hash = "sha256:9814c1bf75d44e4d03d5b79a1ccb2b121b27348de8d09ba2deedb7ca5c6d76de"}, + {file = "google-cloud-secret-manager-2.16.4.tar.gz", hash = "sha256:371dc72f9145af323e8a813c8e50380e6ac4bd6a5dbcd42dcf3162d8f37e5080"}, + {file = "google_cloud_secret_manager-2.16.4-py2.py3-none-any.whl", hash = "sha256:5031c45dd84dc584d91ee0baae2bbd5df6710efe0c42719ee370a3ab62aaf618"}, ] [package.dependencies] google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" proto-plus = [ - {version = ">=1.22.0,<2.0.0dev", markers = "python_version < \"3.11\""}, {version = ">=1.22.2,<2.0.0dev", markers = "python_version >= \"3.11\""}, + {version = ">=1.22.0,<2.0.0dev", markers = "python_version < \"3.11\""}, ] protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" [[package]] name = "google-cloud-storage" -version = "2.10.0" +version = "2.13.0" description = "Google Cloud Storage API client library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-storage-2.10.0.tar.gz", hash = "sha256:934b31ead5f3994e5360f9ff5750982c5b6b11604dc072bc452c25965e076dc7"}, - {file = "google_cloud_storage-2.10.0-py2.py3-none-any.whl", hash = "sha256:9433cf28801671de1c80434238fb1e7e4a1ba3087470e90f70c928ea77c2b9d7"}, + {file = "google-cloud-storage-2.13.0.tar.gz", hash = "sha256:f62dc4c7b6cd4360d072e3deb28035fbdad491ac3d9b0b1815a12daea10f37c7"}, + {file = "google_cloud_storage-2.13.0-py2.py3-none-any.whl", hash = "sha256:ab0bf2e1780a1b74cf17fccb13788070b729f50c252f0c94ada2aae0ca95437d"}, ] [package.dependencies] google-api-core = ">=1.31.5,<2.0.dev0 || >2.3.0,<3.0.0dev" -google-auth = ">=1.25.0,<3.0dev" +google-auth = ">=2.23.3,<3.0dev" google-cloud-core = ">=2.3.0,<3.0dev" -google-resumable-media = ">=2.3.2" +google-crc32c = ">=1.0,<2.0dev" +google-resumable-media = ">=2.6.0" requests = ">=2.18.0,<3.0.0dev" [package.extras] @@ -956,31 +852,31 @@ testing = ["pytest"] [[package]] name = "google-resumable-media" -version = "2.5.0" +version = "2.6.0" description = "Utilities for Google Media Downloads and Resumable Uploads" optional = false python-versions = ">= 3.7" files = [ - {file = "google-resumable-media-2.5.0.tar.gz", hash = "sha256:218931e8e2b2a73a58eb354a288e03a0fd5fb1c4583261ac6e4c078666468c93"}, - {file = "google_resumable_media-2.5.0-py2.py3-none-any.whl", hash = "sha256:da1bd943e2e114a56d85d6848497ebf9be6a14d3db23e9fc57581e7c3e8170ec"}, + {file = "google-resumable-media-2.6.0.tar.gz", hash = "sha256:972852f6c65f933e15a4a210c2b96930763b47197cdf4aa5f5bea435efb626e7"}, + {file = "google_resumable_media-2.6.0-py2.py3-none-any.whl", hash = "sha256:fc03d344381970f79eebb632a3c18bb1828593a2dc5572b5f90115ef7d11e81b"}, ] [package.dependencies] google-crc32c = ">=1.0,<2.0dev" [package.extras] -aiohttp = ["aiohttp (>=3.6.2,<4.0.0dev)"] +aiohttp = ["aiohttp (>=3.6.2,<4.0.0dev)", "google-auth (>=1.22.0,<2.0dev)"] requests = ["requests (>=2.18.0,<3.0.0dev)"] [[package]] name = "googleapis-common-protos" -version = "1.59.1" +version = "1.61.0" description = "Common protobufs used in Google APIs" optional = false python-versions = ">=3.7" files = [ - {file = "googleapis-common-protos-1.59.1.tar.gz", hash = "sha256:b35d530fe825fb4227857bc47ad84c33c809ac96f312e13182bdeaa2abe1178a"}, - {file = "googleapis_common_protos-1.59.1-py2.py3-none-any.whl", hash = "sha256:0cbedb6fb68f1c07e18eb4c48256320777707e7d0c55063ae56c15db3224a61e"}, + {file = "googleapis-common-protos-1.61.0.tar.gz", hash = "sha256:8a64866a97f6304a7179873a465d6eee97b7a24ec6cfd78e0f575e96b821240b"}, + {file = "googleapis_common_protos-1.61.0-py2.py3-none-any.whl", hash = "sha256:22f1915393bb3245343f6efe87f6fe868532efc12aa26b391b15132e1279f1c0"}, ] [package.dependencies] @@ -992,13 +888,13 @@ grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] [[package]] name = "grpc-google-iam-v1" -version = "0.12.6" +version = "0.12.7" description = "IAM API client library" optional = false python-versions = ">=3.7" files = [ - {file = "grpc-google-iam-v1-0.12.6.tar.gz", hash = "sha256:2bc4b8fdf22115a65d751c9317329322602c39b7c86a289c9b72d228d960ef5f"}, - {file = "grpc_google_iam_v1-0.12.6-py2.py3-none-any.whl", hash = "sha256:5c10f3d8dc2d88678ab1a9b0cb5482735c5efee71e6c0cd59f872eef22913f5c"}, + {file = "grpc-google-iam-v1-0.12.7.tar.gz", hash = "sha256:009197a7f1eaaa22149c96e5e054ac5934ba7241974e92663d8d3528a21203d1"}, + {file = "grpc_google_iam_v1-0.12.7-py2.py3-none-any.whl", hash = "sha256:834da89f4c4a2abbe842a793ed20fc6d9a77011ef2626755b1b89116fb9596d7"}, ] [package.dependencies] @@ -1008,75 +904,84 @@ protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.1 || >4.21.1,<4 [[package]] name = "grpcio" -version = "1.56.2" +version = "1.59.2" description = "HTTP/2-based RPC framework" optional = false python-versions = ">=3.7" files = [ - {file = "grpcio-1.56.2-cp310-cp310-linux_armv7l.whl", hash = "sha256:bf0b9959e673505ee5869950642428046edb91f99942607c2ecf635f8a4b31c9"}, - {file = "grpcio-1.56.2-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:5144feb20fe76e73e60c7d73ec3bf54f320247d1ebe737d10672480371878b48"}, - {file = "grpcio-1.56.2-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:a72797549935c9e0b9bc1def1768c8b5a709538fa6ab0678e671aec47ebfd55e"}, - {file = "grpcio-1.56.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3f3237a57e42f79f1e560726576aedb3a7ef931f4e3accb84ebf6acc485d316"}, - {file = "grpcio-1.56.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:900bc0096c2ca2d53f2e5cebf98293a7c32f532c4aeb926345e9747452233950"}, - {file = "grpcio-1.56.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:97e0efaebbfd222bcaac2f1735c010c1d3b167112d9d237daebbeedaaccf3d1d"}, - {file = "grpcio-1.56.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c0c85c5cbe8b30a32fa6d802588d55ffabf720e985abe9590c7c886919d875d4"}, - {file = "grpcio-1.56.2-cp310-cp310-win32.whl", hash = "sha256:06e84ad9ae7668a109e970c7411e7992751a116494cba7c4fb877656527f9a57"}, - {file = "grpcio-1.56.2-cp310-cp310-win_amd64.whl", hash = "sha256:10954662f77dc36c9a1fb5cc4a537f746580d6b5734803be1e587252682cda8d"}, - {file = "grpcio-1.56.2-cp311-cp311-linux_armv7l.whl", hash = "sha256:c435f5ce1705de48e08fcbcfaf8aee660d199c90536e3e06f2016af7d6a938dd"}, - {file = "grpcio-1.56.2-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:6108e5933eb8c22cd3646e72d5b54772c29f57482fd4c41a0640aab99eb5071d"}, - {file = "grpcio-1.56.2-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:8391cea5ce72f4a12368afd17799474015d5d3dc00c936a907eb7c7eaaea98a5"}, - {file = "grpcio-1.56.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:750de923b456ca8c0f1354d6befca45d1f3b3a789e76efc16741bd4132752d95"}, - {file = "grpcio-1.56.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fda2783c12f553cdca11c08e5af6eecbd717280dc8fbe28a110897af1c15a88c"}, - {file = "grpcio-1.56.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:9e04d4e4cfafa7c5264e535b5d28e786f0571bea609c3f0aaab13e891e933e9c"}, - {file = "grpcio-1.56.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:89a49cc5ad08a38b6141af17e00d1dd482dc927c7605bc77af457b5a0fca807c"}, - {file = "grpcio-1.56.2-cp311-cp311-win32.whl", hash = "sha256:6a007a541dff984264981fbafeb052bfe361db63578948d857907df9488d8774"}, - {file = "grpcio-1.56.2-cp311-cp311-win_amd64.whl", hash = "sha256:af4063ef2b11b96d949dccbc5a987272f38d55c23c4c01841ea65a517906397f"}, - {file = "grpcio-1.56.2-cp37-cp37m-linux_armv7l.whl", hash = "sha256:a6ff459dac39541e6a2763a4439c4ca6bc9ecb4acc05a99b79246751f9894756"}, - {file = "grpcio-1.56.2-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:f20fd21f7538f8107451156dd1fe203300b79a9ddceba1ee0ac8132521a008ed"}, - {file = "grpcio-1.56.2-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:d1fbad1f9077372b6587ec589c1fc120b417b6c8ad72d3e3cc86bbbd0a3cee93"}, - {file = "grpcio-1.56.2-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ee26e9dfb3996aff7c870f09dc7ad44a5f6732b8bdb5a5f9905737ac6fd4ef1"}, - {file = "grpcio-1.56.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4c60abd950d6de3e4f1ddbc318075654d275c29c846ab6a043d6ed2c52e4c8c"}, - {file = "grpcio-1.56.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1c31e52a04e62c8577a7bf772b3e7bed4df9c9e0dd90f92b6ffa07c16cab63c9"}, - {file = "grpcio-1.56.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:345356b307cce5d14355e8e055b4ca5f99bc857c33a3dc1ddbc544fca9cd0475"}, - {file = "grpcio-1.56.2-cp37-cp37m-win_amd64.whl", hash = "sha256:42e63904ee37ae46aa23de50dac8b145b3596f43598fa33fe1098ab2cbda6ff5"}, - {file = "grpcio-1.56.2-cp38-cp38-linux_armv7l.whl", hash = "sha256:7c5ede2e2558f088c49a1ddda19080e4c23fb5d171de80a726b61b567e3766ed"}, - {file = "grpcio-1.56.2-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:33971197c47965cc1d97d78d842163c283e998223b151bab0499b951fd2c0b12"}, - {file = "grpcio-1.56.2-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:d39f5d4af48c138cb146763eda14eb7d8b3ccbbec9fe86fb724cd16e0e914c64"}, - {file = "grpcio-1.56.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ded637176addc1d3eef35331c39acc598bac550d213f0a1bedabfceaa2244c87"}, - {file = "grpcio-1.56.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c90da4b124647547a68cf2f197174ada30c7bb9523cb976665dfd26a9963d328"}, - {file = "grpcio-1.56.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3ccb621749a81dc7755243665a70ce45536ec413ef5818e013fe8dfbf5aa497b"}, - {file = "grpcio-1.56.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4eb37dd8dd1aa40d601212afa27ca5be255ba792e2e0b24d67b8af5e012cdb7d"}, - {file = "grpcio-1.56.2-cp38-cp38-win32.whl", hash = "sha256:ddb4a6061933bd9332b74eac0da25f17f32afa7145a33a0f9711ad74f924b1b8"}, - {file = "grpcio-1.56.2-cp38-cp38-win_amd64.whl", hash = "sha256:8940d6de7068af018dfa9a959a3510e9b7b543f4c405e88463a1cbaa3b2b379a"}, - {file = "grpcio-1.56.2-cp39-cp39-linux_armv7l.whl", hash = "sha256:51173e8fa6d9a2d85c14426bdee5f5c4a0654fd5fddcc21fe9d09ab0f6eb8b35"}, - {file = "grpcio-1.56.2-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:373b48f210f43327a41e397391715cd11cfce9ded2fe76a5068f9bacf91cc226"}, - {file = "grpcio-1.56.2-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:42a3bbb2bc07aef72a7d97e71aabecaf3e4eb616d39e5211e2cfe3689de860ca"}, - {file = "grpcio-1.56.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5344be476ac37eb9c9ad09c22f4ea193c1316bf074f1daf85bddb1b31fda5116"}, - {file = "grpcio-1.56.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3fa3ab0fb200a2c66493828ed06ccd1a94b12eddbfb985e7fd3e5723ff156c6"}, - {file = "grpcio-1.56.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b975b85d1d5efc36cf8b237c5f3849b64d1ba33d6282f5e991f28751317504a1"}, - {file = "grpcio-1.56.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cbdf2c498e077282cd427cfd88bdce4668019791deef0be8155385ab2ba7837f"}, - {file = "grpcio-1.56.2-cp39-cp39-win32.whl", hash = "sha256:139f66656a762572ae718fa0d1f2dce47c05e9fbf7a16acd704c354405b97df9"}, - {file = "grpcio-1.56.2-cp39-cp39-win_amd64.whl", hash = "sha256:830215173ad45d670140ff99aac3b461f9be9a6b11bee1a17265aaaa746a641a"}, - {file = "grpcio-1.56.2.tar.gz", hash = "sha256:0ff789ae7d8ddd76d2ac02e7d13bfef6fc4928ac01e1dcaa182be51b6bcc0aaa"}, + {file = "grpcio-1.59.2-cp310-cp310-linux_armv7l.whl", hash = "sha256:d2fa68a96a30dd240be80bbad838a0ac81a61770611ff7952b889485970c4c71"}, + {file = "grpcio-1.59.2-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:cf0dead5a2c5a3347af2cfec7131d4f2a2e03c934af28989c9078f8241a491fa"}, + {file = "grpcio-1.59.2-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:e420ced29b5904cdf9ee5545e23f9406189d8acb6750916c2db4793dada065c6"}, + {file = "grpcio-1.59.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b230028a008ae1d0f430acb227d323ff8a619017415cf334c38b457f814119f"}, + {file = "grpcio-1.59.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a4a3833c0e067f3558538727235cd8a49709bff1003200bbdefa2f09334e4b1"}, + {file = "grpcio-1.59.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6b25ed37c27e652db01be341af93fbcea03d296c024d8a0e680017a268eb85dd"}, + {file = "grpcio-1.59.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:73abb8584b0cf74d37f5ef61c10722adc7275502ab71789a8fe3cb7ef04cf6e2"}, + {file = "grpcio-1.59.2-cp310-cp310-win32.whl", hash = "sha256:d6f70406695e3220f09cd7a2f879333279d91aa4a8a1d34303b56d61a8180137"}, + {file = "grpcio-1.59.2-cp310-cp310-win_amd64.whl", hash = "sha256:3c61d641d4f409c5ae46bfdd89ea42ce5ea233dcf69e74ce9ba32b503c727e29"}, + {file = "grpcio-1.59.2-cp311-cp311-linux_armv7l.whl", hash = "sha256:3059668df17627f0e0fa680e9ef8c995c946c792612e9518f5cc1503be14e90b"}, + {file = "grpcio-1.59.2-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:72ca2399097c0b758198f2ff30f7178d680de8a5cfcf3d9b73a63cf87455532e"}, + {file = "grpcio-1.59.2-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:c978f864b35f2261e0819f5cd88b9830b04dc51bcf055aac3c601e525a10d2ba"}, + {file = "grpcio-1.59.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9411e24328a2302e279e70cae6e479f1fddde79629fcb14e03e6d94b3956eabf"}, + {file = "grpcio-1.59.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb7e0fe6ad73b7f06d7e2b689c19a71cf5cc48f0c2bf8608469e51ffe0bd2867"}, + {file = "grpcio-1.59.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c2504eed520958a5b77cc99458297cb7906308cb92327f35fb7fbbad4e9b2188"}, + {file = "grpcio-1.59.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2171c39f355ba5b551c5d5928d65aa6c69807fae195b86ef4a7d125bcdb860a9"}, + {file = "grpcio-1.59.2-cp311-cp311-win32.whl", hash = "sha256:d2794f0e68b3085d99b4f6ff9c089f6fdd02b32b9d3efdfbb55beac1bf22d516"}, + {file = "grpcio-1.59.2-cp311-cp311-win_amd64.whl", hash = "sha256:2067274c88bc6de89c278a672a652b4247d088811ece781a4858b09bdf8448e3"}, + {file = "grpcio-1.59.2-cp312-cp312-linux_armv7l.whl", hash = "sha256:535561990e075fa6bd4b16c4c3c1096b9581b7bb35d96fac4650f1181e428268"}, + {file = "grpcio-1.59.2-cp312-cp312-macosx_10_10_universal2.whl", hash = "sha256:a213acfbf186b9f35803b52e4ca9addb153fc0b67f82a48f961be7000ecf6721"}, + {file = "grpcio-1.59.2-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:6959fb07e8351e20501ffb8cc4074c39a0b7ef123e1c850a7f8f3afdc3a3da01"}, + {file = "grpcio-1.59.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e82c5cf1495244adf5252f925ac5932e5fd288b3e5ab6b70bec5593074b7236c"}, + {file = "grpcio-1.59.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:023088764012411affe7db183d1ada3ad9daf2e23ddc719ff46d7061de661340"}, + {file = "grpcio-1.59.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:da2d94c15f88cd40d7e67f7919d4f60110d2b9d5b1e08cf354c2be773ab13479"}, + {file = "grpcio-1.59.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:6009386a2df66159f64ac9f20425ae25229b29b9dd0e1d3dd60043f037e2ad7e"}, + {file = "grpcio-1.59.2-cp312-cp312-win32.whl", hash = "sha256:75c6ecb70e809cf1504465174343113f51f24bc61e22a80ae1c859f3f7034c6d"}, + {file = "grpcio-1.59.2-cp312-cp312-win_amd64.whl", hash = "sha256:cbe946b3e6e60a7b4618f091e62a029cb082b109a9d6b53962dd305087c6e4fd"}, + {file = "grpcio-1.59.2-cp37-cp37m-linux_armv7l.whl", hash = "sha256:f8753a6c88d1d0ba64302309eecf20f70d2770f65ca02d83c2452279085bfcd3"}, + {file = "grpcio-1.59.2-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:f1ef0d39bc1feb420caf549b3c657c871cad4ebbcf0580c4d03816b0590de0cf"}, + {file = "grpcio-1.59.2-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:4c93f4abbb54321ee6471e04a00139c80c754eda51064187963ddf98f5cf36a4"}, + {file = "grpcio-1.59.2-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:08d77e682f2bf730a4961eea330e56d2f423c6a9b91ca222e5b1eb24a357b19f"}, + {file = "grpcio-1.59.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ff16d68bf453275466a9a46739061a63584d92f18a0f5b33d19fc97eb69867c"}, + {file = "grpcio-1.59.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4abb717e320e74959517dc8e84a9f48fbe90e9abe19c248541e9418b1ce60acd"}, + {file = "grpcio-1.59.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:36f53c2b3449c015880e7d55a89c992c357f176327b0d2873cdaaf9628a37c69"}, + {file = "grpcio-1.59.2-cp37-cp37m-win_amd64.whl", hash = "sha256:cc3e4cd087f07758b16bef8f31d88dbb1b5da5671d2f03685ab52dece3d7a16e"}, + {file = "grpcio-1.59.2-cp38-cp38-linux_armv7l.whl", hash = "sha256:27f879ae604a7fcf371e59fba6f3ff4635a4c2a64768bd83ff0cac503142fef4"}, + {file = "grpcio-1.59.2-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:7cf05053242f61ba94014dd3a986e11a083400a32664058f80bf4cf817c0b3a1"}, + {file = "grpcio-1.59.2-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:e1727c1c0e394096bb9af185c6923e8ea55a5095b8af44f06903bcc0e06800a2"}, + {file = "grpcio-1.59.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5d573e70a6fe77555fb6143c12d3a7d3fa306632a3034b4e7c59ca09721546f8"}, + {file = "grpcio-1.59.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31176aa88f36020055ace9adff2405a33c8bdbfa72a9c4980e25d91b2f196873"}, + {file = "grpcio-1.59.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:11168ef43e4a43ff1b1a65859f3e0ef1a173e277349e7fb16923ff108160a8cd"}, + {file = "grpcio-1.59.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:53c9aa5ddd6857c0a1cd0287225a2a25873a8e09727c2e95c4aebb1be83a766a"}, + {file = "grpcio-1.59.2-cp38-cp38-win32.whl", hash = "sha256:3b4368b33908f683a363f376dfb747d40af3463a6e5044afee07cf9436addf96"}, + {file = "grpcio-1.59.2-cp38-cp38-win_amd64.whl", hash = "sha256:0a754aff9e3af63bdc4c75c234b86b9d14e14a28a30c4e324aed1a9b873d755f"}, + {file = "grpcio-1.59.2-cp39-cp39-linux_armv7l.whl", hash = "sha256:1f9524d1d701e399462d2c90ba7c193e49d1711cf429c0d3d97c966856e03d00"}, + {file = "grpcio-1.59.2-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:f93dbf58f03146164048be5426ffde298b237a5e059144847e4940f5b80172c3"}, + {file = "grpcio-1.59.2-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:6da6dea3a1bacf99b3c2187e296db9a83029ed9c38fd4c52b7c9b7326d13c828"}, + {file = "grpcio-1.59.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5f09cffa619adfb44799fa4a81c2a1ad77c887187613fb0a8f201ab38d89ba1"}, + {file = "grpcio-1.59.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c35aa9657f5d5116d23b934568e0956bd50c615127810fffe3ac356a914c176a"}, + {file = "grpcio-1.59.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:74100fecaec8a535e380cf5f2fb556ff84957d481c13e54051c52e5baac70541"}, + {file = "grpcio-1.59.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:128e20f57c5f27cb0157e73756d1586b83c1b513ebecc83ea0ac37e4b0e4e758"}, + {file = "grpcio-1.59.2-cp39-cp39-win32.whl", hash = "sha256:686e975a5d16602dc0982c7c703948d17184bd1397e16c8ee03511ecb8c4cdda"}, + {file = "grpcio-1.59.2-cp39-cp39-win_amd64.whl", hash = "sha256:242adc47725b9a499ee77c6a2e36688fa6c96484611f33b1be4c57ab075a92dd"}, + {file = "grpcio-1.59.2.tar.gz", hash = "sha256:d8f9cd4ad1be90b0cf350a2f04a38a36e44a026cac1e036ac593dc48efe91d52"}, ] [package.extras] -protobuf = ["grpcio-tools (>=1.56.2)"] +protobuf = ["grpcio-tools (>=1.59.2)"] [[package]] name = "grpcio-status" -version = "1.56.2" +version = "1.59.2" description = "Status proto mapping for gRPC" optional = false python-versions = ">=3.6" files = [ - {file = "grpcio-status-1.56.2.tar.gz", hash = "sha256:a046b2c0118df4a5687f4585cca9d3c3bae5c498c4dff055dcb43fb06a1180c8"}, - {file = "grpcio_status-1.56.2-py3-none-any.whl", hash = "sha256:63f3842867735f59f5d70e723abffd2e8501a6bcd915612a1119e52f10614782"}, + {file = "grpcio-status-1.59.2.tar.gz", hash = "sha256:a2c2b146e66b73ba80d021ab34fce5db4dd9be67ca4566cda40d36b185ce54f4"}, + {file = "grpcio_status-1.59.2-py3-none-any.whl", hash = "sha256:24bdf3b3b83b9112f43bd0626f82510d12cc1d919a45028ac20eb6919218e508"}, ] [package.dependencies] googleapis-common-protos = ">=1.5.5" -grpcio = ">=1.56.2" +grpcio = ">=1.59.2" protobuf = ">=4.21.6" [[package]] @@ -1541,13 +1446,13 @@ files = [ [[package]] name = "packaging" -version = "23.1" +version = "23.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.7" files = [ - {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, - {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, + {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, + {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, ] [[package]] @@ -1586,10 +1491,10 @@ files = [ [package.dependencies] numpy = [ + {version = ">=1.21.0", markers = "python_version >= \"3.10\""}, {version = ">=1.17.3", markers = "(platform_machine != \"aarch64\" and platform_machine != \"arm64\") and python_version < \"3.10\""}, {version = ">=1.19.2", markers = "platform_machine == \"aarch64\" and python_version < \"3.10\""}, {version = ">=1.20.0", markers = "platform_machine == \"arm64\" and python_version < \"3.10\""}, - {version = ">=1.21.0", markers = "python_version >= \"3.10\""}, ] python-dateutil = ">=2.7.3" pytz = ">=2017.3" @@ -1599,32 +1504,32 @@ test = ["hypothesis (>=3.58)", "pytest (>=6.0)", "pytest-xdist"] [[package]] name = "pathspec" -version = "0.11.1" +version = "0.11.2" description = "Utility library for gitignore style pattern matching of file paths." optional = false python-versions = ">=3.7" files = [ - {file = "pathspec-0.11.1-py3-none-any.whl", hash = "sha256:d8af70af76652554bd134c22b3e8a1cc46ed7d91edcdd721ef1a0c51a84a5293"}, - {file = "pathspec-0.11.1.tar.gz", hash = "sha256:2798de800fa92780e33acca925945e9a19a133b715067cf165b8866c15a31687"}, + {file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"}, + {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"}, ] [[package]] name = "platformdirs" -version = "3.9.1" +version = "4.0.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." optional = false python-versions = ">=3.7" files = [ - {file = "platformdirs-3.9.1-py3-none-any.whl", hash = "sha256:ad8291ae0ae5072f66c16945166cb11c63394c7a3ad1b1bc9828ca3162da8c2f"}, - {file = "platformdirs-3.9.1.tar.gz", hash = "sha256:1b42b450ad933e981d56e59f1b97495428c9bd60698baab9f3eb3d00d5822421"}, + {file = "platformdirs-4.0.0-py3-none-any.whl", hash = "sha256:118c954d7e949b35437270383a3f2531e99dd93cf7ce4dc8340d3356d30f173b"}, + {file = "platformdirs-4.0.0.tar.gz", hash = "sha256:cb633b2bcf10c51af60beb0ab06d2f1d69064b43abf4c185ca6b28865f3f9731"}, ] [package.dependencies] -typing-extensions = {version = ">=4.6.3", markers = "python_version < \"3.8\""} +typing-extensions = {version = ">=4.7.1", markers = "python_version < \"3.8\""} [package.extras] -docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest-cov (>=4.1)", "pytest-mock (>=3.10)"] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] [[package]] name = "pluggy" @@ -1646,13 +1551,13 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "pre-commit" -version = "2.21.0" +version = "2.20.0" description = "A framework for managing and maintaining multi-language pre-commit hooks." optional = false python-versions = ">=3.7" files = [ - {file = "pre_commit-2.21.0-py2.py3-none-any.whl", hash = "sha256:e2f91727039fc39a92f58a588a25b87f936de6567eed4f0e673e0507edc75bad"}, - {file = "pre_commit-2.21.0.tar.gz", hash = "sha256:31ef31af7e474a8d8995027fefdfcf509b5c913ff31f2015b4ec4beb26a6f658"}, + {file = "pre_commit-2.20.0-py2.py3-none-any.whl", hash = "sha256:51a5ba7c480ae8072ecdb6933df22d2f812dc897d5fe848778116129a681aac7"}, + {file = "pre_commit-2.20.0.tar.gz", hash = "sha256:a978dac7bc9ec0bcee55c18a277d553b0f419d259dadb4b9418ff2d00eb43959"}, ] [package.dependencies] @@ -1661,7 +1566,8 @@ identify = ">=1.0.0" importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} nodeenv = ">=0.11.1" pyyaml = ">=5.1" -virtualenv = ">=20.10.0" +toml = "*" +virtualenv = ">=20.0.8" [[package]] name = "proto-plus" @@ -1682,24 +1588,24 @@ testing = ["google-api-core[grpc] (>=1.31.5)"] [[package]] name = "protobuf" -version = "4.23.4" +version = "4.24.4" description = "" optional = false python-versions = ">=3.7" 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-cp37-cp37m-win32.whl", hash = "sha256:c3e0939433c40796ca4cfc0fac08af50b00eb66a40bbbc5dee711998fb0bbc1e"}, - {file = "protobuf-4.23.4-cp37-cp37m-win_amd64.whl", hash = "sha256:9053df6df8e5a76c84339ee4a9f5a2661ceee4a0dab019e8663c50ba324208b0"}, - {file = "protobuf-4.23.4-cp38-cp38-win32.whl", hash = "sha256:e1c915778d8ced71e26fcf43c0866d7499891bca14c4368448a82edc61fdbc70"}, - {file = "protobuf-4.23.4-cp38-cp38-win_amd64.whl", hash = "sha256:351cc90f7d10839c480aeb9b870a211e322bf05f6ab3f55fcb2f51331f80a7d2"}, - {file = "protobuf-4.23.4-cp39-cp39-win32.whl", hash = "sha256:6dd9b9940e3f17077e820b75851126615ee38643c2c5332aa7a359988820c720"}, - {file = "protobuf-4.23.4-cp39-cp39-win_amd64.whl", hash = "sha256:0a5759f5696895de8cc913f084e27fd4125e8fb0914bb729a17816a33819f474"}, - {file = "protobuf-4.23.4-py3-none-any.whl", hash = "sha256:e9d0be5bf34b275b9f87ba7407796556abeeba635455d036c7351f7c183ef8ff"}, - {file = "protobuf-4.23.4.tar.gz", hash = "sha256:ccd9430c0719dce806b93f89c91de7977304729e55377f872a92465d548329a9"}, + {file = "protobuf-4.24.4-cp310-abi3-win32.whl", hash = "sha256:ec9912d5cb6714a5710e28e592ee1093d68c5ebfeda61983b3f40331da0b1ebb"}, + {file = "protobuf-4.24.4-cp310-abi3-win_amd64.whl", hash = "sha256:1badab72aa8a3a2b812eacfede5020472e16c6b2212d737cefd685884c191085"}, + {file = "protobuf-4.24.4-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:8e61a27f362369c2f33248a0ff6896c20dcd47b5d48239cb9720134bef6082e4"}, + {file = "protobuf-4.24.4-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:bffa46ad9612e6779d0e51ae586fde768339b791a50610d85eb162daeb23661e"}, + {file = "protobuf-4.24.4-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:b493cb590960ff863743b9ff1452c413c2ee12b782f48beca77c8da3e2ffe9d9"}, + {file = "protobuf-4.24.4-cp37-cp37m-win32.whl", hash = "sha256:dbbed8a56e56cee8d9d522ce844a1379a72a70f453bde6243e3c86c30c2a3d46"}, + {file = "protobuf-4.24.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6b7d2e1c753715dcfe9d284a25a52d67818dd43c4932574307daf836f0071e37"}, + {file = "protobuf-4.24.4-cp38-cp38-win32.whl", hash = "sha256:02212557a76cd99574775a81fefeba8738d0f668d6abd0c6b1d3adcc75503dbe"}, + {file = "protobuf-4.24.4-cp38-cp38-win_amd64.whl", hash = "sha256:2fa3886dfaae6b4c5ed2730d3bf47c7a38a72b3a1f0acb4d4caf68e6874b947b"}, + {file = "protobuf-4.24.4-cp39-cp39-win32.whl", hash = "sha256:b77272f3e28bb416e2071186cb39efd4abbf696d682cbb5dc731308ad37fa6dd"}, + {file = "protobuf-4.24.4-cp39-cp39-win_amd64.whl", hash = "sha256:9fee5e8aa20ef1b84123bb9232b3f4a5114d9897ed89b4b8142d81924e05d79b"}, + {file = "protobuf-4.24.4-py3-none-any.whl", hash = "sha256:80797ce7424f8c8d2f2547e2d42bfbb6c08230ce5832d6c099a37335c9c90a92"}, + {file = "protobuf-4.24.4.tar.gz", hash = "sha256:5a70731910cd9104762161719c3d883c960151eea077134458503723b60e3667"}, ] [[package]] @@ -1749,17 +1655,6 @@ files = [ {file = "pycodestyle-2.7.0.tar.gz", hash = "sha256:c389c1d06bf7904078ca03399a4816f974a1d590090fecea0c63ec26ebaf1cef"}, ] -[[package]] -name = "pycparser" -version = "2.21" -description = "C parser in Python" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -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 = "2.3.1" @@ -1773,13 +1668,13 @@ files = [ [[package]] name = "pygments" -version = "2.15.1" +version = "2.16.1" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.7" files = [ - {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, - {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, + {file = "Pygments-2.16.1-py3-none-any.whl", hash = "sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692"}, + {file = "Pygments-2.16.1.tar.gz", hash = "sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29"}, ] [package.extras] @@ -1823,13 +1718,13 @@ files = [ [[package]] name = "pytest" -version = "7.4.0" +version = "7.4.3" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.7" files = [ - {file = "pytest-7.4.0-py3-none-any.whl", hash = "sha256:78bf16451a2eb8c7a2ea98e32dc119fd2aa758f1d5d66dbf0a59d69a3969df32"}, - {file = "pytest-7.4.0.tar.gz", hash = "sha256:b4bf8c45bd59934ed84001ad51e11b4ee40d40a1229d2c79f9c592b0a3f6bd8a"}, + {file = "pytest-7.4.3-py3-none-any.whl", hash = "sha256:0d009c083ea859a71b76adf7c1d502e4bc170b80a8ef002da5806527b9591fac"}, + {file = "pytest-7.4.3.tar.gz", hash = "sha256:d989d136982de4e3b29dabcc838ad581c64e8ed52c11fbe86ddebd9da0818cd5"}, ] [package.dependencies] @@ -1874,13 +1769,13 @@ cli = ["click (>=5.0)"] [[package]] name = "pytz" -version = "2023.3" +version = "2023.3.post1" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" files = [ - {file = "pytz-2023.3-py2.py3-none-any.whl", hash = "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb"}, - {file = "pytz-2023.3.tar.gz", hash = "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588"}, + {file = "pytz-2023.3.post1-py2.py3-none-any.whl", hash = "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7"}, + {file = "pytz-2023.3.post1.tar.gz", hash = "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b"}, ] [[package]] @@ -2052,65 +1947,65 @@ pyasn1 = ">=0.1.3" [[package]] name = "ruamel-yaml" -version = "0.17.32" +version = "0.18.5" description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" optional = false -python-versions = ">=3" +python-versions = ">=3.7" files = [ - {file = "ruamel.yaml-0.17.32-py3-none-any.whl", hash = "sha256:23cd2ed620231677564646b0c6a89d138b6822a0d78656df7abda5879ec4f447"}, - {file = "ruamel.yaml-0.17.32.tar.gz", hash = "sha256:ec939063761914e14542972a5cba6d33c23b0859ab6342f61cf070cfc600efc2"}, + {file = "ruamel.yaml-0.18.5-py3-none-any.whl", hash = "sha256:a013ac02f99a69cdd6277d9664689eb1acba07069f912823177c5eced21a6ada"}, + {file = "ruamel.yaml-0.18.5.tar.gz", hash = "sha256:61917e3a35a569c1133a8f772e1226961bf5a1198bea7e23f06a0841dea1ab0e"}, ] [package.dependencies] -"ruamel.yaml.clib" = {version = ">=0.2.7", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.12\""} +"ruamel.yaml.clib" = {version = ">=0.2.7", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.13\""} [package.extras] -docs = ["ryd"] +docs = ["mercurial (>5.7)", "ryd"] jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] [[package]] name = "ruamel-yaml-clib" -version = "0.2.7" +version = "0.2.8" description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" files = [ - {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d5859983f26d8cd7bb5c287ef452e8aacc86501487634573d260968f753e1d71"}, - {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:debc87a9516b237d0466a711b18b6ebeb17ba9f391eb7f91c649c5c4ec5006c7"}, - {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:df5828871e6648db72d1c19b4bd24819b80a755c4541d3409f0f7acd0f335c80"}, - {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:efa08d63ef03d079dcae1dfe334f6c8847ba8b645d08df286358b1f5293d24ab"}, - {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-win32.whl", hash = "sha256:763d65baa3b952479c4e972669f679fe490eee058d5aa85da483ebae2009d231"}, - {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-win_amd64.whl", hash = "sha256:d000f258cf42fec2b1bbf2863c61d7b8918d31ffee905da62dede869254d3b8a"}, - {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:045e0626baf1c52e5527bd5db361bc83180faaba2ff586e763d3d5982a876a9e"}, - {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-macosx_12_6_arm64.whl", hash = "sha256:721bc4ba4525f53f6a611ec0967bdcee61b31df5a56801281027a3a6d1c2daf5"}, - {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:41d0f1fa4c6830176eef5b276af04c89320ea616655d01327d5ce65e50575c94"}, - {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-win32.whl", hash = "sha256:f6d3d39611ac2e4f62c3128a9eed45f19a6608670c5a2f4f07f24e8de3441d38"}, - {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-win_amd64.whl", hash = "sha256:da538167284de58a52109a9b89b8f6a53ff8437dd6dc26d33b57bf6699153122"}, - {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:4b3a93bb9bc662fc1f99c5c3ea8e623d8b23ad22f861eb6fce9377ac07ad6072"}, - {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-macosx_12_0_arm64.whl", hash = "sha256:a234a20ae07e8469da311e182e70ef6b199d0fbeb6c6cc2901204dd87fb867e8"}, - {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:15910ef4f3e537eea7fe45f8a5d19997479940d9196f357152a09031c5be59f3"}, - {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:370445fd795706fd291ab00c9df38a0caed0f17a6fb46b0f607668ecb16ce763"}, - {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-win32.whl", hash = "sha256:ecdf1a604009bd35c674b9225a8fa609e0282d9b896c03dd441a91e5f53b534e"}, - {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-win_amd64.whl", hash = "sha256:f34019dced51047d6f70cb9383b2ae2853b7fc4dce65129a5acd49f4f9256646"}, - {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2aa261c29a5545adfef9296b7e33941f46aa5bbd21164228e833412af4c9c75f"}, - {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-macosx_12_0_arm64.whl", hash = "sha256:f01da5790e95815eb5a8a138508c01c758e5f5bc0ce4286c4f7028b8dd7ac3d0"}, - {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:40d030e2329ce5286d6b231b8726959ebbe0404c92f0a578c0e2482182e38282"}, - {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:c3ca1fbba4ae962521e5eb66d72998b51f0f4d0f608d3c0347a48e1af262efa7"}, - {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-win32.whl", hash = "sha256:7bdb4c06b063f6fd55e472e201317a3bb6cdeeee5d5a38512ea5c01e1acbdd93"}, - {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-win_amd64.whl", hash = "sha256:be2a7ad8fd8f7442b24323d24ba0b56c51219513cfa45b9ada3b87b76c374d4b"}, - {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:91a789b4aa0097b78c93e3dc4b40040ba55bef518f84a40d4442f713b4094acb"}, - {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:99e77daab5d13a48a4054803d052ff40780278240a902b880dd37a51ba01a307"}, - {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:3243f48ecd450eddadc2d11b5feb08aca941b5cd98c9b1db14b2fd128be8c697"}, - {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:8831a2cedcd0f0927f788c5bdf6567d9dc9cc235646a434986a852af1cb54b4b"}, - {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-win32.whl", hash = "sha256:3110a99e0f94a4a3470ff67fc20d3f96c25b13d24c6980ff841e82bafe827cac"}, - {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-win_amd64.whl", hash = "sha256:92460ce908546ab69770b2e576e4f99fbb4ce6ab4b245345a3869a0a0410488f"}, - {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5bc0667c1eb8f83a3752b71b9c4ba55ef7c7058ae57022dd9b29065186a113d9"}, - {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:4a4d8d417868d68b979076a9be6a38c676eca060785abaa6709c7b31593c35d1"}, - {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:bf9a6bc4a0221538b1a7de3ed7bca4c93c02346853f44e1cd764be0023cd3640"}, - {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:a7b301ff08055d73223058b5c46c55638917f04d21577c95e00e0c4d79201a6b"}, - {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-win32.whl", hash = "sha256:d5e51e2901ec2366b79f16c2299a03e74ba4531ddcfacc1416639c557aef0ad8"}, - {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-win_amd64.whl", hash = "sha256:184faeaec61dbaa3cace407cffc5819f7b977e75360e8d5ca19461cd851a5fc5"}, - {file = "ruamel.yaml.clib-0.2.7.tar.gz", hash = "sha256:1f08fd5a2bea9c4180db71678e850b995d2a5f4537be0e94557668cf0f5f9497"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b42169467c42b692c19cf539c38d4602069d8c1505e97b86387fcf7afb766e1d"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:07238db9cbdf8fc1e9de2489a4f68474e70dffcb32232db7c08fa61ca0c7c462"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:d92f81886165cb14d7b067ef37e142256f1c6a90a65cd156b063a43da1708cfd"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:fff3573c2db359f091e1589c3d7c5fc2f86f5bdb6f24252c2d8e539d4e45f412"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-win32.whl", hash = "sha256:c69212f63169ec1cfc9bb44723bf2917cbbd8f6191a00ef3410f5a7fe300722d"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-win_amd64.whl", hash = "sha256:cabddb8d8ead485e255fe80429f833172b4cadf99274db39abc080e068cbcc31"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bef08cd86169d9eafb3ccb0a39edb11d8e25f3dae2b28f5c52fd997521133069"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:b16420e621d26fdfa949a8b4b47ade8810c56002f5389970db4ddda51dbff248"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:b5edda50e5e9e15e54a6a8a0070302b00c518a9d32accc2346ad6c984aacd279"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:25c515e350e5b739842fc3228d662413ef28f295791af5e5110b543cf0b57d9b"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-win32.whl", hash = "sha256:53a300ed9cea38cf5a2a9b069058137c2ca1ce658a874b79baceb8f892f915a7"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-win_amd64.whl", hash = "sha256:c2a72e9109ea74e511e29032f3b670835f8a59bbdc9ce692c5b4ed91ccf1eedb"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ebc06178e8821efc9692ea7544aa5644217358490145629914d8020042c24aa1"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_13_0_arm64.whl", hash = "sha256:edaef1c1200c4b4cb914583150dcaa3bc30e592e907c01117c08b13a07255ec2"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:7048c338b6c86627afb27faecf418768acb6331fc24cfa56c93e8c9780f815fa"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d176b57452ab5b7028ac47e7b3cf644bcfdc8cacfecf7e71759f7f51a59e5c92"}, + {file = "ruamel.yaml.clib-0.2.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a5aa27bad2bb83670b71683aae140a1f52b0857a2deff56ad3f6c13a017a26ed"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c58ecd827313af6864893e7af0a3bb85fd529f862b6adbefe14643947cfe2942"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-macosx_12_0_arm64.whl", hash = "sha256:f481f16baec5290e45aebdc2a5168ebc6d35189ae6fea7a58787613a25f6e875"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:3fcc54cb0c8b811ff66082de1680b4b14cf8a81dce0d4fbf665c2265a81e07a1"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7f67a1ee819dc4562d444bbafb135832b0b909f81cc90f7aa00260968c9ca1b3"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-win32.whl", hash = "sha256:75e1ed13e1f9de23c5607fe6bd1aeaae21e523b32d83bb33918245361e9cc51b"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-win_amd64.whl", hash = "sha256:3f215c5daf6a9d7bbed4a0a4f760f3113b10e82ff4c5c44bec20a68c8014f675"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1b617618914cb00bf5c34d4357c37aa15183fa229b24767259657746c9077615"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:a6a9ffd280b71ad062eae53ac1659ad86a17f59a0fdc7699fd9be40525153337"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:665f58bfd29b167039f714c6998178d27ccd83984084c286110ef26b230f259f"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:700e4ebb569e59e16a976857c8798aee258dceac7c7d6b50cab63e080058df91"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-win32.whl", hash = "sha256:955eae71ac26c1ab35924203fda6220f84dce57d6d7884f189743e2abe3a9fbe"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-win_amd64.whl", hash = "sha256:56f4252222c067b4ce51ae12cbac231bce32aee1d33fbfc9d17e5b8d6966c312"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:03d1162b6d1df1caa3a4bd27aa51ce17c9afc2046c31b0ad60a0a96ec22f8001"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:bba64af9fa9cebe325a62fa398760f5c7206b215201b0ec825005f1b18b9bccf"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:9eb5dee2772b0f704ca2e45b1713e4e5198c18f515b52743576d196348f374d3"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:da09ad1c359a728e112d60116f626cc9f29730ff3e0e7db72b9a2dbc2e4beed5"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-win32.whl", hash = "sha256:84b554931e932c46f94ab306913ad7e11bba988104c5cff26d90d03f68258cd5"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-win_amd64.whl", hash = "sha256:25ac8c08322002b06fa1d49d1646181f0b2c72f5cbc15a85e80b4c30a544bb15"}, + {file = "ruamel.yaml.clib-0.2.8.tar.gz", hash = "sha256:beb2e0404003de9a4cab9753a8805a8fe9320ee6673136ed7f04255fe60bb512"}, ] [[package]] @@ -2246,18 +2141,18 @@ Sphinx = "*" [[package]] name = "sphinx-rtd-theme" -version = "1.2.2" +version = "1.3.0" description = "Read the Docs theme for Sphinx" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ - {file = "sphinx_rtd_theme-1.2.2-py2.py3-none-any.whl", hash = "sha256:6a7e7d8af34eb8fc57d52a09c6b6b9c46ff44aea5951bc831eeb9245378f3689"}, - {file = "sphinx_rtd_theme-1.2.2.tar.gz", hash = "sha256:01c5c5a72e2d025bd23d1f06c59a4831b06e6ce6c01fdd5ebfe9986c0a880fc7"}, + {file = "sphinx_rtd_theme-1.3.0-py2.py3-none-any.whl", hash = "sha256:46ddef89cc2416a81ecfbeaceab1881948c014b1b6e4450b815311a89fb977b0"}, + {file = "sphinx_rtd_theme-1.3.0.tar.gz", hash = "sha256:590b030c7abb9cf038ec053b95e5380b5c70d61591eb0b552063fbe7c41f0931"}, ] [package.dependencies] docutils = "<0.19" -sphinx = ">=1.6,<7" +sphinx = ">=1.6,<8" sphinxcontrib-jquery = ">=4,<5" [package.extras] @@ -2445,6 +2340,17 @@ files = [ [package.extras] widechars = ["wcwidth"] +[[package]] +name = "toml" +version = "0.10.2" +description = "Python Library for Tom's Obvious, Minimal Language" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] + [[package]] name = "tomli" version = "2.0.1" @@ -2484,13 +2390,13 @@ testing = ["flaky (>=3.4.0)", "freezegun (>=0.3.11)", "pathlib2 (>=2.3.3)", "psu [[package]] name = "twined" -version = "0.5.2" +version = "0.5.3" description = "A library to help digital twins and data services talk to one another" optional = false python-versions = ">=3.6" files = [ - {file = "twined-0.5.2-py3-none-any.whl", hash = "sha256:fa5f43e350be8a0b72e007d43d384d357917a5f7788a84a6a9338e0b778373bb"}, - {file = "twined-0.5.2.tar.gz", hash = "sha256:7794b5d372d53dd73f98b53edf369e95e9395ad99174f5cc0a167938515ddd98"}, + {file = "twined-0.5.3-py3-none-any.whl", hash = "sha256:ca3b9fc49cd1a402b997e7ba24a1e369ffed20854cc8965050d9c388f581a472"}, + {file = "twined-0.5.3.tar.gz", hash = "sha256:326b170c5ceeb60db09e93cf5a223b964a3e7d8bed96ccbb31363a988acc38f3"}, ] [package.dependencies] @@ -2586,13 +2492,13 @@ files = [ [[package]] name = "tzlocal" -version = "5.0.1" +version = "5.1" description = "tzinfo object for the local timezone" optional = false python-versions = ">=3.7" files = [ - {file = "tzlocal-5.0.1-py3-none-any.whl", hash = "sha256:f3596e180296aaf2dbd97d124fe76ae3a0e3d32b258447de7b939b3fd4be992f"}, - {file = "tzlocal-5.0.1.tar.gz", hash = "sha256:46eb99ad4bdb71f3f72b7d24f4267753e240944ecfc16f25d2719ba89827a803"}, + {file = "tzlocal-5.1-py3-none-any.whl", hash = "sha256:2938498395d5f6a898ab8009555cb37a4d360913ad375d4747ef16826b03ef23"}, + {file = "tzlocal-5.1.tar.gz", hash = "sha256:a5ccb2365b295ed964e0a98ad076fe10c495591e75505d34f154d60a7f1ed722"}, ] [package.dependencies] @@ -2604,40 +2510,42 @@ devenv = ["black", "check-manifest", "flake8", "pyroma", "pytest (>=4.3)", "pyte [[package]] name = "urllib3" -version = "1.26.16" +version = "2.0.7" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = ">=3.7" files = [ - {file = "urllib3-1.26.16-py2.py3-none-any.whl", hash = "sha256:8d36afa7616d8ab714608411b4a3b13e58f463aee519024578e062e141dce20f"}, - {file = "urllib3-1.26.16.tar.gz", hash = "sha256:8f135f6502756bde6b2a9b28989df5fbe87c9970cecaa69041edcce7f0589b14"}, + {file = "urllib3-2.0.7-py3-none-any.whl", hash = "sha256:fdb6d215c776278489906c2f8916e6e7d4f5a9b602ccbcfdf7f016fc8da0596e"}, + {file = "urllib3-2.0.7.tar.gz", hash = "sha256:c97dfde1f7bd43a71c8d2a58e369e9b2bf692d1334ea9f9cae55add7d0dd0f84"}, ] [package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] -secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] [[package]] name = "virtualenv" -version = "20.24.2" +version = "20.4.7" description = "Virtual Python Environment builder" optional = false -python-versions = ">=3.7" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" files = [ - {file = "virtualenv-20.24.2-py3-none-any.whl", hash = "sha256:43a3052be36080548bdee0b42919c88072037d50d56c28bd3f853cbe92b953ff"}, - {file = "virtualenv-20.24.2.tar.gz", hash = "sha256:fd8a78f46f6b99a67b7ec5cf73f92357891a7b3a40fd97637c27f854aae3b9e0"}, + {file = "virtualenv-20.4.7-py2.py3-none-any.whl", hash = "sha256:2b0126166ea7c9c3661f5b8e06773d28f83322de7a3ff7d06f0aed18c9de6a76"}, + {file = "virtualenv-20.4.7.tar.gz", hash = "sha256:14fdf849f80dbb29a4eb6caa9875d476ee2a5cf76a5f5415fa2f1606010ab467"}, ] [package.dependencies] -distlib = ">=0.3.7,<1" -filelock = ">=3.12.2,<4" -importlib-metadata = {version = ">=6.6", markers = "python_version < \"3.8\""} -platformdirs = ">=3.9.1,<4" +appdirs = ">=1.4.3,<2" +distlib = ">=0.3.1,<1" +filelock = ">=3.0.0,<4" +importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} +six = ">=1.9.0,<2" [package.extras] -docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] -test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] +docs = ["proselint (>=0.10.2)", "sphinx (>=3)", "sphinx-argparse (>=0.2.5)", "sphinx-rtd-theme (>=0.4.3)", "towncrier (>=19.9.0rc1)"] +testing = ["coverage (>=4)", "coverage-enable-subprocess (>=1)", "flaky (>=3)", "packaging (>=20.0)", "pytest (>=4)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.1)", "pytest-mock (>=2)", "pytest-randomly (>=1)", "pytest-timeout (>=1)", "xonsh (>=0.9.16)"] [[package]] name = "webencodings" diff --git a/pyproject.toml b/pyproject.toml index 324a9fff2..783bb7c88 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "octue" -version = "0.50.1" +version = "0.51.0" description = "A package providing template applications for data services, and a python SDK to the Octue API." readme = "README.md" authors = ["Marcus Lugg ", "Thomas Clark "] diff --git a/tests/cloud/deployment/google/cloud_run/test_cloud_run_deployment.py b/tests/cloud/deployment/google/cloud_run/test_cloud_run_deployment.py index 47776ff8c..5ede89e54 100644 --- a/tests/cloud/deployment/google/cloud_run/test_cloud_run_deployment.py +++ b/tests/cloud/deployment/google/cloud_run/test_cloud_run_deployment.py @@ -13,7 +13,7 @@ class TestCloudRunDeployment(TestCase): # This is the service ID of the example service deployed to Google Cloud Run. child = Child( - id="octue/example-service-cloud-run:0.2.1", + id="octue/example-service-cloud-run:0.3.2", backend={"name": "GCPPubSubBackend", "project_name": os.environ["TEST_PROJECT_NAME"]}, ) diff --git a/tests/cloud/deployment/google/test_answer_pub_sub_question.py b/tests/cloud/deployment/google/test_answer_pub_sub_question.py index a2115bc76..f9a9d4e33 100644 --- a/tests/cloud/deployment/google/test_answer_pub_sub_question.py +++ b/tests/cloud/deployment/google/test_answer_pub_sub_question.py @@ -29,26 +29,28 @@ def test_with_no_app_configuration_file(self): patch.dict(os.environ, {"OCTUE_SERVICE_REVISION_TAG": "blah"}), ] ): - with patch("octue.cloud.deployment.google.answer_pub_sub_question.Runner") as mock_runner: + with patch( + "octue.cloud.deployment.google.answer_pub_sub_question.Runner.from_configuration" + ) as mock_constructor: answer_question( question={"data": {}, "attributes": {"question_uuid": "8c859f87-b594-4297-883f-cd1c7718ef29"}}, project_name="a-project-name", ) - mock_runner.assert_called_with( - **{ - "app_src": ".", - "twine": "twine.json", - "configuration_values": None, - "configuration_manifest": None, - "children": None, - "output_location": None, - "crash_diagnostics_cloud_path": None, - "project_name": "a-project-name", - "service_id": "testing/test-service:blah", - "service_registries": None, - } + self.assertTrue( + mock_constructor.call_args.kwargs["service_configuration"].app_source_path.endswith("octue-sdk-python") ) + self.assertTrue(mock_constructor.call_args.kwargs["service_configuration"].twine_path.endswith("twine.json")) + self.assertIsNone(mock_constructor.call_args.kwargs["service_configuration"].diagnostics_cloud_path) + self.assertIsNone(mock_constructor.call_args.kwargs["service_configuration"].service_registries) + + self.assertIsNone(mock_constructor.call_args.kwargs["app_configuration"].configuration_values) + self.assertIsNone(mock_constructor.call_args.kwargs["app_configuration"].configuration_manifest) + self.assertIsNone(mock_constructor.call_args.kwargs["app_configuration"].children) + self.assertIsNone(mock_constructor.call_args.kwargs["app_configuration"].output_location) + + self.assertEqual(mock_constructor.call_args.kwargs["project_name"], "a-project-name") + self.assertEqual(mock_constructor.call_args.kwargs["service_id"], "testing/test-service:blah") def test_with_service_configuration_file_and_app_configuration_file(self): """Test that the `answer_question` function uses the values in the service and app configuration files if they @@ -73,7 +75,9 @@ class MockOpenForConfigurationFiles(MockOpen): "app_configuration.json": json.dumps({"configuration_values": {"hello": "configuration"}}), } - with patch("octue.cloud.deployment.google.answer_pub_sub_question.Runner") as mock_runner: + with patch( + "octue.cloud.deployment.google.answer_pub_sub_question.Runner.from_configuration" + ) as mock_constructor: with MultiPatcher( patches=[ patch("octue.configuration.open", mock.mock_open(mock=MockOpenForConfigurationFiles)), @@ -90,17 +94,21 @@ class MockOpenForConfigurationFiles(MockOpen): project_name="a-project-name", ) - mock_runner.assert_called_with( - **{ - "app_src": "/path/to/app_dir", - "twine": "path/to/twine.json", - "configuration_values": {"hello": "configuration"}, - "configuration_manifest": None, - "children": None, - "output_location": None, - "crash_diagnostics_cloud_path": None, - "project_name": "a-project-name", - "service_id": "testing/test-service:blah", - "service_registries": None, - } + self.assertTrue( + mock_constructor.call_args.kwargs["service_configuration"].app_source_path.endswith("path/to/app_dir") ) + self.assertTrue( + mock_constructor.call_args.kwargs["service_configuration"].twine_path.endswith("path/to/twine.json") + ) + self.assertIsNone(mock_constructor.call_args.kwargs["service_configuration"].diagnostics_cloud_path) + self.assertIsNone(mock_constructor.call_args.kwargs["service_configuration"].service_registries) + + self.assertEqual( + mock_constructor.call_args.kwargs["app_configuration"].configuration_values, {"hello": "configuration"} + ) + self.assertIsNone(mock_constructor.call_args.kwargs["app_configuration"].configuration_manifest) + self.assertIsNone(mock_constructor.call_args.kwargs["app_configuration"].children) + self.assertIsNone(mock_constructor.call_args.kwargs["app_configuration"].output_location) + + self.assertEqual(mock_constructor.call_args.kwargs["project_name"], "a-project-name") + self.assertEqual(mock_constructor.call_args.kwargs["service_id"], "testing/test-service:blah") diff --git a/tests/cloud/emulators/test_child_emulator.py b/tests/cloud/emulators/test_child_emulator.py index 208b810bd..893d7731f 100644 --- a/tests/cloud/emulators/test_child_emulator.py +++ b/tests/cloud/emulators/test_child_emulator.py @@ -1,4 +1,3 @@ -import json import logging import os @@ -48,7 +47,7 @@ def test_ask_with_invalid_message_structure(self): def test_ask_with_invalid_message_type(self): """Test that messages with an invalid type fail validation.""" messages = [ - {"type": "hello", "content": [1, 2, 3, 4]}, + {"kind": "hello", "content": [1, 2, 3, 4]}, ] child_emulator = ChildEmulator(backend=self.BACKEND, messages=messages) @@ -56,19 +55,20 @@ def test_ask_with_invalid_message_type(self): with self.assertRaises(ValueError): child_emulator.ask(input_values={"hello": "world"}) - def test_ask_with_invalid_result(self): - """Test that an invalid result fails validation.""" - messages = [ - { - "type": "result", - "wrong": "keys", - }, - ] - - child_emulator = ChildEmulator(backend=self.BACKEND, messages=messages) - - with self.assertRaises(ValueError): - child_emulator.ask(input_values={"hello": "world"}) + # Re-enable this when schema validation has been sorted out in the child emulator. + # def test_ask_with_invalid_result(self): + # """Test that an invalid result fails validation.""" + # messages = [ + # { + # "kind": "result", + # "wrong": "keys", + # }, + # ] + # + # child_emulator = ChildEmulator(backend=self.BACKEND, messages=messages) + # + # with self.assertRaises(ValueError): + # child_emulator.ask(input_values={"hello": "world"}) def test_ask_with_result_message(self): """Test that result messages are returned by the emulator's ask method.""" @@ -76,7 +76,7 @@ def test_ask_with_result_message(self): messages = [ { - "type": "result", + "kind": "result", "output_values": [1, 2, 3, 4], "output_manifest": output_manifest, }, @@ -94,7 +94,7 @@ def test_ask_with_input_manifest(self): messages = [ { - "type": "result", + "kind": "result", "output_values": [1, 2, 3, 4], "output_manifest": None, }, @@ -115,7 +115,7 @@ def test_ask_with_log_record_with_missing_log_record_key(self): """Test that an error is raised if a log record message missing the "log_record" key is given.""" messages = [ { - "type": "log_record", + "kind": "log_record", } ] @@ -128,7 +128,7 @@ def test_ask_with_invalid_log_record(self): """Test that an invalid log record representation fails validation.""" messages = [ { - "type": "log_record", + "kind": "log_record", "log_record": [1, 2, 3], }, ] @@ -142,11 +142,11 @@ def test_ask_with_logs(self): """Test that log records can be handled by the emulator.""" messages = [ { - "type": "log_record", + "kind": "log_record", "log_record": {"msg": "Starting analysis.", "levelno": 20, "levelname": "INFO"}, }, { - "type": "log_record", + "kind": "log_record", "log_record": {"msg": "Finishing analysis.", "levelno": 20, "levelname": "INFO"}, }, ] @@ -163,11 +163,11 @@ def test_ask_with_logs_without_level_number_and_name(self): """Test that the 'INFO' log level is used if none is provided in the log record dictionaries.""" messages = [ { - "type": "log_record", + "kind": "log_record", "log_record": {"msg": "Starting analysis."}, }, { - "type": "log_record", + "kind": "log_record", "log_record": {"msg": "Finishing analysis."}, }, ] @@ -187,7 +187,7 @@ def test_ask_with_invalid_exception(self): """Test that an invalid exception fails validation.""" messages = [ { - "type": "exception", + "kind": "exception", "not": "an exception", }, ] @@ -201,7 +201,7 @@ def test_ask_with_exception(self): """Test that exceptions are raised by the emulator.""" messages = [ { - "type": "exception", + "kind": "exception", "exception_type": "TypeError", "exception_message": "This simulates an error in the child.", }, @@ -220,8 +220,8 @@ def test_ask_with_monitor_message(self): """Test that monitor messages are handled by the emulator.""" messages = [ { - "type": "monitor_message", - "data": json.dumps("A sample monitor message."), + "kind": "monitor_message", + "data": "A sample monitor message.", }, ] @@ -241,8 +241,8 @@ def test_heartbeat_messages_are_ignored(self): """Test that heartbeat messages are ignored by the emulator.""" messages = [ { - "type": "heartbeat", - "time": "2022-08-31 17:05:47.968419", + "kind": "heartbeat", + "datetime": "2023-11-23T14:25:38.142884", }, ] @@ -281,7 +281,7 @@ def test_ask_more_than_one_question(self): """Test than a child emulator can be asked more than one question without an error occurring.""" messages = [ { - "type": "result", + "kind": "result", "output_values": [1, 2, 3, 4], "output_manifest": None, }, diff --git a/tests/cloud/emulators/valid_child_emulator_files/file_with_exception.json b/tests/cloud/emulators/valid_child_emulator_files/file_with_exception.json index d5e2951be..dddcff096 100644 --- a/tests/cloud/emulators/valid_child_emulator_files/file_with_exception.json +++ b/tests/cloud/emulators/valid_child_emulator_files/file_with_exception.json @@ -1,18 +1,17 @@ { - "messages": [ - { - "type": "log_record", - "log_record": {"msg": "Starting analysis."} - }, - { - "type": "exception", - "exception_type": "FileNotFoundError", - "exception_message": "Blah blah blah." - }, - { - "type": "result", - "output_values": [1, 2, 3, 4, 5], - "output_manifest": null - } - ] + "messages": [ + { + "kind": "log_record", + "log_record": { "msg": "Starting analysis." } + }, + { + "kind": "exception", + "exception_type": "FileNotFoundError", + "exception_message": "Blah blah blah." + }, + { + "kind": "result", + "output_values": [1, 2, 3, 4, 5] + } + ] } diff --git a/tests/cloud/emulators/valid_child_emulator_files/file_with_only_messages.json b/tests/cloud/emulators/valid_child_emulator_files/file_with_only_messages.json index 817117c75..1cacb36ff 100644 --- a/tests/cloud/emulators/valid_child_emulator_files/file_with_only_messages.json +++ b/tests/cloud/emulators/valid_child_emulator_files/file_with_only_messages.json @@ -1,21 +1,20 @@ { - "messages": [ - { - "type": "log_record", - "log_record": {"msg": "Starting analysis."} - }, - { - "type": "log_record", - "log_record": {"msg": "Finishing analysis."} - }, - { - "type": "monitor_message", - "data": "{\"sample\": \"data\"}" - }, - { - "type": "result", - "output_values": [1, 2, 3, 4, 5], - "output_manifest": null - } - ] + "messages": [ + { + "kind": "log_record", + "log_record": { "msg": "Starting analysis." } + }, + { + "kind": "log_record", + "log_record": { "msg": "Finishing analysis." } + }, + { + "kind": "monitor_message", + "data": { "sample": "data" } + }, + { + "kind": "result", + "output_values": [1, 2, 3, 4, 5] + } + ] } diff --git a/tests/cloud/emulators/valid_child_emulator_files/file_with_output_manifest.json b/tests/cloud/emulators/valid_child_emulator_files/file_with_output_manifest.json index 05ef0d1f5..bd965a29f 100644 --- a/tests/cloud/emulators/valid_child_emulator_files/file_with_output_manifest.json +++ b/tests/cloud/emulators/valid_child_emulator_files/file_with_output_manifest.json @@ -1,16 +1,15 @@ { - "messages": [ - { - "type": "result", - "output_values": null, - "output_manifest": { - "id": "04a969e9-04b4-4f35-bd30-36de6e7daea2", - "name": null, - "datasets": { - "dataset_a": "gs://octue-sdk-python-test-bucket/dataset_a", - "dataset_b": "gs://octue-sdk-python-test-bucket/dataset_b" - } - } + "messages": [ + { + "kind": "result", + "output_manifest": { + "id": "04a969e9-04b4-4f35-bd30-36de6e7daea2", + "name": null, + "datasets": { + "dataset_a": "gs://octue-sdk-python-test-bucket/dataset_a", + "dataset_b": "gs://octue-sdk-python-test-bucket/dataset_b" } - ] + } + } + ] } diff --git a/tests/cloud/emulators/valid_child_emulator_files/full_file.json b/tests/cloud/emulators/valid_child_emulator_files/full_file.json index bbcf33846..f16e56874 100644 --- a/tests/cloud/emulators/valid_child_emulator_files/full_file.json +++ b/tests/cloud/emulators/valid_child_emulator_files/full_file.json @@ -7,21 +7,20 @@ "internal_service_name": "octue/my-service:2.3.0", "messages": [ { - "type": "log_record", + "kind": "log_record", "log_record": { "msg": "Starting analysis." } }, { - "type": "log_record", + "kind": "log_record", "log_record": { "msg": "Finishing analysis." } }, { - "type": "monitor_message", - "data": "{\"sample\": \"data\"}" + "kind": "monitor_message", + "data": { "sample": "data" } }, { - "type": "result", - "output_values": [1, 2, 3, 4, 5], - "output_manifest": null + "kind": "result", + "output_values": [1, 2, 3, 4, 5] } ] } diff --git a/tests/cloud/pub_sub/test_logging.py b/tests/cloud/pub_sub/test_logging.py index e80da7d29..44afbc933 100644 --- a/tests/cloud/pub_sub/test_logging.py +++ b/tests/cloud/pub_sub/test_logging.py @@ -3,7 +3,7 @@ from logging import makeLogRecord from unittest.mock import patch -from octue.cloud.emulators._pub_sub import MESSAGES, MockService, MockTopic +from octue.cloud.emulators._pub_sub import SUBSCRIPTIONS, MockService, MockSubscription, MockTopic from octue.cloud.pub_sub.logging import GooglePubSubHandler from octue.resources.service_backends import GCPPubSubBackend from tests.base import BaseTestCase @@ -20,13 +20,25 @@ def test_emit(self): topic = MockTopic(name="world", project_name="blah") topic.create() + question_uuid = "96d69278-44ac-4631-aeea-c90fb08a1b2b" + subscription = MockSubscription(name=f"world.answers.{question_uuid}", topic=topic, project_name="blah") + subscription.create() + log_record = makeLogRecord({"msg": "Starting analysis."}) backend = GCPPubSubBackend(project_name="blah") service = MockService(backend=backend) - GooglePubSubHandler(service._send_message, topic, "analysis-id").emit(log_record) - self.assertEqual(json.loads(MESSAGES[topic.name][0].data.decode())["log_record"]["msg"], "Starting analysis.") + GooglePubSubHandler( + message_sender=service._send_message, + topic=topic, + question_uuid=question_uuid, + ).emit(log_record) + + self.assertEqual( + json.loads(SUBSCRIPTIONS[subscription.name][0].data.decode())["log_record"]["msg"], + "Starting analysis.", + ) def test_emit_with_non_json_serialisable_args(self): """Test that non-JSON-serialisable arguments to log messages are converted to their string representation @@ -49,7 +61,11 @@ def test_emit_with_non_json_serialisable_args(self): service = MockService(backend=backend) with patch("octue.cloud.emulators._pub_sub.MockPublisher.publish") as mock_publish: - GooglePubSubHandler(service._send_message, topic, "analysis-id").emit(record) + GooglePubSubHandler( + message_sender=service._send_message, + topic=topic, + question_uuid="question-uuid", + ).emit(record) self.assertEqual( json.loads(mock_publish.call_args.kwargs["data"].decode())["log_record"]["msg"], diff --git a/tests/cloud/pub_sub/test_message_handler.py b/tests/cloud/pub_sub/test_message_handler.py index 7af1c0a77..11c158cf6 100644 --- a/tests/cloud/pub_sub/test_message_handler.py +++ b/tests/cloud/pub_sub/test_message_handler.py @@ -4,7 +4,7 @@ from unittest.mock import patch from octue.cloud.emulators._pub_sub import ( - MESSAGES, + SUBSCRIPTIONS, MockMessage, MockMessagePuller, MockService, @@ -19,9 +19,11 @@ from tests.base import BaseTestCase -mock_topic = MockTopic(name="world", project_name=TEST_PROJECT_NAME) -receiving_service = MockService(backend=GCPPubSubBackend(project_name=TEST_PROJECT_NAME)) -mock_subscription = MockSubscription(name="world", topic=mock_topic, project_name=TEST_PROJECT_NAME) +mock_topic = MockTopic(name="my-org.my-service.1-0-0", project_name=TEST_PROJECT_NAME) +mock_subscription = MockSubscription(name="my-org.my-service.1-0-0", topic=mock_topic, project_name=TEST_PROJECT_NAME) +receiving_service = MockService( + service_id="my-org/my-service:1.0.0", backend=GCPPubSubBackend(project_name=TEST_PROJECT_NAME) +) class TestOrderedMessageHandler(BaseTestCase): @@ -32,32 +34,19 @@ def test_timeout(self): subscription=mock_subscription, receiving_service=receiving_service, message_handlers={"test": lambda message: None, "finish-test": lambda message: message}, + schema={}, ) with patch( "octue.cloud.pub_sub.service.OrderedMessageHandler._pull_and_enqueue_message", new=MockMessagePuller( - messages=[{"type": "test", "message_number": 0}], + messages=[MockMessage(b"")], message_handler=message_handler, ).pull, ): with self.assertRaises(TimeoutError): message_handler.handle_messages(timeout=0) - def test_unknown_message_type_raises_warning(self): - """Test that unknown message types result in a warning being logged.""" - with patch("octue.cloud.pub_sub.message_handler.SubscriberClient", MockSubscriber): - message_handler = OrderedMessageHandler( - subscription=mock_subscription, - receiving_service=receiving_service, - message_handlers={"finish-test": lambda message: message}, - ) - - with self.assertLogs() as logging_context: - message_handler._handle_message({"type": "blah", "message_number": 0}) - - self.assertIn("received a message of unknown type", logging_context.output[1]) - def test_in_order_messages_are_handled_in_order(self): """Test that messages received in order are handled in order.""" with patch("octue.cloud.pub_sub.message_handler.SubscriberClient", MockSubscriber): @@ -65,13 +54,14 @@ def test_in_order_messages_are_handled_in_order(self): subscription=mock_subscription, receiving_service=receiving_service, message_handlers={"test": lambda message: None, "finish-test": lambda message: "This is the result."}, + schema={}, ) messages = [ - {"type": "test", "message_number": 0}, - {"type": "test", "message_number": 1}, - {"type": "test", "message_number": 2}, - {"type": "finish-test", "message_number": 3}, + MockMessage.from_primitive({"kind": "test"}, attributes={"message_number": 0}), + MockMessage.from_primitive({"kind": "test"}, attributes={"message_number": 1}), + MockMessage.from_primitive({"kind": "test"}, attributes={"message_number": 2}), + MockMessage.from_primitive({"kind": "finish-test"}, attributes={"message_number": 3}), ] with patch( @@ -81,7 +71,7 @@ def test_in_order_messages_are_handled_in_order(self): result = message_handler.handle_messages() self.assertEqual(result, "This is the result.") - self.assertEqual(message_handler.handled_messages, messages) + self.assertEqual(message_handler.handled_messages, [json.loads(message.data.decode()) for message in messages]) def test_out_of_order_messages_are_handled_in_order(self): """Test that messages received out of order are handled in order.""" @@ -90,13 +80,14 @@ def test_out_of_order_messages_are_handled_in_order(self): subscription=mock_subscription, receiving_service=receiving_service, message_handlers={"test": lambda message: None, "finish-test": lambda message: "This is the result."}, + schema={}, ) messages = [ - {"type": "test", "message_number": 1}, - {"type": "test", "message_number": 2}, - {"type": "test", "message_number": 0}, - {"type": "finish-test", "message_number": 3}, + MockMessage.from_primitive({"kind": "test", "order": 1}, attributes={"message_number": 1}), + MockMessage.from_primitive({"kind": "test", "order": 2}, attributes={"message_number": 2}), + MockMessage.from_primitive({"kind": "test", "order": 0}, attributes={"message_number": 0}), + MockMessage.from_primitive({"kind": "finish-test", "order": 3}, attributes={"message_number": 3}), ] with patch( @@ -109,10 +100,10 @@ def test_out_of_order_messages_are_handled_in_order(self): self.assertEqual( message_handler.handled_messages, [ - {"type": "test", "message_number": 0}, - {"type": "test", "message_number": 1}, - {"type": "test", "message_number": 2}, - {"type": "finish-test", "message_number": 3}, + {"kind": "test", "order": 0}, + {"kind": "test", "order": 1}, + {"kind": "test", "order": 2}, + {"kind": "finish-test", "order": 3}, ], ) @@ -125,16 +116,17 @@ def test_out_of_order_messages_with_end_message_first_are_handled_in_order(self) subscription=mock_subscription, receiving_service=receiving_service, message_handlers={"test": lambda message: None, "finish-test": lambda message: "This is the result."}, + schema={}, ) with patch( "octue.cloud.pub_sub.service.OrderedMessageHandler._pull_and_enqueue_message", new=MockMessagePuller( messages=[ - {"type": "finish-test", "message_number": 3}, - {"type": "test", "message_number": 1}, - {"type": "test", "message_number": 2}, - {"type": "test", "message_number": 0}, + MockMessage.from_primitive({"kind": "finish-test", "order": 3}, attributes={"message_number": 3}), + MockMessage.from_primitive({"kind": "test", "order": 1}, attributes={"message_number": 1}), + MockMessage.from_primitive({"kind": "test", "order": 2}, attributes={"message_number": 2}), + MockMessage.from_primitive({"kind": "test", "order": 0}, attributes={"message_number": 0}), ], message_handler=message_handler, ).pull, @@ -146,10 +138,10 @@ def test_out_of_order_messages_with_end_message_first_are_handled_in_order(self) self.assertEqual( message_handler.handled_messages, [ - {"type": "test", "message_number": 0}, - {"type": "test", "message_number": 1}, - {"type": "test", "message_number": 2}, - {"type": "finish-test", "message_number": 3}, + {"kind": "test", "order": 0}, + {"kind": "test", "order": 1}, + {"kind": "test", "order": 2}, + {"kind": "finish-test", "order": 3}, ], ) @@ -160,12 +152,13 @@ def test_no_timeout(self): subscription=mock_subscription, receiving_service=receiving_service, message_handlers={"test": lambda message: None, "finish-test": lambda message: "This is the result."}, + schema={}, ) messages = [ - {"type": "test", "message_number": 0}, - {"type": "test", "message_number": 1}, - {"type": "finish-test", "message_number": 2}, + MockMessage.from_primitive({"kind": "test", "order": 0}, attributes={"message_number": 0}), + MockMessage.from_primitive({"kind": "test", "order": 1}, attributes={"message_number": 1}), + MockMessage.from_primitive({"kind": "finish-test", "order": 2}, attributes={"message_number": 2}), ] with patch( @@ -175,7 +168,10 @@ def test_no_timeout(self): result = message_handler.handle_messages(timeout=None) self.assertEqual(result, "This is the result.") - self.assertEqual(message_handler.handled_messages, messages) + self.assertEqual( + message_handler.handled_messages, + [{"kind": "test", "order": 0}, {"kind": "test", "order": 1}, {"kind": "finish-test", "order": 2}], + ) def test_delivery_acknowledgement(self): """Test that a delivery acknowledgement message is handled correctly.""" @@ -189,12 +185,17 @@ def test_delivery_acknowledgement(self): "octue.cloud.pub_sub.service.OrderedMessageHandler._pull_and_enqueue_message", new=MockMessagePuller( [ - { - "type": "delivery_acknowledgement", - "delivery_time": "2021-11-17 17:33:59.717428", - "message_number": 0, - }, - {"type": "result", "output_values": None, "output_manifest": None, "message_number": 1}, + MockMessage.from_primitive( + { + "kind": "delivery_acknowledgement", + "datetime": "2021-11-17 17:33:59.717428", + }, + attributes={"message_number": 0}, + ), + MockMessage.from_primitive( + {"kind": "result", "output_values": None, "output_manifest": None}, + attributes={"message_number": 1}, + ), ], message_handler=message_handler, ).pull, @@ -247,12 +248,17 @@ def test_error_not_raised_if_heartbeat_has_been_received_in_maximum_allowed_inte "octue.cloud.pub_sub.service.OrderedMessageHandler._pull_and_enqueue_message", new=MockMessagePuller( messages=[ - { - "type": "delivery_acknowledgement", - "delivery_time": "2021-11-17 17:33:59.717428", - "message_number": 0, - }, - {"type": "result", "output_values": None, "output_manifest": None, "message_number": 1}, + MockMessage.from_primitive( + { + "kind": "delivery_acknowledgement", + "datetime": "2021-11-17 17:33:59.717428", + }, + attributes={"message_number": 0}, + ), + MockMessage.from_primitive( + {"kind": "result", "output_values": None, "output_manifest": None}, + attributes={"message_number": 1}, + ), ], message_handler=message_handler, ).pull, @@ -293,16 +299,17 @@ def test_handler_can_skip_first_n_messages_if_missed(self): subscription=mock_subscription, receiving_service=receiving_service, message_handlers={"test": lambda message: None, "finish-test": lambda message: "This is the result."}, + schema={}, ) # Simulate the first two messages not being received. message_handler._earliest_message_number_received = 2 messages = [ - {"type": "test", "message_number": 2}, - {"type": "test", "message_number": 3}, - {"type": "test", "message_number": 4}, - {"type": "finish-test", "message_number": 5}, + MockMessage.from_primitive({"kind": "test", "order": 2}, attributes={"message_number": 2}), + MockMessage.from_primitive({"kind": "test", "order": 3}, attributes={"message_number": 3}), + MockMessage.from_primitive({"kind": "test", "order": 4}, attributes={"message_number": 4}), + MockMessage.from_primitive({"kind": "finish-test", "order": 5}, attributes={"message_number": 5}), ] with patch( @@ -312,7 +319,15 @@ def test_handler_can_skip_first_n_messages_if_missed(self): result = message_handler.handle_messages(skip_first_messages_after=0) self.assertEqual(result, "This is the result.") - self.assertEqual(message_handler.handled_messages, messages) + self.assertEqual( + message_handler.handled_messages, + [ + {"kind": "test", "order": 2}, + {"kind": "test", "order": 3}, + {"kind": "test", "order": 4}, + {"kind": "finish-test", "order": 5}, + ], + ) def test_later_missing_messages_cannot_be_skipped(self): """Test that missing messages that aren't in the first n messages cannot be skipped.""" @@ -321,13 +336,14 @@ def test_later_missing_messages_cannot_be_skipped(self): subscription=mock_subscription, receiving_service=receiving_service, message_handlers={"test": lambda message: None, "finish-test": lambda message: "This is the result."}, + schema={}, ) messages = [ - {"type": "test", "message_number": 0}, - {"type": "test", "message_number": 1}, - {"type": "test", "message_number": 2}, - {"type": "finish-test", "message_number": 5}, + MockMessage.from_primitive({"kind": "test", "order": 0}, attributes={"message_number": 0}), + MockMessage.from_primitive({"kind": "test", "order": 1}, attributes={"message_number": 1}), + MockMessage.from_primitive({"kind": "test", "order": 2}, attributes={"message_number": 2}), + MockMessage.from_primitive({"kind": "finish-test", "order": 5}, attributes={"message_number": 5}), ] with patch( @@ -338,34 +354,68 @@ def test_later_missing_messages_cannot_be_skipped(self): message_handler.handle_messages(timeout=0.5, skip_first_messages_after=0) # Check that only the first three messages were handled. - self.assertEqual(message_handler.handled_messages, messages[:3]) + self.assertEqual( + message_handler.handled_messages, + [ + {"kind": "test", "order": 0}, + {"kind": "test", "order": 1}, + {"kind": "test", "order": 2}, + ], + ) class TestPullAndEnqueueMessage(BaseTestCase): def test_pull_and_enqueue_message(self): """Test that pulling and enqueuing a message works.""" + question_uuid = "4d31bb46-66c4-4e68-831f-e51e17e651ef" + with ServicePatcher(): + mock_subscription = MockSubscription( + name=f"my-org.my-service.1-0-0.answers.{question_uuid}", + topic=mock_topic, + project_name=TEST_PROJECT_NAME, + ) + message_handler = OrderedMessageHandler( subscription=mock_subscription, receiving_service=receiving_service, message_handlers={"test": lambda message: None, "finish-test": lambda message: "This is the result."}, + schema={}, ) message_handler._child_sdk_version = "0.1.3" - message_handler._waiting_messages = {} + message_handler.waiting_messages = {} - # Create a mock topic and publish a mock message to it. - mock_message = {"type": "test", "message_number": 0} - MESSAGES["octue.services.world"] = [] - MESSAGES["octue.services.world"].append(MockMessage(data=json.dumps(mock_message).encode())) + # Enqueue a mock message for a mock subscription to receive. + mock_message = {"kind": "test"} + + SUBSCRIPTIONS[mock_subscription.name] = [ + MockMessage.from_primitive( + mock_message, + attributes={ + "sender_type": "CHILD", + "message_number": 0, + "question_uuid": question_uuid, + "version": "0.50.0", + }, + ) + ] message_handler._pull_and_enqueue_message(timeout=10) - self.assertEqual(message_handler._waiting_messages, {0: mock_message}) + self.assertEqual(message_handler.waiting_messages, {0: mock_message}) self.assertEqual(message_handler._earliest_message_number_received, 0) def test_timeout_error_raised_if_result_message_not_received_in_time(self): """Test that a timeout error is raised if a result message is not received in time.""" + question_uuid = "4d31bb46-66c4-4e68-831f-e51e17e651ef" + with ServicePatcher(): + mock_subscription = MockSubscription( + name=f"my-org.my-service.1-0-0.answers.{question_uuid}", + topic=mock_topic, + project_name=TEST_PROJECT_NAME, + ) + message_handler = OrderedMessageHandler( subscription=mock_subscription, receiving_service=receiving_service, @@ -373,11 +423,11 @@ def test_timeout_error_raised_if_result_message_not_received_in_time(self): ) message_handler._child_sdk_version = "0.1.3" - message_handler._waiting_messages = {} + message_handler.waiting_messages = {} message_handler._start_time = 0 - # Create a mock topic and publish a mock non-result message to it. - MESSAGES["octue.services.world"] = [] + # Create a mock subscription. + SUBSCRIPTIONS[mock_subscription.name] = [] with self.assertRaises(TimeoutError): message_handler._pull_and_enqueue_message(timeout=1e-6) diff --git a/tests/cloud/pub_sub/test_service.py b/tests/cloud/pub_sub/test_service.py index a910dd1a0..d9a96a4bd 100644 --- a/tests/cloud/pub_sub/test_service.py +++ b/tests/cloud/pub_sub/test_service.py @@ -433,7 +433,7 @@ def run_function(analysis_id, input_values, *args, **kwargs): service_id=child.id, input_values=input_values, subscribe_to_logs=True, - allow_save_diagnostics_data_on_crash=True, + save_diagnostics="SAVE_DIAGNOSTICS_ON_CRASH", ) answer = parent.wait_for_answer(subscription, service_name="my-super-service") @@ -715,15 +715,11 @@ def test_child_messages_can_be_recorded_by_parent(self): parent.wait_for_answer(subscription, service_name="my-super-service") # Check that the child's messages have been recorded by the parent. - self.assertEqual(parent.received_messages[0]["type"], "delivery_acknowledgement") - self.assertEqual(parent.received_messages[1]["type"], "log_record") - self.assertEqual(parent.received_messages[2]["type"], "log_record") - self.assertEqual(parent.received_messages[3]["type"], "log_record") - - self.assertEqual( - parent.received_messages[4], - {"type": "result", "output_values": "Hello! It worked!", "output_manifest": None, "message_number": 4}, - ) + self.assertEqual(parent.received_messages[0]["kind"], "delivery_acknowledgement") + self.assertEqual(parent.received_messages[1]["kind"], "log_record") + self.assertEqual(parent.received_messages[2]["kind"], "log_record") + self.assertEqual(parent.received_messages[3]["kind"], "log_record") + self.assertEqual(parent.received_messages[4], {"kind": "result", "output_values": "Hello! It worked!"}) def test_child_exception_message_can_be_recorded_by_parent(self): """Test that the parent can record exceptions raised by the child.""" @@ -738,8 +734,8 @@ def test_child_exception_message_can_be_recorded_by_parent(self): parent.wait_for_answer(subscription, service_name="my-super-service") # Check that the child's messages have been recorded by the parent. - self.assertEqual(parent.received_messages[0]["type"], "delivery_acknowledgement") - self.assertEqual(parent.received_messages[1]["type"], "exception") + self.assertEqual(parent.received_messages[0]["kind"], "delivery_acknowledgement") + self.assertEqual(parent.received_messages[1]["kind"], "exception") self.assertIn("Oh no.", parent.received_messages[1]["exception_message"]) def test_child_sends_heartbeat_messages_at_expected_regular_intervals(self): @@ -764,16 +760,16 @@ def run_function(*args, **kwargs): service_id=child.id, input_values={}, subscribe_to_logs=True, - allow_save_diagnostics_data_on_crash=True, + save_diagnostics="SAVE_DIAGNOSTICS_ON_CRASH", ) parent.wait_for_answer(subscription, service_name="my-super-service") - self.assertEqual(parent.received_messages[1]["type"], "heartbeat") - self.assertEqual(parent.received_messages[2]["type"], "heartbeat") + self.assertEqual(parent.received_messages[1]["kind"], "heartbeat") + self.assertEqual(parent.received_messages[2]["kind"], "heartbeat") - first_heartbeat_time = datetime.datetime.fromisoformat(parent.received_messages[1]["time"]) - second_heartbeat_time = datetime.datetime.fromisoformat(parent.received_messages[2]["time"]) + first_heartbeat_time = datetime.datetime.fromisoformat(parent.received_messages[1]["datetime"]) + second_heartbeat_time = datetime.datetime.fromisoformat(parent.received_messages[2]["datetime"]) self.assertAlmostEqual( second_heartbeat_time - first_heartbeat_time, @@ -807,7 +803,7 @@ def run_function(*args, **kwargs): service_id=child.id, input_values={}, subscribe_to_logs=True, - allow_save_diagnostics_data_on_crash=True, + save_diagnostics="SAVE_DIAGNOSTICS_ON_CRASH", ) monitor_messages = [] diff --git a/tests/cloud/pub_sub/test_subscription.py b/tests/cloud/pub_sub/test_subscription.py index e67f7406a..433f984b7 100644 --- a/tests/cloud/pub_sub/test_subscription.py +++ b/tests/cloud/pub_sub/test_subscription.py @@ -16,7 +16,7 @@ class TestSubscription(BaseTestCase): def test_repr(self): """Test that subscriptions are represented correctly.""" - self.assertEqual(repr(self.subscription), "") + self.assertEqual(repr(self.subscription), "") def test_namespace_only_in_name_once(self): """Test that the subscription's namespace only appears in its name once, even if it is repeated.""" @@ -70,7 +70,12 @@ def test_create_pull_subscription(self): project_name = os.environ["TEST_PROJECT_NAME"] topic = Topic(name="my-topic", project_name=project_name) - subscription = Subscription(name="world", topic=topic, project_name=project_name) + subscription = Subscription( + name="world", + topic=topic, + project_name=project_name, + filter='attributes.question_uuid = "abc"', + ) for allow_existing in (True, False): with self.subTest(allow_existing=allow_existing): diff --git a/tests/data/crash_diagnostics/configuration_manifest.json b/tests/data/diagnostics/configuration_manifest.json similarity index 100% rename from tests/data/crash_diagnostics/configuration_manifest.json rename to tests/data/diagnostics/configuration_manifest.json diff --git a/tests/data/crash_diagnostics/configuration_manifest_datasets/configuration_dataset/.octue b/tests/data/diagnostics/configuration_manifest_datasets/configuration_dataset/.octue similarity index 100% rename from tests/data/crash_diagnostics/configuration_manifest_datasets/configuration_dataset/.octue rename to tests/data/diagnostics/configuration_manifest_datasets/configuration_dataset/.octue diff --git a/tests/data/crash_diagnostics/configuration_manifest_datasets/configuration_dataset/my_file.txt b/tests/data/diagnostics/configuration_manifest_datasets/configuration_dataset/my_file.txt similarity index 100% rename from tests/data/crash_diagnostics/configuration_manifest_datasets/configuration_dataset/my_file.txt rename to tests/data/diagnostics/configuration_manifest_datasets/configuration_dataset/my_file.txt diff --git a/tests/data/crash_diagnostics/configuration_values.json b/tests/data/diagnostics/configuration_values.json similarity index 100% rename from tests/data/crash_diagnostics/configuration_values.json rename to tests/data/diagnostics/configuration_values.json diff --git a/tests/data/crash_diagnostics/input_manifest.json b/tests/data/diagnostics/input_manifest.json similarity index 100% rename from tests/data/crash_diagnostics/input_manifest.json rename to tests/data/diagnostics/input_manifest.json diff --git a/tests/data/crash_diagnostics/input_manifest_datasets/input_dataset/.octue b/tests/data/diagnostics/input_manifest_datasets/input_dataset/.octue similarity index 100% rename from tests/data/crash_diagnostics/input_manifest_datasets/input_dataset/.octue rename to tests/data/diagnostics/input_manifest_datasets/input_dataset/.octue diff --git a/tests/data/crash_diagnostics/input_manifest_datasets/input_dataset/my_file.txt b/tests/data/diagnostics/input_manifest_datasets/input_dataset/my_file.txt similarity index 100% rename from tests/data/crash_diagnostics/input_manifest_datasets/input_dataset/my_file.txt rename to tests/data/diagnostics/input_manifest_datasets/input_dataset/my_file.txt diff --git a/tests/data/crash_diagnostics/input_values.json b/tests/data/diagnostics/input_values.json similarity index 100% rename from tests/data/crash_diagnostics/input_values.json rename to tests/data/diagnostics/input_values.json diff --git a/tests/data/crash_diagnostics/questions.json b/tests/data/diagnostics/questions.json similarity index 51% rename from tests/data/crash_diagnostics/questions.json rename to tests/data/diagnostics/questions.json index a7f1d9b90..212ae9b36 100644 --- a/tests/data/crash_diagnostics/questions.json +++ b/tests/data/diagnostics/questions.json @@ -3,21 +3,20 @@ "id": "octue/my-child:2.3.0", "messages": [ { - "type": "log_record", + "kind": "log_record", "log_record": { "msg": "Starting analysis." } }, { - "type": "log_record", + "kind": "log_record", "log_record": { "msg": "Finishing analysis." } }, { - "type": "monitor_message", - "data": "{\"sample\": \"data\"}" + "kind": "monitor_message", + "data": { "sample": "data" } }, { - "type": "result", - "output_values": [1, 2, 3, 4, 5], - "output_manifest": null + "kind": "result", + "output_values": [1, 2, 3, 4, 5] } ] } diff --git a/tests/mocks.py b/tests/mocks.py index dbf3d2e7e..0ed686df9 100644 --- a/tests/mocks.py +++ b/tests/mocks.py @@ -1,4 +1,5 @@ import io +import os class MockOpen: @@ -18,7 +19,13 @@ def __init__(self, path, **kwargs): self.path = path def __enter__(self): - return io.StringIO(self.path_to_contents_mapping[self.path]) + try: + return io.StringIO(self.path_to_contents_mapping[self.path]) + + # Allow absolute paths that end in the (in this case, relative) paths given in `path_to_contents_mapping`. + except KeyError: + path = os.path.split(self.path)[-1] + return io.StringIO(self.path_to_contents_mapping[path]) def __exit__(self, exc_type, exc_val, exc_tb): pass diff --git a/tests/resources/test_child.py b/tests/resources/test_child.py index 70c8878ad..1e9c98234 100644 --- a/tests/resources/test_child.py +++ b/tests/resources/test_child.py @@ -8,7 +8,7 @@ from google.auth.exceptions import DefaultCredentialsError -from octue.cloud.emulators._pub_sub import MockAnalysis, MockService, MockSubscriber, MockSubscription +from octue.cloud.emulators._pub_sub import MockAnalysis, MockService, MockSubscriber, MockSubscription, MockTopic from octue.cloud.emulators.child import ServicePatcher from octue.resources.child import Child from octue.resources.service_backends import GCPPubSubBackend @@ -55,7 +55,7 @@ def test_instantiating_child_without_credentials(self): def test_child_cannot_be_asked_question_without_credentials(self): """Test that a child cannot be asked a question without Google Cloud credentials being available.""" with patch.dict(os.environ, clear=True): - with patch("octue.cloud.pub_sub.service.Topic"): + with patch("octue.cloud.pub_sub.service.Topic", new=MockTopic): with patch("octue.cloud.pub_sub.service.Subscription", new=MockSubscription): with patch("octue.resources.child.BACKEND_TO_SERVICE_MAPPING", {"GCPPubSubBackend": MockService}): with patch("google.cloud.pubsub_v1.SubscriberClient", new=MockSubscriber): diff --git a/tests/templates/test_template_apps.py b/tests/templates/test_template_apps.py index 94219f22c..df5809710 100644 --- a/tests/templates/test_template_apps.py +++ b/tests/templates/test_template_apps.py @@ -148,15 +148,15 @@ def test_child_services_template_using_emulated_children(self): id=f"template-child-services/wind-speed-service:{MOCK_SERVICE_REVISION_TAG}", internal_service_name=runner.service_id, messages=[ - {"type": "log_record", "log_record": {"msg": "This is an emulated child log message."}}, - {"type": "result", "output_values": [10], "output_manifest": None}, + {"kind": "log_record", "log_record": {"msg": "This is an emulated child log message."}}, + {"kind": "result", "output_values": [10], "output_manifest": None}, ], ), ChildEmulator( id=f"template-child-services/elevation-service:{MOCK_SERVICE_REVISION_TAG}", internal_service_name=runner.service_id, messages=[ - {"type": "result", "output_values": [300], "output_manifest": None}, + {"kind": "result", "output_values": [300], "output_manifest": None}, ], ), ] diff --git a/tests/test_cli.py b/tests/test_cli.py index 5b039c9e2..a4e553b81 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -2,11 +2,9 @@ import logging import os import tempfile -import unittest.mock from unittest import mock from unittest.mock import patch -import yaml from click.testing import CliRunner from octue.cli import octue_cli @@ -18,7 +16,6 @@ from octue.utils.patches import MultiPatcher from tests import MOCK_SERVICE_REVISION_TAG, TEST_BUCKET_NAME, TESTS_DIR from tests.base import BaseTestCase -from tests.mocks import MockOpen TWINE_FILE_PATH = os.path.join(TESTS_DIR, "data", "twines", "valid_schema_twine.json") @@ -87,28 +84,33 @@ def test_run_with_output_values_file(self): def test_run_with_output_manifest(self): """Test that the `run` CLI command runs the given service and stores the output manifest in a file.""" + with tempfile.NamedTemporaryFile("w", delete=False, suffix=".json") as temporary_twine: + temporary_twine.write( + json.dumps({"input_values_schema": {}, "output_manifest": {"datasets": {}}, "output_values_schema": {}}) + ) + mock_configurations = ( ServiceConfiguration( name="test-app", namespace="testing", app_source_path=os.path.join(TESTS_DIR, "test_app_modules", "app_module_with_output_manifest"), - twine_path={"input_values_schema": {}, "output_manifest": {"datasets": {}}, "output_values_schema": {}}, + twine_path=temporary_twine.name, ), AppConfiguration(), ) - with tempfile.NamedTemporaryFile(delete=False) as temporary_file: + with tempfile.NamedTemporaryFile(delete=False) as temporary_manifest: with mock.patch("octue.cli.load_service_and_app_configuration", return_value=mock_configurations): result = CliRunner().invoke( octue_cli, [ "run", f'--input-dir={os.path.join(TESTS_DIR, "data", "data_dir_with_no_manifests", "input")}', - f"--output-manifest-file={temporary_file.name}", + f"--output-manifest-file={temporary_manifest.name}", ], ) - with open(temporary_file.name) as f: + with open(temporary_manifest.name) as f: self.assertIn("datasets", json.load(f)) self.assertIn(json.dumps({"width": 3}), result.output) @@ -168,41 +170,29 @@ def setUpClass(cls): "template-fractal", ) - class MockOpenForConfigurationFiles(MockOpen): - path_to_contents_mapping = { - "octue.yaml": yaml.dump( - { - "services": [ - { - "name": "test-service", - "namespace": "testing", - "app_source_path": cls.python_fractal_service_path, - "twine_path": os.path.join(cls.python_fractal_service_path, "twine.json"), - "app_configuration_path": "app_configuration.json", - } - ] - } - ), - "app_configuration.json": json.dumps( - { - "configuration_values": { - "width": 600, - "height": 600, - "n_iterations": 64, - "color_scale": "YlGnBu", - "type": "png", - "x_range": [-1.5, 0.6], - "y_range": [-1.26, 1.26], - "backend": { - "name": "GCPPubSubBackend", - "project_name": "octue-sdk-python", - }, - } - } - ), - } + cls.service_configuration = ServiceConfiguration( + name="test-service", + namespace="testing", + app_source_path=cls.python_fractal_service_path, + twine_path=os.path.join(cls.python_fractal_service_path, "twine.json"), + app_configuration_path="app_configuration.json", + ) - cls.MockOpenForConfigurationFiles = MockOpenForConfigurationFiles + cls.app_configuration = AppConfiguration( + configuration_values={ + "width": 600, + "height": 600, + "n_iterations": 64, + "color_scale": "YlGnBu", + "type": "png", + "x_range": [-1.5, 0.6], + "y_range": [-1.26, 1.26], + "backend": { + "name": "GCPPubSubBackend", + "project_name": "octue-sdk-python", + }, + }, + ) def test_start_command(self): """Test that the start command works without error and uses the revision tag supplied in the @@ -211,8 +201,8 @@ def test_start_command(self): with MultiPatcher( patches=[ mock.patch( - "octue.configuration.open", - unittest.mock.mock_open(mock=self.MockOpenForConfigurationFiles), + "octue.cli.load_service_and_app_configuration", + return_value=(self.service_configuration, self.app_configuration), ), mock.patch("octue.cli.Service", MockService), patch.dict(os.environ, {"OCTUE_SERVICE_REVISION_TAG": "goodbye"}), @@ -222,7 +212,7 @@ def test_start_command(self): with self.assertLogs(level=logging.INFO) as logging_context: result = CliRunner().invoke(octue_cli, ["start", "--timeout=0"]) - self.assertEqual(logging_context.records[3].message, "Starting .") + self.assertEqual(logging_context.records[1].message, "Starting .") self.assertIsNone(result.exception) self.assertEqual(result.exit_code, 0) @@ -233,8 +223,8 @@ def test_start_command_with_revision_tag_override_when_revision_tag_environment_ with MultiPatcher( patches=[ mock.patch( - "octue.configuration.open", - unittest.mock.mock_open(mock=self.MockOpenForConfigurationFiles), + "octue.cli.load_service_and_app_configuration", + return_value=(self.service_configuration, self.app_configuration), ), mock.patch("octue.cli.Service", MockService), patch.dict(os.environ, {"OCTUE_SERVICE_REVISION_TAG": "goodbye"}), @@ -245,47 +235,47 @@ def test_start_command_with_revision_tag_override_when_revision_tag_environment_ result = CliRunner().invoke(octue_cli, ["start", "--revision-tag=hello", "--timeout=0"]) self.assertEqual( - logging_context.records[3].message, + logging_context.records[1].message, "The `OCTUE_SERVICE_REVISION_TAG` environment variable 'goodbye' has been overridden by the " "`--revision-tag` CLI option 'hello'.", ) - self.assertEqual(logging_context.records[4].message, "Starting .") + self.assertEqual(logging_context.records[2].message, "Starting .") self.assertIsNone(result.exception) self.assertEqual(result.exit_code, 0) -class TestGetCrashDiagnosticsCommand(BaseTestCase): - CRASH_DIAGNOSTICS_CLOUD_PATH = storage.path.generate_gs_path(TEST_BUCKET_NAME, "crash_diagnostics") +class TestGetDiagnosticsCommand(BaseTestCase): + DIAGNOSTICS_CLOUD_PATH = storage.path.generate_gs_path(TEST_BUCKET_NAME, "diagnostics") ANALYSIS_ID = "dc1f09ca-7037-484f-a394-8bd04866f924" @classmethod def setUpClass(cls): - """Upload the test crash diagnostics data to the cloud storage emulator so the `octue get-crash-diagnostics` - CLI command can be tested. + """Upload the test diagnostics data to the cloud storage emulator so the `octue get-diagnostics` CLI command can + be tested. :return None: """ super().setUpClass() - crash_diagnostics = Dataset( - path=os.path.join(TESTS_DIR, "data", "crash_diagnostics"), + diagnostics = Dataset( + path=os.path.join(TESTS_DIR, "data", "diagnostics"), recursive=True, include_octue_metadata_files=True, ) - crash_diagnostics.upload(storage.path.join(cls.CRASH_DIAGNOSTICS_CLOUD_PATH, cls.ANALYSIS_ID)) + diagnostics.upload(storage.path.join(cls.DIAGNOSTICS_CLOUD_PATH, cls.ANALYSIS_ID)) - def test_get_crash_diagnostics(self): + def test_get_diagnostics(self): """Test that only the values files, manifests, and questions file are downloaded when using the - `get-crash-diagnostics` CLI command. + `get-diagnostics` CLI command. """ with tempfile.TemporaryDirectory() as temporary_directory: result = CliRunner().invoke( octue_cli, [ - "get-crash-diagnostics", - storage.path.join(self.CRASH_DIAGNOSTICS_CLOUD_PATH, self.ANALYSIS_ID), + "get-diagnostics", + storage.path.join(self.DIAGNOSTICS_CLOUD_PATH, self.ANALYSIS_ID), "--local-path", temporary_directory, ], @@ -321,23 +311,23 @@ def test_get_crash_diagnostics(self): self.assertEqual( questions[0]["messages"], [ - {"type": "log_record", "log_record": {"msg": "Starting analysis."}}, - {"type": "log_record", "log_record": {"msg": "Finishing analysis."}}, - {"type": "monitor_message", "data": '{"sample": "data"}'}, - {"type": "result", "output_values": [1, 2, 3, 4, 5], "output_manifest": None}, + {"kind": "log_record", "log_record": {"msg": "Starting analysis."}}, + {"kind": "log_record", "log_record": {"msg": "Finishing analysis."}}, + {"kind": "monitor_message", "data": {"sample": "data"}}, + {"kind": "result", "output_values": [1, 2, 3, 4, 5]}, ], ) - def test_get_crash_diagnostics_with_datasets(self): + def test_get_diagnostics_with_datasets(self): """Test that datasets are downloaded as well as the values files, manifests, and questions file when the - `get-crash-diagnostics` CLI command is run with the `--download-datasets` flag. + `get-diagnostics` CLI command is run with the `--download-datasets` flag. """ with tempfile.TemporaryDirectory() as temporary_directory: result = CliRunner().invoke( octue_cli, [ - "get-crash-diagnostics", - storage.path.join(self.CRASH_DIAGNOSTICS_CLOUD_PATH, self.ANALYSIS_ID), + "get-diagnostics", + storage.path.join(self.DIAGNOSTICS_CLOUD_PATH, self.ANALYSIS_ID), "--local-path", temporary_directory, "--download-datasets", @@ -388,10 +378,10 @@ def test_get_crash_diagnostics_with_datasets(self): self.assertEqual( questions[0]["messages"], [ - {"type": "log_record", "log_record": {"msg": "Starting analysis."}}, - {"type": "log_record", "log_record": {"msg": "Finishing analysis."}}, - {"type": "monitor_message", "data": '{"sample": "data"}'}, - {"type": "result", "output_values": [1, 2, 3, 4, 5], "output_manifest": None}, + {"kind": "log_record", "log_record": {"msg": "Starting analysis."}}, + {"kind": "log_record", "log_record": {"msg": "Finishing analysis."}}, + {"kind": "monitor_message", "data": {"sample": "data"}}, + {"kind": "result", "output_values": [1, 2, 3, 4, 5]}, ], ) diff --git a/tests/test_compatibility.py b/tests/test_compatibility.py index 565daa652..a24a5328e 100644 --- a/tests/test_compatibility.py +++ b/tests/test_compatibility.py @@ -14,7 +14,7 @@ def test_compatible(self): def test_not_compatible(self): """Test that compatibility is correctly determined as false for two known incompatible versions.""" - self.assertFalse(is_compatible(parent_sdk_version="0.16.0", child_sdk_version="0.35.0")) + self.assertFalse(is_compatible(parent_sdk_version="0.50.0", child_sdk_version="0.51.0")) def test_warning_issued_if_no_data_on_parent_version(self): """Test that two versions are marked as compatible but a warning is raised if no data is available on the parent @@ -64,7 +64,7 @@ class TestWarnIfIncompatible(BaseTestCase): def test_warn_if_incompatible_with_missing_child_version_information(self): """Test that a warning is raised when calling `warn_if_incompatible` with missing child version information.""" with self.assertLogs(level=logging.WARNING) as logging_context: - warn_if_incompatible(parent_sdk_version="0.16.0", child_sdk_version=None) + warn_if_incompatible(parent_sdk_version="0.51.0", child_sdk_version=None) self.assertIn( "The child couldn't be checked for compatibility with this service because its Octue SDK version wasn't " @@ -86,10 +86,10 @@ def test_warn_if_incompatible_with_missing_parent_version_information(self): def test_warn_if_incompatible_with_incompatible_versions(self): """Test that a warning is raised if incompatible versions are detected.""" with self.assertLogs(level=logging.WARNING) as logging_context: - warn_if_incompatible(parent_sdk_version="0.16.0", child_sdk_version="0.35.0") + warn_if_incompatible(parent_sdk_version="0.50.0", child_sdk_version="0.51.0") self.assertIn( - "The parent's Octue SDK version 0.16.0 is incompatible with the child's version 0.35.0. Please update " + "The parent's Octue SDK version 0.50.0 is incompatible with the child's version 0.51.0. Please update " "either or both to the latest version.", logging_context.output[0], ) diff --git a/tests/test_runner.py b/tests/test_runner.py index 19c8c58b7..ddb7e040d 100644 --- a/tests/test_runner.py +++ b/tests/test_runner.py @@ -301,7 +301,7 @@ def app(analysis): def test_child_messages_saved_even_if_child_ask_method_raises_error(self): """Test that messages from the child are still saved even if an error is raised within the `Child.ask` method.""" - crash_diagnostics_cloud_path = storage.path.generate_gs_path(TEST_BUCKET_NAME, "crash_diagnostics") + diagnostics_cloud_path = storage.path.generate_gs_path(TEST_BUCKET_NAME, "diagnostics") def app(analysis): analysis.children["my-child"].ask(input_values=[1, 2, 3, 4]) @@ -334,7 +334,7 @@ def app(analysis): }, }, ], - crash_diagnostics_cloud_path=crash_diagnostics_cloud_path, + diagnostics_cloud_path=diagnostics_cloud_path, service_id="octue/my-app:2.5.8", ) @@ -342,16 +342,16 @@ def app(analysis): ChildEmulator( id=f"octue/the-child:{MOCK_SERVICE_REVISION_TAG}", messages=[ - {"type": "result", "output_values": [1, 4, 9, 16], "output_manifest": None}, + {"kind": "result", "output_values": [1, 4, 9, 16], "output_manifest": None}, ], ), ChildEmulator( id=f"octue/yet-another-child:{MOCK_SERVICE_REVISION_TAG}", messages=[ - {"type": "log_record", "log_record": {"msg": "Starting analysis."}}, - {"type": "log_record", "log_record": {"msg": "Finishing analysis."}}, + {"kind": "log_record", "log_record": {"msg": "Starting analysis."}}, + {"kind": "log_record", "log_record": {"msg": "Finishing analysis."}}, { - "type": "exception", + "kind": "exception", "exception_type": "ValueError", "exception_message": "Deliberately raised for testing.", }, @@ -367,16 +367,16 @@ def app(analysis): runner.run(analysis_id=analysis_id, input_values={"hello": "world"}) storage_client = GoogleCloudStorageClient() - question_crash_diagnostics_path = storage.path.join(crash_diagnostics_cloud_path, analysis_id) + question_diagnostics_path = storage.path.join(diagnostics_cloud_path, analysis_id) # Check the input values. self.assertEqual( - storage_client.download_as_string(storage.path.join(question_crash_diagnostics_path, "input_values.json")), + storage_client.download_as_string(storage.path.join(question_diagnostics_path, "input_values.json")), json.dumps({"hello": "world"}), ) # Check that messages from the children have been recorded. - with Datafile(storage.path.join(question_crash_diagnostics_path, "questions.json")) as (_, f): + with Datafile(storage.path.join(question_diagnostics_path, "questions.json")) as (_, f): questions = json.load(f) # First question. @@ -390,7 +390,7 @@ def app(analysis): self.assertEqual(questions[1]["id"], f"octue/yet-another-child:{MOCK_SERVICE_REVISION_TAG}") self.assertEqual(questions[1]["input_values"], "miaow") - self.assertEqual(questions[1]["messages"][1]["type"], "exception") + self.assertEqual(questions[1]["messages"][1]["kind"], "exception") self.assertEqual(questions[1]["messages"][1]["exception_type"], "ValueError") self.assertEqual( questions[1]["messages"][1]["exception_message"], @@ -702,7 +702,7 @@ def _make_serialised_input_manifest_with_correct_dataset_file_tags(self, dataset return input_manifest -class TestRunnerCrashDiagnostics(BaseTestCase): +class TestRunnerDiagnostics(BaseTestCase): def _generate_manifests(self, serialise=False): """Generate configuration and input manifests containing dummy data. @@ -729,14 +729,14 @@ def _generate_manifests(self, serialise=False): return manifests["configuration"], manifests["input"] - def test_crash_diagnostics_with_unserialised_and_serialised_data(self): - """Test that unserialised and serialised analysis configurations and inputs are saved to the crash diagnostics + def test_diagnostics_with_unserialised_and_serialised_data(self): + """Test that unserialised and serialised analysis configurations and inputs are saved to the diagnostics cloud path if the app crashes when the runner has been allowed to save them. """ - crash_diagnostics_cloud_path = storage.path.generate_gs_path(TEST_BUCKET_NAME, "crash_diagnostics") + diagnostics_cloud_path = storage.path.generate_gs_path(TEST_BUCKET_NAME, "diagnostics") def app(analysis): - # Mutate the configuration and inputs so we can test the originals are preserved for crash diagnostics. + # Mutate the configuration and inputs so we can test the originals are preserved for diagnostics. analysis.configuration_values = None analysis.configuration_manifest = None analysis.input_values = None @@ -782,7 +782,7 @@ def app(analysis): }, }, ], - crash_diagnostics_cloud_path=crash_diagnostics_cloud_path, + diagnostics_cloud_path=diagnostics_cloud_path, service_id="octue/my-app:2.5.7", ) @@ -790,15 +790,15 @@ def app(analysis): ChildEmulator( id=f"octue/a-child:{MOCK_SERVICE_REVISION_TAG}", messages=[ - {"type": "result", "output_values": [1, 4, 9, 16], "output_manifest": None}, + {"kind": "result", "output_values": [1, 4, 9, 16], "output_manifest": None}, ], ), ChildEmulator( id=f"octue/another-child:{MOCK_SERVICE_REVISION_TAG}", messages=[ - {"type": "log_record", "log_record": {"msg": "Starting analysis."}}, - {"type": "log_record", "log_record": {"msg": "Finishing analysis."}}, - {"type": "result", "output_values": "woof", "output_manifest": None}, + {"kind": "log_record", "log_record": {"msg": "Starting analysis."}}, + {"kind": "log_record", "log_record": {"msg": "Finishing analysis."}}, + {"kind": "result", "output_values": "woof", "output_manifest": None}, ], ), ] @@ -812,11 +812,11 @@ def app(analysis): analysis_id=analysis_id, input_values=values, input_manifest=input_manifest, - allow_save_diagnostics_data_on_crash=True, + save_diagnostics="SAVE_DIAGNOSTICS_ON_CRASH", ) storage_client = GoogleCloudStorageClient() - question_crash_diagnostics_path = storage.path.join(crash_diagnostics_cloud_path, analysis_id) + question_diagnostics_path = storage.path.join(diagnostics_cloud_path, analysis_id) if isinstance(values, str): expected_values = values @@ -826,7 +826,7 @@ def app(analysis): # Check the configuration values. self.assertEqual( storage_client.download_as_string( - storage.path.join(question_crash_diagnostics_path, "configuration_values.json") + storage.path.join(question_diagnostics_path, "configuration_values.json") ), expected_values, ) @@ -834,14 +834,14 @@ def app(analysis): # Check the input values. self.assertEqual( storage_client.download_as_string( - storage.path.join(question_crash_diagnostics_path, "input_values.json") + storage.path.join(question_diagnostics_path, "input_values.json") ), expected_values, ) # Check the configuration manifest and dataset. configuration_manifest = Manifest.from_cloud( - storage.path.join(question_crash_diagnostics_path, "configuration_manifest.json") + storage.path.join(question_diagnostics_path, "configuration_manifest.json") ) configuration_dataset = configuration_manifest.datasets["met_mast_data"] self.assertEqual(configuration_dataset.labels, {"some-configuration-metadata"}) @@ -852,18 +852,16 @@ def app(analysis): with configuration_file.open() as f: self.assertEqual(f.read(), "configuration manifest data") - # Check the configuration dataset's path is in the crash diagnostics cloud directory. + # Check the configuration dataset's path is in the diagnostics cloud directory. self.assertEqual( configuration_dataset.path, - storage.path.join( - question_crash_diagnostics_path, "configuration_manifest_datasets", "met_mast_data" - ), + storage.path.join(question_diagnostics_path, "configuration_manifest_datasets", "met_mast_data"), ) self.assertEqual( configuration_file.cloud_path, storage.path.join( - question_crash_diagnostics_path, + question_diagnostics_path, "configuration_manifest_datasets", "met_mast_data", "my_file.txt", @@ -872,7 +870,7 @@ def app(analysis): # Check the input manifest and dataset. input_manifest = Manifest.from_cloud( - storage.path.join(question_crash_diagnostics_path, "input_manifest.json") + storage.path.join(question_diagnostics_path, "input_manifest.json") ) input_dataset = input_manifest.datasets["met_mast_data"] self.assertEqual(input_dataset.labels, {"some-input-metadata"}) @@ -883,21 +881,21 @@ def app(analysis): with input_file.open() as f: self.assertEqual(f.read(), "input manifest data") - # Check the input dataset's path is in the crash diagnostics cloud directory. + # Check the input dataset's path is in the diagnostics cloud directory. self.assertEqual( input_dataset.path, - storage.path.join(question_crash_diagnostics_path, "input_manifest_datasets", "met_mast_data"), + storage.path.join(question_diagnostics_path, "input_manifest_datasets", "met_mast_data"), ) self.assertEqual( input_file.cloud_path, storage.path.join( - question_crash_diagnostics_path, "input_manifest_datasets", "met_mast_data", "my_file.txt" + question_diagnostics_path, "input_manifest_datasets", "met_mast_data", "my_file.txt" ), ) # Check that messages from the children have been recorded. - with Datafile(storage.path.join(question_crash_diagnostics_path, "questions.json")) as (_, f): + with Datafile(storage.path.join(question_diagnostics_path, "questions.json")) as (_, f): questions = json.load(f) # First question. diff --git a/tests/utils/test_testing.py b/tests/utils/test_testing.py index 7e5393801..26030c20f 100644 --- a/tests/utils/test_testing.py +++ b/tests/utils/test_testing.py @@ -1,23 +1,23 @@ import os from unittest import TestCase -from octue.utils.testing import load_test_fixture_from_crash_diagnostics +from octue.utils.testing import load_test_fixture_from_diagnostics from tests import MOCK_SERVICE_REVISION_TAG, TESTS_DIR -TEST_CRASH_DIAGNOSTICS_PATH = os.path.join(TESTS_DIR, "data", "crash_diagnostics") +TEST_DIAGNOSTICS_PATH = os.path.join(TESTS_DIR, "data", "diagnostics") class TestTesting(TestCase): - def test_load_test_fixture_from_downloaded_crash_diagnostics(self): - """Test that loading a test fixture from downloaded crash diagnostics works.""" + def test_load_test_fixture_from_downloaded_diagnostics(self): + """Test that loading a test fixture from downloaded diagnostics works.""" ( configuration_values, configuration_manifest, input_values, input_manifest, child_emulators, - ) = load_test_fixture_from_crash_diagnostics(path=TEST_CRASH_DIAGNOSTICS_PATH) + ) = load_test_fixture_from_diagnostics(path=TEST_DIAGNOSTICS_PATH) self.assertEqual(configuration_values, {"getting": "ready"}) self.assertIn("configuration_dataset", configuration_manifest.datasets) @@ -30,7 +30,7 @@ def test_load_test_fixture_from_downloaded_crash_diagnostics(self): self.assertEqual( child_emulators[0].messages[2:], [ - {"type": "monitor_message", "data": '{"sample": "data"}'}, - {"type": "result", "output_values": [1, 2, 3, 4, 5], "output_manifest": None}, + {"kind": "monitor_message", "data": {"sample": "data"}}, + {"kind": "result", "output_values": [1, 2, 3, 4, 5]}, ], )