diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..fdeef643 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,16 @@ +.git +app.log +workspace +.pytest_cache +tests +*.egg-info +dist +.mypy_cache +.ruff_cache +.github +.gitignore +.ipynb_checkpoints +.DS_Store +.devcontainer +.vscode +scripts diff --git a/.env.azure-example b/.env.azure-example deleted file mode 100644 index 93dff95e..00000000 --- a/.env.azure-example +++ /dev/null @@ -1,10 +0,0 @@ -OPENAI_API_KEY=XXXX -OPENAI_API_TYPE=azure -OPENAI_API_BASE=https://your-resource-name.openai.azure.com -OPENAI_API_VERSION=2023-03-15-preview -# OPENAI_EXTRA_HEADERS={"key": "value"} -AZURE_OPENAI_DEPLOYMENTS=[{"displayName": "GPT-3.5", "name": "your-gpt-3.5-deployment"}, {"displayName": "GPT-4", "name": "your-gpt-4-deployment"}] -# OPENAI_API_LOGLEVEL=debug -API_PORT=5010 -WEB_PORT=8080 -SNAKEMQ_PORT=8765 diff --git a/.env.example b/.env.example index 880cf649..e99a3c9f 100644 --- a/.env.example +++ b/.env.example @@ -1,10 +1,23 @@ +AZURE_API_KEY=XXXX +AZURE_API_BASE=https://your-resource-name.openai.azure.com +AZURE_API_VERSION=2023-09-01-preview + OPENAI_API_KEY=sk-XXXX -OPENAI_API_TYPE=open_ai -OPENAI_API_BASE=https://api.openai.com/v1 -OPENAI_API_VERSION=2023-03-15-preview -# OPENAI_EXTRA_HEADERS={"key": "value"} -OPENAI_MODELS=[{"displayName": "GPT-3.5", "name": "gpt-3.5-turbo"}, {"displayName": "GPT-4", "name": "gpt-4"}] -# OPENAI_API_LOGLEVEL=debug + +BEDROCK_GATEWAY_API_KEY=YYYY +BEDROCK_GATEWAY_API_BASE=https://your-gateway-url.com + +AVAILABLE_MODELS=[{"displayName": "GPT-3.5 16k", "name": "azure/gpt-35-turbo-16k"}, {"displayName": "GPT-3.5 0613", "name": "azure/gpt-35-turbo-0613"}, {"displayName": "Claude v1", "name": "bedrock_gateway/anthropic.claude-instant-v1"}, {"displayName": "Claude v2", "name": "bedrock_gateway/anthropic.claude-v2"}] + API_PORT=5010 WEB_PORT=8080 -SNAKEMQ_PORT=8765 + +SESSION_ENCRYPTION_KEY="" + +DEBUG=1 +NO_INTERNET_AVAILABLE=0 +OPENAI_API_LOGLEVEL=debug +FOUNDRY_DATA_FOLDER=/Global/Foundry Training and Resources/Example Data/Aviation Ontology + +KERNEL_MANAGER_WATCHDOG_INTERVAL_S=60 +KERNEL_MANAGER_TIMEOUT_S=3600 diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 257fe880..326b82ce 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -34,7 +34,7 @@ To run the backend: gptcode ``` -To run the frontend in dev mode such that frontend code changes automatically update, set +To run the frontend in dev mode such that frontend code changes automatically update, set the following environment variable such that the frontend knows where to find the backend API server. @@ -48,7 +48,7 @@ npm run dev The HMR/auto reloading version of the frontend can now be found at http://localhost:5173 (default Vite port) -Note, the frontend served at `http://localhost:8080` is stale comes from the static bundled files that can +Note, the frontend served at `http://localhost:8080` is stale comes from the static bundled files that can be generated by running `make compile_frontend`. With this setup, code changes to the Flask backend still require restarting `gptcode` (backend). @@ -78,7 +78,7 @@ We welcome ideas for improvements and new features. To suggest an enhancement, o ### Code Style -gpt-code-ui uses [Black](https://black.readthedocs.io/en/stable/the_black_code_style/index.html) as its code style guide. Please ensure that your code follows these guidelines. +gpt-code-ui uses [Black](https://black.readthedocs.io/en/stable/the_black_code_style/index.html) as its code style guide. Please ensure that your code follows these guidelines. ### Commit Messages @@ -91,4 +91,3 @@ Write clear and concise commit messages that briefly describe the changes made i - [Black](https://black.readthedocs.io/en/stable/the_black_code_style/index.html) Thank you once again for your interest in contributing to gpt-code-ui. We look forward to collaborating with you and creating an even better project together! - diff --git a/.github/ISSUE_TEMPLATE/bug-report.yaml b/.github/ISSUE_TEMPLATE/bug-report.yaml index 2c516af9..6f17d9c1 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.yaml +++ b/.github/ISSUE_TEMPLATE/bug-report.yaml @@ -52,14 +52,14 @@ body: 4. Observe the error. validations: required: true - + - type: textarea id: possible-solution attributes: label: Possible solution description: | - Not obligatory, but please suggest a fix or reason for the bug, if you have an idea. - + Not obligatory, but please suggest a fix or reason for the bug, if you have an idea. + - type: checkboxes id: operating-systems @@ -81,7 +81,7 @@ body: placeholder: Typescript vX.Y / Python v3.xx validations: required: true - + - type: input id: gpt-code-ui-version attributes: @@ -105,4 +105,3 @@ body: required: true - label: 'I have provided enough information for the maintainers to reproduce and diagnose the issue.' required: true - diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 0aaf413e..815ac5da 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -2,4 +2,4 @@ blank_issues_enabled: false contact_links: - name: Ask a question url: https://github.com/ricklamers/gpt-code-ui/discussions/categories/q-a - about: Ask questions and discuss with other community members \ No newline at end of file + about: Ask questions and discuss with other community members diff --git a/.github/ISSUE_TEMPLATE/feature-request.yaml b/.github/ISSUE_TEMPLATE/feature-request.yaml index ea20e6f5..36b807a7 100644 --- a/.github/ISSUE_TEMPLATE/feature-request.yaml +++ b/.github/ISSUE_TEMPLATE/feature-request.yaml @@ -48,7 +48,7 @@ body: label: "📝 Additional Context" description: "Add any other context or screenshots about the feature request here." placeholder: "..." - + - type: checkboxes id: acknowledgements attributes: @@ -60,4 +60,4 @@ body: - label: 'I have searched the existing issues to make sure this feature has not been requested yet.' required: true - label: 'I have provided enough information for the maintainers to understand and evaluate this request.' - required: true \ No newline at end of file + required: true diff --git a/.github/PULL_REQUEST_TEMPLATE/pull_request_template_simple.md b/.github/PULL_REQUEST_TEMPLATE/pull_request_template_simple.md index d2da9294..2f1fe20b 100644 --- a/.github/PULL_REQUEST_TEMPLATE/pull_request_template_simple.md +++ b/.github/PULL_REQUEST_TEMPLATE/pull_request_template_simple.md @@ -19,4 +19,4 @@ ## Types of changes - \ No newline at end of file + diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml new file mode 100644 index 00000000..f0841243 --- /dev/null +++ b/.github/workflows/docker-image.yml @@ -0,0 +1,18 @@ +name: Docker Image CI + +on: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + +jobs: + + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + - name: Build the Docker image + run: docker build . --file Dockerfile --tag code-impact:$(date +%s) diff --git a/.gitignore b/.gitignore index a1a5b8a0..1154403d 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ # Program related process_pids/ +kernel.* kernel_connection_file.json # Python stuff @@ -19,4 +20,7 @@ __pycache__/ *.log dist/ -build/ \ No newline at end of file +build/ +.app_service_config.json +.DS_Store +.ipynb_checkpoints diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 00000000..f30a9205 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,45 @@ +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.5.0 + hooks: + - id: check-merge-conflict + - id: debug-statements + - id: mixed-line-ending + - id: check-case-conflict + - id: trailing-whitespace + - id: end-of-file-fixer + - id: check-executables-have-shebangs + - id: check-shebang-scripts-are-executable + # - id: check-yaml + - repo: https://github.com/astral-sh/ruff-pre-commit + # Ruff version. + rev: v0.1.11 + hooks: + # Run the linter. + - id: ruff + args: + - --fix + - --exit-non-zero-on-fix + # Run the formatter. + - id: ruff-format + - repo: https://github.com/compilerla/conventional-pre-commit + rev: v3.1.0 + hooks: + - id: conventional-pre-commit + stages: [commit-msg] + args: [] + # TODO enable after fixing existing issues + - repo: https://github.com/pre-commit/mirrors-mypy + rev: "v1.8.0" + hooks: + - id: mypy + additional_dependencies: [types-requests==2.31.0.20240106] + args: [--implicit-optional] + - repo: local + hooks: + - id: eslint + name: eslint_frontend + entry: ./frontend/node_modules/.bin/eslint --fix + files: ^frontend/.*\.[jt]sx?$ # *.js, *.jsx, *.ts and *.tsx + types: [file] + language: system diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..aff776d4 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,75 @@ +FROM node:16.16.0-alpine AS uibuild +RUN apk add --no-cache make rsync +RUN mkdir frontendbuild +WORKDIR /frontendbuild +COPY Makefile ./ +COPY frontend/ ./frontend +COPY pyproject.toml ./ +COPY gpt_code_ui/webapp/static ./gpt_code_ui/webapp/static +RUN ls -al . +RUN make compile_frontend + + +FROM python:3.10-slim as backendbuild +# runtime binary dependencies +RUN set -eux; \ + apt-get update; \ + apt-get install -y --no-install-recommends \ + libxrender1 \ + libxext6 \ + curl \ + ; \ + rm -rf /var/lib/apt/lists/* + +ENV PYTHONFAULTHANDLER=1 \ + PYTHONUNBUFFERED=1 \ + PYTHONHASHSEED=random \ + PIP_NO_CACHE_DIR=off \ + PIP_DISABLE_PIP_VERSION_CHECK=on \ + PIP_DEFAULT_TIMEOUT=100 \ + POETRY_NO_INTERACTION=1 \ + POETRY_VIRTUALENVS_CREATE=0 \ + POETRY_CACHE_DIR='/var/cache/pypoetry' \ + POETRY_HOME='/usr/local' \ + POETRY_VERSION=1.7.1 + +RUN curl -sSL https://install.python-poetry.org | python3 - + +RUN mkdir backendbuild +WORKDIR /backendbuild + +# first install only dependencies +COPY poetry.lock pyproject.toml ./ +RUN touch README.md +RUN poetry install --without dev --without devtools --no-root --no-ansi && rm -rf $POETRY_CACHE_DIR + + +# install actual project +COPY run_with_app_service_config.py ./ +COPY gpt_code_ui/ ./gpt_code_ui +RUN poetry install --without dev --without devtools --no-ansi && rm -rf $POETRY_CACHE_DIR + +# Inject frontend into backend resources to be served from there +COPY --from=uibuild /frontendbuild/frontend/dist/ ./gpt_code_ui/webapp/static + +RUN mkdir workspace +RUN chmod 0777 workspace +RUN touch app.log +RUN chmod 0777 app.log + +RUN ls -al . +RUN ls -al ./gpt_code_ui +RUN which python + +EXPOSE 8080 + +# restrict access to /proc to make it more difficult to access other proccesses, see https://superuser.com/a/704035 +RUN cat /etc/fstab +RUN ls -al /etc/fstab +RUN echo "proc /proc proc nosuid,nodev,noexec,hidepid=2 0 0" >> /etc/fstab +RUN cat /etc/fstab + +RUN adduser --no-create-home gpt_code_ui +USER gpt_code_ui + +CMD ["python", "./run_with_app_service_config.py", "./gpt_code_ui/main.py"] diff --git a/LICENSE b/LICENSE index 17e2f18f..35e7e594 100644 --- a/LICENSE +++ b/LICENSE @@ -18,4 +18,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file +SOFTWARE. diff --git a/Makefile b/Makefile index 5e44ff25..90a8a538 100644 --- a/Makefile +++ b/Makefile @@ -1,18 +1,18 @@ -.PHONY: all compile_frontend bundle_pypi upload_pypi increment_version release check_env_var +.PHONY: all container_image container_run compile_frontend bundle_pypi upload_pypi increment_version release check_env_var all: check_env_var build upload_pypi build: check_env_var compile_frontend bundle_pypi increment_version: - @VERSION=$$(grep -e "^\s*version='[^']*'" setup.py | cut -d "'" -f 2) && \ + @VERSION=$$(grep -e '^\s*version\s*=\s*"[^"]*"' pyproject.toml | cut -d '"' -f 2) && \ MAJOR=$$(echo $$VERSION | cut -d. -f1) && \ MINOR=$$(echo $$VERSION | cut -d. -f2) && \ PATCH=$$(echo $$VERSION | cut -d. -f3) && \ NEW_PATCH=$$((PATCH + 1)) && \ NEW_VERSION="$$MAJOR.$$MINOR.$$NEW_PATCH" && \ - sed -i.bak "s/version='[^']*'/version='$$NEW_VERSION'/" setup.py && \ - rm setup.py.bak && \ + sed -i.bak "s/$$VERSION/$$NEW_VERSION/" pyproject.toml && \ + rm -f pyproject.toml.bak && \ echo "Updated version to $$NEW_VERSION" @@ -22,16 +22,28 @@ release: compile_frontend: cd frontend && \ npm install && \ - VITE_APP_VERSION=$$(grep -e "^\s*version='[^']*'" ../setup.py | cut -d "'" -f 2) npm run build && \ + VITE_APP_VERSION=$$(grep -e '^\s*version\s*=\s*"[^"]*"' ../pyproject.toml | cut -d '"' -f 2) npm run build && \ find ../gpt_code_ui/webapp/static -mindepth 1 ! -name '.gitignore' -delete && \ rsync -av dist/ ../gpt_code_ui/webapp/static +container_image: + podman build . --tag=gpt_code_ui + +container_run: + podman run \ + --env 'APP_SERVICE_CONFIG=$(shell cat .app_service_config.json)' \ + --env "FOUNDRY_DEV_TOOLS_FOUNDRY_URL=$(shell grep -e 'foundry_url' $$HOME/.foundry-dev-tools/config | cut -d '=' -f 2 | awk '{$$1=$$1;print}')" \ + --env "FOUNDRY_DEV_TOOLS_JWT=$(shell grep -e 'jwt' $$HOME/.foundry-dev-tools/config | cut -d '=' -f 2 | awk '{$$1=$$1;print}')" \ + -p=8080:8080/tcp \ + --name="GPT-Code-UI" \ + localhost/gpt_code_ui:latest + bundle_pypi: rm -rf dist build && \ - python3 setup.py sdist bdist_wheel + poetry build -upload_pypi: - twine upload dist/* +upload_pypi: bundle_pypi + poetry publish check_env_var: ifeq ($(VITE_WEB_ADDRESS),) diff --git a/README.md b/README.md index b69b7182..ba14dfa3 100644 --- a/README.md +++ b/README.md @@ -4,63 +4,128 @@ An open source implementation of OpenAI's ChatGPT [Code interpreter](https://ope Simply ask the OpenAI model to do something and it will generate & execute the code for you. +This project is an extended and further developed fork of of [Rick Lamer's GPT Code UI](https://github.com/ricklamers/gpt-code-ui). Read the [blog post](https://ricklamers.io/posts/gpt-code) to find out more. -## Community -Judah Cooper offered to start & curate a Discord community. Join [here](https://discord.gg/ZmTQwpkYu6). +## Demo Video +![Demo Video](https://github.com/dasmy/gpt-code-ui/assets/5322274/29f2ad23-147f-4c8b-aaa2-d4bf4721d294) -## Installation - -Open a terminal and run: - -``` -pip install gpt-code-ui -gptcode -``` - -In order to make basic dependencies available it's recommended to run the following `pip` install -in the Python environment that is used in the shell where you run `gptcode`: - -```sh -pip install "numpy>=1.24,<1.25" "dateparser>=1.1,<1.2" "pandas>=1.5,<1.6" "geopandas>=0.13,<0.14" "tabulate>=0.9.0<1.0" "PyPDF2>=3.0,<3.1" "pdfminer>=20191125,<20191200" "pdfplumber>=0.9,<0.10" "matplotlib>=3.7,<3.8" -``` - -## User interface -GPT-Code logo - ## Features - File upload - File download +- Dataset Download from Palantir Foundry using [Foundry Dev Tools](https://github.com/emdgroup/foundry-dev-tools) - Context awareness (it can refer to your previous messages) - Generate code - Run code (Python kernel) -- Model switching (GPT-3.5 and GPT-4) +- Make proprietary code available to the model +- Model switching (GPT-3.5 and GPT-4, Bedrock, etc.) + +## Using proprietary code +The model is trained on public code from GitHub. Hence, out of the box, it can only generate code that is publicly available. However, you can make your proprietary code available to the model by implementing individual functions that wrap your proprietary code. Type annotations and doc strings will help the model to understand what your code does. + +### Adding a new function +Right now, proprietary functions are hard-coded to `gpt_code_ui.function_library.AVAILABLE_MODELS`. To add a new function, simply add a new entry to this dictionary. The key is the name of the function as it will be used in the prompt. The value is the function itself. The function must be a callable and can take any input and produce any output. Have a look at `gpt_code_ui.function_library.examples` for examples. + +It is important that you provide type annotations and a doc string to your function to help the LLM understand what your function does and how it is used. + +Considerations: +- Wrap complex code in a single function. +- Try to use simple types (e.g. `str`, `int`, `float`, `bool`, `list`, `dict`) as input and output. In the future, you can also pass complex types (e.g. `pandas.DataFrame`) but this is not yet supported. +- If you use `list` or `dict` as input, make sure to provide type annotations for the elements, e.g. `list[str]` or `dict[str, int]`. ## Misc. -### Using .env for OpenAI key -You can put a .env in the working directory to load the `OPENAI_API_KEY` environment variable. +### Running the Docker Container as fully packaged Service +See the [Dockerfile](Dockerfile) for details. Most notably, we do not invoke the tool directly but via [run_with_app_service_config.py](rub_with_app_service_config.py), which extracts environment variable specifications from a json-formatted `APP_SERVICE_CONFIG` environment variable. +In order to run properly, your `APP_SERVICE_CONFIG` should read similar to +``` +{ + "AZURE_API_KEY": "", + "AZURE_API_BASE": "", + "AZURE_API_VERSION": "2023-09-01-preview", -### Configurables -Set the `API_PORT`, `WEB_PORT`, `SNAKEMQ_PORT` variables to override the defaults. + "OPENAI_API_KEY": "sk-INVALID", + + "BEDROCK_GATEWAY_API_KEY": "", + "BEDROCK_GATEWAY_API_BASE": "", + + "AVAILABLE_MODELS": [ + {"displayName": "GPT-3.5 16k", "name": "azure/gpt-35-turbo-16k"}, + {"displayName": "GPT-3.5 0613", "name": "azure/gpt-35-turbo-0613"}, + {"displayName": "Claude v1", "name": "bedrock_gateway/anthropic.claude-instant-v1"}, + {"displayName": "Claude v2", "name": "bedrock_gateway/anthropic.claude-v2"} + ], + + "API_PORT": 5010, + "WEB_PORT": 8080, + + "NO_INTERNET_AVAILABLE": 1, -Set `OPENAI_BASE_URL` to change the OpenAI API endpoint that's being used (note this environment variable includes the protocol `https://...`). + "SESSION_ENCRYPTION_KEY": "67ed8ea0-05f0-4086-9a54-6b2bb6dbcf29", -You can use the `.env.example` in the repository (make sure you `git clone` the repo to get the file first). + "DEBUG": 1, + "OPENAI_API_LOGLEVEL": "debug", -For Azure OpenAI Services, there are also other configurable variables like deployment name. See `.env.azure-example` for more information. -Note that model selection on the UI is currently not supported for Azure OpenAI Services. + "FOUNDRY_DATA_FOLDER": "/Global/Foundry Training and Resources/Example Data/Aviation Ontology" +} ``` -cp .env.example .env -vim .env -gptcode + +### Running locally +For local execution, your `.env` could read similar to +``` +AZURE_API_KEY=XXXX +AZURE_API_BASE=https://your-resource-name.openai.azure.com +AZURE_API_VERSION=2023-09-01-preview + +OPENAI_API_KEY=sk-XXXX + +BEDROCK_GATEWAY_API_KEY=YYYY +BEDROCK_GATEWAY_API_BASE=https://your-gateway-url.com + +AVAILABLE_MODELS=[{"displayName": "GPT-3.5 16k", "name": "azure/gpt-35-turbo-16k"}, {"displayName": "GPT-3.5 0613", "name": "azure/gpt-35-turbo-0613"}, {"displayName": "Claude v1", "name": "bedrock_gateway/anthropic.claude-instant-v1"}, {"displayName": "Claude v2", "name": "bedrock_gateway/anthropic.claude-v2"}] + +API_PORT=5010 +WEB_PORT=8080 + +SESSION_ENCRYPTION_KEY="" + +DEBUG=1 +NO_INTERNET_AVAILABLE=0 +OPENAI_API_LOGLEVEL=debug +FOUNDRY_DATA_FOLDER=/Global/Foundry Training and Resources/Example Data/Aviation Ontology +``` +Then call ``` +# build the frontend and inject it into the main application, you will need Node.js and Vite to be installed for this +make compile_frontend -### Docker -[localagi](https://github.com/localagi) took the effort of bundling the Python package in a Docker container. Check it out here: [gpt-code-ui-docker](https://github.com/localagi/gpt-code-ui-docker). +# the following only required on recent MacOS, see https://stackoverflow.com/a/52230415/10984529 +export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES + +# finally, run all required services +python gpt_code_ui/main.py +``` +This should open a browser window, navigating you to [http://localhost:8080](http://localhost:8080), where the application is running. + +### Running the AppService Container Locally with Podman +Create a file `.app_service_config.json` that contains the content of the `APP_SERVICE_CONFIG` variable. +Then simply invoke the following commands: +``` +make container_image +make container_run +``` +Afterwards, you should be able to access the frontend via [http://localhost:8080](http://localhost:8080). +Note, that this does not include proper foundry config at the moment. Should be fixed by someone somewhen. + +### Prompt playground +Run `streamlit run gpt_code_ui/st_playground.py` to start the prompt playground app. + +### Configurables +Set the `API_PORT`, `WEB_PORT` variables to override the defaults. +When `NO_INTERNET_AVAILABLE` is non-trueish or absent, the application will create dedicated virtual environments for every session and also makes active use of `!pip install ...` commands for missing packages. ## Contributing -Please do and have a look at the [contributions guide](.github/CONTRIBUTING.md)! This should be a community initiative. I'll try my best to be responsive. +Please contribute. -Thank you for your interest in this project! \ No newline at end of file +Thank you for your interest in this project! diff --git a/UserInterface.png b/UserInterface.png new file mode 100644 index 00000000..5e55d337 Binary files /dev/null and b/UserInterface.png differ diff --git a/frontend/.eslintrc.cjs b/frontend/.eslintrc.cjs index 4020bcbf..2b8ac56c 100644 --- a/frontend/.eslintrc.cjs +++ b/frontend/.eslintrc.cjs @@ -7,8 +7,9 @@ module.exports = { ], parser: '@typescript-eslint/parser', parserOptions: { ecmaVersion: 'latest', sourceType: 'module' }, - plugins: ['react-refresh'], + plugins: ['react-refresh', '@typescript-eslint' ], rules: { 'react-refresh/only-export-components': 'warn', }, + ignorePatterns: ["dist", "node_modules", "public/assets"], } diff --git a/frontend/index.html b/frontend/index.html index 54e5791f..aa31b0b9 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -4,7 +4,7 @@ - GPT-Code UI + GPT Code UI
diff --git a/frontend/package-lock.json b/frontend/package-lock.json index d12fbf76..d01251fe 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -12,28 +12,44 @@ "@emotion/styled": "^11.11.0", "@mui/icons-material": "^5.11.16", "@mui/material": "^5.13.1", + "@types/uuid": "^9.0.8", + "re-resizable": "^6.9.11", "react": "^18.2.0", "react-dom": "^18.2.0", "react-markdown": "^8.0.7", + "react-player": "^2.15.1", "react-syntax-highlighter": "^15.5.0", "react-textarea-autosize": "^8.4.1", + "react-to-print": "^2.15.1", "remark-gfm": "^3.0.1", - "usehooks-ts": "^2.9.1" + "use-local-storage": "^3.0.0", + "uuid": "^9.0.1" }, "devDependencies": { + "@types/node": "^20.11.24", "@types/react": "^18.0.28", "@types/react-dom": "^18.0.11", "@types/react-syntax-highlighter": "^15.5.6", - "@typescript-eslint/eslint-plugin": "^5.57.1", - "@typescript-eslint/parser": "^5.57.1", + "@typescript-eslint/eslint-plugin": "^7.1.1", + "@typescript-eslint/parser": "^7.1.1", "@vitejs/plugin-react-swc": "^3.0.0", "eslint": "^8.38.0", + "eslint-plugin-react": "^7.34.0", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.3.4", "typescript": "^5.0.2", "vite": "^4.3.9" } }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@babel/code-frame": { "version": "7.21.4", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", @@ -674,23 +690,23 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", - "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", - "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.2", + "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -706,22 +722,22 @@ } }, "node_modules/@eslint/js": { - "version": "8.40.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.40.0.tgz", - "integrity": "sha512-ElyB54bJIhXQYVKjDSvCkPO1iU1tSAeVQJbllWJq1XQSmmA4dgFk8CbiBGpiOPxleE48vDogxCtmMYku4HSVLA==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", "minimatch": "^3.0.5" }, "engines": { @@ -742,9 +758,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", "dev": true }, "node_modules/@mui/base": { @@ -1243,9 +1259,9 @@ } }, "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, "node_modules/@types/mdast": { @@ -1261,6 +1277,15 @@ "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" }, + "node_modules/@types/node": { + "version": "20.11.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.24.tgz", + "integrity": "sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, "node_modules/@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", @@ -1321,9 +1346,9 @@ "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==" }, "node_modules/@types/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", "dev": true }, "node_modules/@types/unist": { @@ -1331,33 +1356,39 @@ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" }, + "node_modules/@types/uuid": { + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", + "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==" + }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.6.tgz", - "integrity": "sha512-sXtOgJNEuRU5RLwPUb1jxtToZbgvq3M6FPpY4QENxoOggK+UpTxUBpj6tD8+Qh2g46Pi9We87E+eHnUw8YcGsw==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.1.1.tgz", + "integrity": "sha512-zioDz623d0RHNhvx0eesUmGfIjzrk18nSBC8xewepKXbBvN/7c1qImV7Hg8TI1URTxKax7/zxfxj3Uph8Chcuw==", "dev": true, "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.6", - "@typescript-eslint/type-utils": "5.59.6", - "@typescript-eslint/utils": "5.59.6", + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "7.1.1", + "@typescript-eslint/type-utils": "7.1.1", + "@typescript-eslint/utils": "7.1.1", + "@typescript-eslint/visitor-keys": "7.1.1", "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" }, "peerDependenciesMeta": { "typescript": { @@ -1366,25 +1397,26 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.6.tgz", - "integrity": "sha512-7pCa6al03Pv1yf/dUg/s1pXz/yGMUBAw5EeWqNTFiSueKvRNonze3hma3lhdsOrQcaOXhbk5gKu2Fludiho9VA==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.1.1.tgz", + "integrity": "sha512-ZWUFyL0z04R1nAEgr9e79YtV5LbafdOtN7yapNbn1ansMyaegl2D4bL7vHoJ4HPSc4CaLwuCVas8CVuneKzplQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.59.6", - "@typescript-eslint/types": "5.59.6", - "@typescript-eslint/typescript-estree": "5.59.6", + "@typescript-eslint/scope-manager": "7.1.1", + "@typescript-eslint/types": "7.1.1", + "@typescript-eslint/typescript-estree": "7.1.1", + "@typescript-eslint/visitor-keys": "7.1.1", "debug": "^4.3.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^8.56.0" }, "peerDependenciesMeta": { "typescript": { @@ -1393,16 +1425,16 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.6.tgz", - "integrity": "sha512-gLbY3Le9Dxcb8KdpF0+SJr6EQ+hFGYFl6tVY8VxLPFDfUZC7BHFw+Vq7bM5lE9DwWPfx4vMWWTLGXgpc0mAYyQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.1.1.tgz", + "integrity": "sha512-cirZpA8bJMRb4WZ+rO6+mnOJrGFDd38WoXCEI57+CYBqta8Yc8aJym2i7vyqLL1vVYljgw0X27axkUXz32T8TA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.6", - "@typescript-eslint/visitor-keys": "5.59.6" + "@typescript-eslint/types": "7.1.1", + "@typescript-eslint/visitor-keys": "7.1.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -1410,25 +1442,25 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.6.tgz", - "integrity": "sha512-A4tms2Mp5yNvLDlySF+kAThV9VTBPCvGf0Rp8nl/eoDX9Okun8byTKoj3fJ52IJitjWOk0fKPNQhXEB++eNozQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.1.1.tgz", + "integrity": "sha512-5r4RKze6XHEEhlZnJtR3GYeCh1IueUHdbrukV2KSlLXaTjuSfeVF8mZUVPLovidCuZfbVjfhi4c0DNSa/Rdg5g==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.59.6", - "@typescript-eslint/utils": "5.59.6", + "@typescript-eslint/typescript-estree": "7.1.1", + "@typescript-eslint/utils": "7.1.1", "debug": "^4.3.4", - "tsutils": "^3.21.0" + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "*" + "eslint": "^8.56.0" }, "peerDependenciesMeta": { "typescript": { @@ -1437,12 +1469,12 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.6.tgz", - "integrity": "sha512-tH5lBXZI7T2MOUgOWFdVNUILsI02shyQvfzG9EJkoONWugCG77NDDa1EeDGw7oJ5IvsTAAGVV8I3Tk2PNu9QfA==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.1.1.tgz", + "integrity": "sha512-KhewzrlRMrgeKm1U9bh2z5aoL4s7K3tK5DwHDn8MHv0yQfWFz/0ZR6trrIHHa5CsF83j/GgHqzdbzCXJ3crx0Q==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -1450,21 +1482,22 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.6.tgz", - "integrity": "sha512-vW6JP3lMAs/Tq4KjdI/RiHaaJSO7IUsbkz17it/Rl9Q+WkQ77EOuOnlbaU8kKfVIOJxMhnRiBG+olE7f3M16DA==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.1.1.tgz", + "integrity": "sha512-9ZOncVSfr+sMXVxxca2OJOPagRwT0u/UHikM2Rd6L/aB+kL/QAuTnsv6MeXtjzCJYb8PzrXarypSGIPx3Jemxw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.6", - "@typescript-eslint/visitor-keys": "5.59.6", + "@typescript-eslint/types": "7.1.1", + "@typescript-eslint/visitor-keys": "7.1.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -1476,49 +1509,78 @@ } } }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@typescript-eslint/utils": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.6.tgz", - "integrity": "sha512-vzaaD6EXbTS29cVH0JjXBdzMt6VBlv+hE31XktDRMX1j3462wZCJa7VzO2AxXEXcIl8GQqZPcOPuW/Z1tZVogg==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.1.1.tgz", + "integrity": "sha512-thOXM89xA03xAE0lW7alstvnyoBUbBX38YtY+zAUcpRPcq9EIhXPuJ0YTv948MbzmKh6e1AUszn5cBFK49Umqg==", "dev": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.6", - "@typescript-eslint/types": "5.59.6", - "@typescript-eslint/typescript-estree": "5.59.6", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "7.1.1", + "@typescript-eslint/types": "7.1.1", + "@typescript-eslint/typescript-estree": "7.1.1", + "semver": "^7.5.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^8.56.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.6.tgz", - "integrity": "sha512-zEfbFLzB9ETcEJ4HZEEsCR9HHeNku5/Qw1jSS5McYJv5BR+ftYXwFFAH5Al+xkGaZEqowMwl7uoJjQb1YSPF8Q==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.1.1.tgz", + "integrity": "sha512-yTdHDQxY7cSoCcAtiBzVzxleJhkGB9NncSIyMYe2+OGON1ZsP9zOPws/Pqgopa65jvknOjlk/w7ulPlZ78PiLQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.6", - "eslint-visitor-keys": "^3.3.0" + "@typescript-eslint/types": "7.1.1", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, "node_modules/@vitejs/plugin-react-swc": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.3.1.tgz", @@ -1532,9 +1594,9 @@ } }, "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -1598,6 +1660,41 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -1607,6 +1704,132 @@ "node": ">=8" } }, + "node_modules/array.prototype.findlast": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.4.tgz", + "integrity": "sha512-BMtLxpV+8BD+6ZPFIWmnUBpQoy+A+ujcg4rhp2iwCRJYA7PEh2MS4NL3lz8EiDlLrJPp2hg9qWihr5pd//jcGw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.toreversed": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz", + "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz", + "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.1.0", + "es-shim-unscopables": "^1.0.2" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asynciterator.prototype": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", + "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/babel-plugin-macros": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", @@ -1658,6 +1881,25 @@ "node": ">=8" } }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -1841,6 +2083,48 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -1898,6 +2182,148 @@ "is-arrayish": "^0.2.1" } }, + "node_modules/es-abstract": { + "version": "1.22.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.5.tgz", + "integrity": "sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.1", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.0", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.5", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.17.tgz", + "integrity": "sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ==", + "dev": true, + "dependencies": { + "asynciterator.prototype": "^1.0.0", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.4", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.2", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/esbuild": { "version": "0.17.19", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", @@ -1947,27 +2373,28 @@ } }, "node_modules/eslint": { - "version": "8.40.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.40.0.tgz", - "integrity": "sha512-bvR+TsP9EHL3TqNtj9sCNJVAFK3fBN8Q7g5waghxyRsPLIMwL73XSKnZFK0hk/O2ANC+iAoq6PWMQ+IfBAJIiQ==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.40.0", - "@humanwhocodes/config-array": "^0.11.8", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.1", - "espree": "^9.5.2", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -1975,22 +2402,19 @@ "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "bin": { @@ -2003,6 +2427,38 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint-plugin-react": { + "version": "7.34.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.0.tgz", + "integrity": "sha512-MeVXdReleBTdkz/bvcQMSnCXGi+c9kvy51IpinjnJgutl3YTHWsDdke7Z1ufZpGfDG8xduBDKyjtB9JH1eBKIQ==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.7", + "array.prototype.findlast": "^1.2.4", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.toreversed": "^1.1.2", + "array.prototype.tosorted": "^1.1.3", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.17", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.7", + "object.fromentries": "^2.0.7", + "object.hasown": "^1.1.3", + "object.values": "^1.1.7", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.10" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, "node_modules/eslint-plugin-react-hooks": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", @@ -2024,39 +2480,52 @@ "eslint": ">=7" } }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "esutils": "^2.0.2" }, "engines": { - "node": ">=8.0.0" + "node": ">=0.10.0" } }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2065,13 +2534,16 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "engines": { - "node": ">=4.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/glob-parent": { @@ -2087,12 +2559,12 @@ } }, "node_modules/espree": { - "version": "9.5.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", - "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "dependencies": { - "acorn": "^8.8.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" }, @@ -2115,15 +2587,6 @@ "node": ">=0.10" } }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", @@ -2136,7 +2599,7 @@ "node": ">=4.0" } }, - "node_modules/esrecurse/node_modules/estraverse": { + "node_modules/estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", @@ -2145,15 +2608,6 @@ "node": ">=4.0" } }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -2175,9 +2629,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -2287,6 +2741,15 @@ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "dev": true }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, "node_modules/format": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", @@ -2316,9 +2779,75 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/glob": { "version": "7.2.3", @@ -2353,9 +2882,9 @@ } }, "node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -2367,6 +2896,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -2387,21 +2931,31 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, "dependencies": { - "function-bind": "^1.1.1" + "get-intrinsic": "^1.1.3" }, - "engines": { - "node": ">= 0.4.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-flag": { @@ -2413,6 +2967,68 @@ "node": ">=8" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", + "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/hast-util-parse-selector": { "version": "2.2.5", "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", @@ -2522,6 +3138,20 @@ "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" }, + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/is-alphabetical": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", @@ -2544,11 +3174,70 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-buffer": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", @@ -2571,12 +3260,39 @@ "node": ">=4" } }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-core-module": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", - "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, "dependencies": { - "has": "^1.0.3" + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2600,6 +3316,33 @@ "node": ">=0.10.0" } }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -2621,6 +3364,27 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -2630,6 +3394,21 @@ "node": ">=0.12.0" } }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -2650,20 +3429,148 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, - "node_modules/js-sdsl": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", - "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", + "node_modules/iterator.prototype": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" } }, "node_modules/js-tokens": { @@ -2700,6 +3607,21 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, "node_modules/kleur": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", @@ -2726,6 +3648,11 @@ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, + "node_modules/load-script": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/load-script/-/load-script-1.0.0.tgz", + "integrity": "sha512-kPEjMFtZvwL9TaZo0uZ2ml+Ye9HUMmPwbYRJ324qF9tqMejwykJ5ggTyvzmrbBeapCAbk98BSbTeovHEEP1uCA==" + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -3015,6 +3942,11 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/memoize-one": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -3612,27 +4544,118 @@ "nanoid": "bin/nanoid.cjs" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", + "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", + "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true + "node_modules/object.hasown": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", + "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "node_modules/object.values": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/once": { @@ -3645,17 +4668,17 @@ } }, "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "type-check": "^0.4.0" }, "engines": { "node": ">= 0.8.0" @@ -3794,10 +4817,19 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/postcss": { - "version": "8.4.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz", - "integrity": "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "dev": true, "funding": [ { @@ -3867,9 +4899,9 @@ } }, "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "engines": { "node": ">=6" @@ -3895,6 +4927,15 @@ } ] }, + "node_modules/re-resizable": { + "version": "6.9.11", + "resolved": "https://registry.npmjs.org/re-resizable/-/re-resizable-6.9.11.tgz", + "integrity": "sha512-a3hiLWck/NkmyLvGWUuvkAmN1VhwAz4yOhS6FdMTaxCUVN9joIWkT11wsO68coG/iEYuwn+p/7qAmfQzRhiPLQ==", + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/react": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", @@ -3918,6 +4959,11 @@ "react": "^18.2.0" } }, + "node_modules/react-fast-compare": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", + "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==" + }, "node_modules/react-is": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", @@ -3980,6 +5026,21 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/react-player": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/react-player/-/react-player-2.15.1.tgz", + "integrity": "sha512-ni1XFuYZuhIKKdeFII+KRLmIPcvCYlyXvtSMhNOgssdfnSovmakBtBTW2bxowPvmpKy5BTR4jC4CF79ucgHT+g==", + "dependencies": { + "deepmerge": "^4.0.0", + "load-script": "^1.0.0", + "memoize-one": "^5.1.1", + "prop-types": "^15.7.2", + "react-fast-compare": "^3.0.1" + }, + "peerDependencies": { + "react": ">=16.6.0" + } + }, "node_modules/react-syntax-highlighter": { "version": "15.5.0", "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.5.0.tgz", @@ -4011,6 +5072,15 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/react-to-print": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/react-to-print/-/react-to-print-2.15.1.tgz", + "integrity": "sha512-1foogIFbCpzAVxydkhBiDfMiFYhIMphiagDOfcG4X/EcQ+fBPqJ0rby9Wv/emzY1YLkIQy/rEgOrWQT+rBKhjw==", + "peerDependencies": { + "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/react-transition-group": { "version": "4.4.5", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", @@ -4026,6 +5096,27 @@ "react-dom": ">=16.6.0" } }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.5.tgz", + "integrity": "sha512-62wgfC8dJWrmxv44CA36pLDnP6KKl3Vhxb7PL+8+qrrFMMoJij4vgiMP8zV4O8+CBMXY1mHxI5fITGHXFHVmQQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.0.0", + "get-intrinsic": "^1.2.3", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/refractor": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz", @@ -4053,6 +5144,24 @@ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/remark-gfm": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz", @@ -4196,6 +5305,41 @@ "node": ">=6" } }, + "node_modules/safe-array-concat": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", + "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/scheduler": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", @@ -4205,9 +5349,9 @@ } }, "node_modules/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -4219,6 +5363,38 @@ "node": ">=10" } }, + "node_modules/set-function-length": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", + "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.2", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -4240,6 +5416,24 @@ "node": ">=8" } }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -4275,6 +5469,71 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/string.prototype.matchall": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", + "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "regexp.prototype.flags": "^1.5.0", + "set-function-name": "^2.0.0", + "side-channel": "^1.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -4379,25 +5638,16 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "node_modules/ts-api-utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.2.1.tgz", + "integrity": "sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==", "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, "engines": { - "node": ">= 6" + "node": ">=16" }, "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + "typescript": ">=4.2.0" } }, "node_modules/type-check": { @@ -4424,6 +5674,79 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", + "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typescript": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", @@ -4437,6 +5760,27 @@ "node": ">=12.20" } }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, "node_modules/unified": { "version": "10.1.2", "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", @@ -4573,17 +5917,24 @@ } } }, - "node_modules/usehooks-ts": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/usehooks-ts/-/usehooks-ts-2.9.1.tgz", - "integrity": "sha512-2FAuSIGHlY+apM9FVlj8/oNhd+1y+Uwv5QNkMQz1oSfdHk4PXo1qoCw9I5M7j0vpH8CSWFJwXbVPeYDjLCx9PA==", - "engines": { - "node": ">=16.15.0", - "npm": ">=8" - }, + "node_modules/use-local-storage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/use-local-storage/-/use-local-storage-3.0.0.tgz", + "integrity": "sha512-wlPNnBCG3ULIJMr5A+dvWqLiPWCfsN1Kwijq+sAhT5yV4ex0u6XmZuNwP+RerIOfzBuz1pwSZuzhZMiluGQHfQ==", "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + "react": ">=16.8.1" + } + }, + "node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" } }, "node_modules/uvu": { @@ -4694,13 +6045,80 @@ "node": ">= 8" } }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", + "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", "dev": true, + "dependencies": { + "function.prototype.name": "^1.1.5", + "has-tostringtag": "^1.0.0", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dev": true, + "dependencies": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", + "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.6", + "call-bind": "^1.0.5", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/wrappy": { diff --git a/frontend/package.json b/frontend/package.json index 4f6f3659..650d206b 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -14,22 +14,29 @@ "@emotion/styled": "^11.11.0", "@mui/icons-material": "^5.11.16", "@mui/material": "^5.13.1", + "@types/uuid": "^9.0.8", + "re-resizable": "^6.9.11", "react": "^18.2.0", "react-dom": "^18.2.0", "react-markdown": "^8.0.7", + "react-player": "^2.15.1", "react-syntax-highlighter": "^15.5.0", "react-textarea-autosize": "^8.4.1", + "react-to-print": "^2.15.1", "remark-gfm": "^3.0.1", - "usehooks-ts": "^2.9.1" + "use-local-storage": "^3.0.0", + "uuid": "^9.0.1" }, "devDependencies": { + "@types/node": "^20.11.24", "@types/react": "^18.0.28", "@types/react-dom": "^18.0.11", "@types/react-syntax-highlighter": "^15.5.6", - "@typescript-eslint/eslint-plugin": "^5.57.1", - "@typescript-eslint/parser": "^5.57.1", + "@typescript-eslint/eslint-plugin": "^7.1.1", + "@typescript-eslint/parser": "^7.1.1", "@vitejs/plugin-react-swc": "^3.0.0", "eslint": "^8.38.0", + "eslint-plugin-react": "^7.34.0", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.3.4", "typescript": "^5.0.2", diff --git a/frontend/public/assets/3Dmol-min.js b/frontend/public/assets/3Dmol-min.js new file mode 100644 index 00000000..3553943b --- /dev/null +++ b/frontend/public/assets/3Dmol-min.js @@ -0,0 +1,2 @@ +/*! For license information please see 3Dmol-min.js.LICENSE.txt */ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports["3Dmol"]=t():e["3Dmol"]=t()}(this,(()=>(()=>{var __webpack_modules__={7396:function(){"use strict";!function(e){if(e.TextEncoder&&e.TextDecoder)return!1;function t(e="utf-8"){if("utf-8"!==e)throw new RangeError(`Failed to construct 'TextEncoder': The encoding label provided ('${e}') is invalid.`)}function r(e="utf-8",t={fatal:!1}){if("utf-8"!==e)throw new RangeError(`Failed to construct 'TextDecoder': The encoding label provided ('${e}') is invalid.`);if(t.fatal)throw new Error("Failed to construct 'TextDecoder': the 'fatal' option is unsupported.")}Object.defineProperty(t.prototype,"encoding",{value:"utf-8"}),t.prototype.encode=function(e,t={stream:!1}){if(t.stream)throw new Error("Failed to encode: the 'stream' option is unsupported.");let r=0;const s=e.length;let a=0,n=Math.max(32,s+(s>>1)+7),o=new Uint8Array(n>>3<<3);for(;r=55296&&t<=56319){if(r=55296&&t<=56319)continue}if(a+4>o.length){n+=8,n*=1+r/e.length*2,n=n>>3<<3;const t=new Uint8Array(n);t.set(o),o=t}if(0!=(4294967168&t)){if(0==(4294965248&t))o[a++]=t>>6&31|192;else if(0==(4294901760&t))o[a++]=t>>12&15|224,o[a++]=t>>6&63|128;else{if(0!=(4292870144&t))continue;o[a++]=t>>18&7|240,o[a++]=t>>12&63|128,o[a++]=t>>6&63|128}o[a++]=63&t|128}else o[a++]=t}return o.slice(0,a)},Object.defineProperty(r.prototype,"encoding",{value:"utf-8"}),Object.defineProperty(r.prototype,"fatal",{value:!1}),Object.defineProperty(r.prototype,"ignoreBOM",{value:!1}),r.prototype.decode=function(e,t={stream:!1}){if(t.stream)throw new Error("Failed to decode: the 'stream' option is unsupported.");const r=new Uint8Array(e);let s=0;const a=r.length,n=[];for(;s65535&&(t-=65536,n.push(t>>>10&1023|55296),t=56320|1023&t),n.push(t)}}return String.fromCharCode.apply(null,n)},e.TextEncoder=t,e.TextDecoder=r}("undefined"!=typeof window?window:"undefined"!=typeof self?self:this)},4406:(e,t,r)=>{"use strict";r.r(t),r.d(t,{CAP:()=>s,GLDraw:()=>a});var s,a,n=r(9652);!function(e){e[e.NONE=0]="NONE",e[e.FLAT=1]="FLAT",e[e.ROUND=2]="ROUND"}(s||(s={})),function(e){function t(e,t,r){var s,a,n,o,l,h=Math.hypot(e,t);h<1e-4?(a=0,n=1):(a=-e/h,n=t/h),t=-a*e+n*t,(s=Math.hypot(t,r))<1e-4?(o=0,l=1):(o=r/s,l=t/s);var c=new Float32Array(9);return c[0]=n,c[1]=a,c[2]=0,c[3]=-a*l,c[4]=n*l,c[5]=o,c[6]=a*o,c[7]=-n*o,c[8]=l,c}var r=new class CylVertexCache{constructor(){this.cache={};let e,t=[],r=Math.pow(2,4),s=2,a=Math.pow(2,s),o=r/a;for(t[0]=new n.Vector3(-1,0,0),t[o]=new n.Vector3(0,0,1),t[2*o]=new n.Vector3(1,0,0),t[3*o]=new n.Vector3(0,0,-1),s=3;s<=4;s++){for(a=Math.pow(2,s-1),o=r/a,e=0;e{"use strict";r.r(t),r.d(t,{GLModel:()=>GLModel});var s=r(7693),a=r(3351),n=r(9652),o=r(2550),l=r(4406),h=r(6163),c=r(9005),u=r(1460),f=r(2640);r(7396);function p(e,t="utf8"){return new TextDecoder(t).decode(e)}const g=new TextEncoder;const v=(()=>{const e=new Uint8Array(4);return!((new Uint32Array(e.buffer)[0]=1)&e[0])})(),_={int8:globalThis.Int8Array,uint8:globalThis.Uint8Array,int16:globalThis.Int16Array,uint16:globalThis.Uint16Array,int32:globalThis.Int32Array,uint32:globalThis.Uint32Array,uint64:globalThis.BigUint64Array,int64:globalThis.BigInt64Array,float32:globalThis.Float32Array,float64:globalThis.Float64Array};class IOBuffer{constructor(e=8192,t={}){let r=!1;"number"==typeof e?e=new ArrayBuffer(e):(r=!0,this.lastWrittenByte=e.byteLength);const s=t.offset?t.offset>>>0:0,a=e.byteLength-s;let n=s;(ArrayBuffer.isView(e)||e instanceof IOBuffer)&&(e.byteLength!==e.buffer.byteLength&&(n=e.byteOffset+s),e=e.buffer),this.lastWrittenByte=r?a:0,this.buffer=e,this.length=a,this.byteLength=a,this.byteOffset=n,this.offset=0,this.littleEndian=!0,this._data=new DataView(this.buffer,n,a),this._mark=0,this._marks=[]}available(e=1){return this.offset+e<=this.length}isLittleEndian(){return this.littleEndian}setLittleEndian(){return this.littleEndian=!0,this}isBigEndian(){return!this.littleEndian}setBigEndian(){return this.littleEndian=!1,this}skip(e=1){return this.offset+=e,this}back(e=1){return this.offset-=e,this}seek(e){return this.offset=e,this}mark(){return this._mark=this.offset,this}reset(){return this.offset=this._mark,this}pushMark(){return this._marks.push(this.offset),this}popMark(){const e=this._marks.pop();if(void 0===e)throw new Error("Mark stack empty");return this.seek(e),this}rewind(){return this.offset=0,this}ensureAvailable(e=1){if(!this.available(e)){const t=2*(this.offset+e),r=new Uint8Array(t);r.set(new Uint8Array(this.buffer)),this.buffer=r.buffer,this.length=this.byteLength=t,this._data=new DataView(this.buffer)}return this}readBoolean(){return 0!==this.readUint8()}readInt8(){return this._data.getInt8(this.offset++)}readUint8(){return this._data.getUint8(this.offset++)}readByte(){return this.readUint8()}readBytes(e=1){return this.readArray(e,"uint8")}readArray(e,t){const r=_[t].BYTES_PER_ELEMENT*e,s=this.byteOffset+this.offset,a=this.buffer.slice(s,s+r);if(this.littleEndian===v&&"uint8"!==t&&"int8"!==t){const e=new Uint8Array(this.buffer.slice(s,s+r));e.reverse();const a=new _[t](e.buffer);return this.offset+=r,a.reverse(),a}const n=new _[t](a);return this.offset+=r,n}readInt16(){const e=this._data.getInt16(this.offset,this.littleEndian);return this.offset+=2,e}readUint16(){const e=this._data.getUint16(this.offset,this.littleEndian);return this.offset+=2,e}readInt32(){const e=this._data.getInt32(this.offset,this.littleEndian);return this.offset+=4,e}readUint32(){const e=this._data.getUint32(this.offset,this.littleEndian);return this.offset+=4,e}readFloat32(){const e=this._data.getFloat32(this.offset,this.littleEndian);return this.offset+=4,e}readFloat64(){const e=this._data.getFloat64(this.offset,this.littleEndian);return this.offset+=8,e}readBigInt64(){const e=this._data.getBigInt64(this.offset,this.littleEndian);return this.offset+=8,e}readBigUint64(){const e=this._data.getBigUint64(this.offset,this.littleEndian);return this.offset+=8,e}readChar(){return String.fromCharCode(this.readInt8())}readChars(e=1){let t="";for(let r=0;rthis.lastWrittenByte&&(this.lastWrittenByte=this.offset)}}const y={BYTE:1,CHAR:2,SHORT:3,INT:4,FLOAT:5,DOUBLE:6};function b(e){switch(Number(e)){case y.BYTE:return"byte";case y.CHAR:return"char";case y.SHORT:return"short";case y.INT:return"int";case y.FLOAT:return"float";case y.DOUBLE:return"double";default:return"undefined"}}function w(e){switch(Number(e)){case y.BYTE:case y.CHAR:return 1;case y.SHORT:return 2;case y.INT:case y.FLOAT:return 4;case y.DOUBLE:return 8;default:return-1}}function x(e){switch(String(e)){case"byte":return y.BYTE;case"char":return y.CHAR;case"short":return y.SHORT;case"int":return y.INT;case"float":return y.FLOAT;case"double":return y.DOUBLE;default:return-1}}function A(e,t){if(1!==e){const r=new Array(e);for(let s=0;s6,`non valid type ${u}`);const f=e.readUint32();let p=e.readUint32();2===r&&(S(p>0,"offsets larger than 4GB not supported"),p=e.readUint32());let g=!1;void 0!==t&&h[0]===t&&(n+=f,g=!0),a[s]={name:o,dimensions:h,attributes:c,type:b(u),size:f,offset:p,record:g}}}return{variables:a,recordStep:n}}(e,s?.id,t);return Array.isArray(n)||(r.variables=n.variables,s.recordStep=n.recordStep),r.recordDimension=s,r}function D(e){const t=e.readUint32();let r;if(t===L)return S(e.readUint32()!==L,"wrong empty tag for list of attributes"),[];{S(t!==k,"wrong tag for list of attributes");const s=e.readUint32();r=new Array(s);for(let t=0;t6,`non valid type ${a}`);const n=e.readUint32(),o=C(e,a,n);M(e),r[t]={name:s,type:b(a),value:o}}}return r}function F(){const e=[];e.push("DIMENSIONS");for(const t of this.dimensions)e.push(` ${t.name.padEnd(30)} = size: ${t.size}`);e.push(""),e.push("GLOBAL ATTRIBUTES");for(const t of this.globalAttributes)e.push(` ${t.name.padEnd(30)} = ${t.value}`);const t=JSON.parse(JSON.stringify(this.variables));e.push(""),e.push("VARIABLES:");for(const r of t){r.value=this.getDataVariable(r);let t=JSON.stringify(r.value);t.length>50&&(t=t.substring(0,50)),isNaN(r.value.length)||(t+=` (length: ${r.value.length})`),e.push(` ${r.name.padEnd(30)} = ${t}`)}return e.join("\n")}class NetCDFReader{constructor(e){this.toString=F;const t=new IOBuffer(e);t.setBigEndian(),S("CDF"!==t.readChars(3),"should start with CDF");const r=t.readByte();S(r>2,"unknown version"),this.header=O(t,r),this.buffer=t}get version(){return 1===this.header.version?"classic format":"64-bit offset format"}get recordDimension(){return this.header.recordDimension}get dimensions(){return this.header.dimensions}get globalAttributes(){return this.header.globalAttributes}getAttribute(e){const t=this.globalAttributes.find((t=>t.name===e));return t?t.value:null}getDataVariableAsString(e){const t=this.getDataVariable(e);return t?t.join(""):null}get variables(){return this.header.variables}getDataVariable(e){let t;if(t="string"==typeof e?this.header.variables.find((t=>t.name===e)):e,void 0===t)throw new Error("Not a valid NetCDF v3.x file: variable not found");return this.buffer.seek(t.offset),t.record?function(e,t,r){const s=x(t.type),a=t.size?t.size/w(s):1,n=r.length,o=new Array(n),l=r.recordStep;if(!l)throw new Error("recordDimension.recordStep is undefined");for(let t=0;tt.name===e))}attributeExists(e){return void 0!==this.globalAttributes.find((t=>t.name===e))}}var R=r(7885),P=r(3920);function G(e){let t;if("string"==typeof e){t=(new TextEncoder).encode(e)}else t=new Uint8Array(e);return(0,R.inflate)(t,{to:"string"})}class GLModel{static sameObj(e,t){return e&&t?JSON.stringify(e)==JSON.stringify(t):e==t}constructor(e,t){this.atoms=[],this.frames=[],this.box=null,this.atomdfs=null,this.id=0,this.hidden=!1,this.molObj=null,this.renderedMolObj=null,this.lastColors=null,this.modelData={},this.modelDatas=null,this.idMatrix=new n.Matrix4,this.dontDuplicateAtoms=!0,this.defaultColor=o.elementColors.defaultColor,this.defaultStickRadius=.25,this.options=t||{},this.ElementColors=this.options.defaultcolors?this.options.defaultcolors:o.elementColors.defaultColors,this.defaultSphereRadius=this.options.defaultSphereRadius?this.options.defaultSphereRadius:1.5,this.defaultCartoonQuality=this.options.cartoonQuality?this.options.cartoonQuality:10,this.id=e}getRadiusFromStyle(e,t){var r=this.defaultSphereRadius;if(void 0!==t.radius)r=t.radius;else if(GLModel.vdwRadii[e.elem])r=GLModel.vdwRadii[e.elem];else if(e.elem.length>1){let t=e.elem;t=t[0].toUpperCase()+t[1].toLowerCase(),GLModel.vdwRadii[t]&&(r=GLModel.vdwRadii[t])}return void 0!==t.scale&&(r*=t.scale),r}drawAtomCross(e,t){if(e.style.cross){var r=e.style.cross;if(!r.hidden){var a=r.linewidth||GLModel.defaultlineWidth;t[a]||(t[a]=new s.Geometry);var o=t[a].updateGeoGroup(6),l=this.getRadiusFromStyle(e,r),h=[[l,0,0],[-l,0,0],[0,l,0],[0,-l,0],[0,0,l],[0,0,-l]],u=e.clickable||e.hoverable;u&&void 0===e.intersectionShape&&(e.intersectionShape={sphere:[],cylinder:[],line:[]});for(var f=(0,c.getColorFromStyle)(e,r),p=o.vertexArray,g=o.colorArray,v=0;v<6;v++){var _=3*o.vertices;if(o.vertices++,p[_]=e.x+h[v][0],p[_+1]=e.y+h[v][1],p[_+2]=e.z+h[v][2],g[_]=f.r,g[_+1]=f.g,g[_+2]=f.b,u){var y=new n.Vector3(h[v][0],h[v][1],h[v][2]);y.multiplyScalar(.1),y.set(y.x+e.x,y.y+e.y,y.z+e.z),e.intersectionShape.line.push(y)}}}}}getGoodCross(e,t,r,s){for(var a=null,o=-1,l=0,h=e.bonds.length;lo&&(a=f,(o=c)>.1))return a}return a}getSideBondV(e,t,r){var s,a,o,l,h=new n.Vector3(e.x,e.y,e.z),c=new n.Vector3(t.x,t.y,t.z).clone(),u=null;if(c.sub(h),1===e.bonds.length)1===t.bonds.length?(u=c.clone(),Math.abs(u.x)>1e-4?u.y+=1:u.x+=1):(s=(r+1)%t.bonds.length,a=t.bonds[s],o=this.atoms[a],(l=new n.Vector3(o.x,o.y,o.z).clone()).sub(h),(u=l.clone()).cross(c));else if((u=this.getGoodCross(e,t,h,c)).lengthSq()<.01){var f=this.getGoodCross(t,e,h,c);null!=f&&(u=f)}return u.lengthSq()<.01&&(u=c.clone(),Math.abs(u.x)>1e-4?u.y+=1:u.x+=1),u.cross(c),u.normalize(),u}addLine(e,t,r,s,a,n){e[r]=s.x,e[r+1]=s.y,e[r+2]=s.z,t[r]=n.r,t[r+1]=n.g,t[r+2]=n.b,e[r+3]=a.x,e[r+4]=a.y,e[r+5]=a.z,t[r+3]=n.r,t[r+4]=n.g,t[r+5]=n.b}drawBondLines(e,t,r){if(e.style.line){var a=e.style.line;if(!a.hidden){var l,h,u,f,p=a.linewidth||GLModel.defaultlineWidth;r[p]||(r[p]=new s.Geometry);for(var g=r[p].updateGeoGroup(6*e.bonds.length),v=g.vertexArray,_=g.colorArray,y=0;y=b.index)){var w=new n.Vector3(e.x,e.y,e.z),x=new n.Vector3(b.x,b.y,b.z),A=w.clone().add(x).multiplyScalar(.5),C=!1,S=e.clickable||e.hoverable,M=b.clickable||b.hoverable;(S||M)&&(S&&(void 0===e.intersectionShape&&(e.intersectionShape={sphere:[],cylinder:[],line:[],triangle:[]}),e.intersectionShape.line.push(w),e.intersectionShape.line.push(A)),M&&(void 0===b.intersectionShape&&(b.intersectionShape={sphere:[],cylinder:[],line:[],triangle:[]}),b.intersectionShape.line.push(A),b.intersectionShape.line.push(x)));var z=(0,c.getColorFromStyle)(e,e.style.line),L=(0,c.getColorFromStyle)(b,b.style.line);if(e.bondStyles&&e.bondStyles[y]){var E=e.bondStyles[y];if(!E.iswire)continue;E.singleBond&&(C=!0),void 0!==E.color1&&(z=o.CC.color(E.color1)),void 0!==E.color2&&(L=o.CC.color(E.color2))}var T,k,I=3*g.vertices;if(e.bondOrder[y]>1&&e.bondOrder[y]<4&&!C){var O=this.getSideBondV(e,b,y),D=x.clone();D.sub(w),2==e.bondOrder[y]?(O.multiplyScalar(.1),(l=w.clone()).add(O),(h=w.clone()).sub(O),(u=l.clone()).add(D),(f=h.clone()).add(D),z==L?(g.vertices+=4,this.addLine(v,_,I,l,u,z),this.addLine(v,_,I+6,h,f,z)):(g.vertices+=8,D.multiplyScalar(.5),(T=l.clone()).add(D),(k=h.clone()).add(D),this.addLine(v,_,I,l,T,z),this.addLine(v,_,I+6,T,u,L),this.addLine(v,_,I+12,h,k,z),this.addLine(v,_,I+18,k,f,L))):3==e.bondOrder[y]&&(O.multiplyScalar(.1),(l=w.clone()).add(O),(h=w.clone()).sub(O),(u=l.clone()).add(D),(f=h.clone()).add(D),z==L?(g.vertices+=6,this.addLine(v,_,I,w,x,z),this.addLine(v,_,I+6,l,u,z),this.addLine(v,_,I+12,h,f,z)):(g.vertices+=12,D.multiplyScalar(.5),(T=l.clone()).add(D),(k=h.clone()).add(D),this.addLine(v,_,I,w,A,z),this.addLine(v,_,I+6,A,x,L),this.addLine(v,_,I+12,l,T,z),this.addLine(v,_,I+18,T,u,L),this.addLine(v,_,I+24,h,k,z),this.addLine(v,_,I+30,k,f,L)))}else z==L?(g.vertices+=2,this.addLine(v,_,I,w,x,z)):(g.vertices+=4,this.addLine(v,_,I,w,A,z),this.addLine(v,_,I+6,A,x,L))}}}}}drawAtomSphere(e,t){if(e.style.sphere){var r=e.style.sphere;if(!r.hidden){var s=(0,c.getColorFromStyle)(e,r),o=this.getRadiusFromStyle(e,r);if((!0===e.clickable||e.hoverable)&&void 0!==e.intersectionShape){var h=new n.Vector3(e.x,e.y,e.z);e.intersectionShape.sphere.push(new a.Sphere(h,o))}l.GLDraw.drawSphere(t,e,o,s)}}}drawAtomClickSphere(e){if(e.style.clicksphere){var t=e.style.clicksphere;if(!t.hidden){var r=this.getRadiusFromStyle(e,t);if((!0===e.clickable||e.hoverable)&&void 0!==e.intersectionShape){var s=new n.Vector3(e.x,e.y,e.z);e.intersectionShape.sphere.push(new a.Sphere(s,r))}}}}drawAtomInstanced(e,t){if(e.style.sphere){var r=e.style.sphere;if(!r.hidden){var s=this.getRadiusFromStyle(e,r),o=(0,c.getColorFromStyle)(e,r),l=t.updateGeoGroup(1),h=l.vertices,u=3*h,f=l.vertexArray,p=l.colorArray,g=l.radiusArray;if(f[u]=e.x,f[u+1]=e.y,f[u+2]=e.z,p[u]=o.r,p[u+1]=o.g,p[u+2]=o.b,g[h]=s,(!0===e.clickable||e.hoverable)&&void 0!==e.intersectionShape){var v=new n.Vector3(e.x,e.y,e.z);e.intersectionShape.sphere.push(new a.Sphere(v,s))}l.vertices+=1}}}drawSphereImposter(e,t,r,s){var a,n=e.updateGeoGroup(4),o=n.vertices,l=3*o,h=n.vertexArray,c=n.colorArray;for(a=0;a<4;a++)h[l+3*a]=t.x,h[l+3*a+1]=t.y,h[l+3*a+2]=t.z;var u=n.normalArray;for(a=0;a<4;a++)c[l+3*a]=s.r,c[l+3*a+1]=s.g,c[l+3*a+2]=s.b;u[l+0]=-r,u[l+1]=r,u[l+2]=0,u[l+3]=-r,u[l+4]=-r,u[l+5]=0,u[l+6]=r,u[l+7]=-r,u[l+8]=0,u[l+9]=r,u[l+10]=r,u[l+11]=0,n.vertices+=4;var f=n.faceArray,p=n.faceidx;f[p+0]=o,f[p+1]=o+1,f[p+2]=o+2,f[p+3]=o+2,f[p+4]=o+3,f[p+5]=o,n.faceidx+=6}drawAtomImposter(e,t){if(e.style.sphere){var r=e.style.sphere;if(!r.hidden){var s=this.getRadiusFromStyle(e,r),o=(0,c.getColorFromStyle)(e,r);if((!0===e.clickable||e.hoverable)&&void 0!==e.intersectionShape){var l=new n.Vector3(e.x,e.y,e.z);e.intersectionShape.sphere.push(new a.Sphere(l,s))}this.drawSphereImposter(t,e,s,o)}}}static drawStickImposter(e,t,r,s,a){for(var n,o=e.updateGeoGroup(4),l=o.vertices,h=3*l,c=o.vertexArray,u=o.colorArray,f=o.radiusArray,p=o.normalArray,g=a.r,v=a.g,_=a.b,y=h,b=0;b<4;b++)c[y]=t.x,p[y]=r.x,u[y]=g,c[++y]=t.y,p[y]=r.y,u[y]=v,c[++y]=t.z,p[y]=r.z,u[y]=b<2?_:(n=void 0,0==(n=-_)&&(n=-1e-4),n),y++;o.vertices+=4,f[l]=-s,f[l+1]=s,f[l+2]=-s,f[l+3]=s;var w=o.faceArray,x=o.faceidx;w[x+0]=l,w[x+1]=l+1,w[x+2]=l+2,w[x+3]=l+2,w[x+4]=l+3,w[x+5]=l,o.faceidx+=6}drawBondSticks(e,t,r){if(e.style.stick){var s=e.style.stick;if(!s.hidden){var h,u,f,p,g,v,_,y,b,w,x,A,C,S,M=s.radius||this.defaultStickRadius,z=M,L=s.singleBonds||!1,E=0,T=0,k=(0,c.getColorFromStyle)(e,s);!e.capDrawn&&e.bonds.length<4&&(E=2);var I=l.GLDraw.drawCylinder;for(r.imposter&&(I=GLModel.drawStickImposter),f=0;f3){if(e.bondOrder[f]<1&&(z*=e.bondOrder[f]),!O.capDrawn&&O.bonds.length<4&&(T=2),k!=F?(I(r,R,A=(new n.Vector3).addVectors(R,P).multiplyScalar(.5),z,k,E,0),I(r,A,P,z,F,0,T)):I(r,R,P,z,k,E,T),h=e.clickable||e.hoverable,u=O.clickable||O.hoverable,h||u){if(A||(A=(new n.Vector3).addVectors(R,P).multiplyScalar(.5)),h){var G=new a.Cylinder(R,A,z),B=new a.Sphere(R,z);e.intersectionShape.cylinder.push(G),e.intersectionShape.sphere.push(B)}if(u){var N=new a.Cylinder(P,A,z),U=new a.Sphere(P,z);O.intersectionShape.cylinder.push(N),O.intersectionShape.sphere.push(U)}}}else if(e.bondOrder[f]>1){var V=0,j=0;z!=M&&(V=2,j=2);var H,W,q,Y,Z,X=P.clone(),K=null;X.sub(R),K=this.getSideBondV(e,O,f),2==e.bondOrder[f]?(H=z/2.5,K.multiplyScalar(1.5*H),(W=R.clone()).add(K),(q=R.clone()).sub(K),(Y=W.clone()).add(X),(Z=q.clone()).add(X),k!=F?(A=(new n.Vector3).addVectors(W,Y).multiplyScalar(.5),C=(new n.Vector3).addVectors(q,Z).multiplyScalar(.5),I(r,W,A,H,k,V,0),I(r,A,Y,H,F,0,j),I(r,q,C,H,k,V,0),I(r,C,Z,H,F,0,j)):(I(r,W,Y,H,k,V,j),I(r,q,Z,H,k,V,j)),h=e.clickable||e.hoverable,u=O.clickable||O.hoverable,(h||u)&&(A||(A=(new n.Vector3).addVectors(W,Y).multiplyScalar(.5)),C||(C=(new n.Vector3).addVectors(q,Z).multiplyScalar(.5)),h&&(v=new a.Cylinder(W,A,H),_=new a.Cylinder(q,C,H),e.intersectionShape.cylinder.push(v),e.intersectionShape.cylinder.push(_)),u&&(b=new a.Cylinder(Y,A,H),w=new a.Cylinder(Z,C,H),O.intersectionShape.cylinder.push(b),O.intersectionShape.cylinder.push(w)))):3==e.bondOrder[f]&&(H=z/4,K.cross(X),K.normalize(),K.multiplyScalar(3*H),(W=R.clone()).add(K),(q=R.clone()).sub(K),(Y=W.clone()).add(X),(Z=q.clone()).add(X),k!=F?(A=(new n.Vector3).addVectors(W,Y).multiplyScalar(.5),C=(new n.Vector3).addVectors(q,Z).multiplyScalar(.5),S=(new n.Vector3).addVectors(R,P).multiplyScalar(.5),I(r,W,A,H,k,V,0),I(r,A,Y,H,F,0,j),I(r,R,S,H,k,E,0),I(r,S,P,H,F,0,T),I(r,q,C,H,k,V,0),I(r,C,Z,H,F,0,j)):(I(r,W,Y,H,k,V,j),I(r,R,P,H,k,E,T),I(r,q,Z,H,k,V,j)),h=e.clickable||e.hoverable,u=O.clickable||O.hoverable,(h||u)&&(A||(A=(new n.Vector3).addVectors(W,Y).multiplyScalar(.5)),C||(C=(new n.Vector3).addVectors(q,Z).multiplyScalar(.5)),S||(S=(new n.Vector3).addVectors(R,P).multiplyScalar(.5)),h&&(v=new a.Cylinder(W.clone(),A.clone(),H),_=new a.Cylinder(q.clone(),C.clone(),H),y=new a.Cylinder(R.clone(),S.clone(),H),e.intersectionShape.cylinder.push(v),e.intersectionShape.cylinder.push(_),e.intersectionShape.cylinder.push(y)),u&&(b=new a.Cylinder(Y.clone(),A.clone(),H),w=new a.Cylinder(Z.clone(),C.clone(),H),x=new a.Cylinder(P.clone(),S.clone(),H),O.intersectionShape.cylinder.push(b),O.intersectionShape.cylinder.push(w),O.intersectionShape.cylinder.push(x))))}}}var $=!1,Q=0,J=!1;for(f=0;f0&&($=!0):0==Q&&(e.bonds.length>0||s.showNonBonded)&&($=!0),$&&(z=M,r.imposter?this.drawSphereImposter(r.sphereGeometry,e,z,k):l.GLDraw.drawSphere(r,e,z,k))}}}createMolObj(e,t){t=t||{};var r,a,n,c,u=new s.Object3D,f=[],p={},g={},v=this.drawAtomSphere,_=null,y=null;t.supportsImposters?(v=this.drawAtomImposter,(_=new s.Geometry(!0)).imposter=!0,(y=new s.Geometry(!0,!0)).imposter=!0,y.sphereGeometry=new s.Geometry(!0),y.sphereGeometry.imposter=!0,y.drawnCaps={}):t.supportsAIA?(v=this.drawAtomInstanced,(_=new s.Geometry(!1,!0,!0)).instanced=!0,y=new s.Geometry(!0)):(_=new s.Geometry(!0),y=new s.Geometry(!0));var b,w={},x=[Number.POSITIVE_INFINITY,Number.NEGATIVE_INFINITY];for(r=0,n=e.length;rx[1]&&(x[1]=A.resi)),f.push(A))}}if(f.length>0&&(0,h.drawCartoon)(u,f,x,this.defaultCartoonQuality),_&&_.vertices>0){_.initTypedArrays();var C=null,S=null;_.imposter?C=new s.SphereImposterMaterial({ambient:0,vertexColors:!0,reflectivity:0}):_.instanced?(S=new s.Geometry(!0),l.GLDraw.drawSphere(S,{x:0,y:0,z:0},1,new o.Color(.5,.5,.5)),S.initTypedArrays(),C=new s.InstancedMaterial({sphereMaterial:new s.MeshLambertMaterial({ambient:0,vertexColors:!0,reflectivity:0}),sphere:S})):C=new s.MeshLambertMaterial({ambient:0,vertexColors:!0,reflectivity:0}),w.sphere<1&&w.sphere>=0&&(C.transparent=!0,C.opacity=w.sphere),S=new s.Mesh(_,C),u.add(S)}if(y.vertices>0){var M=null,z=null,L=y.sphereGeometry;L&&void 0!==L.vertices&&0!=L.vertices||(L=null),y.initTypedArrays(),L&&L.initTypedArrays();var E={ambient:0,vertexColors:!0,reflectivity:0};y.imposter?(M=new s.StickImposterMaterial(E),z=new s.SphereImposterMaterial(E)):(M=new s.MeshLambertMaterial(E),z=new s.MeshLambertMaterial(E),M.wireframe&&(y.setUpWireframe(),L&&L.setUpWireframe())),w.stick<1&&w.stick>=0&&(M.transparent=!0,M.opacity=w.stick,z.transparent=!0,z.opacity=w.stick);var T=new s.Mesh(y,M);if(u.add(T),L){var k=new s.Mesh(L,z);u.add(k)}}for(r in p)if(p.hasOwnProperty(r)){b=r;var I=new s.LineBasicMaterial({linewidth:b,vertexColors:!0});w.line<1&&w.line>=0&&(I.transparent=!0,I.opacity=w.line),p[r].initTypedArrays();var O=new s.Line(p[r],I,s.LineStyle.LinePieces);u.add(O)}for(r in g)if(g.hasOwnProperty(r)){b=r;var D=new s.LineBasicMaterial({linewidth:b,vertexColors:!0});w.cross<1&&w.cross>=0&&(D.transparent=!0,D.opacity=w.cross),g[r].initTypedArrays();var F=new s.Line(g[r],D,s.LineStyle.LinePieces);u.add(F)}if(this.dontDuplicateAtoms&&this.modelData.symmetries&&this.modelData.symmetries.length>0){var R,P=new s.Object3D;for(R=0;Rr?t-s:t}adjustCoordinatesToBox(){if(this.box&&this.atomdfs)for(var e=this.box[0],t=this.box[1],r=this.box[2],s=.9*e,a=.9*t,n=.9*r,o=0;o=r)&&(e=r-1),null!=s.frames.url){var o=s.frames.url;(0,c.getbin)(o+"/traj/frame/"+e+"/"+s.frames.path,void 0,"POST",void 0).then((function(e){for(var t=new Float32Array(e,44),r=0,n=0;n=s&&e<=a)return!0}}return!1}static deepCopyAndCache(e,t){if("object"!=typeof e||null==e)return e;if(e.__cache_created)return e;const r={};for(const s in e){const a=e[s];if(Array.isArray(a)){r[s]=[];for(let e=0;e=s[0][0]&&o<=s[1][0]&&l>=s[0][1]&&l<=s[1][1]&&h>=s[0][2]&&h<=s[1][2]&&(o>=r[0][0]&&o<=r[1][0]&&l>=r[0][1]&&l<=r[1][1]&&h>=r[0][2]&&h<=r[1][2]||n.push(this.atoms[e]))}return n}static getFloat(e){return"number"==typeof e?e:parseFloat(e)}selectedAtoms(e,t){var r=[];e=GLModel.deepCopyAndCache(e||{},this),t||(t=this.atoms);for(var s=t.length,a=0;a0&&r.push(s[e])}}if(e.hasOwnProperty("within")&&e.within.hasOwnProperty("sel")&&e.within.hasOwnProperty("distance")){var l=this.selectedAtoms(e.within.sel,this.atoms),h={};const t=GLModel.getFloat(e.within.distance),s=t*t;for(let e=0;e0&&(h[t]=1)}var c=[];if(e.within.invert)for(let e=0;e0;)if(t=p.pop(),g=t.chain,v=t.resi,void 0===f[t.index]){f[t.index]=!0;for(var _=0;_0&&(this.molObj=null)}else console.log("Callback is not a function")}setHoverable(e,t,r,s){if(t=!!t,r=(0,c.makeFunction)(r),s=(0,c.makeFunction)(s),null!==r)if(null!==s){var a=this.selectedAtoms(e,this.atoms),n=a.length;for(let e=0;e0&&(this.molObj=null)}else console.log("Unhover_callback is not a function");else console.log("Hover_callback is not a function")}enableContextMenu(e,t){var r;t=!!t;var s=this.selectedAtoms(e,this.atoms),a=s.length;for(r=0;r0&&(this.molObj=null)}setColorByElement(e,t){if(null===this.molObj||!GLModel.sameObj(t,this.lastColors)){this.lastColors=t;var r=this.selectedAtoms(e,r);r.length>0&&(this.molObj=null);for(var s=0;s0&&(this.molObj=null),"string"==typeof r&&void 0!==u.Gradient.builtinGradients[r]&&(r=new u.Gradient.builtinGradients[r]),s||(s=r.range()),s||(s=(0,c.getPropertyRange)(o,t)),a=0;a0&&(this.molObj=null);for(let e=0;e=a)continue;let o={b:r,e:a},l=n.bondOrder[e];1!=l&&(o.o=l),t.b.push(o)}}return t}globj(e,t){(null===this.molObj||t.regen)&&(this.molObj=this.createMolObj(this.atoms,t),this.renderedMolObj&&(e.remove(this.renderedMolObj),this.renderedMolObj=null),this.renderedMolObj=this.molObj.clone(),this.hidden&&(this.renderedMolObj.setVisible(!1),this.molObj.setVisible(!1)),e.add(this.renderedMolObj))}exportVRML(){return this.createMolObj(this.atoms,{supportsImposters:!1,supportsAIA:!1}).vrml()}removegl(e){this.renderedMolObj&&(void 0!==this.renderedMolObj.geometry&&this.renderedMolObj.geometry.dispose(),void 0!==this.renderedMolObj.material&&this.renderedMolObj.material.dispose(),e.remove(this.renderedMolObj),this.renderedMolObj=null),this.molObj=null}hide(){this.hidden=!0,this.renderedMolObj&&this.renderedMolObj.setVisible(!1),this.molObj&&this.molObj.setVisible(!1)}show(){this.hidden=!1,this.renderedMolObj&&this.renderedMolObj.setVisible(!0),this.molObj&&this.molObj.setVisible(!0)}addPropertyLabels(e,t,r,s){for(var a=this.selectedAtoms(t,a),n=(0,c.deepCopy)(s),o=0;oMOLECULE/gm)?"mol2":e.match(/^data_/gm)&&e.match(/^loop_/gm)?"cif":e.match(/^HETATM/gm)||e.match(/^ATOM/gm)?"pdb":e.match(/ITEM: TIMESTEP/gm)?"lammpstrj":e.match(/^.*\n.*\n.\s*(\d+)\s+(\d+)/gm)?"sdf":e.match(/^%VERSION\s+VERSION_STAMP/gm)?"prmtop":"xyz",console.log("Best guess: "+t))),(0,f.Parsers[t])(e,r)}}GLModel.defaultAtomStyle={line:{}},GLModel.defaultlineWidth=1,GLModel.vdwRadii={H:1.2,He:1.4,Li:1.82,Be:1.53,B:1.92,C:1.7,N:1.55,O:1.52,F:1.47,Ne:1.54,Na:2.27,Mg:1.73,Al:1.84,Si:2.1,P:1.8,S:1.8,Cl:1.75,Ar:1.88,K:2.75,Ca:2.31,Ni:1.63,Cu:1.4,Zn:1.39,Ga:1.87,Ge:2.11,As:1.85,Se:1.9,Br:1.85,Kr:2.02,Rb:3.03,Sr:2.49,Pd:1.63,Ag:1.72,Cd:1.58,In:1.93,Sn:2.17,Sb:2.06,Te:2.06,I:1.98,Xe:2.16,Cs:3.43,Ba:2.68,Pt:1.75,Au:1.66,Hg:1.55,Tl:1.96,Pb:2.02,Bi:2.07,Po:1.97,At:2.02,Rn:2.2,Fr:3.48,Ra:2.83,U:1.86},GLModel.ignoredKeys=new Set(["props","invert","model","frame","byres","expand","within","and","or","not"])},8783:(e,t,r)=>{"use strict";r.r(t),r.d(t,{GLShape:()=>GLShape,splitMesh:()=>p});var s=r(7693),a=r(3351),n=r(9652),o=r(2550),l=r(9192),h=r(7323),c=r(4406),u=r(6163),f=r(9005);class GLShape{static finalizeGeo(e){var t=e.updateGeoGroup(0);t.vertices>0&&t.truncateArrayBuffers(!0,!0)}static updateColor(e,t){var r,s,a;t=t||o.CC.color(t),e.colorsNeedUpdate=!0,t.constructor!==Array&&(r=t.r,s=t.g,a=t.b);for(let n in e.geometryGroups){let o=e.geometryGroups[n],l=o.colorArray;for(let e=0,n=o.vertices;e0?u/e:(e+u)/e}p.multiplyScalar(c);var g=new n.Vector3(s.x,s.y,s.z).add(p),v=p.clone().negate();let _=new n.Vector3(s.x,s.y,s.z);e.intersectionShape.cylinder.push(new a.Cylinder(_,g.clone(),l)),e.intersectionShape.sphere.push(new a.Sphere(_,l));var y=[];y[0]=p.clone(),Math.abs(y[0].x)>1e-4?y[0].y+=1:y[0].x+=1,y[0].cross(p),y[0].normalize(),y[4]=y[0].clone(),y[4].crossVectors(y[0],p),y[4].normalize(),y[8]=y[0].clone().negate(),y[12]=y[4].clone().negate(),y[2]=y[0].clone().add(y[4]).normalize(),y[6]=y[4].clone().add(y[8]).normalize(),y[10]=y[8].clone().add(y[12]).normalize(),y[14]=y[12].clone().add(y[0]).normalize(),y[1]=y[0].clone().add(y[2]).normalize(),y[3]=y[2].clone().add(y[4]).normalize(),y[5]=y[4].clone().add(y[6]).normalize(),y[7]=y[6].clone().add(y[8]).normalize(),y[9]=y[8].clone().add(y[10]).normalize(),y[11]=y[10].clone().add(y[12]).normalize(),y[13]=y[12].clone().add(y[14]).normalize(),y[15]=y[14].clone().add(y[0]).normalize();var b,w,x,A,C,S,M,z,L,E,T,k,I,O,D,F,R,P,G,B,N,U,V=f.vertices,j=f.vertexArray,H=f.faceArray,W=f.normalArray,q=f.lineArray;for(w=0,x=y.length;w0){var K=j[b-3],$=j[b-2],Q=j[b-1],J=new n.Vector3(K,$,Q),ee=new n.Vector3(o.x,o.y,o.z),te=g.clone(),re=new n.Vector3(X.x,X.y,X.z);e.intersectionShape.triangle.push(new a.Triangle(re,ee,J)),e.intersectionShape.triangle.push(new a.Triangle(J.clone(),te,re.clone()))}}f.vertices+=48,j[b=3*f.vertices]=s.x,j[b+1]=s.y,j[b+2]=s.z,j[b+3]=g.x,j[b+4]=g.y,j[b+5]=g.z,j[b+6]=o.x,j[b+7]=o.y,j[b+8]=o.z,f.vertices+=3;var ie=f.vertices-3,se=f.vertices-2,ae=f.vertices-1,ne=3*ie,oe=3*se,le=3*ae;for(w=0,x=y.length-1;wl&&(l=u),f>h&&(h=f),p>c&&(c=p)}e.center.set((l+a)/2,(h+n)/2,(c+o)/2),e.radius=e.center.distanceTo({x:l,y:h,z:c}),e.box={min:{x:a,y:n,z:o},max:{x:l,y:h,z:c}}}static addCustomGeo(e,t,r,s,o){var l,h,c,u,f,p,g,v,_,y=t.addGeoGroup(),b=r.vertexArr,w=r.normalArr,x=r.faceArr;y.vertices=b.length,y.faceidx=x.length;var A=y.vertexArray,C=y.colorArray;for(s.constructor!==Array&&(v=s.r,_=s.g,u=s.b),p=0,g=y.vertices;pc?(f.fromCap=0,f.toCap=2):(f.fromCap=2,f.toCap=2),this.addCylinder(f)}}addLine(e){var t,r;t=e.start?new n.Vector3(e.start.x||0,e.start.y||0,e.start.z||0):new n.Vector3(0,0,0),e.end?void 0===(r=new n.Vector3(e.end.x,e.end.y||0,e.end.z||0)).x&&(r.x=3):r=new n.Vector3(3,0,0);var s=this.geo.updateGeoGroup(2),a=s.vertices,o=3*a,l=s.vertexArray;l[o]=t.x,l[o+1]=t.y,l[o+2]=t.z,l[o+3]=r.x,l[o+4]=r.y,l[o+5]=r.z,s.vertices+=2;var h=s.lineArray,c=s.lineidx;h[c]=a,h[c+1]=a+1,s.lineidx+=2;var u=new n.Vector3;this.components.push({centroid:u.addVectors(t,r).multiplyScalar(.5)}),s=this.geo.updateGeoGroup(0),GLShape.updateBoundingFromPoints(this.boundingSphere,this.components,s.vertexArray,s.vertices)}addArrow(e){if(e.start?e.start=new n.Vector3(e.start.x||0,e.start.y||0,e.start.z||0):e.start=new n.Vector3(0,0,0),e.dir instanceof n.Vector3&&"number"==typeof e.length){var t=e.dir.clone().multiplyScalar(e.length).add(e.start);e.end=t}else e.end?(e.end=new n.Vector3(e.end.x,e.end.y||0,e.end.z||0),void 0===e.end.x&&(e.end.x=3)):e.end=new n.Vector3(3,0,0);e.radius=e.radius||.1,e.radiusRatio=e.radiusRatio||1.618034,e.mid=0=0?v[s]-o:o-v[s])>0&&(_[s]|=GLShape.ISDONE)}var y=[],b=[];l.MarchingCube.march(_,y,b,{fulltable:!0,voxel:h,unitCube:e.unit,origin:e.origin,matrix:e.matrix,nX:u,nY:f,nZ:p}),!h&&c>0&&l.MarchingCube.laplacianSmooth(c,y,b);var w=[],x=[],A=[];if(t.selectedRegion&&void 0===t.coords&&(t.coords=t.selectedRegion),void 0!==t.coords){var C=t.coords[0].x,S=t.coords[0].y,M=t.coords[0].z,z=t.coords[0].x,L=t.coords[0].y,E=t.coords[0].z;for(let e=0;eC?C=t.coords[e].x:t.coords[e].xS?S=t.coords[e].y:t.coords[e].yM?M=t.coords[e].z:t.coords[e].zz&&y[e].xL&&y[e].yE&&y[e].z=64e3&&(t.push({vertexArr:[],normalArr:[],faceArr:[]}),e.colorArr&&(t.colorArr=[]),a++)}return t}GLShape.ISDONE=2,GLShape.drawCustom=function(e,t,r){var s=r,a=s.vertexArr,n=s.faceArr;0!==a.length&&0!==n.length||console.warn("Error adding custom shape component: No vertices and/or face indices supplied!");var l=r.color;void 0===l&&(l=e.color),l=o.CC.color(l);for(var h=p(s),c=0,u=h.length;c{"use strict";r.r(t),r.d(t,{GLViewer:()=>GLViewer,createStereoViewer:()=>b,createViewer:()=>_,createViewerGrid:()=>y});var s=r(7693),a=r(9652),n=r(2550),o=r(9005),l=r(1460),h=r(8223),c=r(7825),u=r(8783),f=r(7323),p=r(9192),g=r(1496),v=r(2109);class GLViewer{getRect(){let e=this.container,t=e.getBoundingClientRect();if(0==t.width&&0==t.height&&"none"===e.style.display){let r=e.style.position,s=e.style.visibility;e.style.display="block",e.style.visibility="hidden",e.style.position="absolute",t=e.getBoundingClientRect(),e.style.display="none",e.style.visibility=s,e.style.position=r}return t}getWidth(){return this.getRect().width}getHeight(){return this.getRect().height}setupRenderer(){this.renderer=new s.Renderer({antialias:this.config.antialias,preserveDrawingBuffer:!0,premultipliedAlpha:!1,id:this.config.id,row:this.config.row,col:this.config.col,rows:this.config.rows,cols:this.config.cols,canvas:this.config.canvas,containerWidth:this.WIDTH||1,containerHeight:this.HEIGHT||1}),this.renderer.domElement.style.width="100%",this.renderer.domElement.style.height="100%",this.renderer.domElement.style.padding="0",this.renderer.domElement.style.position="absolute",this.renderer.domElement.style.top="0px",this.renderer.domElement.style.left="0px",this.renderer.domElement.style.zIndex="0"}initializeScene(){this.scene=new s.Scene,this.scene.fog=new s.Fog(this.bgColor,100,200),this.modelGroup=new s.Object3D,this.rotationGroup=new s.Object3D,this.rotationGroup.useQuaternion=!0,this.rotationGroup.quaternion=new a.Quaternion(0,0,0,1),this.rotationGroup.add(this.modelGroup),this.scene.add(this.rotationGroup);var e=new s.Light(16777215);e.position=new a.Vector3(.2,.2,1).normalize(),e.intensity=1,this.scene.add(e)}initContainer(e){this.container=e,this.WIDTH=this.getWidth(),this.HEIGHT=this.getHeight(),this.ASPECT=this.renderer.getAspect(this.WIDTH,this.HEIGHT),this.renderer.setSize(this.WIDTH,this.HEIGHT),this.container.append(this.renderer.domElement),this.glDOM=this.renderer.domElement,this.nomouse||(this.glDOM.addEventListener("mousedown",this._handleMouseDown.bind(this),{passive:!1}),this.glDOM.addEventListener("touchstart",this._handleMouseDown.bind(this),{passive:!1}),this.glDOM.addEventListener("wheel",this._handleMouseScroll.bind(this),{passive:!1}),this.glDOM.addEventListener("mousemove",this._handleMouseMove.bind(this),{passive:!1}),this.glDOM.addEventListener("touchmove",this._handleMouseMove.bind(this),{passive:!1}),this.glDOM.addEventListener("contextmenu",this._handleContextMenu.bind(this),{passive:!1}))}decAnim(){this.animated--,this.animated<0&&(this.animated=0)}incAnim(){this.animated++}nextSurfID(){var e=0;for(let r in this.surfaces)if(this.surfaces.hasOwnProperty(r)){var t=parseInt(r);isNaN(t)||t>e&&(e=t)}return e+1}setSlabAndFog(){let e=this.camera.position.z-this.rotationGroup.position.z;e<1&&(e=1),this.camera.near=e+this.slabNear,this.camera.near<1&&(this.camera.near=1),this.camera.far=e+this.slabFar,this.camera.near+1>this.camera.far&&(this.camera.far=this.camera.near+1),this.camera.fov=this.fov,this.camera.right=e*Math.tan(Math.PI/180*this.fov),this.camera.left=-this.camera.right,this.camera.top=this.camera.right/this.ASPECT,this.camera.bottom=-this.camera.top,this.camera.updateProjectionMatrix(),this.scene.fog.near=this.camera.near+this.fogStart*(this.camera.far-this.camera.near),this.scene.fog.far=this.camera.far,this.config.disableFog&&(this.scene.fog.near=this.scene.fog.far)}show(e){if(this.renderer.setViewport(),this.scene&&(this.setSlabAndFog(),this.renderer.render(this.scene,this.camera),this.viewChangeCallback&&this.viewChangeCallback(this._viewer.getView()),!e&&this.linkedViewers.length>0))for(var t=this._viewer.getView(),r=0;r0){let t=this.CAMERA_Z-this.config.lowerZoomLimit;e>t&&(e=t)}if(this.config.upperZoomLimit&&this.config.upperZoomLimit>0){let t=this.CAMERA_Z-this.config.upperZoomLimit;ethis.CAMERA_Z-1&&(e=this.CAMERA_Z-1),e}static slerp(e,t,r){if(1==r)return t.clone();if(0==r)return e.clone();let s=e.x*t.x+e.y*t.y+e.z*t.z+e.w*t.w;if(s>.9995){let s=new a.Quaternion(e.x+r*(t.x-e.x),e.y+r*(t.y-e.y),e.z+r*(t.z-e.z),e.w+r*(t.w-e.w));return s.normalize(),s}s<0&&(t=t.clone().multiplyScalar(-1),s=-s),s>1?s=1:s<-1&&(s=-1);var n=Math.acos(s)*r,o=t.clone();o.sub(e.clone().multiplyScalar(s)),o.normalize();var l=Math.cos(n),h=Math.sin(n),c=new a.Quaternion(e.x*l+o.x*h,e.y*l+o.y*h,e.z*l+o.z*h,e.w*l+o.w*h);return c.normalize(),c}constructor(e,t={}){this.nomouse=!1,this.glDOM=null,this.models=[],this.surfaces={},this.shapes=[],this.labels=[],this.clickables=[],this.hoverables=[],this.contextMenuEnabledAtoms=[],this.current_hover=null,this.hoverDuration=500,this.viewer_frame=0,this.viewChangeCallback=null,this.stateChangeCallback=null,this.NEAR=1,this.FAR=800,this.CAMERA_Z=150,this.fov=20,this.linkedViewers=[],this.renderer=null,this.control_all=!1,this.scene=null,this.rotationGroup=null,this.modelGroup=null,this.fogStart=.4,this.slabNear=-50,this.slabFar=50,this.cq=new a.Quaternion(0,0,0,1),this.dq=new a.Quaternion(0,0,0,1),this.animated=0,this.animationTimers=new Set,this.isDragging=!1,this.mouseStartX=0,this.mouseStartY=0,this.touchDistanceStart=0,this.touchHold=!1,this.currentModelPos=0,this.cz=0,this.cslabNear=0,this.cslabFar=0,this.userContextMenuHandler=null,this.config=t,this.callback=this.config.callback,this.defaultcolors=this.config.defaultcolors,this.defaultcolors||(this.defaultcolors=n.elementColors.defaultColors),this.nomouse=this.config.nomouse,this.bgColor=0,this.config.backgroundColor=this.config.backgroundColor||"#ffffff",void 0!==this.config.backgroundColor&&(this.bgColor=n.CC.color(this.config.backgroundColor).getHex()),this.config.backgroundAlpha=null==this.config.backgroundAlpha?1:this.config.backgroundAlpha,this.camerax=0,void 0!==this.config.camerax&&(this.camerax=parseFloat(this.config.camerax)),this._viewer=this,this.container=e,null!=this.config.hoverDuration&&(this.hoverDuration=this.config.hoverDuration),void 0===this.config.antialias&&(this.config.antialias=!0),void 0===this.config.cartoonQuality&&(this.config.cartoonQuality=10),this.WIDTH=this.getWidth(),this.HEIGHT=this.getHeight(),this.setupRenderer(),this.row=this.config.row,this.col=this.config.col,this.cols=this.config.cols,this.rows=this.config.rows,this.viewers=this.config.viewers,this.control_all=this.config.control_all,this.ASPECT=this.renderer.getAspect(this.WIDTH,this.HEIGHT),this.camera=new s.Camera(this.fov,this.ASPECT,this.NEAR,this.FAR,this.config.orthographic),this.camera.position=new a.Vector3(this.camerax,0,this.CAMERA_Z),this.lookingAt=new a.Vector3,this.camera.lookAt(this.lookingAt),this.raycaster=new s.Raycaster(new a.Vector3(0,0,0),new a.Vector3(0,0,0)),this.projector=new s.Projector,this.initializeScene(),this.renderer.setClearColorHex(this.bgColor,this.config.backgroundAlpha),this.scene.fog.color=n.CC.color(this.bgColor),document.body.addEventListener("mouseup",this._handleMouseUp.bind(this)),document.body.addEventListener("touchend",this._handleMouseUp.bind(this)),this.initContainer(this.container),this.config.style&&this.setViewStyle(this.config),window.addEventListener("resize",this.resize.bind(this)),void 0!==window.ResizeObserver&&(this.divwatcher=new window.ResizeObserver(this.resize.bind(this)),this.divwatcher.observe(this.container));try{"function"==typeof this.callback&&this.callback(this)}catch(e){console.log("error with glviewer callback: "+e)}}targetedObjects(e,t,r){var s={x:e,y:t,z:-1};return Array.isArray(r)||(r=this.selectedAtoms(r)),0==r.length?[]:(this.raycaster.setFromCamera(s,this.camera),this.raycaster.intersectObjects(this.modelGroup,r))}modelToScreen(e){let t=!1;Array.isArray(e)||(e=[e],t=!0);let r=[],s=this.canvasOffset();return e.forEach((e=>{let t=new a.Vector3(e.x,e.y,e.z);t.applyMatrix4(this.modelGroup.matrixWorld),this.projector.projectVector(t,this.camera);let n=this.WIDTH*(t.x+1)/2+s.left,o=-this.HEIGHT*(t.y-1)/2+s.top;r.push({x:n,y:o})})),t&&(r=r[0]),r}screenOffsetToModel(e,t,r){var s=e/this.WIDTH,n=t/this.HEIGHT,o=void 0===r?this.rotationGroup.position.z:r,l=this.rotationGroup.quaternion,h=new a.Vector3(0,0,o);return this.projector.projectVector(h,this.camera),h.x+=2*s,h.y-=2*n,this.projector.unprojectVector(h,this.camera),h.z=0,h.applyQuaternion(l),h}screenToModelDistance(e,t){let r=this.canvasOffset(),s=new a.Vector3(t.x,t.y,t.z);s.applyMatrix4(this.modelGroup.matrixWorld);let n=s.clone();this.projector.projectVector(s,this.camera);let o=new a.Vector3(2*(e.x-r.left)/this.WIDTH-1,2*(e.y-r.top)/-this.HEIGHT+1,s.z);return this.projector.unprojectVector(o,this.camera),o.distanceTo(n)}setViewChangeCallback(e){"function"!=typeof e&&null!=e||(this.viewChangeCallback=e)}setStateChangeCallback(e){"function"!=typeof e&&null!=e||(this.stateChangeCallback=e)}getConfig(){return this.config}setConfig(e){this.config=e}getInternalState(){var e={models:[],surfaces:[],shapes:[],labels:[]};for(let t=0;t{t.getCanvas().toBlob((function(t){t.arrayBuffer().then(e)}),"image/png")}))),s+=1,s==e&&(t.viewChangeCallback=a,Promise.all(n).then((e=>{let s=[];for(let t=0;t0&&(this.hoverTimeout=setTimeout((function(){a.handleHoverSelection(r,s,e)}),this.hoverDuration)),e.preventDefault(),this.scene&&this.isDragging){var n=0,o=this.getX(e),l=this.getY(e);if(void 0!==o&&this.isInViewer(o,l)){var h=(o-this.mouseStartX)/this.WIDTH,c=(l-this.mouseStartY)/this.HEIGHT;if(0!=this.touchDistanceStart&&e.targetTouches&&2==e.targetTouches.length)n=2,c=2*(this.calcTouchDistance(e)-this.touchDistanceStart)/(this.WIDTH+this.HEIGHT);else e.targetTouches&&3==e.targetTouches.length&&(n=1);var u=this.renderer.getXRatio(),f=this.renderer.getYRatio();h*=u,c*=f;var p,g=Math.hypot(h,c);if(3==n||3==this.mouseButton&&e.ctrlKey)this.slabNear=this.cslabNear+100*h,this.slabFar=this.cslabFar-100*c;else if(2==n||3==this.mouseButton||e.shiftKey)(p=.85*(this.CAMERA_Z-this.rotationGroup.position.z))<80&&(p=80),this.rotationGroup.position.z=this.cz+c*p,this.rotationGroup.position.z=this.adjustZoomToLimits(this.rotationGroup.position.z);else if(1==n||2==this.mouseButton||e.ctrlKey){var v=this.screenOffsetToModel(u*(o-this.mouseStartX),f*(l-this.mouseStartY));this.modelGroup.position.addVectors(this.currentModelPos,v)}else if((0===n||1==this.mouseButton)&&0!==g){var _=Math.sin(g*Math.PI)/g;this.dq.x=Math.cos(g*Math.PI),this.dq.y=0,this.dq.z=_*h,this.dq.w=-_*c,this.rotationGroup.quaternion.set(1,0,0,0),this.rotationGroup.quaternion.multiply(this.dq),this.rotationGroup.quaternion.multiply(this.cq)}this.show()}}}_handleContextMenu(e){e.preventDefault();var t=this.getX(e),r=this.getY(e);if(t==this.mouseStartX&&r==this.mouseStartY){var s=this.mouseStartX,a=this.mouseStartY,n=(s-(h=this.canvasOffset()).left)/this.WIDTH*2-1,o=-(a-h.top)/this.HEIGHT*2+1;let e=this.targetedObjects(n,o,this.contextMenuEnabledAtoms);var l=null;e.length&&(l=e[0].clickable);var h=this.canvasOffset();s=this.mouseStartX-h.left,a=this.mouseStartY-h.top;this.userContextMenuHandler&&this.userContextMenuHandler(l,s,a,e)}}setContainer(e){let t=(0,o.getElement)(e)||this.container;return this.initContainer(t),this}setBackgroundColor(e,t){(void 0===t||t<0||t>1)&&(t=1);var r=n.CC.color(e);return this.scene.fog.color=r,this.bgColor=r.getHex(),this.renderer.setClearColorHex(r.getHex(),t),this.show(),this}setProjection(e){this.camera.ortho="orthographic"===e,this.setSlabAndFog()}setViewStyle(e){if("outline"===e.style){var t={};e.color&&(t.color=n.CC.color(e.color)),e.width&&(t.width=e.width),this.renderer.enableOutline(t)}else this.renderer.disableOutline();return this}updateSize(){this.renderer.setSize(this.WIDTH,this.HEIGHT),this.ASPECT=this.renderer.getAspect(this.WIDTH,this.HEIGHT),this.renderer.setSize(this.WIDTH,this.HEIGHT),this.camera.aspect=this.ASPECT,this.camera.updateProjectionMatrix()}setWidth(e){return this.WIDTH=e||this.WIDTH,this.updateSize(),this}setHeight(e){return this.HEIGHT=e||this.HEIGHT,this.updateSize(),this}resize(){this.WIDTH=this.getWidth(),this.HEIGHT=this.getHeight();let e=!1;if(this.renderer.isLost()&&this.WIDTH>0&&this.HEIGHT>0&&(this.container.querySelector("canvas").remove(),this.setupRenderer(),this.initContainer(this.container),e=!0),0==this.WIDTH||0==this.HEIGHT?this.animated&&this._viewer.pauseAnimate():this.animated&&this._viewer.resumeAnimate(),this.updateSize(),e){let e=this.renderer.supportedExtensions();e.regen=!0,this._viewer.render(null,e)}else this.show();return this}getModel(e){return void 0===e?0==this.models.length?null:this.models[this.models.length-1]:e instanceof h.GLModel?e:e in this.models?this.models[e]:0==this.models.length?null:this.models[this.models.length-1]}spin(e,t=1){if(clearInterval(this.spinInterval),void 0===e&&(e="y"),"boolean"==typeof e){if(!e)return;e="y"}Array.isArray(e)&&(e={x:e[0],y:e[1],z:e[2]});var r=this;this.spinInterval=setInterval((function(){!r.getCanvas().isConnected&&r.renderer.isLost()&&clearInterval(r.spinInterval),r.rotate(1*t,e)}),25)}animateMotion(e,t,r,s,a,n){var o=Math.ceil(e/20);o<1&&(o=1),this.incAnim();var l={mpos:this.modelGroup.position.clone(),rz:this.rotationGroup.position.z,rot:this.rotationGroup.quaternion.clone(),cam:this.lookingAt.clone()};if(t){let e=new Array(o);for(let t=0;t=0&&(this.modelGroup.remove(this.labels[r].sprite),(this.viewer_frame<0||this.labels[r].frame==this.viewer_frame)&&this.modelGroup.add(this.labels[r].sprite));for(r in this.surfaces)if(this.surfaces.hasOwnProperty(r)){var o=this.surfaces[r];for(a=0;a1||1==o[a].symmetries.length&&!o[a].symmetries[a].isIdentity()){var c,u=new s.Object3D;for(c=0;c0?this.animateMotion(t,r,this.modelGroup.position,this.adjustZoomToLimits(a),this.rotationGroup.quaternion,this.lookingAt):(this.rotationGroup.position.z=this.adjustZoomToLimits(a),this.show()),this}translate(e,t,r=0,s=!1){var n=e/this.WIDTH,o=t/this.HEIGHT,l=new a.Vector3(0,0,-this.CAMERA_Z);this.projector.projectVector(l,this.camera),l.x-=n,l.y-=o,this.projector.unprojectVector(l,this.camera),l.z=0;var h=this.lookingAt.clone().add(l);return r>0?this.animateMotion(r,s,this.modelGroup.position,this.rotationGroup.position.z,this.rotationGroup.quaternion,h):(this.lookingAt=h,this.camera.lookAt(this.lookingAt),this.show()),this}translateScene(e,t,r=0,s=!1){var a=this.screenOffsetToModel(e,t),n=this.modelGroup.position.clone().add(a);return r>0?this.animateMotion(r,s,this.modelGroup.position,this.rotationGroup.position.z,this.rotationGroup.quaternion,this.lookingAt):(this.modelGroup.position=n,this.show()),this}fitSlab(e){e=e||{};var t=this.getAtomsFromSel(e),r=(0,o.getExtent)(t),s=r[1][0]-r[0][0],a=r[1][1]-r[0][1],n=r[1][2]-r[0][2],l=Math.hypot(s,a,n);return l<5&&(l=5),this.slabNear=-l/1.9,this.slabFar=l/2,this}center(e={},t=0,r=!1){var s,n,l=this.getAtomsFromSel(e),h=(0,o.getExtent)(l);(0,o.isEmptyObject)(e)?(this.shapes.forEach((e=>{if(e&&e.boundingSphere&&e.boundingSphere.center){var t=e.boundingSphere.center,r=e.boundingSphere.radius;r>0?(l.push(new a.Vector3(t.x+r,t.y,t.z)),l.push(new a.Vector3(t.x-r,t.y,t.z)),l.push(new a.Vector3(t.x,t.y+r,t.z)),l.push(new a.Vector3(t.x,t.y-r,t.z)),l.push(new a.Vector3(t.x,t.y,t.z+r)),l.push(new a.Vector3(t.x,t.y,t.z-r))):l.push(t)}})),h=(0,o.getExtent)(l),s=l,n=h):(s=this.getAtomsFromSel({}),n=(0,o.getExtent)(s));var c=new a.Vector3(h[2][0],h[2][1],h[2][2]),u=n[1][0]-n[0][0],f=n[1][1]-n[0][1],p=n[1][2]-n[0][2],g=Math.hypot(u,f,p);g<5&&(g=5),this.slabNear=-g/1.9,this.slabFar=g/2,u=h[1][0]-h[0][0],f=h[1][1]-h[0][1],p=h[1][2]-h[0][2],(g=Math.hypot(u,f,p))<5&&(g=5);for(var v=25,_=0;_v&&(v=y)}g=2*Math.sqrt(v);var b=c.clone().multiplyScalar(-1);return t>0?this.animateMotion(t,r,b,this.rotationGroup.position.z,this.rotationGroup.quaternion,this.lookingAt):(this.modelGroup.position=b,this.show()),this}zoomTo(e={},t=0,r=!1){let s=this.getAtomsFromSel(e),n=(0,o.getExtent)(s),l=n;if((0,o.isEmptyObject)(e)){let e=s&&s.length;if(this.shapes.forEach((e=>{if(e&&e.boundingSphere)if(e.boundingSphere.box){let t=e.boundingSphere.box;s.push(new a.Vector3(t.min.x,t.min.y,t.min.z)),s.push(new a.Vector3(t.max.x,t.max.y,t.max.z))}else if(e.boundingSphere.center){var t=e.boundingSphere.center,r=e.boundingSphere.radius;r>0?(s.push(new a.Vector3(t.x+r,t.y,t.z)),s.push(new a.Vector3(t.x-r,t.y,t.z)),s.push(new a.Vector3(t.x,t.y+r,t.z)),s.push(new a.Vector3(t.x,t.y-r,t.z)),s.push(new a.Vector3(t.x,t.y,t.z+r)),s.push(new a.Vector3(t.x,t.y,t.z-r))):s.push(t)}})),l=(0,o.getExtent)(s),!e)for(let e=0;e<3;e++)n[2][e]=(l[0][e]+l[1][e])/2}else{let e=this.getAtomsFromSel({});l=(0,o.getExtent)(e)}var h=new a.Vector3(n[2][0],n[2][1],n[2][2]),c=l[1][0]-l[0][0],u=l[1][1]-l[0][1],f=l[1][2]-l[0][2],p=Math.hypot(c,u,f);p<5&&(p=5),this.slabNear=-p/1.9,this.slabFar=p/2,0===Object.keys(e).length&&(this.slabNear=Math.min(2*-p,-50),this.slabFar=Math.max(2*p,50));var g=this.config.minimumZoomToDistance||5;c=n[1][0]-n[0][0],u=n[1][1]-n[0][1],f=n[1][2]-n[0][2],(p=Math.hypot(c,u,f))v&&(v=y)}p=2*Math.sqrt(v);var b=h.clone().multiplyScalar(-1),w=-(.5*p/Math.tan(Math.PI/180*this.camera.fov/2)-this.CAMERA_Z);return w=this.adjustZoomToLimits(w),t>0?this.animateMotion(t,r,b,w,this.rotationGroup.quaternion,this.lookingAt):(this.modelGroup.position=b,this.rotationGroup.position.z=w,this.show()),this}setSlab(e,t){this.slabNear=e,this.slabFar=t}getSlab(){return{near:this.slabNear,far:this.slabFar}}addLabel(e,t={},r,s=!1){if(r){var a=(0,o.getExtent)(this.getAtomsFromSel(r));t.position={x:a[2][0],y:a[2][1],z:a[2][2]}}var n=new c.Label(e,t);return n.setContext(),this.modelGroup.add(n.sprite),this.labels.push(n),s||this.show(),n}addResLabels(e,t,r=!1){let s=this.labels.length;return this.applyToModels("addResLabels",e,this,t,r),this.show(),this.labels.slice(s)}addPropertyLabels(e,t,r){return this.applyToModels("addPropertyLabels",e,t,this,r),this.show(),this}removeLabel(e){for(var t=0;t0&&void 0===this.shapes[this.shapes.length-1];)this.shapes.pop();return this}removeAllShapes(){for(var e=0;en){e.start=r,e.end=s,t.addLine(e);break}f.addVectors(r,c),e.start=r,e.end=f,t.addLine(e),r=f.clone(),p+=o,f.addVectors(r,u),r=f.clone(),p+=l}return t.finalize(),t}addCustom(e){e=e||{};var t=new u.GLShape(e);return t.shapePosition=this.shapes.length,t.addCustom(e),this.shapes.push(t),t.finalize(),t}addVolumetricData(e,t,r={}){var s=new f.VolumeData(e,t);return r.hasOwnProperty("transferfn")?this.addVolumetricRender(s,r):this.addIsosurface(s,r)}addIsosurface(e,t={},r){var s=new u.GLShape(t);return s.shapePosition=this.shapes.length,s.addIsosurface(e,t,r),this.shapes.push(s),s}addVolumetricRender(e,t){t=t||{};var r=new g.GLVolumetricRender(e,t);return r.shapePosition=this.shapes.length,this.shapes.push(r),r}hasVolumetricRender(){return this.renderer.supportsVolumetric()}enableFog(e){e?this.scene.fog=new s.Fog(this.bgColor,100,200):(this.config.disableFog=!0,this.show())}setFrame(e){this.viewer_frame=e;let t=this;return new Promise((function(r){var s=t.models.map((function(r){return r.setFrame(e,t)}));Promise.all(s).then((function(){r()}))}))}getFrame(){return this.viewer_frame}getNumFrames(){var e=0;for(let t=0;te&&(e=this.models[t].getNumFrames());for(let t=0;t=e&&(e=this.shapes[t].frame+1);for(let t=0;t=e&&(e=this.labels[t].frame+1);return e}animate(e){this.incAnim();var t=100,r="forward",s=0;(e=e||{}).interval&&(t=e.interval),e.loop&&(r=e.loop),e.reps&&(s=e.reps);var a=this.getNumFrames(),n=this,l=0;e.startFrame&&(l=e.startFrame%a);var h=1;e.step&&(s/=h=e.step);var c,u,f=0,p=a*s,g=new Date,v=function(e){g=new Date,"forward"==e?n.setFrame(l).then((function(){l=(l+h)%a,c()})):"backward"==e?n.setFrame(a-1-l).then((function(){l=(l+h)%a,c()})):n.setFrame(l).then((function(){h*=(l+=h)%(a-1)==0?-1:1,c()}))};return c=function(){if(n.render(),n.getCanvas().isConnected)if(++f!=p&&n.isAnimated()){var e=t-((new Date).getTime()-g.getTime());e=e>0?e:0,n.animationTimers.delete(u),u=new o.PausableTimer(v,e,r),n.animationTimers.add(u)}else u.cancel(),n.animationTimers.delete(u),n.decAnim();else n.stopAnimate()},u=new o.PausableTimer(v,0,r),this.animationTimers.add(u),this}stopAnimate(){return this.animated=0,this.animationTimers.forEach((function(e){e.cancel()})),this.animationTimers=new Set,this}pauseAnimate(){return this.animationTimers.forEach((function(e){e.pause()})),this}resumeAnimate(){return this.animationTimers.forEach((function(e){e.resume()})),this}isAnimated(){return this.animated>0}addModel(e,t="",r){r&&!r.defaultcolors?(r.defaultcolors=this.defaultcolors,r.cartoonQuality=r.cartoonQuality||this.config.cartoonQuality):void 0===r&&(r={defaultcolors:this.defaultcolors,cartoonQuality:this.config.cartoonQuality});var s=new h.GLModel(this.models.length,r);return s.addMolData(e,t,r),this.models.push(s),s}addModels(e,t,r){(r=r||{}).multimodel=!0,r.frames=!0;for(var s=h.GLModel.parseMolData(e,t,r),a=0;a0&&void 0===this.models[this.models.length-1];)this.models.pop();return this}}removeAllModels(){for(var e=0;et[1][0]||s.yt[1][1]||s.zt[1][2]||r.push(s))}return r}static volume(e){return(e[1][0]-e[0][0])*(e[1][1]-e[0][1])*(e[1][2]-e[0][2])}carveUpExtent(e,t,r){let s=[],a={};for(let e=0,r=t.length;es&&r>a?0:s>r&&s>a?1:2;var n=o(e),h=o(e),c=(e[1][t]-e[0][t])/2+e[0][t];n[1][t]=c,h[0][t]=c;var u=l(n),f=l(h);return u.concat(f)},h=l(e);for(let e=0,a=h.length;e0)for(let e=0,t=f.length;e1||1==C.length&&!C[0].isIdentity()){A=!0;break}}var S=function(e,r,s){var a;b=h?GLViewer.shallowCopy(v.getAtomsFromSel(h)):s;var n=(0,o.getExtent)(s,!0);if(t.map&&t.map.prop){var c=t.map.prop;let e=(0,l.getGradient)(t.map.scheme||t.map.gradient||new l.Gradient.RWB),r=e.range();r||(r=(0,o.getPropertyRange)(s,c)),t.colorscheme={prop:c,gradient:e}}for(let e=0,s=r.length;e0){var x=(0,o.getExtent)(b,!0);w.sort((function(e,t){var r=function(e,t){var r=e.extent,s=r[1][0]-r[0][0],a=r[1][1]-r[0][1],n=r[1][2]-r[0][2],o=s-t[2][0];o*=o;var l=a-t[2][1];l*=l;var h=n-t[2][2];return o+l+(h*=h)};return r(e,x)-r(t,x)}))}var A=[];for(let e=0,t=r.length;e0&&(M.push({geo:new s.Geometry(!0),mat:g,done:!1,finished:!1,symmetries:this.models[x].getSymmetries()}),T.push(S(M[M.length-1],L[x],E[x])));z=Promise.all(T)}else M.push({geo:new s.Geometry(!0),mat:g,done:!1,finished:!1,symmetries:[new a.Matrix4]}),z=S(M[M.length-1],y,w);return this.surfaces[f]=M,z.surfid=f,c&&"function"==typeof c?(z.then((function(e){c(e)})),f):z}setSurfaceMaterialStyle(e,t){if((0,o.adjustVolumeStyle)(t),this.surfaces[e]){var r=this.surfaces[e];r.style=t;for(var a=0;a0?this.camera.position.x=r*Math.tan(Math.PI/180*t):this.camera.position.x=-r*Math.tan(Math.PI/180*t),this.camera.lookAt(new a.Vector3(0,0,this.rotationGroup.position.z)),this.camera.position.x}setDefaultCartoonQuality(e){this.config.cartoonQuality=e}}function _(e,t){if(e=(0,o.getElement)(e)){t=t||{};try{return new GLViewer(e,t)}catch(e){throw"error creating viewer: "+e}}}function y(e,t={},r={}){if(e=(0,o.getElement)(e)){var s=[],a=document.createElement("canvas");r.rows=t.rows,r.cols=t.cols,r.control_all=null!=t.control_all&&t.control_all,e.appendChild(a);try{for(var n=0;n{"use strict";r.r(t),r.d(t,{CustomLinear:()=>CustomLinear,Gradient:()=>Gradient,GradientType:()=>GradientType,ROYGB:()=>ROYGB,RWB:()=>RWB,Sinebow:()=>Sinebow,builtinGradients:()=>o,getGradient:()=>n,normalizeValue:()=>a});var s=r(2550);class GradientType{}function a(e,t,r){return t>=e?(rt&&(r=t),{lo:e,hi:t,val:r}):(r>e&&(r=e),r=2?(this.max=e[1],this.min=e[0]):e&&t&&!Array.isArray(e)&&(this.min=e,this.max=t)}range(){return void 0!==this.min&&void 0!==this.max?[this.min,this.max]:null}valueToHex(e,t){var r,s;if(e=this.mult*e,t?(r=t[0],s=t[1]):(r=this.min,s=this.max),void 0===e)return 16777215;var n=a(r,s,e);r=n.lo;var o,l=((s=n.hi)+r)/2;return(e=n.val)<(l=t&&void 0!==t[2]?t[2]:void 0!==this.mid?this.mid:(r+s)/2)?16711680+256*(o=Math.floor(255*Math.sqrt((e-r)/(l-r))))+o:e>l?65536*(o=Math.floor(255*Math.sqrt(1-(e-l)/(s-l))))+256*o+255:16777215}}class ROYGB extends GradientType{constructor(e,t){super(),this.gradient="ROYGB",this.mult=1,this.min=e,this.max=t,void 0===t&&Array.isArray(e)&&e.length>=2?(this.max=e[1],this.min=e[0]):e&&t&&!Array.isArray(e)&&(this.min=e,this.max=t)}valueToHex(e,t){var r,s;if(e=this.mult*e,t?(r=t[0],s=t[1]):(r=this.min,s=this.max),void 0===e)return 16777215;var n=a(r,s,e),o=((r=n.lo)+(s=n.hi))/2,l=(r+o)/2,h=(o+s)/2;return(e=n.val)=2&&(this.max=e[1],this.min=e[0]),t=2?(this.max=e[1],this.min=e[0],a=t):(this.min=e,this.max=t,a=r),a)for(let e of a)this.colors.push(s.CC.color(e));else this.colors.push(s.CC.color(0))}range(){return void 0!==this.min&&void 0!==this.max?[this.min,this.max]:null}valueToHex(e,t){var r,n;if(t?(r=t[0],n=t[1]):(r=this.min,n=this.max),void 0===e)return 16777215;var o=a(r,n,e);r=o.lo,n=o.hi,e=o.val;let l=this.colors.length,h=(n-r)/l,c=Math.min(Math.floor((e-r)/h),l-1),u=Math.min(c+1,l-1),f=(e-r-c*h)/h,p=this.colors[c],g=this.colors[u];return new s.Color(p.r+f*(g.r-p.r),p.g+f*(g.g-p.g),p.b+f*(g.b-p.b)).getHex()}}const o={rwb:RWB,RWB,roygb:ROYGB,ROYGB,sinebow:Sinebow,linear:CustomLinear};class Gradient extends GradientType{valueToHex(e,t){return 0}range(){return null}}Gradient.RWB=RWB,Gradient.ROYGB=ROYGB,Gradient.Sinebow=Sinebow,Gradient.CustomLinear=CustomLinear,Gradient.builtinGradients=o,Gradient.normalizeValue=a,Gradient.getGradient=n},7825:(e,t,r)=>{"use strict";r.r(t),r.d(t,{Label:()=>Label,LabelCount:()=>o});var s=r(7693),a=r(1460),n=r(2550);let o=0;function l(e,t,r){var s=r;return void 0!==e&&(e instanceof n.Color?s=e.scaled():void 0!==(s=n.CC.color(e)).scaled&&(s=s.scaled())),void 0!==t&&(s.a=parseFloat(t)),s}class Label{constructor(e,t){this.id=o++,this.stylespec=t||{},this.canvas=document.createElement("canvas"),this.canvas.width=134,this.canvas.height=35,this.context=this.canvas.getContext("2d"),this.sprite=new s.Sprite,this.text=e,this.frame=this.stylespec.frame}getStyle(){return this.stylespec}setContext(){var e=this.stylespec,t=void 0!==e.useScreen&&e.useScreen,r=e.showBackground;"0"!==r&&"false"!==r||(r=!1),void 0===r&&(r=!0);var n=e.font?e.font:"sans-serif",o=parseInt(e.fontSize)?parseInt(e.fontSize):18,h=l(e.fontColor,e.fontOpacity,{r:255,g:255,b:255,a:1}),c=e.padding?e.padding:4,u=e.borderThickness?e.borderThickness:0,f=l(e.backgroundColor,e.backgroundOpacity,{r:0,g:0,b:0,a:1}),p=l(e.borderColor,e.borderOpacity,f),g=e.position?e.position:{x:-10,y:1,z:1},v=void 0===e.inFront||e.inFront;"false"!==v&&"0"!==v||(v=!1);var _=e.alignment||s.SpriteAlignment.topLeft;"string"==typeof _&&_ in s.SpriteAlignment&&(_=s.SpriteAlignment[_]);var y="";e.bold&&(y="bold "),this.context.font=y+o+"px "+n;var b=this.context.measureText(this.text).width;r||(u=0);var w=b+2.5*u+2*c,x=1.25*o+2*u+2*c;if(e.backgroundImage){var A=e.backgroundImage,C=e.backgroundWidth?e.backgroundWidth:A.width,S=e.backgroundHeight?e.backgroundHeight:A.height;C>w&&(w=C),S>x&&(x=S)}if(this.canvas.width=w,this.canvas.height=x,this.context.clearRect(0,0,this.canvas.width,this.canvas.height),y="",e.bold&&(y="bold "),this.context.font=y+o+"px "+n,this.context.fillStyle="rgba("+f.r+","+f.g+","+f.b+","+f.a+")",this.context.strokeStyle="rgba("+p.r+","+p.g+","+p.b+","+p.a+")",e.backgroundGradient){let t=this.context.createLinearGradient(0,x/2,w,x/2),r=a.Gradient.getGradient(e.backgroundGradient),s=r.range(),n=-1,o=1;s&&(n=s[0],o=s[1]);let h=o-n;for(let e=0;e<1.01;e+=.1){let s=l(r.valueToHex(n+h*e)),a="rgba("+s.r+","+s.g+","+s.b+","+s.a+")";t.addColorStop(e,a)}this.context.fillStyle=t}this.context.lineWidth=u,r&&function(e,t,r,s,a,n,o){e.beginPath(),e.moveTo(t+n,r),e.lineTo(t+s-n,r),e.quadraticCurveTo(t+s,r,t+s,r+n),e.lineTo(t+s,r+a-n),e.quadraticCurveTo(t+s,r+a,t+s-n,r+a),e.lineTo(t+n,r+a),e.quadraticCurveTo(t,r+a,t,r+a-n),e.lineTo(t,r+n),e.quadraticCurveTo(t,r,t+n,r),e.closePath(),e.fill(),o&&e.stroke()}(this.context,u,u,w-2*u,x-2*u,6,u>0),e.backgroundImage&&this.context.drawImage(A,0,0,w,x),this.context.fillStyle="rgba("+h.r+","+h.g+","+h.b+","+h.a+")",this.context.fillText(this.text,u+c,o+u+c,b);var M=new s.Texture(this.canvas);M.needsUpdate=!0,this.sprite.material=new s.SpriteMaterial({map:M,useScreenCoordinates:t,alignment:_,depthTest:!v,screenOffset:e.screenOffset||null}),this.sprite.scale.set(1,1,1),this.sprite.position.set(g.x,g.y,g.z)}dispose(){void 0!==this.sprite.material.map&&this.sprite.material.map.dispose(),void 0!==this.sprite.material&&this.sprite.material.dispose()}}},9192:(e,t,r)=>{"use strict";r.r(t),r.d(t,{MarchingCube:()=>MarchingCube,MarchingCubeInitializer:()=>MarchingCubeInitializer,PointGrid:()=>PointGrid,ProteinSurface:()=>ProteinSurface,SurfaceType:()=>s,setSyncSurface:()=>o,syncSurface:()=>n});var s,a=r(9652);!function(e){e[e.VDW=1]="VDW",e[e.MS=2]="MS",e[e.SAS=3]="SAS",e[e.SES=4]="SES"}(s||(s={}));var n=!1;function o(e){n=e}(window.navigator.userAgent.indexOf("MSIE ")>=0||window.navigator.userAgent.indexOf("Trident/")>=0)&&(n=!0);class MarchingCubeInitializer{constructor(){this.ISDONE=2,this.edgeTable=new Uint32Array([0,0,0,0,0,0,0,2816,0,0,0,1792,0,3328,3584,3840,0,0,0,138,0,21,0,134,0,0,0,652,0,2067,3865,3600,0,0,0,42,0,0,0,294,0,0,21,28,0,3875,1049,3360,0,168,162,170,0,645,2475,2210,0,687,293,172,4010,3747,3497,3232,0,0,0,0,0,69,0,900,0,0,0,1792,138,131,1608,1920,0,81,0,2074,84,85,84,86,0,81,0,3676,330,1105,1881,1616,0,0,0,42,0,69,0,502,0,0,21,3580,138,2035,1273,1520,2816,104,2337,106,840,581,367,102,2816,3695,3429,3180,1898,1635,1385,1120,0,0,0,0,0,0,0,3910,0,0,69,588,42,2083,41,2880,0,0,0,1722,0,2293,4095,3830,0,255,757,764,2538,2291,3065,2800,0,0,81,338,0,3925,1119,3414,84,855,85,340,2130,2899,89,2384,1792,712,194,1162,4036,3781,3535,3270,708,719,197,204,3018,2755,2505,2240,0,0,0,0,168,420,168,1958,162,162,676,2988,170,163,680,928,3328,3096,3328,3642,52,53,1855,1590,2340,2111,2869,2620,298,51,825,560,3584,3584,3090,3482,1668,1941,1183,1430,146,2975,2069,2460,154,915,153,400,3840,3592,3329,3082,1796,1541,1295,1030,2818,2575,2309,2060,778,515,265,0]),this.triTable=[[],[],[],[],[],[],[],[11,9,8],[],[],[],[8,10,9],[],[10,8,11],[9,11,10],[8,10,9,8,11,10],[],[],[],[1,7,3],[],[4,2,0],[],[2,1,7],[],[],[],[2,7,3,2,9,7],[],[1,4,11,1,0,4],[3,8,0,11,9,4,11,10,9],[4,11,9,11,10,9],[],[],[],[5,3,1],[],[],[],[2,5,8,2,1,5],[],[],[2,4,0],[3,2,4],[],[0,9,1,8,10,5,8,11,10],[3,4,0,3,10,4],[5,8,10,8,11,10],[],[3,5,7],[7,1,5],[1,7,3,1,5,7],[],[9,2,0,9,7,2],[0,3,8,1,7,11,1,5,7],[11,1,7,1,5,7],[],[9,1,0,5,3,2,5,7,3],[8,2,5,8,0,2],[2,5,3,5,7,3],[3,9,1,3,8,9,7,11,10,7,10,5],[9,1,0,10,7,11,10,5,7],[3,8,0,7,10,5,7,11,10],[11,5,7,11,10,5],[],[],[],[],[],[0,6,2],[],[7,2,9,7,9,8],[],[],[],[8,10,9],[7,1,3],[7,1,0],[6,9,3,6,10,9],[7,10,8,10,9,8],[],[6,0,4],[],[11,1,4,11,3,1],[2,4,6],[2,0,4,2,4,6],[2,4,6],[1,4,2,4,6,2],[],[6,0,4],[],[2,11,3,6,9,4,6,10,9],[8,6,1,8,1,3],[10,0,6,0,4,6],[8,0,3,9,6,10,9,4,6],[10,4,6,10,9,4],[],[],[],[5,3,1],[],[0,6,2],[],[7,4,8,5,2,1,5,6,2],[],[],[2,4,0],[7,4,8,2,11,3,10,5,6],[7,1,3],[5,6,10,0,9,1,8,7,4],[5,6,10,7,0,3,7,4,0],[10,5,6,4,8,7],[9,11,8],[3,5,6],[0,5,11,0,11,8],[6,3,5,3,1,5],[3,9,6,3,8,9],[9,6,0,6,2,0],[0,3,8,2,5,6,2,1,5],[1,6,2,1,5,6],[9,11,8],[1,0,9,6,10,5,11,3,2],[6,10,5,2,8,0,2,11,8],[3,2,11,10,5,6],[10,5,6,9,3,8,9,1,3],[0,9,1,5,6,10],[8,0,3,10,5,6],[10,5,6],[],[],[],[],[],[],[],[1,10,2,9,11,6,9,8,11],[],[],[6,0,2],[3,6,9,3,2,6],[3,5,1],[0,5,1,0,11,5],[0,3,5],[6,9,11,9,8,11],[],[],[],[4,5,9,7,1,10,7,3,1],[],[11,6,7,2,4,5,2,0,4],[11,6,7,8,0,3,1,10,2,9,4,5],[6,7,11,1,10,2,9,4,5],[],[4,1,0,4,5,1,6,7,3,6,3,2],[9,4,5,0,6,7,0,2,6],[4,5,9,6,3,2,6,7,3],[6,7,11,5,3,8,5,1,3],[6,7,11,4,1,0,4,5,1],[4,5,9,3,8,0,11,6,7],[9,4,5,7,11,6],[],[],[0,6,4],[8,6,4,8,1,6],[],[0,10,2,0,9,10,4,8,11,4,11,6],[10,2,1,6,0,3,6,4,0],[10,2,1,11,4,8,11,6,4],[4,2,6],[1,0,9,2,4,8,2,6,4],[2,4,0,2,6,4],[8,2,4,2,6,4],[11,4,1,11,6,4],[0,9,1,4,11,6,4,8,11],[3,6,0,6,4,0],[8,6,4,8,11,6],[10,8,9],[6,3,9,6,7,3],[6,7,1],[10,7,1,7,3,1],[7,11,6,8,10,2,8,9,10],[11,6,7,10,0,9,10,2,0],[2,1,10,7,11,6,8,0,3],[1,10,2,6,7,11],[7,2,6,7,9,2],[1,0,9,3,6,7,3,2,6],[7,0,6,0,2,6],[2,7,3,2,6,7],[7,11,6,3,9,1,3,8,9],[9,1,0,11,6,7],[0,3,8,11,6,7],[11,6,7],[],[],[],[],[5,3,7],[8,5,2,8,7,5],[5,3,7],[1,10,2,5,8,7,5,9,8],[1,7,5],[1,7,5],[9,2,7,9,7,5],[11,3,2,8,5,9,8,7,5],[1,3,7,1,7,5],[0,7,1,7,5,1],[9,3,5,3,7,5],[9,7,5,9,8,7],[8,10,11],[3,4,10,3,10,11],[8,10,11],[5,9,4,1,11,3,1,10,11],[2,4,5],[5,2,4,2,0,4],[0,3,8,5,9,4,10,2,1],[2,1,10,9,4,5],[2,8,5,2,11,8],[3,2,11,1,4,5,1,0,4],[9,4,5,8,2,11,8,0,2],[11,3,2,9,4,5],[8,5,3,5,1,3],[5,0,4,5,1,0],[3,8,0,4,5,9],[9,4,5],[11,9,10],[11,9,10],[1,11,4,1,10,11],[8,7,4,11,1,10,11,3,1],[2,7,9,2,9,10],[4,8,7,0,10,2,0,9,10],[2,1,10,0,7,4,0,3,7],[10,2,1,8,7,4],[1,7,4],[3,2,11,4,8,7,9,1,0],[11,4,2,4,0,2],[2,11,3,7,4,8],[4,1,7,1,3,7],[1,0,9,8,7,4],[3,4,0,3,7,4],[8,7,4],[8,9,10,8,10,11],[3,9,11,9,10,11],[0,10,8,10,11,8],[10,3,1,10,11,3],[2,8,10,8,9,10],[9,2,0,9,10,2],[8,0,3,1,10,2],[10,2,1],[1,11,9,11,8,9],[11,3,2,0,9,1],[11,0,2,11,8,0],[11,3,2],[8,1,3,8,9,1],[9,1,0],[8,0,3],[]],this.edgeTable2=[0,265,515,778,2060,2309,2575,2822,1030,1295,1541,1804,3082,3331,3593,3840,400,153,915,666,2460,2197,2975,2710,1430,1183,1941,1692,3482,3219,3993,3728,560,825,51,314,2620,2869,2111,2358,1590,1855,1077,1340,3642,3891,3129,3376,928,681,419,170,2988,2725,2479,2214,1958,1711,1445,1196,4010,3747,3497,3232,2240,2505,2755,3018,204,453,719,966,3270,3535,3781,4044,1226,1475,1737,1984,2384,2137,2899,2650,348,85,863,598,3414,3167,3925,3676,1370,1107,1881,1616,2800,3065,2291,2554,764,1013,255,502,3830,4095,3317,3580,1786,2035,1273,1520,2912,2665,2403,2154,876,613,367,102,3942,3695,3429,3180,1898,1635,1385,1120,1120,1385,1635,1898,3180,3429,3695,3942,102,367,613,876,2154,2403,2665,2912,1520,1273,2035,1786,3580,3317,4095,3830,502,255,1013,764,2554,2291,3065,2800,1616,1881,1107,1370,3676,3925,3167,3414,598,863,85,348,2650,2899,2137,2384,1984,1737,1475,1226,4044,3781,3535,3270,966,719,453,204,3018,2755,2505,2240,3232,3497,3747,4010,1196,1445,1711,1958,2214,2479,2725,2988,170,419,681,928,3376,3129,3891,3642,1340,1077,1855,1590,2358,2111,2869,2620,314,51,825,560,3728,3993,3219,3482,1692,1941,1183,1430,2710,2975,2197,2460,666,915,153,400,3840,3593,3331,3082,1804,1541,1295,1030,2822,2575,2309,2060,778,515,265,0],this.triTable2=[[],[8,3,0],[9,0,1],[8,3,1,8,1,9],[11,2,3],[11,2,0,11,0,8],[11,2,3,0,1,9],[2,1,11,1,9,11,11,9,8],[10,1,2],[8,3,0,1,2,10],[9,0,2,9,2,10],[3,2,8,2,10,8,8,10,9],[10,1,3,10,3,11],[1,0,10,0,8,10,10,8,11],[0,3,9,3,11,9,9,11,10],[8,10,9,8,11,10],[8,4,7],[3,0,4,3,4,7],[1,9,0,8,4,7],[9,4,1,4,7,1,1,7,3],[2,3,11,7,8,4],[7,11,4,11,2,4,4,2,0],[3,11,2,4,7,8,9,0,1],[2,7,11,2,1,7,1,4,7,1,9,4],[10,1,2,8,4,7],[2,10,1,0,4,7,0,7,3],[4,7,8,0,2,10,0,10,9],[2,7,3,2,9,7,7,9,4,2,10,9],[8,4,7,11,10,1,11,1,3],[11,4,7,1,4,11,1,11,10,1,0,4],[3,8,0,7,11,4,11,9,4,11,10,9],[7,11,4,4,11,9,11,10,9],[9,5,4],[3,0,8,4,9,5],[5,4,0,5,0,1],[4,8,5,8,3,5,5,3,1],[11,2,3,9,5,4],[9,5,4,8,11,2,8,2,0],[3,11,2,1,5,4,1,4,0],[8,5,4,2,5,8,2,8,11,2,1,5],[2,10,1,9,5,4],[0,8,3,5,4,9,10,1,2],[10,5,2,5,4,2,2,4,0],[3,4,8,3,2,4,2,5,4,2,10,5],[5,4,9,1,3,11,1,11,10],[0,9,1,4,8,5,8,10,5,8,11,10],[3,4,0,3,10,4,4,10,5,3,11,10],[4,8,5,5,8,10,8,11,10],[9,5,7,9,7,8],[0,9,3,9,5,3,3,5,7],[8,0,7,0,1,7,7,1,5],[1,7,3,1,5,7],[11,2,3,8,9,5,8,5,7],[9,2,0,9,7,2,2,7,11,9,5,7],[0,3,8,2,1,11,1,7,11,1,5,7],[2,1,11,11,1,7,1,5,7],[1,2,10,5,7,8,5,8,9],[9,1,0,10,5,2,5,3,2,5,7,3],[5,2,10,8,2,5,8,5,7,8,0,2],[10,5,2,2,5,3,5,7,3],[3,9,1,3,8,9,7,11,10,7,10,5],[9,1,0,10,7,11,10,5,7],[3,8,0,7,10,5,7,11,10],[11,5,7,11,10,5],[11,7,6],[0,8,3,11,7,6],[9,0,1,11,7,6],[7,6,11,3,1,9,3,9,8],[2,3,7,2,7,6],[8,7,0,7,6,0,0,6,2],[1,9,0,3,7,6,3,6,2],[7,6,2,7,2,9,2,1,9,7,9,8],[1,2,10,6,11,7],[2,10,1,7,6,11,8,3,0],[11,7,6,10,9,0,10,0,2],[7,6,11,3,2,8,8,2,10,8,10,9],[6,10,7,10,1,7,7,1,3],[6,10,1,6,1,7,7,1,0,7,0,8],[9,0,3,6,9,3,6,10,9,6,3,7],[6,10,7,7,10,8,10,9,8],[8,4,6,8,6,11],[11,3,6,3,0,6,6,0,4],[0,1,9,4,6,11,4,11,8],[1,9,4,11,1,4,11,3,1,11,4,6],[3,8,2,8,4,2,2,4,6],[2,0,4,2,4,6],[1,9,0,3,8,2,2,8,4,2,4,6],[9,4,1,1,4,2,4,6,2],[10,1,2,11,8,4,11,4,6],[10,1,2,11,3,6,6,3,0,6,0,4],[0,2,10,0,10,9,4,11,8,4,6,11],[2,11,3,6,9,4,6,10,9],[8,4,6,8,6,1,6,10,1,8,1,3],[1,0,10,10,0,6,0,4,6],[8,0,3,9,6,10,9,4,6],[10,4,6,10,9,4],[9,5,4,7,6,11],[4,9,5,3,0,8,11,7,6],[6,11,7,4,0,1,4,1,5],[6,11,7,4,8,5,5,8,3,5,3,1],[4,9,5,6,2,3,6,3,7],[9,5,4,8,7,0,0,7,6,0,6,2],[4,0,1,4,1,5,6,3,7,6,2,3],[7,4,8,5,2,1,5,6,2],[6,11,7,1,2,10,9,5,4],[11,7,6,8,3,0,1,2,10,9,5,4],[11,7,6,10,5,2,2,5,4,2,4,0],[7,4,8,2,11,3,10,5,6],[4,9,5,6,10,7,7,10,1,7,1,3],[5,6,10,0,9,1,8,7,4],[5,6,10,7,0,3,7,4,0],[10,5,6,4,8,7],[5,6,9,6,11,9,9,11,8],[0,9,5,0,5,3,3,5,6,3,6,11],[0,1,5,0,5,11,5,6,11,0,11,8],[11,3,6,6,3,5,3,1,5],[9,5,6,3,9,6,3,8,9,3,6,2],[5,6,9,9,6,0,6,2,0],[0,3,8,2,5,6,2,1,5],[1,6,2,1,5,6],[1,2,10,5,6,9,9,6,11,9,11,8],[1,0,9,6,10,5,11,3,2],[6,10,5,2,8,0,2,11,8],[3,2,11,10,5,6],[10,5,6,9,3,8,9,1,3],[0,9,1,5,6,10],[8,0,3,10,5,6],[10,5,6],[10,6,5],[8,3,0,10,6,5],[0,1,9,5,10,6],[10,6,5,9,8,3,9,3,1],[3,11,2,10,6,5],[6,5,10,2,0,8,2,8,11],[1,9,0,6,5,10,11,2,3],[1,10,2,5,9,6,9,11,6,9,8,11],[1,2,6,1,6,5],[0,8,3,2,6,5,2,5,1],[5,9,6,9,0,6,6,0,2],[9,6,5,3,6,9,3,9,8,3,2,6],[11,6,3,6,5,3,3,5,1],[0,5,1,0,11,5,5,11,6,0,8,11],[0,5,9,0,3,5,3,6,5,3,11,6],[5,9,6,6,9,11,9,8,11],[10,6,5,4,7,8],[5,10,6,7,3,0,7,0,4],[5,10,6,0,1,9,8,4,7],[4,5,9,6,7,10,7,1,10,7,3,1],[7,8,4,2,3,11,10,6,5],[11,6,7,10,2,5,2,4,5,2,0,4],[11,6,7,8,0,3,1,10,2,9,4,5],[6,7,11,1,10,2,9,4,5],[7,8,4,5,1,2,5,2,6],[4,1,0,4,5,1,6,7,3,6,3,2],[9,4,5,8,0,7,0,6,7,0,2,6],[4,5,9,6,3,2,6,7,3],[6,7,11,4,5,8,5,3,8,5,1,3],[6,7,11,4,1,0,4,5,1],[4,5,9,3,8,0,11,6,7],[9,4,5,7,11,6],[10,6,4,10,4,9],[8,3,0,9,10,6,9,6,4],[1,10,0,10,6,0,0,6,4],[8,6,4,8,1,6,6,1,10,8,3,1],[2,3,11,6,4,9,6,9,10],[0,10,2,0,9,10,4,8,11,4,11,6],[10,2,1,11,6,3,6,0,3,6,4,0],[10,2,1,11,4,8,11,6,4],[9,1,4,1,2,4,4,2,6],[1,0,9,3,2,8,2,4,8,2,6,4],[2,4,0,2,6,4],[3,2,8,8,2,4,2,6,4],[1,4,9,11,4,1,11,1,3,11,6,4],[0,9,1,4,11,6,4,8,11],[11,6,3,3,6,0,6,4,0],[8,6,4,8,11,6],[6,7,10,7,8,10,10,8,9],[9,3,0,6,3,9,6,9,10,6,7,3],[6,1,10,6,7,1,7,0,1,7,8,0],[6,7,10,10,7,1,7,3,1],[7,11,6,3,8,2,8,10,2,8,9,10],[11,6,7,10,0,9,10,2,0],[2,1,10,7,11,6,8,0,3],[1,10,2,6,7,11],[7,2,6,7,9,2,2,9,1,7,8,9],[1,0,9,3,6,7,3,2,6],[8,0,7,7,0,6,0,2,6],[2,7,3,2,6,7],[7,11,6,3,9,1,3,8,9],[9,1,0,11,6,7],[0,3,8,11,6,7],[11,6,7],[11,7,5,11,5,10],[3,0,8,7,5,10,7,10,11],[9,0,1,10,11,7,10,7,5],[3,1,9,3,9,8,7,10,11,7,5,10],[10,2,5,2,3,5,5,3,7],[5,10,2,8,5,2,8,7,5,8,2,0],[9,0,1,10,2,5,5,2,3,5,3,7],[1,10,2,5,8,7,5,9,8],[2,11,1,11,7,1,1,7,5],[0,8,3,2,11,1,1,11,7,1,7,5],[9,0,2,9,2,7,2,11,7,9,7,5],[11,3,2,8,5,9,8,7,5],[1,3,7,1,7,5],[8,7,0,0,7,1,7,5,1],[0,3,9,9,3,5,3,7,5],[9,7,5,9,8,7],[4,5,8,5,10,8,8,10,11],[3,0,4,3,4,10,4,5,10,3,10,11],[0,1,9,4,5,8,8,5,10,8,10,11],[5,9,4,1,11,3,1,10,11],[3,8,4,3,4,2,2,4,5,2,5,10],[10,2,5,5,2,4,2,0,4],[0,3,8,5,9,4,10,2,1],[2,1,10,9,4,5],[8,4,5,2,8,5,2,11,8,2,5,1],[3,2,11,1,4,5,1,0,4],[9,4,5,8,2,11,8,0,2],[11,3,2,9,4,5],[4,5,8,8,5,3,5,1,3],[5,0,4,5,1,0],[3,8,0,4,5,9],[9,4,5],[7,4,11,4,9,11,11,9,10],[3,0,8,7,4,11,11,4,9,11,9,10],[11,7,4,1,11,4,1,10,11,1,4,0],[8,7,4,11,1,10,11,3,1],[2,3,7,2,7,9,7,4,9,2,9,10],[4,8,7,0,10,2,0,9,10],[2,1,10,0,7,4,0,3,7],[10,2,1,8,7,4],[2,11,7,2,7,1,1,7,4,1,4,9],[3,2,11,4,8,7,9,1,0],[7,4,11,11,4,2,4,0,2],[2,11,3,7,4,8],[9,1,4,4,1,7,1,3,7],[1,0,9,8,7,4],[3,4,0,3,7,4],[8,7,4],[8,9,10,8,10,11],[0,9,3,3,9,11,9,10,11],[1,10,0,0,10,8,10,11,8],[10,3,1,10,11,3],[3,8,2,2,8,10,8,9,10],[9,2,0,9,10,2],[8,0,3,1,10,2],[10,2,1],[2,11,1,1,11,9,11,8,9],[11,3,2,0,9,1],[11,0,2,11,8,0],[11,3,2],[8,1,3,8,9,1],[9,1,0],[8,0,3],[]]}march(e,t,r,s){let n=!!s.fulltable,o=s.hasOwnProperty("origin")&&s.origin.hasOwnProperty("x")?s.origin:{x:0,y:0,z:0},l=!!s.voxel,h=s.matrix,c=s.nX||0,u=s.nY||0,f=s.nZ||0,p=s.scale||1,g=null;g=s.unitCube?s.unitCube:{x:p,y:p,z:p};let v,_,y=new Int32Array(c*u*f);for(v=0,_=y.length;v<_;++v)y[v]=-1;let b=function(e,r,s,n,c,p){let v={x:0,y:0,z:0},_=c;if(!!!(n&1<>2))+s+((2&t)>>1))*f+a+(1&t)]&this.ISDONE)<=3&&(t.push(t[s]),s=t.length-1,t.push(t[a]),a=t.length-1,t.push(t[n]),n=t.length-1),r.push(s),r.push(a),r.push(n)}}}laplacianSmooth(e,t,r){let s,a,n,o,l,h=new Array(t.length);for(s=0,a=t.length;s1e6&&(this.scaleFactor=this.defaultScaleFactor/2);let s=1/this.scaleFactor*5.5;this.pminx=e[0][0],this.pmaxx=e[1][0],this.pminy=e[0][1],this.pmaxy=e[1][1],this.pminz=e[0][2],this.pmaxz=e[1][2],t?(this.pminx-=this.probeRadius+s,this.pminy-=this.probeRadius+s,this.pminz-=this.probeRadius+s,this.pmaxx+=this.probeRadius+s,this.pmaxy+=this.probeRadius+s,this.pmaxz+=this.probeRadius+s):(this.pminx-=s,this.pminy-=s,this.pminz-=s,this.pmaxx+=s,this.pmaxy+=s,this.pmaxz+=s),this.pminx=Math.floor(this.pminx*this.scaleFactor)/this.scaleFactor,this.pminy=Math.floor(this.pminy*this.scaleFactor)/this.scaleFactor,this.pminz=Math.floor(this.pminz*this.scaleFactor)/this.scaleFactor,this.pmaxx=Math.ceil(this.pmaxx*this.scaleFactor)/this.scaleFactor,this.pmaxy=Math.ceil(this.pmaxy*this.scaleFactor)/this.scaleFactor,this.pmaxz=Math.ceil(this.pmaxz*this.scaleFactor)/this.scaleFactor,this.ptranx=-this.pminx,this.ptrany=-this.pminy,this.ptranz=-this.pminz,this.pLength=Math.ceil(this.scaleFactor*(this.pmaxx-this.pminx))+1,this.pWidth=Math.ceil(this.scaleFactor*(this.pmaxy-this.pminy))+1,this.pHeight=Math.ceil(this.scaleFactor*(this.pmaxz-this.pminz))+1,this.boundingatom(t),this.cutRadius=this.probeRadius*this.scaleFactor,this.vpBits=new Uint8Array(this.pLength*this.pWidth*this.pHeight),this.vpDistance=new Float64Array(this.pLength*this.pWidth*this.pHeight),this.vpAtomID=new Int32Array(this.pLength*this.pWidth*this.pHeight)}boundingatom(e){let t={};for(const r in this.vdwRadii){let s=this.vdwRadii[r];t[r]=e?(s+this.probeRadius)*this.scaleFactor+.5:s*this.scaleFactor+.5;let a=t[r]*t[r];this.widxz[r]=Math.floor(t[r])+1,this.depty[r]=new Int32Array(this.widxz[r]*this.widxz[r]);let n=0;for(let e=0;ea)this.depty[r][n]=-1;else{let e=Math.sqrt(a-s);this.depty[r][n]=Math.floor(e)}n++}}}fillvoxels(e,t){for(let e=0,t=this.vpBits.length;e=this.pLength||c>=this.pWidth||u>=this.pHeight)continue;let p=o*l+c*this.pHeight+u;if(this.vpBits[p]&this.INOUT){let o=t[this.vpAtomID[p]];if(o.serial!=e.serial){let t=r+g-Math.floor(.5+this.scaleFactor*(o.x+this.ptranx)),l=s+n-Math.floor(.5+this.scaleFactor*(o.y+this.ptrany)),h=a+v-Math.floor(.5+this.scaleFactor*(o.z+this.ptranz));g*g+n*n+v*v=this.pLength||c>=this.pWidth||u>=this.pHeight)continue;let p=o*l+c*this.pHeight+u;if(this.vpBits[p]&this.ISDONE){let o=t[this.vpAtomID[p]];if(o.serial!=e.serial){let t=s+g-Math.floor(.5+this.scaleFactor*(o.x+this.ptranx)),l=a+r-Math.floor(.5+this.scaleFactor*(o.y+this.ptrany)),h=n+v-Math.floor(.5+this.scaleFactor*(o.z+this.ptranz));g*g+r*r+v*v-1&&o-1&&h-1&&l=l)||(this.vpBits[e]|=this.ISBOUND))}fastoneshell(e,t){let r,s,a,n,o,l,h,c,u,f=[];if(0===e.length)return f;let p={ix:-1,iy:-1,iz:-1},g=this.pWidth*this.pHeight;for(let v=0,_=e.length;v<_;v++){r=e[v].ix,s=e[v].iy,a=e[v].iz,c=t.get(r,s,a);for(let e=0;e<6;e++)p.ix=r+this.nb[e][0],p.iy=s+this.nb[e][1],p.iz=a+this.nb[e][2],p.ix-1&&p.iy-1&&p.iz-1&&(u=p.ix*g+this.pHeight*p.iy+p.iz,this.vpBits[u]&this.INOUT&&!(this.vpBits[u]&this.ISDONE)?(t.set(p.ix,p.iy,a+this.nb[e][2],c),n=p.ix-c.ix,o=p.iy-c.iy,l=p.iz-c.iz,h=n*n+o*o+l*l,this.vpDistance[u]=h,this.vpBits[u]|=this.ISDONE,this.vpBits[u]|=this.ISBOUND,f.push({ix:p.ix,iy:p.iy,iz:p.iz})):this.vpBits[u]&this.INOUT&&this.vpBits[u]&this.ISDONE&&(n=p.ix-c.ix,o=p.iy-c.iy,l=p.iz-c.iz,h=n*n+o*o+l*l,h-1&&p.iy-1&&p.iz-1&&(u=p.ix*g+this.pHeight*p.iy+p.iz,this.vpBits[u]&this.INOUT&&!(this.vpBits[u]&this.ISDONE)?(t.set(p.ix,p.iy,a+this.nb[e][2],c),n=p.ix-c.ix,o=p.iy-c.iy,l=p.iz-c.iz,h=n*n+o*o+l*l,this.vpDistance[u]=h,this.vpBits[u]|=this.ISDONE,this.vpBits[u]|=this.ISBOUND,f.push({ix:p.ix,iy:p.iy,iz:p.iz})):this.vpBits[u]&this.INOUT&&this.vpBits[u]&this.ISDONE&&(n=p.ix-c.ix,o=p.iy-c.iy,l=p.iz-c.iz,h=n*n+o*o+l*l,h-1&&p.iy-1&&p.iz-1&&(u=p.ix*g+this.pHeight*p.iy+p.iz,this.vpBits[u]&this.INOUT&&!(this.vpBits[u]&this.ISDONE)?(t.set(p.ix,p.iy,a+this.nb[e][2],c),n=p.ix-c.ix,o=p.iy-c.iy,l=p.iz-c.iz,h=n*n+o*o+l*l,this.vpDistance[u]=h,this.vpBits[u]|=this.ISDONE,this.vpBits[u]|=this.ISBOUND,f.push({ix:p.ix,iy:p.iy,iz:p.iz})):this.vpBits[u]&this.INOUT&&this.vpBits[u]&this.ISDONE&&(n=p.ix-c.ix,o=p.iy-c.iy,l=p.iz-c.iz,h=n*n+o*o+l*l,h{"use strict";r.r(t),r.d(t,{VolumeData:()=>VolumeData});var s=r(9005),a=r(9652),n=r(5591),o=r(972),l=r(7885);class VolumeData{constructor(e,t,r){if(this.unit={x:1,y:1,z:1},this.origin={x:0,y:0,z:0},this.size={x:0,y:0,z:0},this.data=new Float32Array([]),this.matrix=null,this.inversematrix=null,this.isbinary=new Set(["ccp4","CCP4"]),this.getCoordinates=function(e){var t=e/(this.size.y*this.size.z),r=e%(this.size.y*this.size.z),s=e%this.size.z;return t*=this.unit.x,r*=this.unit.y,s*=this.unit.z,{x:t+=this.origin.x,y:r+=this.origin.y,z:s+=this.origin.z}},this.vasp=function(e){var t=e.replace(/^\s+/,"").split(/[\n\r]/),r=(0,n.VASP)(e)[0].length;if(0==r)return console.log("No good formating of CHG or CHGCAR file, not atomic information provided in the file."),void(this.data=[]);var s,o=1.889725992,l=parseFloat(t[1]);s=t[2].replace(/^\s+/,"").split(/\s+/);var h=new a.Vector3(parseFloat(s[0]),parseFloat(s[1]),parseFloat(s[2])).multiplyScalar(l*o);s=t[3].replace(/^\s+/,"").split(/\s+/);var c=new a.Vector3(parseFloat(s[0]),parseFloat(s[1]),parseFloat(s[2])).multiplyScalar(l*o);s=t[4].replace(/^\s+/,"").split(/\s+/);var u=new a.Vector3(parseFloat(s[0]),parseFloat(s[1]),parseFloat(s[2])).multiplyScalar(l*o),f=h.x*(c.y*u.z-u.y*c.z)-c.x*(h.y*u.z-u.y*h.z)+u.x*(h.y*c.z-c.y*h.z),p=1/(f=Math.abs(f)/Math.pow(o,3));t.splice(0,8+r+1);var g=t[0].replace(/^\s+/,"").replace(/\s+/g," ").split(" "),v=Math.abs(parseFloat(g[0])),_=Math.abs(parseFloat(g[1])),y=Math.abs(parseFloat(g[2])),b=this.origin=new a.Vector3(0,0,0);this.size={x:v,y:_,z:y},this.unit=new a.Vector3(h.x,c.y,u.z),h=h.multiplyScalar(1/(o*v)),c=c.multiplyScalar(1/(o*_)),u=u.multiplyScalar(1/(o*y)),0==h.y&&0==h.z&&0==c.x&&0==c.z&&0==u.x&&0==u.y||(this.matrix=new a.Matrix4(h.x,c.x,u.x,0,h.y,c.y,u.y,0,h.z,c.z,u.z,0,0,0,0,1),this.matrix=this.matrix.multiplyMatrices(this.matrix,(new a.Matrix4).makeTranslation(b.x,b.y,b.z)),this.origin=new a.Vector3(0,0,0),this.unit=new a.Vector3(1,1,1)),t.splice(0,1);var w=t.join(" "),x=(w=w.replace(/^\s+/,"")).split(/[\s\r]+/);x.splice(v*_*y+1);for(var A=Float32Array.from(x,parseFloat),C=0;C=this.size.x||t<0||t>=this.size.y||r<0||r>=this.size.z?-1:e*this.size.y*this.size.z+t*this.size.z+r}getVal(e,t,r){let s=this.getIndex(e,t,r);return s<0?0:this.data[s]}cube(e){var t=e.split(/\r?\n/);if(!(t.length<6)){var r=(0,o.CUBE)(e,{}).modelData[0].cryst,s=t[2].replace(/^\s+/,"").replace(/\s+/g," ").split(" "),a=parseFloat(s[0]),n=Math.abs(a);this.origin=r.origin,this.size=r.size,this.unit=r.unit,this.matrix=r.matrix4;var l=6;a<0&&l++;var h=t.splice(n+l).join(" "),c=(h=h.replace(/^\s+/,"")).split(/[\s\r]+/);this.data=Float32Array.from(c,parseFloat)}}ccp4(e){var t={};e=new Int8Array(e);var r=new Int32Array(e.buffer,0,56),s=new Float32Array(e.buffer,0,56),n=new DataView(e.buffer);if(t.MAP=String.fromCharCode(n.getUint8(208),n.getUint8(209),n.getUint8(210),n.getUint8(211)),t.MACHST=[n.getUint8(212),n.getUint8(213)],17===t.MACHST[0]&&17===t.MACHST[1])for(var o=e.byteLength,l=0;l{"use strict";r.r(t),r.d(t,{GLVolumetricRender:()=>GLVolumetricRender});var s=r(3351),a=r(9652),n=r(7693),o=r(2550),l=r(8783);class GLVolumetricRender{static interpolateArray(e,t){function r(e,t,r){return e+(t-e)*r}var s=[],a=(e.length-1)/(t-1);s[0]=e[0];for(var n=1;n=0||e.getIndex(u,f,p)>=0)for(let t=l;t=0&&!r[l]){(t-o.x)*(t-o.x)+(s-o.y)*(s-o.y)+(n-o.z)*(n-o.z){"use strict";var s;r.r(t),r.d(t,{BackSide:()=>n,Camera:()=>Camera,ClampToEdgeWrapping:()=>u,Coloring:()=>s,Cylinder:()=>E.Cylinder,DoubleSide:()=>o,EventDispatcher:()=>EventDispatcher,FloatType:()=>_,Fog:()=>Fog,FrontSide:()=>a,Geometry:()=>Geometry,GeometryGroup:()=>GeometryGroup,GeometryIDCount:()=>M,ImposterMaterial:()=>ImposterMaterial,InstancedMaterial:()=>InstancedMaterial,Light:()=>Light,Line:()=>Line,LineBasicMaterial:()=>LineBasicMaterial,LineStyle:()=>j,LinearFilter:()=>f,LinearMipMapLinearFilter:()=>g,Material:()=>Material,MaterialIdCount:()=>C,Matrix3:()=>h.Matrix3,Matrix4:()=>h.Matrix4,Mesh:()=>Mesh,MeshDoubleLambertMaterial:()=>MeshDoubleLambertMaterial,MeshLambertMaterial:()=>MeshLambertMaterial,MeshOutlineMaterial:()=>MeshOutlineMaterial,NearestFilter:()=>p,Object3D:()=>Object3D,Object3DIDCount:()=>z,Projector:()=>Projector,Quaternion:()=>h.Quaternion,R32Format:()=>w,RFormat:()=>b,RGBAFormat:()=>y,Ray:()=>h.Ray,Raycaster:()=>Raycaster,Renderer:()=>Renderer,Scene:()=>Scene,ShaderLib:()=>pe,ShaderUtils:()=>ge,Shading:()=>l,Sphere:()=>E.Sphere,SphereImposterMaterial:()=>SphereImposterMaterial,SphereImposterOutlineMaterial:()=>SphereImposterOutlineMaterial,Sprite:()=>Sprite,SpriteAlignment:()=>c,SpriteMaterial:()=>SpriteMaterial,SpritePlugin:()=>SpritePlugin,StickImposterMaterial:()=>StickImposterMaterial,StickImposterOutlineMaterial:()=>StickImposterOutlineMaterial,Texture:()=>Texture,TextureIdCount:()=>V,TextureOperations:()=>x,Triangle:()=>E.Triangle,UVMapping:()=>UVMapping,UnsignedByteType:()=>v,Vector2:()=>h.Vector2,Vector3:()=>h.Vector3,VolumetricMaterial:()=>VolumetricMaterial,basic:()=>W,clamp:()=>h.clamp,clone:()=>me,conversionMatrix3:()=>h.conversionMatrix3,degToRad:()=>h.degToRad,instanced:()=>Y,intersectObject:()=>U,lambert:()=>X,lambertdouble:()=>$,outline:()=>J,screen:()=>ee,screenaa:()=>te,sphereimposter:()=>ie,sphereimposteroutline:()=>ae,sprite:()=>ne,stickimposter:()=>he,stickimposteroutline:()=>de,volumetric:()=>fe}),function(e){e[e.NoColors=0]="NoColors",e[e.FaceColors=1]="FaceColors",e[e.VertexColors=2]="VertexColors"}(s||(s={}));const a=0,n=1,o=2;var l;!function(e){e[e.NoShading=0]="NoShading",e[e.FlatShading=1]="FlatShading",e[e.SmoothShading=2]="SmoothShading"}(l||(l={}));var h=r(9652);const c={topLeft:new h.Vector2(1,-1),topCenter:new h.Vector2(0,-1),topRight:new h.Vector2(-1,-1),centerLeft:new h.Vector2(1,0),center:new h.Vector2(0,0),centerRight:new h.Vector2(-1,0),bottomLeft:new h.Vector2(1,1),bottomCenter:new h.Vector2(0,1),bottomRight:new h.Vector2(-1,1)},u=1001,f=1006,p=1007,g=1008,v=1009,_=1010,y=1021,b=1022,w=1023;var x;!function(e){e[e.MultiplyOperation=0]="MultiplyOperation",e[e.MixOperation=1]="MixOperation",e[e.AddOperation=2]="AddOperation"}(x||(x={}));class EventDispatcher{constructor(){this.listeners={}}dispatchEvent(e){var t=this.listeners[e.type];if(void 0!==t){e.target=this;for(var r=0,s=t.length;r0?this.lineArray=(null==o?void 0:o.subarray(0,this.lineidx))||null:this.lineArray=new Uint16Array(0)):(this.normalArray=new Float32Array(0),this.faceArray=new Uint16Array(0),this.lineArray=new Uint16Array(0)),l&&(this.radiusArray=l.subarray(0,this.vertices)),t&&(this.normalArray&&(this.normalArray=new Float32Array(this.normalArray)),this.faceArray&&(this.faceArray=new Uint16Array(this.faceArray)),this.lineArray&&(this.lineArray=new Uint16Array(this.lineArray)),this.vertexArray&&(this.vertexArray=new Float32Array(this.vertexArray)),this.colorArray&&(this.colorArray=new Float32Array(this.colorArray)),this.radiusArray&&(this.radiusArray=new Float32Array(this.radiusArray))),this.__inittedArrays=!0}}class Geometry extends EventDispatcher{constructor(e=!1,t=!1,r=!1){super(),this.name="",this.hasTangents=!1,this.dynamic=!0,this.verticesNeedUpdate=!1,this.elementsNeedUpdate=!1,this.normalsNeedUpdate=!1,this.colorsNeedUpdate=!1,this.buffersNeedUpdate=!1,this.imposter=!1,this.instanced=!1,this.geometryGroups=[],this.groups=0,this.id=M++,this.mesh=e,this.radii=t,this.offset=r}updateGeoGroup(e=0){var t,r=this.groups>0?this.geometryGroups[this.groups-1]:null;return(!r||r.vertices+e>((null===(t=null==r?void 0:r.vertexArray)||void 0===t?void 0:t.length)||0)/3)&&(r=this.addGeoGroup()),r}vrml(e,t){for(var r="",s=this.geometryGroups.length,a=0;ae.distance-t.distance,k=new h.Matrix4;class Raycaster{constructor(e,t,r,s){this.precision=1e-4,this.linePrecision=.2,this.ray=new h.Ray(e,t),this.ray.direction.lengthSq()>0&&this.ray.direction.normalize(),this.near=s||0,this.far=r||1/0}set(e,t){this.ray.set(e,t)}setFromCamera(e,t){t.ortho?(this.ray.origin.set(e.x,e.y,(t.near+t.far)/(t.near-t.far)).unproject(t),this.ray.direction.set(0,0,-1).transformDirection(t.matrixWorld)):(this.ray.origin.setFromMatrixPosition(t.matrixWorld),this.ray.direction.set(e.x,e.y,e.z),t.projectionMatrixInverse.getInverse(t.projectionMatrix),k.multiplyMatrices(t.matrixWorld,t.projectionMatrixInverse),this.ray.direction.applyProjection(k),this.ray.direction.sub(this.ray.origin).normalize())}intersectObjects(e,t){for(var r=[],s=0,a=t.length;sMath.min(Math.max(e,-1),1);var O=new E.Sphere,D=new E.Cylinder,F=new E.Triangle,R=new h.Vector3,P=new h.Vector3,G=new h.Vector3,B=new h.Vector3,N=new h.Vector3;function U(e,t,r,s){if(N.getPositionFromMatrix(e.matrixWorld),void 0===t.intersectionShape)return s;var a,n,o,l,h,c,u,f,p,g,v,_,y,b,w=t.intersectionShape,x=r.linePrecision,A=(x*=e.matrixWorld.getMaxScaleOnAxis())*x;if(void 0!==t.boundingSphere&&t.boundingSphere instanceof E.Sphere&&(O.copy(t.boundingSphere),O.applyMatrix4(e.matrixWorld),!r.ray.isIntersectionSphere(O)))return s;for(a=0,n=w.triangle.length;a=0)continue;if(R.subVectors(F.a,r.ray.origin),(u=o.dot(R)/l)<0)continue;P.copy(r.ray.direction).multiplyScalar(u).add(r.ray.origin),P.sub(F.a),G.copy(F.b).sub(F.a),B.copy(F.c).sub(F.a);var C=G.dot(B),S=G.lengthSq(),M=B.lengthSq();if((_=(S*P.dot(B)-C*P.dot(G))/(S*M-C*C))<0||_>1)continue;if((v=(P.dot(G)-_*C)/S)<0||v>1||v+_>1)continue;s.push({clickable:t,distance:u})}for(a=0,n=w.cylinder.length;aD.lengthSq()||_<0)continue;s.push({clickable:t,distance:u})}}for(a=0,n=w.line.length;a lumaMax))\n color = vec4(rgbA, 1.0);\n else\n color = vec4(rgbB, 1.0);\n return color;\n}\n//DEFINEFRAGCOLOR\nvoid main (void) {\n gl_FragColor = applyFXAA(vTexCoords, colormap);\n}\n ".replace("#define GLSLIFY 1",""),vertexShader:"attribute vec2 vertexPosition;\nvarying highp vec2 vTexCoords;\nconst vec2 scale = vec2(0.5, 0.5);\n\nvoid main() {\n vTexCoords = vertexPosition * scale + scale; // scale vertex attribute to [0,1] range\n gl_Position = vec4(vertexPosition, 0.0, 1.0);\n}\n ".replace("#define GLSLIFY 1",""),uniforms:{}},re={opacity:{type:"f",value:1},fogColor:{type:"c",value:new A.Color(1,1,1)},fogNear:{type:"f",value:1},fogFar:{type:"f",value:2e3},directionalLightColor:{type:"fv",value:[]},directionalLightDirection:{type:"fv",value:[]}},ie={vertexShader:"uniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nuniform mat4 viewMatrix;\nuniform mat3 normalMatrix;\nuniform vec3 directionalLightColor[ 1 ];\nuniform vec3 directionalLightDirection[ 1 ];\n\nattribute vec3 position;\nattribute vec3 normal;\nattribute vec3 color;\n\nvarying vec2 mapping;\nvarying vec3 vColor;\nvarying float rval;\nvarying vec3 vLight;\nvarying vec3 center;\n\nvoid main() {\n\n vColor = color;\n vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n center = mvPosition.xyz;\n vec4 projPosition = projectionMatrix * mvPosition;\n vec4 adjust = projectionMatrix* vec4(normal,0.0); adjust.z = 0.0; adjust.w = 0.0;\n vec4 lDirection = viewMatrix * vec4( directionalLightDirection[ 0 ], 0.0 );\n vLight = normalize( lDirection.xyz );\n mapping = normal.xy;\n rval = abs(normal.x);\n gl_Position = projPosition+adjust;\n\n}\n".replace("#define GLSLIFY 1",""),fragmentShader:"\nuniform mat4 viewMatrix;\nuniform float opacity;\nuniform mat4 projectionMatrix;\n\nuniform vec3 fogColor;\nuniform float fogNear;\nuniform float fogFar;\nuniform float uDepth;\nuniform vec3 directionalLightColor[ 1 ];\n\nvarying vec3 vColor;\nvarying vec2 mapping;\nvarying float rval;\nvarying vec3 vLight;\nvarying vec3 center;\n\n//DEFINEFRAGCOLOR\n\nvoid main() {\n float lensqr = dot(mapping,mapping);\n float rsqr = rval*rval;\n if(lensqr > rsqr)\n discard;\n float z = sqrt(rsqr-lensqr);\n vec3 cameraPos = center+ vec3(mapping.x,mapping.y,z);\n vec4 clipPos = projectionMatrix * vec4(cameraPos, 1.0);\n float ndcDepth = clipPos.z / clipPos.w;\n gl_FragDepthEXT = ((gl_DepthRange.diff * ndcDepth) + gl_DepthRange.near + gl_DepthRange.far) / 2.0;\n vec3 norm = normalize(vec3(mapping.x,mapping.y,z));\n float dotProduct = dot( norm, vLight );\n vec3 directionalLightWeighting = vec3( max( dotProduct, 0.0 ) );\n vec3 vLight = directionalLightColor[ 0 ] * directionalLightWeighting;\n gl_FragColor = vec4(vLight*vColor, opacity*opacity );\n float fogFactor = smoothstep( fogNear, fogFar, gl_FragDepthEXT/gl_FragCoord.w );\n gl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );\n\n\n}\n\n".replace("#define GLSLIFY 1",""),uniforms:re},se={opacity:{type:"f",value:1},outlineColor:{type:"c",value:new A.Color(0,0,0)},fogColor:{type:"c",value:new A.Color(1,1,1)},fogNear:{type:"f",value:1},fogFar:{type:"f",value:2e3},outlineWidth:{type:"f",value:.1},outlinePushback:{type:"f",value:1}},ae={fragmentShader:"\n\nuniform float opacity;\nuniform vec3 outlineColor;\nuniform vec3 fogColor;\nuniform float fogNear;\nuniform float fogFar;\nuniform mat4 projectionMatrix;\nvarying vec2 mapping;\nvarying float rval;\nvarying vec3 center;\n\nuniform float outlinePushback;\n\n//DEFINEFRAGCOLOR\n\nvoid main() {\n float lensqr = dot(mapping,mapping);\n float rsqr = rval*rval;\n if(lensqr > rsqr)\n discard;\n float z = sqrt(rsqr-lensqr);\n vec3 cameraPos = center+ vec3(mapping.x,mapping.y,z-outlinePushback);\n vec4 clipPos = projectionMatrix * vec4(cameraPos, 1.0);\n float ndcDepth = clipPos.z / clipPos.w;\n gl_FragDepthEXT = ((gl_DepthRange.diff * ndcDepth) + gl_DepthRange.near + gl_DepthRange.far) / 2.0;\n gl_FragColor = vec4(outlineColor, 1 );\n}\n\n\n".replace("#define GLSLIFY 1",""),vertexShader:"\n\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nuniform float outlineWidth;\nuniform float outlinePushback;\n\nattribute vec3 position;\nattribute vec3 normal;\nattribute vec3 color;\n\nvarying vec2 mapping;\nvarying float rval;\nvarying vec3 center;\n\nvoid main() {\n\n vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n center = mvPosition.xyz;\n vec4 projPosition = projectionMatrix * mvPosition;\n vec2 norm = normal.xy + vec2(sign(normal.x)*outlineWidth,sign(normal.y)*outlineWidth);\n vec4 adjust = projectionMatrix* vec4(norm,normal.z,0.0); adjust.z = 0.0; adjust.w = 0.0;\n mapping = norm.xy;\n rval = abs(norm.x);\n gl_Position = projPosition+adjust;\n}\n\n".replace("#define GLSLIFY 1",""),uniforms:se},ne={fragmentShader:"\n\nuniform vec3 color;\nuniform sampler2D map;\nuniform float opacity;\n\nuniform int fogType;\nuniform vec3 fogColor;\nuniform float fogDensity;\nuniform float fogNear;\nuniform float fogFar;\nuniform float alphaTest;\n\nvarying vec2 vUV;\n//DEFINEFRAGCOLOR\n\nvoid main() {\n\n vec4 texture = texture2D(map, vUV);\n\n if (texture.a < alphaTest) discard;\n\n gl_FragColor = vec4(color * texture.xyz, texture.a * opacity);\n\n if (fogType > 0) {\n\n float depth = gl_FragCoord.z / gl_FragCoord.w;\n float fogFactor = 0.0;\n\n if (fogType == 1) {\n fogFactor = smoothstep(fogNear, fogFar, depth);\n }\n\n else {\n const float LOG2 = 1.442695;\n float fogFactor = exp2(- fogDensity * fogDensity * depth * depth * LOG2);\n fogFactor = 1.0 - clamp(fogFactor, 0.0, 1.0);\n }\n\n gl_FragColor = mix(gl_FragColor, vec4(fogColor, gl_FragColor.w), fogFactor);\n\n }\n}\n\n".replace("#define GLSLIFY 1",""),vertexShader:"\n\nuniform int useScreenCoordinates;\nuniform vec3 screenPosition;\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nuniform float rotation;\nuniform vec2 scale;\nuniform vec2 alignment;\nuniform vec2 uvOffset;\nuniform vec2 uvScale;\n\nattribute vec2 position;\nattribute vec2 uv;\n\nvarying vec2 vUV;\n\nvoid main() {\n\n vUV = uvOffset + uv * uvScale;\n\n vec2 alignedPosition = position + alignment;\n\n vec2 rotatedPosition;\n rotatedPosition.x = ( cos(rotation) * alignedPosition.x - sin(rotation) * alignedPosition.y ) * scale.x;\n rotatedPosition.y = ( sin(rotation) * alignedPosition.x + cos(rotation) * alignedPosition.y ) * scale.y;\n\n vec4 finalPosition;\n\n if(useScreenCoordinates != 0) {\n finalPosition = vec4(screenPosition.xy + rotatedPosition, screenPosition.z, 1.0);\n }\n\n else {\n finalPosition = projectionMatrix * modelViewMatrix * vec4(0.0, 0.0, 0.0, 1.0); finalPosition /= finalPosition.w;\n finalPosition.xy += rotatedPosition; \n }\n\n gl_Position = finalPosition;\n\n}\n\n".replace("#define GLSLIFY 1",""),uniforms:{}},oe={opacity:{type:"f",value:1},fogColor:{type:"c",value:new A.Color(1,1,1)},fogNear:{type:"f",value:1},fogFar:{type:"f",value:2e3},directionalLightColor:{type:"fv",value:[]},directionalLightDirection:{type:"fv",value:[]}},le="uniform float opacity;\nuniform mat4 projectionMatrix;\n\nuniform vec3 fogColor;\nuniform float fogNear;\nuniform float fogFar;\n\nvarying vec3 vLight;\nvarying vec3 vColor;\nvarying vec3 cposition;\nvarying vec3 p1;\nvarying vec3 p2;\nvarying float r;\n\n//DEFINEFRAGCOLOR\n\n//cylinder-ray intersection testing taken from http://mrl.nyu.edu/~dzorin/cg05/lecture12.pdf\n//also useful: http://stackoverflow.com/questions/9595300/cylinder-impostor-in-glsl\n//with a bit more care (caps) this could be a general cylinder imposter (see also outline)\nvoid main() {\n vec3 color = abs(vColor);\n vec3 pos = cposition;\n vec3 p = pos; //ray point\n vec3 v = vec3(0.0,0.0,-1.0); //ray normal - orthographic\n if(projectionMatrix[3][3] == 0.0) v = normalize(pos); //ray normal - perspective\n vec3 pa = p1; //cyl start\n vec3 va = normalize(p2-p1); //cyl norm\n vec3 tmp1 = v-(dot(v,va)*va);\n vec3 deltap = p-pa;\n float A = dot(tmp1,tmp1);\n if(A == 0.0) discard;\n vec3 tmp2 = deltap-(dot(deltap,va)*va);\n float B = 2.0*dot(tmp1, tmp2);\n float C = dot(tmp2,tmp2)-r*r;\n//quadratic equation!\n float det = (B*B) - (4.0*A*C);\n if(det < 0.0) discard;\n float sqrtDet = sqrt(det);\n float posT = (-B+sqrtDet)/(2.0*A);\n float negT = (-B-sqrtDet)/(2.0*A);\n float intersectionT = min(posT,negT);\n vec3 qi = p+v*intersectionT;\n float dotp1 = dot(va,qi-p1);\n float dotp2 = dot(va,qi-p2);\n vec3 norm;\n if( dotp1 < 0.0 || dotp2 > 0.0) { //(p-c)^2 + 2(p-c)vt +v^2+t^2 - r^2 = 0\n vec3 cp;\n if( dotp1 < 0.0) { \n// if(vColor.x < 0.0 ) discard; //color sign bit indicates if we should cap or not\n cp = p1;\n } else {\n// if(vColor.y < 0.0 ) discard;\n cp = p2;\n }\n vec3 diff = p-cp;\n A = dot(v,v);\n B = dot(diff,v)*2.0;\n C = dot(diff,diff)-r*r;\n det = (B*B) - (4.0*C);\n if(det < 0.0) discard;\n sqrtDet = sqrt(det);\n posT = (-B+sqrtDet)/(2.0);\n negT = (-B-sqrtDet)/(2.0);\n float t = min(posT,negT);\n qi = p+v*t; \n norm = normalize(qi-cp); \n } else {\n norm = normalize(qi-(dotp1*va + p1));\n }\n vec4 clipPos = projectionMatrix * vec4(qi, 1.0);\n float ndcDepth = clipPos.z / clipPos.w;\n float depth = ((gl_DepthRange.diff * ndcDepth) + gl_DepthRange.near + gl_DepthRange.far) / 2.0;\n gl_FragDepthEXT = depth;",he={fragmentShader:[le," float dotProduct = dot( norm, vLight );\n vec3 light = vec3( max( dotProduct, 0.0 ) );\n gl_FragColor = vec4(light*color, opacity*opacity );\n float fogFactor = smoothstep( fogNear, fogFar, depth );\n gl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );\n}"].join("\n").replace("#define GLSLIFY 1",""),vertexShader:"\n\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nuniform mat4 viewMatrix;\nuniform mat3 normalMatrix;\nuniform vec3 directionalLightColor[ 1 ];\nuniform vec3 directionalLightDirection[ 1 ];\n\nattribute vec3 position;\nattribute vec3 normal;\nattribute vec3 color;\nattribute float radius;\n\nvarying vec3 vColor;\nvarying vec3 vLight;\nvarying vec3 cposition;\nvarying vec3 p1;\nvarying vec3 p2;\nvarying float r;\n\nvoid main() {\n\n vColor = color; vColor.z = abs(vColor.z); //z indicates which vertex and so would vary\n r = abs(radius);\n vec4 to = modelViewMatrix*vec4(normal, 1.0); //normal is other point of cylinder\n vec4 pt = modelViewMatrix*vec4(position, 1.0);\n vec4 mvPosition = pt;\n p1 = pt.xyz; p2 = to.xyz;\n vec3 norm = to.xyz-pt.xyz;\n float mult = 1.1; //slop to account for perspective of sphere\n if(length(p1) > length(p2)) { //billboard at level of closest point\n mvPosition = to;\n }\n vec3 n = normalize(mvPosition.xyz);\n//intersect with the plane defined by the camera looking at the billboard point\n if(color.z >= 0.0) { //p1\n if(projectionMatrix[3][3] == 0.0) { //perspective\n vec3 pnorm = normalize(p1);\n float t = dot(mvPosition.xyz-p1,n)/dot(pnorm,n);\n mvPosition.xyz = p1+t*pnorm; \n } else { //orthographic\n mvPosition.xyz = p1;\n }\n } else {\n if(projectionMatrix[3][3] == 0.0) { //perspective\n vec3 pnorm = normalize(p2);\n float t = dot(mvPosition.xyz-p2,n)/dot(pnorm,n);\n mvPosition.xyz = p2+t*pnorm;\n } else { //orthographic\n mvPosition.xyz = p2;\n } \n mult *= -1.0;\n }\n vec3 cr = normalize(cross(mvPosition.xyz,norm))*radius;\n vec3 doublecr = normalize(cross(mvPosition.xyz,cr))*radius;\n mvPosition.xyz += mult*(cr + doublecr).xyz;\n cposition = mvPosition.xyz;\n gl_Position = projectionMatrix * mvPosition;\n vec4 lDirection = viewMatrix * vec4( directionalLightDirection[ 0 ], 0.0 );\n vLight = normalize( lDirection.xyz )*directionalLightColor[0]; //not really sure this is right, but color is always white so..\n}\n\n".replace("#define GLSLIFY 1",""),uniforms:oe},ce={opacity:{type:"f",value:1},fogColor:{type:"c",value:new A.Color(1,1,1)},fogNear:{type:"f",value:1},fogFar:{type:"f",value:2e3},outlineColor:{type:"c",value:new A.Color(0,0,0)},outlineWidth:{type:"f",value:.1},outlinePushback:{type:"f",value:1}},de={fragmentShader:(le+"gl_FragColor = vec4(color,1.0);}").replace("#define GLSLIFY 1",""),vertexShader:"\n\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nuniform mat4 viewMatrix;\nuniform mat3 normalMatrix;\nuniform vec3 directionalLightColor[ 1 ];\nuniform vec3 directionalLightDirection[ 1 ];\nuniform vec3 outlineColor;\nuniform float outlineWidth;\nuniform float outlinePushback;\n\n\nattribute vec3 position;\nattribute vec3 normal;\nattribute vec3 color;\nattribute float radius;\n\nvarying vec3 vColor;\nvarying vec3 vLight;\nvarying vec3 cposition;\nvarying vec3 p1;\nvarying vec3 p2;\nvarying float r;\n\nvoid main() {\n\n vColor = outlineColor;\n float rad = radius+sign(radius)*outlineWidth;\n r = abs(rad);\n vec4 to = modelViewMatrix*vec4(normal, 1.0); //normal is other point of cylinder\n vec4 pt = modelViewMatrix*vec4(position, 1.0);\n//pushback\n to.xyz += normalize(to.xyz)*outlinePushback;\n pt.xyz += normalize(pt.xyz)*outlinePushback;\n\n vec4 mvPosition = pt;\n p1 = pt.xyz; p2 = to.xyz;\n vec3 norm = to.xyz-pt.xyz;\n float mult = 1.1; //slop to account for perspective of sphere\n if(length(p1) > length(p2)) { //billboard at level of closest point\n mvPosition = to;\n }\n vec3 n = normalize(mvPosition.xyz);\n//intersect with the plane defined by the camera looking at the billboard point\n if(color.z >= 0.0) { //p1\n vec3 pnorm = normalize(p1);\n float t = dot(mvPosition.xyz-p1,n)/dot(pnorm,n);\n mvPosition.xyz = p1+t*pnorm;\n } else {\n vec3 pnorm = normalize(p2);\n float t = dot(mvPosition.xyz-p2,n)/dot(pnorm,n);\n mvPosition.xyz = p2+t*pnorm;\n mult *= -1.0;\n }\n vec3 cr = normalize(cross(mvPosition.xyz,norm))*rad;\n vec3 doublecr = normalize(cross(mvPosition.xyz,cr))*rad;\n mvPosition.xy += mult*(cr + doublecr).xy;\n cposition = mvPosition.xyz;\n gl_Position = projectionMatrix * mvPosition;\n vLight = vec3(1.0,1.0,1.0);\n}\n\n".replace("#define GLSLIFY 1",""),uniforms:ce},ue={opacity:{type:"f",value:1},fogColor:{type:"c",value:new A.Color(1,1,1)},fogNear:{type:"f",value:1},fogFar:{type:"f",value:2e3},data:{type:"i",value:3},colormap:{type:"i",value:4},depthmap:{type:"i",value:5},step:{type:"f",value:1},maxdepth:{type:"f",value:100},subsamples:{type:"f",value:5},textmat:{type:"mat4",value:[]},projinv:{type:"mat4",value:[]},transfermin:{type:"f",value:-.2},transfermax:{type:"f",value:.2}},fe={fragmentShader:"\nuniform highp sampler3D data;\nuniform highp sampler2D colormap;\nuniform highp sampler2D depthmap;\n\n\nuniform mat4 textmat;\nuniform mat4 projinv;\nuniform mat4 projectionMatrix;\n\nuniform float step;\nuniform float subsamples;\nuniform float maxdepth;\nuniform float transfermin;\nuniform float transfermax;\nin vec4 mvPosition;\nout vec4 color;\nvoid main(void) {\n\n vec4 pos = mvPosition;\n bool seengood = false;\n float i = 0.0;\n color = vec4(1,1,1,0);\n float increment = 1.0/subsamples;\n float maxsteps = (maxdepth*subsamples/step);\n//there's probably a better way to do this..\n//calculate farthest possible point in model coordinates\n vec4 maxpos = vec4(pos.x,pos.y,pos.z-maxdepth,1.0);\n// convert to projection\n maxpos = projectionMatrix*maxpos;\n vec4 startp = projectionMatrix*pos;\n// homogonize\n maxpos /= maxpos.w;\n startp /= startp.w;\n//take x,y from start and z from max\n maxpos = vec4(startp.x,startp.y,maxpos.z,1.0);\n//convert back to model space\n maxpos = projinv*maxpos;\n maxpos /= maxpos.w;\n float incr = step/subsamples;\n//get depth from depthmap\n//startp is apparently [-1,1]\n vec2 tpos = startp.xy/2.0+0.5;\n float depth = texture(depthmap, tpos).r;\n//compute vector between start and end\n vec4 direction = maxpos-pos;\n for( i = 0.0; i <= maxsteps; i++) {\n vec4 pt = (pos+(i/maxsteps)*direction);\n vec4 ppt = projectionMatrix*pt;\n float ptdepth = ppt.z/ppt.w;\n ptdepth = ((gl_DepthRange.diff * ptdepth) + gl_DepthRange.near + gl_DepthRange.far) / 2.0;\n if(ptdepth > depth) break;\n pt = textmat*pt;\n// pt /= pt.w;\n if(pt.x >= -0.01 && pt.y >= -0.01 && pt.z >= -0.01 && pt.x <= 1.01 && pt.y <= 1.01 && pt.z <= 1.01) {\n seengood = true;\n } else if(seengood) {\n break;\n }\n if( pt.x < -0.01 || pt.x > 1.01 || pt.y < -0.01 || pt.y > 1.01 || pt.z < -0.01 || pt.z > 1.01 ){\n color.a = 0.0;\n continue;\n }\n else {\n float val = texture(data, pt.zyx).r;\n if(isinf(val)) continue; //masked out\n float cval = (val-transfermin)/(transfermax-transfermin); //scale to texture 0-1 range\n vec4 val_color = texture(colormap, vec2(cval,0.5));\n color.rgb = color.rgb*color.a + (1.0-color.a)*val_color.a*val_color.rgb;\n color.a += (1.0 - color.a) * val_color.a; \n if(color.a > 0.0) color.rgb /= color.a;\n// color = vec4(pt.x, pt.y, pt.z, 1.0);\n }\n// color = vec4(pt.x, pt.y, pt.z, 0.0)\n }\n}\n\n ".replace("#define GLSLIFY 1",""),vertexShader:"uniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nuniform mat4 viewMatrix;\n\nin vec3 position;\nout vec4 mvPosition;\nvoid main() {\n\n mvPosition = modelViewMatrix * vec4( position, 1.0 );\n gl_Position = projectionMatrix*mvPosition;\n}\n".replace("#define GLSLIFY 1",""),uniforms:ue},pe={basic:W,instanced:Y,lambert:X,lambertdouble:$,outline:J,screen:ee,screenaa:te,sphereimposter:ie,sphereimposteroutline:ae,sprite:ne,stickimposter:he,stickimposteroutline:de,volumetric:fe};function me(e){let t={};for(const s in e){t[s]={},t[s].type=e[s].type;var r=e[s].value;r instanceof A.Color?t[s].value=r.clone():"number"==typeof r?t[s].value=r:r instanceof Array?t[s].value=[]:console.error("Error copying shader uniforms from ShaderLib: unknown type for uniform")}return t}const ge={clone:me,stickimposterFragmentShader:le};class Camera extends Object3D{constructor(e=50,t=1,r=.1,s=2e3,a=!1){super(),this.projectionMatrix=new h.Matrix4,this.projectionMatrixInverse=new h.Matrix4,this.matrixWorldInverse=new h.Matrix4,this.fov=e,this.aspect=t,this.near=r,this.far=s;var n=this.position.z;this.right=n*Math.tan(Math.PI/180*e),this.left=-this.right,this.top=this.right/this.aspect,this.bottom=-this.top,this.ortho=!!a,this.updateProjectionMatrix()}lookAt(e){this.matrix.lookAt(this.position,e,this.up),this.rotationAutoUpdate&&(!1===this.useQuaternion&&this.rotation instanceof h.Vector3?this.rotation.setEulerFromRotationMatrix(this.matrix,this.eulerOrder):console.error("Unimplemented math operation."))}updateProjectionMatrix(){this.ortho?this.projectionMatrix.makeOrthographic(this.left,this.right,this.top,this.bottom,this.near,this.far):this.projectionMatrix.makePerspective(this.fov,this.aspect,this.near,this.far),this.projectionMatrixInverse.getInverse(this.projectionMatrix)}}class Fog{constructor(e,t=1,r=1e3){this.name="",this.color=new A.Color(e),this.near=t,this.far=r}clone(){return new Fog(this.color.getHex(),this.near,this.far)}}class SpritePlugin{constructor(){this.sprite={vertices:null,faces:null,vertexBuffer:null,elementBuffer:null,program:null,attributes:{},uniforms:null}}init(e){this.gl=e.context,this.renderer=e,this.precision=e.getPrecision(),this.sprite.vertices=new Float32Array(16),this.sprite.faces=new Uint16Array(6);var t=0;this.sprite.vertices[t++]=-1,this.sprite.vertices[t++]=-1,this.sprite.vertices[t++]=0,this.sprite.vertices[t++]=0,this.sprite.vertices[t++]=1,this.sprite.vertices[t++]=-1,this.sprite.vertices[t++]=1,this.sprite.vertices[t++]=0,this.sprite.vertices[t++]=1,this.sprite.vertices[t++]=1,this.sprite.vertices[t++]=1,this.sprite.vertices[t++]=1,this.sprite.vertices[t++]=-1,this.sprite.vertices[t++]=1,this.sprite.vertices[t++]=0,this.sprite.vertices[t++]=1,t=0,this.sprite.faces[t++]=0,this.sprite.faces[t++]=1,this.sprite.faces[t++]=2,this.sprite.faces[t++]=0,this.sprite.faces[t++]=2,this.sprite.faces[t++]=3,this.sprite.vertexBuffer=this.gl.createBuffer(),this.sprite.elementBuffer=this.gl.createBuffer(),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.sprite.vertexBuffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,this.sprite.vertices,this.gl.STATIC_DRAW),this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER,this.sprite.elementBuffer),this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER,this.sprite.faces,this.gl.STATIC_DRAW),this.sprite.program=this.createProgram(pe.sprite,this.precision||1),this.sprite.attributes={};const r={};this.sprite.attributes.position=this.gl.getAttribLocation(this.sprite.program,"position"),this.sprite.attributes.uv=this.gl.getAttribLocation(this.sprite.program,"uv"),r.uvOffset=this.gl.getUniformLocation(this.sprite.program,"uvOffset"),r.uvScale=this.gl.getUniformLocation(this.sprite.program,"uvScale"),r.rotation=this.gl.getUniformLocation(this.sprite.program,"rotation"),r.scale=this.gl.getUniformLocation(this.sprite.program,"scale"),r.alignment=this.gl.getUniformLocation(this.sprite.program,"alignment"),r.color=this.gl.getUniformLocation(this.sprite.program,"color"),r.map=this.gl.getUniformLocation(this.sprite.program,"map"),r.opacity=this.gl.getUniformLocation(this.sprite.program,"opacity"),r.useScreenCoordinates=this.gl.getUniformLocation(this.sprite.program,"useScreenCoordinates"),r.screenPosition=this.gl.getUniformLocation(this.sprite.program,"screenPosition"),r.modelViewMatrix=this.gl.getUniformLocation(this.sprite.program,"modelViewMatrix"),r.projectionMatrix=this.gl.getUniformLocation(this.sprite.program,"projectionMatrix"),r.fogType=this.gl.getUniformLocation(this.sprite.program,"fogType"),r.fogDensity=this.gl.getUniformLocation(this.sprite.program,"fogDensity"),r.fogNear=this.gl.getUniformLocation(this.sprite.program,"fogNear"),r.fogFar=this.gl.getUniformLocation(this.sprite.program,"fogFar"),r.fogColor=this.gl.getUniformLocation(this.sprite.program,"fogColor"),r.alphaTest=this.gl.getUniformLocation(this.sprite.program,"alphaTest"),this.sprite.uniforms=r}render(e,t,r,s,a){var n,o,l,h,c,u,f,p,g,v;if(!this.gl)throw new Error("WebGLRenderer not initialized");let _=[];null===(n=null==e?void 0:e.__webglSprites)||void 0===n||n.forEach((e=>{(a&&0==e.material.depthTest||!a&&e.material.depthTest)&&_.push(e)}));let y=_.length;if(!y)return;const b=this.sprite.attributes,w=this.sprite.uniforms;if(!w)throw new Error("Uniforms not defined");var x=.5*r,A=.5*s;this.gl.useProgram(this.sprite.program),this.gl.enableVertexAttribArray(b.position),this.gl.enableVertexAttribArray(b.uv),this.gl.disable(this.gl.CULL_FACE),this.gl.enable(this.gl.BLEND),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.sprite.vertexBuffer),this.gl.vertexAttribPointer(b.position,2,this.gl.FLOAT,!1,16,0),this.gl.vertexAttribPointer(b.uv,2,this.gl.FLOAT,!1,16,8),this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER,this.sprite.elementBuffer),this.gl.uniformMatrix4fv(w.projectionMatrix,!1,t.projectionMatrix.elements),this.gl.activeTexture(this.gl.TEXTURE0),this.gl.uniform1i(w.map,0);var C,S=0,M=0,z=e.fog;let L,E,T,k;z?(this.gl.uniform3f(w.fogColor,z.color.r,z.color.g,z.color.b),this.gl.uniform1f(w.fogNear,z.near),this.gl.uniform1f(w.fogFar,z.far),this.gl.uniform1i(w.fogType,1),S=1,M=1):(this.gl.uniform1i(w.fogType,0),S=0,M=0);let I=[];for(C=0;C=0&&(this._gl.bindBuffer(this._gl.ARRAY_BUFFER,a.__webglVertexBuffer),this.enableAttribute(l.position),this._gl.vertexAttribPointer(l.position,3,this._gl.FLOAT,!1,0,0)),l.color>=0&&(this._gl.bindBuffer(this._gl.ARRAY_BUFFER,a.__webglColorBuffer),this.enableAttribute(l.color),this._gl.vertexAttribPointer(l.color,3,this._gl.FLOAT,!1,0,0)),l.normal>=0&&(this._gl.bindBuffer(this._gl.ARRAY_BUFFER,a.__webglNormalBuffer),this.enableAttribute(l.normal),this._gl.vertexAttribPointer(l.normal,3,this._gl.FLOAT,!1,0,0)),l.offset>=0&&(this._gl.bindBuffer(this._gl.ARRAY_BUFFER,a.__webglOffsetBuffer),this.enableAttribute(l.offset),this._gl.vertexAttribPointer(l.offset,3,this._gl.FLOAT,!1,0,0)),l.radius>=0&&(this._gl.bindBuffer(this._gl.ARRAY_BUFFER,a.__webglRadiusBuffer),this.enableAttribute(l.radius),this._gl.vertexAttribPointer(l.radius,1,this._gl.FLOAT,!1,0,0))),n instanceof Mesh){if("instanced"===s.shaderID){var g=s.sphere.geometryGroups[0];u&&(this._gl.bindBuffer(this._gl.ARRAY_BUFFER,a.__webglVertexBuffer),this._gl.bufferData(this._gl.ARRAY_BUFFER,g.vertexArray,this._gl.STATIC_DRAW),this._gl.bindBuffer(this._gl.ARRAY_BUFFER,a.__webglNormalBuffer),this._gl.bufferData(this._gl.ARRAY_BUFFER,g.normalArray,this._gl.STATIC_DRAW),this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER,a.__webglFaceBuffer),this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER,g.faceArray,this._gl.STATIC_DRAW)),h=g.faceidx,this._extInstanced.vertexAttribDivisorANGLE(l.offset,1),this._extInstanced.vertexAttribDivisorANGLE(l.radius,1),this._extInstanced.vertexAttribDivisorANGLE(l.color,1),this._extInstanced.drawElementsInstancedANGLE(this._gl.TRIANGLES,h,this._gl.UNSIGNED_SHORT,0,a.radiusArray.length),this._extInstanced.vertexAttribDivisorANGLE(l.offset,0),this._extInstanced.vertexAttribDivisorANGLE(l.radius,0),this._extInstanced.vertexAttribDivisorANGLE(l.color,0)}else s.wireframe?(c=a.lineidx,this.setLineWidth(s.wireframeLinewidth),u&&this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER,a.__webglLineBuffer),this._gl.drawElements(this._gl.LINES,c,this._gl.UNSIGNED_SHORT,0)):(h=a.faceidx,u&&this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER,a.__webglFaceBuffer),this._gl.drawElements(this._gl.TRIANGLES,h,this._gl.UNSIGNED_SHORT,0));this.info.render.calls++,this.info.render.vertices+=h,this.info.render.faces+=h/3}else n instanceof Line&&(c=a.vertices,this.setLineWidth(s.linewidth),this._gl.drawArrays(this._gl.LINES,0,c),this.info.render.calls++)}}render(e,t,r){if(t instanceof Camera!=!1){var s,a,n,o,l,h=e.__lights,c=e.fog;this._currentMaterialId=-1,this._lightsNeedUpdate=!0,this.autoUpdateScene&&e.updateMatrixWorld(),void 0===t.parent&&t.updateMatrixWorld(),t.matrixWorldInverse.getInverse(t.matrixWorld),this._projScreenMatrix.multiplyMatrices(t.projectionMatrix,t.matrixWorldInverse),this.autoUpdateObjects&&this.initWebGLObjects(e),this.info.render.calls=0,this.info.render.vertices=0,this.info.render.faces=0,this.info.render.points=0,this._currentWidth=this._viewportWidth,this._currentHeight=this._viewportHeight,this.setViewport(),this.setFrameBuffer(),(this.autoClear||r)&&(this._gl.clearColor(this._clearColor.r,this._clearColor.g,this._clearColor.b,this._clearAlpha),this.clear(this.autoClearColor,this.autoClearDepth,this.autoClearStencil));var u=!1;for(s=0,a=(l=e.__webglObjects).length;s=0;--r)e[r].object===t&&e.splice(r,1)}removeInstancesDirect(e,t){for(var r=e.length-1;r>=0;--r)e[r]===t&&e.splice(r,1)}unrollBufferMaterial(e){var t=e.object.material;if(t.volumetric)e.opaque=null,e.transparent=null,e.volumetric=t;else if(t.transparent){if(e.opaque=null,e.volumetric=null,e.transparent=t,!t.wireframe){var r=t.clone();r.opacity=0,e.blank=r}}else e.opaque=t,e.transparent=null,e.volumetric=null}setBuffers(e,t){var r=e.vertexArray,s=e.colorArray;if(void 0!==e.__webglOffsetBuffer?(this._gl.bindBuffer(this._gl.ARRAY_BUFFER,e.__webglOffsetBuffer),this._gl.bufferData(this._gl.ARRAY_BUFFER,r,t)):(this._gl.bindBuffer(this._gl.ARRAY_BUFFER,e.__webglVertexBuffer),this._gl.bufferData(this._gl.ARRAY_BUFFER,r,t)),this._gl.bindBuffer(this._gl.ARRAY_BUFFER,e.__webglColorBuffer),this._gl.bufferData(this._gl.ARRAY_BUFFER,s,t),e.normalArray&&void 0!==e.__webglNormalBuffer){var a=e.normalArray;this._gl.bindBuffer(this._gl.ARRAY_BUFFER,e.__webglNormalBuffer),this._gl.bufferData(this._gl.ARRAY_BUFFER,a,t)}if(e.radiusArray&&void 0!==e.__webglRadiusBuffer&&(this._gl.bindBuffer(this._gl.ARRAY_BUFFER,e.__webglRadiusBuffer),this._gl.bufferData(this._gl.ARRAY_BUFFER,e.radiusArray,t)),e.faceArray&&void 0!==e.__webglFaceBuffer){var n=e.faceArray;this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER,e.__webglFaceBuffer),this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER,n,t)}if(e.lineArray&&void 0!==e.__webglLineBuffer){var o=e.lineArray;this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER,e.__webglLineBuffer),this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER,o,t)}}createMeshBuffers(e){e.radiusArray&&(e.__webglRadiusBuffer=this._gl.createBuffer()),e.useOffset&&(e.__webglOffsetBuffer=this._gl.createBuffer()),e.__webglVertexBuffer=this._gl.createBuffer(),e.__webglNormalBuffer=this._gl.createBuffer(),e.__webglColorBuffer=this._gl.createBuffer(),e.__webglFaceBuffer=this._gl.createBuffer(),e.__webglLineBuffer=this._gl.createBuffer(),this.info.memory.geometries++}createLineBuffers(e){e.__webglVertexBuffer=this._gl.createBuffer(),e.__webglColorBuffer=this._gl.createBuffer(),this.info.memory.geometries++}addBuffer(e,t,r){e.push({buffer:t,object:r,opaque:null,transparent:null})}setupMatrices(e,t){e._modelViewMatrix.multiplyMatrices(t.matrixWorldInverse,e.matrixWorld),e._normalMatrix.getInverse(e._modelViewMatrix),e._normalMatrix.transpose()}filterFallback(e){return this._gl.LINEAR}setTextureParameters(e,t){e==this._gl.TEXTURE_2D?(this._gl.texParameteri(e,this._gl.TEXTURE_WRAP_S,this._gl.CLAMP_TO_EDGE),this._gl.texParameteri(e,this._gl.TEXTURE_WRAP_T,this._gl.CLAMP_TO_EDGE),this._gl.texParameteri(e,this._gl.TEXTURE_MAG_FILTER,this.filterFallback(t.magFilter)),this._gl.texParameteri(e,this._gl.TEXTURE_MIN_FILTER,this.filterFallback(t.minFilter))):(this._gl.texParameteri(e,this._gl.TEXTURE_WRAP_S,this._gl.CLAMP_TO_EDGE),this._gl.texParameteri(e,this._gl.TEXTURE_WRAP_T,this._gl.CLAMP_TO_EDGE),this._gl.texParameteri(e,this._gl.TEXTURE_WRAP_R,this._gl.CLAMP_TO_EDGE),this._extColorBufferFloat&&this._extFloatLinear?(this._gl.texParameteri(e,this._gl.TEXTURE_MAG_FILTER,this._gl.LINEAR),this._gl.texParameteri(e,this._gl.TEXTURE_MIN_FILTER,this._gl.LINEAR)):(this._gl.texParameteri(e,this._gl.TEXTURE_MAG_FILTER,this._gl.NEAREST),this._gl.texParameteri(e,this._gl.TEXTURE_MIN_FILTER,this._gl.NEAREST)))}paramToGL(e){return e===v?this._gl.UNSIGNED_BYTE:e===y?this._gl.RGBA:e===p?this._gl.NEAREST:0}setupLights(e,t){var r,s,a,n,o,l=this._lights,h=l.directional.colors,c=l.directional.positions,u=0,f=0;for(r=0,s=t.length;r{"use strict";r.r(t),r.d(t,{Matrix3:()=>Matrix3,Matrix4:()=>Matrix4,Quaternion:()=>Quaternion,Ray:()=>Ray,Vector2:()=>Vector2,Vector3:()=>Vector3,clamp:()=>s,conversionMatrix3:()=>f,degToRad:()=>n});class Quaternion{constructor(e,t,r,s){this.x=e||0,this.y=t||0,this.z=r||0,this.w=void 0!==s?s:1}set(e,t,r,s){return this.x=e,this.y=t,this.z=r,this.w=s,this}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this.w=e.w,this}conjugate(){return this.x*=-1,this.y*=-1,this.z*=-1,this}inverse(){return this.conjugate().normalize()}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)}lengthxyz(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}normalize(){let e=this.length();return 0===e?(this.x=0,this.y=0,this.z=0,this.w=1):(e=1/e,this.x*=e,this.y*=e,this.z*=e,this.w*=e),this}multiply(e){return this.multiplyQuaternions(this,e)}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this.w*=e,this}multiplyQuaternions(e,t){const r=e.x,s=e.y,a=e.z,n=e.w,o=t.x,l=t.y,h=t.z,c=t.w;return this.x=r*c+n*o+s*h-a*l,this.y=s*c+n*l+a*o-r*h,this.z=a*c+n*h+r*l-s*o,this.w=n*c-r*o-s*l-a*h,this}sub(e){return this.x-=e.x,this.y-=e.y,this.z-=e.z,this.w-=e.w,this}clone(){return new Quaternion(this.x,this.y,this.z,this.w)}setFromEuler(e){const t=Math.cos(e.x/2),r=Math.cos(e.y/2),s=Math.cos(e.z/2),a=Math.sin(e.x/2),n=Math.sin(e.y/2),o=Math.sin(e.z/2);return this.x=a*r*s+t*n*o,this.y=t*n*s-a*r*o,this.z=t*r*o+a*n*s,this.w=t*r*s-a*n*o,this}}class Vector2{constructor(e,t){this.x=e||0,this.y=t||0}set(e,t){return this.x=e,this.y=t,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this}copy(e){return this.x=e.x,this.y=e.y,this}clone(){return new Vector2(this.x,this.y)}}function s(e,t,r){return Math.min(Math.max(e,t),r)}const a=Math.PI/180;function n(e){return e*a}var o,l,h,c,u;class Matrix4{constructor(e=1,t=0,r=0,s=0,a=0,n=1,o=0,l=0,h=0,c=0,u=1,f=0,p=0,g=0,v=0,_=1){void 0!==e&&"number"!=typeof e?this.elements=new Float32Array(e):(this.elements=new Float32Array(16),this.elements[0]=e,this.elements[4]=t,this.elements[8]=r,this.elements[12]=s,this.elements[1]=a,this.elements[5]=n,this.elements[9]=o,this.elements[13]=l,this.elements[2]=h,this.elements[6]=c,this.elements[10]=u,this.elements[14]=f,this.elements[3]=p,this.elements[7]=g,this.elements[11]=v,this.elements[15]=_)}makeScale(e,t,r){throw new Error("Method not implemented.")}set(e,t,r,s,a,n,o,l,h,c,u,f,p,g,v,_){const y=this.elements;return y[0]=e,y[4]=t,y[8]=r,y[12]=s,y[1]=a,y[5]=n,y[9]=o,y[13]=l,y[2]=h,y[6]=c,y[10]=u,y[14]=f,y[3]=p,y[7]=g,y[11]=v,y[15]=_,this}identity(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this}copy(e){const t=e.elements;return this.set(t[0],t[4],t[8],t[12],t[1],t[5],t[9],t[13],t[2],t[6],t[10],t[14],t[3],t[7],t[11],t[15]),this}matrix3FromTopLeft(){const e=this.elements;return new Matrix3(e[0],e[4],e[8],e[1],e[5],e[9],e[2],e[6],e[10])}setRotationFromEuler(e,t){const r=this.elements,{x:s,y:a,z:n}=e,o=Math.cos(s),l=Math.sin(s),h=Math.cos(a),c=Math.sin(a),u=Math.cos(n),f=Math.sin(n);if(void 0===t||"XYZ"===t){const e=o*u,t=o*f,s=l*u,a=l*f;r[0]=h*u,r[4]=-h*f,r[8]=c,r[1]=t+s*c,r[5]=e-a*c,r[9]=-l*h,r[2]=a-e*c,r[6]=s+t*c,r[10]=o*h}else console.error(`Error with matrix4 setRotationFromEuler. Order: ${t}`);return this}setRotationFromQuaternion(e){const t=this.elements,{x:r,y:s,z:a,w:n}=e,o=r+r,l=s+s,h=a+a,c=r*o,u=r*l,f=r*h,p=s*l,g=s*h,v=a*h,_=n*o,y=n*l,b=n*h;return t[0]=1-(p+v),t[4]=u-b,t[8]=f+y,t[1]=u+b,t[5]=1-(c+v),t[9]=g-_,t[2]=f-y,t[6]=g+_,t[10]=1-(c+p),this}multiplyMatrices(e,t){const r=e.elements,s=t.elements,a=this.elements,n=r[0],o=r[4],l=r[8],h=r[12],c=r[1],u=r[5],f=r[9],p=r[13],g=r[2],v=r[6],_=r[10],y=r[14],b=r[3],w=r[7],x=r[11],A=r[15],C=s[0],S=s[4],M=s[8],z=s[12],L=s[1],E=s[5],T=s[9],k=s[13],I=s[2],O=s[6],D=s[10],F=s[14],R=s[3],P=s[7],G=s[11],B=s[15];return a[0]=n*C+o*L+l*I+h*R,a[4]=n*S+o*E+l*O+h*P,a[8]=n*M+o*T+l*D+h*G,a[12]=n*z+o*k+l*F+h*B,a[1]=c*C+u*L+f*I+p*R,a[5]=c*S+u*E+f*O+p*P,a[9]=c*M+u*T+f*D+p*G,a[13]=c*z+u*k+f*F+p*B,a[2]=g*C+v*L+_*I+y*R,a[6]=g*S+v*E+_*O+y*P,a[10]=g*M+v*T+_*D+y*G,a[14]=g*z+v*k+_*F+y*B,a[3]=b*C+w*L+x*I+A*R,a[7]=b*S+w*E+x*O+A*P,a[11]=b*M+w*T+x*D+A*G,a[15]=b*z+w*k+x*F+A*B,this}multiplyScalar(e){const t=this.elements;return t[0]*=e,t[4]*=e,t[8]*=e,t[12]*=e,t[1]*=e,t[5]*=e,t[9]*=e,t[13]*=e,t[2]*=e,t[6]*=e,t[10]*=e,t[14]*=e,t[3]*=e,t[7]*=e,t[11]*=e,t[15]*=e,this}makeTranslation(e,t,r){return this.set(1,0,0,e,0,1,0,t,0,0,1,r,0,0,0,1),this}snap(e){e||(e=4);const t=Math.pow(10,4),r=this.elements;for(let e=0;e<16;e++){const s=Math.round(r[e]);s===Math.round(r[e]*t)/t&&(r[e]=s)}return this}transpose(){const e=this.elements;let t;return t=e[1],e[1]=e[4],e[4]=t,t=e[2],e[2]=e[8],e[8]=t,t=e[6],e[6]=e[9],e[9]=t,t=e[3],e[3]=e[12],e[12]=t,t=e[7],e[7]=e[13],e[13]=t,t=e[11],e[11]=e[14],e[14]=t,this}setPosition(e){const t=this.elements;return t[12]=e.x,t[13]=e.y,t[14]=e.z,this}translate(e){const t=this.elements;return t[12]+=e.x,t[13]+=e.y,t[14]+=e.z,this}getInverse(e,t){const r=this.elements,s=e.elements,a=s[0],n=s[4],o=s[8],l=s[12],h=s[1],c=s[5],u=s[9],f=s[13],p=s[2],g=s[6],v=s[10],_=s[14],y=s[3],b=s[7],w=s[11],x=s[15];r[0]=u*_*b-f*v*b+f*g*w-c*_*w-u*g*x+c*v*x,r[4]=l*v*b-o*_*b-l*g*w+n*_*w+o*g*x-n*v*x,r[8]=o*f*b-l*u*b+l*c*w-n*f*w-o*c*x+n*u*x,r[12]=l*u*g-o*f*g-l*c*v+n*f*v+o*c*_-n*u*_,r[1]=f*v*y-u*_*y-f*p*w+h*_*w+u*p*x-h*v*x,r[5]=o*_*y-l*v*y+l*p*w-a*_*w-o*p*x+a*v*x,r[9]=l*u*y-o*f*y-l*h*w+a*f*w+o*h*x-a*u*x,r[13]=o*f*p-l*u*p+l*h*v-a*f*v-o*h*_+a*u*_,r[2]=c*_*y-f*g*y+f*p*b-h*_*b-c*p*x+h*g*x,r[6]=l*g*y-n*_*y-l*p*b+a*_*b+n*p*x-a*g*x,r[10]=n*f*y-l*c*y+l*h*b-a*f*b-n*h*x+a*c*x,r[14]=l*c*p-n*f*p-l*h*g+a*f*g+n*h*_-a*c*_,r[3]=u*g*y-c*v*y-u*p*b+h*v*b+c*p*w-h*g*w,r[7]=n*v*y-o*g*y+o*p*b-a*v*b-n*p*w+a*g*w,r[11]=o*c*y-n*u*y-o*h*b+a*u*b+n*h*w-a*c*w,r[15]=n*u*p-o*c*p+o*h*g-a*u*g-n*h*v+a*c*v;const A=a*r[0]+h*r[4]+p*r[8]+y*r[12];if(0===A){const e="Matrix4.getInverse(): can't invert matrix, determinant is 0";if(t)throw new Error(e);return console.warn(e),this.identity(),this}return this.multiplyScalar(1/A),this}isReflected(){const e=this.elements,t=e[0],r=e[4],s=e[8],a=e[1],n=e[5],o=e[9],l=e[2],h=e[6],c=e[10];return t*n*c+a*h*s+l*r*o-l*n*s-a*r*c-t*h*o<0}scale(e){const t=this.elements,{x:r}=e,{y:s}=e,{z:a}=e;return t[0]*=r,t[4]*=s,t[8]*=a,t[1]*=r,t[5]*=s,t[9]*=a,t[2]*=r,t[6]*=s,t[10]*=a,t[3]*=r,t[7]*=s,t[11]*=a,this}getMaxScaleOnAxis(){const e=this.elements,t=e[0]*e[0]+e[1]*e[1]+e[2]*e[2],r=e[4]*e[4]+e[5]*e[5]+e[6]*e[6],s=e[8]*e[8]+e[9]*e[9]+e[10]*e[10];return Math.sqrt(Math.max(t,Math.max(r,s)))}makeFrustum(e,t,r,s,a,n){const o=this.elements,l=2*a/(t-e),h=2*a/(s-r),c=(t+e)/(t-e),u=(s+r)/(s-r),f=-(n+a)/(n-a),p=-2*n*a/(n-a);return o[0]=l,o[4]=0,o[8]=c,o[12]=0,o[1]=0,o[5]=h,o[9]=u,o[13]=0,o[2]=0,o[6]=0,o[10]=f,o[14]=p,o[3]=0,o[7]=0,o[11]=-1,o[15]=0,this}makePerspective(e,t,r,s){const a=r*Math.tan(n(.5*e)),o=-a,l=o*t,h=a*t;return this.makeFrustum(l,h,o,a,r,s)}makeOrthographic(e,t,r,s,a,n){const o=this.elements,l=1/(t-e),h=1/(r-s),c=1/(n-a),u=(t+e)*l,f=(r+s)*h,p=(n+a)*c;return o[0]=2*l,o[4]=0,o[8]=0,o[12]=-u,o[1]=0,o[5]=2*h,o[9]=0,o[13]=-f,o[2]=0,o[6]=0,o[10]=-2*c,o[14]=-p,o[3]=0,o[7]=0,o[11]=0,o[15]=1,this}isEqual(e){const t=e.elements,r=this.elements;return r[0]===t[0]&&r[4]===t[4]&&r[8]===t[8]&&r[12]===t[12]&&r[1]===t[1]&&r[5]===t[5]&&r[9]===t[9]&&r[13]===t[13]&&r[2]===t[2]&&r[6]===t[6]&&r[10]===t[10]&&r[14]===t[14]&&r[3]===t[3]&&r[7]===t[7]&&r[11]===t[11]&&r[15]===t[15]}clone(){const e=this.elements;return new Matrix4(e[0],e[4],e[8],e[12],e[1],e[5],e[9],e[13],e[2],e[6],e[10],e[14],e[3],e[7],e[11],e[15])}isIdentity(){const e=this.elements;return 1===e[0]&&0===e[4]&&0===e[8]&&0===e[12]&&0===e[1]&&1===e[5]&&0===e[9]&&0===e[13]&&0===e[2]&&0===e[6]&&1===e[10]&&0===e[14]&&0===e[3]&&0===e[7]&&0===e[11]&&1===e[15]}isNearlyIdentity(e){return this.clone().snap(e).isIdentity()}getScale(e){const t=this.elements;return e=e||new Vector3,h.set(t[0],t[1],t[2]),c.set(t[4],t[5],t[6]),u.set(t[8],t[9],t[10]),e.x=h.length(),e.y=c.length(),e.z=u.length(),e}lookAt(e,t,r){const s=this.elements;return u.subVectors(e,t).normalize(),0===u.length()&&(u.z=1),h.crossVectors(r,u).normalize(),0===h.length()&&(u.x+=1e-4,h.crossVectors(r,u).normalize()),c.crossVectors(u,h),s[0]=h.x,s[4]=c.x,s[8]=u.x,s[1]=h.y,s[5]=c.y,s[9]=u.y,s[2]=h.z,s[6]=c.z,s[10]=u.z,this}compose(e,t,r){const s=this.elements;return o.identity(),o.setRotationFromQuaternion(t),l.makeScale(r.x,r.y,r.z),this.multiplyMatrices(o,l),s[12]=e.x,s[13]=e.y,s[14]=e.z,this}}o=new Matrix4,l=new Matrix4;class Vector3{constructor(e,t,r){this.x=e||0,this.y=t||0,this.z=r||0,this.atomid=void 0}set(e,t,r){return this.x=e,this.y=t,this.z=r,this}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this}add(e){return this.x+=e.x,this.y+=e.y,this.z+=e.z,this}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this.z=e.z+t.z,this}multiplyVectors(e,t){return this.x=e.x*t.x,this.y=e.y*t.y,this.z=e.z*t.z,this}sub(e){return this.x-=e.x,this.y-=e.y,this.z-=e.z,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this.z=e.z-t.z,this}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this}divideScalar(e){return 0!==e?(this.x/=e,this.y/=e,this.z/=e):(this.x=0,this.y=0,this.z=0),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this.z=Math.max(this.z,e.z),this}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this.z=Math.min(this.z,e.z),this}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){const t=this.x-e.x,r=this.y-e.y,s=this.z-e.z;return t*t+r*r+s*s}applyMatrix3(e){const{x:t}=this,{y:r}=this,{z:s}=this,a=e.elements;return this.x=a[0]*t+a[3]*r+a[6]*s,this.y=a[1]*t+a[4]*r+a[7]*s,this.z=a[2]*t+a[5]*r+a[8]*s,this}applyMatrix4(e){const{x:t}=this,{y:r}=this,{z:s}=this,a=e.elements;return this.x=a[0]*t+a[4]*r+a[8]*s+a[12],this.y=a[1]*t+a[5]*r+a[9]*s+a[13],this.z=a[2]*t+a[6]*r+a[10]*s+a[14],this}applyProjection(e){const{x:t}=this,{y:r}=this,{z:s}=this,a=e.elements,n=a[3]*t+a[7]*r+a[11]*s+a[15];return this.x=(a[0]*t+a[4]*r+a[8]*s+a[12])/n,this.y=(a[1]*t+a[5]*r+a[9]*s+a[13])/n,this.z=(a[2]*t+a[6]*r+a[10]*s+a[14])/n,this}applyQuaternion(e){const{x:t}=this,{y:r}=this,{z:s}=this,a=e.x,n=e.y,o=e.z,l=e.w,h={};h.x=2*(r*o-s*n),h.y=2*(s*a-t*o),h.z=2*(t*n-r*a);const c={};return c.x=h.y*o-h.z*n,c.y=h.z*a-h.x*o,c.z=h.x*n-h.y*a,this.x=t+l*h.x+c.x,this.y=r+l*h.y+c.y,this.z=s+l*h.z+c.z,this}negate(){return this.multiplyScalar(-1)}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}normalize(){return this.divideScalar(this.length())}cross(e){const{x:t}=this,{y:r}=this,{z:s}=this;return this.x=r*e.z-s*e.y,this.y=s*e.x-t*e.z,this.z=t*e.y-r*e.x,this}crossVectors(e,t){return this.x=e.y*t.z-e.z*t.y,this.y=e.z*t.x-e.x*t.z,this.z=e.x*t.y-e.y*t.x,this}equals(e){return this.x==e.x&&this.y==e.y&&this.z==e.z}getPositionFromMatrix(e){return this.x=e.elements[12],this.y=e.elements[13],this.z=e.elements[14],this}setEulerFromRotationMatrix(e,t){const r=e.elements,a=r[0],n=r[4],o=r[8],l=r[5],h=r[9],c=r[6],u=r[10];return void 0===t||"XYZ"===t?(this.y=Math.asin(s(o,-1,1)),Math.abs(o)<.99999?(this.x=Math.atan2(-h,u),this.z=Math.atan2(-n,a)):(this.x=Math.atan2(c,l),this.z=0)):console.error(`Error with vector's setEulerFromRotationMatrix: Unknown order: ${t}`),this}rotateAboutVector(e,t){e.normalize();const r=Math.cos(t),s=Math.sin(t),a=this.clone().multiplyScalar(r),n=e.clone().cross(this).multiplyScalar(s),o=e.clone().multiplyScalar(e.clone().dot(this)).multiplyScalar(1-r),l=a.add(n).add(o);return this.x=l.x,this.y=l.y,this.z=l.z,this}setFromMatrixPosition(e){const t=e.elements;return this.x=t[12],this.y=t[13],this.z=t[14],this}transformDirection(e){const{x:t}=this,{y:r}=this,{z:s}=this,a=e.elements;return this.x=a[0]*t+a[4]*r+a[8]*s,this.y=a[1]*t+a[5]*r+a[9]*s,this.z=a[2]*t+a[6]*r+a[10]*s,this.normalize()}clone(){return new Vector3(this.x,this.y,this.z)}unproject(e){const t=o;return t.multiplyMatrices(e.matrixWorld,t.getInverse(e.projectionMatrix)),this.applyMatrix4(t)}}h=new Vector3,c=new Vector3,u=new Vector3;class Matrix3{constructor(e=1,t=0,r=0,s=0,a=1,n=0,o=0,l=0,h=1){this.elements=new Float32Array(9),this.set(e,t,r,s,a,n,o,l,h)}set(e,t,r,s,a,n,o,l,h){const c=this.elements;return c[0]=e,c[3]=t,c[6]=r,c[1]=s,c[4]=a,c[7]=n,c[2]=o,c[5]=l,c[8]=h,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(e){const t=e.elements;this.set(t[0],t[3],t[6],t[1],t[4],t[7],t[2],t[5],t[8])}multiplyScalar(e){const t=this.elements;return t[0]*=e,t[3]*=e,t[6]*=e,t[1]*=e,t[4]*=e,t[7]*=e,t[2]*=e,t[5]*=e,t[8]*=e,this}getInverse3(e){const t=e.elements,r=this.elements;r[0]=t[4]*t[8]-t[5]*t[7],r[3]=t[6]*t[5]-t[3]*t[8],r[6]=t[3]*t[7]-t[6]*t[4],r[1]=t[7]*t[2]-t[1]*t[8],r[4]=t[0]*t[8]-t[6]*t[2],r[7]=t[1]*t[6]-t[0]*t[7],r[2]=t[1]*t[5]-t[2]*t[4],r[5]=t[2]*t[3]-t[0]*t[5],r[8]=t[0]*t[4]-t[1]*t[3];const s=t[0]*r[0]+t[3]*r[1]+t[6]*r[2];return this.multiplyScalar(1/s),this}getInverse(e,t){const r=e.elements,s=this.elements;s[0]=r[10]*r[5]-r[6]*r[9],s[1]=-r[10]*r[1]+r[2]*r[9],s[2]=r[6]*r[1]-r[2]*r[5],s[3]=-r[10]*r[4]+r[6]*r[8],s[4]=r[10]*r[0]-r[2]*r[8],s[5]=-r[6]*r[0]+r[2]*r[4],s[6]=r[9]*r[4]-r[5]*r[8],s[7]=-r[9]*r[0]+r[1]*r[8],s[8]=r[5]*r[0]-r[1]*r[4];const a=r[0]*s[0]+r[1]*s[3]+r[2]*s[6];if(0===a){const e="Matrix3.getInverse(): can't invert matrix, determinant is 0";if(t)throw new Error(e);return console.warn(e),this.identity(),this}return this.multiplyScalar(1/a),this}getDeterminant(){const e=this.elements;return e[0]*e[4]*e[8]+e[1]*e[5]*e[6]+e[2]*e[3]*e[7]-e[2]*e[4]*e[6]-e[1]*e[3]*e[8]-e[0]*e[5]*e[7]}transpose(){let e;const t=this.elements;return e=t[1],t[1]=t[3],t[3]=e,e=t[2],t[2]=t[6],t[6]=e,e=t[5],t[5]=t[7],t[7]=e,this}clone(){const e=this.elements;return new Matrix3(e[0],e[3],e[6],e[1],e[4],e[7],e[2],e[5],e[8])}getMatrix4(){const e=this.elements;return new Matrix4(e[0],e[3],e[6],0,e[1],e[4],e[7],0,e[2],e[5],e[8],0)}}class Ray{constructor(e,t){this.origin=void 0!==e?e:new Vector3,this.direction=void 0!==t?t:new Vector3}set(e,t){return this.origin.copy(e),this.direction.copy(t),this}copy(e){return this.origin.copy(e.origin),this.direction.copy(e.direction),this}at(e,t){return(t||new Vector3).copy(this.direction).multiplyScalar(e).add(this.origin)}recast(e){const t=h;return this.origin.copy(this.at(e,t)),this}closestPointToPoint(e,t){const r=t||new Vector3;r.subVectors(e,this.origin);const s=r.dot(this.direction);return r.copy(this.direction).multiplyScalar(s).add(this.origin)}distanceToPoint(e){const t=h,r=t.subVectors(e,this.origin).dot(this.direction);return t.copy(this.direction).multiplyScalar(r).add(this.origin),t.distanceTo(e)}isIntersectionCylinder(){}isIntersectionSphere(e){return this.distanceToPoint(e.center)<=e.radius}isIntersectionPlane(e){return 0!==e.normal.dot(this.direction)||0===e.distanceToPoint(this.origin)}distanceToPlane(e){const t=e.normal.dot(this.direction);if(0===t)return 0===e.distanceToPoint(this.origin)?0:void 0;return-(this.origin.dot(e.normal)+e.constant)/t}intersectPlane(e,t){const r=this.distanceToPlane(e);if(void 0!==r)return this.at(r,t)}applyMatrix4(e){return this.direction.add(this.origin).applyMatrix4(e),this.origin.applyMatrix4(e),this.direction.sub(this.origin),this}clone(){return(new Ray).copy(this)}}function f(e,t,r,s,a,n){s=s*Math.PI/180,a=a*Math.PI/180,n=n*Math.PI/180;const o=e=>e*e,l=Math.cos(s),h=Math.cos(a),c=Math.cos(n),u=Math.sin(n);return new Matrix3(e,t*c,r*h,0,t*u,r*(l-h*c)/u,0,0,r*Math.sqrt(1-o(l)-o(h)-o(c)+2*l*h*c)/u)}},3351:(e,t,r)=>{"use strict";r.r(t),r.d(t,{Cylinder:()=>Cylinder,Sphere:()=>Sphere,Triangle:()=>Triangle});var s=r(9652);class Sphere{constructor(e={x:0,y:0,z:0},t=0){this.center=new s.Vector3(e.x,e.y,e.z),this.radius=t}set(e,t){return this.center.copy(e),this.radius=t,this}copy(e){return this.center.copy(e.center),this.radius=e.radius,this}applyMatrix4(e){return this.center.applyMatrix4(e),this.radius=this.radius*e.getMaxScaleOnAxis(),this}translate(e){return this.center.add(e),this}equals(e){return e.center.equals(this.center)&&e.radius===this.radius}clone(){return(new Sphere).copy(this)}}let a=new s.Vector3;class Cylinder{constructor(e=new s.Vector3,t=new s.Vector3,r=0){this.c1=e,this.c2=t,this.radius=r,this.direction=(new s.Vector3).subVectors(this.c2,this.c1).normalize()}copy(e){return this.c1.copy(e.c1),this.c2.copy(e.c2),this.direction.copy(e.direction),this.radius=e.radius,this}lengthSq(){return a.subVectors(this.c2,this.c1).lengthSq()}applyMatrix4(e){return this.direction.add(this.c1).applyMatrix4(e),this.c1.applyMatrix4(e),this.c2.applyMatrix4(e),this.direction.sub(this.c1).normalize(),this.radius=this.radius*e.getMaxScaleOnAxis(),this}}const n=new s.Vector3;class Triangle{constructor(e=new s.Vector3,t=new s.Vector3,r=new s.Vector3){this.a=e,this.b=t,this.c=r}copy(e){return this.a.copy(e.a),this.b.copy(e.b),this.c.copy(e.c),this}applyMatrix4(e){return this.a.applyMatrix4(e),this.b.applyMatrix4(e),this.c.applyMatrix4(e),this}getNormal(){var e=this.a.clone();return e.sub(this.b),n.subVectors(this.c,this.b),e.cross(n),e.normalize(),e}}},9158:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";__webpack_require__.r(__webpack_exports__),__webpack_require__.d(__webpack_exports__,{autoinit:()=>autoinit,autoload:()=>autoload,processing_autoinit:()=>processing_autoinit,viewers:()=>viewers});var _GLViewer__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(9230),_ProteinSurface4__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(9192),_utilities__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__(9005),_colors__WEBPACK_IMPORTED_MODULE_3__=__webpack_require__(2550),autoinit=!1,processing_autoinit=!1,viewers={};function autoload(viewer,callback){var i,dataname,type;if(null!=document.querySelector(".viewer_3Dmoljs")&&(autoinit=!0),autoinit){processing_autoinit=!0,viewer=null!=viewer?viewer:null;var nviewers=0;document.querySelectorAll(".viewer_3Dmoljs").forEach((viewerdiv=>{var datauri=[],datatypes=[],uri="";"static"==viewerdiv.style.position&&(viewerdiv.style.position="relative");var UI=null;if(type=null,viewerdiv.dataset.pdb)datauri.push("https://files.rcsb.org/view/"+viewerdiv.dataset.pdb+".pdb"),datatypes.push("pdb");else if(viewerdiv.dataset.cid)datatypes.push("sdf"),datauri.push("https://pubchem.ncbi.nlm.nih.gov/rest/pug/compound/cid/"+viewerdiv.dataset.cid+"/SDF?record_type=3d");else if(viewerdiv.dataset.href||viewerdiv.dataset.url){uri=viewerdiv.dataset.href?viewerdiv.dataset.href:viewerdiv.dataset.url,datauri.push(uri),type=uri.substring(uri.lastIndexOf(".")+1),datatypes.push(type);var molName=uri.substring(uri.lastIndexOf("/")+1,uri.lastIndexOf("."));"/"==molName&&(molName=uri.substring(uri.lastIndexOf("/")+1)),viewerdiv.dataset[datatypes[datatypes.length-1]]=molName}var divdata=viewerdiv.dataset;for(i in divdata)"pdb"===i.substring(0,3)&&"pdb"!==i?(datauri.push("https://files.rcsb.org/view/"+divdata[i]+".pdb"),datatypes.push("pdb")):"href"===i.substring(0,4)&&"href"!==i?(uri=divdata[i],datauri.push(uri),datatypes.push(uri.substring(uri.lastIndexOf(".")+1))):"cid"===i.substring(0,3)&&"cid"!==i&&(datauri.push("https://pubchem.ncbi.nlm.nih.gov/rest/pug/compound/cid/"+divdata[i]+"/SDF?record_type=3d"),datatypes.push("sdf"));var options={};viewerdiv.dataset.options&&(options=(0,_utilities__WEBPACK_IMPORTED_MODULE_2__.specStringToObject)(viewerdiv.dataset.options));var bgcolor=_colors__WEBPACK_IMPORTED_MODULE_3__.CC.color(viewerdiv.dataset.backgroundcolor),bgalpha=viewerdiv.dataset.backgroundalpha;bgalpha=null==bgalpha?1:parseFloat(bgalpha);var style={line:{}};viewerdiv.dataset.style&&(style=(0,_utilities__WEBPACK_IMPORTED_MODULE_2__.specStringToObject)(viewerdiv.dataset.style));var select={};viewerdiv.dataset.select&&(select=(0,_utilities__WEBPACK_IMPORTED_MODULE_2__.specStringToObject)(viewerdiv.dataset.select));var selectstylelist=[],surfaces=[],labels=[],zoomto={},spin=null,d=viewerdiv.dataset,stylere=/style(.+)/,surfre=/surface(.*)/,reslabre=/labelres(.*)/,keys=[];for(dataname in d)Object.prototype.hasOwnProperty.call(d,dataname)&&keys.push(dataname);for(keys.sort(),i=0;i{UI.loadSurface("VDW",t,r,e)})):e.addSurface(_ProteinSurface4__WEBPACK_IMPORTED_MODULE_1__.SurfaceType.VDW,r,t,t)}for(i=0;i{"complete"===document.readyState&&autoload()}},2550:(e,t,r)=>{"use strict";r.r(t),r.d(t,{CC:()=>CC,Color:()=>Color,builtinColorSchemes:()=>c,chains:()=>h,elementColors:()=>o,htmlColors:()=>s,residues:()=>l,ssColors:()=>a});class Color{constructor(e,t,r){return this.r=0,this.g=0,this.b=0,arguments.length>1&&"number"==typeof e?(this.r=e||0,this.g=t||0,this.b=r||0,this):this.set(e||0)}set(e){return e instanceof Color?e.clone():("number"==typeof e?this.setHex(e):"object"==typeof e&&(this.r=(null==e?void 0:e.r)||0,this.g=(null==e?void 0:e.g)||0,this.b=(null==e?void 0:e.b)||0),this)}setHex(e){return e=Math.floor(e),this.r=(e>>16&255)/255,this.g=(e>>8&255)/255,this.b=(255&e)/255,this}getHex(){return Math.round(255*this.r)<<16|Math.round(255*this.g)<<8|Math.round(255*this.b)}clone(){return new Color(this.r,this.g,this.b)}copy(e){return this.r=e.r,this.g=e.g,this.b=e.b,this}scaled(){var e={};return e.r=Math.round(255*this.r),e.g=Math.round(255*this.g),e.b=Math.round(255*this.b),e.a=1,e}}class CC{static color(e){if(!e)return CC.cache[0];if(e instanceof Color)return e;if("number"==typeof e&&void 0!==CC.cache[e])return CC.cache[e];if(e&&Array.isArray(e))return e.map(CC.color);let t=CC.getHex(e),r=new Color(t);return CC.cache[t]=r,r}static getHex(e){var t;if(Array.isArray(e))return e.map(CC.getHex);if("string"==typeof e){let r=e;if(!isNaN(parseInt(r)))return parseInt(r);if(r=r.trim(),4==r.length&&"#"==r[0]&&(r="#"+r[1]+r[1]+r[2]+r[2]+r[3]+r[3]),7==r.length&&"#"==r[0])return parseInt(r.substring(1),16);let s=CC.rgbRegEx.exec(r);if(s){""!=s[1]&&console.log("WARNING: Opacity value in rgba ignored. Specify separately as opacity attribute.");let e=0;for(let t=2;t<5;t++){e*=256;let r=s[t].endsWith("%")?255*parseFloat(s[t])/100:parseFloat(s[t]);e+=Math.round(r)}return e}return(null===(t=null===window||void 0===window?void 0:window.$3Dmol)||void 0===t?void 0:t.htmlColors[e.toLowerCase()])||0}return e}}CC.rgbRegEx=/rgb(a?)\(\s*([^ ,\)\t]+)\s*,\s*([^ ,\)\t]+)\s*,\s*([^ ,\)\t]+)/i,CC.cache={0:new Color(0)};const s={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgrey:11119017,darkgreen:25600,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,grey:8421504,green:32768,greenyellow:11403055,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgrey:13882323,lightgreen:9498256,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},a={pyMol:{h:16711680,s:16776960,c:65280},Jmol:{h:16711808,s:16762880,c:16777215}},n={H:16777215,He:16761035,HE:16761035,Li:11674146,LI:11674146,B:65280,C:13158600,N:9408511,O:15728640,F:14329120,Na:255,NA:255,Mg:2263842,MG:2263842,Al:8421520,AL:8421520,Si:14329120,SI:14329120,P:16753920,S:16762930,Cl:65280,CL:65280,Ca:8421520,CA:8421520,Ti:8421520,TI:8421520,Cr:8421520,CR:8421520,Mn:8421520,MN:8421520,Fe:16753920,FE:16753920,Ni:10824234,NI:10824234,Cu:10824234,CU:10824234,Zn:10824234,ZN:10824234,Br:10824234,BR:10824234,Ag:8421520,AG:8421520,I:10494192,Ba:16753920,BA:16753920,Au:14329120,AU:14329120},o={defaultColor:16716947,Jmol:{H:16777215,He:14286847,HE:14286847,Li:13402367,LI:13402367,Be:12779264,BE:12779264,B:16758197,C:9474192,N:3166456,O:16715021,F:9494608,Ne:11789301,NE:11789301,Na:11230450,NA:11230450,Mg:9109248,MG:9109248,Al:12560038,AL:12560038,Si:1578e4,SI:1578e4,P:16744448,S:16777008,Cl:2093087,CL:2093087,Ar:8442339,AR:8442339,K:9388244,Ca:4062976,CA:4062976,Sc:15132390,SC:15132390,Ti:12567239,TI:12567239,V:10921643,Cr:9083335,CR:9083335,Mn:10255047,MN:10255047,Fe:14706227,FE:14706227,Co:15765664,CO:15765664,Ni:5296208,NI:5296208,Cu:13140019,CU:13140019,Zn:8224944,ZN:8224944,Ga:12750735,GA:12750735,Ge:6721423,GE:6721423,As:12419299,AS:12419299,Se:16752896,SE:16752896,Br:10889513,BR:10889513,Kr:6076625,KR:6076625,Rb:7351984,RB:7351984,Sr:65280,SR:65280,Y:9764863,Zr:9756896,ZR:9756896,Nb:7586505,NB:7586505,Mo:5551541,MO:5551541,Tc:3907230,TC:3907230,Ru:2396047,RU:2396047,Rh:687500,RH:687500,Pd:27013,PD:27013,Ag:12632256,AG:12632256,Cd:16767375,CD:16767375,In:10909043,IN:10909043,Sn:6717568,SN:6717568,Sb:10380213,SB:10380213,Te:13924864,TE:13924864,I:9699476,Xe:4366e3,XE:4366e3,Cs:5707663,CS:5707663,Ba:51456,BA:51456,La:7394559,LA:7394559,Ce:16777159,CE:16777159,Pr:14286791,PR:14286791,Nd:13107143,ND:13107143,Pm:10747847,PM:10747847,Sm:9437127,SM:9437127,Eu:6422471,EU:6422471,Gd:4587463,GD:4587463,Tb:3211207,TB:3211207,Dy:2097095,DY:2097095,Ho:65436,HO:65436,Er:58997,ER:58997,Tm:54354,TM:54354,Yb:48952,YB:48952,Lu:43812,LU:43812,Hf:5096191,HF:5096191,Ta:5089023,TA:5089023,W:2200790,Re:2522539,RE:2522539,Os:2516630,OS:2516630,Ir:1528967,IR:1528967,Pt:13684960,PT:13684960,Au:16765219,AU:16765219,Hg:12105936,HG:12105936,Tl:10900557,TL:10900557,Pb:5724513,PB:5724513,Bi:10375093,BI:10375093,Po:11230208,PO:11230208,At:7688005,AT:7688005,Rn:4358806,RN:4358806,Fr:4325478,FR:4325478,Ra:32e3,RA:32e3,Ac:7384058,AC:7384058,Th:47871,TH:47871,Pa:41471,PA:41471,U:36863,Np:33023,NP:33023,Pu:27647,PU:27647,Am:5528818,AM:5528818,Cm:7888099,CM:7888099,Bk:9064419,BK:9064419,Cf:10565332,CF:10565332,Es:11739092,ES:11739092,Fm:11739066,FM:11739066,Md:11734438,MD:11734438,No:12389767,NO:12389767,Lr:13041766,LR:13041766,Rf:13369433,RF:13369433,Db:13697103,DB:13697103,Sg:14221381,SG:14221381,Bh:14680120,BH:14680120,Hs:15073326,HS:15073326,Mt:15400998,MT:15400998},rasmol:n,defaultColors:Object.assign({},n),greenCarbon:Object.assign(Object.assign({},n),{C:65280}),cyanCarbon:Object.assign(Object.assign({},n),{C:65535}),magentaCarbon:Object.assign(Object.assign({},n),{C:16711935}),yellowCarbon:Object.assign(Object.assign({},n),{C:16776960}),whiteCarbon:Object.assign(Object.assign({},n),{C:16777215}),orangeCarbon:Object.assign(Object.assign({},n),{C:16753920}),purpleCarbon:Object.assign(Object.assign({},n),{C:8388736}),blueCarbon:Object.assign(Object.assign({},n),{C:255})},l={amino:{ALA:13158600,ARG:1334015,ASN:56540,ASP:15075850,CYS:15132160,GLN:56540,GLU:15075850,GLY:15461355,HIS:8553170,ILE:1016335,LEU:1016335,LYS:1334015,MET:15132160,PHE:3289770,PRO:14456450,SER:16422400,THR:16422400,TRP:11819700,TYR:3289770,VAL:1016335,ASX:16738740,GLX:16738740},shapely:{ALA:9240460,ARG:124,ASN:16743536,ASP:10485826,CYS:16777072,GLN:16731212,GLU:6684672,GLY:16777215,HIS:7368959,ILE:19456,LEU:4546117,LYS:4671416,MET:12099650,PHE:5459026,PRO:5395026,SER:16740418,THR:12078080,TRP:5195264,TYR:9203788,VAL:16747775,ASX:16711935,GLX:16711935},nucleic:{A:10526975,G:16740464,I:8454143,C:16747595,T:10551200,U:16744576}},h={atom:{A:12636415,B:11599792,C:16761032,D:16777088,E:16761087,F:11596016,G:16765040,H:15761536,I:16113331,J:49151,K:13458524,L:6737322,M:10145074,N:15631086,O:52945,P:65407,Q:3978097,R:139,S:12433259,T:25600,U:8388608,V:8421376,W:8388736,X:32896,Y:12092939,Z:11674146},hetatm:{A:9478351,B:8441752,C:13602992,D:13619056,E:13603023,F:8437952,G:13607008,H:12603504,I:12955267,J:42959,K:11881548,L:5682578,M:9090346,N:12481214,O:46753,P:53103,Q:3447649,R:187,S:10854235,T:37888,U:11534336,V:11579392,W:11534512,X:45232,Y:15250963,Z:12726834}},c={ssPyMol:{prop:"ss",map:a.pyMol},ssJmol:{prop:"ss",map:a.Jmol},Jmol:{prop:"elem",map:o.Jmol},amino:{prop:"resn",map:l.amino},shapely:{prop:"resn",map:l.shapely},nucleic:{prop:"resn",map:l.nucleic},chain:{prop:"chain",map:h.atom},rasmol:{prop:"elem",map:o.rasmol},default:{prop:"elem",map:o.defaultColors},greenCarbon:{prop:"elem",map:o.greenCarbon},chainHetatm:{prop:"chain",map:h.hetatm},cyanCarbon:{prop:"elem",map:o.cyanCarbon},magentaCarbon:{prop:"elem",map:o.magentaCarbon},purpleCarbon:{prop:"elem",map:o.purpleCarbon},whiteCarbon:{prop:"elem",map:o.whiteCarbon},orangeCarbon:{prop:"elem",map:o.orangeCarbon},yellowCarbon:{prop:"elem",map:o.yellowCarbon},blueCarbon:{prop:"elem",map:o.blueCarbon}}},6163:(e,t,r)=>{"use strict";r.r(t),r.d(t,{drawCartoon:()=>E,subdivide_spline:()=>u});var s=r(9652),a=r(3351),n=r(7693),o=r(1460),l=r(2550),h=r(4406),c=r(9005);function u(e,t){var r,a,n,o,l,h,c,u,f,p=[],g=e;for((g=[]).push(e[0]),r=1,a=e.length-1;r0){var y=[a,a+1,a-1,a-2],b=f.faceidx;v[b]=y[0],v[b+1]=y[1],v[b+2]=y[3],v[b+3]=y[1],v[b+4]=y[2],v[b+5]=y[3],f.faceidx+=6}f.vertices+=2}}function b(e,t,r,s,n,o,h){h&&"default"!==h||(h="rectangle"),"edged"===h?function(e,t,r,s,n,o){if(!(t.length<2)){var h,c;if(h=t[0],c=t[t.length-1],h=u(h,s),c=u(c,s),!n)return y(e,h,c,r);var f,p,g,v,_,b,w,x,A,C,S,M,z,L,E,T,k,I,O,D,F,R,P=[],G=[[0,2,-6,-8],[-4,-2,6,4],[7,-1,-5,3],[-3,5,1,-7]];for(z=0,L=h.length;z0){var N=void 0!==M&&void 0!==S&&M.serial!==S.serial;for(E=0;E<4;E++){var U=[b+G[E][0],b+G[E][1],b+G[E][2],b+G[E][3]];if(R[x=O.faceidx]=U[0],R[x+1]=U[1],R[x+2]=U[3],R[x+3]=U[1],R[x+4]=U[2],R[x+5]=U[3],O.faceidx+=6,S.clickable||M.clickable||S.hoverable||M.hoverable){var V=P[U[3]].clone(),j=P[U[0]].clone(),H=P[U[2]].clone(),W=P[U[1]].clone();if(V.atom=P[U[3]].atom||null,H.atom=P[U[2]].atom||null,j.atom=P[U[0]].atom||null,W.atom=P[U[1]].atom||null,N){var q=V.clone().add(j).multiplyScalar(.5),Y=H.clone().add(W).multiplyScalar(.5),Z=V.clone().add(W).multiplyScalar(.5);E%2==0?((M.clickable||M.hoverable)&&(T=new a.Triangle(q,Z,V),k=new a.Triangle(Y,H,Z),I=new a.Triangle(Z,H,V),M.intersectionShape.triangle.push(T),M.intersectionShape.triangle.push(k),M.intersectionShape.triangle.push(I)),(S.clickable||S.hoverable)&&(T=new a.Triangle(j,W,Z),k=new a.Triangle(W,Y,Z),I=new a.Triangle(j,Z,q),S.intersectionShape.triangle.push(T),S.intersectionShape.triangle.push(k),S.intersectionShape.triangle.push(I))):((S.clickable||S.hoverable)&&(T=new a.Triangle(q,Z,V),k=new a.Triangle(Y,H,Z),I=new a.Triangle(Z,H,V),S.intersectionShape.triangle.push(T),S.intersectionShape.triangle.push(k),S.intersectionShape.triangle.push(I)),(M.clickable||M.hoverable)&&(T=new a.Triangle(j,W,Z),k=new a.Triangle(W,Y,Z),I=new a.Triangle(j,Z,q),M.intersectionShape.triangle.push(T),M.intersectionShape.triangle.push(k),M.intersectionShape.triangle.push(I)))}else(S.clickable||S.hoverable)&&(T=new a.Triangle(j,W,V),k=new a.Triangle(W,H,V),S.intersectionShape.triangle.push(T),S.intersectionShape.triangle.push(k))}}}O.vertices+=8,M=S}var X=P.length-8;for(D=(O=e.updateGeoGroup(8)).vertexArray,F=O.colorArray,R=O.faceArray,w=3*(b=O.vertices),x=O.faceidx,z=0;z<4;z++){P.push(P[2*z]),P.push(P[X+2*z]);var K=P[2*z],$=P[X+2*z];D[w+6*z]=K.x,D[w+1+6*z]=K.y,D[w+2+6*z]=K.z,D[w+3+6*z]=$.x,D[w+4+6*z]=$.y,D[w+5+6*z]=$.z,F[w+6*z]=A.r,F[w+1+6*z]=A.g,F[w+2+6*z]=A.b,F[w+3+6*z]=A.r,F[w+4+6*z]=A.g,F[w+5+6*z]=A.b}X+=8,T=[b,b+2,b+6,b+4],k=[b+1,b+5,b+7,b+3],R[x]=T[0],R[x+1]=T[1],R[x+2]=T[3],R[x+3]=T[1],R[x+4]=T[2],R[x+5]=T[3],R[x+6]=k[0],R[x+7]=k[1],R[x+8]=k[3],R[x+9]=k[1],R[x+10]=k[2],R[x+11]=k[3],O.faceidx+=12,O.vertices+=8}}(e,t,r,s,n):"rectangle"!==h&&"oval"!==h&&"parabola"!==h||function(e,t,r,s,n,o,h){var c,f,p,g,v,_,b,w,x,A;if((p=t.length)<2||t[0].length<2)return;for(c=0;c0&&(c-=1,o=!0),I=Math.round(c*(r.length-1)/g),k=l.CC.color(r[I]),x=b,A=w,b=[],w=[],v=[],void 0!==t[0][c].atom&&(T=t[0][c].atom,"oval"===h?_=C:"rectangle"===h?_=S:"parabola"===h&&(_=M)),_||(_=S),f=0;f0&&!o){for(f=0;f<2*p;f++)R=[z+P[f][0],z+P[f][1],z+P[f][2],z+P[f][3]],F[E=G.faceidx]=R[0],F[E+1]=R[1],F[E+2]=R[3],F[E+3]=R[1],F[E+4]=R[2],F[E+5]=R[3],G.faceidx+=6;if(T.clickable||T.hoverable){var U=[];for(f in U.push(new a.Triangle(x[0],b[0],b[p-1])),U.push(new a.Triangle(x[0],b[p-1],x[p-1])),U.push(new a.Triangle(x[p-1],b[p-1],w[p-1])),U.push(new a.Triangle(x[p-1],w[p-1],A[p-1])),U.push(new a.Triangle(w[0],A[0],A[p-1])),U.push(new a.Triangle(w[p-1],w[0],A[p-1])),U.push(new a.Triangle(b[0],x[0],A[0])),U.push(new a.Triangle(w[0],b[0],A[0])),U)T.intersectionShape.triangle.push(U[f])}}G.vertices+=2*p}for(O=G.vertexArray,D=G.colorArray,F=G.faceArray,L=3*(z=G.vertices),E=G.faceidx,c=0;c=0&&r<1&&(o.transparent=!0,o.opacity=r),o.outline=s;var l=new n.Mesh(t,o);e.add(l)}}function C(e,t,r,a,n,o,l,h,c){var u,_,y,b,w,x;if(a&&n&&l){var A=n.sub(a);A.normalize();var C=h[c];for(_=c+1;_0&&b(q,Z,Y,p,O,0,Z.style);var r=[],s=null;if(t){for(D=0;D0&&b(q,Z,Y,p,O,0,Z.style),Z=[],D=0;D{"use strict";r.r(t),r.d(t,{CAP:()=>y.CAP,CC:()=>a.CC,Color:()=>a.Color,CustomLinear:()=>s.CustomLinear,Cylinder:()=>u.Cylinder,GLDraw:()=>y.GLDraw,GLModel:()=>w.GLModel,GLShape:()=>_.GLShape,GLViewer:()=>x.GLViewer,GLVolumetricRender:()=>v.GLVolumetricRender,Gradient:()=>s.Gradient,GradientType:()=>s.GradientType,Label:()=>n.Label,LabelCount:()=>n.LabelCount,MarchingCube:()=>p.MarchingCube,MarchingCubeInitializer:()=>p.MarchingCubeInitializer,Matrix3:()=>c.Matrix3,Matrix4:()=>c.Matrix4,Parsers:()=>h.Parsers,PausableTimer:()=>f.PausableTimer,PointGrid:()=>p.PointGrid,ProteinSurface:()=>p.ProteinSurface,Quaternion:()=>c.Quaternion,ROYGB:()=>s.ROYGB,RWB:()=>s.RWB,Ray:()=>c.Ray,Sinebow:()=>s.Sinebow,Sphere:()=>u.Sphere,SurfaceType:()=>p.SurfaceType,Triangle:()=>u.Triangle,Vector2:()=>c.Vector2,Vector3:()=>c.Vector3,VolumeData:()=>g.VolumeData,adjustVolumeStyle:()=>f.adjustVolumeStyle,applyPartialCharges:()=>l,autoinit:()=>A.autoinit,autoload:()=>A.autoload,base64ToArray:()=>f.base64ToArray,bondLength:()=>h.bondLength,builtinColorSchemes:()=>a.builtinColorSchemes,builtinGradients:()=>s.builtinGradients,chains:()=>a.chains,clamp:()=>c.clamp,conversionMatrix3:()=>c.conversionMatrix3,createStereoViewer:()=>x.createStereoViewer,createViewer:()=>x.createViewer,createViewerGrid:()=>x.createViewerGrid,deepCopy:()=>f.deepCopy,degToRad:()=>c.degToRad,download:()=>f.download,drawCartoon:()=>b.drawCartoon,elementColors:()=>a.elementColors,extend:()=>f.extend,get:()=>f.get,getAtomProperty:()=>f.getAtomProperty,getColorFromStyle:()=>f.getColorFromStyle,getElement:()=>f.getElement,getExtent:()=>f.getExtent,getGradient:()=>s.getGradient,getPropertyRange:()=>f.getPropertyRange,getbin:()=>f.getbin,htmlColors:()=>a.htmlColors,isEmptyObject:()=>f.isEmptyObject,isNumeric:()=>f.isNumeric,makeFunction:()=>f.makeFunction,mergeGeos:()=>f.mergeGeos,normalizeValue:()=>s.normalizeValue,partialCharges:()=>o,processing_autoinit:()=>A.processing_autoinit,residues:()=>a.residues,setBondLength:()=>h.setBondLength,setSyncSurface:()=>p.setSyncSurface,specStringToObject:()=>f.specStringToObject,splitMesh:()=>_.splitMesh,ssColors:()=>a.ssColors,subdivide_spline:()=>b.subdivide_spline,syncSurface:()=>p.syncSurface,viewers:()=>A.viewers});var s=r(1460),a=r(2550),n=r(7825);const o={"ALA:N":-.15,"ALA:CA":.1,"ALA:CB":0,"ALA:C":.6,"ALA:O":-.55,"ARG:N":-.15,"ARG:CA":.1,"ARG:CB":0,"ARG:CG":0,"ARG:CD":.1,"ARG:NE":-.1,"ARG:CZ":.5,"ARG:NH1":.25,"ARG:NH2":.25,"ARG:C":.6,"ARG:O":-.55,"ASN:N":-.15,"ASN:CA":.1,"ASN:CB":0,"ASN:CG":.55,"ASN:OD1":-.55,"ASN:ND2":0,"ASN:C":.6,"ASN:O":-.55,"ASP:N":-.15,"ASP:CA":.1,"ASP:CB":0,"ASP:CG":.14,"ASP:OD1":-.57,"ASP:OD2":-.57,"ASP:C":.6,"ASP:O":-.55,"CYS:N":-.15,"CYS:CA":.1,"CYS:CB":.19,"CYS:SG":-.19,"CYS:C":.6,"CYS:O":-.55,"GLN:N":-.15,"GLN:CA":.1,"GLN:CB":0,"GLN:CG":0,"GLN:CD":.55,"GLN:OE1":-.55,"GLN:NE2":0,"GLN:C":.6,"GLN:O":-.55,"GLU:N":-.15,"GLU:CA":.1,"GLU:CB":0,"GLU:CG":0,"GLU:CD":.14,"GLU:OE1":-.57,"GLU:OE2":-.57,"GLU:C":.6,"GLU:O":-.55,"GLY:N":-.15,"GLY:CA":.1,"GLY:C":.6,"GLY:O":-.55,"HIS:N":-.15,"HIS:CA":.1,"HIS:CB":0,"HIS:CG":.1,"HIS:ND1":-.1,"HIS:CD2":.1,"HIS:NE2":-.4,"HIS:CE1":.3,"HIS:C":.6,"HIS:O":-.55,"ILE:N":-.15,"ILE:CA":.1,"ILE:CB":0,"ILE:CG2":0,"ILE:CG1":0,"ILE:CD":0,"ILE:C":.6,"ILE:O":-.55,"LEU:N":-.15,"LEU:CA":.1,"LEU:CB":0,"LEU:CG":0,"LEU:CD1":0,"LEU:CD2":0,"LEU:C":.6,"LEU:O":-.55,"LYS:N":-.15,"LYS:CA":.1,"LYS:CB":0,"LYS:CG":0,"LYS:CD":0,"LYS:CE":.25,"LYS:NZ":.75,"LYS:C":.6,"LYS:O":-.55,"MET:N":-.15,"MET:CA":.1,"MET:CB":0,"MET:CG":.06,"MET:SD":-.12,"MET:CE":.06,"MET:C":.6,"MET:O":-.55,"PHE:N":-.15,"PHE:CA":.1,"PHE:CB":0,"PHE:CG":0,"PHE:CD1":0,"PHE:CD2":0,"PHE:CE1":0,"PHE:CE2":0,"PHE:CZ":0,"PHE:C":.6,"PHE:O":-.55,"PRO:N":-.25,"PRO:CD":.1,"PRO:CA":.1,"PRO:CB":0,"PRO:CG":0,"PRO:C":.6,"PRO:O":-.55,"SER:N":-.15,"SER:CA":.1,"SER:CB":.25,"SER:OG":-.25,"SER:C":.6,"SER:O":-.55,"THR:N":-.15,"THR:CA":.1,"THR:CB":.25,"THR:OG1":-.25,"THR:CG2":0,"THR:C":.6,"THR:O":-.55,"TRP:N":-.15,"TRP:CA":.1,"TRP:CB":0,"TRP:CG":-.03,"TRP:CD2":.1,"TRP:CE2":-.04,"TRP:CE3":-.03,"TRP:CD1":.06,"TRP:NE1":-.06,"TRP:CZ2":0,"TRP:CZ3":0,"TRP:CH2":0,"TRP:C":.6,"TRP:O":-.55,"TYR:N":-.15,"TYR:CA":.1,"TYR:CB":0,"TYR:CG":0,"TYR:CD1":0,"TYR:CE1":0,"TYR:CD2":0,"TYR:CE2":0,"TYR:CZ":.25,"TYR:OH":-.25,"TYR:C":.6,"TYR:O":-.55,"VAL:N":-.15,"VAL:CA":.1,"VAL:CB":0,"VAL:CG1":0,"VAL:CG2":0,"VAL:C":.6,"VAL:O":-.55};function l(e,t){if((!t||void 0===e.partialCharge)&&e.resn&&e.atom){var r=e.resn+":"+e.atom;e.properties.partialCharge=o[r]}}var h=r(2640),c=r(9652),u=r(3351),f=r(9005),p=r(9192),g=r(7323),v=r(1496),_=r(8783),y=r(4406),b=r(6163),w=r(8223),x=r(9230),A=r(9158);window&&(window.$3Dmol=t)},972:(e,t,r)=>{"use strict";r.r(t),r.d(t,{CUBE:()=>o});var s=r(7693),a=r(3920);const n={1:"H",2:"He",3:"Li",4:"Be",5:"B",6:"C",7:"N",8:"O",9:"F",10:"Ne",11:"Na",12:"Mg",13:"Al",14:"Si",15:"P",16:"S",17:"Cl",18:"Ar",19:"K",20:"Ca",21:"Sc",22:"Ti",23:"V",24:"Cr",25:"Mn",26:"Fe",27:"Co",28:"Ni",29:"Cu",30:"Zn",31:"Ga",32:"Ge",33:"As",34:"Se",35:"Br",36:"Kr",37:"Rb",38:"Sr",39:"Y",40:"Zr",41:"Nb",42:"Mo",43:"Tc",44:"Ru",45:"Rh",46:"Pd",47:"Ag",48:"Cd",49:"In",50:"Sn",51:"Sb",52:"Te",53:"I",54:"Xe",55:"Cs",56:"Ba",71:"Lu",72:"Hf",73:"Ta",74:"W",75:"Re",76:"Os",77:"Ir",78:"Pt",79:"Au",80:"Hg",81:"Tl",82:"Pb",83:"Bi",84:"Po",85:"At",86:"Rn",87:"Fr",88:"Ra",104:"Rf",105:"Db",106:"Sg",107:"Bh",108:"Hs",109:"Mt",110:"Ds",111:"Rg",112:"Cn",113:"Nh",114:"Fl",115:"Mc",116:"Lv",117:"Ts",118:"Og",57:"La",58:"Ce",59:"Pr",60:"Nd",61:"Pm",62:"Sm",63:"Eu",64:"Gd",65:"Tb",66:"Dy",67:"Ho",68:"Er",69:"Tm",70:"Yb",89:"Ac",90:"Th",91:"Pa",92:"U",93:"Np",94:"Pu",95:"Am",96:"Cm",97:"Bk",98:"Cf",99:"Es",100:"Fm",101:"Md",102:"No"};function o(e,t){t=t||{};var r=[[]],o=e.split(/\r?\n/),l=void 0===t.assignBonds||t.assignBonds;if(o.length<6)return r;var h=o[2].replace(/^\s+/,"").replace(/\s+/g," ").split(" "),c=Math.abs(parseFloat(h[0]));let u={};var f=u.origin=new s.Vector3(parseFloat(h[1]),parseFloat(h[2]),parseFloat(h[3]));h=o[3].replace(/^\s+/,"").replace(/\s+/g," ").split(" ");var p=(h=o[3].replace(/^\s+/,"").replace(/\s+/g," ").split(" "))[0]>0?.529177:1;f.multiplyScalar(p);var g=Math.abs(h[0]),v=new s.Vector3(parseFloat(h[1]),parseFloat(h[2]),parseFloat(h[3])).multiplyScalar(p);h=o[4].replace(/^\s+/,"").replace(/\s+/g," ").split(" ");var _=Math.abs(h[0]),y=new s.Vector3(parseFloat(h[1]),parseFloat(h[2]),parseFloat(h[3])).multiplyScalar(p);h=o[5].replace(/^\s+/,"").replace(/\s+/g," ").split(" ");var b=Math.abs(h[0]),w=new s.Vector3(parseFloat(h[1]),parseFloat(h[2]),parseFloat(h[3])).multiplyScalar(p);if(u.size={x:g,y:_,z:b},u.unit=new s.Vector3(v.x,y.y,w.z),0!=v.y||0!=v.z||0!=y.x||0!=y.z||0!=w.x||0!=w.y){u.matrix4=new s.Matrix4(v.x,y.x,w.x,0,v.y,y.y,w.y,0,v.z,y.z,w.z,0,0,0,0,1);let e=(new s.Matrix4).makeTranslation(f.x,f.y,f.z);u.matrix4=u.matrix4.multiplyMatrices(e,u.matrix4),u.matrix=u.matrix4.matrix3FromTopLeft(),u.origin=new s.Vector3(0,0,0),u.unit=new s.Vector3(1,1,1)}r.modelData=[{cryst:u}],o=o.splice(6,c);for(var x=r[r.length-1].length,A=x+o.length,C=x;C{"use strict";r.r(t),r.d(t,{VASP:()=>a});var s=r(7693);function a(e){var t=[[]],r={},a=e.replace(/^\s+/,"").split(/\r?\n/);if(a.length<3)return t;if(!a[1].match(/\d+/))return console.log("Warning: second line of the vasp structure file must be a number"),t;if(r.length=parseFloat(a[1]),r.length<0)return console.log("Warning: Vasp implementation for negative lattice lengths is not yet available"),t;r.xVec=new Float32Array(a[2].replace(/^\s+/,"").split(/\s+/)),r.yVec=new Float32Array(a[3].replace(/^\s+/,"").split(/\s+/)),r.zVec=new Float32Array(a[4].replace(/^\s+/,"").split(/\s+/));var n=new s.Matrix3(r.xVec[0],r.xVec[1],r.xVec[2],r.yVec[0],r.yVec[1],r.yVec[2],r.zVec[0],r.zVec[1],r.zVec[2]);n.multiplyScalar(r.length),t.modelData=[{symmetries:[],cryst:{matrix:n}}];var o=a[5].replace(/\s+/,"").replace(/\s+$/,"").split(/\s+/),l=new Int16Array(a[6].replace(/^\s+/,"").split(/\s+/)),h=a[7].replace(/\s+/,"");if(h.match(/C/))h="cartesian";else{if(!h.match(/D/))return console.log("Warning: Unknown vasp mode in POSCAR file: mode must be either C(artesian) or D(irect)"),t;h="direct"}if(o.length!=l.length)return console.log("Warning: declaration of atomary species wrong:"),console.log(o),console.log(l),t;a.splice(0,8);for(var c=0,u=0,f=o.length;u{"use strict";r.r(t),r.d(t,{Parsers:()=>F,bondLength:()=>_.bondLength,setBondLength:()=>_.setBondLength});var s=r(5591),a=r(972),n=r(7693),o=r(3920);function l(e,t){for(var r=[[]],s=void 0===(t=t||{}).assignBonds||t.assignBonds,a=e.split(/\r?\n|\r/);a.length>0&&!(a.length<3);){var l=parseInt(a[0]);if(isNaN(l)||l<=0)break;if(a.length1){var c=new Float32Array(h[1].split(/\s+/)),u=new n.Matrix3(c[0],c[3],c[6],c[1],c[4],c[7],c[2],c[5],c[8]);r.modelData=[{cryst:{matrix:u}}]}for(var f=2,p=r[r.length-1].length,g=p+l,v=p;v=7&&(y.dx=parseFloat(_[4]),y.dy=parseFloat(_[5]),y.dz=parseFloat(_[6]))}if(!t.multimodel)break;r.push([]),a.splice(0,f)}if(s)for(let e=0;e3&&s[3].length>38&&(r=s[3].substring(34,39)),"V2000"===r?function(e,t){var r=[[]],s=!1;for(void 0!==t.keepH&&(s=!t.keepH);e.length>0&&!(e.length<4);){var a=parseInt(e[3].substring(0,3));if(isNaN(a)||a<=0)break;var n=parseInt(e[3].substring(3,6)),o=4;if(e.length<4+a+n)break;var l,h,c=[],u=r[r.length-1].length,f=u+a;for(l=u;l0&&!(e.length<8)&&e[4].startsWith("M V30 BEGIN CTAB")&&e[5].startsWith("M V30 COUNTS")&&!(e[5].length<14);){var a=e[5].substring(13).match(/\S+/g);if(a.length<2)break;var n=parseInt(a[0]);if(isNaN(n)||n<=0)break;var o=parseInt(a[1]),l=7;if(e.length<8+n+o)break;var h,c=[],u=r[r.length-1].length,f=u+n;for(h=u;h4){var g={},v=p[1].replace(/ /g,"");g.atom=g.elem=v[0].toUpperCase()+v.substring(1).toLowerCase(),"H"===g.elem&&s||(g.serial=h,c[h]=r[r.length-1].length,g.x=parseFloat(p[2]),g.y=parseFloat(p[3]),g.z=parseFloat(p[4]),g.hetflag=!0,g.bonds=[],g.bondOrder=[],g.properties={},g.index=r[r.length-1].length,r[r.length-1].push(g))}}if("M V30 END ATOM"!==e[l])break;if(l++,0===o||"M V30 BEGIN BOND"!==e[l])break;for(l++,h=0;h3){var y=c[parseInt(_[2])-1+u],b=c[parseInt(_[3])-1+u],w=parseFloat(_[1]);void 0!==y&&void 0!==b&&(r[r.length-1][y].bonds.push(b),r[r.length-1][y].bondOrder.push(w),r[r.length-1][b].bonds.push(y),r[r.length-1][b].bondOrder.push(w))}}if(!t.multimodel)break;for(t.onemol||r.push([]);"$$$$"!==e[l];)l++;e.splice(0,++l)}return r}(s,t):[[""]]}function c(e,t){var r=[[]];"string"==typeof e&&(e=JSON.parse(e));for(var s=e.m,a=s[0].a,n=s[0].b,o=s[0].s,l=void 0!==t&&void 0!==t.parseStyle?t.parseStyle:void 0!==o,h=r[r.length-1].length,c=0;cr)break;if(l.atom!=o.atom){var c=Math.abs(l.y-o.y);if(!(c>r)){var u=Math.abs(l.x-o.x);if(!(u>r)){var f=u*u+c*c+h*h;f>s||l.chain==o.chain&&Math.abs(l.resi-o.resi)<4||(f1.001;)h[e]-=1,u[e]-=1}const p=new n.Vector3(u[0],u[1],u[2]);p.applyMatrix3(r),e[a].isNearlyIdentity()&&p.lengthSq()>.001&&(f=a),e[a].translate(p)}}if(h){if(e.length>1)for(a=0;a=0){let r=new n.Vector3;for(l=0;l-1){let e=v.split("");e[_]="_",v=(v=e.join("")).substring(0,_)+"_"+v.substring(_+1)}}p.push(v)}}for(var y,b,w,x,A=0;AMOLECULE/),n=e.search(/@ATOM/);if(-1==a||-1==n)return r;for(var o=e.substring(a).split(/\r?\n|\r/);o.length>0;){var l=[],h=o[2].replace(/^\s+/,"").replace(/\s+/g," ").split(" "),c=parseInt(h[0]),u=0;h.length>1&&(u=parseInt(h[1]));var f,p=4;for(f=3;fATOM"==o[f]){p=f+1;break}var v=r[r.length-1].length,_=v+c;for(f=v;f<_;f++){var y={},b=(h=o[p++].replace(/^\s+/,"").replace(/\s+/g," ").split(" "))[5];if(b=void 0!==g[b]?g[b]:(b=b.split(".")[0])[0].toUpperCase()+b.substring(1).toLowerCase(),y.atom=h[1],y.elem=b,"H"==y.elem&&s);else{var w=r[r.length-1].length,x=parseInt(h[0]);y.serial=x,y.x=parseFloat(h[2]),y.y=parseFloat(h[3]),y.z=parseFloat(h[4]),y.atom=h[5];var A=parseFloat(h[8]);y.index=w,y.bonds=[],y.bondOrder=[],y.properties={charge:A,partialCharge:A},l[x]=w,r[r.length-1].push(y)}}for(var C=!1;pBOND"==o[p++]){C=!0;break}if(C&&u)for(f=0;f0&&"H"==r[0]&&"Hg"!=r&&"He"!=r&&"Hf"!=r&&"Hs"!=r&&"Ho"!=r&&(r="H"),r.length>1&&(r=r[0].toUpperCase()+r.substring(1).toLowerCase(),void 0===_.bondTable[r]?r=r[0]:t&&("Ca"==r||"Cd"==r)&&(r="C")),r}var b=r(8995);const w=new Set(["ABU","ACD","ALA","ALB","ALI","ARG","AR0","ASN","ASP","ASX","BAS","CYS","CYH","CYX","CSS","CSH","GLN","GLU","GLX","GLY","HIS","HIE","HID","HIP","HYP","ILE","ILU","LEU","LYS","MET","PCA","PGA","PHE","PR0","PRO","PRZ","SER","THR","TRP","TYR","VAL","A","1MA","C","5MC","OMC","G","1MG","2MG","M2G","7MG","OMG","YG","I","T","U","+U","H2U","5MU","PSU","ACE","F0R","H2O","HOH","WAT"]);function x(e){var t,r,s=[],a=[];for(t=0,r=e.length;t1)break;(0,b.areConnected)(u,p)&&(-1===u.bonds.indexOf(p.index)&&(u.bonds.push(p.index),u.bondOrder.push(1),p.bonds.push(u.index),p.bondOrder.push(1)),u.resi!==p.resi&&(l=!0))}}}function A(e,t,r){var s,a,o=[],l=void 0===t.assignBonds||t.assignBonds,h=!t.keepH,c=!!t.noSecondaryStructure,p=!t.noComputeSecondaryStructure,g=!t.doAssembly,v=t.altLoc?t.altLoc:"A",b={symmetries:[]},w=[],A=[],C={};for(let t=0;t=4?1:Z}}else C[t]=1,0!=H.bonds.length&&H.bonds[H.bonds.length-1]==q||(H.bonds.push(q),H.bondOrder.push(1))}}else if("HELIX "==L){S=a.substring(19,20),M=parseInt(a.substring(21,25)),z=parseInt(a.substring(33,37)),S in r||(r[S]={}),r[S][M]="h1";for(let e=M+1;e1&&("1"==ee[1]?s.ssbegin=!0:"2"==ee[1]&&(s.ssend=!0))}return[o,b,w]}function C(e,t){t=t||{};var r=[],s={};r.modelData=[];for(var a=e.split(/\r?\n|\r/);a.length>0;){var n=A(a,t,s),o=n[0],l=n[1];if(a=n[2],0!=o.length){if(t.multimodel&&t.onemol&&r.length>0)for(var h=r[0].length,c=0;c1&&t[1].toUpperCase()!=t[1]&&(y=t.substring(0,2)),h="H"==a[0],n[e]=r[r.length-1].length,r[r.length-1].push({resn:s,x:f,y:p,z:g,elem:y,hetflag:h,chain:o,resi:l,serial:e,atom:t,bonds:[],ss:"c",bondOrder:[],properties:{charge:v,partialCharge:v,radius:_},pdbline:a})}else if("CONECT"==l){var b=parseInt(a.substring(6,11)),w=r[r.length-1][n[b]];for(let e=0;e<4;e++){var A=parseInt(a.substring([11,16,21,26][e],[11,16,21,26][e]+5)),C=r[r.length-1][n[A]];void 0!==w&&void 0!==C&&(w.bonds.push(n[A]),w.bondOrder.push(1))}}}for(let e=0;e0){var B=b.bioAssemblyList[h].transformList;for(c=0,y=B.length;c{e.chainIndexList.forEach((t=>{j[t]="polymer"==e.type}))}));var H=0;for(_=0;_=k.length||E(k[se]!=ie))&&(re=!0)}var ae=b.groupIdList[C],ne=Q.groupName;let e=Q.chemCompType;var oe=S;let t=T.has(e)||!j[A];for(g=0;g=S){H=e;break}let a=Y[t],n=Y[r],o=q[a],l=q[n];o&&l&&(o.bonds.push(n),o.bondOrder.push(s),l.bonds.push(a),l.bondOrder.push(s))}t.multimodel&&(t.onemol||w.push([]))}if(!l)for(let e=0;e0&&a[0].includes("VERSION")))return[];var n=a.filter((function(e){return e.includes("POINTERS")||e.includes("ATOM_NAME")||e.includes("CHARGE")||e.includes("RADII")||e.includes("BONDS_INC_HYDROGEN")||e.includes("BONDS_WITHOUT_HYDROGEN")})),o=u("POINTERS");if(-1==o)return[];var l=f(o),h=parseInt(a[o+1].slice(0,l[1]));if(isNaN(h)||h<=0)return[];if(-1==(o=u("ATOM_NAME")))return[];var c=(l=f(o))[0];for(let e=0;e0){for(;!a[t].includes("FORMAT");)t++;return t}return-1}function f(e){var t=a[e].match(/\((\d*)\S*/),r=a[e].match(/[a-zA-Z](\d*)\)\s*/);return null==r&&(r=a[e].match(/[a-zA-Z](\d*)\.\d*\)\s*/)),[t[1],r[1]]}return[r]}function O(e){for(var t=[],r=e.split(/\r?\n|\r/);r.length>0&&!(r.length<3);){var s=parseInt(r[1]);if(isNaN(s)||s<=0)break;if(r.length44&&(u.dx=10*parseFloat(c.slice(44,52)),u.dy=10*parseFloat(c.slice(52,60)),u.dz=10*parseFloat(c.slice(60,68))),a[h]=u}if(r.length<=n+3){var f=r[n++].trim().split(/\s+/);if(3==f.length){for(var p=0;p<3;p++)f[p]=10*parseFloat(f[p]);t.box=f}}r.splice(0,++n)}for(let e=0;e{"use strict";r.r(t),r.d(t,{areConnected:()=>a});var s=r(2929);function a(e,t){var r=(0,s.bondLength)(e.elem)+(0,s.bondLength)(t.elem);r+=.25,r*=r;var a=e.x-t.x;if((a*=a)>r)return!1;var n=e.y-t.y;if((n*=n)>r)return!1;var o=e.z-t.z;if((o*=o)>r)return!1;var l=a+n+o;return!isNaN(l)&&(!(l<.5)&&(!(l>r)&&(e.altLoc==t.altLoc||" "==e.altLoc||" "==t.altLoc)))}},3920:(e,t,r)=>{"use strict";r.r(t),r.d(t,{assignBonds:()=>a});var s=r(8995);function a(e){for(var t=0,r=e.length;t{"use strict";r.r(t),r.d(t,{bondLength:()=>a,bondTable:()=>s,setBondLength:()=>n});let s={H:.37,He:.32,Li:1.34,Be:.9,B:.82,C:.77,N:.75,O:.73,F:.71,Ne:.69,Na:1.54,Mg:1.3,Al:1.18,Si:1.11,P:1.06,S:1.02,Cl:.99,Ar:.97,K:1.96,Ca:1.74,Sc:1.44,Ti:1.56,V:1.25,Mn:1.39,Fe:1.25,Co:1.26,Ni:1.21,Cu:1.38,Zn:1.31,Ga:1.26,Ge:1.22,Se:1.16,Br:1.14,Kr:1.1,Rb:2.11,Sr:1.92,Y:1.62,Zr:1.48,Nb:1.37,Mo:1.45,Tc:1.56,Ru:1.26,Rh:1.35,Pd:1.31,Ag:1.53,Cd:1.48,In:1.44,Sn:1.41,Sb:1.38,Te:1.35,I:1.33,Xe:1.3,Cs:2.25,Ba:1.98,Lu:1.6,Hf:1.5,Ta:1.38,W:1.46,Re:1.59,Os:1.44,Ir:1.37,Pt:1.28,Au:1.44,Hg:1.49,Tl:1.48,Pb:1.47,Bi:1.46,Rn:1.45};function a(e){return s[e]||1.6}function n(e,t){t<0&&(t=0),s[e]=t}},9005:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";__webpack_require__.r(__webpack_exports__),__webpack_require__.d(__webpack_exports__,{PausableTimer:()=>PausableTimer,adjustVolumeStyle:()=>adjustVolumeStyle,base64ToArray:()=>base64ToArray,deepCopy:()=>deepCopy,download:()=>download,extend:()=>extend,get:()=>get,getAtomProperty:()=>getAtomProperty,getColorFromStyle:()=>getColorFromStyle,getElement:()=>getElement,getExtent:()=>getExtent,getPropertyRange:()=>getPropertyRange,getbin:()=>getbin,isEmptyObject:()=>isEmptyObject,isNumeric:()=>isNumeric,makeFunction:()=>makeFunction,mergeGeos:()=>mergeGeos,specStringToObject:()=>specStringToObject});var _Gradient__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(1460),_VolumeData__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(7323),_colors__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__(2550);function extend(e,t){for(var r in t)t.hasOwnProperty(r)&&void 0!==t[r]&&(e[r]=t[r]);return e}function deepCopy(e){let t,r,s;if(null==e)return{};if("object"!=typeof e||null===e)return e;for(s in t=Array.isArray(e)?[]:{},e)r=e[s],t[s]=deepCopy(r);return t}function isNumeric(e){var t=typeof e;return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))}function isEmptyObject(e){var t;for(t in e)return!1;return!0}function makeFunction(callback){return callback&&"string"==typeof callback&&(callback=eval("("+callback+")")),callback&&"function"!=typeof callback?null:callback}function adjustVolumeStyle(e){e&&(!e.volformat||e.voldata instanceof _VolumeData__WEBPACK_IMPORTED_MODULE_1__.VolumeData||(e.voldata=new _VolumeData__WEBPACK_IMPORTED_MODULE_1__.VolumeData(e.voldata,e.volformat)),e.volscheme&&(e.volscheme=_Gradient__WEBPACK_IMPORTED_MODULE_0__.Gradient.getGradient(e.volscheme)))}function getExtent(e,t){var r,s,a,n,o,l,h,c,u,f,p=!t;if(r=s=a=9999,n=o=l=-9999,h=c=u=f=0,0===e.length)return[[0,0,0],[0,0,0],[0,0,0]];for(var g=0;gv.x?n:v.x,o=o>v.y?o:v.y,l=l>v.z?l:v.z,v.symmetries&&p))for(var _=0;_v.symmetries[_].x?n:v.symmetries[_].x,o=o>v.symmetries[_].y?o:v.symmetries[_].y,l=l>v.symmetries[_].z?l:v.symmetries[_].z}return[[r,s,a],[n,o,l],[h/f,c/f,u/f]]}function getPropertyRange(e,t){for(var r=Number.POSITIVE_INFINITY,s=Number.NEGATIVE_INFINITY,a=0,n=e.length;as&&(s=o))}return isFinite(r)||isFinite(s)?isFinite(r)?isFinite(s)||(s=r):r=s:r=s=0,[r,s]}class PausableTimer{constructor(e,t,r){this.total_time_run=0,this.fn=e,this.arg=r,this.countdown=t,this.start_time=(new Date).getTime(),this.ident=setTimeout(e,t,r)}cancel(){clearTimeout(this.ident)}pause(){clearTimeout(this.ident),this.total_time_run=(new Date).getTime()-this.start_time}resume(){this.ident=setTimeout(this.fn,Math.max(0,this.countdown-this.total_time_run),this.arg)}}function base64ToArray(e){for(var t=window.atob(e),r=t.length,s=new Uint8Array(r),a=0;a=0?parseFloat(e):parseInt(e):"true"===e||"false"!==e&&e},r={};if("all"===(e=e.replace(/%7E/g,"~")))return r;for(var s=e.split(";"),a=0;ae.text()));return t?r.then(t):r}function getbin(e,t,r,s){var a;return a="POST"==r?fetch(e,{method:"POST",body:s}).then((e=>checkStatus(e))).then((e=>e.arrayBuffer())):fetch(e).then((e=>checkStatus(e))).then((e=>e.arrayBuffer())),t?a.then(t):a}function download(e,t,r,s){var a="",n="",o="",l="",h=null,c=t.addModel();if(e.indexOf(":")<0&&(e=4==e.length?"pdb:"+e:isNaN(e)?"url:"+e:"cid:"+e),"mmtf:"===e.substring(0,5))n=r&&r.pdbUri?r.pdbUri:"https://mmtf.rcsb.org/v1.0/full/",e=e.substring(5).toUpperCase(),l=n+e,r&&void 0===r.noComputeSecondaryStructure&&(r.noComputeSecondaryStructure=!0),h=new Promise((function(e){getbin(l).then((function(s){c.addMolData(s,"mmtf",r),t.zoomTo(),t.render(),e(c)}),(function(){console.log("fetch of "+l+" failed.")}))}));else{if("pdb:"===e.substring(0,4)){if(a="mmtf",r&&r.format&&(a=r.format),r&&void 0===r.noComputeSecondaryStructure&&(r.noComputeSecondaryStructure=!0),!(e=e.substring(4).toUpperCase()).match(/^[1-9][A-Za-z0-9]{3}$/))return void alert("Wrong PDB ID");"mmtf"==a?(o=r&&r.mmtfUri?r.mmtfUri:"https://mmtf.rcsb.org/v1.0/full/",l=o+e.toUpperCase()):(n=r&&r.pdbUri?r.pdbUri:"https://files.rcsb.org/view/",l=n+e+"."+a)}else if("cid:"==e.substring(0,4)){if(a="sdf",!(e=e.substring(4)).match(/^[0-9]+$/))return void alert("Wrong Compound ID");l="https://pubchem.ncbi.nlm.nih.gov/rest/pug/compound/cid/"+e+"/SDF?record_type=3d"}else"url:"==e.substring(0,4)&&(l=e.substring(4),a=l);var u=function(e){c.addMolData(e,a,r),t.zoomTo(),t.render()};h=new Promise((function(t){"mmtf"==a?getbin(l).then((function(e){u(e),t(c)})).catch((function(){n=r&&r.pdbUri?r.pdbUri:"https://files.rcsb.org/view/",l=n+e+".pdb",a="pdb",console.log("falling back to pdb format"),get(l).then((function(e){u(e),t(c)})).catch((function(e){u(""),t(c),console.log("fetch of "+l+" failed: "+e.statusText)}))})):get(l).then((function(e){u(e),t(c)})).catch((function(e){u(""),t(c),console.log("fetch of "+l+" failed: "+e.statusText)}))}))}return s?(h.then((function(e){s(e)})),c):h}function getColorFromStyle(e,t){let r=t.colorscheme;if(void 0!==_colors__WEBPACK_IMPORTED_MODULE_2__.builtinColorSchemes[r])r=_colors__WEBPACK_IMPORTED_MODULE_2__.builtinColorSchemes[r];else if("string"==typeof r&&r.endsWith("Carbon")){let e=r.substring(0,r.lastIndexOf("Carbon")).toLowerCase();if(void 0!==_colors__WEBPACK_IMPORTED_MODULE_2__.htmlColors[e]){let t=Object.assign({},_colors__WEBPACK_IMPORTED_MODULE_2__.elementColors.defaultColors);t.C=_colors__WEBPACK_IMPORTED_MODULE_2__.htmlColors[e],_colors__WEBPACK_IMPORTED_MODULE_2__.builtinColorSchemes[r]={prop:"elem",map:t},r=_colors__WEBPACK_IMPORTED_MODULE_2__.builtinColorSchemes[r]}}let s=e.color;if(void 0!==t.color&&"spectrum"!=t.color&&(s=t.color),void 0!==r){let n,o;if(void 0!==_colors__WEBPACK_IMPORTED_MODULE_2__.elementColors[r])r=_colors__WEBPACK_IMPORTED_MODULE_2__.elementColors[r],void 0!==r[e[r.prop]]&&(s=r.map[e[r.prop]]);else if(void 0!==r[e[r.prop]])s=r.map[e[r.prop]];else if(void 0!==r.prop&&void 0!==r.gradient){n=r.prop;var a=r.gradient;void 0!==_Gradient__WEBPACK_IMPORTED_MODULE_0__.builtinGradients[a]&&(a=new _Gradient__WEBPACK_IMPORTED_MODULE_0__.builtinGradients[a](r.min,r.max,r.mid?r.mid:r.colors));let t=a.range()||[-1,1];o=getAtomProperty(e,n),null!=o&&(s=a.valueToHex(o,t))}else void 0!==r.prop&&void 0!==r.map?(n=r.prop,o=getAtomProperty(e,n),void 0!==r.map[o]&&(s=r.map[o])):void 0!==t.colorscheme[e.elem]?s=t.colorscheme[e.elem]:console.log("Could not interpret colorscheme "+r)}else void 0!==t.colorfunc&&(s=t.colorfunc(e));return _colors__WEBPACK_IMPORTED_MODULE_2__.CC.color(s)}function getElement(e){let t=e;return"string"==typeof e?t=document.querySelector("#"+e):"object"==typeof e&&e.get&&(t=e.get(0)),t}},2109:(e,t,r)=>{var s;s={},e.exports=s,function(e,t){e.toRGBA8=function(t){var r=t.width,s=t.height;if(null==t.tabs.acTL)return[e.toRGBA8.decodeImage(t.data,r,s,t).buffer];var a=[];null==t.frames[0].data&&(t.frames[0].data=t.data);for(var n,o=new Uint8Array(r*s*4),l=0;l>3)]>>7-((7&v)<<0)&1);h[E]=A[T],h[E+1]=A[T+1],h[E+2]=A[T+2],h[E+3]=k>2)]>>6-((3&v)<<1)&3),h[E]=A[T],h[E+1]=A[T+1],h[E+2]=A[T+2],h[E+3]=k>1)]>>4-((1&v)<<2)&15),h[E]=A[T],h[E+1]=A[T+1],h[E+2]=A[T+2],h[E+3]=k>3]>>7-(7&v)&1))==255*y?0:255;c[v]=D<<24|I<<16|I<<8|I}if(2==f)for(v=0;v>2]>>6-((3&v)<<1)&3))==85*y?0:255,c[v]=D<<24|I<<16|I<<8|I;if(4==f)for(v=0;v>1]>>4-((1&v)<<2)&15))==17*y?0:255,c[v]=D<<24|I<<16|I<<8|I;if(8==f)for(v=0;v>3,l=Math.ceil(s*n/8),h=new Uint8Array(a*l),c=0,u=[0,0,4,0,2,0,1],f=[0,4,0,2,0,1,0],p=[8,8,8,4,4,2,2],g=[8,8,4,4,2,2,1],v=0;v<7;){for(var _=p[v],y=g[v],b=0,w=0,x=u[v];x>3])>>7-(7&L)&1,h[M*l+(z>>3)]|=E<<7-((3&z)<<0)),2==n&&(E=(E=t[L>>3])>>6-(7&L)&3,h[M*l+(z>>2)]|=E<<6-((3&z)<<1)),4==n&&(E=(E=t[L>>3])>>4-(7&L)&15,h[M*l+(z>>1)]|=E<<4-((1&z)<<2)),n>=8)for(var T=M*l+z*o,k=0;k>3)+k];L+=n,z+=y}S++,M+=_}b*w!=0&&(c+=w*(1+C)),v+=1}return h},e.decode._getBPP=function(e){return[1,null,3,1,2,null,4][e.ctype]*e.depth},e.decode._filterZero=function(t,r,s,a,n){var o=e.decode._getBPP(r),l=Math.ceil(a*o/8),h=e.decode._paeth;o=Math.ceil(o/8);for(var c=0;c>1)&255;if(4==p)for(g=o;g>1)&255;for(g=o;g>1)&255}if(4==p){for(g=0;g>8&255,e[t+1]=255&r},readUint:function(e,t){return 16777216*e[t]+(e[t+1]<<16|e[t+2]<<8|e[t+3])},writeUint:function(e,t,r){e[t]=r>>24&255,e[t+1]=r>>16&255,e[t+2]=r>>8&255,e[t+3]=255&r},readASCII:function(e,t,r){for(var s="",a=0;a=0&&l>=0?(f=g*t+v<<2,p=(l+g)*a+o+v<<2):(f=(-l+g)*t-o+v<<2,p=g*a+v<<2),0==h)s[p]=e[f],s[p+1]=e[f+1],s[p+2]=e[f+2],s[p+3]=e[f+3];else if(1==h){var _=e[f+3]*(1/255),y=e[f]*_,b=e[f+1]*_,w=e[f+2]*_,x=s[p+3]*(1/255),A=s[p]*x,C=s[p+1]*x,S=s[p+2]*x,M=1-_,z=_+x*M,L=0==z?0:1/z;s[p+3]=255*z,s[p+0]=(y+A*M)*L,s[p+1]=(b+C*M)*L,s[p+2]=(w+S*M)*L}else if(2==h)_=e[f+3],y=e[f],b=e[f+1],w=e[f+2],x=s[p+3],A=s[p],C=s[p+1],S=s[p+2],_==x&&y==A&&b==C&&w==S?(s[p]=0,s[p+1]=0,s[p+2]=0,s[p+3]=0):(s[p]=y,s[p+1]=b,s[p+2]=w,s[p+3]=_);else if(3==h){if(_=e[f+3],y=e[f],b=e[f+1],w=e[f+2],x=s[p+3],A=s[p],C=s[p+1],S=s[p+2],_==x&&y==A&&b==C&&w==S)continue;if(_<220&&x>20)return!1}return!0},e.encode=function(t,r,s,a,n,o){null==a&&(a=0),null==o&&(o=!1);for(var l=new Uint8Array(t[0].byteLength*t.length+100),h=[137,80,78,71,13,10,26,10],c=0;c<8;c++)l[c]=h[c];var u=8,f=e._bin,p=e.crc.crc,g=f.writeUint,v=f.writeUshort,_=f.writeASCII,y=e.encode.compressPNG(t,r,s,a,o);g(l,u,13),_(l,u+=4,"IHDR"),g(l,u+=4,r),g(l,u+=4,s),l[u+=4]=y.depth,l[++u]=y.ctype,l[++u]=0,l[++u]=0,l[++u]=0,g(l,++u,p(l,u-17,17)),g(l,u+=4,1),_(l,u+=4,"sRGB"),l[u+=4]=1,g(l,++u,p(l,u-5,5)),u+=4;var b=t.length>1;if(b&&(g(l,u,8),_(l,u+=4,"acTL"),g(l,u+=4,t.length),g(l,u+=4,0),g(l,u+=4,p(l,u-12,12)),u+=4),3==y.ctype){for(g(l,u,3*(E=y.plte.length)),_(l,u+=4,"PLTE"),u+=4,c=0;c>8&255,S=x>>16&255;l[u+w+0]=A,l[u+w+1]=C,l[u+w+2]=S}if(g(l,u+=3*E,p(l,u-3*E-4,3*E+4)),u+=4,y.gotAlpha){for(g(l,u,E),_(l,u+=4,"tRNS"),u+=4,c=0;c>24&255;g(l,u+=E,p(l,u-E-4,E+4)),u+=4}}for(var M=0,z=0;z=300))break}}var C=!!_&&n,S=b.length;S<=256&&0==o&&(h=S<=2?1:S<=4?2:S<=16?4:8,n&&(h=8),_=!0);var M=[];for(f=0;fV&&(V=W),Hj&&(j=H));var q=-1==V?1:(V-N+1)*(j-U+1);q>1)]|=y[L[X+W]]<<4-4*(1&W);else if(2==h)for(W=0;W>2)]|=y[L[X+W]]<<6-2*(3&W);else if(1==h)for(W=0;W>3)]|=y[L[X+W]]<<7-1*(7&W)}z=Y,l=3,c=1}else if(0==_&&1==t.length){Y=new Uint8Array(k*I*3);var K=k*I;for(v=0;v5e5)||2!=h&&3!=h&&4!=h){for(var c=0;c>1)+256&255;if(4==o)for(u=n;u>1)&255;for(u=n;u>1)&255}if(4==o){for(u=0;u>>1:r>>>=1;e[t]=r}return e}(),update:function(t,r,s,a){for(var n=0;n>>8;return t},crc:function(t,r,s){return 4294967295^e.crc.update(4294967295,t,r,s)}},e.quantize=function(t,r,s){for(var a=[],n=0,o=0;o_&&(_=v[o].est.L,y=o);if(_<.001)break;var b=v[y],w=e.quantize.splitPixels(l,h,b.i0,b.i1,b.est.e,b.est.eMq255),x={i0:b.i0,i1:w,bst:null,est:null,tdst:0,left:null,right:null};x.bst=e.quantize.stats(l,x.i0,x.i1),x.est=e.quantize.estats(x.bst);var A={i0:w,i1:b.i1,bst:null,est:null,tdst:0,left:null,right:null};for(A.bst={R:[],m:[],N:b.bst.N-x.bst.N},o=0;o<16;o++)A.bst.R[o]=b.bst.R[o]-x.bst.R[o];for(o=0;o<4;o++)A.bst.m[o]=b.bst.m[o]-x.bst.m[o];A.est=e.quantize.estats(A.bst),b.left=x,b.right=A,v[y]=x,v.push(A)}v.sort((function(e,t){return t.bst.N-e.bst.N}));for(var C=0;C>2]=O.est.rgba}a[C]=z.buffer}return{bufs:a,plte:v}},e.quantize.getNearest=function(t,r,s,a,n){if(null==t.left)return t.tdst=e.quantize.dist(t.est.q,r,s,a,n),t;var o=e.quantize.planeDst(t.est,r,s,a,n),l=t.left,h=t.right;o>0&&(l=t.right,h=t.left);var c=e.quantize.getNearest(l,r,s,a,n);if(c.tdst<=o*o)return c;var u=e.quantize.getNearest(h,r,s,a,n);return u.tdsto;)a-=4;if(s>=a)break;var h=r[s>>2];r[s>>2]=r[a>>2],r[a>>2]=h,s+=4,a-=4}for(;l(t,s,n)>o;)s-=4;return s+4},e.quantize.vecDot=function(e,t,r){return e[t]*r[0]+e[t+1]*r[1]+e[t+2]*r[2]+e[t+3]*r[3]},e.quantize.stats=function(e,t,r){for(var s=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],a=[0,0,0,0],n=r-t>>2,o=t;o>>0}},e.M4={multVec:function(e,t){return[e[0]*t[0]+e[1]*t[1]+e[2]*t[2]+e[3]*t[3],e[4]*t[0]+e[5]*t[1]+e[6]*t[2]+e[7]*t[3],e[8]*t[0]+e[9]*t[1]+e[10]*t[2]+e[11]*t[3],e[12]*t[0]+e[13]*t[1]+e[14]*t[2]+e[15]*t[3]]},dot:function(e,t){return e[0]*t[0]+e[1]*t[1]+e[2]*t[2]+e[3]*t[3]},sml:function(e,t){return[e*t[0],e*t[1],e*t[2],e*t[3]]}},e.encode.alphaMul=function(e,t){for(var r=new Uint8Array(e.length),s=e.length>>2,a=0;a{"use strict";var s={};(0,r(6296).assign)(s,r(7434),r(6988),r(5642)),e.exports=s},7434:(e,t,r)=>{"use strict";var s=r(9892),a=r(6296),n=r(3963),o=r(5795),l=r(6866),h=Object.prototype.toString,c=0,u=-1,f=0,p=8;function g(e){if(!(this instanceof g))return new g(e);this.options=a.assign({level:u,method:p,chunkSize:16384,windowBits:15,memLevel:8,strategy:f,to:""},e||{});var t=this.options;t.raw&&t.windowBits>0?t.windowBits=-t.windowBits:t.gzip&&t.windowBits>0&&t.windowBits<16&&(t.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new l,this.strm.avail_out=0;var r=s.deflateInit2(this.strm,t.level,t.method,t.windowBits,t.memLevel,t.strategy);if(r!==c)throw new Error(o[r]);if(t.header&&s.deflateSetHeader(this.strm,t.header),t.dictionary){var v;if(v="string"==typeof t.dictionary?n.string2buf(t.dictionary):"[object ArrayBuffer]"===h.call(t.dictionary)?new Uint8Array(t.dictionary):t.dictionary,(r=s.deflateSetDictionary(this.strm,v))!==c)throw new Error(o[r]);this._dict_set=!0}}function v(e,t){var r=new g(t);if(r.push(e,!0),r.err)throw r.msg||o[r.err];return r.result}g.prototype.push=function(e,t){var r,o,l=this.strm,u=this.options.chunkSize;if(this.ended)return!1;o=t===~~t?t:!0===t?4:0,"string"==typeof e?l.input=n.string2buf(e):"[object ArrayBuffer]"===h.call(e)?l.input=new Uint8Array(e):l.input=e,l.next_in=0,l.avail_in=l.input.length;do{if(0===l.avail_out&&(l.output=new a.Buf8(u),l.next_out=0,l.avail_out=u),1!==(r=s.deflate(l,o))&&r!==c)return this.onEnd(r),this.ended=!0,!1;0!==l.avail_out&&(0!==l.avail_in||4!==o&&2!==o)||("string"===this.options.to?this.onData(n.buf2binstring(a.shrinkBuf(l.output,l.next_out))):this.onData(a.shrinkBuf(l.output,l.next_out)))}while((l.avail_in>0||0===l.avail_out)&&1!==r);return 4===o?(r=s.deflateEnd(this.strm),this.onEnd(r),this.ended=!0,r===c):2!==o||(this.onEnd(c),l.avail_out=0,!0)},g.prototype.onData=function(e){this.chunks.push(e)},g.prototype.onEnd=function(e){e===c&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=a.flattenChunks(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg},t.Deflate=g,t.deflate=v,t.deflateRaw=function(e,t){return(t=t||{}).raw=!0,v(e,t)},t.gzip=function(e,t){return(t=t||{}).gzip=!0,v(e,t)}},6988:(e,t,r)=>{"use strict";var s=r(5356),a=r(6296),n=r(3963),o=r(5642),l=r(5795),h=r(6866),c=r(8772),u=Object.prototype.toString;function f(e){if(!(this instanceof f))return new f(e);this.options=a.assign({chunkSize:16384,windowBits:0,to:""},e||{});var t=this.options;t.raw&&t.windowBits>=0&&t.windowBits<16&&(t.windowBits=-t.windowBits,0===t.windowBits&&(t.windowBits=-15)),!(t.windowBits>=0&&t.windowBits<16)||e&&e.windowBits||(t.windowBits+=32),t.windowBits>15&&t.windowBits<48&&0==(15&t.windowBits)&&(t.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new h,this.strm.avail_out=0;var r=s.inflateInit2(this.strm,t.windowBits);if(r!==o.Z_OK)throw new Error(l[r]);if(this.header=new c,s.inflateGetHeader(this.strm,this.header),t.dictionary&&("string"==typeof t.dictionary?t.dictionary=n.string2buf(t.dictionary):"[object ArrayBuffer]"===u.call(t.dictionary)&&(t.dictionary=new Uint8Array(t.dictionary)),t.raw&&(r=s.inflateSetDictionary(this.strm,t.dictionary))!==o.Z_OK))throw new Error(l[r])}function p(e,t){var r=new f(t);if(r.push(e,!0),r.err)throw r.msg||l[r.err];return r.result}f.prototype.push=function(e,t){var r,l,h,c,f,p=this.strm,g=this.options.chunkSize,v=this.options.dictionary,_=!1;if(this.ended)return!1;l=t===~~t?t:!0===t?o.Z_FINISH:o.Z_NO_FLUSH,"string"==typeof e?p.input=n.binstring2buf(e):"[object ArrayBuffer]"===u.call(e)?p.input=new Uint8Array(e):p.input=e,p.next_in=0,p.avail_in=p.input.length;do{if(0===p.avail_out&&(p.output=new a.Buf8(g),p.next_out=0,p.avail_out=g),(r=s.inflate(p,o.Z_NO_FLUSH))===o.Z_NEED_DICT&&v&&(r=s.inflateSetDictionary(this.strm,v)),r===o.Z_BUF_ERROR&&!0===_&&(r=o.Z_OK,_=!1),r!==o.Z_STREAM_END&&r!==o.Z_OK)return this.onEnd(r),this.ended=!0,!1;p.next_out&&(0!==p.avail_out&&r!==o.Z_STREAM_END&&(0!==p.avail_in||l!==o.Z_FINISH&&l!==o.Z_SYNC_FLUSH)||("string"===this.options.to?(h=n.utf8border(p.output,p.next_out),c=p.next_out-h,f=n.buf2string(p.output,h),p.next_out=c,p.avail_out=g-c,c&&a.arraySet(p.output,p.output,h,c,0),this.onData(f)):this.onData(a.shrinkBuf(p.output,p.next_out)))),0===p.avail_in&&0===p.avail_out&&(_=!0)}while((p.avail_in>0||0===p.avail_out)&&r!==o.Z_STREAM_END);return r===o.Z_STREAM_END&&(l=o.Z_FINISH),l===o.Z_FINISH?(r=s.inflateEnd(this.strm),this.onEnd(r),this.ended=!0,r===o.Z_OK):l!==o.Z_SYNC_FLUSH||(this.onEnd(o.Z_OK),p.avail_out=0,!0)},f.prototype.onData=function(e){this.chunks.push(e)},f.prototype.onEnd=function(e){e===o.Z_OK&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=a.flattenChunks(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg},t.Inflate=f,t.inflate=p,t.inflateRaw=function(e,t){return(t=t||{}).raw=!0,p(e,t)},t.ungzip=p},6296:(e,t)=>{"use strict";var r="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Int32Array;function s(e,t){return Object.prototype.hasOwnProperty.call(e,t)}t.assign=function(e){for(var t=Array.prototype.slice.call(arguments,1);t.length;){var r=t.shift();if(r){if("object"!=typeof r)throw new TypeError(r+"must be non-object");for(var a in r)s(r,a)&&(e[a]=r[a])}}return e},t.shrinkBuf=function(e,t){return e.length===t?e:e.subarray?e.subarray(0,t):(e.length=t,e)};var a={arraySet:function(e,t,r,s,a){if(t.subarray&&e.subarray)e.set(t.subarray(r,r+s),a);else for(var n=0;n{"use strict";var s=r(6296),a=!0,n=!0;try{String.fromCharCode.apply(null,[0])}catch(e){a=!1}try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(e){n=!1}for(var o=new s.Buf8(256),l=0;l<256;l++)o[l]=l>=252?6:l>=248?5:l>=240?4:l>=224?3:l>=192?2:1;function h(e,t){if(t<65534&&(e.subarray&&n||!e.subarray&&a))return String.fromCharCode.apply(null,s.shrinkBuf(e,t));for(var r="",o=0;o>>6,t[o++]=128|63&r):r<65536?(t[o++]=224|r>>>12,t[o++]=128|r>>>6&63,t[o++]=128|63&r):(t[o++]=240|r>>>18,t[o++]=128|r>>>12&63,t[o++]=128|r>>>6&63,t[o++]=128|63&r);return t},t.buf2binstring=function(e){return h(e,e.length)},t.binstring2buf=function(e){for(var t=new s.Buf8(e.length),r=0,a=t.length;r4)c[s++]=65533,r+=n-1;else{for(a&=2===n?31:3===n?15:7;n>1&&r1?c[s++]=65533:a<65536?c[s++]=a:(a-=65536,c[s++]=55296|a>>10&1023,c[s++]=56320|1023&a)}return h(c,s)},t.utf8border=function(e,t){var r;for((t=t||e.length)>e.length&&(t=e.length),r=t-1;r>=0&&128==(192&e[r]);)r--;return r<0||0===r?t:r+o[e[r]]>t?r:t}},7853:e=>{"use strict";e.exports=function(e,t,r,s){for(var a=65535&e|0,n=e>>>16&65535|0,o=0;0!==r;){r-=o=r>2e3?2e3:r;do{n=n+(a=a+t[s++]|0)|0}while(--o);a%=65521,n%=65521}return a|n<<16|0}},5642:e=>{"use strict";e.exports={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8}},5684:e=>{"use strict";var t=function(){for(var e,t=[],r=0;r<256;r++){e=r;for(var s=0;s<8;s++)e=1&e?3988292384^e>>>1:e>>>1;t[r]=e}return t}();e.exports=function(e,r,s,a){var n=t,o=a+s;e^=-1;for(var l=a;l>>8^n[255&(e^r[l])];return-1^e}},9892:(e,t,r)=>{"use strict";var s,a=r(6296),n=r(5313),o=r(7853),l=r(5684),h=r(5795),c=0,u=4,f=0,p=-2,g=-1,v=4,_=2,y=8,b=9,w=286,x=30,A=19,C=2*w+1,S=15,M=3,z=258,L=z+M+1,E=42,T=103,k=113,I=666,O=1,D=2,F=3,R=4;function P(e,t){return e.msg=h[t],t}function G(e){return(e<<1)-(e>4?9:0)}function B(e){for(var t=e.length;--t>=0;)e[t]=0}function N(e){var t=e.state,r=t.pending;r>e.avail_out&&(r=e.avail_out),0!==r&&(a.arraySet(e.output,t.pending_buf,t.pending_out,r,e.next_out),e.next_out+=r,t.pending_out+=r,e.total_out+=r,e.avail_out-=r,t.pending-=r,0===t.pending&&(t.pending_out=0))}function U(e,t){n._tr_flush_block(e,e.block_start>=0?e.block_start:-1,e.strstart-e.block_start,t),e.block_start=e.strstart,N(e.strm)}function V(e,t){e.pending_buf[e.pending++]=t}function j(e,t){e.pending_buf[e.pending++]=t>>>8&255,e.pending_buf[e.pending++]=255&t}function H(e,t){var r,s,a=e.max_chain_length,n=e.strstart,o=e.prev_length,l=e.nice_match,h=e.strstart>e.w_size-L?e.strstart-(e.w_size-L):0,c=e.window,u=e.w_mask,f=e.prev,p=e.strstart+z,g=c[n+o-1],v=c[n+o];e.prev_length>=e.good_match&&(a>>=2),l>e.lookahead&&(l=e.lookahead);do{if(c[(r=t)+o]===v&&c[r+o-1]===g&&c[r]===c[n]&&c[++r]===c[n+1]){n+=2,r++;do{}while(c[++n]===c[++r]&&c[++n]===c[++r]&&c[++n]===c[++r]&&c[++n]===c[++r]&&c[++n]===c[++r]&&c[++n]===c[++r]&&c[++n]===c[++r]&&c[++n]===c[++r]&&no){if(e.match_start=t,o=s,s>=l)break;g=c[n+o-1],v=c[n+o]}}}while((t=f[t&u])>h&&0!=--a);return o<=e.lookahead?o:e.lookahead}function W(e){var t,r,s,n,h,c,u,f,p,g,v=e.w_size;do{if(n=e.window_size-e.lookahead-e.strstart,e.strstart>=v+(v-L)){a.arraySet(e.window,e.window,v,v,0),e.match_start-=v,e.strstart-=v,e.block_start-=v,t=r=e.hash_size;do{s=e.head[--t],e.head[t]=s>=v?s-v:0}while(--r);t=r=v;do{s=e.prev[--t],e.prev[t]=s>=v?s-v:0}while(--r);n+=v}if(0===e.strm.avail_in)break;if(c=e.strm,u=e.window,f=e.strstart+e.lookahead,p=n,g=void 0,(g=c.avail_in)>p&&(g=p),r=0===g?0:(c.avail_in-=g,a.arraySet(u,c.input,c.next_in,g,f),1===c.state.wrap?c.adler=o(c.adler,u,g,f):2===c.state.wrap&&(c.adler=l(c.adler,u,g,f)),c.next_in+=g,c.total_in+=g,g),e.lookahead+=r,e.lookahead+e.insert>=M)for(h=e.strstart-e.insert,e.ins_h=e.window[h],e.ins_h=(e.ins_h<=M&&(e.ins_h=(e.ins_h<=M)if(s=n._tr_tally(e,e.strstart-e.match_start,e.match_length-M),e.lookahead-=e.match_length,e.match_length<=e.max_lazy_match&&e.lookahead>=M){e.match_length--;do{e.strstart++,e.ins_h=(e.ins_h<=M&&(e.ins_h=(e.ins_h<4096)&&(e.match_length=M-1)),e.prev_length>=M&&e.match_length<=e.prev_length){a=e.strstart+e.lookahead-M,s=n._tr_tally(e,e.strstart-1-e.prev_match,e.prev_length-M),e.lookahead-=e.prev_length-1,e.prev_length-=2;do{++e.strstart<=a&&(e.ins_h=(e.ins_h<15&&(l=2,s-=16),n<1||n>b||r!==y||s<8||s>15||t<0||t>9||o<0||o>v)return P(e,p);8===s&&(s=9);var h=new X;return e.state=h,h.strm=e,h.wrap=l,h.gzhead=null,h.w_bits=s,h.w_size=1<e.pending_buf_size-5&&(r=e.pending_buf_size-5);;){if(e.lookahead<=1){if(W(e),0===e.lookahead&&t===c)return O;if(0===e.lookahead)break}e.strstart+=e.lookahead,e.lookahead=0;var s=e.block_start+r;if((0===e.strstart||e.strstart>=s)&&(e.lookahead=e.strstart-s,e.strstart=s,U(e,!1),0===e.strm.avail_out))return O;if(e.strstart-e.block_start>=e.w_size-L&&(U(e,!1),0===e.strm.avail_out))return O}return e.insert=0,t===u?(U(e,!0),0===e.strm.avail_out?F:R):(e.strstart>e.block_start&&(U(e,!1),e.strm.avail_out),O)})),new Z(4,4,8,4,q),new Z(4,5,16,8,q),new Z(4,6,32,32,q),new Z(4,4,16,16,Y),new Z(8,16,32,32,Y),new Z(8,16,128,128,Y),new Z(8,32,128,256,Y),new Z(32,128,258,1024,Y),new Z(32,258,258,4096,Y)],t.deflateInit=function(e,t){return Q(e,t,y,15,8,0)},t.deflateInit2=Q,t.deflateReset=$,t.deflateResetKeep=K,t.deflateSetHeader=function(e,t){return e&&e.state?2!==e.state.wrap?p:(e.state.gzhead=t,f):p},t.deflate=function(e,t){var r,a,o,h;if(!e||!e.state||t>5||t<0)return e?P(e,p):p;if(a=e.state,!e.output||!e.input&&0!==e.avail_in||a.status===I&&t!==u)return P(e,0===e.avail_out?-5:p);if(a.strm=e,r=a.last_flush,a.last_flush=t,a.status===E)if(2===a.wrap)e.adler=0,V(a,31),V(a,139),V(a,8),a.gzhead?(V(a,(a.gzhead.text?1:0)+(a.gzhead.hcrc?2:0)+(a.gzhead.extra?4:0)+(a.gzhead.name?8:0)+(a.gzhead.comment?16:0)),V(a,255&a.gzhead.time),V(a,a.gzhead.time>>8&255),V(a,a.gzhead.time>>16&255),V(a,a.gzhead.time>>24&255),V(a,9===a.level?2:a.strategy>=2||a.level<2?4:0),V(a,255&a.gzhead.os),a.gzhead.extra&&a.gzhead.extra.length&&(V(a,255&a.gzhead.extra.length),V(a,a.gzhead.extra.length>>8&255)),a.gzhead.hcrc&&(e.adler=l(e.adler,a.pending_buf,a.pending,0)),a.gzindex=0,a.status=69):(V(a,0),V(a,0),V(a,0),V(a,0),V(a,0),V(a,9===a.level?2:a.strategy>=2||a.level<2?4:0),V(a,3),a.status=k);else{var g=y+(a.w_bits-8<<4)<<8;g|=(a.strategy>=2||a.level<2?0:a.level<6?1:6===a.level?2:3)<<6,0!==a.strstart&&(g|=32),g+=31-g%31,a.status=k,j(a,g),0!==a.strstart&&(j(a,e.adler>>>16),j(a,65535&e.adler)),e.adler=1}if(69===a.status)if(a.gzhead.extra){for(o=a.pending;a.gzindex<(65535&a.gzhead.extra.length)&&(a.pending!==a.pending_buf_size||(a.gzhead.hcrc&&a.pending>o&&(e.adler=l(e.adler,a.pending_buf,a.pending-o,o)),N(e),o=a.pending,a.pending!==a.pending_buf_size));)V(a,255&a.gzhead.extra[a.gzindex]),a.gzindex++;a.gzhead.hcrc&&a.pending>o&&(e.adler=l(e.adler,a.pending_buf,a.pending-o,o)),a.gzindex===a.gzhead.extra.length&&(a.gzindex=0,a.status=73)}else a.status=73;if(73===a.status)if(a.gzhead.name){o=a.pending;do{if(a.pending===a.pending_buf_size&&(a.gzhead.hcrc&&a.pending>o&&(e.adler=l(e.adler,a.pending_buf,a.pending-o,o)),N(e),o=a.pending,a.pending===a.pending_buf_size)){h=1;break}h=a.gzindexo&&(e.adler=l(e.adler,a.pending_buf,a.pending-o,o)),0===h&&(a.gzindex=0,a.status=91)}else a.status=91;if(91===a.status)if(a.gzhead.comment){o=a.pending;do{if(a.pending===a.pending_buf_size&&(a.gzhead.hcrc&&a.pending>o&&(e.adler=l(e.adler,a.pending_buf,a.pending-o,o)),N(e),o=a.pending,a.pending===a.pending_buf_size)){h=1;break}h=a.gzindexo&&(e.adler=l(e.adler,a.pending_buf,a.pending-o,o)),0===h&&(a.status=T)}else a.status=T;if(a.status===T&&(a.gzhead.hcrc?(a.pending+2>a.pending_buf_size&&N(e),a.pending+2<=a.pending_buf_size&&(V(a,255&e.adler),V(a,e.adler>>8&255),e.adler=0,a.status=k)):a.status=k),0!==a.pending){if(N(e),0===e.avail_out)return a.last_flush=-1,f}else if(0===e.avail_in&&G(t)<=G(r)&&t!==u)return P(e,-5);if(a.status===I&&0!==e.avail_in)return P(e,-5);if(0!==e.avail_in||0!==a.lookahead||t!==c&&a.status!==I){var v=2===a.strategy?function(e,t){for(var r;;){if(0===e.lookahead&&(W(e),0===e.lookahead)){if(t===c)return O;break}if(e.match_length=0,r=n._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++,r&&(U(e,!1),0===e.strm.avail_out))return O}return e.insert=0,t===u?(U(e,!0),0===e.strm.avail_out?F:R):e.last_lit&&(U(e,!1),0===e.strm.avail_out)?O:D}(a,t):3===a.strategy?function(e,t){for(var r,s,a,o,l=e.window;;){if(e.lookahead<=z){if(W(e),e.lookahead<=z&&t===c)return O;if(0===e.lookahead)break}if(e.match_length=0,e.lookahead>=M&&e.strstart>0&&(s=l[a=e.strstart-1])===l[++a]&&s===l[++a]&&s===l[++a]){o=e.strstart+z;do{}while(s===l[++a]&&s===l[++a]&&s===l[++a]&&s===l[++a]&&s===l[++a]&&s===l[++a]&&s===l[++a]&&s===l[++a]&&ae.lookahead&&(e.match_length=e.lookahead)}if(e.match_length>=M?(r=n._tr_tally(e,1,e.match_length-M),e.lookahead-=e.match_length,e.strstart+=e.match_length,e.match_length=0):(r=n._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++),r&&(U(e,!1),0===e.strm.avail_out))return O}return e.insert=0,t===u?(U(e,!0),0===e.strm.avail_out?F:R):e.last_lit&&(U(e,!1),0===e.strm.avail_out)?O:D}(a,t):s[a.level].func(a,t);if(v!==F&&v!==R||(a.status=I),v===O||v===F)return 0===e.avail_out&&(a.last_flush=-1),f;if(v===D&&(1===t?n._tr_align(a):5!==t&&(n._tr_stored_block(a,0,0,!1),3===t&&(B(a.head),0===a.lookahead&&(a.strstart=0,a.block_start=0,a.insert=0))),N(e),0===e.avail_out))return a.last_flush=-1,f}return t!==u?f:a.wrap<=0?1:(2===a.wrap?(V(a,255&e.adler),V(a,e.adler>>8&255),V(a,e.adler>>16&255),V(a,e.adler>>24&255),V(a,255&e.total_in),V(a,e.total_in>>8&255),V(a,e.total_in>>16&255),V(a,e.total_in>>24&255)):(j(a,e.adler>>>16),j(a,65535&e.adler)),N(e),a.wrap>0&&(a.wrap=-a.wrap),0!==a.pending?f:1)},t.deflateEnd=function(e){var t;return e&&e.state?(t=e.state.status)!==E&&69!==t&&73!==t&&91!==t&&t!==T&&t!==k&&t!==I?P(e,p):(e.state=null,t===k?P(e,-3):f):p},t.deflateSetDictionary=function(e,t){var r,s,n,l,h,c,u,g,v=t.length;if(!e||!e.state)return p;if(2===(l=(r=e.state).wrap)||1===l&&r.status!==E||r.lookahead)return p;for(1===l&&(e.adler=o(e.adler,t,v,0)),r.wrap=0,v>=r.w_size&&(0===l&&(B(r.head),r.strstart=0,r.block_start=0,r.insert=0),g=new a.Buf8(r.w_size),a.arraySet(g,t,v-r.w_size,r.w_size,0),t=g,v=r.w_size),h=e.avail_in,c=e.next_in,u=e.input,e.avail_in=v,e.next_in=0,e.input=t,W(r);r.lookahead>=M;){s=r.strstart,n=r.lookahead-(M-1);do{r.ins_h=(r.ins_h<{"use strict";e.exports=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1}},7933:e=>{"use strict";e.exports=function(e,t){var r,s,a,n,o,l,h,c,u,f,p,g,v,_,y,b,w,x,A,C,S,M,z,L,E;r=e.state,s=e.next_in,L=e.input,a=s+(e.avail_in-5),n=e.next_out,E=e.output,o=n-(t-e.avail_out),l=n+(e.avail_out-257),h=r.dmax,c=r.wsize,u=r.whave,f=r.wnext,p=r.window,g=r.hold,v=r.bits,_=r.lencode,y=r.distcode,b=(1<>>=A=x>>>24,v-=A,0===(A=x>>>16&255))E[n++]=65535&x;else{if(!(16&A)){if(0==(64&A)){x=_[(65535&x)+(g&(1<>>=A,v-=A),v<15&&(g+=L[s++]<>>=A=x>>>24,v-=A,!(16&(A=x>>>16&255))){if(0==(64&A)){x=y[(65535&x)+(g&(1<h){e.msg="invalid distance too far back",r.mode=30;break e}if(g>>>=A,v-=A,S>(A=n-o)){if((A=S-A)>u&&r.sane){e.msg="invalid distance too far back",r.mode=30;break e}if(M=0,z=p,0===f){if(M+=c-A,A2;)E[n++]=z[M++],E[n++]=z[M++],E[n++]=z[M++],C-=3;C&&(E[n++]=z[M++],C>1&&(E[n++]=z[M++]))}else{M=n-S;do{E[n++]=E[M++],E[n++]=E[M++],E[n++]=E[M++],C-=3}while(C>2);C&&(E[n++]=E[M++],C>1&&(E[n++]=E[M++]))}break}}break}}while(s>3,g&=(1<<(v-=C<<3))-1,e.next_in=s,e.next_out=n,e.avail_in=s{"use strict";var s=r(6296),a=r(7853),n=r(5684),o=r(7933),l=r(6215),h=1,c=2,u=0,f=-2,p=1,g=12,v=30,_=852,y=592;function b(e){return(e>>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24)}function w(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new s.Buf16(320),this.work=new s.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function x(e){var t;return e&&e.state?(t=e.state,e.total_in=e.total_out=t.total=0,e.msg="",t.wrap&&(e.adler=1&t.wrap),t.mode=p,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new s.Buf32(_),t.distcode=t.distdyn=new s.Buf32(y),t.sane=1,t.back=-1,u):f}function A(e){var t;return e&&e.state?((t=e.state).wsize=0,t.whave=0,t.wnext=0,x(e)):f}function C(e,t){var r,s;return e&&e.state?(s=e.state,t<0?(r=0,t=-t):(r=1+(t>>4),t<48&&(t&=15)),t&&(t<8||t>15)?f:(null!==s.window&&s.wbits!==t&&(s.window=null),s.wrap=r,s.wbits=t,A(e))):f}function S(e,t){var r,s;return e?(s=new w,e.state=s,s.window=null,(r=C(e,t))!==u&&(e.state=null),r):f}var M,z,L=!0;function E(e){if(L){var t;for(M=new s.Buf32(512),z=new s.Buf32(32),t=0;t<144;)e.lens[t++]=8;for(;t<256;)e.lens[t++]=9;for(;t<280;)e.lens[t++]=7;for(;t<288;)e.lens[t++]=8;for(l(h,e.lens,0,288,M,0,e.work,{bits:9}),t=0;t<32;)e.lens[t++]=5;l(c,e.lens,0,32,z,0,e.work,{bits:5}),L=!1}e.lencode=M,e.lenbits=9,e.distcode=z,e.distbits=5}function T(e,t,r,a){var n,o=e.state;return null===o.window&&(o.wsize=1<=o.wsize?(s.arraySet(o.window,t,r-o.wsize,o.wsize,0),o.wnext=0,o.whave=o.wsize):((n=o.wsize-o.wnext)>a&&(n=a),s.arraySet(o.window,t,r-a,n,o.wnext),(a-=n)?(s.arraySet(o.window,t,r-a,a,0),o.wnext=a,o.whave=o.wsize):(o.wnext+=n,o.wnext===o.wsize&&(o.wnext=0),o.whave>>8&255,r.check=n(r.check,W,2,0),S=0,M=0,r.mode=2;break}if(r.flags=0,r.head&&(r.head.done=!1),!(1&r.wrap)||(((255&S)<<8)+(S>>8))%31){e.msg="incorrect header check",r.mode=v;break}if(8!=(15&S)){e.msg="unknown compression method",r.mode=v;break}if(M-=4,N=8+(15&(S>>>=4)),0===r.wbits)r.wbits=N;else if(N>r.wbits){e.msg="invalid window size",r.mode=v;break}r.dmax=1<>8&1),512&r.flags&&(W[0]=255&S,W[1]=S>>>8&255,r.check=n(r.check,W,2,0)),S=0,M=0,r.mode=3;case 3:for(;M<32;){if(0===A)break e;A--,S+=_[w++]<>>8&255,W[2]=S>>>16&255,W[3]=S>>>24&255,r.check=n(r.check,W,4,0)),S=0,M=0,r.mode=4;case 4:for(;M<16;){if(0===A)break e;A--,S+=_[w++]<>8),512&r.flags&&(W[0]=255&S,W[1]=S>>>8&255,r.check=n(r.check,W,2,0)),S=0,M=0,r.mode=5;case 5:if(1024&r.flags){for(;M<16;){if(0===A)break e;A--,S+=_[w++]<>>8&255,r.check=n(r.check,W,2,0)),S=0,M=0}else r.head&&(r.head.extra=null);r.mode=6;case 6:if(1024&r.flags&&((k=r.length)>A&&(k=A),k&&(r.head&&(N=r.head.extra_len-r.length,r.head.extra||(r.head.extra=new Array(r.head.extra_len)),s.arraySet(r.head.extra,_,w,k,N)),512&r.flags&&(r.check=n(r.check,_,k,w)),A-=k,w+=k,r.length-=k),r.length))break e;r.length=0,r.mode=7;case 7:if(2048&r.flags){if(0===A)break e;k=0;do{N=_[w+k++],r.head&&N&&r.length<65536&&(r.head.name+=String.fromCharCode(N))}while(N&&k>9&1,r.head.done=!0),e.adler=r.check=0,r.mode=g;break;case 10:for(;M<32;){if(0===A)break e;A--,S+=_[w++]<>>=7&M,M-=7&M,r.mode=27;break}for(;M<3;){if(0===A)break e;A--,S+=_[w++]<>>=1)){case 0:r.mode=14;break;case 1:if(E(r),r.mode=20,6===t){S>>>=2,M-=2;break e}break;case 2:r.mode=17;break;case 3:e.msg="invalid block type",r.mode=v}S>>>=2,M-=2;break;case 14:for(S>>>=7&M,M-=7&M;M<32;){if(0===A)break e;A--,S+=_[w++]<>>16^65535)){e.msg="invalid stored block lengths",r.mode=v;break}if(r.length=65535&S,S=0,M=0,r.mode=15,6===t)break e;case 15:r.mode=16;case 16:if(k=r.length){if(k>A&&(k=A),k>C&&(k=C),0===k)break e;s.arraySet(y,_,w,k,x),A-=k,w+=k,C-=k,x+=k,r.length-=k;break}r.mode=g;break;case 17:for(;M<14;){if(0===A)break e;A--,S+=_[w++]<>>=5,M-=5,r.ndist=1+(31&S),S>>>=5,M-=5,r.ncode=4+(15&S),S>>>=4,M-=4,r.nlen>286||r.ndist>30){e.msg="too many length or distance symbols",r.mode=v;break}r.have=0,r.mode=18;case 18:for(;r.have>>=3,M-=3}for(;r.have<19;)r.lens[q[r.have++]]=0;if(r.lencode=r.lendyn,r.lenbits=7,V={bits:r.lenbits},U=l(0,r.lens,0,19,r.lencode,0,r.work,V),r.lenbits=V.bits,U){e.msg="invalid code lengths set",r.mode=v;break}r.have=0,r.mode=19;case 19:for(;r.have>>16&255,R=65535&H,!((D=H>>>24)<=M);){if(0===A)break e;A--,S+=_[w++]<>>=D,M-=D,r.lens[r.have++]=R;else{if(16===R){for(j=D+2;M>>=D,M-=D,0===r.have){e.msg="invalid bit length repeat",r.mode=v;break}N=r.lens[r.have-1],k=3+(3&S),S>>>=2,M-=2}else if(17===R){for(j=D+3;M>>=D)),S>>>=3,M-=3}else{for(j=D+7;M>>=D)),S>>>=7,M-=7}if(r.have+k>r.nlen+r.ndist){e.msg="invalid bit length repeat",r.mode=v;break}for(;k--;)r.lens[r.have++]=N}}if(r.mode===v)break;if(0===r.lens[256]){e.msg="invalid code -- missing end-of-block",r.mode=v;break}if(r.lenbits=9,V={bits:r.lenbits},U=l(h,r.lens,0,r.nlen,r.lencode,0,r.work,V),r.lenbits=V.bits,U){e.msg="invalid literal/lengths set",r.mode=v;break}if(r.distbits=6,r.distcode=r.distdyn,V={bits:r.distbits},U=l(c,r.lens,r.nlen,r.ndist,r.distcode,0,r.work,V),r.distbits=V.bits,U){e.msg="invalid distances set",r.mode=v;break}if(r.mode=20,6===t)break e;case 20:r.mode=21;case 21:if(A>=6&&C>=258){e.next_out=x,e.avail_out=C,e.next_in=w,e.avail_in=A,r.hold=S,r.bits=M,o(e,L),x=e.next_out,y=e.output,C=e.avail_out,w=e.next_in,_=e.input,A=e.avail_in,S=r.hold,M=r.bits,r.mode===g&&(r.back=-1);break}for(r.back=0;F=(H=r.lencode[S&(1<>>16&255,R=65535&H,!((D=H>>>24)<=M);){if(0===A)break e;A--,S+=_[w++]<>P)])>>>16&255,R=65535&H,!(P+(D=H>>>24)<=M);){if(0===A)break e;A--,S+=_[w++]<>>=P,M-=P,r.back+=P}if(S>>>=D,M-=D,r.back+=D,r.length=R,0===F){r.mode=26;break}if(32&F){r.back=-1,r.mode=g;break}if(64&F){e.msg="invalid literal/length code",r.mode=v;break}r.extra=15&F,r.mode=22;case 22:if(r.extra){for(j=r.extra;M>>=r.extra,M-=r.extra,r.back+=r.extra}r.was=r.length,r.mode=23;case 23:for(;F=(H=r.distcode[S&(1<>>16&255,R=65535&H,!((D=H>>>24)<=M);){if(0===A)break e;A--,S+=_[w++]<>P)])>>>16&255,R=65535&H,!(P+(D=H>>>24)<=M);){if(0===A)break e;A--,S+=_[w++]<>>=P,M-=P,r.back+=P}if(S>>>=D,M-=D,r.back+=D,64&F){e.msg="invalid distance code",r.mode=v;break}r.offset=R,r.extra=15&F,r.mode=24;case 24:if(r.extra){for(j=r.extra;M>>=r.extra,M-=r.extra,r.back+=r.extra}if(r.offset>r.dmax){e.msg="invalid distance too far back",r.mode=v;break}r.mode=25;case 25:if(0===C)break e;if(k=L-C,r.offset>k){if((k=r.offset-k)>r.whave&&r.sane){e.msg="invalid distance too far back",r.mode=v;break}k>r.wnext?(k-=r.wnext,I=r.wsize-k):I=r.wnext-k,k>r.length&&(k=r.length),O=r.window}else O=y,I=x-r.offset,k=r.length;k>C&&(k=C),C-=k,r.length-=k;do{y[x++]=O[I++]}while(--k);0===r.length&&(r.mode=21);break;case 26:if(0===C)break e;y[x++]=r.length,C--,r.mode=21;break;case 27:if(r.wrap){for(;M<32;){if(0===A)break e;A--,S|=_[w++]<{"use strict";var s=r(6296),a=15,n=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,0,0],o=[16,16,16,16,16,16,16,16,17,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,16,72,78],l=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0],h=[16,16,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,64,64];e.exports=function(e,t,r,c,u,f,p,g){var v,_,y,b,w,x,A,C,S,M=g.bits,z=0,L=0,E=0,T=0,k=0,I=0,O=0,D=0,F=0,R=0,P=null,G=0,B=new s.Buf16(16),N=new s.Buf16(16),U=null,V=0;for(z=0;z<=a;z++)B[z]=0;for(L=0;L=1&&0===B[T];T--);if(k>T&&(k=T),0===T)return u[f++]=20971520,u[f++]=20971520,g.bits=1,0;for(E=1;E0&&(0===e||1!==T))return-1;for(N[1]=0,z=1;z852||2===e&&F>592)return 1;for(;;){A=z-O,p[L]x?(C=U[V+p[L]],S=P[G+p[L]]):(C=96,S=0),v=1<>O)+(_-=v)]=A<<24|C<<16|S|0}while(0!==_);for(v=1<>=1;if(0!==v?(R&=v-1,R+=v):R=0,L++,0==--B[z]){if(z===T)break;z=t[r+p[L]]}if(z>k&&(R&b)!==y){for(0===O&&(O=k),w+=E,D=1<<(I=z-O);I+O852||2===e&&F>592)return 1;u[y=R&b]=k<<24|I<<16|w-f|0}}return 0!==R&&(u[w+R]=z-O<<24|64<<16|0),g.bits=k,0}},5795:e=>{"use strict";e.exports={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"}},5313:(e,t,r)=>{"use strict";var s=r(6296),a=0,n=1;function o(e){for(var t=e.length;--t>=0;)e[t]=0}var l=0,h=29,c=256,u=c+1+h,f=30,p=19,g=2*u+1,v=15,_=16,y=7,b=256,w=16,x=17,A=18,C=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],S=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],M=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],z=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],L=new Array(2*(u+2));o(L);var E=new Array(2*f);o(E);var T=new Array(512);o(T);var k=new Array(256);o(k);var I=new Array(h);o(I);var O,D,F,R=new Array(f);function P(e,t,r,s,a){this.static_tree=e,this.extra_bits=t,this.extra_base=r,this.elems=s,this.max_length=a,this.has_stree=e&&e.length}function G(e,t){this.dyn_tree=e,this.max_code=0,this.stat_desc=t}function B(e){return e<256?T[e]:T[256+(e>>>7)]}function N(e,t){e.pending_buf[e.pending++]=255&t,e.pending_buf[e.pending++]=t>>>8&255}function U(e,t,r){e.bi_valid>_-r?(e.bi_buf|=t<>_-e.bi_valid,e.bi_valid+=r-_):(e.bi_buf|=t<>>=1,r<<=1}while(--t>0);return r>>>1}function H(e,t,r){var s,a,n=new Array(v+1),o=0;for(s=1;s<=v;s++)n[s]=o=o+r[s-1]<<1;for(a=0;a<=t;a++){var l=e[2*a+1];0!==l&&(e[2*a]=j(n[l]++,l))}}function W(e){var t;for(t=0;t8?N(e,e.bi_buf):e.bi_valid>0&&(e.pending_buf[e.pending++]=e.bi_buf),e.bi_buf=0,e.bi_valid=0}function Y(e,t,r,s){var a=2*t,n=2*r;return e[a]>1;r>=1;r--)Z(e,n,r);a=h;do{r=e.heap[1],e.heap[1]=e.heap[e.heap_len--],Z(e,n,1),s=e.heap[1],e.heap[--e.heap_max]=r,e.heap[--e.heap_max]=s,n[2*a]=n[2*r]+n[2*s],e.depth[a]=(e.depth[r]>=e.depth[s]?e.depth[r]:e.depth[s])+1,n[2*r+1]=n[2*s+1]=a,e.heap[1]=a++,Z(e,n,1)}while(e.heap_len>=2);e.heap[--e.heap_max]=e.heap[1],function(e,t){var r,s,a,n,o,l,h=t.dyn_tree,c=t.max_code,u=t.stat_desc.static_tree,f=t.stat_desc.has_stree,p=t.stat_desc.extra_bits,_=t.stat_desc.extra_base,y=t.stat_desc.max_length,b=0;for(n=0;n<=v;n++)e.bl_count[n]=0;for(h[2*e.heap[e.heap_max]+1]=0,r=e.heap_max+1;ry&&(n=y,b++),h[2*s+1]=n,s>c||(e.bl_count[n]++,o=0,s>=_&&(o=p[s-_]),l=h[2*s],e.opt_len+=l*(n+o),f&&(e.static_len+=l*(u[2*s+1]+o)));if(0!==b){do{for(n=y-1;0===e.bl_count[n];)n--;e.bl_count[n]--,e.bl_count[n+1]+=2,e.bl_count[y]--,b-=2}while(b>0);for(n=y;0!==n;n--)for(s=e.bl_count[n];0!==s;)(a=e.heap[--r])>c||(h[2*a+1]!==n&&(e.opt_len+=(n-h[2*a+1])*h[2*a],h[2*a+1]=n),s--)}}(e,t),H(n,c,e.bl_count)}function $(e,t,r){var s,a,n=-1,o=t[1],l=0,h=7,c=4;for(0===o&&(h=138,c=3),t[2*(r+1)+1]=65535,s=0;s<=r;s++)a=o,o=t[2*(s+1)+1],++l>=7;s0?(2===e.strm.data_type&&(e.strm.data_type=function(e){var t,r=4093624447;for(t=0;t<=31;t++,r>>>=1)if(1&r&&0!==e.dyn_ltree[2*t])return a;if(0!==e.dyn_ltree[18]||0!==e.dyn_ltree[20]||0!==e.dyn_ltree[26])return n;for(t=32;t=3&&0===e.bl_tree[2*z[t]+1];t--);return e.opt_len+=3*(t+1)+5+5+4,t}(e),o=e.opt_len+3+7>>>3,(l=e.static_len+3+7>>>3)<=o&&(o=l)):o=l=r+5,r+4<=o&&-1!==t?ee(e,t,r,s):4===e.strategy||l===o?(U(e,2+(s?1:0),3),X(e,L,E)):(U(e,4+(s?1:0),3),function(e,t,r,s){var a;for(U(e,t-257,5),U(e,r-1,5),U(e,s-4,4),a=0;a>>8&255,e.pending_buf[e.d_buf+2*e.last_lit+1]=255&t,e.pending_buf[e.l_buf+e.last_lit]=255&r,e.last_lit++,0===t?e.dyn_ltree[2*r]++:(e.matches++,t--,e.dyn_ltree[2*(k[r]+c+1)]++,e.dyn_dtree[2*B(t)]++),e.last_lit===e.lit_bufsize-1},t._tr_align=function(e){U(e,2,3),V(e,b,L),function(e){16===e.bi_valid?(N(e,e.bi_buf),e.bi_buf=0,e.bi_valid=0):e.bi_valid>=8&&(e.pending_buf[e.pending++]=255&e.bi_buf,e.bi_buf>>=8,e.bi_valid-=8)}(e)}},6866:e=>{"use strict";e.exports=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}},7882:()=>{$3Dmol.workerString=function(){self.onmessage=function(e){var t=e.data,r=t.type;if(r<0)self.atomData=t.atoms,self.volume=t.volume,self.ps=new ProteinSurface;else{var s=self.ps;s.initparm(t.expandedExtent,1!=r,self.volume),s.fillvoxels(self.atomData,t.extendedAtoms),s.buildboundary(),4!==r&&2!==r||(s.fastdistancemap(),s.boundingatom(!1),s.fillvoxelswaals(self.atomData,t.extendedAtoms)),s.marchingcube(r);var a=s.getFacesAndVertices(t.atomsToShow);self.postMessage(a)}}}.toString().replace(/(^.*?\{|\}$)/g,""),$3Dmol.workerString+=";\nfunction _classCallCheck() {};",$3Dmol.workerString+=";\n"+$3Dmol.Vector3.toString(),$3Dmol.workerString+=";\n"+$3Dmol.MarchingCubeInitializer.toString()+";\n\n",$3Dmol.workerString+=";\n"+$3Dmol.PointGrid.toString()+";\n",$3Dmol.workerString+=";\nvar ProteinSurface = "+$3Dmol.ProteinSurface.toString()+";\n",$3Dmol.SurfaceWorker=window.URL?window.URL.createObjectURL(new Blob([$3Dmol.workerString],{type:"text/javascript"})):void 0},6279:e=>{"object"==typeof e.exports&&(e.exports=window.$3Dmol)},7420:function(e,t){!function(e){"use strict";function t(e,t,r){for(var s=(e.byteLength,0),a=r.length;a>s;s++){var n=r.charCodeAt(s);if(128>n)e.setUint8(t++,n>>>0&127|0);else if(2048>n)e.setUint8(t++,n>>>6&31|192),e.setUint8(t++,n>>>0&63|128);else if(65536>n)e.setUint8(t++,n>>>12&15|224),e.setUint8(t++,n>>>6&63|128),e.setUint8(t++,n>>>0&63|128);else{if(!(1114112>n))throw new Error("bad codepoint "+n);e.setUint8(t++,n>>>18&7|240),e.setUint8(t++,n>>>12&63|128),e.setUint8(t++,n>>>6&63|128),e.setUint8(t++,n>>>0&63|128)}}}function r(e){for(var t=0,r=0,s=e.length;s>r;r++){var a=e.charCodeAt(r);if(128>a)t+=1;else if(2048>a)t+=2;else if(65536>a)t+=3;else{if(!(1114112>a))throw new Error("bad codepoint "+a);t+=4}}return t}function s(e,a,n){var o=typeof e;if("string"===o){if(32>(l=r(e)))return a.setUint8(n,160|l),t(a,n+1,e),1+l;if(256>l)return a.setUint8(n,217),a.setUint8(n+1,l),t(a,n+2,e),2+l;if(65536>l)return a.setUint8(n,218),a.setUint16(n+1,l),t(a,n+3,e),3+l;if(4294967296>l)return a.setUint8(n,219),a.setUint32(n+1,l),t(a,n+5,e),5+l}if(e instanceof Uint8Array){var l=e.byteLength,h=new Uint8Array(a.buffer);if(256>l)return a.setUint8(n,196),a.setUint8(n+1,l),h.set(e,n+2),2+l;if(65536>l)return a.setUint8(n,197),a.setUint16(n+1,l),h.set(e,n+3),3+l;if(4294967296>l)return a.setUint8(n,198),a.setUint32(n+1,l),h.set(e,n+5),5+l}if("number"===o){if(!isFinite(e))throw new Error("Number not finite: "+e);if(Math.floor(e)!==e)return a.setUint8(n,203),a.setFloat64(n+1,e),9;if(e>=0){if(128>e)return a.setUint8(n,e),1;if(256>e)return a.setUint8(n,204),a.setUint8(n+1,e),2;if(65536>e)return a.setUint8(n,205),a.setUint16(n+1,e),3;if(4294967296>e)return a.setUint8(n,206),a.setUint32(n+1,e),5;throw new Error("Number too big 0x"+e.toString(16))}if(e>=-32)return a.setInt8(n,e),1;if(e>=-128)return a.setUint8(n,208),a.setInt8(n+1,e),2;if(e>=-32768)return a.setUint8(n,209),a.setInt16(n+1,e),3;if(e>=-2147483648)return a.setUint8(n,210),a.setInt32(n+1,e),5;throw new Error("Number too small -0x"+(-e).toString(16).substr(1))}if(null===e)return a.setUint8(n,192),1;if("boolean"===o)return a.setUint8(n,e?195:194),1;if("object"===o){var c=0,u=Array.isArray(e);if(u)l=e.length;else{var f=Object.keys(e);l=f.length}if(16>l?(a.setUint8(n,l|(u?144:128)),c=1):65536>l?(a.setUint8(n,u?220:222),a.setUint16(n+1,l),c=3):4294967296>l&&(a.setUint8(n,u?221:223),a.setUint32(n+1,l),c=5),u)for(var p=0;l>p;p++)c+=s(e[p],a,n+c);else for(p=0;l>p;p++){var g=f[p];c+=s(g,a,n+c),c+=s(e[g],a,n+c)}return c}throw new Error("Unknown type "+o)}function a(e){var t=typeof e;if("string"===t){if(32>(s=r(e)))return 1+s;if(256>s)return 2+s;if(65536>s)return 3+s;if(4294967296>s)return 5+s}if(e instanceof Uint8Array){if(256>(s=e.byteLength))return 2+s;if(65536>s)return 3+s;if(4294967296>s)return 5+s}if("number"===t){if(Math.floor(e)!==e)return 9;if(e>=0){if(128>e)return 1;if(256>e)return 2;if(65536>e)return 3;if(4294967296>e)return 5;throw new Error("Number too big 0x"+e.toString(16))}if(e>=-32)return 1;if(e>=-128)return 2;if(e>=-32768)return 3;if(e>=-2147483648)return 5;throw new Error("Number too small -0x"+e.toString(16).substr(1))}if("boolean"===t||null===e)return 1;if("object"===t){var s,n=0;if(Array.isArray(e)){s=e.length;for(var o=0;s>o;o++)n+=a(e[o])}else{var l=Object.keys(e);for(s=l.length,o=0;s>o;o++){var h=l[o];n+=a(h)+a(e[h])}}if(16>s)return 1+n;if(65536>s)return 3+n;if(4294967296>s)return 5+n;throw new Error("Array or object too long 0x"+s.toString(16))}throw new Error("Unknown type "+t)}function n(e){var t=new ArrayBuffer(a(e));return s(e,new DataView(t),0),new Uint8Array(t)}function o(e,t,r){return t?new e(t.buffer,t.byteOffset,t.byteLength/(r||1)):void 0}function l(e){return o(DataView,e)}function h(e){return o(Uint8Array,e)}function c(e){return o(Int8Array,e)}function u(e){return o(Int32Array,e,4)}function f(e){return o(Float32Array,e,4)}function p(e,t){var r=e.length/2;t||(t=new Int16Array(r));for(var s=0,a=0;r>s;++s,a+=2)t[s]=e[a]<<8^e[a+1]<<0;return t}function g(e,t){var r=e.length;t||(t=new Uint8Array(2*r));for(var s=l(t),a=0;r>a;++a)s.setInt16(2*a,e[a]);return h(t)}function v(e,t){var r=e.length/4;t||(t=new Int32Array(r));for(var s=0,a=0;r>s;++s,a+=4)t[s]=e[a]<<24^e[a+1]<<16^e[a+2]<<8^e[a+3]<<0;return t}function _(e,t){var r=e.length;t||(t=new Uint8Array(4*r));for(var s=l(t),a=0;r>a;++a)s.setInt32(4*a,e[a]);return h(t)}function y(e,t){var r=e.length;t||(t=new Float32Array(r/4));for(var s=l(t),a=l(e),n=0,o=0,h=r/4;h>n;++n,o+=4)s.setFloat32(o,a.getFloat32(o),!0);return t}function b(e,t,r){var s=e.length,a=1/t;r||(r=new Float32Array(s));for(var n=0;s>n;++n)r[n]=e[n]*a;return r}function w(e,t,r){var s=e.length;r||(r=new Int32Array(s));for(var a=0;s>a;++a)r[a]=Math.round(e[a]*t);return r}function x(e,t){var r,s;if(!t){var a=0;for(r=0,s=e.length;s>r;r+=2)a+=e[r+1];t=new e.constructor(a)}var n=0;for(r=0,s=e.length;s>r;r+=2)for(var o=e[r],l=e[r+1],h=0;l>h;++h)t[n]=o,++n;return t}function A(e){if(0===e.length)return new Int32Array;var t,r,s=2;for(t=1,r=e.length;r>t;++t)e[t-1]!==e[t]&&(s+=2);var a=new Int32Array(s),n=0,o=1;for(t=1,r=e.length;r>t;++t)e[t-1]!==e[t]?(a[n]=e[t-1],a[n+1]=o,o=1,n+=2):++o;return a[n]=e[e.length-1],a[n+1]=o,a}function C(e,t){var r=e.length;t||(t=new e.constructor(r)),r&&(t[0]=e[0]);for(var s=1;r>s;++s)t[s]=e[s]+t[s-1];return t}function S(e,t){var r=e.length;t||(t=new e.constructor(r)),t[0]=e[0];for(var s=1;r>s;++s)t[s]=e[s]-e[s-1];return t}function M(e,t){var r,s,a=e instanceof Int8Array?127:32767,n=-a-1,o=e.length;if(!t){var l=0;for(r=0;o>r;++r)e[r]n&&++l;t=new Int32Array(l)}for(r=0,s=0;o>r;){for(var h=0;e[r]===a||e[r]===n;)h+=e[r],++r;h+=e[r],++r,t[s]=h,++s}return t}function z(e,t){var r,s=t?127:32767,a=-s-1,n=e.length,o=0;for(r=0;n>r;++r)0===(c=e[r])?++o:c>0?(o+=Math.ceil(c/s),c%s==0&&(o+=1)):(o+=Math.ceil(c/a),c%a==0&&(o+=1));var l=t?new Int8Array(o):new Int16Array(o),h=0;for(r=0;n>r;++r){var c;if((c=e[r])>=0)for(;c>=s;)l[h]=s,++h,c-=s;else for(;a>=c;)l[h]=a,++h,c-=a;l[h]=c,++h}return l}function L(e,t){return C(x(e),t)}function E(e){return A(S(e))}function T(e,t,r){return b(x(e,u(r)),t,r)}function k(e,t){return A(w(e,t))}function I(e,t,r){return b(C(e,u(r)),t,r)}function O(e,t,r){return S(w(e,t),r)}function D(e,t,r){return b(M(e,u(r)),t,r)}function F(e,t,r){var s=M(e,u(r));return I(s,t,f(s))}function R(e,t,r){return z(O(e,t),r)}function P(e){var t=l(e),r=t.getInt32(0),s=t.getInt32(4),a=e.subarray(8,12);return[r,e=e.subarray(12),s,a]}function G(e,t,r,s){var a=new ArrayBuffer(12+s.byteLength),n=new Uint8Array(a),o=new DataView(a);return o.setInt32(0,e),o.setInt32(4,t),r&&n.set(r,8),n.set(s,12),n}function B(e){return G(2,e.length,void 0,h(e))}function N(e){return G(4,e.length,void 0,_(e))}function U(e,t){return G(5,e.length/t,_([t]),h(e))}function V(e){return G(6,e.length,void 0,_(A(e)))}function j(e){return G(8,e.length,void 0,_(E(e)))}function H(e,t){return G(9,e.length,_([t]),_(k(e,t)))}function W(e,t){return G(10,e.length,_([t]),g(R(e,t)))}function q(e){var t={};return ie.forEach((function(r){void 0!==e[r]&&(t[r]=e[r])})),e.bondAtomList&&(t.bondAtomList=N(e.bondAtomList)),e.bondOrderList&&(t.bondOrderList=B(e.bondOrderList)),t.xCoordList=W(e.xCoordList,1e3),t.yCoordList=W(e.yCoordList,1e3),t.zCoordList=W(e.zCoordList,1e3),e.bFactorList&&(t.bFactorList=W(e.bFactorList,100)),e.atomIdList&&(t.atomIdList=j(e.atomIdList)),e.altLocList&&(t.altLocList=V(e.altLocList)),e.occupancyList&&(t.occupancyList=H(e.occupancyList,100)),t.groupIdList=j(e.groupIdList),t.groupTypeList=N(e.groupTypeList),e.secStructList&&(t.secStructList=B(e.secStructList)),e.insCodeList&&(t.insCodeList=V(e.insCodeList)),e.sequenceIndexList&&(t.sequenceIndexList=j(e.sequenceIndexList)),t.chainIdList=U(e.chainIdList,4),e.chainNameList&&(t.chainNameList=U(e.chainNameList,4)),t}function Y(e){function t(e){for(var t={},r=0;e>r;r++)t[n()]=n();return t}function r(t){var r=e.subarray(o,o+t);return o+=t,r}function s(t){var r=e.subarray(o,o+t);o+=t;var s=65535;if(t>s){for(var a=[],n=0;nr;r++)t[r]=n();return t}function n(){var n,h,c=e[o];if(0==(128&c))return o++,c;if(128==(240&c))return o++,t(h=15&c);if(144==(240&c))return o++,a(h=15&c);if(160==(224&c))return o++,s(h=31&c);if(224==(224&c))return n=l.getInt8(o),o++,n;switch(c){case 192:return o++,null;case 194:return o++,!1;case 195:return o++,!0;case 196:return h=l.getUint8(o+1),o+=2,r(h);case 197:return h=l.getUint16(o+1),o+=3,r(h);case 198:return h=l.getUint32(o+1),o+=5,r(h);case 202:return n=l.getFloat32(o+1),o+=5,n;case 203:return n=l.getFloat64(o+1),o+=9,n;case 204:return n=e[o+1],o+=2,n;case 205:return n=l.getUint16(o+1),o+=3,n;case 206:return n=l.getUint32(o+1),o+=5,n;case 208:return n=l.getInt8(o+1),o+=2,n;case 209:return n=l.getInt16(o+1),o+=3,n;case 210:return n=l.getInt32(o+1),o+=5,n;case 217:return h=l.getUint8(o+1),o+=2,s(h);case 218:return h=l.getUint16(o+1),o+=3,s(h);case 219:return h=l.getUint32(o+1),o+=5,s(h);case 220:return h=l.getUint16(o+1),o+=3,a(h);case 221:return h=l.getUint32(o+1),o+=5,a(h);case 222:return h=l.getUint16(o+1),o+=3,t(h);case 223:return h=l.getUint32(o+1),o+=5,t(h)}throw new Error("Unknown type 0x"+c.toString(16))}var o=0,l=new DataView(e.buffer);return n()}function Z(e,t,r,s){switch(e){case 1:return y(t);case 2:return c(t);case 3:return p(t);case 4:return v(t);case 5:return h(t);case 6:return x(v(t),new Uint8Array(r));case 7:return x(v(t));case 8:return L(v(t));case 9:return T(v(t),v(s)[0]);case 10:return F(p(t),v(s)[0]);case 11:return b(p(t),v(s)[0]);case 12:return D(p(t),v(s)[0]);case 13:return D(c(t),v(s)[0]);case 14:return M(p(t));case 15:return M(c(t))}}function X(e,t){var r=(t=t||{}).ignoreFields,s={};return ae.forEach((function(t){var a=!!r&&-1!==r.indexOf(t),n=e[t];a||void 0===n||(n instanceof Uint8Array?s[t]=Z.apply(null,P(n)):s[t]=n)})),s}function K(e){return String.fromCharCode.apply(null,e).replace(/\0/g,"")}function $(e,t,r){var s,a,n,o,l,h,c=(r=r||{}).firstModelOnly,u=t.onModel,f=t.onChain,p=t.onGroup,g=t.onAtom,v=t.onBond,_=0,y=0,b=0,w=0,x=0,A=-1,C=e.chainNameList,S=e.secStructList,M=e.insCodeList,z=e.sequenceIndexList,L=e.atomIdList,E=e.bFactorList,T=e.altLocList,k=e.occupancyList,I=e.bondAtomList,O=e.bondOrderList;for(s=0,a=e.chainsPerModel.length;a>s&&!(c&&_>0);++s){var D=e.chainsPerModel[_];for(u&&u({chainCount:D,modelIndex:_}),n=0;D>n;++n){var F=e.groupsPerChain[y];if(f){var R=K(e.chainIdList.subarray(4*y,4*y+4)),P=null;C&&(P=K(C.subarray(4*y,4*y+4))),f({groupCount:F,chainIndex:y,modelIndex:_,chainId:R,chainName:P})}for(o=0;F>o;++o){var G=e.groupList[e.groupTypeList[b]],B=G.atomNameList.length;if(p){var N=null;S&&(N=S[b]);var U=null;e.insCodeList&&(U=String.fromCharCode(M[b]));var V=null;z&&(V=z[b]),p({atomCount:B,groupIndex:b,chainIndex:y,modelIndex:_,groupId:e.groupIdList[b],groupType:e.groupTypeList[b],groupName:G.groupName,singleLetterCode:G.singleLetterCode,chemCompType:G.chemCompType,secStruct:N,insCode:U,sequenceIndex:V})}for(l=0;B>l;++l){if(g){var j=null;L&&(j=L[w]);var H=null;E&&(H=E[w]);var W=null;T&&(W=String.fromCharCode(T[w]));var q=null;k&&(q=k[w]),g({atomIndex:w,groupIndex:b,chainIndex:y,modelIndex:_,atomId:j,element:G.elementList[l],atomName:G.atomNameList[l],formalCharge:G.formalChargeList[l],xCoord:e.xCoordList[w],yCoord:e.yCoordList[w],zCoord:e.zCoordList[w],bFactor:H,altLoc:W,occupancy:q})}w+=1}if(v){var Y=G.bondAtomList;for(l=0,h=G.bondOrderList.length;h>l;++l)v({atomIndex1:w-B+Y[2*l],atomIndex2:w-B+Y[2*l+1],bondOrder:G.bondOrderList[l]})}b+=1}y+=1}if(x=A+1,A=w-1,v&&I)for(l=0,h=I.length;h>l;l+=2){var Z=I[l],X=I[l+1];(Z>=x&&A>=Z||X>=x&&A>=X)&&v({atomIndex1:Z,atomIndex2:X,bondOrder:O?O[l/2]:null})}_+=1}}function Q(e){return n(q(e))}function J(e,t){return e instanceof ArrayBuffer&&(e=new Uint8Array(e)),X(e instanceof Uint8Array?Y(e):e,t)}function ee(e,t,r,s){function a(){try{var e=J(n.response);r(e)}catch(e){s(e)}}var n=new XMLHttpRequest;n.addEventListener("load",a,!0),n.addEventListener("error",s,!0),n.responseType="arraybuffer",n.open("GET",t+e.toUpperCase()),n.send()}function te(e,t,r){ee(e,le,t,r)}function re(e,t,r){ee(e,he,t,r)}var ie=["mmtfVersion","mmtfProducer","unitCell","spaceGroup","structureId","title","depositionDate","releaseDate","experimentalMethods","resolution","rFree","rWork","bioAssemblyList","ncsOperatorList","entityList","groupList","numBonds","numAtoms","numGroups","numChains","numModels","groupsPerChain","chainsPerModel"],se=["xCoordList","yCoordList","zCoordList","groupIdList","groupTypeList","chainIdList","bFactorList","atomIdList","altLocList","occupancyList","secStructList","insCodeList","sequenceIndexList","chainNameList","bondAtomList","bondOrderList"],ae=ie.concat(se),ne="v1.0.1",oe="//mmtf.rcsb.org/v1.0/",le=oe+"full/",he=oe+"reduced/";e.encode=Q,e.decode=J,e.traverse=$,e.fetch=te,e.fetchReduced=re,e.version=ne,e.fetchUrl=le,e.fetchReducedUrl=he,e.encodeMsgpack=n,e.encodeMmtf=q,e.decodeMsgpack=Y,e.decodeMmtf=X}(t)},7885:(e,t,r)=>{"use strict";r.r(t),r.d(t,{Deflate:()=>yr,Inflate:()=>Ar,constants:()=>zr,default:()=>Lr,deflate:()=>br,deflateRaw:()=>wr,gzip:()=>xr,inflate:()=>Cr,inflateRaw:()=>Sr,ungzip:()=>Mr});function s(e){let t=e.length;for(;--t>=0;)e[t]=0}const a=256,n=286,o=30,l=15,h=new Uint8Array([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0]),c=new Uint8Array([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13]),u=new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]),f=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),p=new Array(576);s(p);const g=new Array(60);s(g);const v=new Array(512);s(v);const _=new Array(256);s(_);const y=new Array(29);s(y);const b=new Array(o);function w(e,t,r,s,a){this.static_tree=e,this.extra_bits=t,this.extra_base=r,this.elems=s,this.max_length=a,this.has_stree=e&&e.length}let x,A,C;function S(e,t){this.dyn_tree=e,this.max_code=0,this.stat_desc=t}s(b);const M=e=>e<256?v[e]:v[256+(e>>>7)],z=(e,t)=>{e.pending_buf[e.pending++]=255&t,e.pending_buf[e.pending++]=t>>>8&255},L=(e,t,r)=>{e.bi_valid>16-r?(e.bi_buf|=t<>16-e.bi_valid,e.bi_valid+=r-16):(e.bi_buf|=t<{L(e,r[2*t],r[2*t+1])},T=(e,t)=>{let r=0;do{r|=1&e,e>>>=1,r<<=1}while(--t>0);return r>>>1},k=(e,t,r)=>{const s=new Array(16);let a,n,o=0;for(a=1;a<=l;a++)o=o+r[a-1]<<1,s[a]=o;for(n=0;n<=t;n++){let t=e[2*n+1];0!==t&&(e[2*n]=T(s[t]++,t))}},I=e=>{let t;for(t=0;t{e.bi_valid>8?z(e,e.bi_buf):e.bi_valid>0&&(e.pending_buf[e.pending++]=e.bi_buf),e.bi_buf=0,e.bi_valid=0},D=(e,t,r,s)=>{const a=2*t,n=2*r;return e[a]{const s=e.heap[r];let a=r<<1;for(;a<=e.heap_len&&(a{let s,n,o,l,u=0;if(0!==e.sym_next)do{s=255&e.pending_buf[e.sym_buf+u++],s+=(255&e.pending_buf[e.sym_buf+u++])<<8,n=e.pending_buf[e.sym_buf+u++],0===s?E(e,n,t):(o=_[n],E(e,o+a+1,t),l=h[o],0!==l&&(n-=y[o],L(e,n,l)),s--,o=M(s),E(e,o,r),l=c[o],0!==l&&(s-=b[o],L(e,s,l)))}while(u{const r=t.dyn_tree,s=t.stat_desc.static_tree,a=t.stat_desc.has_stree,n=t.stat_desc.elems;let o,h,c,u=-1;for(e.heap_len=0,e.heap_max=573,o=0;o>1;o>=1;o--)F(e,r,o);c=n;do{o=e.heap[1],e.heap[1]=e.heap[e.heap_len--],F(e,r,1),h=e.heap[1],e.heap[--e.heap_max]=o,e.heap[--e.heap_max]=h,r[2*c]=r[2*o]+r[2*h],e.depth[c]=(e.depth[o]>=e.depth[h]?e.depth[o]:e.depth[h])+1,r[2*o+1]=r[2*h+1]=c,e.heap[1]=c++,F(e,r,1)}while(e.heap_len>=2);e.heap[--e.heap_max]=e.heap[1],((e,t)=>{const r=t.dyn_tree,s=t.max_code,a=t.stat_desc.static_tree,n=t.stat_desc.has_stree,o=t.stat_desc.extra_bits,h=t.stat_desc.extra_base,c=t.stat_desc.max_length;let u,f,p,g,v,_,y=0;for(g=0;g<=l;g++)e.bl_count[g]=0;for(r[2*e.heap[e.heap_max]+1]=0,u=e.heap_max+1;u<573;u++)f=e.heap[u],g=r[2*r[2*f+1]+1]+1,g>c&&(g=c,y++),r[2*f+1]=g,f>s||(e.bl_count[g]++,v=0,f>=h&&(v=o[f-h]),_=r[2*f],e.opt_len+=_*(g+v),n&&(e.static_len+=_*(a[2*f+1]+v)));if(0!==y){do{for(g=c-1;0===e.bl_count[g];)g--;e.bl_count[g]--,e.bl_count[g+1]+=2,e.bl_count[c]--,y-=2}while(y>0);for(g=c;0!==g;g--)for(f=e.bl_count[g];0!==f;)p=e.heap[--u],p>s||(r[2*p+1]!==g&&(e.opt_len+=(g-r[2*p+1])*r[2*p],r[2*p+1]=g),f--)}})(e,t),k(r,u,e.bl_count)},G=(e,t,r)=>{let s,a,n=-1,o=t[1],l=0,h=7,c=4;for(0===o&&(h=138,c=3),t[2*(r+1)+1]=65535,s=0;s<=r;s++)a=o,o=t[2*(s+1)+1],++l{let s,a,n=-1,o=t[1],l=0,h=7,c=4;for(0===o&&(h=138,c=3),s=0;s<=r;s++)if(a=o,o=t[2*(s+1)+1],!(++l{L(e,0+(s?1:0),3),O(e),z(e,r),z(e,~r),r&&e.pending_buf.set(e.window.subarray(t,t+r),e.pending),e.pending+=r};var V=(e,t,r,s)=>{let n,o,l=0;e.level>0?(2===e.strm.data_type&&(e.strm.data_type=(e=>{let t,r=4093624447;for(t=0;t<=31;t++,r>>>=1)if(1&r&&0!==e.dyn_ltree[2*t])return 0;if(0!==e.dyn_ltree[18]||0!==e.dyn_ltree[20]||0!==e.dyn_ltree[26])return 1;for(t=32;t{let t;for(G(e,e.dyn_ltree,e.l_desc.max_code),G(e,e.dyn_dtree,e.d_desc.max_code),P(e,e.bl_desc),t=18;t>=3&&0===e.bl_tree[2*f[t]+1];t--);return e.opt_len+=3*(t+1)+5+5+4,t})(e),n=e.opt_len+3+7>>>3,o=e.static_len+3+7>>>3,o<=n&&(n=o)):n=o=r+5,r+4<=n&&-1!==t?U(e,t,r,s):4===e.strategy||o===n?(L(e,2+(s?1:0),3),R(e,p,g)):(L(e,4+(s?1:0),3),((e,t,r,s)=>{let a;for(L(e,t-257,5),L(e,r-1,5),L(e,s-4,4),a=0;a{N||((()=>{let e,t,r,s,a;const f=new Array(16);for(r=0,s=0;s<28;s++)for(y[s]=r,e=0;e<1<>=7;s(e.pending_buf[e.sym_buf+e.sym_next++]=t,e.pending_buf[e.sym_buf+e.sym_next++]=t>>8,e.pending_buf[e.sym_buf+e.sym_next++]=r,0===t?e.dyn_ltree[2*r]++:(e.matches++,t--,e.dyn_ltree[2*(_[r]+a+1)]++,e.dyn_dtree[2*M(t)]++),e.sym_next===e.sym_end),_tr_align:e=>{L(e,2,3),E(e,256,p),(e=>{16===e.bi_valid?(z(e,e.bi_buf),e.bi_buf=0,e.bi_valid=0):e.bi_valid>=8&&(e.pending_buf[e.pending++]=255&e.bi_buf,e.bi_buf>>=8,e.bi_valid-=8)})(e)}};var H=(e,t,r,s)=>{let a=65535&e|0,n=e>>>16&65535|0,o=0;for(;0!==r;){o=r>2e3?2e3:r,r-=o;do{a=a+t[s++]|0,n=n+a|0}while(--o);a%=65521,n%=65521}return a|n<<16|0};const W=new Uint32Array((()=>{let e,t=[];for(var r=0;r<256;r++){e=r;for(var s=0;s<8;s++)e=1&e?3988292384^e>>>1:e>>>1;t[r]=e}return t})());var q=(e,t,r,s)=>{const a=W,n=s+r;e^=-1;for(let r=s;r>>8^a[255&(e^t[r])];return-1^e},Y={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"},Z={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8};const{_tr_init:X,_tr_stored_block:K,_tr_flush_block:$,_tr_tally:Q,_tr_align:J}=j,{Z_NO_FLUSH:ee,Z_PARTIAL_FLUSH:te,Z_FULL_FLUSH:re,Z_FINISH:ie,Z_BLOCK:se,Z_OK:ae,Z_STREAM_END:ne,Z_STREAM_ERROR:oe,Z_DATA_ERROR:le,Z_BUF_ERROR:he,Z_DEFAULT_COMPRESSION:ce,Z_FILTERED:de,Z_HUFFMAN_ONLY:ue,Z_RLE:fe,Z_FIXED:pe,Z_DEFAULT_STRATEGY:me,Z_UNKNOWN:ge,Z_DEFLATED:ve}=Z,_e=258,ye=262,be=42,we=113,xe=666,Ae=(e,t)=>(e.msg=Y[t],t),Ce=e=>2*e-(e>4?9:0),Se=e=>{let t=e.length;for(;--t>=0;)e[t]=0},Me=e=>{let t,r,s,a=e.w_size;t=e.hash_size,s=t;do{r=e.head[--s],e.head[s]=r>=a?r-a:0}while(--t);t=a,s=t;do{r=e.prev[--s],e.prev[s]=r>=a?r-a:0}while(--t)};let ze=(e,t,r)=>(t<{const t=e.state;let r=t.pending;r>e.avail_out&&(r=e.avail_out),0!==r&&(e.output.set(t.pending_buf.subarray(t.pending_out,t.pending_out+r),e.next_out),e.next_out+=r,t.pending_out+=r,e.total_out+=r,e.avail_out-=r,t.pending-=r,0===t.pending&&(t.pending_out=0))},Ee=(e,t)=>{$(e,e.block_start>=0?e.block_start:-1,e.strstart-e.block_start,t),e.block_start=e.strstart,Le(e.strm)},Te=(e,t)=>{e.pending_buf[e.pending++]=t},ke=(e,t)=>{e.pending_buf[e.pending++]=t>>>8&255,e.pending_buf[e.pending++]=255&t},Ie=(e,t,r,s)=>{let a=e.avail_in;return a>s&&(a=s),0===a?0:(e.avail_in-=a,t.set(e.input.subarray(e.next_in,e.next_in+a),r),1===e.state.wrap?e.adler=H(e.adler,t,a,r):2===e.state.wrap&&(e.adler=q(e.adler,t,a,r)),e.next_in+=a,e.total_in+=a,a)},Oe=(e,t)=>{let r,s,a=e.max_chain_length,n=e.strstart,o=e.prev_length,l=e.nice_match;const h=e.strstart>e.w_size-ye?e.strstart-(e.w_size-ye):0,c=e.window,u=e.w_mask,f=e.prev,p=e.strstart+_e;let g=c[n+o-1],v=c[n+o];e.prev_length>=e.good_match&&(a>>=2),l>e.lookahead&&(l=e.lookahead);do{if(r=t,c[r+o]===v&&c[r+o-1]===g&&c[r]===c[n]&&c[++r]===c[n+1]){n+=2,r++;do{}while(c[++n]===c[++r]&&c[++n]===c[++r]&&c[++n]===c[++r]&&c[++n]===c[++r]&&c[++n]===c[++r]&&c[++n]===c[++r]&&c[++n]===c[++r]&&c[++n]===c[++r]&&no){if(e.match_start=t,o=s,s>=l)break;g=c[n+o-1],v=c[n+o]}}}while((t=f[t&u])>h&&0!=--a);return o<=e.lookahead?o:e.lookahead},De=e=>{const t=e.w_size;let r,s,a;do{if(s=e.window_size-e.lookahead-e.strstart,e.strstart>=t+(t-ye)&&(e.window.set(e.window.subarray(t,t+t-s),0),e.match_start-=t,e.strstart-=t,e.block_start-=t,e.insert>e.strstart&&(e.insert=e.strstart),Me(e),s+=t),0===e.strm.avail_in)break;if(r=Ie(e.strm,e.window,e.strstart+e.lookahead,s),e.lookahead+=r,e.lookahead+e.insert>=3)for(a=e.strstart-e.insert,e.ins_h=e.window[a],e.ins_h=ze(e,e.ins_h,e.window[a+1]);e.insert&&(e.ins_h=ze(e,e.ins_h,e.window[a+3-1]),e.prev[a&e.w_mask]=e.head[e.ins_h],e.head[e.ins_h]=a,a++,e.insert--,!(e.lookahead+e.insert<3)););}while(e.lookahead{let r,s,a,n=e.pending_buf_size-5>e.w_size?e.w_size:e.pending_buf_size-5,o=0,l=e.strm.avail_in;do{if(r=65535,a=e.bi_valid+42>>3,e.strm.avail_outs+e.strm.avail_in&&(r=s+e.strm.avail_in),r>a&&(r=a),r>8,e.pending_buf[e.pending-2]=~r,e.pending_buf[e.pending-1]=~r>>8,Le(e.strm),s&&(s>r&&(s=r),e.strm.output.set(e.window.subarray(e.block_start,e.block_start+s),e.strm.next_out),e.strm.next_out+=s,e.strm.avail_out-=s,e.strm.total_out+=s,e.block_start+=s,r-=s),r&&(Ie(e.strm,e.strm.output,e.strm.next_out,r),e.strm.next_out+=r,e.strm.avail_out-=r,e.strm.total_out+=r)}while(0===o);return l-=e.strm.avail_in,l&&(l>=e.w_size?(e.matches=2,e.window.set(e.strm.input.subarray(e.strm.next_in-e.w_size,e.strm.next_in),0),e.strstart=e.w_size,e.insert=e.strstart):(e.window_size-e.strstart<=l&&(e.strstart-=e.w_size,e.window.set(e.window.subarray(e.w_size,e.w_size+e.strstart),0),e.matches<2&&e.matches++,e.insert>e.strstart&&(e.insert=e.strstart)),e.window.set(e.strm.input.subarray(e.strm.next_in-l,e.strm.next_in),e.strstart),e.strstart+=l,e.insert+=l>e.w_size-e.insert?e.w_size-e.insert:l),e.block_start=e.strstart),e.high_watera&&e.block_start>=e.w_size&&(e.block_start-=e.w_size,e.strstart-=e.w_size,e.window.set(e.window.subarray(e.w_size,e.w_size+e.strstart),0),e.matches<2&&e.matches++,a+=e.w_size,e.insert>e.strstart&&(e.insert=e.strstart)),a>e.strm.avail_in&&(a=e.strm.avail_in),a&&(Ie(e.strm,e.window,e.strstart,a),e.strstart+=a,e.insert+=a>e.w_size-e.insert?e.w_size-e.insert:a),e.high_water>3,a=e.pending_buf_size-a>65535?65535:e.pending_buf_size-a,n=a>e.w_size?e.w_size:a,s=e.strstart-e.block_start,(s>=n||(s||t===ie)&&t!==ee&&0===e.strm.avail_in&&s<=a)&&(r=s>a?a:s,o=t===ie&&0===e.strm.avail_in&&r===s?1:0,K(e,e.block_start,r,o),e.block_start+=r,Le(e.strm)),o?3:1)},Re=(e,t)=>{let r,s;for(;;){if(e.lookahead=3&&(e.ins_h=ze(e,e.ins_h,e.window[e.strstart+3-1]),r=e.prev[e.strstart&e.w_mask]=e.head[e.ins_h],e.head[e.ins_h]=e.strstart),0!==r&&e.strstart-r<=e.w_size-ye&&(e.match_length=Oe(e,r)),e.match_length>=3)if(s=Q(e,e.strstart-e.match_start,e.match_length-3),e.lookahead-=e.match_length,e.match_length<=e.max_lazy_match&&e.lookahead>=3){e.match_length--;do{e.strstart++,e.ins_h=ze(e,e.ins_h,e.window[e.strstart+3-1]),r=e.prev[e.strstart&e.w_mask]=e.head[e.ins_h],e.head[e.ins_h]=e.strstart}while(0!=--e.match_length);e.strstart++}else e.strstart+=e.match_length,e.match_length=0,e.ins_h=e.window[e.strstart],e.ins_h=ze(e,e.ins_h,e.window[e.strstart+1]);else s=Q(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++;if(s&&(Ee(e,!1),0===e.strm.avail_out))return 1}return e.insert=e.strstart<2?e.strstart:2,t===ie?(Ee(e,!0),0===e.strm.avail_out?3:4):e.sym_next&&(Ee(e,!1),0===e.strm.avail_out)?1:2},Pe=(e,t)=>{let r,s,a;for(;;){if(e.lookahead=3&&(e.ins_h=ze(e,e.ins_h,e.window[e.strstart+3-1]),r=e.prev[e.strstart&e.w_mask]=e.head[e.ins_h],e.head[e.ins_h]=e.strstart),e.prev_length=e.match_length,e.prev_match=e.match_start,e.match_length=2,0!==r&&e.prev_length4096)&&(e.match_length=2)),e.prev_length>=3&&e.match_length<=e.prev_length){a=e.strstart+e.lookahead-3,s=Q(e,e.strstart-1-e.prev_match,e.prev_length-3),e.lookahead-=e.prev_length-1,e.prev_length-=2;do{++e.strstart<=a&&(e.ins_h=ze(e,e.ins_h,e.window[e.strstart+3-1]),r=e.prev[e.strstart&e.w_mask]=e.head[e.ins_h],e.head[e.ins_h]=e.strstart)}while(0!=--e.prev_length);if(e.match_available=0,e.match_length=2,e.strstart++,s&&(Ee(e,!1),0===e.strm.avail_out))return 1}else if(e.match_available){if(s=Q(e,0,e.window[e.strstart-1]),s&&Ee(e,!1),e.strstart++,e.lookahead--,0===e.strm.avail_out)return 1}else e.match_available=1,e.strstart++,e.lookahead--}return e.match_available&&(s=Q(e,0,e.window[e.strstart-1]),e.match_available=0),e.insert=e.strstart<2?e.strstart:2,t===ie?(Ee(e,!0),0===e.strm.avail_out?3:4):e.sym_next&&(Ee(e,!1),0===e.strm.avail_out)?1:2};function Ge(e,t,r,s,a){this.good_length=e,this.max_lazy=t,this.nice_length=r,this.max_chain=s,this.func=a}const Be=[new Ge(0,0,0,0,Fe),new Ge(4,4,8,4,Re),new Ge(4,5,16,8,Re),new Ge(4,6,32,32,Re),new Ge(4,4,16,16,Pe),new Ge(8,16,32,32,Pe),new Ge(8,16,128,128,Pe),new Ge(8,32,128,256,Pe),new Ge(32,128,258,1024,Pe),new Ge(32,258,258,4096,Pe)];function Ne(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=ve,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new Uint16Array(1146),this.dyn_dtree=new Uint16Array(122),this.bl_tree=new Uint16Array(78),Se(this.dyn_ltree),Se(this.dyn_dtree),Se(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new Uint16Array(16),this.heap=new Uint16Array(573),Se(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new Uint16Array(573),Se(this.depth),this.sym_buf=0,this.lit_bufsize=0,this.sym_next=0,this.sym_end=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}const Ue=e=>{if(!e)return 1;const t=e.state;return!t||t.strm!==e||t.status!==be&&57!==t.status&&69!==t.status&&73!==t.status&&91!==t.status&&103!==t.status&&t.status!==we&&t.status!==xe?1:0},Ve=e=>{if(Ue(e))return Ae(e,oe);e.total_in=e.total_out=0,e.data_type=ge;const t=e.state;return t.pending=0,t.pending_out=0,t.wrap<0&&(t.wrap=-t.wrap),t.status=2===t.wrap?57:t.wrap?be:we,e.adler=2===t.wrap?0:1,t.last_flush=-2,X(t),ae},je=e=>{const t=Ve(e);var r;return t===ae&&((r=e.state).window_size=2*r.w_size,Se(r.head),r.max_lazy_match=Be[r.level].max_lazy,r.good_match=Be[r.level].good_length,r.nice_match=Be[r.level].nice_length,r.max_chain_length=Be[r.level].max_chain,r.strstart=0,r.block_start=0,r.lookahead=0,r.insert=0,r.match_length=r.prev_length=2,r.match_available=0,r.ins_h=0),t},He=(e,t,r,s,a,n)=>{if(!e)return oe;let o=1;if(t===ce&&(t=6),s<0?(o=0,s=-s):s>15&&(o=2,s-=16),a<1||a>9||r!==ve||s<8||s>15||t<0||t>9||n<0||n>pe||8===s&&1!==o)return Ae(e,oe);8===s&&(s=9);const l=new Ne;return e.state=l,l.strm=e,l.status=be,l.wrap=o,l.gzhead=null,l.w_bits=s,l.w_size=1<He(e,t,ve,15,8,me),deflateInit2:He,deflateReset:je,deflateResetKeep:Ve,deflateSetHeader:(e,t)=>Ue(e)||2!==e.state.wrap?oe:(e.state.gzhead=t,ae),deflate:(e,t)=>{if(Ue(e)||t>se||t<0)return e?Ae(e,oe):oe;const r=e.state;if(!e.output||0!==e.avail_in&&!e.input||r.status===xe&&t!==ie)return Ae(e,0===e.avail_out?he:oe);const s=r.last_flush;if(r.last_flush=t,0!==r.pending){if(Le(e),0===e.avail_out)return r.last_flush=-1,ae}else if(0===e.avail_in&&Ce(t)<=Ce(s)&&t!==ie)return Ae(e,he);if(r.status===xe&&0!==e.avail_in)return Ae(e,he);if(r.status===be&&0===r.wrap&&(r.status=we),r.status===be){let t=ve+(r.w_bits-8<<4)<<8,s=-1;if(s=r.strategy>=ue||r.level<2?0:r.level<6?1:6===r.level?2:3,t|=s<<6,0!==r.strstart&&(t|=32),t+=31-t%31,ke(r,t),0!==r.strstart&&(ke(r,e.adler>>>16),ke(r,65535&e.adler)),e.adler=1,r.status=we,Le(e),0!==r.pending)return r.last_flush=-1,ae}if(57===r.status)if(e.adler=0,Te(r,31),Te(r,139),Te(r,8),r.gzhead)Te(r,(r.gzhead.text?1:0)+(r.gzhead.hcrc?2:0)+(r.gzhead.extra?4:0)+(r.gzhead.name?8:0)+(r.gzhead.comment?16:0)),Te(r,255&r.gzhead.time),Te(r,r.gzhead.time>>8&255),Te(r,r.gzhead.time>>16&255),Te(r,r.gzhead.time>>24&255),Te(r,9===r.level?2:r.strategy>=ue||r.level<2?4:0),Te(r,255&r.gzhead.os),r.gzhead.extra&&r.gzhead.extra.length&&(Te(r,255&r.gzhead.extra.length),Te(r,r.gzhead.extra.length>>8&255)),r.gzhead.hcrc&&(e.adler=q(e.adler,r.pending_buf,r.pending,0)),r.gzindex=0,r.status=69;else if(Te(r,0),Te(r,0),Te(r,0),Te(r,0),Te(r,0),Te(r,9===r.level?2:r.strategy>=ue||r.level<2?4:0),Te(r,3),r.status=we,Le(e),0!==r.pending)return r.last_flush=-1,ae;if(69===r.status){if(r.gzhead.extra){let t=r.pending,s=(65535&r.gzhead.extra.length)-r.gzindex;for(;r.pending+s>r.pending_buf_size;){let a=r.pending_buf_size-r.pending;if(r.pending_buf.set(r.gzhead.extra.subarray(r.gzindex,r.gzindex+a),r.pending),r.pending=r.pending_buf_size,r.gzhead.hcrc&&r.pending>t&&(e.adler=q(e.adler,r.pending_buf,r.pending-t,t)),r.gzindex+=a,Le(e),0!==r.pending)return r.last_flush=-1,ae;t=0,s-=a}let a=new Uint8Array(r.gzhead.extra);r.pending_buf.set(a.subarray(r.gzindex,r.gzindex+s),r.pending),r.pending+=s,r.gzhead.hcrc&&r.pending>t&&(e.adler=q(e.adler,r.pending_buf,r.pending-t,t)),r.gzindex=0}r.status=73}if(73===r.status){if(r.gzhead.name){let t,s=r.pending;do{if(r.pending===r.pending_buf_size){if(r.gzhead.hcrc&&r.pending>s&&(e.adler=q(e.adler,r.pending_buf,r.pending-s,s)),Le(e),0!==r.pending)return r.last_flush=-1,ae;s=0}t=r.gzindexs&&(e.adler=q(e.adler,r.pending_buf,r.pending-s,s)),r.gzindex=0}r.status=91}if(91===r.status){if(r.gzhead.comment){let t,s=r.pending;do{if(r.pending===r.pending_buf_size){if(r.gzhead.hcrc&&r.pending>s&&(e.adler=q(e.adler,r.pending_buf,r.pending-s,s)),Le(e),0!==r.pending)return r.last_flush=-1,ae;s=0}t=r.gzindexs&&(e.adler=q(e.adler,r.pending_buf,r.pending-s,s))}r.status=103}if(103===r.status){if(r.gzhead.hcrc){if(r.pending+2>r.pending_buf_size&&(Le(e),0!==r.pending))return r.last_flush=-1,ae;Te(r,255&e.adler),Te(r,e.adler>>8&255),e.adler=0}if(r.status=we,Le(e),0!==r.pending)return r.last_flush=-1,ae}if(0!==e.avail_in||0!==r.lookahead||t!==ee&&r.status!==xe){let s=0===r.level?Fe(r,t):r.strategy===ue?((e,t)=>{let r;for(;;){if(0===e.lookahead&&(De(e),0===e.lookahead)){if(t===ee)return 1;break}if(e.match_length=0,r=Q(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++,r&&(Ee(e,!1),0===e.strm.avail_out))return 1}return e.insert=0,t===ie?(Ee(e,!0),0===e.strm.avail_out?3:4):e.sym_next&&(Ee(e,!1),0===e.strm.avail_out)?1:2})(r,t):r.strategy===fe?((e,t)=>{let r,s,a,n;const o=e.window;for(;;){if(e.lookahead<=_e){if(De(e),e.lookahead<=_e&&t===ee)return 1;if(0===e.lookahead)break}if(e.match_length=0,e.lookahead>=3&&e.strstart>0&&(a=e.strstart-1,s=o[a],s===o[++a]&&s===o[++a]&&s===o[++a])){n=e.strstart+_e;do{}while(s===o[++a]&&s===o[++a]&&s===o[++a]&&s===o[++a]&&s===o[++a]&&s===o[++a]&&s===o[++a]&&s===o[++a]&&ae.lookahead&&(e.match_length=e.lookahead)}if(e.match_length>=3?(r=Q(e,1,e.match_length-3),e.lookahead-=e.match_length,e.strstart+=e.match_length,e.match_length=0):(r=Q(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++),r&&(Ee(e,!1),0===e.strm.avail_out))return 1}return e.insert=0,t===ie?(Ee(e,!0),0===e.strm.avail_out?3:4):e.sym_next&&(Ee(e,!1),0===e.strm.avail_out)?1:2})(r,t):Be[r.level].func(r,t);if(3!==s&&4!==s||(r.status=xe),1===s||3===s)return 0===e.avail_out&&(r.last_flush=-1),ae;if(2===s&&(t===te?J(r):t!==se&&(K(r,0,0,!1),t===re&&(Se(r.head),0===r.lookahead&&(r.strstart=0,r.block_start=0,r.insert=0))),Le(e),0===e.avail_out))return r.last_flush=-1,ae}return t!==ie?ae:r.wrap<=0?ne:(2===r.wrap?(Te(r,255&e.adler),Te(r,e.adler>>8&255),Te(r,e.adler>>16&255),Te(r,e.adler>>24&255),Te(r,255&e.total_in),Te(r,e.total_in>>8&255),Te(r,e.total_in>>16&255),Te(r,e.total_in>>24&255)):(ke(r,e.adler>>>16),ke(r,65535&e.adler)),Le(e),r.wrap>0&&(r.wrap=-r.wrap),0!==r.pending?ae:ne)},deflateEnd:e=>{if(Ue(e))return oe;const t=e.state.status;return e.state=null,t===we?Ae(e,le):ae},deflateSetDictionary:(e,t)=>{let r=t.length;if(Ue(e))return oe;const s=e.state,a=s.wrap;if(2===a||1===a&&s.status!==be||s.lookahead)return oe;if(1===a&&(e.adler=H(e.adler,t,r,0)),s.wrap=0,r>=s.w_size){0===a&&(Se(s.head),s.strstart=0,s.block_start=0,s.insert=0);let e=new Uint8Array(s.w_size);e.set(t.subarray(r-s.w_size,r),0),t=e,r=s.w_size}const n=e.avail_in,o=e.next_in,l=e.input;for(e.avail_in=r,e.next_in=0,e.input=t,De(s);s.lookahead>=3;){let e=s.strstart,t=s.lookahead-2;do{s.ins_h=ze(s,s.ins_h,s.window[e+3-1]),s.prev[e&s.w_mask]=s.head[s.ins_h],s.head[s.ins_h]=e,e++}while(--t);s.strstart=e,s.lookahead=2,De(s)}return s.strstart+=s.lookahead,s.block_start=s.strstart,s.insert=s.lookahead,s.lookahead=0,s.match_length=s.prev_length=2,s.match_available=0,e.next_in=o,e.input=l,e.avail_in=n,s.wrap=a,ae},deflateInfo:"pako deflate (from Nodeca project)"};const qe=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);var Ye={assign:function(e){const t=Array.prototype.slice.call(arguments,1);for(;t.length;){const r=t.shift();if(r){if("object"!=typeof r)throw new TypeError(r+"must be non-object");for(const t in r)qe(r,t)&&(e[t]=r[t])}}return e},flattenChunks:e=>{let t=0;for(let r=0,s=e.length;r=252?6:e>=248?5:e>=240?4:e>=224?3:e>=192?2:1;Xe[254]=Xe[254]=1;var Ke={string2buf:e=>{if("function"==typeof TextEncoder&&TextEncoder.prototype.encode)return(new TextEncoder).encode(e);let t,r,s,a,n,o=e.length,l=0;for(a=0;a>>6,t[n++]=128|63&r):r<65536?(t[n++]=224|r>>>12,t[n++]=128|r>>>6&63,t[n++]=128|63&r):(t[n++]=240|r>>>18,t[n++]=128|r>>>12&63,t[n++]=128|r>>>6&63,t[n++]=128|63&r);return t},buf2string:(e,t)=>{const r=t||e.length;if("function"==typeof TextDecoder&&TextDecoder.prototype.decode)return(new TextDecoder).decode(e.subarray(0,t));let s,a;const n=new Array(2*r);for(a=0,s=0;s4)n[a++]=65533,s+=o-1;else{for(t&=2===o?31:3===o?15:7;o>1&&s1?n[a++]=65533:t<65536?n[a++]=t:(t-=65536,n[a++]=55296|t>>10&1023,n[a++]=56320|1023&t)}}return((e,t)=>{if(t<65534&&e.subarray&&Ze)return String.fromCharCode.apply(null,e.length===t?e:e.subarray(0,t));let r="";for(let s=0;s{(t=t||e.length)>e.length&&(t=e.length);let r=t-1;for(;r>=0&&128==(192&e[r]);)r--;return r<0||0===r?t:r+Xe[e[r]]>t?r:t}};var $e=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0};const Qe=Object.prototype.toString,{Z_NO_FLUSH:Je,Z_SYNC_FLUSH:et,Z_FULL_FLUSH:tt,Z_FINISH:rt,Z_OK:it,Z_STREAM_END:st,Z_DEFAULT_COMPRESSION:at,Z_DEFAULT_STRATEGY:nt,Z_DEFLATED:ot}=Z;function lt(e){this.options=Ye.assign({level:at,method:ot,chunkSize:16384,windowBits:15,memLevel:8,strategy:nt},e||{});let t=this.options;t.raw&&t.windowBits>0?t.windowBits=-t.windowBits:t.gzip&&t.windowBits>0&&t.windowBits<16&&(t.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new $e,this.strm.avail_out=0;let r=We.deflateInit2(this.strm,t.level,t.method,t.windowBits,t.memLevel,t.strategy);if(r!==it)throw new Error(Y[r]);if(t.header&&We.deflateSetHeader(this.strm,t.header),t.dictionary){let e;if(e="string"==typeof t.dictionary?Ke.string2buf(t.dictionary):"[object ArrayBuffer]"===Qe.call(t.dictionary)?new Uint8Array(t.dictionary):t.dictionary,r=We.deflateSetDictionary(this.strm,e),r!==it)throw new Error(Y[r]);this._dict_set=!0}}function ht(e,t){const r=new lt(t);if(r.push(e,!0),r.err)throw r.msg||Y[r.err];return r.result}lt.prototype.push=function(e,t){const r=this.strm,s=this.options.chunkSize;let a,n;if(this.ended)return!1;for(n=t===~~t?t:!0===t?rt:Je,"string"==typeof e?r.input=Ke.string2buf(e):"[object ArrayBuffer]"===Qe.call(e)?r.input=new Uint8Array(e):r.input=e,r.next_in=0,r.avail_in=r.input.length;;)if(0===r.avail_out&&(r.output=new Uint8Array(s),r.next_out=0,r.avail_out=s),(n===et||n===tt)&&r.avail_out<=6)this.onData(r.output.subarray(0,r.next_out)),r.avail_out=0;else{if(a=We.deflate(r,n),a===st)return r.next_out>0&&this.onData(r.output.subarray(0,r.next_out)),a=We.deflateEnd(this.strm),this.onEnd(a),this.ended=!0,a===it;if(0!==r.avail_out){if(n>0&&r.next_out>0)this.onData(r.output.subarray(0,r.next_out)),r.avail_out=0;else if(0===r.avail_in)break}else this.onData(r.output)}return!0},lt.prototype.onData=function(e){this.chunks.push(e)},lt.prototype.onEnd=function(e){e===it&&(this.result=Ye.flattenChunks(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg};var ct={Deflate:lt,deflate:ht,deflateRaw:function(e,t){return(t=t||{}).raw=!0,ht(e,t)},gzip:function(e,t){return(t=t||{}).gzip=!0,ht(e,t)},constants:Z};const dt=16209;var ut=function(e,t){let r,s,a,n,o,l,h,c,u,f,p,g,v,_,y,b,w,x,A,C,S,M,z,L;const E=e.state;r=e.next_in,z=e.input,s=r+(e.avail_in-5),a=e.next_out,L=e.output,n=a-(t-e.avail_out),o=a+(e.avail_out-257),l=E.dmax,h=E.wsize,c=E.whave,u=E.wnext,f=E.window,p=E.hold,g=E.bits,v=E.lencode,_=E.distcode,y=(1<>>24,p>>>=x,g-=x,x=w>>>16&255,0===x)L[a++]=65535&w;else{if(!(16&x)){if(0==(64&x)){w=v[(65535&w)+(p&(1<>>=x,g-=x),g<15&&(p+=z[r++]<>>24,p>>>=x,g-=x,x=w>>>16&255,!(16&x)){if(0==(64&x)){w=_[(65535&w)+(p&(1<l){e.msg="invalid distance too far back",E.mode=dt;break e}if(p>>>=x,g-=x,x=a-n,C>x){if(x=C-x,x>c&&E.sane){e.msg="invalid distance too far back",E.mode=dt;break e}if(S=0,M=f,0===u){if(S+=h-x,x2;)L[a++]=M[S++],L[a++]=M[S++],L[a++]=M[S++],A-=3;A&&(L[a++]=M[S++],A>1&&(L[a++]=M[S++]))}else{S=a-C;do{L[a++]=L[S++],L[a++]=L[S++],L[a++]=L[S++],A-=3}while(A>2);A&&(L[a++]=L[S++],A>1&&(L[a++]=L[S++]))}break}}break}}while(r>3,r-=A,g-=A<<3,p&=(1<{const h=l.bits;let c,u,f,p,g,v,_=0,y=0,b=0,w=0,x=0,A=0,C=0,S=0,M=0,z=0,L=null;const E=new Uint16Array(16),T=new Uint16Array(16);let k,I,O,D=null;for(_=0;_<=ft;_++)E[_]=0;for(y=0;y=1&&0===E[w];w--);if(x>w&&(x=w),0===w)return a[n++]=20971520,a[n++]=20971520,l.bits=1,0;for(b=1;b0&&(0===e||1!==w))return-1;for(T[1]=0,_=1;_852||2===e&&M>592)return 1;for(;;){k=_-C,o[y]+1=v?(I=D[o[y]-v],O=L[o[y]-v]):(I=96,O=0),c=1<<_-C,u=1<>C)+u]=k<<24|I<<16|O|0}while(0!==u);for(c=1<<_-1;z&c;)c>>=1;if(0!==c?(z&=c-1,z+=c):z=0,y++,0==--E[_]){if(_===w)break;_=t[r+o[y]]}if(_>x&&(z&p)!==f){for(0===C&&(C=x),g+=b,A=_-C,S=1<852||2===e&&M>592)return 1;f=z&p,a[f]=x<<24|A<<16|g-n|0}}return 0!==z&&(a[g+z]=_-C<<24|64<<16|0),l.bits=x,0};const{Z_FINISH:yt,Z_BLOCK:bt,Z_TREES:wt,Z_OK:xt,Z_STREAM_END:At,Z_NEED_DICT:Ct,Z_STREAM_ERROR:St,Z_DATA_ERROR:Mt,Z_MEM_ERROR:zt,Z_BUF_ERROR:Lt,Z_DEFLATED:Et}=Z,Tt=16180,kt=16190,It=16191,Ot=16192,Dt=16194,Ft=16199,Rt=16200,Pt=16206,Gt=16209,Bt=e=>(e>>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24);function Nt(){this.strm=null,this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new Uint16Array(320),this.work=new Uint16Array(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}const Ut=e=>{if(!e)return 1;const t=e.state;return!t||t.strm!==e||t.mode16211?1:0},Vt=e=>{if(Ut(e))return St;const t=e.state;return e.total_in=e.total_out=t.total=0,e.msg="",t.wrap&&(e.adler=1&t.wrap),t.mode=Tt,t.last=0,t.havedict=0,t.flags=-1,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new Int32Array(852),t.distcode=t.distdyn=new Int32Array(592),t.sane=1,t.back=-1,xt},jt=e=>{if(Ut(e))return St;const t=e.state;return t.wsize=0,t.whave=0,t.wnext=0,Vt(e)},Ht=(e,t)=>{let r;if(Ut(e))return St;const s=e.state;return t<0?(r=0,t=-t):(r=5+(t>>4),t<48&&(t&=15)),t&&(t<8||t>15)?St:(null!==s.window&&s.wbits!==t&&(s.window=null),s.wrap=r,s.wbits=t,jt(e))},Wt=(e,t)=>{if(!e)return St;const r=new Nt;e.state=r,r.strm=e,r.window=null,r.mode=Tt;const s=Ht(e,t);return s!==xt&&(e.state=null),s};let qt,Yt,Zt=!0;const Xt=e=>{if(Zt){qt=new Int32Array(512),Yt=new Int32Array(32);let t=0;for(;t<144;)e.lens[t++]=8;for(;t<256;)e.lens[t++]=9;for(;t<280;)e.lens[t++]=7;for(;t<288;)e.lens[t++]=8;for(_t(1,e.lens,0,288,qt,0,e.work,{bits:9}),t=0;t<32;)e.lens[t++]=5;_t(2,e.lens,0,32,Yt,0,e.work,{bits:5}),Zt=!1}e.lencode=qt,e.lenbits=9,e.distcode=Yt,e.distbits=5},Kt=(e,t,r,s)=>{let a;const n=e.state;return null===n.window&&(n.wsize=1<=n.wsize?(n.window.set(t.subarray(r-n.wsize,r),0),n.wnext=0,n.whave=n.wsize):(a=n.wsize-n.wnext,a>s&&(a=s),n.window.set(t.subarray(r-s,r-s+a),n.wnext),(s-=a)?(n.window.set(t.subarray(r-s,r),0),n.wnext=s,n.whave=n.wsize):(n.wnext+=a,n.wnext===n.wsize&&(n.wnext=0),n.whaveWt(e,15),inflateInit2:Wt,inflate:(e,t)=>{let r,s,a,n,o,l,h,c,u,f,p,g,v,_,y,b,w,x,A,C,S,M,z=0;const L=new Uint8Array(4);let E,T;const k=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);if(Ut(e)||!e.output||!e.input&&0!==e.avail_in)return St;r=e.state,r.mode===It&&(r.mode=Ot),o=e.next_out,a=e.output,h=e.avail_out,n=e.next_in,s=e.input,l=e.avail_in,c=r.hold,u=r.bits,f=l,p=h,M=xt;e:for(;;)switch(r.mode){case Tt:if(0===r.wrap){r.mode=Ot;break}for(;u<16;){if(0===l)break e;l--,c+=s[n++]<>>8&255,r.check=q(r.check,L,2,0),c=0,u=0,r.mode=16181;break}if(r.head&&(r.head.done=!1),!(1&r.wrap)||(((255&c)<<8)+(c>>8))%31){e.msg="incorrect header check",r.mode=Gt;break}if((15&c)!==Et){e.msg="unknown compression method",r.mode=Gt;break}if(c>>>=4,u-=4,S=8+(15&c),0===r.wbits&&(r.wbits=S),S>15||S>r.wbits){e.msg="invalid window size",r.mode=Gt;break}r.dmax=1<>8&1),512&r.flags&&4&r.wrap&&(L[0]=255&c,L[1]=c>>>8&255,r.check=q(r.check,L,2,0)),c=0,u=0,r.mode=16182;case 16182:for(;u<32;){if(0===l)break e;l--,c+=s[n++]<>>8&255,L[2]=c>>>16&255,L[3]=c>>>24&255,r.check=q(r.check,L,4,0)),c=0,u=0,r.mode=16183;case 16183:for(;u<16;){if(0===l)break e;l--,c+=s[n++]<>8),512&r.flags&&4&r.wrap&&(L[0]=255&c,L[1]=c>>>8&255,r.check=q(r.check,L,2,0)),c=0,u=0,r.mode=16184;case 16184:if(1024&r.flags){for(;u<16;){if(0===l)break e;l--,c+=s[n++]<>>8&255,r.check=q(r.check,L,2,0)),c=0,u=0}else r.head&&(r.head.extra=null);r.mode=16185;case 16185:if(1024&r.flags&&(g=r.length,g>l&&(g=l),g&&(r.head&&(S=r.head.extra_len-r.length,r.head.extra||(r.head.extra=new Uint8Array(r.head.extra_len)),r.head.extra.set(s.subarray(n,n+g),S)),512&r.flags&&4&r.wrap&&(r.check=q(r.check,s,g,n)),l-=g,n+=g,r.length-=g),r.length))break e;r.length=0,r.mode=16186;case 16186:if(2048&r.flags){if(0===l)break e;g=0;do{S=s[n+g++],r.head&&S&&r.length<65536&&(r.head.name+=String.fromCharCode(S))}while(S&&g>9&1,r.head.done=!0),e.adler=r.check=0,r.mode=It;break;case 16189:for(;u<32;){if(0===l)break e;l--,c+=s[n++]<>>=7&u,u-=7&u,r.mode=Pt;break}for(;u<3;){if(0===l)break e;l--,c+=s[n++]<>>=1,u-=1,3&c){case 0:r.mode=16193;break;case 1:if(Xt(r),r.mode=Ft,t===wt){c>>>=2,u-=2;break e}break;case 2:r.mode=16196;break;case 3:e.msg="invalid block type",r.mode=Gt}c>>>=2,u-=2;break;case 16193:for(c>>>=7&u,u-=7&u;u<32;){if(0===l)break e;l--,c+=s[n++]<>>16^65535)){e.msg="invalid stored block lengths",r.mode=Gt;break}if(r.length=65535&c,c=0,u=0,r.mode=Dt,t===wt)break e;case Dt:r.mode=16195;case 16195:if(g=r.length,g){if(g>l&&(g=l),g>h&&(g=h),0===g)break e;a.set(s.subarray(n,n+g),o),l-=g,n+=g,h-=g,o+=g,r.length-=g;break}r.mode=It;break;case 16196:for(;u<14;){if(0===l)break e;l--,c+=s[n++]<>>=5,u-=5,r.ndist=1+(31&c),c>>>=5,u-=5,r.ncode=4+(15&c),c>>>=4,u-=4,r.nlen>286||r.ndist>30){e.msg="too many length or distance symbols",r.mode=Gt;break}r.have=0,r.mode=16197;case 16197:for(;r.have>>=3,u-=3}for(;r.have<19;)r.lens[k[r.have++]]=0;if(r.lencode=r.lendyn,r.lenbits=7,E={bits:r.lenbits},M=_t(0,r.lens,0,19,r.lencode,0,r.work,E),r.lenbits=E.bits,M){e.msg="invalid code lengths set",r.mode=Gt;break}r.have=0,r.mode=16198;case 16198:for(;r.have>>24,b=z>>>16&255,w=65535&z,!(y<=u);){if(0===l)break e;l--,c+=s[n++]<>>=y,u-=y,r.lens[r.have++]=w;else{if(16===w){for(T=y+2;u>>=y,u-=y,0===r.have){e.msg="invalid bit length repeat",r.mode=Gt;break}S=r.lens[r.have-1],g=3+(3&c),c>>>=2,u-=2}else if(17===w){for(T=y+3;u>>=y,u-=y,S=0,g=3+(7&c),c>>>=3,u-=3}else{for(T=y+7;u>>=y,u-=y,S=0,g=11+(127&c),c>>>=7,u-=7}if(r.have+g>r.nlen+r.ndist){e.msg="invalid bit length repeat",r.mode=Gt;break}for(;g--;)r.lens[r.have++]=S}}if(r.mode===Gt)break;if(0===r.lens[256]){e.msg="invalid code -- missing end-of-block",r.mode=Gt;break}if(r.lenbits=9,E={bits:r.lenbits},M=_t(1,r.lens,0,r.nlen,r.lencode,0,r.work,E),r.lenbits=E.bits,M){e.msg="invalid literal/lengths set",r.mode=Gt;break}if(r.distbits=6,r.distcode=r.distdyn,E={bits:r.distbits},M=_t(2,r.lens,r.nlen,r.ndist,r.distcode,0,r.work,E),r.distbits=E.bits,M){e.msg="invalid distances set",r.mode=Gt;break}if(r.mode=Ft,t===wt)break e;case Ft:r.mode=Rt;case Rt:if(l>=6&&h>=258){e.next_out=o,e.avail_out=h,e.next_in=n,e.avail_in=l,r.hold=c,r.bits=u,ut(e,p),o=e.next_out,a=e.output,h=e.avail_out,n=e.next_in,s=e.input,l=e.avail_in,c=r.hold,u=r.bits,r.mode===It&&(r.back=-1);break}for(r.back=0;z=r.lencode[c&(1<>>24,b=z>>>16&255,w=65535&z,!(y<=u);){if(0===l)break e;l--,c+=s[n++]<>x)],y=z>>>24,b=z>>>16&255,w=65535&z,!(x+y<=u);){if(0===l)break e;l--,c+=s[n++]<>>=x,u-=x,r.back+=x}if(c>>>=y,u-=y,r.back+=y,r.length=w,0===b){r.mode=16205;break}if(32&b){r.back=-1,r.mode=It;break}if(64&b){e.msg="invalid literal/length code",r.mode=Gt;break}r.extra=15&b,r.mode=16201;case 16201:if(r.extra){for(T=r.extra;u>>=r.extra,u-=r.extra,r.back+=r.extra}r.was=r.length,r.mode=16202;case 16202:for(;z=r.distcode[c&(1<>>24,b=z>>>16&255,w=65535&z,!(y<=u);){if(0===l)break e;l--,c+=s[n++]<>x)],y=z>>>24,b=z>>>16&255,w=65535&z,!(x+y<=u);){if(0===l)break e;l--,c+=s[n++]<>>=x,u-=x,r.back+=x}if(c>>>=y,u-=y,r.back+=y,64&b){e.msg="invalid distance code",r.mode=Gt;break}r.offset=w,r.extra=15&b,r.mode=16203;case 16203:if(r.extra){for(T=r.extra;u>>=r.extra,u-=r.extra,r.back+=r.extra}if(r.offset>r.dmax){e.msg="invalid distance too far back",r.mode=Gt;break}r.mode=16204;case 16204:if(0===h)break e;if(g=p-h,r.offset>g){if(g=r.offset-g,g>r.whave&&r.sane){e.msg="invalid distance too far back",r.mode=Gt;break}g>r.wnext?(g-=r.wnext,v=r.wsize-g):v=r.wnext-g,g>r.length&&(g=r.length),_=r.window}else _=a,v=o-r.offset,g=r.length;g>h&&(g=h),h-=g,r.length-=g;do{a[o++]=_[v++]}while(--g);0===r.length&&(r.mode=Rt);break;case 16205:if(0===h)break e;a[o++]=r.length,h--,r.mode=Rt;break;case Pt:if(r.wrap){for(;u<32;){if(0===l)break e;l--,c|=s[n++]<{if(Ut(e))return St;let t=e.state;return t.window&&(t.window=null),e.state=null,xt},inflateGetHeader:(e,t)=>{if(Ut(e))return St;const r=e.state;return 0==(2&r.wrap)?St:(r.head=t,t.done=!1,xt)},inflateSetDictionary:(e,t)=>{const r=t.length;let s,a,n;return Ut(e)?St:(s=e.state,0!==s.wrap&&s.mode!==kt?St:s.mode===kt&&(a=1,a=H(a,t,r,0),a!==s.check)?Mt:(n=Kt(e,t,r,r),n?(s.mode=16210,zt):(s.havedict=1,xt)))},inflateInfo:"pako inflate (from Nodeca project)"};var Qt=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1};const Jt=Object.prototype.toString,{Z_NO_FLUSH:er,Z_FINISH:tr,Z_OK:rr,Z_STREAM_END:ir,Z_NEED_DICT:sr,Z_STREAM_ERROR:ar,Z_DATA_ERROR:nr,Z_MEM_ERROR:or}=Z;function lr(e){this.options=Ye.assign({chunkSize:65536,windowBits:15,to:""},e||{});const t=this.options;t.raw&&t.windowBits>=0&&t.windowBits<16&&(t.windowBits=-t.windowBits,0===t.windowBits&&(t.windowBits=-15)),!(t.windowBits>=0&&t.windowBits<16)||e&&e.windowBits||(t.windowBits+=32),t.windowBits>15&&t.windowBits<48&&0==(15&t.windowBits)&&(t.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new $e,this.strm.avail_out=0;let r=$t.inflateInit2(this.strm,t.windowBits);if(r!==rr)throw new Error(Y[r]);if(this.header=new Qt,$t.inflateGetHeader(this.strm,this.header),t.dictionary&&("string"==typeof t.dictionary?t.dictionary=Ke.string2buf(t.dictionary):"[object ArrayBuffer]"===Jt.call(t.dictionary)&&(t.dictionary=new Uint8Array(t.dictionary)),t.raw&&(r=$t.inflateSetDictionary(this.strm,t.dictionary),r!==rr)))throw new Error(Y[r])}function hr(e,t){const r=new lr(t);if(r.push(e),r.err)throw r.msg||Y[r.err];return r.result}lr.prototype.push=function(e,t){const r=this.strm,s=this.options.chunkSize,a=this.options.dictionary;let n,o,l;if(this.ended)return!1;for(o=t===~~t?t:!0===t?tr:er,"[object ArrayBuffer]"===Jt.call(e)?r.input=new Uint8Array(e):r.input=e,r.next_in=0,r.avail_in=r.input.length;;){for(0===r.avail_out&&(r.output=new Uint8Array(s),r.next_out=0,r.avail_out=s),n=$t.inflate(r,o),n===sr&&a&&(n=$t.inflateSetDictionary(r,a),n===rr?n=$t.inflate(r,o):n===nr&&(n=sr));r.avail_in>0&&n===ir&&r.state.wrap>0&&0!==e[r.next_in];)$t.inflateReset(r),n=$t.inflate(r,o);switch(n){case ar:case nr:case sr:case or:return this.onEnd(n),this.ended=!0,!1}if(l=r.avail_out,r.next_out&&(0===r.avail_out||n===ir))if("string"===this.options.to){let e=Ke.utf8border(r.output,r.next_out),t=r.next_out-e,a=Ke.buf2string(r.output,e);r.next_out=t,r.avail_out=s-t,t&&r.output.set(r.output.subarray(e,e+t),0),this.onData(a)}else this.onData(r.output.length===r.next_out?r.output:r.output.subarray(0,r.next_out));if(n!==rr||0!==l){if(n===ir)return n=$t.inflateEnd(this.strm),this.onEnd(n),this.ended=!0,!0;if(0===r.avail_in)break}}return!0},lr.prototype.onData=function(e){this.chunks.push(e)},lr.prototype.onEnd=function(e){e===rr&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=Ye.flattenChunks(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg};var cr={Inflate:lr,inflate:hr,inflateRaw:function(e,t){return(t=t||{}).raw=!0,hr(e,t)},ungzip:hr,constants:Z};const{Deflate:dr,deflate:ur,deflateRaw:fr,gzip:pr}=ct,{Inflate:mr,inflate:gr,inflateRaw:vr,ungzip:_r}=cr;var yr=dr,br=ur,wr=fr,xr=pr,Ar=mr,Cr=gr,Sr=vr,Mr=_r,zr=Z,Lr={Deflate:dr,deflate:ur,deflateRaw:fr,gzip:pr,Inflate:mr,inflate:gr,inflateRaw:vr,ungzip:_r,constants:Z}}},__webpack_module_cache__={};function __webpack_require__(e){var t=__webpack_module_cache__[e];if(void 0!==t)return t.exports;var r=__webpack_module_cache__[e]={exports:{}};return __webpack_modules__[e].call(r.exports,r,r.exports,__webpack_require__),r.exports}__webpack_require__.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return __webpack_require__.d(t,{a:t}),t},__webpack_require__.d=(e,t)=>{for(var r in t)__webpack_require__.o(t,r)&&!__webpack_require__.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},__webpack_require__.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),__webpack_require__.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},__webpack_require__(3637),__webpack_require__(7882);var __webpack_exports__=__webpack_require__(6279);return __webpack_exports__})())); diff --git a/frontend/public/assets/3Dmol-min.js.LICENSE.txt b/frontend/public/assets/3Dmol-min.js.LICENSE.txt new file mode 100644 index 00000000..8bb033ce --- /dev/null +++ b/frontend/public/assets/3Dmol-min.js.LICENSE.txt @@ -0,0 +1,89 @@ +3Dmol.js incorporates code from GLmol, Three.js, and jQuery and +is licensed under a BSD-3-Clause license. + +* 3Dmol.js + Copyright (c) 2014, University of Pittsburgh and contributors + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +* GLmol + GLmol - Molecular Viewer on WebGL/Javascript (0.47) + (C) Copyright 2011-2012, biochem_fan + License: dual license of MIT or LGPL3 + + Contributors: + Robert Hanson for parseXYZ, deferred instantiation + + + +* Three.js + https://github.com/mrdoob/three.js + + Copyright (c) 2010-2012 three.js Authors. All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +* jQuery + http://jquery.org/ + + Copyright (c) 2011 John Resig + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/frontend/public/assets/Changelog.md b/frontend/public/assets/Changelog.md new file mode 100644 index 00000000..7fedc232 --- /dev/null +++ b/frontend/public/assets/Changelog.md @@ -0,0 +1,71 @@ +# Changelog # +## March 19, 2024 ## +* Also store selected options to recall them when re-opening the web page +* Ensure there is always a default Foundry folder selected +* Set default Foundry folder to `/Global/Foundry Training and Resources/Example Data/Aviation Ontology` as this should be readable by everybody +* Added support for folder navigationi n Foundry dialog + +## March 18, 2024 ## +* Added option to hide the generated code +* Added option to attempt automatically fixing runtime errors +* Added a button for printing the chat history. This should also allow for conveninet pdf export through your browser's print dialog. + +## March 06, 2024 ## +* Added this changelog to the documentation section +* Produced graphs and images are resizable now via a handle at their lower right corner + +## March 04, 2024 ## +* Added support for [`py3dmol`](https://3dmol.csb.pitt.edu/doc/index.html) plots: Just upload a `.pdb`, `.xyz` `.sdf`, `.mol`, or `.cube` file and request a plot +* Rework of internal handling of different result types + +## February 29, 2024 ## +* Added [`bio`](https://github.com/ialbert/bio) and [`docx`](https://pypi.org/project/docx/) to the list of preinstalled Python packages +* Added kernel control buttons to the sidebar +* Added command and button to interrupt code execution +* Visual cleanup of the sidebar +* More resilience against errors and failures in the internal infrastructure parts +* More consistently monitor last access to the individual kernels and clean up their resources and storage regularly + +## February 26, 2024 ## +* Added a plugin system that allows system admins to provide additional, specialized functions to be called by the generated code + +## February 17, 2024 ## +* Added notification if the app is open in more than one browser tab (which would have led to inconsistent result output). +* Extensive refactoring and simplification of the internal infrastructure +* Made special commands `clear` and `reset` case-insensitive. + +## February 11, 2024 ## +* Switched to vector graphics output for plots. This enables support for non-Western typefaces and improves visuali quality of the plots. +* Added support for Antropic Claude language models in addition to OpenAI GPT + +## January 18, 2024 ## +* Added [`XlsxWriter`](https://github.com/jmcnamara/XlsxWriter) to the list of preinstalled Python packages +* Added support for generating word clouds +* Added Disclaimer popup +* Added demo video + +## November 09, 2023 ## +* Improve isolation of kernels to prevent potential cross-talk between user sessions + +## October 24, 2023 ## +* Improved chat history sent to the LLM: + * more consistent truncation to avoid running over the context length limit too quickly + * include a sneak preview into uploaded files to allow for the LLM to produce better-suited code + +## October 17, 2023 ## +* Allow navigating back to previous prompts with `Alt + Up/Down` +* Support downloading data assets from Palantir Foundry via the [`foundry-dev-tools`](https://github.com/emdgroup/foundry-dev-tools) library + +## September 18, 2023 ## +* Removed option to set the API key in the frontend +* Added [`rdkit`](https://www.rdkit.org), [`scikit-learn`](https://scikit-learn.org/stable/), and [`scipy`](https://scipy.org) to the list of preinstalled Python packages +* Allowed (de)activating the automatic generation of commands to install missing packages + +## August 04, 2023 ## +* Use one kernel per individual user's session +* Added support for `rdkit`-generated molecule structure plots (`png` iamges sent as `execute_result`) +* Several improvements for stability and resilience + +## July 24, 2023 +* Added support for markdown table output +* Add a sneak-peek into specific file types to allow for the LLM to generate more suitable code to deal with the file content diff --git a/frontend/public/assets/Disclaimer.md b/frontend/public/assets/Disclaimer.md new file mode 100644 index 00000000..6ad30f13 --- /dev/null +++ b/frontend/public/assets/Disclaimer.md @@ -0,0 +1,9 @@ +# Data Analysis Using Natural Language Input + +This is a tool for generating executable code from natural language input. Among other applications, this can be used for rapid data analysis e.g., for creating simple statistics, plots, but also more advanced calculations such as regressions. + +To do this, you can specify in natural language how you want to analyze the data. The underlying GPT API creates the corresponding code that is then executed. **You can either upload a CSV or XLSX file or connect a data asset from Palantir Foundry using its RID or folder path.** Please note that you need to at least have read authorization for the use case in Foundry that contains the data to be analyzed. The tool cannot write data to Foundry and does not send or store any data beyond your interactive session. + +**The tool is experimental and there is no guarantee that the analysis results are correct.** Be as precise as possible when entering the analysis request and specify which variables are to be analyzed and how. You can check the correctness of the analysis by examining the executed code. + +For some ideas on what is possible with this tool, see the demo video that is available through the sidebar on the left or by clicking the button below. diff --git a/frontend/public/assets/GPT Code UI.mp4 b/frontend/public/assets/GPT Code UI.mp4 new file mode 100644 index 00000000..2e986caf Binary files /dev/null and b/frontend/public/assets/GPT Code UI.mp4 differ diff --git a/frontend/src/App.css b/frontend/src/App.css index ac6a5149..d32a2ecb 100644 --- a/frontend/src/App.css +++ b/frontend/src/App.css @@ -16,4 +16,8 @@ flex: 1; overflow: hidden; height: 100vh; -} \ No newline at end of file +} + +.sidebar { + background-color: rgb(185, 205, 215); +} diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 3212d273..a530776d 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -1,10 +1,23 @@ import "./App.css"; import Input from "./components/Input"; -import Sidebar from "./components/Sidebar"; +import Logo from "./components/Logo" +import Documentation from "./components/Documentation"; +import Kernel from "./components/Kernel"; +import Settings from "./components/Settings"; import Chat, { WaitingStates } from "./components/Chat"; -import React, { useState, useEffect } from "react"; +import React, { useState, useEffect, useRef, useCallback } from "react"; +import Stack from '@mui/material/Stack'; +import Button from '@mui/material/Button'; +import Dialog from '@mui/material/Dialog'; +import DialogActions from '@mui/material/DialogActions'; +import DialogContent from '@mui/material/DialogContent'; +import DialogContentText from '@mui/material/DialogContentText'; +import DialogTitle from '@mui/material/DialogTitle'; import Config from "./config"; -import { useLocalStorage } from "usehooks-ts"; +import useLocalStorage from "use-local-storage"; +import { v4 as uuidv4 } from 'uuid'; +import PrintIcon from '@mui/icons-material/Print'; +import { useReactToPrint } from 'react-to-print'; export type MessageDict = { text: string; @@ -12,10 +25,35 @@ export type MessageDict = { type: string; }; +let tabID = 'undefined'; + function App() { - const COMMANDS = ["reset"]; + // map from user command to kernel api endpoint, info message, etc. + const COMMANDS = { + "reset": { + endpoint: `${Config.API_ADDRESS}/restart`, + status: WaitingStates.WaitingForKernel, + message: "Restarting the kernel.", + onSuccess: () => {} + }, + "clear": { + endpoint: `${Config.WEB_ADDRESS}/clear_history`, + status: WaitingStates.Idle, + message: "Clearing chat history.", + onSuccess: () => { setMessages(DEFAULT_MESSAGES); } + }, + "stop": { + endpoint: `${Config.API_ADDRESS}/interrupt`, + status: WaitingStates.WaitingForKernel, + message: "Interrupting code execution.", + onSuccess: () => {} + }, + }; - let [MODELS, setModels] = useState([{displayName: "GPT-3.5", name: "gpt-3.5-turbo"}]); + const [showCode, setShowCode] = useLocalStorage("showCode", false); + const [autoFix, setAutoFix] = useLocalStorage("autoFix", 0); + const [autoFixCountdown, setAutoFixCountdown] = useState(autoFix); + const [MODELS, setModels] = useState<{displayName: string, name: string}[]>([]); useEffect(() => { const getModels = async () => { @@ -25,37 +63,59 @@ function App() { setModels(json); } catch (e) { console.error(e); - }; + } }; getModels(); }, []); - let [selectedModel, setSelectedModel] = useLocalStorage( - "model", - MODELS[0].name - ); + const [selectedModel, setSelectedModel] = useLocalStorage("model", "gpt-3.5-turbo"); + const [toggledOptions, setToggledOptions] = useLocalStorage("options", ['svg', ]); + + const DEFAULT_MESSAGES = Array.from([ + { + text: `Hello! I am a GPT Code assistant. Ask me to do something for you! +Pro tip: you can upload a file and I'll be able to use it.`, + role: "documentation", + type: "message", + }, + { + text: `If I get stuck just type reset and I'll restart the kernel. +For interrupting a running program, please type stop. +In case you want to clear the conversation history, just type clear. +Use Alt+ and Alt+ to recall previous prompts.`, + role: "documentation", + type: "message", + }, + ]); - let [openAIKey, setOpenAIKey] = useLocalStorage("OpenAIKey", ""); + useEffect(() => { + tabID = uuidv4(); + }, []); - let [messages, setMessages] = useState>( - Array.from([ - { - text: "Hello! I'm a GPT Code assistant. Ask me to do something for you! Pro tip: you can upload a file and I'll be able to use it.", - role: "generator", - type: "message", - }, - { - text: "If I get stuck just type 'reset' and I'll restart the kernel.", - role: "generator", - type: "message", - }, - ]) - ); - let [waitingForSystem, setWaitingForSystem] = useState( - WaitingStates.Idle - ); - const chatScrollRef = React.useRef(null); + const [otherTabDetected, setOtherTabDetected] = useState(false); + + const continueSession = useCallback(() => { + const channel = new BroadcastChannel('cross-tab-communication'); + channel.addEventListener('message', (msg) => { + if (msg.data.type == 'new tab') { + setOtherTabDetected(msg.data.id != tabID); + } + }); + + channel.postMessage({ + type: 'new tab', + id: tabID, + }); + }, []); + + useEffect(() => { + continueSession(); + }, [continueSession]); + + const [messages, setMessages] = useState(DEFAULT_MESSAGES); + const [waitingForSystem, setWaitingForSystem] = useState(WaitingStates.Idle); + const chatScrollRef = useRef(null); const submitCode = async (code: string) => { fetch(`${Config.API_ADDRESS}/api`, { @@ -63,49 +123,47 @@ function App() { headers: { "Content-Type": "application/json", }, - body: JSON.stringify({ command: code }), + body: JSON.stringify({ command: code, options: toggledOptions }), }) .then(() => {}) .catch((error) => console.error("Error:", error)); }; const addMessage = (message: MessageDict) => { - setMessages((state: any) => { + setMessages((state: MessageDict[]) => { return [...state, message]; }); }; - const handleCommand = (command: string) => { - if (command == "reset") { - addMessage({ text: "Restarting the kernel.", type: "message", role: "system" }); - - fetch(`${Config.API_ADDRESS}/restart`, { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({}), - }) - .then(() => {}) - .catch((error) => console.error("Error:", error)); - } + const handleCommand = ({endpoint, message, status, onSuccess}: {endpoint:string, message: string, status: WaitingStates, onSuccess: () => void}) => { + addMessage({ text: message, type: "message", role: "system" }); + setWaitingForSystem(status); + fetch(endpoint, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({}), + }) + .then(onSuccess) + .catch((error) => console.error("Error:", error)); }; - const sendMessage = async (userInput: string) => { - try { - if (COMMANDS.includes(userInput)) { - handleCommand(userInput); - return; - } - - if (userInput.length == 0) { - return; - } - - addMessage({ text: userInput, type: "message", role: "user" }); + const handleUserInput = async (userInput: string) => { + if(userInput.toLowerCase() in COMMANDS) { + handleCommand(COMMANDS[userInput.toLowerCase() as keyof typeof COMMANDS]) + } else if (userInput.length > 0) { + setAutoFixCountdown(autoFix); + sendMessage(userInput, 'user'); setWaitingForSystem(WaitingStates.GeneratingCode); + } + } - const response = await fetch(`${Config.WEB_ADDRESS}/generate`, { + const sendMessage = async (userInput: string, role: string) => { + addMessage({ text: userInput, type: 'message', role: role }); + + try { + const response = await fetch(`${Config.WEB_ADDRESS}/generate`, { method: "POST", headers: { "Content-Type": "application/json", @@ -113,7 +171,6 @@ function App() { body: JSON.stringify({ prompt: userInput, model: selectedModel, - openAIKey: openAIKey, }), }); @@ -126,8 +183,8 @@ function App() { setWaitingForSystem(WaitingStates.Idle); return; } - - if (!!code) { + + if (code) { submitCode(code); setWaitingForSystem(WaitingStates.RunningCode); } else { @@ -141,49 +198,125 @@ function App() { } }; - async function getApiData() { - if(document.hidden){ - return; - } - - let response = await fetch(`${Config.API_ADDRESS}/api`); - let data = await response.json(); - data.results.forEach(function (result: {value: string, type: string}) { - if (result.value.trim().length == 0) { - return; - } - - addMessage({ text: result.value, type: result.type, role: "system" }); - setWaitingForSystem(WaitingStates.Idle); - }); - } - function completeUpload(message: string) { addMessage({ text: message, type: "message", role: "upload" }); setWaitingForSystem(WaitingStates.Idle); - - // Inform prompt server - fetch(`${Config.WEB_ADDRESS}/inject-context`, { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ - prompt: message, - }), - }) - .then(() => {}) - .catch((error) => console.error("Error:", error)); } - function startUpload(_: string) { + function startUpload() { setWaitingForSystem(WaitingStates.UploadingFile); } + async function downloadFoundryDataset(dataset_rid: string) { + if (dataset_rid != '') { + try { + setWaitingForSystem(WaitingStates.UploadingFile); + const response = await fetch(`${Config.WEB_ADDRESS}/foundry_files`, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ "dataset_rid": dataset_rid }), + }); + if (response.ok) { + const json = await response.json(); + json.map((file: {message: string, filename: string}) => { + addMessage({ text: file.message, type: "message", role: "upload" }); + }); + } else { + const msg = await response.text(); + addMessage({ text: `Downloading dataset ${dataset_rid} failed with status code ${response.status}: ${msg}. +Possibly, you only have Discoverer role but need at least Reader role on the item.`, type: "message", role: "upload" }); + console.log(response); + } + } catch (e) { + console.error(e); + } finally { + setWaitingForSystem(WaitingStates.Idle); + } + } + } + React.useEffect(() => { + + async function getApiData() { + if (document.hidden || otherTabDetected){ + return; + } + + try { + const response = await fetch(`${Config.API_ADDRESS}/api`, {redirect: 'manual'}); + if (response.type === 'opaqueredirect') { + // redirect occurs in the AppService when a new login is required. We could reload automatically, + // but that would lead to the user loosing their previous results. + setWaitingForSystem(WaitingStates.SessionTimeout); + } else { + const data = await response.json(); + + switch (data.status) { + case "starting": + setWaitingForSystem(WaitingStates.WaitingForKernel); + break; + case "ready": + case "idle": + setWaitingForSystem(WaitingStates.Idle); + break; + case "generating": + setWaitingForSystem(WaitingStates.GeneratingCode); + break; + case "busy": + setWaitingForSystem(WaitingStates.RunningCode); + break; + default: + setWaitingForSystem(WaitingStates.WaitingForKernel); + } + + data.results.forEach(function (result: {value: string, type: string}) { + if (result.value.trim().length == 0) { + return; + } + + addMessage({ text: result.value, type: result.type, role: "system" }); + }); + + if ((data.results.at(-1)?.type == 'message_error') && (autoFix > 0)) { + // we got a runtime error. Mark all previous results as potentially incomplete + setMessages((state: MessageDict[]) => + { + for (let step = state.length - 1; step > 0; step--) { + if (state[step].role != 'system') { + // this is likely the latest user prompt or generator output - do not go further back + break; + } else { + state[step].role = 'system_hide'; + } + } + return state; + }); + + if (autoFixCountdown > 0) { + setAutoFixCountdown(autoFixCountdown - 1); + setWaitingForSystem(WaitingStates.FixingCode); + await sendMessage('Please fix the error.', 'generator'); + } else { + addMessage({ text: `Automatic fixing of execution errors failed after ${autoFix} attempts. Please check your input.`, type: 'message', role: 'system' }) + } + } + } + } catch (error) { + if (error instanceof(TypeError)) { + if (waitingForSystem != WaitingStates.WaitingForKernel) { + setWaitingForSystem(WaitingStates.WaitingForKernel); + } + } else { + console.error('Error while fetching from api: ' + error); + } + } + } + const interval = setInterval(getApiData, 1000); return () => clearInterval(interval); - }, [getApiData]); + }, [autoFix, autoFixCountdown, otherTabDetected]); React.useEffect(() => { // Scroll down container by setting scrollTop to the height of the container @@ -193,20 +326,20 @@ function App() { // Capture clicks for download links React.useEffect(() => { - const clickHandler = (event: any) => { - let element = event.target; - + const clickHandler = (event: MouseEvent) => { + const element = event.target as HTMLElement; + // If an element was found, prevent default action and do something else if (element != null && element.tagName === 'A') { // Check if href starts with /download - - if (element.getAttribute("href").startsWith(`/download`)) { + + if (element.getAttribute("href")?.startsWith(`/download`)) { event.preventDefault(); // Make request to ${Config.WEB_ADDRESS}/download instead // make it by opening a new tab window.open(`${Config.WEB_ADDRESS}${element.getAttribute("href")}`); - } + } } }; @@ -217,32 +350,89 @@ function App() { return () => { document.removeEventListener('click', clickHandler); }; - }, []); + }, []); + + const handlePrint = useReactToPrint({ + content: () => chatScrollRef.current, + }); return ( <>
- { - setSelectedModel(val); - }} - openAIKey={openAIKey} - setOpenAIKey={(val: string) => { - setOpenAIKey(val); - }} - /> + + + {"Another Browser Tab Detected"} + + + + This tool does not support multiple sessions in different + browser tabs. The session in this tab has been suspended. + You can either close this browser tab/window or press the button + below to continue your work here and suspend sessions + in all other open tabs. + + + + + + + + + + + { handleCommand(COMMANDS["clear"]); }} + onInterruptKernel={() => { handleCommand(COMMANDS["stop"]); }} + onResetKernel={() => { handleCommand(COMMANDS["reset"]); }} + /> + + + + + + + +
diff --git a/frontend/src/components/Chat.css b/frontend/src/components/Chat.css index 5e1fe7f9..fef26514 100644 --- a/frontend/src/components/Chat.css +++ b/frontend/src/components/Chat.css @@ -1,11 +1,3 @@ -div.message.generator { - background: rgba(247,247,248); -} - -div.message.system { - background: rgba(247,247,248); -} - div.avatar { background: rgb(194, 142, 210); padding: 5px; @@ -54,6 +46,24 @@ div.message-body { width: 100%; } +kbd { + font-weight: bold; +} + +kbd > kbd { + border-radius: 3px; + padding: 1px 2px 0; + border: 1px solid; +} + +.message-body td, th { + border-left: 2vw solid transparent; +} + +.message-body tr>td:first-child { + border: 0px; +} + .loader { border: 5px solid #74a89b; border-radius: 50%; @@ -72,4 +82,3 @@ div.message-body { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } - diff --git a/frontend/src/components/Chat.tsx b/frontend/src/components/Chat.tsx index 4fbedb1e..aa60f54b 100644 --- a/frontend/src/components/Chat.tsx +++ b/frontend/src/components/Chat.tsx @@ -6,127 +6,248 @@ import TerminalIcon from '@mui/icons-material/Terminal'; import FileUploadIcon from '@mui/icons-material/FileUpload'; import { MessageDict } from "../App"; +import { Resizable } from 're-resizable'; import remarkGfm from 'remark-gfm'; import SyntaxHighlighter from "react-syntax-highlighter"; -import { RefObject } from "react"; +import React, { RefObject, useRef, useEffect } from "react"; import ReactMarkdown from 'react-markdown'; -function Message(props: { - text: string; - role: string; - type: string; - showLoader?: boolean; -}) { - let { text, role } = props; +function Message_Loader(props: { text: string; }) { + return ( +
+ {props.text} +
+
+ ); +} + + +function Message_Generic(props: { text: string; }) { const isMarkdown = (input: string) => { - const mdRegex = /\[.*\]\(.*\)|\*\*.*\*\*|__.*__|\#.*|\!\[.*\]\(.*\)|`.*`|\- .*|\|.*\|/g; + const mdRegex = /\[.*\]\(.*\)|\*\*.*\*\*|__.*__|#.*|!\[.*\]\(.*\)|`.*`|- .*|\|.*\|/g; return mdRegex.test(input); }; - let ICONS = { + return ( + isMarkdown(props.text) ? + + ) : ( + + {children} + + ) + } + }} + /> + : +
+ ); +} + + +function Message_Error(props: { text: string; }) { + return ( +
+ Execution Error: + +
+ ); +} + + +function Message_Resizable_Image(component: React.ReactElement, initial_height: string | number = 'auto', lockAspectRatio = true) { + return ( +
+ + { component } + +
+ ); +} + + +function Message_PNG(props: { text: string; }) { + const component = ; + return Message_Resizable_Image( component ); +} + + +function Message_JPEG(props: { text: string; }) { + const component = ; + return Message_Resizable_Image( component ); +} + + +function Message_SVG(props: { text: string; }) { + const component = ; + return Message_Resizable_Image( component ); +} + + +function Message_HTML(props: { text: string; }) { + return
+} + + +function Message_3dmol(props: { text: string; }) { + const ref = useRef(null); + const found = props.text.match(/3dmolviewer_\d*/); + const text = (props.text + .replace(/(viewer_\d+)(\.setSize.*$)/, '$1.resize(); //$2') + .replace('https://cdnjs.cloudflare.com/ajax/libs/3Dmol/2.0.4/3Dmol-min.js', './assets/3Dmol-min.js') + .replace(');\n', `).then( function() { + const viewer = document.getElementById("${found}"); + viewer.style.width = "100%"; + viewer.style.height = "100%"; + }).catch( function(err) { + const viewer = document.getElementById("${found}"); + const textnode = document.createTextNode(\`Execution Error:\n\${err}\`); + viewer.parentElement.insertBefore(textnode, viewer); + } + );\n` + ) + ); + + useEffect(() => { + const node = document.createRange().createContextualFragment(text); + if (ref.current) { + ref.current.appendChild(node); + } + }, [ref, text]); + + const component =
; + return Message_Resizable_Image(component, '400px', false); +} + + +function Message(props: { + text: string; + role: string; + type: string; + showCode: boolean; +}) { + const ICONS = { "upload": , - "generator": , + "generator": , + "documentation": , "system": , + "system_hide": , "user": , }; - return ( -
-
-
- { ICONS[role as keyof typeof ICONS] } + const Message_Types = { + "image/png": Message_PNG, + "image/jpeg": Message_JPEG, + "image/svg+xml": Message_SVG, + "text/html": Message_HTML, + "application/3dmoljs_load.v0": Message_3dmol, + "message_error": Message_Error, + "message_raw": Message_HTML, + "message_status": Message_HTML, + "message_loader": Message_Loader, + "message": Message_Generic, + }; + + const Message_Type = Message_Types[props.type as keyof typeof Message_Types] || Message_Generic; + + if (!props.showCode && (props.role === "generator" || props.role === "system_hide")) { + return <>; + } else { + return ( +
+
+
+ { ICONS[props.role as keyof typeof ICONS] } +
+
+
+
-
- {props.type == "message" && - (props.showLoader ? ( -
- {text} {props.showLoader ?
: null} -
- ) : ( - isMarkdown(text) ? - - ) : ( - - {children} - - ) - } - }} - /> - : -
- ))} - - {(props.type == "message_raw") && - (props.showLoader ? ( -
- {text} {props.showLoader ?
: null} -
- ) : ( -
- ))} - - {props.type == "image/png" && -
` }}>
- } - {props.type == "image/jpeg" && -
` }}>
- } -
-
- ); + ); + } } export enum WaitingStates { + SessionTimeout = "Session timeout. Please reload the page.", + WaitingForKernel = "Waiting for kernel connection", GeneratingCode = "Generating code", + FixingCode = "Fixing code", RunningCode = "Running code", UploadingFile = "Uploading file", - Idle = "Idle", + Idle = "Ready", } export default function Chat(props: { waitingForSystem: WaitingStates; chatScrollRef: RefObject; messages: Array; + showCode: boolean; }) { return ( - <> -
- {props.messages.map((message, index) => { - return ( - - ); - })} - {props.waitingForSystem != WaitingStates.Idle ? ( +
+ {props.messages.map((message, index) => { + return ( - ) : null} -
- + ); + })} + {props.waitingForSystem != WaitingStates.Idle ? ( + + ) : null} +
); } diff --git a/frontend/src/components/Documentation.css b/frontend/src/components/Documentation.css new file mode 100644 index 00000000..66c28da2 --- /dev/null +++ b/frontend/src/components/Documentation.css @@ -0,0 +1,4 @@ +label.header { + padding: 0.5rem 0; + font-size: 1.2rem; +} diff --git a/frontend/src/components/Documentation.tsx b/frontend/src/components/Documentation.tsx new file mode 100644 index 00000000..8995ebc4 --- /dev/null +++ b/frontend/src/components/Documentation.tsx @@ -0,0 +1,134 @@ +import "./Documentation.css"; +import { useState } from "react"; +import FormControl from '@mui/material/FormControl'; +import Button from '@mui/material/Button'; +import Stack from '@mui/material/Stack'; +import Dialog from '@mui/material/Dialog'; +import DialogActions from '@mui/material/DialogActions'; +import DialogContent from '@mui/material/DialogContent'; +import IconButton from '@mui/material/IconButton'; +import CloseIcon from '@mui/icons-material/Close'; +import ReactPlayer from 'react-player'; +import ReactMarkdown from 'react-markdown'; +import ReceiptLongIcon from '@mui/icons-material/ReceiptLong'; +import VideoChatIcon from '@mui/icons-material/VideoChat'; +import ListAltIcon from '@mui/icons-material/ListAlt'; +import demo_video from "../../public/assets/GPT Code UI.mp4"; +import disclaimer from "../../public/assets/Disclaimer.md" +import changelog from "../../public/assets/Changelog.md" + + +export default function Documentation() { + const [demoDialogOpen, setDemoDialogOpen] = useState(false); + const [disclaimerDialogOpen, setDisclaimerDialogOpen] = useState(true); + const [changelogDialogOpen, setChangelogDialogOpen] = useState(false); + + return ( + <> + setDemoDialogOpen(false) } + maxWidth={false} + > + + + + + + setDemoDialogOpen(false) } + sx={{ + position: 'absolute', + right: 8, + top: 8, + color: '#ccc', + }} + > + + + + + setDisclaimerDialogOpen(false) } + maxWidth={false} + > + + + + + + + + + + + setDisclaimerDialogOpen(false) } + sx={{ + position: 'absolute', + right: 8, + top: 8, + color: '#ccc', + }} + > + + + + + setChangelogDialogOpen(false) } + maxWidth={false} + > + + + + + + + + + setChangelogDialogOpen(false) } + sx={{ + position: 'absolute', + right: 8, + top: 8, + color: '#ccc', + }} + > + + + + + + + + + + + + + + ); +} diff --git a/frontend/src/components/Foundry.tsx b/frontend/src/components/Foundry.tsx new file mode 100644 index 00000000..a72c78de --- /dev/null +++ b/frontend/src/components/Foundry.tsx @@ -0,0 +1,134 @@ +import { useState, useEffect } from "react"; + +import FormControl from '@mui/material/FormControl'; +import FileOpenIcon from '@mui/icons-material/FileOpen'; +import FolderOpenIcon from '@mui/icons-material/FolderOpen'; +import DriveFolderUploadIcon from '@mui/icons-material/DriveFolderUpload'; +import Alert from '@mui/material/Alert'; +import Dialog from '@mui/material/Dialog'; +import DialogTitle from '@mui/material/DialogTitle'; +import DialogContent from '@mui/material/DialogContent'; +import TextField from '@mui/material/TextField'; +import List from '@mui/material/List'; +import ListItem from '@mui/material/ListItem'; +import ListItemAvatar from '@mui/material/ListItemAvatar'; +import ListItemButton from '@mui/material/ListItemButton'; +import ListItemText from '@mui/material/ListItemText'; +import Avatar from '@mui/material/Avatar'; +import useLocalStorage from "use-local-storage"; +import Config from "../config"; + + +export type FoundryItem = { + name: string; + absolute_path: string; + rid: string; +} + +export type FoundryDir = { + self: FoundryItem; + parent: FoundryItem, + children: FoundryItem[], +} + + +export default function Foundry(props: { + onSelectFoundryDataset: (name: string) => void; } +) { + const [foundryDialogOpen, setFoundryDialogOpen] = useState(false); + const [foundryFolder, setFoundryFolder] = useLocalStorage('foundryFolder', undefined); + const [foundryDir, setFoundryDir] = useState(undefined); + + const getFoundryDir = async (folder: string | undefined) => { + try { + const params = folder != undefined ? new URLSearchParams({folder: folder}) : ''; + const response = await fetch(`${Config.WEB_ADDRESS}/foundry_files?${params}`); + + if (response.ok) { + const json = await response.json(); + const fd: FoundryDir = json; + if (folder == undefined) { + setFoundryFolder(fd.self.absolute_path); + } + setFoundryDir(fd); + } else { + setFoundryDir(undefined); + } + } catch (e) { + console.error(e); + setFoundryDir(undefined); + } + }; + + useEffect(() => { + getFoundryDir(foundryFolder); + }, [foundryFolder]); + + + const handleFoundryDialogClose = (item: FoundryItem) => { + if (isFolder(item.rid)) { + setFoundryFolder(item.absolute_path); + } else { + props.onSelectFoundryDataset(item.rid); + setFoundryDialogOpen(false); + } + }; + + const isFolder = (rid: string) => { + return rid.includes('ri.compass.main.folder'); + } + + return <> + setFoundryDialogOpen(false) } fullWidth maxWidth="sm"> + Select Foundry Dataset + + + { setFoundryFolder(e.target.value); }} + /> + + {foundryDir != undefined && + + + handleFoundryDialogClose(foundryDir.parent) }> + + + + + + + + + + {foundryDir.children.map((item) => ( + + handleFoundryDialogClose(item) }> + + + { isFolder(item.rid) ? : } + + + + + + ))} + + } + {foundryDir != undefined && foundryDir.children.length == 0 && + No datasets found in folder + } + {foundryDir == undefined && + Access to folder failed. Does it exist? Do you have access permissions? + } + + + + + +} diff --git a/frontend/src/components/Input.css b/frontend/src/components/Input.css index acbcaeba..d595c87f 100644 --- a/frontend/src/components/Input.css +++ b/frontend/src/components/Input.css @@ -15,7 +15,7 @@ textarea:focus { outline: none } -form.file-upload button, button.send { +form.file-upload button, form.file-open button, button.send { border: 0; background: #eee; margin: 0.5rem; @@ -25,11 +25,11 @@ form.file-upload button, button.send { height: fit-content; } -form.file-upload button { +form.file-upload button, form.file-open button { margin-right: 0; } -form.file-upload svg, button.send svg { +form.file-upload svg, form.file-open svg, button.send svg { margin-top: 3px; width: 20px; height: auto; @@ -53,4 +53,4 @@ svg { .input-holder.focused { border: rgba(0,0,0,.3) 1px solid; -} \ No newline at end of file +} diff --git a/frontend/src/components/Input.tsx b/frontend/src/components/Input.tsx index d2b23cb4..886a02d2 100644 --- a/frontend/src/components/Input.tsx +++ b/frontend/src/components/Input.tsx @@ -1,32 +1,34 @@ -import { useRef, useState } from "react"; +import { useRef, useState, KeyboardEvent, MouseEvent, ChangeEvent } from "react"; import FileUploadIcon from "@mui/icons-material/FileUpload"; import SendIcon from "@mui/icons-material/Send"; import TextareaAutosize from "react-textarea-autosize"; import Config from "../config"; +import Foundry from "./Foundry"; import "./Input.css"; +import { MessageDict } from "../App" -export default function Input(props: { onSendMessage: any, onStartUpload: any, onCompletedUpload: any }) { - let fileInputRef = useRef(null); - let [inputIsFocused, setInputIsFocused] = useState(false); - let [userInput, setUserInput] = useState(""); +export default function Input(props: { + Messages: MessageDict[], + onSendMessage: (msg: string) => void, + onStartUpload: (filename: string) => void, + onCompletedUpload: (msg: string) => void, + onSelectFoundryDataset: (name: string) => void; } +) { - const handleInputFocus = () => { - setInputIsFocused(true); - }; - - const handleInputBlur = () => { - setInputIsFocused(false); - }; + const fileInputRef = useRef(null); + const [inputIsFocused, setInputIsFocused] = useState(false); + const [userInput, setUserInput] = useState(''); + const [messageReplay, setMessageReplay] = useState(0); - const handleUpload = (e: any) => { + const handleUpload = (e: MouseEvent) => { e.preventDefault(); fileInputRef.current?.click(); }; - const handleFileChange = async (e: any) => { - if (e.target.files.length > 0) { + const handleFileChange = async (e: ChangeEvent) => { + if (e.target.files != null && e.target.files.length > 0) { const file = e.target.files[0]; // Create a new FormData instance @@ -55,27 +57,53 @@ export default function Input(props: { onSendMessage: any, onStartUpload: any, o } } }; - + const handleSendMessage = async () => { + setMessageReplay(0); props.onSendMessage(userInput); setUserInput(""); } - const handleInputChange = (e: any) => { - setUserInput(e.target.value); - }; + const handleArrow = async (dir: number) => { + let newMessage = messageReplay; + while (newMessage + dir < 1 && newMessage + dir > -props.Messages.length) { + newMessage = newMessage + dir; + if (newMessage === 0) { + setUserInput(""); + setMessageReplay(newMessage); + break; + } else if (props.Messages[props.Messages.length + newMessage].role === 'user') { + setUserInput(props.Messages[props.Messages.length + newMessage].text); + setMessageReplay(newMessage); + break; + } + } + } - const handleKeyDown = (e: any) => { + const handleKeyDown = (e: KeyboardEvent) => { if (e.key === "Enter" && e.shiftKey === false) { - e.preventDefault(); - handleSendMessage(); + e.preventDefault(); + handleSendMessage(); + } else if (e.key === 'ArrowUp' && e.altKey === true) { + e.preventDefault(); + handleArrow(-1); + } else if (e.key === 'ArrowDown' && e.altKey === true) { + e.preventDefault(); + handleArrow(1); } }; return (
+ +
+ + +
+ setInputIsFocused(true) } + onBlur={ () => setInputIsFocused(false) } + onChange={ (e) => setUserInput(e.target.value) } onKeyDown={handleKeyDown} value={userInput} rows={1} placeholder="Send a message" /> + +
); diff --git a/frontend/src/components/Kernel.css b/frontend/src/components/Kernel.css new file mode 100644 index 00000000..66c28da2 --- /dev/null +++ b/frontend/src/components/Kernel.css @@ -0,0 +1,4 @@ +label.header { + padding: 0.5rem 0; + font-size: 1.2rem; +} diff --git a/frontend/src/components/Kernel.tsx b/frontend/src/components/Kernel.tsx new file mode 100644 index 00000000..d322926e --- /dev/null +++ b/frontend/src/components/Kernel.tsx @@ -0,0 +1,112 @@ +import "./Kernel.css"; +import { WaitingStates } from "./Chat"; +import Button from '@mui/material/Button'; +import Typography from '@mui/material/Typography'; +import Stack from '@mui/material/Stack'; +import DeleteIcon from '@mui/icons-material/Delete'; +import CancelIcon from '@mui/icons-material/Cancel'; +import RestartAltIcon from '@mui/icons-material/RestartAlt'; +import NewReleasesIcon from '@mui/icons-material/NewReleases'; +import HourglassBottomIcon from '@mui/icons-material/HourglassBottom'; +import TerminalIcon from '@mui/icons-material/Terminal'; +import EngineeringIcon from '@mui/icons-material/Engineering'; +import FileUploadIcon from '@mui/icons-material/FileUpload'; + + +function getIcon(state: WaitingStates) { + // Animations adapted from https://codepen.io/nelledejones/pen/gOOPWrK + switch (state) { + case WaitingStates.SessionTimeout: + return ; + case WaitingStates.WaitingForKernel: + return ; + case WaitingStates.GeneratingCode: + case WaitingStates.FixingCode: + return ; + case WaitingStates.RunningCode: + return ; + case WaitingStates.UploadingFile: + return ; + case WaitingStates.Idle: + return <>; + } +} + +export default function Kernel(props: { + state: WaitingStates; + onClearChat: React.MouseEventHandler; + onInterruptKernel: React.MouseEventHandler; + onResetKernel: React.MouseEventHandler; +}) { + return ( + <> + + + + {getIcon(props.state)} + + + + {props.state} + + + + + + + + ); +} diff --git a/frontend/src/components/Logo.css b/frontend/src/components/Logo.css new file mode 100644 index 00000000..d8471a14 --- /dev/null +++ b/frontend/src/components/Logo.css @@ -0,0 +1,39 @@ +.logo { + text-align: center; + font-weight: bold; + font-size: 1.5rem; + margin-top: 1rem; +} + +.github { + color: #999; + font-size: 0.8rem; +} + +.github a { + color: #999; +} + +a:hover { + color: rgb(150, 215, 210); +} + +.logo svg { + color: #fff; + width: 35px; + height: 35px; + margin-right: 5px; + margin-bottom: -8px; +} + +.wrapper { + overflow:auto; +} + +.header { + float: left; +} + +.headline { + margin: 0 10px; +} diff --git a/frontend/src/components/Logo.tsx b/frontend/src/components/Logo.tsx new file mode 100644 index 00000000..0591c593 --- /dev/null +++ b/frontend/src/components/Logo.tsx @@ -0,0 +1,26 @@ +import "./Logo.css"; +import logo from "../../public/assets/assistant.svg"; + + +export default function Logo() { + return ( + <> +
+ + ); +} diff --git a/frontend/src/components/Settings.css b/frontend/src/components/Settings.css new file mode 100644 index 00000000..66c28da2 --- /dev/null +++ b/frontend/src/components/Settings.css @@ -0,0 +1,4 @@ +label.header { + padding: 0.5rem 0; + font-size: 1.2rem; +} diff --git a/frontend/src/components/Settings.tsx b/frontend/src/components/Settings.tsx new file mode 100644 index 00000000..cd68ee88 --- /dev/null +++ b/frontend/src/components/Settings.tsx @@ -0,0 +1,143 @@ +import "./Settings.css"; +import { useEffect } from "react"; +import InputLabel from '@mui/material/InputLabel'; +import Box from '@mui/material/Box'; +import OutlinedInput from '@mui/material/OutlinedInput'; +import Chip from '@mui/material/Chip'; +import MenuItem from '@mui/material/MenuItem'; +import FormControl from '@mui/material/FormControl'; +import CancelIcon from "@mui/icons-material/Cancel"; +import CheckIcon from "@mui/icons-material/Check"; +import Select, { SelectChangeEvent } from '@mui/material/Select'; +import Stack from '@mui/material/Stack'; +import FormGroup from '@mui/material/FormGroup'; +import FormControlLabel from '@mui/material/FormControlLabel'; +import Switch from '@mui/material/Switch'; +import Tooltip from '@mui/material/Tooltip'; + + +export default function Settings(props: { + models: Array<{ name: string; displayName: string }>; + selectedModel: string; + onSelectModel: (val: string) => void; + toggledOptions: string[]; + onToggledOptions: (val: string[]) => void; + showCode: boolean; + onShowCode: (val: boolean) => void; + autoFix: number; + onAutoFix: (val: number) => void; +}) { + const options: Array<{ name: string; displayName: string }> = [ + {name: 'svg', displayName: 'Vector Graphics'}, + ]; + + const models = props.models; + const selectedModel = props.selectedModel; + const onSelectModel = props.onSelectModel; + + useEffect(() => { + if (models.length) { + if (undefined === models.find(e => e.name === selectedModel)) { + onSelectModel(models[0].name); + } else { + onSelectModel(selectedModel); + } + } + }, [models, selectedModel, onSelectModel]); + + return ( + <> + + + + + + {props.onShowCode(checked)} } + /> + } + label="Show Python Code" + /> + + 0} + onChange={(_ev, checked) => {props.onAutoFix(checked ? 3 : 0)} } + /> + } + label="Autofix Execution Errors" + /> + + + Options + + + + Model + + + + + + ); +} diff --git a/frontend/src/components/Sidebar.css b/frontend/src/components/Sidebar.css deleted file mode 100644 index d80dfdd6..00000000 --- a/frontend/src/components/Sidebar.css +++ /dev/null @@ -1,68 +0,0 @@ -.sidebar { - min-width: 260px; - background: #202123; - height: 100%; - display: flex; - flex-direction: column; - justify-content: space-between; - padding: 0.75rem; - color: #fff; -} - -.logo { - text-align: center; - font-weight: bold; - font-size: 1.5rem; - margin-top: 1rem -} - -.github a { - color: #999; - font-size: 0.8rem; -} - -a:hover { - color: #fff; -} - -.logo svg { - color: #fff; - width: 35px; - height: 35px; - margin-right: 5px; - margin-bottom: -8px; -} - -.settings { - display: flex; - flex-direction: column; -} - -button, select { - padding: 0.8rem; - border: none; - border-radius: .25rem; - background-color: #333; - color: #fff; -} - -select option { - padding: 0.8rem; -} - -button { - cursor: pointer; - margin-bottom: 0.5rem; - background: #74a89b; -} - -label { - font-size: 0.9rem; - color: #999; - margin-top: .5rem; - margin-bottom: .25rem; -} - -label.header { - font-size: 1.2rem; -} \ No newline at end of file diff --git a/frontend/src/components/Sidebar.tsx b/frontend/src/components/Sidebar.tsx deleted file mode 100644 index be1e80e8..00000000 --- a/frontend/src/components/Sidebar.tsx +++ /dev/null @@ -1,49 +0,0 @@ -import AssistantIcon from '@mui/icons-material/Assistant'; - -import "./Sidebar.css"; - -export default function Sidebar(props: { - models: Array<{ name: string; displayName: string }>; - selectedModel: string; - onSelectModel: any; - setOpenAIKey: any; - openAIKey: string; -}) { - const handleOpenAIButtonClick = () => { - const key = prompt("Please enter your OpenAI key", props.openAIKey); - if (key != null) { - props.setOpenAIKey(key); - } - }; - return ( - <> -
- -
- - - - - -
-
- - ); -} diff --git a/frontend/src/config.tsx b/frontend/src/config.tsx index 955939f8..6a4e064d 100644 --- a/frontend/src/config.tsx +++ b/frontend/src/config.tsx @@ -1,8 +1,8 @@ -let resolvedWebAddress = import.meta.env.VITE_WEB_ADDRESS ? import.meta.env.VITE_WEB_ADDRESS : ""; +const resolvedWebAddress = import.meta.env.VITE_WEB_ADDRESS ? import.meta.env.VITE_WEB_ADDRESS : ""; const Config = { WEB_ADDRESS: resolvedWebAddress, API_ADDRESS: resolvedWebAddress + "/api" } -export default Config; \ No newline at end of file +export default Config; diff --git a/frontend/src/index.css b/frontend/src/index.css index f2f599a7..0075a6f7 100644 --- a/frontend/src/index.css +++ b/frontend/src/index.css @@ -35,5 +35,5 @@ h1 { @media (prefers-color-scheme: light) { - + } diff --git a/frontend/src/vite-env.d.ts b/frontend/src/vite-env.d.ts index 11f02fe2..cb6e7e8d 100644 --- a/frontend/src/vite-env.d.ts +++ b/frontend/src/vite-env.d.ts @@ -1 +1,2 @@ /// +declare module "*.md"; diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json index c81ef9f3..62327659 100644 --- a/frontend/tsconfig.json +++ b/frontend/tsconfig.json @@ -17,7 +17,9 @@ "strict": true, "noUnusedLocals": true, "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true + "noFallthroughCasesInSwitch": true, + + "types": ["node"] }, "include": ["src"], "references": [{ "path": "./tsconfig.node.json" }] diff --git a/frontend/tsconfig.node.json b/frontend/tsconfig.node.json index 42872c59..b940375d 100644 --- a/frontend/tsconfig.node.json +++ b/frontend/tsconfig.node.json @@ -4,7 +4,8 @@ "skipLibCheck": true, "module": "ESNext", "moduleResolution": "bundler", - "allowSyntheticDefaultImports": true + "allowSyntheticDefaultImports": true, + "types": ["node"] }, "include": ["vite.config.ts"] } diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts index 861b04b3..3396d378 100644 --- a/frontend/vite.config.ts +++ b/frontend/vite.config.ts @@ -3,5 +3,17 @@ import react from '@vitejs/plugin-react-swc' // https://vitejs.dev/config/ export default defineConfig({ - plugins: [react()], + plugins: [ + react(), + // Custom plugin to load markdown files + { + name: "markdown-loader", + transform(code, id) { + if (id.slice(-3) === ".md") { + // For .md files, get the raw content + return `export default ${JSON.stringify(code)};`; + } + } + } + ], }) diff --git a/gpt_code_ui/function_library/__init__.py b/gpt_code_ui/function_library/__init__.py new file mode 100644 index 00000000..daf96d32 --- /dev/null +++ b/gpt_code_ui/function_library/__init__.py @@ -0,0 +1,11 @@ +from typing import Callable, Dict + +from .examples import generate_derivate_molecules, predict_solubility +from .mol_utils import draw_smiles + +# TODO (TP): Create better, more scalable way to discover functions +AVAILABLE_FUNCTIONS: Dict[str, Callable] = { + "predict_solubility": predict_solubility, + "generate_derivate_molecules": generate_derivate_molecules, + "draw_smiles": draw_smiles, +} diff --git a/gpt_code_ui/function_library/examples.py b/gpt_code_ui/function_library/examples.py new file mode 100644 index 00000000..63d25fa0 --- /dev/null +++ b/gpt_code_ui/function_library/examples.py @@ -0,0 +1,34 @@ +""" A library of example functions that are to be understood by an LLM.""" +import random + +from rdkit import Chem + + +def predict_solubility(smiles: str) -> float: + """Predict the solubility of a molecule from its SMILES string. + + Args: + smiles: SMILES string of the molecule. + + Returns: + The predicted solubility. + """ + + # return a random number between 0 and 1 + return random.random() + + +def generate_derivate_molecules(smiles: str, n: int = 10) -> list[str]: + """Generate a list of molecules that are similar to the input molecule. + + Args: + smiles: SMILES string of the molecule. + n: Number of molecules to generate. + + Returns: + A list of SMILES strings of molecules that are similar to the input molecule. + """ + + mol = Chem.MolFromSmiles(smiles) + output = [Chem.MolToSmiles(mol, doRandom=True) for _ in range(n)] + return output diff --git a/gpt_code_ui/function_library/mol_utils.py b/gpt_code_ui/function_library/mol_utils.py new file mode 100644 index 00000000..638d9e08 --- /dev/null +++ b/gpt_code_ui/function_library/mol_utils.py @@ -0,0 +1,23 @@ +from typing import List + +from IPython.display import display +from rdkit import Chem +from rdkit.Chem import Draw + + +def draw_smiles(smiles_list: List[str], legends: List[str] = None, mols_per_row: int = 5) -> None: + """Draw a list of SMILES strings. + + Args: + smiles_list (List[str]): A list of SMILES strings. + legends (List[str], optional): A list of legend strings. Defaults to None. + mols_per_row (int, optional): Number of molecules per row. Defaults to 5. + """ + mols = Draw.MolsToGridImage( + [Chem.MolFromSmiles(smiles) for smiles in smiles_list], + molsPerRow=mols_per_row, + legends=legends, + useSVG=True, + ) + + display(mols) diff --git a/gpt_code_ui/function_library/parser.py b/gpt_code_ui/function_library/parser.py new file mode 100644 index 00000000..9e0bd3c8 --- /dev/null +++ b/gpt_code_ui/function_library/parser.py @@ -0,0 +1,38 @@ +import inspect +from dataclasses import dataclass +from typing import Any, Callable, List, Type + + +@dataclass +class Parameter: + name: str + type: Type + default: Any + + +@dataclass +class FunctionSignature: + name: str + doc_string: str | None + parameters: List[Parameter] + return_type: Type + + +def is_empty_default(value: Any) -> bool: + return value is inspect.Parameter.empty + + +def is_empty_annotation(value: Any) -> bool: + return value is inspect.Signature.empty + + +def get_function_signature(fun: Callable) -> FunctionSignature: + return FunctionSignature( + name=fun.__name__, + doc_string=fun.__doc__, + parameters=[ + Parameter(name=param.name, type=param.annotation, default=param.default) + for param in inspect.signature(fun).parameters.values() + ], + return_type=fun.__annotations__["return"], + ) diff --git a/gpt_code_ui/kernel_program/config.py b/gpt_code_ui/kernel_program/config.py index aa37c08f..43f29b6b 100644 --- a/gpt_code_ui/kernel_program/config.py +++ b/gpt_code_ui/kernel_program/config.py @@ -1,18 +1,47 @@ import logging import os +import pathlib +import sys -IDENT_KERNEL_MANAGER = "kernel_manager" -IDENT_MAIN = "main" +from dotenv import load_dotenv + +load_dotenv(".env") + +IDENT_MAIN = "kernel_program.main" KERNEL_PID_DIR = "process_pids" -SNAKEMQ_PORT = int(os.environ.get("SNAKEMQ_PORT", 8765)) +NO_INTERNET_AVAILABLE = os.environ.get("NO_INTERNET_AVAILABLE", "FALSE")[0] in ( + "1", + "t", + "T", +) +KERNEL_APP_PORT = int(os.environ.get("API_PORT", 5010)) +KERNEL_BASE_DIR = pathlib.Path(os.environ.get("KERNEL_BASE_DIR", "workspace")) +if not KERNEL_BASE_DIR.is_absolute(): + KERNEL_BASE_DIR = KERNEL_BASE_DIR.absolute() # assuming it is relative to the current working dir +KERNEL_BASE_DIR.mkdir(parents=True, exist_ok=True) +BASE_VENV = KERNEL_BASE_DIR / "kernel.base" + +WATCHDOG_INTERVAL_S = float(os.getenv("KERNEL_MANAGER_WATCHDOG_INTERVAL_S", 60)) +assert WATCHDOG_INTERVAL_S > 0 +KERNEL_TIMEOUT_S = float(os.getenv("KERNEL_MANAGER_TIMEOUT_S", 3600)) +assert KERNEL_TIMEOUT_S > 0 + + +def get_logger(name): + logger = logging.getLogger(name) + logger.setLevel(logging.DEBUG) + + if not logger.handlers: + logFormatter = logging.Formatter(fmt="%(asctime)s [%(levelname)8s %(name)s] %(message)s") + consoleHandler = logging.StreamHandler(sys.stdout) + consoleHandler.setLevel(logging.DEBUG if "DEBUG" in os.environ else logging.WARNING) + consoleHandler.setFormatter(logFormatter) + logger.addHandler(consoleHandler) -def get_logger(): - logging.basicConfig( - format="[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s" - ) + file_handler = logging.FileHandler("app.log", mode="a") + file_handler.setLevel(logging.DEBUG if "DEBUG" in os.environ else logging.WARNING) + file_handler.setFormatter(logFormatter) + logger.addHandler(file_handler) - logger = logging.getLogger(__name__) - if "DEBUG" in os.environ: - logger.setLevel(logging.DEBUG) - return logger \ No newline at end of file + return logger diff --git a/gpt_code_ui/kernel_program/kernel.py b/gpt_code_ui/kernel_program/kernel.py new file mode 100644 index 00000000..ad73183a --- /dev/null +++ b/gpt_code_ui/kernel_program/kernel.py @@ -0,0 +1,301 @@ +import json +import os +import queue +import shutil +import subprocess +import sys +import time +from pathlib import Path +from threading import Lock, Thread +from typing import Dict + +from jupyter_client import BlockingKernelClient + +import gpt_code_ui.kernel_program.config as config +from gpt_code_ui.kernel_program.stoppable_thread import StoppableThread +from gpt_code_ui.kernel_program.utils import create_derived_venv, escape_ansi + + +class FlushingThread(StoppableThread): + def __init__(self, flush_kernel_msgs, *args, **kwargs): + super().__init__(*args, **kwargs) + self._flush = flush_kernel_msgs + + def run(self): + while not self.stopped(timeout=1.0): + self._flush() + + +class Kernel: + def __init__(self, session_id: str): + self._logger = config.get_logger(f"Kernel {session_id}") + self._session_id = session_id + self._workdir = config.KERNEL_BASE_DIR / f"kernel.{self._session_id}" + self._result_queue: queue.Queue[Dict[str, str]] = queue.Queue() + self._status = "stopped" + self._kernel_client = None + self._kernel_process = None + self._flusher_thread = None + self._flusher_lock = Lock() + self._startup_thread = None + self._start() + + def _start(self): + self._startup_thread = Thread( + name=f"Kernel {self._session_id} startup procedure.", + target=self._start_impl, + ) + self._startup_thread.start() + + def _ensure_started(self): + self._startup_thread.join() + + def _start_impl(self): + if self.status != "stopped": + self._logger.error(f"Trying to start a kernel that is not stopped but has status {self.status} instead.") + + self._logger.info(f"Start of kernel with workdir {self._workdir} has been requested.") + + self._status = "starting" + + # Cleanup potential leftovers + shutil.rmtree(self._workdir, ignore_errors=True) + os.makedirs(self._workdir) + + kernel_env: Dict[ + str, str + ] = {} # instead of os.environ.copy() to prevent leaking information from the runtime into the kernel + kernel_connection_file = self._workdir / "kernel_connection_file.json" + + if config.NO_INTERNET_AVAILABLE: + # cannot install packages, so no need for a dedicated venv + kernel_python_executable = sys.executable + self._logger.info( + f"Skipped creating kernel venv as there is no internet connection. Using python binary {kernel_python_executable}." + ) + else: + kernel_venv_dir = self._workdir / "venv" + kernel_venv_bindir, kernel_python_executable = create_derived_venv(config.BASE_VENV, kernel_venv_dir) + kernel_env["PATH"] = str(kernel_venv_bindir) + os.pathsep + kernel_env.get("PATH", "") + self._logger.info( + f"Created kernel venv at {kernel_venv_dir} with python binary {kernel_python_executable}." + ) + + # ensure that the function library is available # TODO: this also allows acessing gpt_code_ui and frontend :-() + kernel_env["PYTHONPATH"] = ( + str(Path(__file__).parent.parent.resolve()) + os.pathsep + kernel_env.get("PYTHONPATH", "") + ) + + # start the kernel using the virtual env python executable + kernel_code = f"""from ipykernel.kernelapp import IPKernelApp +IPKernelApp.launch_instance( + argv=[ + "--IPKernelApp.connection_file", + "{kernel_connection_file}", + "--matplotlib=inline", + f"--ipython-dir={self._workdir}", + "--quiet", + ] +)""" + + self._kernel_process = subprocess.Popen( + [kernel_python_executable, "-c", kernel_code], + cwd=self._workdir, + env=kernel_env, + ) + + self._logger.info(f"Kernel process has started. PID is {self._kernel_process.pid}.") + + # Wait for kernel connection file to be written + while True: + try: + with open(kernel_connection_file, "r") as fp: + json.load(fp) + except (FileNotFoundError, json.JSONDecodeError): + # Either file was not yet there or incomplete (then JSON parsing failed) + time.sleep(0.1) + else: + break + + # Client + self._kernel_client = BlockingKernelClient(connection_file=str(kernel_connection_file)) + self._kernel_client.load_connection_file() + self._kernel_client.start_channels() + self._kernel_client.wait_for_ready() + self._kernel_client.execute( + """from function_library import AVAILABLE_FUNCTIONS +for function_name, function in AVAILABLE_FUNCTIONS.items(): + locals()[function_name] = function +""" + ) + self._logger.info(f"Kernel client has started. Connection details found in {kernel_connection_file}.") + + self._flusher_thread = FlushingThread( + name=f"Kernel Message Flusher {self._session_id}", flush_kernel_msgs=self.flush_kernel_msgs + ) + self._flusher_thread.start() + + self._logger.info("Message Flusher thread started.") + + self._status = "idle" + + @property + def status(self): + return self._status + + def set_status(self, status: str): + self._status = status + + def __del__(self): + if self._status != "stopped": + self.terminate() + + def restart(self): + self._logger.info("Restarting kernel.") + self.terminate() + self._start() + + def interrupt(self): + self._logger.info("Interrupting kernel execution.") + msg = self._kernel_client.session.msg("interrupt_request", {}) + self._kernel_client.control_channel.send(msg) + return msg["header"]["msg_id"] + + def terminate(self): + self._ensure_started() + self._logger.info("Termination of kernel has been requested.") + self._status = "stopping" + self._logger.info("Stopping message flusher thread has been requested.") + self._flusher_thread.stop(wait=True) + self._logger.info("Stopping kernel client.") + self._kernel_client.shutdown() + self._logger.info(f"Terminating kernel process {self._kernel_process.pid}") + self._kernel_process.kill() + self._logger.info(f"Removing kernel work directory {self._workdir}") + shutil.rmtree(self._workdir, ignore_errors=True) + self._status = "stopped" + self._logger.info("Kernel terminated.") + + def _put_message(self, value, message_type): + self._result_queue.put({"value": value, "type": message_type}) + + def flush_kernel_msgs(self, tries=1, timeout=0.2): + with self._flusher_lock: + self._ensure_started() + + try: + hit_empty = 0 + + while True: + try: + msg = self._kernel_client.get_iopub_msg(timeout=timeout) + msg_type = msg["msg_type"] + msg_content = msg["content"] + + self._logger.debug(f'Received "{msg_type}": {msg_content}') + + if msg_type == "status": + self._status = msg_content["execution_state"] + # self._put_message(msg_content["execution_state"], message_type="message_status") + + elif msg_type == "execute_input": + pass # do not want to mirror the input back + + elif msg_type in ("execute_result", "display_data"): + content_data = msg_content["data"] + + if "image/png" in content_data: + self._put_message(content_data["image/png"], message_type="image/png") + elif "image/jpeg" in content_data: + self._put_message(content_data["image/jpeg"], message_type="image/jpeg") + elif "image/svg+xml" in content_data: + self._put_message(content_data["image/svg+xml"], message_type="image/svg+xml") + elif "application/3dmoljs_load.v0" in content_data: + # this case must be before "text/html"as the py3Dmol payload contains both options + self._put_message( + content_data["application/3dmoljs_load.v0"], + message_type="application/3dmoljs_load.v0", + ) + elif "text/html" in content_data: + self._put_message(content_data["text/html"], message_type="text/html") + elif "text/plain" in content_data: + self._put_message( + content_data["text/plain"], + message_type="message_raw" if msg_type == "execute_result" else "message", + ) + else: + self._put_message( + f"Unsupported {msg_type}: {content_data}", + message_type="message_error", + ) + + elif msg_type == "stream": + self._put_message(msg_content["text"], message_type="message") + + elif msg_type == "error": + self._put_message( + escape_ansi("\n".join(msg_content["traceback"])), + message_type="message_error", + ) + + else: + self._logger.debug(f"Unexpected message type {msg_type}") + + except queue.Empty: + hit_empty += 1 + if hit_empty == tries: + # Empty queue for one second, give back control + break + except (ValueError, IndexError): + # get_iopub_msg suffers from message fetch errors + break + except Exception as e: + self._logger.exception(e) + break + except Exception as e: + self._logger.exception(e) + + def execute(self, command): + self._ensure_started() + + self._logger.debug("Executing command: %s" % command) + + code = command.get("command", "") + options = command.get("options", []) + + if "svg" in options: + code = f"""%matplotlib inline +import matplotlib_inline +matplotlib_inline.backend_inline.set_matplotlib_formats('svg') +del matplotlib_inline +import matplotlib.pyplot as plt +plt.rcParams['svg.fonttype'] = 'none' +del plt +import warnings +warnings.filterwarnings("ignore", message="Glyph.*missing from current font.") +del warnings +import logging +logging.getLogger('matplotlib.font_manager').setLevel(logging.ERROR) +del logging +{code}""" + else: + code = f"""%matplotlib inline +import matplotlib_inline +matplotlib_inline.backend_inline.set_matplotlib_formats('png') +del matplotlib_inline +{code}""" + + self._kernel_client.execute(code, allow_stdin=False) + # Try direct flush with default wait (0.2) + self.flush_kernel_msgs() + + def get_results(self): + return [self._result_queue.get() for _ in range(self._result_queue.qsize())] + + @property + def workdir(self) -> str: + return str(self._workdir) + + @property + def session_id(self) -> str: + return self._session_id diff --git a/gpt_code_ui/kernel_program/kernel_manager.py b/gpt_code_ui/kernel_program/kernel_manager.py index 93f6d799..ef43a46d 100644 --- a/gpt_code_ui/kernel_program/kernel_manager.py +++ b/gpt_code_ui/kernel_program/kernel_manager.py @@ -1,224 +1,57 @@ -import sys -import subprocess -import os -import queue -import json -import signal -import pathlib import threading -import time -import atexit -import traceback +from typing import Dict, List -from time import sleep -from jupyter_client import BlockingKernelClient +from gpt_code_ui.kernel_program import config # noqa: E402 +from gpt_code_ui.kernel_program.kernel import Kernel # noqa: E402 -from dotenv import load_dotenv -load_dotenv('.env') -import gpt_code_ui.kernel_program.utils as utils -import gpt_code_ui.kernel_program.config as config +class KernelManager: + def __init__(self): + self._logger = config.get_logger("Kernel Manager") + self._kernels: Dict[str, Kernel] = {} + self._kernels_lock = threading.Lock() -# Set up globals -messaging = None -logger = config.get_logger() + self._logger.info("Creating Kernel Manager") + def purge_kernels(self, session_ids: List[str]): + self._kernels_lock.acquire() + try: + for session_id in session_ids: + if (kernel := self._kernels.get(session_id, None)) is not None: + self._logger.info(f"Purging kernel for session {session_id}.") + kernel.terminate() + del self._kernels[session_id] + finally: + self._kernels_lock.release() -class FlushingThread(threading.Thread): - def __init__(self, kc, kill_sema): - threading.Thread.__init__(self) - self.kill_sema = kill_sema - self.kc = kc + def items(self): + return self._kernels.items() - def run(self): - logger.info("Running message flusher...") - while True: + def get(self, session_id: str, force_recreate: bool = False) -> Kernel: + if force_recreate: + self._logger.info(f"Removing kernel {session_id} to force recreation.") - if self.kill_sema.acquire(blocking=False): - logger.info("Sema was released to kill thread") - sys.exit() - - flush_kernel_msgs(self.kc) - time.sleep(1) - - -def cleanup_spawned_processes(): - print("Cleaning up kernels...") - for filename in os.listdir(config.KERNEL_PID_DIR): - fp = os.path.join(config.KERNEL_PID_DIR, filename) - if os.path.isfile(fp): - try: - pid = int(filename.split(".pid")[0]) - logger.debug("Killing process with pid %s" % pid) - os.remove(fp) - try: - if os.name == "nt": - os.kill(pid, signal.CTRL_BREAK_EVENT) - else: - os.kill(pid, signal.SIGKILL) - - # After successful kill, cleanup pid file - os.remove(fp) - - except Exception: - # Windows process killing is flaky - pass - except Exception as e: - logger.debug(e) - - -def start_snakemq(kc): - global messaging - - messaging, link = utils.init_snakemq(config.IDENT_KERNEL_MANAGER, "connect") - - def on_recv(conn, ident, message): - if ident == config.IDENT_MAIN: - message = json.loads(message.data.decode("utf-8")) - - if message["type"] == "execute": - logger.debug("Executing command: %s" % message["value"]) - kc.execute(message["value"]) - # Try direct flush with default wait (0.2) - flush_kernel_msgs(kc) - - messaging.on_message_recv.add(on_recv) - - start_flusher(kc) - - # Send alive - utils.send_json(messaging, {"type": "status", "value": "ready"}, config.IDENT_MAIN) - logger.info("Python kernel ready to receive messages!") - - logger.info("Starting snakemq loop") - - try: - link.loop() - except KeyboardInterrupt: - logger.info("Keyboard interrupt received, exiting...") - sys.exit(0) - except Exception as e: - logger.error("Error in snakemq loop: %s" % e) - sys.exit(1) - - -def start_flusher(kc): - # Start FlushMessenger - kill_sema = threading.Semaphore() - kill_sema.acquire() - t = FlushingThread(kc, kill_sema) - t.start() - - def end_thread(): - kill_sema.release() - - atexit.register(end_thread) - - -def send_message(message, message_type="message"): - utils.send_json( - messaging, {"type": message_type, "value": message}, config.IDENT_MAIN - ) - - -def flush_kernel_msgs(kc, tries=1, timeout=0.2): - try: - hit_empty = 0 - - while True: + self._kernels_lock.acquire() try: - msg = kc.get_iopub_msg(timeout=timeout) - if msg["msg_type"] == "execute_result": - if "text/plain" in msg["content"]["data"]: - send_message( - msg["content"]["data"]["text/plain"], "message_raw" - ) - if msg["msg_type"] == "display_data": - if "image/png" in msg["content"]["data"]: - # Convert to Slack upload - send_message( - msg["content"]["data"]["image/png"], - message_type="image/png", - ) - elif "text/plain" in msg["content"]["data"]: - send_message(msg["content"]["data"]["text/plain"]) - - elif msg["msg_type"] == "stream": - logger.debug("Received stream output %s" % msg["content"]["text"]) - send_message(msg["content"]["text"]) - elif msg["msg_type"] == "error": - send_message( - utils.escape_ansi("\n".join(msg["content"]["traceback"])), - "message_raw", - ) - except queue.Empty: - hit_empty += 1 - if hit_empty == tries: - # Empty queue for one second, give back control - break - except (ValueError, IndexError): - # get_iopub_msg suffers from message fetch errors - break - except Exception as e: - logger.debug(f"{e} [{type(e)}") - logger.debug(traceback.format_exc()) - break - except Exception as e: - logger.debug(f"{e} [{type(e)}") - + self._kernels[session_id].terminate() + del self._kernels[session_id] + finally: + self._kernels_lock.release() -def start_kernel(): - kernel_connection_file = os.path.join(os.getcwd(), "kernel_connection_file.json") - - if os.path.isfile(kernel_connection_file): - os.remove(kernel_connection_file) - if os.path.isdir(kernel_connection_file): - os.rmdir(kernel_connection_file) - - launch_kernel_script_path = os.path.join( - pathlib.Path(__file__).parent.resolve(), "launch_kernel.py" - ) - - os.makedirs('workspace/', exist_ok=True) - - kernel_process = subprocess.Popen( - [ - sys.executable, - launch_kernel_script_path, - "--IPKernelApp.connection_file", - kernel_connection_file, - "--matplotlib=inline", - "--quiet", - ], - cwd='workspace/' - ) - # Write PID for caller to kill - str_kernel_pid = str(kernel_process.pid) - os.makedirs(config.KERNEL_PID_DIR, exist_ok=True) - with open(os.path.join(config.KERNEL_PID_DIR, str_kernel_pid + ".pid"), "w") as p: - p.write("kernel") - - # Wait for kernel connection file to be written - while True: - if not os.path.isfile(kernel_connection_file): - sleep(0.1) - else: - # Keep looping if JSON parsing fails, file may be partially written + if session_id not in self._kernels: + self._kernels_lock.acquire() try: - with open(kernel_connection_file, 'r') as fp: - json.load(fp) - break - except json.JSONDecodeError: - pass - - # Client - kc = BlockingKernelClient(connection_file=kernel_connection_file) - kc.load_connection_file() - kc.start_channels() - kc.wait_for_ready() - return kc - - -if __name__ == "__main__": - kc = start_kernel() - start_snakemq(kc) \ No newline at end of file + # while waiting for the lock, the object already might have been created --> check again inside the lock + if session_id not in self._kernels: + self._logger.info(f"Kernel {session_id} does not exist. Creating it.") + self._kernels[session_id] = Kernel(session_id) + finally: + self._kernels_lock.release() + + return self._kernels[session_id] + + def terminate(self): + self._logger.info("Termination of kernel manager requested...") + all_sessions = list(self._kernels.keys()) + self.purge_kernels(all_sessions) + self._logger.info("Kernel manager terminated.") diff --git a/gpt_code_ui/kernel_program/launch_kernel.py b/gpt_code_ui/kernel_program/launch_kernel.py deleted file mode 100644 index d193051d..00000000 --- a/gpt_code_ui/kernel_program/launch_kernel.py +++ /dev/null @@ -1,4 +0,0 @@ -if __name__ == "__main__": - from ipykernel import kernelapp as app - - app.launch_new_instance() \ No newline at end of file diff --git a/gpt_code_ui/kernel_program/main.py b/gpt_code_ui/kernel_program/main.py index 401133ee..a86cb05a 100644 --- a/gpt_code_ui/kernel_program/main.py +++ b/gpt_code_ui/kernel_program/main.py @@ -1,160 +1,132 @@ -import os -import subprocess -import sys -import pathlib -import json +import atexit import logging -import time - -import asyncio -import json -import threading - -from queue import Queue +import sys +from datetime import datetime, timedelta +from functools import wraps -from flask import Flask, request, jsonify -from flask_cors import CORS # Import the CORS library +from flask import Flask, jsonify, request +from flask_cors import CORS -from dotenv import load_dotenv -load_dotenv('.env') +from gpt_code_ui.kernel_program import config # noqa: E402 +from gpt_code_ui.kernel_program.kernel import Kernel, StoppableThread # noqa: E402 +from gpt_code_ui.kernel_program.kernel_manager import KernelManager # noqa: E402 -import gpt_code_ui.kernel_program.kernel_manager as kernel_manager -import gpt_code_ui.kernel_program.config as config -import gpt_code_ui.kernel_program.utils as utils +kernel_manager = KernelManager() -APP_PORT = int(os.environ.get("API_PORT", 5010)) +class WatchdogThread(StoppableThread): + def __init__(self, kernel_manager, *args, **kwargs): + super().__init__(*args, **kwargs) + self._logger = config.get_logger("Watchdog Thread") + self._kernel_manager = kernel_manager -# Get global logger -logger = config.get_logger() + def run(self): + while not self.stopped(timeout=config.WATCHDOG_INTERVAL_S): + km = self._kernel_manager + timeout_limit = datetime.now() - timedelta(seconds=config.KERNEL_TIMEOUT_S) -# Note, only one kernel_manager_process can be active -kernel_manager_process = None + self._logger.info(f"Purging kernels accessed before {timeout_limit}") + expired_sessions = [] + for session_id, kernel in km.items(): + if hasattr(kernel, "last_access") and kernel.last_access < timeout_limit: + self._logger.info( + f"Kernel for session {session_id} expired, last access: {kernel.last_access} which was more than {config.KERNEL_TIMEOUT_S}s ago." + ) + expired_sessions.append(session_id) -# Use efficient Python queues to store messages -result_queue = Queue() -send_queue = Queue() + km.purge_kernels(expired_sessions) -messaging = None # We know this Flask app is for local use. So we can disable the verbose Werkzeug logger -log = logging.getLogger('werkzeug') -log.setLevel(logging.ERROR) +logging.getLogger("werkzeug").setLevel(logging.ERROR) -cli = sys.modules['flask.cli'] -cli.show_server_banner = lambda *x: None +cli = sys.modules["flask.cli"] +cli.show_server_banner = lambda *x: None # type: ignore app = Flask(__name__) CORS(app) -def start_kernel_manager(): - global kernel_manager_process - - kernel_manager_script_path = os.path.join( - pathlib.Path(__file__).parent.resolve(), "kernel_manager.py" - ) - kernel_manager_process = subprocess.Popen( - [sys.executable, kernel_manager_script_path] - ) - - # Write PID as .pid to config.KERNEL_PID_DIR - os.makedirs(config.KERNEL_PID_DIR, exist_ok=True) - with open(os.path.join(config.KERNEL_PID_DIR, "%d.pid" % kernel_manager_process.pid), "w") as p: - p.write("kernel_manager") - -def cleanup_kernel_program(): - kernel_manager.cleanup_spawned_processes() -async def start_snakemq(): - global messaging +def kernel_specific(func): + @wraps(func) + def wrapper(session_id, *args, **kwargs): + kernel = kernel_manager.get(session_id) + kernel.last_access = datetime.now() + return func(kernel, *args, **kwargs) - messaging, link = utils.init_snakemq(config.IDENT_MAIN) + return wrapper - def on_recv(conn, ident, message): - message = json.loads(message.data.decode("utf-8")) - if message["type"] == "status": - if message["value"] == "ready": - logger.debug("Kernel is ready.") - result_queue.put({ - "value":"Kernel is ready.", - "type": "message" - }) - - elif message["type"] in ["message", "message_raw", "image/png", "image/jpeg"]: - # TODO: 1:1 kernel <> channel mapping - logger.debug("%s of type %s" % (message["value"], message["type"])) +@app.route("/api/", methods=["POST", "GET"]) +@kernel_specific +def handle_request(kernel: Kernel): + if request.method == "GET": + # Handle GET requests by sending everything that is in the receive_queue + return jsonify({"results": kernel.get_results(), "status": kernel.status}) + elif request.method == "POST": + kernel.execute(request.json) + return jsonify({"result": "success", "status": kernel.status}) - result_queue.put({ - "value": message["value"], - "type": message["type"] - }) - messaging.on_message_recv.add(on_recv) - logger.info("Starting snakemq loop") +@app.route("/status/", methods=["POST", "GET"]) +@kernel_specific +def handle_status(kernel: Kernel): + if request.method == "POST": + kernel.set_status(request.json["status"]) - def send_queued_messages(): - while True: - if send_queue.qsize() > 0: - message = send_queue.get() - utils.send_json(messaging, - {"type": "execute", "value": message["command"]}, - config.IDENT_KERNEL_MANAGER - ) - time.sleep(0.1) + return jsonify({"result": "success", "status": kernel.status}) - async def async_send_queued_messages(): - loop = asyncio.get_event_loop() - await loop.run_in_executor(None, send_queued_messages) - async def async_link_loop(): - loop = asyncio.get_event_loop() - await loop.run_in_executor(None, link.loop) +@app.route("/restart/", methods=["POST"]) +@kernel_specific +def handle_restart(kernel: Kernel): + kernel.restart() + return jsonify({"result": "success", "status": kernel.status}) - # Wrap the snakemq_link.Link loop in an asyncio task - await asyncio.gather(async_send_queued_messages(), async_link_loop()) +@app.route("/interrupt/", methods=["POST"]) +@kernel_specific +def handle_interrupt(kernel: Kernel): + kernel.interrupt() + return jsonify({"result": "success", "status": kernel.status}) -@app.route("/api", methods=["POST", "GET"]) -def handle_request(): - - if request.method == "GET": - # Handle GET requests by sending everything that's in the receive_queue - results = [result_queue.get() for _ in range(result_queue.qsize())] - return jsonify({"results": results}) - elif request.method == "POST": - data = request.json - send_queue.put(data) +@app.route("/workdir/", methods=["GET"]) +@kernel_specific +def handle_workdir(kernel: Kernel): + return jsonify({"result": str(kernel.workdir)}) - return jsonify({"result": "success"}) - -@app.route("/restart", methods=["POST"]) -def handle_restart(): - cleanup_kernel_program() - start_kernel_manager() +@app.route("/sessions", methods=["GET"]) +def list_sessions(): + result = [ + { + "id": num, + "last_access": str(getattr(kernel, "last_access", 0)), + # do NOT hand out the session ids + } + for num, (session_id, kernel) in enumerate(kernel_manager.items()) + ] - return jsonify({"result": "success"}) + return jsonify({"result": result}) -async def main(): - start_kernel_manager() +def main(): + # Monitor last access to kernels, remove all that have not been accessed in a while + watchdog_thread = WatchdogThread( + name="Kernel Manager Watchdog Thread", + kernel_manager=kernel_manager, + ) - # Run Flask app in a separate thread - flask_thread = threading.Thread(target=run_flask_app) - flask_thread.start() + watchdog_thread.start() + atexit.register(lambda: cleanup(watchdog_thread)) + app.run(host="0.0.0.0", port=config.KERNEL_APP_PORT) - # Run in background - await start_snakemq() +def cleanup(watchdog_thread): + watchdog_thread.stop(wait=True) + kernel_manager.terminate() -def run_flask_app(): - app.run(host="0.0.0.0", port=APP_PORT) if __name__ == "__main__": - asyncio.run(main()) - - - - \ No newline at end of file + main() diff --git a/gpt_code_ui/kernel_program/stoppable_thread.py b/gpt_code_ui/kernel_program/stoppable_thread.py new file mode 100644 index 00000000..c8b35fb2 --- /dev/null +++ b/gpt_code_ui/kernel_program/stoppable_thread.py @@ -0,0 +1,21 @@ +import threading + + +class StoppableThread(threading.Thread): + """Thread class with a stop() method. The thread itself has to check + regularly for the stopped() condition.""" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self._stop_event = threading.Event() + + def stop(self, wait: bool = False): + self._stop_event.set() + if wait: + self.join() + + def stopped(self, timeout=None): + if timeout is not None: + return self._stop_event.wait(timeout) + else: + return self._stop_event.is_set() diff --git a/gpt_code_ui/kernel_program/utils.py b/gpt_code_ui/kernel_program/utils.py index cce7d704..3e830e51 100644 --- a/gpt_code_ui/kernel_program/utils.py +++ b/gpt_code_ui/kernel_program/utils.py @@ -1,29 +1,73 @@ +import os +import pathlib import re -import json -import snakemq.link -import snakemq.packeter -import snakemq.messaging -import snakemq.message +import subprocess +import sys +import venv -import gpt_code_ui.kernel_program.config as config def escape_ansi(line): ansi_escape = re.compile(r"(?:\x1B[@-_]|[\x80-\x9F])[0-?]*[ -/]*[@-~]") return ansi_escape.sub("", line) -def send_json(messaging, message, identity): - message = snakemq.message.Message(json.dumps(message).encode("utf-8"), ttl=600) - messaging.send_message(identity, message) - -def init_snakemq(ident, init_type="listen"): - link = snakemq.link.Link() - packeter = snakemq.packeter.Packeter(link) - messaging = snakemq.messaging.Messaging(ident, "", packeter) - if init_type == "listen": - link.add_listener(("localhost", config.SNAKEMQ_PORT)) - elif init_type == "connect": - link.add_connector(("localhost", config.SNAKEMQ_PORT)) - else: - raise Exception("Unsupported init type.") - return messaging, link \ No newline at end of file +def create_venv(venv_dir: pathlib.Path, install_default_packages: bool) -> pathlib.Path: + venv_bindir = venv_dir / "bin" + venv_python_executable = venv_bindir / os.path.basename(sys.executable) + + if not os.path.isdir(venv_dir): + # create virtual env inside venv_dir directory + venv.create(venv_dir, system_site_packages=True, with_pip=True, upgrade_deps=True) + + if install_default_packages: + # install wheel because some packages do not like being installed without + subprocess.run([venv_python_executable, "-m", "pip", "install", "wheel>=0.41,<1.0"]) + # install all default packages into the venv + default_packages = [ + "ipykernel>=6,<7", + "numpy>=1.24,<1.25", + "dateparser>=1.1,<1.2", + "pandas>=1.5,<1.6", + "geopandas>=0.13,<0.14", + "tabulate>=0.9.0<1.0", + "PyPDF2>=3.0,<3.1", + "pdfminer>=20191125,<20191200", + "pdfplumber>=0.9,<0.10", + "matplotlib>=3.7,<3.8", + "openpyxl>=3.1.2,<4", + "rdkit>=2023.3.3", + "py3Dmol>=2.0.4", + "bio>=1.6.2", + "scipy==1.11.1", + "scikit-learn==1.3.0", + "wordcloud>=1.9.3", + "XlsxWriter>=3.1.9", + "docx>=0.2.4", + ] + subprocess.run([str(venv_python_executable), "-m", "pip", "install"] + default_packages) + + # get base env library path as we need this to refer to this form a derived venv + site_packages = subprocess.check_output( + [ + venv_python_executable, + "-c", + 'import sysconfig; print(sysconfig.get_paths()["purelib"])', + ] + ) + site_packages_decoded = site_packages.decode("utf-8").split("\n")[0] + + return pathlib.Path(site_packages_decoded) + + +def create_derived_venv(base_venv: pathlib.Path, venv_dir: pathlib.Path): + site_packages_base = create_venv(base_venv, install_default_packages=True) + site_packages_derived = create_venv(venv_dir, install_default_packages=False) + + # create a link from derived venv into the base venv, see https://stackoverflow.com/a/75545634 + with open(site_packages_derived / "_base_packages.pth", "w") as pth: + pth.write(f"{site_packages_base}\n") + + venv_bindir = venv_dir / "bin" + venv_python_executable = venv_bindir / os.path.basename(sys.executable) + + return venv_bindir, venv_python_executable diff --git a/gpt_code_ui/main.py b/gpt_code_ui/main.py index 5683608b..0612ab9d 100644 --- a/gpt_code_ui/main.py +++ b/gpt_code_ui/main.py @@ -2,107 +2,95 @@ # webapp is a Flask app (in webapp/main.py relative to this main.py) # kernel_program is a Python script (in kernel_program/main.py relative to this main.py) - +import multiprocessing +import multiprocessing.connection import sys -import logging -import asyncio import time import webbrowser -from multiprocessing import Process - -from gpt_code_ui.webapp.main import app, APP_PORT -from gpt_code_ui.kernel_program.main import main as kernel_program_main, cleanup_kernel_program +import gpt_code_ui.kernel_program.config as config +from gpt_code_ui.kernel_program.main import main as kernel_program_main +from gpt_code_ui.webapp.main import APP_PORT, app APP_URL = "http://localhost:%s" % APP_PORT -def run_webapp(): + +def run_webapp(logger): try: app.run(host="0.0.0.0", port=APP_PORT, use_reloader=False) - except Exception as e: - logging.exception("Error running the webapp:") + except Exception: + logger.exception("Error running the webapp") sys.exit(1) -def run_kernel_program(): + +def run_kernel_program(logger): try: - asyncio.run(kernel_program_main()) - except Exception as e: - logging.exception("Error running the kernel_program:") + kernel_program_main() + except Exception: + logger.exception("Error running the kernel_program") sys.exit(1) -def setup_logging(): - log_format = "%(asctime)s [%(levelname)s]: %(message)s" - logging.basicConfig(level=logging.INFO, format=log_format) - log_filename = "app.log" - file_handler = logging.FileHandler(log_filename) - file_handler.setFormatter(logging.Formatter(log_format)) - logging.getLogger().addHandler(file_handler) - -def print_color(text, color="gray"): - # Default to gray - code="242" - - if color == "green": - code="35" - - gray_code = "\033[38;5;%sm" % code - reset_code = "\033[0m" - print(f"{gray_code}{text}{reset_code}") - - -def print_banner(): - - print(""" + +def start_subprocess(name, proc, logger): + process = multiprocessing.Process(target=proc, name=name, args=[logger]) + process.start() + return process + + +def print_banner(logger): + logger.info( + """ █▀▀ █▀█ ▀█▀ ▄▄ █▀▀ █▀█ █▀▄ █▀▀ █▄█ █▀▀ ░█░ ░░ █▄▄ █▄█ █▄▀ ██▄ - """) + """ + ) + logger.info("> Open GPT-Code UI in your browser %s" % APP_URL) + logger.info("You can inspect detailed logs in app.log.") + logger.info("Contribute to GPT-Code UI at https://github.com/ricklamers/gpt-code-ui") - print("> Open GPT-Code UI in your browser %s" % APP_URL) - print("") - print("You can inspect detailed logs in app.log.") - print("") - print("Find your OpenAI API key at https://platform.openai.com/account/api-keys") - print("") - print_color("Contribute to GPT-Code UI at https://github.com/ricklamers/gpt-code-ui") def main(): - setup_logging() + logger = config.get_logger("GPT Code UI") - webapp_process = Process(target=run_webapp) - kernel_program_process = Process(target=run_kernel_program) + SUBPROCESSES = { + "WebApp": run_webapp, + "Kernel API": run_kernel_program, + } try: - webapp_process.start() - kernel_program_process.start() + subprocesses = {name: start_subprocess(name, proc, logger) for name, proc in SUBPROCESSES.items()} # Poll until the webapp is running while True: try: app.test_client().get("/") break - except: + except Exception: time.sleep(0.1) - - print_banner() - + + print_banner(logger) + webbrowser.open(APP_URL) - webapp_process.join() - kernel_program_process.join() + while True: + multiprocessing.connection.wait(process.sentinel for process in subprocesses.values()) + + for name in list(subprocesses.keys()): + if (exitcode := subprocesses[name].exitcode) is not None: + logger.info(f"{name} process terminated with exit code {exitcode}. Restarting.") + subprocesses[name] = start_subprocess(name, SUBPROCESSES[name], logger) - except KeyboardInterrupt: - print("Terminating processes...") - - cleanup_kernel_program() - kernel_program_process.terminate() + logger.info("Terminating processes...") + + for process in subprocesses.values(): + process.terminate() + + for process in subprocesses.values(): + process.join() - webapp_process.terminate() + logger.info("Processes terminated.") - webapp_process.join() - kernel_program_process.join() - print("Processes terminated.") - -if __name__ == '__main__': +if __name__ == "__main__": main() diff --git a/gpt_code_ui/st_playground.py b/gpt_code_ui/st_playground.py new file mode 100644 index 00000000..ea362c8b --- /dev/null +++ b/gpt_code_ui/st_playground.py @@ -0,0 +1,63 @@ +import asyncio + +import streamlit as st + +from gpt_code_ui.webapp.main import AVAILABLE_MODELS, ChatHistory, get_code +from gpt_code_ui.webapp.prompts import get_system_prompt + + +def is_initialized(): + return "initalized" in st.session_state and st.session_state["initalized"] + + +def reset_state(): + st.session_state["initalized"] = True + st.session_state["chat_history"] = ChatHistory() + + +def init(): + if not is_initialized(): + reset_state() + + +init() + + +def get_parameters() -> dict: + model = st.sidebar.selectbox( + "Model", + options=AVAILABLE_MODELS, + format_func=lambda model: model["displayName"], + ) + + return {"model": model["name"]} + + +st.set_page_config( + page_title="Prompting playground", + page_icon="🧪", +) +st.header("Prompting playground") +parameters = get_parameters() + +system_prompt = st.text_area("System Prompt", get_system_prompt(), height=300) + + +chat_history: ChatHistory = st.session_state["chat_history"] +messages: list[dict] = chat_history(override_system_prompt=system_prompt) + +for message in messages[1:]: + with st.chat_message(name=message["role"]): + st.markdown(message["content"]) + +user_input = st.chat_input("User input") +if user_input: + chat_history.add_prompt(user_input) + messages = chat_history(override_system_prompt=system_prompt) + code, text, status = asyncio.run(get_code(messages=messages, model=parameters["model"])) + chat_history.add_answer(text) + st.rerun() + +if st.sidebar.button("Clear chat history"): + reset_state() + st.rerun() diff --git a/gpt_code_ui/webapp/llm.py b/gpt_code_ui/webapp/llm.py new file mode 100644 index 00000000..84417fa5 --- /dev/null +++ b/gpt_code_ui/webapp/llm.py @@ -0,0 +1,110 @@ +import json +import os + +import openai +import requests +from dotenv import load_dotenv + +load_dotenv(".env") + + +def get_available_models(): + available_models = os.environ.get( + "AVAILABLE_MODELS", + json.dumps( + [ + {"displayName": "GPT-3.5 16k", "name": "openai/gpt-35-turbo-16k"}, + {"displayName": "GPT-3.5 0613", "name": "openai/gpt-35-turbo-0613"}, + ] + ), + ) + + try: + return json.loads(available_models) + except json.JSONDecodeError as e: + raise ValueError( + f"List of available models is not a valid JSON, check environment variable AVAILABLE_MODELS: {available_models}." + ) from e + + +def call(messages, model: str = "openai/gpt-3.5-turbo"): + vendor = "openai" + if (sep := model.find("/")) > -1: + vendor = model[:sep] + model = model[sep + 1 :] + + # ############ Azure / OpenAI ############## + if vendor in ("openai", "azure"): + if vendor == "azure": + client = openai.AzureOpenAI( + azure_endpoint=os.environ["AZURE_API_BASE"], + api_key=os.environ["AZURE_API_KEY"], + api_version=os.environ.get("AZURE_API_VERSION", None), + ) + else: + client = openai.OpenAI( + api_key=os.environ["OPENAI_API_KEY"], + ) + + arguments = dict( + temperature=0.7, + messages=messages, + ) + + try: + result_GPT = client.chat.completions.create( + model=model, + **arguments, + ) + + if hasattr(result_GPT, "error") and result_GPT.error is not None: + raise RuntimeError(f"Error: {result_GPT.error['code']}, Message: {result_GPT.error['message']}") + + if result_GPT.choices is None: + raise RuntimeError(f"Malformed answer from API: {result_GPT}") + + if result_GPT.choices[0].finish_reason == "content_filter": + raise RuntimeError("Content Filter") + + except openai.OpenAIError as e: + raise RuntimeError(f"Error from API: {e}") from e + + try: + return result_GPT.choices[0].message.content + except AttributeError as e: + raise RuntimeError(f"Malformed answer from API: {result_GPT}") from e + + # ###### Bedrock behind a very simple gateway (NOT the actual Bedrock API) ###### + elif vendor == "bedrock_gateway": + if (sep := model.find(".")) > -1: + base_vendor = model[:sep] + + if base_vendor == "anthropic": + ROLE_MAP = { + "system": "", + "user": "\n\nHuman: ", + "assistant": "\n\nAssistant: ", + } + + arguments = dict( + temperature=0.7, + max_tokens_to_sample=4000, + prompt="".join((ROLE_MAP[m["role"]] + m["content"]) for m in messages) + ROLE_MAP["assistant"], + ) + else: + raise RuntimeError(f"Unsupported bedrock base vendor: {base_vendor}") + + response = requests.request( + method="POST", + url=f"{os.environ['BEDROCK_GATEWAY_API_BASE']}/{model}/invoke", + headers={"x-api-key": os.environ["BEDROCK_GATEWAY_API_KEY"]}, + data=json.dumps(arguments), + ) + + return response.json()["completion"] + else: + raise RuntimeError(f"Malformed bedrock model ID: {model}. Expected format 'BASE_VENDOR.MODEL'.") + + # ############ Others ############## + else: + raise RuntimeError(f"Unsupported vendor {vendor} with model {model} requested.") diff --git a/gpt_code_ui/webapp/main.py b/gpt_code_ui/webapp/main.py index 332986e5..d3a04f89 100644 --- a/gpt_code_ui/webapp/main.py +++ b/gpt_code_ui/webapp/main.py @@ -1,64 +1,122 @@ # The GPT web UI as a template based Flask app -import os -import requests import asyncio import json -import re import logging +import os +import re import sys -import openai -import pandas as pd +import uuid +from collections import defaultdict +from functools import wraps +from pathlib import Path +from typing import Dict, List -from collections import deque - -from flask_cors import CORS -from flask import Flask, request, jsonify, send_from_directory, Response +import pandas as pd +import pandas.api.types as pd_types +import requests from dotenv import load_dotenv +from flask import Flask, Response, jsonify, request, send_from_directory, session +from flask_cors import CORS +from foundry_dev_tools import FoundryRestClient +from foundry_dev_tools.foundry_api_client import FoundryAPIError -from gpt_code_ui.kernel_program.main import APP_PORT as KERNEL_APP_PORT +from gpt_code_ui.kernel_program import config +from gpt_code_ui.webapp import llm +from gpt_code_ui.webapp.prompts import get_system_prompt -load_dotenv('.env') +load_dotenv(".env") -openai.api_version = os.environ.get("OPENAI_API_VERSION") -openai.log = os.getenv("OPENAI_API_LOGLEVEL") -OPENAI_EXTRA_HEADERS = json.loads(os.environ.get("OPENAI_EXTRA_HEADERS", "{}")) +AVAILABLE_MODELS = llm.get_available_models() +SESSION_ENCRYPTION_KEY = os.environ["SESSION_ENCRYPTION_KEY"] +APP_PORT = int(os.environ.get("WEB_PORT", 8080)) +FOUNDRY_DATA_FOLDER = os.getenv( + "FOUNDRY_DATA_FOLDER", "/Global/Foundry Training and Resources/Example Data/Aviation Ontology" +) -if openai.api_type == "open_ai": - AVAILABLE_MODELS = json.loads(os.environ.get("OPENAI_MODELS", '''[{"displayName": "GPT-3.5", "name": "gpt-3.5-turbo"}, {"displayName": "GPT-4", "name": "gpt-4"}]''')) -elif openai.api_type == "azure": - try: - AVAILABLE_MODELS = json.loads(os.environ["AZURE_OPENAI_DEPLOYMENTS"]) - except KeyError as e: - raise RuntimeError('AZURE_OPENAI_DEPLOYMENTS environment variable not set') from e -else: - raise ValueError(f'Invalid OPENAI_API_TYPE: {openai.api_type}') -UPLOAD_FOLDER = 'workspace/' -os.makedirs(UPLOAD_FOLDER, exist_ok=True) +class ChatHistory: + def __init__(self, system_prompt: str = None): + self._buffer: List[Dict[str, str]] = list() + self._last_untruncated = None + self._truncation_maxlines = 20 + if system_prompt is None: + system_prompt = get_system_prompt() -APP_PORT = int(os.environ.get("WEB_PORT", 8080)) + self._append("system", system_prompt) + def _append(self, role: str, content: str, name: str = None): + if role not in ("user", "assistant", "system"): + raise ValueError(f"Invalid role: {role}") -class LimitedLengthString: - def __init__(self, maxlen=2000): - self.data = deque() - self.len = 0 - self.maxlen = maxlen + entry = {"role": role, "content": content} + if name is not None: + entry["name"] = name - def append(self, string): - self.data.append(string) - self.len += len(string) - while self.len > self.maxlen: - popped = self.data.popleft() - self.len -= len(popped) + self._buffer.append(entry) - def get_string(self): - result = ''.join(self.data) - return result[-self.maxlen:] + def _extend_or_append(self, role: str, prefix: str, content: str, name: str = None) -> bool: + """Returns true if a new entry has been created (i.e. append instead of extend)""" + last = self._buffer[-1] + if last["role"] == role and last.get("name", None) == name: + last["content"] += content + return False + else: + self._append(role, f"{prefix}\n{content}", name) + return True + + def _truncate(self, s: str) -> str: + return "\n".join(s.splitlines()[: self._truncation_maxlines]) + + def _update_truncation(self): + if self._last_untruncated is not None: + self._buffer[self._last_untruncated]["content"] = self._truncate( + self._buffer[self._last_untruncated]["content"] + ) + self._last_untruncated = len(self._buffer) - 1 + + def add_prompt(self, prompt: str): + self._append("user", prompt, "User") + + def add_answer(self, answer: str): + self._append("assistant", answer) + + def upload_file(self, filename: str, file_info: str = None): + self._append( + "user", + f"In the following, I will refer to the file {filename}.\n{file_info}", + ) + + def add_execution_result(self, result: str): + if self._extend_or_append( + "user", + "These are the first lines of the output generated when executing the code:", + result, + "Computer", + ): + self._update_truncation() + + def add_error(self, message: str): + if self._extend_or_append( + "user", + "Executing this code lead to an error.\nThe first lines of the error message read:", + message, + "Computer", + ): + self._update_truncation() + + def __call__(self, exclude_system: bool = False, override_system_prompt: str = None): + if exclude_system: + return [entry for entry in self._buffer if entry["role"] != "system"] + elif override_system_prompt is not None: + buffer = [entry for entry in self._buffer if entry["role"] != "system"] + buffer.insert(0, {"role": "system", "content": override_system_prompt}) + return buffer + else: + return self._buffer -message_buffer = LimitedLengthString() +chat_history: Dict[str, ChatHistory] = defaultdict(ChatHistory) def allowed_file(filename): @@ -66,134 +124,106 @@ def allowed_file(filename): def inspect_file(filename: str) -> str: + NUM_SAMPLE_ROWS = 5 READER_MAP = { - '.csv': pd.read_csv, - '.tsv': pd.read_csv, - '.xlsx': pd.read_excel, - '.xls': pd.read_excel, - '.xml': pd.read_xml, - '.json': pd.read_json, - '.hdf': pd.read_hdf, - '.hdf5': pd.read_hdf, - '.feather': pd.read_feather, - '.parquet': pd.read_parquet, - '.pkl': pd.read_pickle, - '.sql': pd.read_sql, + ".csv": pd.read_csv, + ".tsv": pd.read_csv, + ".xlsx": pd.read_excel, + ".xls": pd.read_excel, + ".xml": pd.read_xml, + ".json": pd.read_json, + ".hdf": pd.read_hdf, + ".hdf5": pd.read_hdf, + ".feather": pd.read_feather, + ".parquet": pd.read_parquet, + ".pkl": pd.read_pickle, + ".sql": pd.read_sql, } + def _convert_type(t): + if pd_types.is_string_dtype(t): + return "string" + elif pd_types.is_integer_dtype(t): + return "integer" + elif pd_types.is_float_dtype(t): + return "float" + else: + return t + _, ext = os.path.splitext(filename) try: - df = READER_MAP[ext.lower()](filename) - return f'The file contains the following columns: {", ".join(df.columns)}' + df: pd.DataFrame = READER_MAP[ext.lower()](filename) + column_table = "| Column Name | Column Type |\n| ----------- | ----------- |\n" + "\n".join( + [f"| {n} | {_convert_type(t)} |" for n, t in df.dtypes.items()] + ) + return f"""The file contains the following columns: +{column_table} + +The table has {len(df.index)} rows. The first {NUM_SAMPLE_ROWS} rows read +{df.head(NUM_SAMPLE_ROWS).to_markdown()} +""" except KeyError: - return '' # unsupported file type + return "" # unsupported file type except Exception: - return '' # file reading failed. - Don't want to know why. - - -async def get_code(user_prompt, user_openai_key=None, model="gpt-3.5-turbo"): - - prompt = f"""First, here is a history of what I asked you to do earlier. - The actual prompt follows after ENDOFHISTORY. - History: - {message_buffer.get_string()} - ENDOFHISTORY. - Write Python code, in a triple backtick Markdown code block, that does the following: - {user_prompt} - - Notes: - First, think step by step what you want to do and write it down in English. - Then generate valid Python code in a code block - Make sure all code is valid - it be run in a Jupyter Python 3 kernel environment. - Define every variable before you use it. - For data munging, you can use - 'numpy', # numpy==1.24.3 - 'dateparser' #dateparser==1.1.8 - 'pandas', # matplotlib==1.5.3 - 'geopandas' # geopandas==0.13.2 - For pdf extraction, you can use - 'PyPDF2', # PyPDF2==3.0.1 - 'pdfminer', # pdfminer==20191125 - 'pdfplumber', # pdfplumber==0.9.0 - For data visualization, you can use - 'matplotlib', # matplotlib==3.7.1 - Be sure to generate charts with matplotlib. If you need geographical charts, use geopandas with the geopandas.datasets module. - If the user has just uploaded a file, focus on the file that was most recently uploaded (and optionally all previously uploaded files) - - Teacher mode: if the code modifies or produces a file, at the end of the code block insert a print statement that prints a link to it as HTML string: Download file. Replace INSERT_FILENAME_HERE with the actual filename.""" - - if user_openai_key: - openai.api_key = user_openai_key - - arguments = dict( - temperature=0.7, - headers=OPENAI_EXTRA_HEADERS, - messages=[ - # {"role": "system", "content": system}, - {"role": "user", "content": prompt}, - ] - ) - - if openai.api_type == 'open_ai': - arguments["model"] = model - elif openai.api_type == 'azure': - arguments["deployment_id"] = model - else: - return None, f"Error: Invalid OPENAI_PROVIDER: {openai.api_type}", 500 - - try: - result_GPT = openai.ChatCompletion.create(**arguments) - - if 'error' in result_GPT: - raise openai.APIError(code=result_GPT.error.code, message=result_GPT.error.message) + return "" # file reading failed. - Don't want to know why. - if result_GPT.choices[0].finish_reason == 'content_filter': - raise openai.APIError('Content Filter') - - except openai.OpenAIError as e: - return None, f"Error from API: {e}", 500 +async def get_code(messages, model="openai/gpt-3.5-turbo"): try: - content = result_GPT.choices[0].message.content + content = llm.call(messages, model=model) + except RuntimeError as e: + return None, str(e), 500 + else: - except AttributeError: - return None, f"Malformed answer from API: {content}", 500 + def extract_code(text): + # Match triple backtick blocks first + triple_match = re.search( + r"```(?:(?:[^\r\n]*[pP]ython[^\r\n]*[\r\n])|(?:\w+\n))?(.+?)```", + text, + re.DOTALL, + ) + if triple_match: + return triple_match.group(1).strip() + else: + # If no triple backtick blocks, match single backtick blocks + single_match = re.search(r"`(.+?)`", text, re.DOTALL) + if single_match: + return single_match.group(1).strip() - def extract_code(text): - # Match triple backtick blocks first - triple_match = re.search(r'```(?:\w+\n)?(.+?)```', text, re.DOTALL) - if triple_match: - return triple_match.group(1).strip() - else: - # If no triple backtick blocks, match single backtick blocks - single_match = re.search(r'`(.+?)`', text, re.DOTALL) - if single_match: - return single_match.group(1).strip() + return extract_code(content), content.strip(), 200 - return extract_code(content), content.strip(), 200 # We know this Flask app is for local use. So we can disable the verbose Werkzeug logger -log = logging.getLogger('werkzeug') +log = logging.getLogger("werkzeug") log.setLevel(logging.ERROR) -cli = sys.modules['flask.cli'] -cli.show_server_banner = lambda *x: None +cli = sys.modules["flask.cli"] +cli.show_server_banner = lambda *x: None # type: ignore app = Flask(__name__) -app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER +app.secret_key = SESSION_ENCRYPTION_KEY CORS(app) -@app.route('/') -def index(): +def session_id_required(function_to_protect): + @wraps(function_to_protect) + def wrapper(*args, **kwargs): + if (session_id := session.get("session_id", None)) is None: + session_id = str(uuid.uuid4()) + session["session_id"] = session_id + + logger = config.get_logger(f"WebApp {session_id}") + + return function_to_protect(session_id, logger, *args, **kwargs) + + return wrapper - # Check if index.html exists in the static folder - if not os.path.exists(os.path.join(app.root_path, 'static/index.html')): - print("index.html not found in static folder. Exiting. Did you forget to run `make compile_frontend` before installing the local package?") - return send_from_directory('static', 'index.html') +@app.route("/") +def index(): + return send_from_directory("static", "index.html") @app.route("/models") @@ -201,85 +231,225 @@ def models(): return jsonify(AVAILABLE_MODELS) -@app.route('/api/', methods=["GET", "POST"]) -def proxy_kernel_manager(path): - if request.method == "POST": - resp = requests.post( - f'http://localhost:{KERNEL_APP_PORT}/{path}', json=request.get_json()) - else: - resp = requests.get(f'http://localhost:{KERNEL_APP_PORT}/{path}') - - excluded_headers = ['content-encoding', - 'content-length', 'transfer-encoding', 'connection'] - headers = [(name, value) for (name, value) in resp.raw.headers.items() - if name.lower() not in excluded_headers] +@app.route("/sessions") +def sessions(): + resp = requests.get(f"http://localhost:{config.KERNEL_APP_PORT}/sessions") - response = Response(resp.content, resp.status_code, headers) - return response + return resp.content, resp.status_code, resp.headers.items() -@app.route('/assets/') +@app.route("/assets/") def serve_static(path): - return send_from_directory('static/assets/', path) + return send_from_directory("static/assets/", path) -@app.route('/download') -def download_file(): +@app.route("/api/", methods=["GET", "POST"]) +@session_id_required +def proxy_kernel_manager(session_id, logger, path): + backend_url = f"http://localhost:{config.KERNEL_APP_PORT}/{path}/{session_id}" - # Get query argument file - file = request.args.get('file') - # from `workspace/` send the file - # make sure to set required headers to make it download the file - return send_from_directory(os.path.join(os.getcwd(), 'workspace'), file, as_attachment=True) + try: + if request.method == "POST": + resp = requests.post(backend_url, json=request.get_json()) + else: + resp = requests.get(backend_url) + except requests.exceptions.ConnectionError as e: + return jsonify({"message": f"Failed to communicate with backend server: {e}."}), 500 + + # store execution results in conversation history to allow back-references by the user + content = json.loads(resp.content) + for res in content.get("results", []): + if res["type"] == "message": + chat_history[session_id].add_execution_result(res["value"]) + elif res["type"] == "message_error": + chat_history[session_id].add_error(res["value"]) + logger.debug(session_id, res) -@app.route('/inject-context', methods=['POST']) -def inject_context(): - user_prompt = request.json.get('prompt', '') + excluded_headers = [ + "content-encoding", + "content-length", + "transfer-encoding", + "connection", + ] + headers = [(name, value) for (name, value) in resp.raw.headers.items() if name.lower() not in excluded_headers] - # Append all messages to the message buffer for later use - message_buffer.append(user_prompt + "\n\n") + # inject the conversation history into the results + content["chat_history"] = chat_history[session_id](exclude_system=True) + return Response(json.dumps(content), resp.status_code, headers) + + +@app.route("/download") +@session_id_required +def download_file(session_id, logger): + # Get query argument file + file = request.args.get("file") + # find out the workspace directory corresponding to the specific session + resp = requests.get(f"http://localhost:{config.KERNEL_APP_PORT}/workdir/{session_id}") + if resp.status_code == 200: + workdir = resp.json()["result"] + else: + return resp, resp.status_code + + logger.info(f"Downloading '{file}' from '{workdir}'.") + return send_from_directory(workdir, file, as_attachment=True) + + +@app.route("/clear_history", methods=["POST"]) +@session_id_required +def clear_history(session_id, logger): + logger.info("Clearing chat history") + del chat_history[session_id] return jsonify({"result": "success"}) -@app.route('/generate', methods=['POST']) -def generate_code(): - user_prompt = request.json.get('prompt', '') - user_openai_key = request.json.get('openAIKey', None) - model = request.json.get('model', None) +@app.route("/generate", methods=["POST"]) +@session_id_required +def generate_code(session_id, logger): + requests.post( + f"http://localhost:{config.KERNEL_APP_PORT}/status/{session_id}", + json={"status": "generating"}, + ) + + user_prompt = request.json.get("prompt", "") + model = request.json.get("model", None) + + logger.info(f"Code generation reuqested with model '{model}'. Prompt:\n{user_prompt}") loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) - code, text, status = loop.run_until_complete( - get_code(user_prompt, user_openai_key, model)) + chat_history[session_id].add_prompt(user_prompt) + + code, text, status = loop.run_until_complete(get_code(chat_history[session_id](), model)) loop.close() - # Append all messages to the message buffer for later use - message_buffer.append(user_prompt + "\n\n") + if status == 200: + chat_history[session_id].add_answer(text) + + requests.post( + f"http://localhost:{config.KERNEL_APP_PORT}/status/{session_id}", + json={"status": "ready"}, + ) - return jsonify({'code': code, 'text': text}), status + logger.info(f"\n== Answer ==\n{text}\n\n== Extracted Code ==\n {code}") + return jsonify({"code": code, "text": text}), status -@app.route('/upload', methods=['POST']) -def upload_file(): +@app.route("/upload", methods=["POST"]) +@session_id_required +def upload_file(session_id, logger): # check if the post request has the file part - if 'file' not in request.files: - return jsonify({'error': 'No file part in the request'}), 400 - file = request.files['file'] - # if user does not select file, browser also - # submit an empty part without filename - if file.filename == '': - return jsonify({'error': 'No selected file'}), 400 + if "file" not in request.files: + return jsonify({"error": "No file part in the request"}), 400 + file = request.files["file"] + # if user does not select file, browser also submit an empty part without filename + if file.filename == "": + return jsonify({"error": "No selected file"}), 400 if file and allowed_file(file.filename): - file_target = os.path.join(app.config['UPLOAD_FOLDER'], file.filename) + # find out the workspace directory corresponding to the specific session + resp = requests.get(f"http://localhost:{config.KERNEL_APP_PORT}/workdir/{session_id}") + if resp.status_code == 200: + workdir = resp.json()["result"] + else: + return resp, resp.status_code + + logger.info(f"Uploading file '{file.filename}' to '{workdir}'") + + file_target = os.path.join(workdir, file.filename) file.save(file_target) file_info = inspect_file(file_target) - return jsonify({'message': f'File {file.filename} uploaded successfully.\n{file_info}'}), 200 + chat_history[session_id].upload_file(file.filename, file_info) + return jsonify({"message": f"File `{file.filename}` uploaded successfully.\n{file_info}"}), 200 else: - return jsonify({'error': 'File type not allowed'}), 400 + return jsonify({"message": "File type not supported."}), 400 -if __name__ == '__main__': - app.run(host="0.0.0.0", port=APP_PORT, debug=True, use_reloader=False) +@app.route("/foundry_files", methods=["GET", "POST"]) +@session_id_required +def foundry_files(session_id, logger, folder=None): + try: + fc = FoundryRestClient() + except ValueError as e: + logger.exception(e) + return "Foundry access misconfigured on server", 500 + + if request.method == "POST": + req = request.get_json() + dataset_rid = req["dataset_rid"] + + # find out the workspace directory corresponding to the specific session + resp = requests.get(f"http://localhost:{config.KERNEL_APP_PORT}/workdir/{session_id}") + if resp.status_code == 200: + workdir = resp.json()["result"] + else: + return resp, resp.status_code + + try: + files = fc.download_dataset_files(dataset_rid, workdir) + except requests.exceptions.HTTPError as e: + logger.exception(e) + return e.response.json().get("errorCode", "Unknown Error"), e.response.status_code + + results = [] + http_code = 400 + for file in files: + filename = os.path.relpath(file, workdir) + + if allowed_file(file): + file_info = inspect_file(file) + chat_history[session_id].upload_file(filename, file_info) + + results.append( + { + "filename": filename, + "message": f"File `{filename}` downloaded successfully.\n{file_info}", + } + ) + http_code = 200 + else: + results.append({"filename": filename, "message": "File type not supported."}) + + return jsonify(results), http_code + else: + folder = request.args.get("folder", FOUNDRY_DATA_FOLDER) + + try: + if folder.startswith("/"): + # this is a path - query the RID + folder_rid = fc.get_dataset_rid(folder) + else: + # this must be an RID - query the path + folder_rid, folder = folder, fc.get_dataset_path(folder) + + files = fc.get_child_objects_of_folder(folder_rid) + + parent_folder = str(Path(folder).parent) + parent_rid = fc.get_dataset_rid(parent_folder) + + return jsonify( + { + "self": {"name": str(Path(folder).name), "absolute_path": folder, "rid": folder_rid}, + "parent": { + "name": str(Path(parent_folder).name), + "absolute_path": parent_folder, + "rid": parent_rid, + }, + "children": [ + {"name": f["name"], "absolute_path": f'{folder}/{f["name"]}', "rid": f["rid"]} for f in files + ], + } + ) + except FoundryAPIError: + return "Folder not accessible", 404 + + +if __name__ == "__main__": + # Check if index.html exists in the static folder + if not os.path.exists(os.path.join(app.root_path, "static/index.html")): + raise RuntimeError( + "index.html not found in static folder. Exiting. Did you forget to run `make compile_frontend` before installing the local package?" + ) + else: + app.run(host="0.0.0.0", port=APP_PORT, debug=True, use_reloader=False) diff --git a/gpt_code_ui/webapp/prompts.py b/gpt_code_ui/webapp/prompts.py new file mode 100644 index 00000000..60d44154 --- /dev/null +++ b/gpt_code_ui/webapp/prompts.py @@ -0,0 +1,137 @@ +import types +from typing import Any, Callable, Dict, List + +from gpt_code_ui.function_library import AVAILABLE_FUNCTIONS +from gpt_code_ui.function_library.parser import get_function_signature, is_empty_annotation, is_empty_default +from gpt_code_ui.kernel_program.config import NO_INTERNET_AVAILABLE + +SYSTEM_PROMPT_TEMPLATE = """Write Python code, in a triple backtick Markdown code block, that answers the user prompts. + +Notes: + First, think step by step what you want to do and write it down in English. + Then generate valid Python code in a single code block. + Make sure all code is valid - it will Be run in a Jupyter Python 3 kernel environment. + Define every variable before you use it. + For data processing, you can use + 'numpy', # numpy==1.24.3 + 'dateparser' #dateparser==1.1.8 + 'pandas', # matplotlib==1.5.3 + 'geopandas', # geopandas==0.13.2 + 'tabulate', # tabulate==0.9.0 + 'scipy', # scipy==1.11.1 + 'scikit-learn', # scikit-learn==1.3.0 + 'WordCloud', # wordcloud==1.9.3" + For pdf extraction, you can use + 'PyPDF2', # PyPDF2==3.0.1 + 'pdfminer', # pdfminer==20191125 + 'pdfplumber', # pdfplumber==0.9.0 + For data visualization, you can use + 'matplotlib', # matplotlib==3.7.1 + For chemistry related tasks, you can use + 'rdkit', # rdkit>=2023.3.3 + For 3D visualizations of molecules (e.g. from file formats 'pdb', 'sdf', 'xyz', 'pqr', 'cub', or 'mol2'), you can use + 'py3Dmol', # py3Dmol==2.0.4 + + { f'''In addition you can use the following functions. DO NOT REDEFINE THEM: +{functions}''' if functions else '' } + + Be sure to generate charts with matplotlib. If you need geographical charts, use geopandas with the geopandas.datasets module. + Do not set or modify matplotlib fonts. Instead assume that fonts are selected automatically as needed. + For 3D visualizations of SMILEs strings, you need to use rdkit to convert them to a Mol block first as the `addModel` function of py3Dmol does not suport SMILEs strings directly. + { 'Do not try to install additional packages as no internet connection is available. Do not include any "!pip install PACKAGE" commands.' if NO_INTERNET_AVAILABLE else + 'If an additional package is required, you can add the corresponding "!pip install PACKAGE" call to the beginning of the code.' } + If the user requests to generate a table, produce code that prints a markdown table. + If the user has just uploaded a file, focus on the file that was most recently uploaded (and optionally all previously uploaded files) + If the code modifies or produces a file, at the end of the code block insert a print statement that prints a link to it as HTML string: Download file. Replace INSERT_FILENAME_HERE with the actual filename. + Do not use your own knowledge to answer the user prompt. Instead, focus on generating Python code for doing so.""" + + +def format_prompt(template: str, variables: Dict[str, Any]) -> str: + """Formats a prompt string. + + Args: + template (str): The template string. + variables (Dict): The variables to insert into the template. + + Returns: + The formatted prompt string. + """ + + _globals = { + "NO_INTERNET_AVAILABLE": NO_INTERNET_AVAILABLE, + } + + # Might be a security risk, so only use trusted templates + return eval(f'f"""{template}"""', _globals, variables) # noqa: W0123 + + +def get_system_prompt(template: str = SYSTEM_PROMPT_TEMPLATE, functions: List[Callable] = None) -> str: + """Gets the system prompt. + + Args: + template (str, optional): The template to use. Defaults to SYSTEM_PROMPT_TEMPLATE. + functions (List[Callable], optional): The functions to include in the prompt. Defaults to None. + + Returns: + The system prompt. + """ + + if functions is None: + functions = list(AVAILABLE_FUNCTIONS.values()) + + function_prompts = [function_to_prompt(fun) for fun in functions] + function_prompts_str = "\n".join(function_prompts) + + return format_prompt( + template, + { + "functions": function_prompts_str, + }, + ) + + +def type_to_string(t: type) -> str: + """Converts a type to a string. + + Args: + t (type): The type to convert. + + Returns: + A string representation of the type. + """ + + if isinstance(t, types.GenericAlias) or t is None: + return str(t) + else: + return t.__name__ + + +def function_to_prompt(fun: Callable) -> str: + """Converts a function into a prompt string. + + Args: + fun (Callable): The function to convert. + + Returns: + A prompt string. + """ + + signature = get_function_signature(fun) + + # TODO (TP): Write JINJA2 template for function prompt + parameter_strs = [] + for parameter in signature.parameters: + s = f"{parameter.name}: {type_to_string(parameter.type)}" + if not is_empty_default(parameter.default): + s += f" = {parameter.default}" + parameter_strs.append(s) + + parameter_str = ", ".join(parameter_strs) + return_type_str = ( + type_to_string(signature.return_type) if not is_empty_annotation(signature.return_type) else "None" + ) + output = f'''def {signature.name}({parameter_str}) -> {return_type_str}: + """{signature.doc_string}""" + pass +''' + return output diff --git a/gpt_code_ui/webapp/static/.gitignore b/gpt_code_ui/webapp/static/.gitignore index c96a04f0..d6b7ef32 100644 --- a/gpt_code_ui/webapp/static/.gitignore +++ b/gpt_code_ui/webapp/static/.gitignore @@ -1,2 +1,2 @@ * -!.gitignore \ No newline at end of file +!.gitignore diff --git a/notes/blog-post-notes.txt b/notes/blog-post-notes.txt deleted file mode 100644 index ff9d605e..00000000 --- a/notes/blog-post-notes.txt +++ /dev/null @@ -1,3 +0,0 @@ -- Show trick of install_requires with pip output -- Explain prompt injection trick for file upload -- Jupyter Kernel manager diff --git a/notes/todo.txt b/notes/todo.txt deleted file mode 100644 index 33ca4b0e..00000000 --- a/notes/todo.txt +++ /dev/null @@ -1,14 +0,0 @@ -- (Done) Kernel restart -- (Done) Sidebar -- (Done) Pass in OpenAI key -- (Done) Choose model -- (Done) Add prior chat message as context -- (Done) Add download file support -- (Done) Test bundling -- (Done) Test uploading to PyPI -- (Done) Create decent README - -Nice-to-haves -- GitHub action for PyPI publish on release -- Dark mode -- Support image outputs diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 00000000..ab11f572 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,3988 @@ +# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. + +[[package]] +name = "altair" +version = "5.2.0" +description = "Vega-Altair: A declarative statistical visualization library for Python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "altair-5.2.0-py3-none-any.whl", hash = "sha256:8c4888ad11db7c39f3f17aa7f4ea985775da389d79ac30a6c22856ab238df399"}, + {file = "altair-5.2.0.tar.gz", hash = "sha256:2ad7f0c8010ebbc46319cc30febfb8e59ccf84969a201541c207bc3a4fa6cf81"}, +] + +[package.dependencies] +jinja2 = "*" +jsonschema = ">=3.0" +numpy = "*" +packaging = "*" +pandas = ">=0.25" +toolz = "*" +typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} + +[package.extras] +dev = ["anywidget", "geopandas", "hatch", "ipython", "m2r", "mypy", "pandas-stubs", "pyarrow (>=11)", "pytest", "pytest-cov", "ruff (>=0.1.3)", "types-jsonschema", "types-setuptools", "vega-datasets", "vegafusion[embed] (>=1.4.0)", "vl-convert-python (>=1.1.0)"] +doc = ["docutils", "jinja2", "myst-parser", "numpydoc", "pillow (>=9,<10)", "pydata-sphinx-theme (>=0.14.1)", "scipy", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinxext-altair"] + +[[package]] +name = "annotated-types" +version = "0.6.0" +description = "Reusable constraint types to use with typing.Annotated" +optional = false +python-versions = ">=3.8" +files = [ + {file = "annotated_types-0.6.0-py3-none-any.whl", hash = "sha256:0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43"}, + {file = "annotated_types-0.6.0.tar.gz", hash = "sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d"}, +] + +[[package]] +name = "anyio" +version = "4.3.0" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +optional = false +python-versions = ">=3.8" +files = [ + {file = "anyio-4.3.0-py3-none-any.whl", hash = "sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8"}, + {file = "anyio-4.3.0.tar.gz", hash = "sha256:f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6"}, +] + +[package.dependencies] +exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} +idna = ">=2.8" +sniffio = ">=1.1" +typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} + +[package.extras] +doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (>=0.23)"] + +[[package]] +name = "appdirs" +version = "1.4.4" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +optional = false +python-versions = "*" +files = [ + {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, + {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, +] + +[[package]] +name = "appnope" +version = "0.1.4" +description = "Disable App Nap on macOS >= 10.9" +optional = false +python-versions = ">=3.6" +files = [ + {file = "appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c"}, + {file = "appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee"}, +] + +[[package]] +name = "asttokens" +version = "2.4.1" +description = "Annotate AST trees with source code positions" +optional = false +python-versions = "*" +files = [ + {file = "asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24"}, + {file = "asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"}, +] + +[package.dependencies] +six = ">=1.12.0" + +[package.extras] +astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"] +test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] + +[[package]] +name = "attrs" +version = "23.2.0" +description = "Classes Without Boilerplate" +optional = false +python-versions = ">=3.7" +files = [ + {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, + {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, +] + +[package.extras] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] +tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] + +[[package]] +name = "backoff" +version = "2.2.1" +description = "Function decoration for backoff and retry" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8"}, + {file = "backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba"}, +] + +[[package]] +name = "bio" +version = "1.6.2" +description = "bio" +optional = false +python-versions = ">=3.7" +files = [ + {file = "bio-1.6.2-py3-none-any.whl", hash = "sha256:dcec8207f3993a7f41bd8205cde235218da3dc008175ae7bb7468276d8dacf71"}, +] + +[package.dependencies] +biopython = ">=1.80" +gprofiler-official = "*" +mygene = "*" +pandas = "*" +pooch = "*" +requests = "*" +tqdm = "*" + +[[package]] +name = "biopython" +version = "1.83" +description = "Freely available tools for computational molecular biology." +optional = false +python-versions = ">=3.8" +files = [ + {file = "biopython-1.83-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e2cc737906d8de47eedbc4476f711b960c16a65daa8cdd021875398c81999a09"}, + {file = "biopython-1.83-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:741abad84165e4caf0c80e485054135f51c21177e50ac6fcc502a45a6e8f7311"}, + {file = "biopython-1.83-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2df408be9816dd98c28fe181ea93fb6e0d375bf1763ad9ed503ac30bb2df5b1a"}, + {file = "biopython-1.83-cp310-cp310-win32.whl", hash = "sha256:a0c1c70789c7e2a26563db5ba533fb9fea0cc1f2c7bc7ad240146cb223ba44a3"}, + {file = "biopython-1.83-cp310-cp310-win_amd64.whl", hash = "sha256:56f03f43c183acb88c082bc31e5f047fcc6d0aceb5270fbd29c31ab769795b86"}, + {file = "biopython-1.83-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a01dfdad7210f2fd5c4f36606278f91dbfdda6dac02347206d13cc618e79fe32"}, + {file = "biopython-1.83-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3686ff61df3f24ecf6f23826e4fe5172c5e5f745099bc8fbb176f5304582f88f"}, + {file = "biopython-1.83-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c756c0b81702c705141c87c2805203df01c6d4cf290e8cefd48cbc61a3c85b82"}, + {file = "biopython-1.83-cp311-cp311-win32.whl", hash = "sha256:0496f2a6e6e060d8ff0f34784ad15ed342b10cfe282020efe168286f0c14c479"}, + {file = "biopython-1.83-cp311-cp311-win_amd64.whl", hash = "sha256:8552cc467429b555c604b84fc174c33923bf7e4c735774eda505f1d5a9c2feab"}, + {file = "biopython-1.83-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0d5ce14755a6b49dea4743cf6929570afe5becb66ad222194984c7bf04218f86"}, + {file = "biopython-1.83-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:29708772651d930e808cd24c519fd4f39b2e719668944c0aa1eaf0b1deef9f48"}, + {file = "biopython-1.83-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b35aa095de0fa8339b70664797d0e83322a1a9d512e2fd52d4e872df5189f56"}, + {file = "biopython-1.83-cp312-cp312-win32.whl", hash = "sha256:118425a210cb3d184c7a78154c5646089366faf124cd46c6056ca7f9302b94ad"}, + {file = "biopython-1.83-cp312-cp312-win_amd64.whl", hash = "sha256:ca94e8ea8907de841a515af55acb1922a9de99b3144c738a193f2a75e4726078"}, + {file = "biopython-1.83-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e37884fe39e4560bf5934a4ec4ba7f7fe0e7c091053d03d05b20a70557167717"}, + {file = "biopython-1.83-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4cc011346bc8af264e3d3ea98c665b6ebe20e503f1dd50ee7e0bc913941b4c6e"}, + {file = "biopython-1.83-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd9bc6fef3f6a10043635a75e1a77c9dce877375140e81059c67c73d4ce65c4c"}, + {file = "biopython-1.83-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2c3584122a5daca25b3914a32c52785b051c11518cd5e111e9e89ee04a6234fe"}, + {file = "biopython-1.83-cp38-cp38-win32.whl", hash = "sha256:641c1a860705d6740eb16c6147b2b730b05a8f5974db804c14d5faa8a1446085"}, + {file = "biopython-1.83-cp38-cp38-win_amd64.whl", hash = "sha256:94b68e550619e1b6e3784ed8cecb62f201d70d8b87d3a90365291f065ab42bd9"}, + {file = "biopython-1.83-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:81d1e2515b380e1876720ba79dbf50f8ef3a38cc38ba5953ef61ec20d0934ee2"}, + {file = "biopython-1.83-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:30fa323694ee640978888d0c8c4f61f951d119ccec52b1dd5fe0668cfffb6648"}, + {file = "biopython-1.83-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec82350c24cdcf34a8d4a5f189d0ff7dc025658098a60e6f0e681d24b6a1414e"}, + {file = "biopython-1.83-cp39-cp39-win32.whl", hash = "sha256:e914f7161b3831d7c58db33cc5c7ca64b42c9877c5a776a8313e7a5fd494f8de"}, + {file = "biopython-1.83-cp39-cp39-win_amd64.whl", hash = "sha256:aae1b156a76907c2abfe9d141776b0aead65695ea914eaecdf12bd1e8991f869"}, + {file = "biopython-1.83.tar.gz", hash = "sha256:78e6bfb78de63034037afd35fe77cb6e0a9e5b62706becf78a7d922b16ed83f7"}, +] + +[package.dependencies] +numpy = "*" + +[[package]] +name = "biothings-client" +version = "0.3.1" +description = "Python Client for BioThings API services." +optional = false +python-versions = ">=2.7" +files = [ + {file = "biothings_client-0.3.1-py2.py3-none-any.whl", hash = "sha256:c08437f652d9282da785e098288ef7cf3aa2a79f5d90c480eadfce96b846013e"}, + {file = "biothings_client-0.3.1.tar.gz", hash = "sha256:c972bf2e02b6f9cc78f7f2fbc5ef02cc56fe4f8a2adcb8801ec902f4ab7011e6"}, +] + +[package.dependencies] +requests = ">=2.3.0" + +[package.extras] +caching = ["requests-cache (>=0.4.13)"] +dataframe = ["pandas (>=0.18.0)"] +jsonld = ["PyLD (>=0.7.2)"] + +[[package]] +name = "black" +version = "23.12.1" +description = "The uncompromising code formatter." +optional = false +python-versions = ">=3.8" +files = [ + {file = "black-23.12.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0aaf6041986767a5e0ce663c7a2f0e9eaf21e6ff87a5f95cbf3675bfd4c41d2"}, + {file = "black-23.12.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c88b3711d12905b74206227109272673edce0cb29f27e1385f33b0163c414bba"}, + {file = "black-23.12.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a920b569dc6b3472513ba6ddea21f440d4b4c699494d2e972a1753cdc25df7b0"}, + {file = "black-23.12.1-cp310-cp310-win_amd64.whl", hash = "sha256:3fa4be75ef2a6b96ea8d92b1587dd8cb3a35c7e3d51f0738ced0781c3aa3a5a3"}, + {file = "black-23.12.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8d4df77958a622f9b5a4c96edb4b8c0034f8434032ab11077ec6c56ae9f384ba"}, + {file = "black-23.12.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:602cfb1196dc692424c70b6507593a2b29aac0547c1be9a1d1365f0d964c353b"}, + {file = "black-23.12.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c4352800f14be5b4864016882cdba10755bd50805c95f728011bcb47a4afd59"}, + {file = "black-23.12.1-cp311-cp311-win_amd64.whl", hash = "sha256:0808494f2b2df923ffc5723ed3c7b096bd76341f6213989759287611e9837d50"}, + {file = "black-23.12.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:25e57fd232a6d6ff3f4478a6fd0580838e47c93c83eaf1ccc92d4faf27112c4e"}, + {file = "black-23.12.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2d9e13db441c509a3763a7a3d9a49ccc1b4e974a47be4e08ade2a228876500ec"}, + {file = "black-23.12.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d1bd9c210f8b109b1762ec9fd36592fdd528485aadb3f5849b2740ef17e674e"}, + {file = "black-23.12.1-cp312-cp312-win_amd64.whl", hash = "sha256:ae76c22bde5cbb6bfd211ec343ded2163bba7883c7bc77f6b756a1049436fbb9"}, + {file = "black-23.12.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1fa88a0f74e50e4487477bc0bb900c6781dbddfdfa32691e780bf854c3b4a47f"}, + {file = "black-23.12.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a4d6a9668e45ad99d2f8ec70d5c8c04ef4f32f648ef39048d010b0689832ec6d"}, + {file = "black-23.12.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b18fb2ae6c4bb63eebe5be6bd869ba2f14fd0259bda7d18a46b764d8fb86298a"}, + {file = "black-23.12.1-cp38-cp38-win_amd64.whl", hash = "sha256:c04b6d9d20e9c13f43eee8ea87d44156b8505ca8a3c878773f68b4e4812a421e"}, + {file = "black-23.12.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3e1b38b3135fd4c025c28c55ddfc236b05af657828a8a6abe5deec419a0b7055"}, + {file = "black-23.12.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4f0031eaa7b921db76decd73636ef3a12c942ed367d8c3841a0739412b260a54"}, + {file = "black-23.12.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97e56155c6b737854e60a9ab1c598ff2533d57e7506d97af5481141671abf3ea"}, + {file = "black-23.12.1-cp39-cp39-win_amd64.whl", hash = "sha256:dd15245c8b68fe2b6bd0f32c1556509d11bb33aec9b5d0866dd8e2ed3dba09c2"}, + {file = "black-23.12.1-py3-none-any.whl", hash = "sha256:78baad24af0f033958cad29731e27363183e140962595def56423e626f4bee3e"}, + {file = "black-23.12.1.tar.gz", hash = "sha256:4ce3ef14ebe8d9509188014d96af1c456a910d5b5cbf434a09fef7e024b3d0d5"}, +] + +[package.dependencies] +click = ">=8.0.0" +mypy-extensions = ">=0.4.3" +packaging = ">=22.0" +pathspec = ">=0.9.0" +platformdirs = ">=2" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.7.4)", "aiohttp (>=3.7.4,!=3.9.0)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +uvloop = ["uvloop (>=0.15.2)"] + +[[package]] +name = "blinker" +version = "1.7.0" +description = "Fast, simple object-to-object and broadcast signaling" +optional = false +python-versions = ">=3.8" +files = [ + {file = "blinker-1.7.0-py3-none-any.whl", hash = "sha256:c3f865d4d54db7abc53758a01601cf343fe55b84c1de4e3fa910e420b438d5b9"}, + {file = "blinker-1.7.0.tar.gz", hash = "sha256:e6820ff6fa4e4d1d8e2747c2283749c3f547e4fee112b98555cdcdae32996182"}, +] + +[[package]] +name = "cachetools" +version = "5.3.3" +description = "Extensible memoizing collections and decorators" +optional = false +python-versions = ">=3.7" +files = [ + {file = "cachetools-5.3.3-py3-none-any.whl", hash = "sha256:0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945"}, + {file = "cachetools-5.3.3.tar.gz", hash = "sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105"}, +] + +[[package]] +name = "certifi" +version = "2024.2.2" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, + {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, +] + +[[package]] +name = "cffi" +version = "1.16.0" +description = "Foreign Function Interface for Python calling C code." +optional = false +python-versions = ">=3.8" +files = [ + {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, + {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, + {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, + {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, + {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, + {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, + {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, + {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, + {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, + {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, + {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, + {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, + {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, + {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, +] + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "cfgv" +version = "3.4.0" +description = "Validate configuration and produce human readable error messages." +optional = false +python-versions = ">=3.8" +files = [ + {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, + {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.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.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.7" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "click-plugins" +version = "1.1.1" +description = "An extension module for click to enable registering CLI commands via setuptools entry-points." +optional = false +python-versions = "*" +files = [ + {file = "click-plugins-1.1.1.tar.gz", hash = "sha256:46ab999744a9d831159c3411bb0c79346d94a444df9a3a3742e9ed63645f264b"}, + {file = "click_plugins-1.1.1-py2.py3-none-any.whl", hash = "sha256:5d262006d3222f5057fd81e1623d4443e41dcda5dc815c06b442aa3c02889fc8"}, +] + +[package.dependencies] +click = ">=4.0" + +[package.extras] +dev = ["coveralls", "pytest (>=3.6)", "pytest-cov", "wheel"] + +[[package]] +name = "cligj" +version = "0.7.2" +description = "Click params for commmand line interfaces to GeoJSON" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, <4" +files = [ + {file = "cligj-0.7.2-py3-none-any.whl", hash = "sha256:c1ca117dbce1fe20a5809dc96f01e1c2840f6dcc939b3ddbb1111bf330ba82df"}, + {file = "cligj-0.7.2.tar.gz", hash = "sha256:a4bc13d623356b373c2c27c53dbd9c68cae5d526270bfa71f6c6fa69669c6b27"}, +] + +[package.dependencies] +click = ">=4.0" + +[package.extras] +test = ["pytest-cov"] + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "comm" +version = "0.2.1" +description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." +optional = false +python-versions = ">=3.8" +files = [ + {file = "comm-0.2.1-py3-none-any.whl", hash = "sha256:87928485c0dfc0e7976fd89fc1e187023cf587e7c353e4a9b417555b44adf021"}, + {file = "comm-0.2.1.tar.gz", hash = "sha256:0bc91edae1344d39d3661dcbc36937181fdaddb304790458f8b044dbc064b89a"}, +] + +[package.dependencies] +traitlets = ">=4" + +[package.extras] +test = ["pytest"] + +[[package]] +name = "contourpy" +version = "1.2.0" +description = "Python library for calculating contours of 2D quadrilateral grids" +optional = false +python-versions = ">=3.9" +files = [ + {file = "contourpy-1.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0274c1cb63625972c0c007ab14dd9ba9e199c36ae1a231ce45d725cbcbfd10a8"}, + {file = "contourpy-1.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ab459a1cbbf18e8698399c595a01f6dcc5c138220ca3ea9e7e6126232d102bb4"}, + {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fdd887f17c2f4572ce548461e4f96396681212d858cae7bd52ba3310bc6f00f"}, + {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d16edfc3fc09968e09ddffada434b3bf989bf4911535e04eada58469873e28e"}, + {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c203f617abc0dde5792beb586f827021069fb6d403d7f4d5c2b543d87edceb9"}, + {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b69303ceb2e4d4f146bf82fda78891ef7bcd80c41bf16bfca3d0d7eb545448aa"}, + {file = "contourpy-1.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:884c3f9d42d7218304bc74a8a7693d172685c84bd7ab2bab1ee567b769696df9"}, + {file = "contourpy-1.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4a1b1208102be6e851f20066bf0e7a96b7d48a07c9b0cfe6d0d4545c2f6cadab"}, + {file = "contourpy-1.2.0-cp310-cp310-win32.whl", hash = "sha256:34b9071c040d6fe45d9826cbbe3727d20d83f1b6110d219b83eb0e2a01d79488"}, + {file = "contourpy-1.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:bd2f1ae63998da104f16a8b788f685e55d65760cd1929518fd94cd682bf03e41"}, + {file = "contourpy-1.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dd10c26b4eadae44783c45ad6655220426f971c61d9b239e6f7b16d5cdaaa727"}, + {file = "contourpy-1.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5c6b28956b7b232ae801406e529ad7b350d3f09a4fde958dfdf3c0520cdde0dd"}, + {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebeac59e9e1eb4b84940d076d9f9a6cec0064e241818bcb6e32124cc5c3e377a"}, + {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:139d8d2e1c1dd52d78682f505e980f592ba53c9f73bd6be102233e358b401063"}, + {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1e9dc350fb4c58adc64df3e0703ab076f60aac06e67d48b3848c23647ae4310e"}, + {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18fc2b4ed8e4a8fe849d18dce4bd3c7ea637758c6343a1f2bae1e9bd4c9f4686"}, + {file = "contourpy-1.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:16a7380e943a6d52472096cb7ad5264ecee36ed60888e2a3d3814991a0107286"}, + {file = "contourpy-1.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8d8faf05be5ec8e02a4d86f616fc2a0322ff4a4ce26c0f09d9f7fb5330a35c95"}, + {file = "contourpy-1.2.0-cp311-cp311-win32.whl", hash = "sha256:67b7f17679fa62ec82b7e3e611c43a016b887bd64fb933b3ae8638583006c6d6"}, + {file = "contourpy-1.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:99ad97258985328b4f207a5e777c1b44a83bfe7cf1f87b99f9c11d4ee477c4de"}, + {file = "contourpy-1.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:575bcaf957a25d1194903a10bc9f316c136c19f24e0985a2b9b5608bdf5dbfe0"}, + {file = "contourpy-1.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9e6c93b5b2dbcedad20a2f18ec22cae47da0d705d454308063421a3b290d9ea4"}, + {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:464b423bc2a009088f19bdf1f232299e8b6917963e2b7e1d277da5041f33a779"}, + {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:68ce4788b7d93e47f84edd3f1f95acdcd142ae60bc0e5493bfd120683d2d4316"}, + {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d7d1f8871998cdff5d2ff6a087e5e1780139abe2838e85b0b46b7ae6cc25399"}, + {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e739530c662a8d6d42c37c2ed52a6f0932c2d4a3e8c1f90692ad0ce1274abe0"}, + {file = "contourpy-1.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:247b9d16535acaa766d03037d8e8fb20866d054d3c7fbf6fd1f993f11fc60ca0"}, + {file = "contourpy-1.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:461e3ae84cd90b30f8d533f07d87c00379644205b1d33a5ea03381edc4b69431"}, + {file = "contourpy-1.2.0-cp312-cp312-win32.whl", hash = "sha256:1c2559d6cffc94890b0529ea7eeecc20d6fadc1539273aa27faf503eb4656d8f"}, + {file = "contourpy-1.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:491b1917afdd8638a05b611a56d46587d5a632cabead889a5440f7c638bc6ed9"}, + {file = "contourpy-1.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5fd1810973a375ca0e097dee059c407913ba35723b111df75671a1976efa04bc"}, + {file = "contourpy-1.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:999c71939aad2780f003979b25ac5b8f2df651dac7b38fb8ce6c46ba5abe6ae9"}, + {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7caf9b241464c404613512d5594a6e2ff0cc9cb5615c9475cc1d9b514218ae8"}, + {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:266270c6f6608340f6c9836a0fb9b367be61dde0c9a9a18d5ece97774105ff3e"}, + {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbd50d0a0539ae2e96e537553aff6d02c10ed165ef40c65b0e27e744a0f10af8"}, + {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11f8d2554e52f459918f7b8e6aa20ec2a3bce35ce95c1f0ef4ba36fbda306df5"}, + {file = "contourpy-1.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ce96dd400486e80ac7d195b2d800b03e3e6a787e2a522bfb83755938465a819e"}, + {file = "contourpy-1.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6d3364b999c62f539cd403f8123ae426da946e142312a514162adb2addd8d808"}, + {file = "contourpy-1.2.0-cp39-cp39-win32.whl", hash = "sha256:1c88dfb9e0c77612febebb6ac69d44a8d81e3dc60f993215425b62c1161353f4"}, + {file = "contourpy-1.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:78e6ad33cf2e2e80c5dfaaa0beec3d61face0fb650557100ee36db808bfa6843"}, + {file = "contourpy-1.2.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:be16975d94c320432657ad2402f6760990cb640c161ae6da1363051805fa8108"}, + {file = "contourpy-1.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b95a225d4948b26a28c08307a60ac00fb8671b14f2047fc5476613252a129776"}, + {file = "contourpy-1.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0d7e03c0f9a4f90dc18d4e77e9ef4ec7b7bbb437f7f675be8e530d65ae6ef956"}, + {file = "contourpy-1.2.0.tar.gz", hash = "sha256:171f311cb758de7da13fc53af221ae47a5877be5a0843a9fe150818c51ed276a"}, +] + +[package.dependencies] +numpy = ">=1.20,<2.0" + +[package.extras] +bokeh = ["bokeh", "selenium"] +docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"] +mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.6.1)", "types-Pillow"] +test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] +test-no-images = ["pytest", "pytest-cov", "pytest-xdist", "wurlitzer"] + +[[package]] +name = "cryptography" +version = "42.0.5" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +optional = false +python-versions = ">=3.7" +files = [ + {file = "cryptography-42.0.5-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:a30596bae9403a342c978fb47d9b0ee277699fa53bbafad14706af51fe543d16"}, + {file = "cryptography-42.0.5-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:b7ffe927ee6531c78f81aa17e684e2ff617daeba7f189f911065b2ea2d526dec"}, + {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2424ff4c4ac7f6b8177b53c17ed5d8fa74ae5955656867f5a8affaca36a27abb"}, + {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:329906dcc7b20ff3cad13c069a78124ed8247adcac44b10bea1130e36caae0b4"}, + {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:b03c2ae5d2f0fc05f9a2c0c997e1bc18c8229f392234e8a0194f202169ccd278"}, + {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f8837fe1d6ac4a8052a9a8ddab256bc006242696f03368a4009be7ee3075cdb7"}, + {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:0270572b8bd2c833c3981724b8ee9747b3ec96f699a9665470018594301439ee"}, + {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:b8cac287fafc4ad485b8a9b67d0ee80c66bf3574f655d3b97ef2e1082360faf1"}, + {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:16a48c23a62a2f4a285699dba2e4ff2d1cff3115b9df052cdd976a18856d8e3d"}, + {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2bce03af1ce5a5567ab89bd90d11e7bbdff56b8af3acbbec1faded8f44cb06da"}, + {file = "cryptography-42.0.5-cp37-abi3-win32.whl", hash = "sha256:b6cd2203306b63e41acdf39aa93b86fb566049aeb6dc489b70e34bcd07adca74"}, + {file = "cryptography-42.0.5-cp37-abi3-win_amd64.whl", hash = "sha256:98d8dc6d012b82287f2c3d26ce1d2dd130ec200c8679b6213b3c73c08b2b7940"}, + {file = "cryptography-42.0.5-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:5e6275c09d2badf57aea3afa80d975444f4be8d3bc58f7f80d2a484c6f9485c8"}, + {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4985a790f921508f36f81831817cbc03b102d643b5fcb81cd33df3fa291a1a1"}, + {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7cde5f38e614f55e28d831754e8a3bacf9ace5d1566235e39d91b35502d6936e"}, + {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:7367d7b2eca6513681127ebad53b2582911d1736dc2ffc19f2c3ae49997496bc"}, + {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:cd2030f6650c089aeb304cf093f3244d34745ce0cfcc39f20c6fbfe030102e2a"}, + {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a2913c5375154b6ef2e91c10b5720ea6e21007412f6437504ffea2109b5a33d7"}, + {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:c41fb5e6a5fe9ebcd58ca3abfeb51dffb5d83d6775405305bfa8715b76521922"}, + {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:3eaafe47ec0d0ffcc9349e1708be2aaea4c6dd4978d76bf6eb0cb2c13636c6fc"}, + {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1b95b98b0d2af784078fa69f637135e3c317091b615cd0905f8b8a087e86fa30"}, + {file = "cryptography-42.0.5-cp39-abi3-win32.whl", hash = "sha256:1f71c10d1e88467126f0efd484bd44bca5e14c664ec2ede64c32f20875c0d413"}, + {file = "cryptography-42.0.5-cp39-abi3-win_amd64.whl", hash = "sha256:a011a644f6d7d03736214d38832e030d8268bcff4a41f728e6030325fea3e400"}, + {file = "cryptography-42.0.5-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9481ffe3cf013b71b2428b905c4f7a9a4f76ec03065b05ff499bb5682a8d9ad8"}, + {file = "cryptography-42.0.5-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:ba334e6e4b1d92442b75ddacc615c5476d4ad55cc29b15d590cc6b86efa487e2"}, + {file = "cryptography-42.0.5-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:ba3e4a42397c25b7ff88cdec6e2a16c2be18720f317506ee25210f6d31925f9c"}, + {file = "cryptography-42.0.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:111a0d8553afcf8eb02a4fea6ca4f59d48ddb34497aa8706a6cf536f1a5ec576"}, + {file = "cryptography-42.0.5-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cd65d75953847815962c84a4654a84850b2bb4aed3f26fadcc1c13892e1e29f6"}, + {file = "cryptography-42.0.5-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:e807b3188f9eb0eaa7bbb579b462c5ace579f1cedb28107ce8b48a9f7ad3679e"}, + {file = "cryptography-42.0.5-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f12764b8fffc7a123f641d7d049d382b73f96a34117e0b637b80643169cec8ac"}, + {file = "cryptography-42.0.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:37dd623507659e08be98eec89323469e8c7b4c1407c85112634ae3dbdb926fdd"}, + {file = "cryptography-42.0.5.tar.gz", hash = "sha256:6fe07eec95dfd477eb9530aef5bead34fec819b3aaf6c5bd6d20565da607bfe1"}, +] + +[package.dependencies] +cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} + +[package.extras] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] +docstest = ["pyenchant (>=1.6.11)", "readme-renderer", "sphinxcontrib-spelling (>=4.0.1)"] +nox = ["nox"] +pep8test = ["check-sdist", "click", "mypy", "ruff"] +sdist = ["build"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["certifi", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test-randomorder = ["pytest-randomly"] + +[[package]] +name = "cycler" +version = "0.12.1" +description = "Composable style cycles" +optional = false +python-versions = ">=3.8" +files = [ + {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, + {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, +] + +[package.extras] +docs = ["ipython", "matplotlib", "numpydoc", "sphinx"] +tests = ["pytest", "pytest-cov", "pytest-xdist"] + +[[package]] +name = "dateparser" +version = "1.2.0" +description = "Date parsing library designed to parse dates from HTML pages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "dateparser-1.2.0-py2.py3-none-any.whl", hash = "sha256:0b21ad96534e562920a0083e97fd45fa959882d4162acc358705144520a35830"}, + {file = "dateparser-1.2.0.tar.gz", hash = "sha256:7975b43a4222283e0ae15be7b4999d08c9a70e2d378ac87385b1ccf2cffbbb30"}, +] + +[package.dependencies] +python-dateutil = "*" +pytz = "*" +regex = "<2019.02.19 || >2019.02.19,<2021.8.27 || >2021.8.27" +tzlocal = "*" + +[package.extras] +calendars = ["convertdate", "hijri-converter"] +fasttext = ["fasttext"] +langdetect = ["langdetect"] + +[[package]] +name = "debugpy" +version = "1.8.1" +description = "An implementation of the Debug Adapter Protocol for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "debugpy-1.8.1-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:3bda0f1e943d386cc7a0e71bfa59f4137909e2ed947fb3946c506e113000f741"}, + {file = "debugpy-1.8.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dda73bf69ea479c8577a0448f8c707691152e6c4de7f0c4dec5a4bc11dee516e"}, + {file = "debugpy-1.8.1-cp310-cp310-win32.whl", hash = "sha256:3a79c6f62adef994b2dbe9fc2cc9cc3864a23575b6e387339ab739873bea53d0"}, + {file = "debugpy-1.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:7eb7bd2b56ea3bedb009616d9e2f64aab8fc7000d481faec3cd26c98a964bcdd"}, + {file = "debugpy-1.8.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:016a9fcfc2c6b57f939673c874310d8581d51a0fe0858e7fac4e240c5eb743cb"}, + {file = "debugpy-1.8.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd97ed11a4c7f6d042d320ce03d83b20c3fb40da892f994bc041bbc415d7a099"}, + {file = "debugpy-1.8.1-cp311-cp311-win32.whl", hash = "sha256:0de56aba8249c28a300bdb0672a9b94785074eb82eb672db66c8144fff673146"}, + {file = "debugpy-1.8.1-cp311-cp311-win_amd64.whl", hash = "sha256:1a9fe0829c2b854757b4fd0a338d93bc17249a3bf69ecf765c61d4c522bb92a8"}, + {file = "debugpy-1.8.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:3ebb70ba1a6524d19fa7bb122f44b74170c447d5746a503e36adc244a20ac539"}, + {file = "debugpy-1.8.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2e658a9630f27534e63922ebf655a6ab60c370f4d2fc5c02a5b19baf4410ace"}, + {file = "debugpy-1.8.1-cp312-cp312-win32.whl", hash = "sha256:caad2846e21188797a1f17fc09c31b84c7c3c23baf2516fed5b40b378515bbf0"}, + {file = "debugpy-1.8.1-cp312-cp312-win_amd64.whl", hash = "sha256:edcc9f58ec0fd121a25bc950d4578df47428d72e1a0d66c07403b04eb93bcf98"}, + {file = "debugpy-1.8.1-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:7a3afa222f6fd3d9dfecd52729bc2e12c93e22a7491405a0ecbf9e1d32d45b39"}, + {file = "debugpy-1.8.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d915a18f0597ef685e88bb35e5d7ab968964b7befefe1aaea1eb5b2640b586c7"}, + {file = "debugpy-1.8.1-cp38-cp38-win32.whl", hash = "sha256:92116039b5500633cc8d44ecc187abe2dfa9b90f7a82bbf81d079fcdd506bae9"}, + {file = "debugpy-1.8.1-cp38-cp38-win_amd64.whl", hash = "sha256:e38beb7992b5afd9d5244e96ad5fa9135e94993b0c551ceebf3fe1a5d9beb234"}, + {file = "debugpy-1.8.1-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:bfb20cb57486c8e4793d41996652e5a6a885b4d9175dd369045dad59eaacea42"}, + {file = "debugpy-1.8.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efd3fdd3f67a7e576dd869c184c5dd71d9aaa36ded271939da352880c012e703"}, + {file = "debugpy-1.8.1-cp39-cp39-win32.whl", hash = "sha256:58911e8521ca0c785ac7a0539f1e77e0ce2df753f786188f382229278b4cdf23"}, + {file = "debugpy-1.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:6df9aa9599eb05ca179fb0b810282255202a66835c6efb1d112d21ecb830ddd3"}, + {file = "debugpy-1.8.1-py2.py3-none-any.whl", hash = "sha256:28acbe2241222b87e255260c76741e1fbf04fdc3b6d094fcf57b6c6f75ce1242"}, + {file = "debugpy-1.8.1.zip", hash = "sha256:f696d6be15be87aef621917585f9bb94b1dc9e8aced570db1b8a6fc14e8f9b42"}, +] + +[[package]] +name = "decorator" +version = "5.1.1" +description = "Decorators for Humans" +optional = false +python-versions = ">=3.5" +files = [ + {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, + {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, +] + +[[package]] +name = "distlib" +version = "0.3.8" +description = "Distribution utilities" +optional = false +python-versions = "*" +files = [ + {file = "distlib-0.3.8-py2.py3-none-any.whl", hash = "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784"}, + {file = "distlib-0.3.8.tar.gz", hash = "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64"}, +] + +[[package]] +name = "distro" +version = "1.9.0" +description = "Distro - an OS platform information API" +optional = false +python-versions = ">=3.6" +files = [ + {file = "distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2"}, + {file = "distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed"}, +] + +[[package]] +name = "docx" +version = "0.2.4" +description = "The docx module creates, reads and writes Microsoft Office Word 2007 docx files" +optional = false +python-versions = "*" +files = [ + {file = "docx-0.2.4.tar.gz", hash = "sha256:9d7595eac6e86cda0b7136a2995318d039c1f3eaa368a3300805abbbe5dc8877"}, +] + +[package.dependencies] +lxml = "*" +Pillow = ">=2.0" + +[[package]] +name = "et-xmlfile" +version = "1.1.0" +description = "An implementation of lxml.xmlfile for the standard library" +optional = false +python-versions = ">=3.6" +files = [ + {file = "et_xmlfile-1.1.0-py3-none-any.whl", hash = "sha256:a2ba85d1d6a74ef63837eed693bcb89c3f752169b0e3e7ae5b16ca5e1b3deada"}, + {file = "et_xmlfile-1.1.0.tar.gz", hash = "sha256:8eb9e2bc2f8c97e37a2dc85a09ecdcdec9d8a396530a6d5a33b30b9a92da0c5c"}, +] + +[[package]] +name = "exceptiongroup" +version = "1.2.0" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.2.0-py3-none-any.whl", hash = "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14"}, + {file = "exceptiongroup-1.2.0.tar.gz", hash = "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "executing" +version = "2.0.1" +description = "Get the currently executing AST node of a frame, and other information" +optional = false +python-versions = ">=3.5" +files = [ + {file = "executing-2.0.1-py2.py3-none-any.whl", hash = "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"}, + {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"}, +] + +[package.extras] +tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] + +[[package]] +name = "filelock" +version = "3.13.1" +description = "A platform independent file lock." +optional = false +python-versions = ">=3.8" +files = [ + {file = "filelock-3.13.1-py3-none-any.whl", hash = "sha256:57dbda9b35157b05fb3e58ee91448612eb674172fab98ee235ccb0b5bee19a1c"}, + {file = "filelock-3.13.1.tar.gz", hash = "sha256:521f5f56c50f8426f5e03ad3b281b490a87ef15bc6c526f168290f0c7148d44e"}, +] + +[package.extras] +docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.24)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] +typing = ["typing-extensions (>=4.8)"] + +[[package]] +name = "fiona" +version = "1.9.5" +description = "Fiona reads and writes spatial data files" +optional = false +python-versions = ">=3.7" +files = [ + {file = "fiona-1.9.5-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:5f40a40529ecfca5294260316cf987a0420c77a2f0cf0849f529d1afbccd093e"}, + {file = "fiona-1.9.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:374efe749143ecb5cfdd79b585d83917d2bf8ecfbfc6953c819586b336ce9c63"}, + {file = "fiona-1.9.5-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:35dae4b0308eb44617cdc4461ceb91f891d944fdebbcba5479efe524ec5db8de"}, + {file = "fiona-1.9.5-cp310-cp310-win_amd64.whl", hash = "sha256:5b4c6a3df53bee8f85bb46685562b21b43346be1fe96419f18f70fa1ab8c561c"}, + {file = "fiona-1.9.5-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:6ad04c1877b9fd742871b11965606c6a52f40706f56a48d66a87cc3073943828"}, + {file = "fiona-1.9.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9fb9a24a8046c724787719e20557141b33049466145fc3e665764ac7caf5748c"}, + {file = "fiona-1.9.5-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:d722d7f01a66f4ab6cd08d156df3fdb92f0669cf5f8708ddcb209352f416f241"}, + {file = "fiona-1.9.5-cp311-cp311-win_amd64.whl", hash = "sha256:7ede8ddc798f3d447536080c6db9a5fb73733ad8bdb190cb65eed4e289dd4c50"}, + {file = "fiona-1.9.5-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:8b098054a27c12afac4f819f98cb4d4bf2db9853f70b0c588d7d97d26e128c39"}, + {file = "fiona-1.9.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6d9f29e9bcbb33232ff7fa98b4a3c2234db910c1dc6c4147fc36c0b8b930f2e0"}, + {file = "fiona-1.9.5-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:f1af08da4ecea5036cb81c9131946be4404245d1b434b5b24fd3871a1d4030d9"}, + {file = "fiona-1.9.5-cp312-cp312-win_amd64.whl", hash = "sha256:c521e1135c78dec0d7774303e5a1b4c62e0efb0e602bb8f167550ef95e0a2691"}, + {file = "fiona-1.9.5-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:fce4b1dd98810cabccdaa1828430c7402d283295c2ae31bea4f34188ea9e88d7"}, + {file = "fiona-1.9.5-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:3ea04ec2d8c57b5f81a31200fb352cb3242aa106fc3e328963f30ffbdf0ff7c8"}, + {file = "fiona-1.9.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4877cc745d9e82b12b3eafce3719db75759c27bd8a695521202135b36b58c2e7"}, + {file = "fiona-1.9.5-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:ac2c250f509ec19fad7959d75b531984776517ef3c1222d1cc5b4f962825880b"}, + {file = "fiona-1.9.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4df21906235928faad856c288cfea0298e9647f09c9a69a230535cbc8eadfa21"}, + {file = "fiona-1.9.5-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:81d502369493687746cb8d3cd77e5ada4447fb71d513721c9a1826e4fb32b23a"}, + {file = "fiona-1.9.5-cp38-cp38-win_amd64.whl", hash = "sha256:ce3b29230ef70947ead4e701f3f82be81082b7f37fd4899009b1445cc8fc276a"}, + {file = "fiona-1.9.5-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:8b53ce8de773fcd5e2e102e833c8c58479edd8796a522f3d83ef9e08b62bfeea"}, + {file = "fiona-1.9.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bd2355e859a1cd24a3e485c6dc5003129f27a2051629def70036535ffa7e16a4"}, + {file = "fiona-1.9.5-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:9a2da52f865db1aff0eaf41cdd4c87a7c079b3996514e8e7a1ca38457309e825"}, + {file = "fiona-1.9.5-cp39-cp39-win_amd64.whl", hash = "sha256:cfef6db5b779d463298b1113b50daa6c5b55f26f834dc9e37752116fa17277c1"}, + {file = "fiona-1.9.5.tar.gz", hash = "sha256:99e2604332caa7692855c2ae6ed91e1fffdf9b59449aa8032dd18e070e59a2f7"}, +] + +[package.dependencies] +attrs = ">=19.2.0" +certifi = "*" +click = ">=8.0,<9.0" +click-plugins = ">=1.0" +cligj = ">=0.5" +setuptools = "*" +six = "*" + +[package.extras] +all = ["Fiona[calc,s3,test]"] +calc = ["shapely"] +s3 = ["boto3 (>=1.3.1)"] +test = ["Fiona[s3]", "pytest (>=7)", "pytest-cov", "pytz"] + +[[package]] +name = "flask" +version = "2.3.3" +description = "A simple framework for building complex web applications." +optional = false +python-versions = ">=3.8" +files = [ + {file = "flask-2.3.3-py3-none-any.whl", hash = "sha256:f69fcd559dc907ed196ab9df0e48471709175e696d6e698dd4dbe940f96ce66b"}, + {file = "flask-2.3.3.tar.gz", hash = "sha256:09c347a92aa7ff4a8e7f3206795f30d826654baf38b873d0744cd571ca609efc"}, +] + +[package.dependencies] +blinker = ">=1.6.2" +click = ">=8.1.3" +itsdangerous = ">=2.1.2" +Jinja2 = ">=3.1.2" +Werkzeug = ">=2.3.7" + +[package.extras] +async = ["asgiref (>=3.2)"] +dotenv = ["python-dotenv"] + +[[package]] +name = "flask-cors" +version = "3.0.10" +description = "A Flask extension adding a decorator for CORS support" +optional = false +python-versions = "*" +files = [ + {file = "Flask-Cors-3.0.10.tar.gz", hash = "sha256:b60839393f3b84a0f3746f6cdca56c1ad7426aa738b70d6c61375857823181de"}, + {file = "Flask_Cors-3.0.10-py2.py3-none-any.whl", hash = "sha256:74efc975af1194fc7891ff5cd85b0f7478be4f7f59fe158102e91abb72bb4438"}, +] + +[package.dependencies] +Flask = ">=0.9" +Six = "*" + +[[package]] +name = "fonttools" +version = "4.49.0" +description = "Tools to manipulate font files" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fonttools-4.49.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d970ecca0aac90d399e458f0b7a8a597e08f95de021f17785fb68e2dc0b99717"}, + {file = "fonttools-4.49.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ac9a745b7609f489faa65e1dc842168c18530874a5f5b742ac3dd79e26bca8bc"}, + {file = "fonttools-4.49.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ba0e00620ca28d4ca11fc700806fd69144b463aa3275e1b36e56c7c09915559"}, + {file = "fonttools-4.49.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdee3ab220283057e7840d5fb768ad4c2ebe65bdba6f75d5d7bf47f4e0ed7d29"}, + {file = "fonttools-4.49.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ce7033cb61f2bb65d8849658d3786188afd80f53dad8366a7232654804529532"}, + {file = "fonttools-4.49.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:07bc5ea02bb7bc3aa40a1eb0481ce20e8d9b9642a9536cde0218290dd6085828"}, + {file = "fonttools-4.49.0-cp310-cp310-win32.whl", hash = "sha256:86eef6aab7fd7c6c8545f3ebd00fd1d6729ca1f63b0cb4d621bccb7d1d1c852b"}, + {file = "fonttools-4.49.0-cp310-cp310-win_amd64.whl", hash = "sha256:1fac1b7eebfce75ea663e860e7c5b4a8831b858c17acd68263bc156125201abf"}, + {file = "fonttools-4.49.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:edc0cce355984bb3c1d1e89d6a661934d39586bb32191ebff98c600f8957c63e"}, + {file = "fonttools-4.49.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:83a0d9336de2cba86d886507dd6e0153df333ac787377325a39a2797ec529814"}, + {file = "fonttools-4.49.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36c8865bdb5cfeec88f5028e7e592370a0657b676c6f1d84a2108e0564f90e22"}, + {file = "fonttools-4.49.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33037d9e56e2562c710c8954d0f20d25b8386b397250d65581e544edc9d6b942"}, + {file = "fonttools-4.49.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8fb022d799b96df3eaa27263e9eea306bd3d437cc9aa981820850281a02b6c9a"}, + {file = "fonttools-4.49.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:33c584c0ef7dc54f5dd4f84082eabd8d09d1871a3d8ca2986b0c0c98165f8e86"}, + {file = "fonttools-4.49.0-cp311-cp311-win32.whl", hash = "sha256:cbe61b158deb09cffdd8540dc4a948d6e8f4d5b4f3bf5cd7db09bd6a61fee64e"}, + {file = "fonttools-4.49.0-cp311-cp311-win_amd64.whl", hash = "sha256:fc11e5114f3f978d0cea7e9853627935b30d451742eeb4239a81a677bdee6bf6"}, + {file = "fonttools-4.49.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d647a0e697e5daa98c87993726da8281c7233d9d4ffe410812a4896c7c57c075"}, + {file = "fonttools-4.49.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f3bbe672df03563d1f3a691ae531f2e31f84061724c319652039e5a70927167e"}, + {file = "fonttools-4.49.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bebd91041dda0d511b0d303180ed36e31f4f54b106b1259b69fade68413aa7ff"}, + {file = "fonttools-4.49.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4145f91531fd43c50f9eb893faa08399816bb0b13c425667c48475c9f3a2b9b5"}, + {file = "fonttools-4.49.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ea329dafb9670ffbdf4dbc3b0e5c264104abcd8441d56de77f06967f032943cb"}, + {file = "fonttools-4.49.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c076a9e548521ecc13d944b1d261ff3d7825048c338722a4bd126d22316087b7"}, + {file = "fonttools-4.49.0-cp312-cp312-win32.whl", hash = "sha256:b607ea1e96768d13be26d2b400d10d3ebd1456343eb5eaddd2f47d1c4bd00880"}, + {file = "fonttools-4.49.0-cp312-cp312-win_amd64.whl", hash = "sha256:a974c49a981e187381b9cc2c07c6b902d0079b88ff01aed34695ec5360767034"}, + {file = "fonttools-4.49.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b85ec0bdd7bdaa5c1946398cbb541e90a6dfc51df76dfa88e0aaa41b335940cb"}, + {file = "fonttools-4.49.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:af20acbe198a8a790618ee42db192eb128afcdcc4e96d99993aca0b60d1faeb4"}, + {file = "fonttools-4.49.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d418b1fee41a1d14931f7ab4b92dc0bc323b490e41d7a333eec82c9f1780c75"}, + {file = "fonttools-4.49.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b44a52b8e6244b6548851b03b2b377a9702b88ddc21dcaf56a15a0393d425cb9"}, + {file = "fonttools-4.49.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7c7125068e04a70739dad11857a4d47626f2b0bd54de39e8622e89701836eabd"}, + {file = "fonttools-4.49.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:29e89d0e1a7f18bc30f197cfadcbef5a13d99806447c7e245f5667579a808036"}, + {file = "fonttools-4.49.0-cp38-cp38-win32.whl", hash = "sha256:9d95fa0d22bf4f12d2fb7b07a46070cdfc19ef5a7b1c98bc172bfab5bf0d6844"}, + {file = "fonttools-4.49.0-cp38-cp38-win_amd64.whl", hash = "sha256:768947008b4dc552d02772e5ebd49e71430a466e2373008ce905f953afea755a"}, + {file = "fonttools-4.49.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:08877e355d3dde1c11973bb58d4acad1981e6d1140711230a4bfb40b2b937ccc"}, + {file = "fonttools-4.49.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fdb54b076f25d6b0f0298dc706acee5052de20c83530fa165b60d1f2e9cbe3cb"}, + {file = "fonttools-4.49.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0af65c720520710cc01c293f9c70bd69684365c6015cc3671db2b7d807fe51f2"}, + {file = "fonttools-4.49.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f255ce8ed7556658f6d23f6afd22a6d9bbc3edb9b96c96682124dc487e1bf42"}, + {file = "fonttools-4.49.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d00af0884c0e65f60dfaf9340e26658836b935052fdd0439952ae42e44fdd2be"}, + {file = "fonttools-4.49.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:263832fae27481d48dfafcc43174644b6706639661e242902ceb30553557e16c"}, + {file = "fonttools-4.49.0-cp39-cp39-win32.whl", hash = "sha256:0404faea044577a01bb82d47a8fa4bc7a54067fa7e324785dd65d200d6dd1133"}, + {file = "fonttools-4.49.0-cp39-cp39-win_amd64.whl", hash = "sha256:b050d362df50fc6e38ae3954d8c29bf2da52be384649ee8245fdb5186b620836"}, + {file = "fonttools-4.49.0-py3-none-any.whl", hash = "sha256:af281525e5dd7fa0b39fb1667b8d5ca0e2a9079967e14c4bfe90fd1cd13e0f18"}, + {file = "fonttools-4.49.0.tar.gz", hash = "sha256:ebf46e7f01b7af7861310417d7c49591a85d99146fc23a5ba82fdb28af156321"}, +] + +[package.extras] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] +graphite = ["lz4 (>=1.7.4.2)"] +interpolatable = ["munkres", "pycairo", "scipy"] +lxml = ["lxml (>=4.0)"] +pathops = ["skia-pathops (>=0.5.0)"] +plot = ["matplotlib"] +repacker = ["uharfbuzz (>=0.23.0)"] +symfont = ["sympy"] +type1 = ["xattr"] +ufo = ["fs (>=2.2.0,<3)"] +unicode = ["unicodedata2 (>=15.1.0)"] +woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] + +[[package]] +name = "foundry-dev-tools" +version = "1.4.0" +description = "Seamlessly run your Palantir Foundry Repository transforms code on your local machine." +optional = false +python-versions = "<4,>=3.8" +files = [ + {file = "foundry-dev-tools-1.4.0.tar.gz", hash = "sha256:48b3d7366b17910c91fac4726de87c7b63c0cc9a2ae26d523f1440b9e4fae459"}, + {file = "foundry_dev_tools-1.4.0-py3-none-any.whl", hash = "sha256:fd3ac96b4f5de8a85b02d9b3429331abea0ae351a9251c0b6551d270736ae073"}, +] + +[package.dependencies] +backoff = "*" +fs = "*" +palantir-oauth-client = "*" +pandas = "*" +pyarrow = "*" +requests = "*" + +[package.extras] +cli = ["click", "inquirer", "packaging", "rich", "websockets"] +integration = ["dask", "fastparquet"] +s3 = ["aiobotocore[boto3]"] +testing = ["freezegun", "fsspec", "polars", "pytest", "pytest-asyncio", "pytest-mock", "pytest-spark", "requests-mock", "timeflake"] +transforms = ["pyspark (>=3.0.0)"] + +[[package]] +name = "fs" +version = "2.4.16" +description = "Python's filesystem abstraction layer" +optional = false +python-versions = "*" +files = [ + {file = "fs-2.4.16-py2.py3-none-any.whl", hash = "sha256:660064febbccda264ae0b6bace80a8d1be9e089e0a5eb2427b7d517f9a91545c"}, + {file = "fs-2.4.16.tar.gz", hash = "sha256:ae97c7d51213f4b70b6a958292530289090de3a7e15841e108fbe144f069d313"}, +] + +[package.dependencies] +appdirs = ">=1.4.3,<1.5.0" +setuptools = "*" +six = ">=1.10,<2.0" + +[package.extras] +scandir = ["scandir (>=1.5,<2.0)"] + +[[package]] +name = "geopandas" +version = "0.14.3" +description = "Geographic pandas extensions" +optional = false +python-versions = ">=3.9" +files = [ + {file = "geopandas-0.14.3-py3-none-any.whl", hash = "sha256:41b31ad39e21bc9e8c4254f78f8dc4ce3d33d144e22e630a00bb336c83160204"}, + {file = "geopandas-0.14.3.tar.gz", hash = "sha256:748af035d4a068a4ae00cab384acb61d387685c833b0022e0729aa45216b23ac"}, +] + +[package.dependencies] +fiona = ">=1.8.21" +packaging = "*" +pandas = ">=1.4.0" +pyproj = ">=3.3.0" +shapely = ">=1.8.0" + +[[package]] +name = "gitdb" +version = "4.0.11" +description = "Git Object Database" +optional = false +python-versions = ">=3.7" +files = [ + {file = "gitdb-4.0.11-py3-none-any.whl", hash = "sha256:81a3407ddd2ee8df444cbacea00e2d038e40150acfa3001696fe0dcf1d3adfa4"}, + {file = "gitdb-4.0.11.tar.gz", hash = "sha256:bf5421126136d6d0af55bc1e7c1af1c397a34f5b7bd79e776cd3e89785c2b04b"}, +] + +[package.dependencies] +smmap = ">=3.0.1,<6" + +[[package]] +name = "gitpython" +version = "3.1.42" +description = "GitPython is a Python library used to interact with Git repositories" +optional = false +python-versions = ">=3.7" +files = [ + {file = "GitPython-3.1.42-py3-none-any.whl", hash = "sha256:1bf9cd7c9e7255f77778ea54359e54ac22a72a5b51288c457c881057b7bb9ecd"}, + {file = "GitPython-3.1.42.tar.gz", hash = "sha256:2d99869e0fef71a73cbd242528105af1d6c1b108c60dfabd994bf292f76c3ceb"}, +] + +[package.dependencies] +gitdb = ">=4.0.1,<5" + +[package.extras] +test = ["black", "coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar"] + +[[package]] +name = "gprofiler-official" +version = "1.0.0" +description = "Functional enrichment analysis and more via the g:Profiler toolkit" +optional = false +python-versions = "*" +files = [ + {file = "gprofiler-official-1.0.0.tar.gz", hash = "sha256:5015b47f10fbdcb59c57e342e815c9c07afbe57cd3984154f75b845ddef2445d"}, + {file = "gprofiler_official-1.0.0-py3-none-any.whl", hash = "sha256:c582baf728e5a6cddac964e4085ca385e082c4ef0279e3af1a16a9af07ab5395"}, +] + +[package.dependencies] +requests = "*" + +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + +[[package]] +name = "httpcore" +version = "1.0.4" +description = "A minimal low-level HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpcore-1.0.4-py3-none-any.whl", hash = "sha256:ac418c1db41bade2ad53ae2f3834a3a0f5ae76b56cf5aa497d2d033384fc7d73"}, + {file = "httpcore-1.0.4.tar.gz", hash = "sha256:cb2839ccfcba0d2d3c1131d3c3e26dfc327326fbe7a5dc0dbfe9f6c9151bb022"}, +] + +[package.dependencies] +certifi = "*" +h11 = ">=0.13,<0.15" + +[package.extras] +asyncio = ["anyio (>=4.0,<5.0)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +trio = ["trio (>=0.22.0,<0.25.0)"] + +[[package]] +name = "httpx" +version = "0.27.0" +description = "The next generation HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"}, + {file = "httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"}, +] + +[package.dependencies] +anyio = "*" +certifi = "*" +httpcore = "==1.*" +idna = "*" +sniffio = "*" + +[package.extras] +brotli = ["brotli", "brotlicffi"] +cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] + +[[package]] +name = "identify" +version = "2.5.35" +description = "File identification library for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "identify-2.5.35-py2.py3-none-any.whl", hash = "sha256:c4de0081837b211594f8e877a6b4fad7ca32bbfc1a9307fdd61c28bfe923f13e"}, + {file = "identify-2.5.35.tar.gz", hash = "sha256:10a7ca245cfcd756a554a7288159f72ff105ad233c7c4b9c6f0f4d108f5f6791"}, +] + +[package.extras] +license = ["ukkonen"] + +[[package]] +name = "idna" +version = "3.6" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, + {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, +] + +[[package]] +name = "importlib-metadata" +version = "7.0.1" +description = "Read metadata from Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "importlib_metadata-7.0.1-py3-none-any.whl", hash = "sha256:4805911c3a4ec7c3966410053e9ec6a1fecd629117df5adee56dfc9432a1081e"}, + {file = "importlib_metadata-7.0.1.tar.gz", hash = "sha256:f238736bb06590ae52ac1fab06a3a9ef1d8dce2b7a35b5ab329371d6c8f5d2cc"}, +] + +[package.dependencies] +zipp = ">=0.5" + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +perf = ["ipython"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "ipykernel" +version = "6.29.3" +description = "IPython Kernel for Jupyter" +optional = false +python-versions = ">=3.8" +files = [ + {file = "ipykernel-6.29.3-py3-none-any.whl", hash = "sha256:5aa086a4175b0229d4eca211e181fb473ea78ffd9869af36ba7694c947302a21"}, + {file = "ipykernel-6.29.3.tar.gz", hash = "sha256:e14c250d1f9ea3989490225cc1a542781b095a18a19447fcf2b5eaf7d0ac5bd2"}, +] + +[package.dependencies] +appnope = {version = "*", markers = "platform_system == \"Darwin\""} +comm = ">=0.1.1" +debugpy = ">=1.6.5" +ipython = ">=7.23.1" +jupyter-client = ">=6.1.12" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +matplotlib-inline = ">=0.1" +nest-asyncio = "*" +packaging = "*" +psutil = "*" +pyzmq = ">=24" +tornado = ">=6.1" +traitlets = ">=5.4.0" + +[package.extras] +cov = ["coverage[toml]", "curio", "matplotlib", "pytest-cov", "trio"] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "trio"] +pyqt5 = ["pyqt5"] +pyside6 = ["pyside6"] +test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.23.5)", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "ipython" +version = "8.22.2" +description = "IPython: Productive Interactive Computing" +optional = false +python-versions = ">=3.10" +files = [ + {file = "ipython-8.22.2-py3-none-any.whl", hash = "sha256:3c86f284c8f3d8f2b6c662f885c4889a91df7cd52056fd02b7d8d6195d7f56e9"}, + {file = "ipython-8.22.2.tar.gz", hash = "sha256:2dcaad9049f9056f1fef63514f176c7d41f930daa78d05b82a176202818f2c14"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +decorator = "*" +exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} +jedi = ">=0.16" +matplotlib-inline = "*" +pexpect = {version = ">4.3", markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\""} +prompt-toolkit = ">=3.0.41,<3.1.0" +pygments = ">=2.4.0" +stack-data = "*" +traitlets = ">=5.13.0" + +[package.extras] +all = ["ipython[black,doc,kernel,nbconvert,nbformat,notebook,parallel,qtconsole,terminal]", "ipython[test,test-extra]"] +black = ["black"] +doc = ["docrepr", "exceptiongroup", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinxcontrib-jquery", "stack-data", "typing-extensions"] +kernel = ["ipykernel"] +nbconvert = ["nbconvert"] +nbformat = ["nbformat"] +notebook = ["ipywidgets", "notebook"] +parallel = ["ipyparallel"] +qtconsole = ["qtconsole"] +test = ["pickleshare", "pytest (<8)", "pytest-asyncio (<0.22)", "testpath"] +test-extra = ["curio", "ipython[test]", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.23)", "pandas", "trio"] + +[[package]] +name = "itsdangerous" +version = "2.1.2" +description = "Safely pass data to untrusted environments and back." +optional = false +python-versions = ">=3.7" +files = [ + {file = "itsdangerous-2.1.2-py3-none-any.whl", hash = "sha256:2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44"}, + {file = "itsdangerous-2.1.2.tar.gz", hash = "sha256:5dbbc68b317e5e42f327f9021763545dc3fc3bfe22e6deb96aaf1fc38874156a"}, +] + +[[package]] +name = "jedi" +version = "0.19.1" +description = "An autocompletion tool for Python that can be used for text editors." +optional = false +python-versions = ">=3.6" +files = [ + {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"}, + {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"}, +] + +[package.dependencies] +parso = ">=0.8.3,<0.9.0" + +[package.extras] +docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] + +[[package]] +name = "jinja2" +version = "3.1.3" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +files = [ + {file = "Jinja2-3.1.3-py3-none-any.whl", hash = "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa"}, + {file = "Jinja2-3.1.3.tar.gz", hash = "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "joblib" +version = "1.3.2" +description = "Lightweight pipelining with Python functions" +optional = false +python-versions = ">=3.7" +files = [ + {file = "joblib-1.3.2-py3-none-any.whl", hash = "sha256:ef4331c65f239985f3f2220ecc87db222f08fd22097a3dd5698f693875f8cbb9"}, + {file = "joblib-1.3.2.tar.gz", hash = "sha256:92f865e621e17784e7955080b6d042489e3b8e294949cc44c6eac304f59772b1"}, +] + +[[package]] +name = "jsonschema" +version = "4.21.1" +description = "An implementation of JSON Schema validation for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jsonschema-4.21.1-py3-none-any.whl", hash = "sha256:7996507afae316306f9e2290407761157c6f78002dcf7419acb99822143d1c6f"}, + {file = "jsonschema-4.21.1.tar.gz", hash = "sha256:85727c00279f5fa6bedbe6238d2aa6403bedd8b4864ab11207d07df3cc1b2ee5"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +jsonschema-specifications = ">=2023.03.6" +referencing = ">=0.28.4" +rpds-py = ">=0.7.1" + +[package.extras] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] + +[[package]] +name = "jsonschema-specifications" +version = "2023.12.1" +description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jsonschema_specifications-2023.12.1-py3-none-any.whl", hash = "sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c"}, + {file = "jsonschema_specifications-2023.12.1.tar.gz", hash = "sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc"}, +] + +[package.dependencies] +referencing = ">=0.31.0" + +[[package]] +name = "jupyter-client" +version = "8.6.0" +description = "Jupyter protocol implementation and client libraries" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_client-8.6.0-py3-none-any.whl", hash = "sha256:909c474dbe62582ae62b758bca86d6518c85234bdee2d908c778db6d72f39d99"}, + {file = "jupyter_client-8.6.0.tar.gz", hash = "sha256:0642244bb83b4764ae60d07e010e15f0e2d275ec4e918a8f7b80fbbef3ca60c7"}, +] + +[package.dependencies] +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +python-dateutil = ">=2.8.2" +pyzmq = ">=23.0" +tornado = ">=6.2" +traitlets = ">=5.3" + +[package.extras] +docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx (>=4)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] + +[[package]] +name = "jupyter-core" +version = "5.7.1" +description = "Jupyter core package. A base package on which Jupyter projects rely." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_core-5.7.1-py3-none-any.whl", hash = "sha256:c65c82126453a723a2804aa52409930434598fd9d35091d63dfb919d2b765bb7"}, + {file = "jupyter_core-5.7.1.tar.gz", hash = "sha256:de61a9d7fc71240f688b2fb5ab659fbb56979458dc66a71decd098e03c79e218"}, +] + +[package.dependencies] +platformdirs = ">=2.5" +pywin32 = {version = ">=300", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} +traitlets = ">=5.3" + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] +test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "kiwisolver" +version = "1.4.5" +description = "A fast implementation of the Cassowary constraint solver" +optional = false +python-versions = ">=3.7" +files = [ + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af"}, + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3"}, + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9eaa8b117dc8337728e834b9c6e2611f10c79e38f65157c4c38e9400286f5cb1"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ec20916e7b4cbfb1f12380e46486ec4bcbaa91a9c448b97023fde0d5bbf9e4ff"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39b42c68602539407884cf70d6a480a469b93b81b7701378ba5e2328660c847a"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa12042de0171fad672b6c59df69106d20d5596e4f87b5e8f76df757a7c399aa"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a40773c71d7ccdd3798f6489aaac9eee213d566850a9533f8d26332d626b82c"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:19df6e621f6d8b4b9c4d45f40a66839294ff2bb235e64d2178f7522d9170ac5b"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:83d78376d0d4fd884e2c114d0621624b73d2aba4e2788182d286309ebdeed770"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e391b1f0a8a5a10ab3b9bb6afcfd74f2175f24f8975fb87ecae700d1503cdee0"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:852542f9481f4a62dbb5dd99e8ab7aedfeb8fb6342349a181d4036877410f525"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59edc41b24031bc25108e210c0def6f6c2191210492a972d585a06ff246bb79b"}, + {file = "kiwisolver-1.4.5-cp310-cp310-win32.whl", hash = "sha256:a6aa6315319a052b4ee378aa171959c898a6183f15c1e541821c5c59beaa0238"}, + {file = "kiwisolver-1.4.5-cp310-cp310-win_amd64.whl", hash = "sha256:d0ef46024e6a3d79c01ff13801cb19d0cad7fd859b15037aec74315540acc276"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:11863aa14a51fd6ec28688d76f1735f8f69ab1fabf388851a595d0721af042f5"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dfdd7c0b105af050eb3d64997809dc21da247cf44e63dc73ff0fd20b96be55a9"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbea0db94288e29afcc4c28afbf3a7ccaf2d7e027489c449cf7e8f83c6346eb9"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ceec1a6bc6cab1d6ff5d06592a91a692f90ec7505d6463a88a52cc0eb58545da"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f91de7223d4c7b793867797bacd1ee53bfe7359bd70d27b7b58a04efbb9436c8"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:faae4860798c31530dd184046a900e652c95513796ef51a12bc086710c2eec4d"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0157420efcb803e71d1b28e2c287518b8808b7cf1ab8af36718fd0a2c453eb0"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:06f54715b7737c2fecdbf140d1afb11a33d59508a47bf11bb38ecf21dc9ab79f"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f"}, + {file = "kiwisolver-1.4.5-cp311-cp311-win32.whl", hash = "sha256:bb86433b1cfe686da83ce32a9d3a8dd308e85c76b60896d58f082136f10bffac"}, + {file = "kiwisolver-1.4.5-cp311-cp311-win_amd64.whl", hash = "sha256:6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a"}, + {file = "kiwisolver-1.4.5-cp312-cp312-win32.whl", hash = "sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20"}, + {file = "kiwisolver-1.4.5-cp312-cp312-win_amd64.whl", hash = "sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3a2b053a0ab7a3960c98725cfb0bf5b48ba82f64ec95fe06f1d06c99b552e130"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cd32d6c13807e5c66a7cbb79f90b553642f296ae4518a60d8d76243b0ad2898"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59ec7b7c7e1a61061850d53aaf8e93db63dce0c936db1fda2658b70e4a1be709"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da4cfb373035def307905d05041c1d06d8936452fe89d464743ae7fb8371078b"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2400873bccc260b6ae184b2b8a4fec0e4082d30648eadb7c3d9a13405d861e89"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1b04139c4236a0f3aff534479b58f6f849a8b351e1314826c2d230849ed48985"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:4e66e81a5779b65ac21764c295087de82235597a2293d18d943f8e9e32746265"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7931d8f1f67c4be9ba1dd9c451fb0eeca1a25b89e4d3f89e828fe12a519b782a"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b3f7e75f3015df442238cca659f8baa5f42ce2a8582727981cbfa15fee0ee205"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:bbf1d63eef84b2e8c89011b7f2235b1e0bf7dacc11cac9431fc6468e99ac77fb"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4c380469bd3f970ef677bf2bcba2b6b0b4d5c75e7a020fb863ef75084efad66f"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-win32.whl", hash = "sha256:9408acf3270c4b6baad483865191e3e582b638b1654a007c62e3efe96f09a9a3"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-win_amd64.whl", hash = "sha256:5b94529f9b2591b7af5f3e0e730a4e0a41ea174af35a4fd067775f9bdfeee01a"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:11c7de8f692fc99816e8ac50d1d1aef4f75126eefc33ac79aac02c099fd3db71"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:53abb58632235cd154176ced1ae8f0d29a6657aa1aa9decf50b899b755bc2b93"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:88b9f257ca61b838b6f8094a62418421f87ac2a1069f7e896c36a7d86b5d4c29"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3195782b26fc03aa9c6913d5bad5aeb864bdc372924c093b0f1cebad603dd712"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc579bf0f502e54926519451b920e875f433aceb4624a3646b3252b5caa9e0b6"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a580c91d686376f0f7c295357595c5a026e6cbc3d77b7c36e290201e7c11ecb"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cfe6ab8da05c01ba6fbea630377b5da2cd9bcbc6338510116b01c1bc939a2c18"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d2e5a98f0ec99beb3c10e13b387f8db39106d53993f498b295f0c914328b1333"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a51a263952b1429e429ff236d2f5a21c5125437861baeed77f5e1cc2d2c7c6da"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3edd2fa14e68c9be82c5b16689e8d63d89fe927e56debd6e1dbce7a26a17f81b"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:74d1b44c6cfc897df648cc9fdaa09bc3e7679926e6f96df05775d4fb3946571c"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:76d9289ed3f7501012e05abb8358bbb129149dbd173f1f57a1bf1c22d19ab7cc"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:92dea1ffe3714fa8eb6a314d2b3c773208d865a0e0d35e713ec54eea08a66250"}, + {file = "kiwisolver-1.4.5-cp38-cp38-win32.whl", hash = "sha256:5c90ae8c8d32e472be041e76f9d2f2dbff4d0b0be8bd4041770eddb18cf49a4e"}, + {file = "kiwisolver-1.4.5-cp38-cp38-win_amd64.whl", hash = "sha256:c7940c1dc63eb37a67721b10d703247552416f719c4188c54e04334321351ced"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9407b6a5f0d675e8a827ad8742e1d6b49d9c1a1da5d952a67d50ef5f4170b18d"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15568384086b6df3c65353820a4473575dbad192e35010f622c6ce3eebd57af9"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0dc9db8e79f0036e8173c466d21ef18e1befc02de8bf8aa8dc0813a6dc8a7046"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cdc8a402aaee9a798b50d8b827d7ecf75edc5fb35ea0f91f213ff927c15f4ff0"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6c3bd3cde54cafb87d74d8db50b909705c62b17c2099b8f2e25b461882e544ff"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:955e8513d07a283056b1396e9a57ceddbd272d9252c14f154d450d227606eb54"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:346f5343b9e3f00b8db8ba359350eb124b98c99efd0b408728ac6ebf38173958"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9098e0049e88c6a24ff64545cdfc50807818ba6c1b739cae221bbbcbc58aad3"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:00bd361b903dc4bbf4eb165f24d1acbee754fce22ded24c3d56eec268658a5cf"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7b8b454bac16428b22560d0a1cf0a09875339cab69df61d7805bf48919415901"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f1d072c2eb0ad60d4c183f3fb44ac6f73fb7a8f16a2694a91f988275cbf352f9"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:31a82d498054cac9f6d0b53d02bb85811185bcb477d4b60144f915f3b3126342"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6512cb89e334e4700febbffaaa52761b65b4f5a3cf33f960213d5656cea36a77"}, + {file = "kiwisolver-1.4.5-cp39-cp39-win32.whl", hash = "sha256:9db8ea4c388fdb0f780fe91346fd438657ea602d58348753d9fb265ce1bca67f"}, + {file = "kiwisolver-1.4.5-cp39-cp39-win_amd64.whl", hash = "sha256:59415f46a37f7f2efeec758353dd2eae1b07640d8ca0f0c42548ec4125492635"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5c7b3b3a728dc6faf3fc372ef24f21d1e3cee2ac3e9596691d746e5a536de920"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:620ced262a86244e2be10a676b646f29c34537d0d9cc8eb26c08f53d98013390"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:378a214a1e3bbf5ac4a8708304318b4f890da88c9e6a07699c4ae7174c09a68d"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf7be1207676ac608a50cd08f102f6742dbfc70e8d60c4db1c6897f62f71523"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ba55dce0a9b8ff59495ddd050a0225d58bd0983d09f87cfe2b6aec4f2c1234e4"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5e7139af55d1688f8b960ee9ad5adafc4ac17c1c473fe07133ac092310d76544"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dced8146011d2bc2e883f9bd68618b8247387f4bbec46d7392b3c3b032640126"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9bf3325c47b11b2e51bca0824ea217c7cd84491d8ac4eefd1e409705ef092bd"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5794cf59533bc3f1b1c821f7206a3617999db9fbefc345360aafe2e067514929"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e368f200bbc2e4f905b8e71eb38b3c04333bddaa6a2464a6355487b02bb7fb09"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5d706eba36b4c4d5bc6c6377bb6568098765e990cfc21ee16d13963fab7b3e7"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85267bd1aa8880a9c88a8cb71e18d3d64d2751a790e6ca6c27b8ccc724bcd5ad"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210ef2c3a1f03272649aff1ef992df2e724748918c4bc2d5a90352849eb40bea"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11d011a7574eb3b82bcc9c1a1d35c1d7075677fdd15de527d91b46bd35e935ee"}, + {file = "kiwisolver-1.4.5.tar.gz", hash = "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec"}, +] + +[[package]] +name = "lxml" +version = "5.1.0" +description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." +optional = false +python-versions = ">=3.6" +files = [ + {file = "lxml-5.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:704f5572ff473a5f897745abebc6df40f22d4133c1e0a1f124e4f2bd3330ff7e"}, + {file = "lxml-5.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9d3c0f8567ffe7502d969c2c1b809892dc793b5d0665f602aad19895f8d508da"}, + {file = "lxml-5.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5fcfbebdb0c5d8d18b84118842f31965d59ee3e66996ac842e21f957eb76138c"}, + {file = "lxml-5.1.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f37c6d7106a9d6f0708d4e164b707037b7380fcd0b04c5bd9cae1fb46a856fb"}, + {file = "lxml-5.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2befa20a13f1a75c751f47e00929fb3433d67eb9923c2c0b364de449121f447c"}, + {file = "lxml-5.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22b7ee4c35f374e2c20337a95502057964d7e35b996b1c667b5c65c567d2252a"}, + {file = "lxml-5.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:bf8443781533b8d37b295016a4b53c1494fa9a03573c09ca5104550c138d5c05"}, + {file = "lxml-5.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:82bddf0e72cb2af3cbba7cec1d2fd11fda0de6be8f4492223d4a268713ef2147"}, + {file = "lxml-5.1.0-cp310-cp310-win32.whl", hash = "sha256:b66aa6357b265670bb574f050ffceefb98549c721cf28351b748be1ef9577d93"}, + {file = "lxml-5.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:4946e7f59b7b6a9e27bef34422f645e9a368cb2be11bf1ef3cafc39a1f6ba68d"}, + {file = "lxml-5.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:14deca1460b4b0f6b01f1ddc9557704e8b365f55c63070463f6c18619ebf964f"}, + {file = "lxml-5.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ed8c3d2cd329bf779b7ed38db176738f3f8be637bb395ce9629fc76f78afe3d4"}, + {file = "lxml-5.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:436a943c2900bb98123b06437cdd30580a61340fbdb7b28aaf345a459c19046a"}, + {file = "lxml-5.1.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:acb6b2f96f60f70e7f34efe0c3ea34ca63f19ca63ce90019c6cbca6b676e81fa"}, + {file = "lxml-5.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:af8920ce4a55ff41167ddbc20077f5698c2e710ad3353d32a07d3264f3a2021e"}, + {file = "lxml-5.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7cfced4a069003d8913408e10ca8ed092c49a7f6cefee9bb74b6b3e860683b45"}, + {file = "lxml-5.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:9e5ac3437746189a9b4121db2a7b86056ac8786b12e88838696899328fc44bb2"}, + {file = "lxml-5.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f4c9bda132ad108b387c33fabfea47866af87f4ea6ffb79418004f0521e63204"}, + {file = "lxml-5.1.0-cp311-cp311-win32.whl", hash = "sha256:bc64d1b1dab08f679fb89c368f4c05693f58a9faf744c4d390d7ed1d8223869b"}, + {file = "lxml-5.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:a5ab722ae5a873d8dcee1f5f45ddd93c34210aed44ff2dc643b5025981908cda"}, + {file = "lxml-5.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:9aa543980ab1fbf1720969af1d99095a548ea42e00361e727c58a40832439114"}, + {file = "lxml-5.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6f11b77ec0979f7e4dc5ae081325a2946f1fe424148d3945f943ceaede98adb8"}, + {file = "lxml-5.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a36c506e5f8aeb40680491d39ed94670487ce6614b9d27cabe45d94cd5d63e1e"}, + {file = "lxml-5.1.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f643ffd2669ffd4b5a3e9b41c909b72b2a1d5e4915da90a77e119b8d48ce867a"}, + {file = "lxml-5.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:16dd953fb719f0ffc5bc067428fc9e88f599e15723a85618c45847c96f11f431"}, + {file = "lxml-5.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16018f7099245157564d7148165132c70adb272fb5a17c048ba70d9cc542a1a1"}, + {file = "lxml-5.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:82cd34f1081ae4ea2ede3d52f71b7be313756e99b4b5f829f89b12da552d3aa3"}, + {file = "lxml-5.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:19a1bc898ae9f06bccb7c3e1dfd73897ecbbd2c96afe9095a6026016e5ca97b8"}, + {file = "lxml-5.1.0-cp312-cp312-win32.whl", hash = "sha256:13521a321a25c641b9ea127ef478b580b5ec82aa2e9fc076c86169d161798b01"}, + {file = "lxml-5.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:1ad17c20e3666c035db502c78b86e58ff6b5991906e55bdbef94977700c72623"}, + {file = "lxml-5.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:24ef5a4631c0b6cceaf2dbca21687e29725b7c4e171f33a8f8ce23c12558ded1"}, + {file = "lxml-5.1.0-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8d2900b7f5318bc7ad8631d3d40190b95ef2aa8cc59473b73b294e4a55e9f30f"}, + {file = "lxml-5.1.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:601f4a75797d7a770daed8b42b97cd1bb1ba18bd51a9382077a6a247a12aa38d"}, + {file = "lxml-5.1.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4b68c961b5cc402cbd99cca5eb2547e46ce77260eb705f4d117fd9c3f932b95"}, + {file = "lxml-5.1.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:afd825e30f8d1f521713a5669b63657bcfe5980a916c95855060048b88e1adb7"}, + {file = "lxml-5.1.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:262bc5f512a66b527d026518507e78c2f9c2bd9eb5c8aeeb9f0eb43fcb69dc67"}, + {file = "lxml-5.1.0-cp36-cp36m-win32.whl", hash = "sha256:e856c1c7255c739434489ec9c8aa9cdf5179785d10ff20add308b5d673bed5cd"}, + {file = "lxml-5.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:c7257171bb8d4432fe9d6fdde4d55fdbe663a63636a17f7f9aaba9bcb3153ad7"}, + {file = "lxml-5.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b9e240ae0ba96477682aa87899d94ddec1cc7926f9df29b1dd57b39e797d5ab5"}, + {file = "lxml-5.1.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a96f02ba1bcd330807fc060ed91d1f7a20853da6dd449e5da4b09bfcc08fdcf5"}, + {file = "lxml-5.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e3898ae2b58eeafedfe99e542a17859017d72d7f6a63de0f04f99c2cb125936"}, + {file = "lxml-5.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61c5a7edbd7c695e54fca029ceb351fc45cd8860119a0f83e48be44e1c464862"}, + {file = "lxml-5.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3aeca824b38ca78d9ee2ab82bd9883083d0492d9d17df065ba3b94e88e4d7ee6"}, + {file = "lxml-5.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8f52fe6859b9db71ee609b0c0a70fea5f1e71c3462ecf144ca800d3f434f0764"}, + {file = "lxml-5.1.0-cp37-cp37m-win32.whl", hash = "sha256:d42e3a3fc18acc88b838efded0e6ec3edf3e328a58c68fbd36a7263a874906c8"}, + {file = "lxml-5.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:eac68f96539b32fce2c9b47eb7c25bb2582bdaf1bbb360d25f564ee9e04c542b"}, + {file = "lxml-5.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ae15347a88cf8af0949a9872b57a320d2605ae069bcdf047677318bc0bba45b1"}, + {file = "lxml-5.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c26aab6ea9c54d3bed716b8851c8bfc40cb249b8e9880e250d1eddde9f709bf5"}, + {file = "lxml-5.1.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:342e95bddec3a698ac24378d61996b3ee5ba9acfeb253986002ac53c9a5f6f84"}, + {file = "lxml-5.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:725e171e0b99a66ec8605ac77fa12239dbe061482ac854d25720e2294652eeaa"}, + {file = "lxml-5.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d184e0d5c918cff04cdde9dbdf9600e960161d773666958c9d7b565ccc60c45"}, + {file = "lxml-5.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:98f3f020a2b736566c707c8e034945c02aa94e124c24f77ca097c446f81b01f1"}, + {file = "lxml-5.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6d48fc57e7c1e3df57be5ae8614bab6d4e7b60f65c5457915c26892c41afc59e"}, + {file = "lxml-5.1.0-cp38-cp38-win32.whl", hash = "sha256:7ec465e6549ed97e9f1e5ed51c657c9ede767bc1c11552f7f4d022c4df4a977a"}, + {file = "lxml-5.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:b21b4031b53d25b0858d4e124f2f9131ffc1530431c6d1321805c90da78388d1"}, + {file = "lxml-5.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:52427a7eadc98f9e62cb1368a5079ae826f94f05755d2d567d93ee1bc3ceb354"}, + {file = "lxml-5.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6a2a2c724d97c1eb8cf966b16ca2915566a4904b9aad2ed9a09c748ffe14f969"}, + {file = "lxml-5.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:843b9c835580d52828d8f69ea4302537337a21e6b4f1ec711a52241ba4a824f3"}, + {file = "lxml-5.1.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9b99f564659cfa704a2dd82d0684207b1aadf7d02d33e54845f9fc78e06b7581"}, + {file = "lxml-5.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f8b0c78e7aac24979ef09b7f50da871c2de2def043d468c4b41f512d831e912"}, + {file = "lxml-5.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9bcf86dfc8ff3e992fed847c077bd875d9e0ba2fa25d859c3a0f0f76f07f0c8d"}, + {file = "lxml-5.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:49a9b4af45e8b925e1cd6f3b15bbba2c81e7dba6dce170c677c9cda547411e14"}, + {file = "lxml-5.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:280f3edf15c2a967d923bcfb1f8f15337ad36f93525828b40a0f9d6c2ad24890"}, + {file = "lxml-5.1.0-cp39-cp39-win32.whl", hash = "sha256:ed7326563024b6e91fef6b6c7a1a2ff0a71b97793ac33dbbcf38f6005e51ff6e"}, + {file = "lxml-5.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:8d7b4beebb178e9183138f552238f7e6613162a42164233e2bda00cb3afac58f"}, + {file = "lxml-5.1.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9bd0ae7cc2b85320abd5e0abad5ccee5564ed5f0cc90245d2f9a8ef330a8deae"}, + {file = "lxml-5.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8c1d679df4361408b628f42b26a5d62bd3e9ba7f0c0e7969f925021554755aa"}, + {file = "lxml-5.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:2ad3a8ce9e8a767131061a22cd28fdffa3cd2dc193f399ff7b81777f3520e372"}, + {file = "lxml-5.1.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:304128394c9c22b6569eba2a6d98392b56fbdfbad58f83ea702530be80d0f9df"}, + {file = "lxml-5.1.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d74fcaf87132ffc0447b3c685a9f862ffb5b43e70ea6beec2fb8057d5d2a1fea"}, + {file = "lxml-5.1.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:8cf5877f7ed384dabfdcc37922c3191bf27e55b498fecece9fd5c2c7aaa34c33"}, + {file = "lxml-5.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:877efb968c3d7eb2dad540b6cabf2f1d3c0fbf4b2d309a3c141f79c7e0061324"}, + {file = "lxml-5.1.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f14a4fb1c1c402a22e6a341a24c1341b4a3def81b41cd354386dcb795f83897"}, + {file = "lxml-5.1.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:25663d6e99659544ee8fe1b89b1a8c0aaa5e34b103fab124b17fa958c4a324a6"}, + {file = "lxml-5.1.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8b9f19df998761babaa7f09e6bc169294eefafd6149aaa272081cbddc7ba4ca3"}, + {file = "lxml-5.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e53d7e6a98b64fe54775d23a7c669763451340c3d44ad5e3a3b48a1efbdc96f"}, + {file = "lxml-5.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c3cd1fc1dc7c376c54440aeaaa0dcc803d2126732ff5c6b68ccd619f2e64be4f"}, + {file = "lxml-5.1.0.tar.gz", hash = "sha256:3eea6ed6e6c918e468e693c41ef07f3c3acc310b70ddd9cc72d9ef84bc9564ca"}, +] + +[package.extras] +cssselect = ["cssselect (>=0.7)"] +html5 = ["html5lib"] +htmlsoup = ["BeautifulSoup4"] +source = ["Cython (>=3.0.7)"] + +[[package]] +name = "markdown-it-py" +version = "3.0.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +optional = false +python-versions = ">=3.8" +files = [ + {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, + {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, +] + +[package.dependencies] +mdurl = ">=0.1,<1.0" + +[package.extras] +benchmarking = ["psutil", "pytest", "pytest-benchmark"] +code-style = ["pre-commit (>=3.0,<4.0)"] +compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] +linkify = ["linkify-it-py (>=1,<3)"] +plugins = ["mdit-py-plugins"] +profiling = ["gprof2dot"] +rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + +[[package]] +name = "markupsafe" +version = "2.1.5" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, + {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, +] + +[[package]] +name = "matplotlib" +version = "3.8.3" +description = "Python plotting package" +optional = false +python-versions = ">=3.9" +files = [ + {file = "matplotlib-3.8.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:cf60138ccc8004f117ab2a2bad513cc4d122e55864b4fe7adf4db20ca68a078f"}, + {file = "matplotlib-3.8.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5f557156f7116be3340cdeef7f128fa99b0d5d287d5f41a16e169819dcf22357"}, + {file = "matplotlib-3.8.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f386cf162b059809ecfac3bcc491a9ea17da69fa35c8ded8ad154cd4b933d5ec"}, + {file = "matplotlib-3.8.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3c5f96f57b0369c288bf6f9b5274ba45787f7e0589a34d24bdbaf6d3344632f"}, + {file = "matplotlib-3.8.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:83e0f72e2c116ca7e571c57aa29b0fe697d4c6425c4e87c6e994159e0c008635"}, + {file = "matplotlib-3.8.3-cp310-cp310-win_amd64.whl", hash = "sha256:1c5c8290074ba31a41db1dc332dc2b62def469ff33766cbe325d32a3ee291aea"}, + {file = "matplotlib-3.8.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:5184e07c7e1d6d1481862ee361905b7059f7fe065fc837f7c3dc11eeb3f2f900"}, + {file = "matplotlib-3.8.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d7e7e0993d0758933b1a241a432b42c2db22dfa37d4108342ab4afb9557cbe3e"}, + {file = "matplotlib-3.8.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:04b36ad07eac9740fc76c2aa16edf94e50b297d6eb4c081e3add863de4bb19a7"}, + {file = "matplotlib-3.8.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c42dae72a62f14982f1474f7e5c9959fc4bc70c9de11cc5244c6e766200ba65"}, + {file = "matplotlib-3.8.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bf5932eee0d428192c40b7eac1399d608f5d995f975cdb9d1e6b48539a5ad8d0"}, + {file = "matplotlib-3.8.3-cp311-cp311-win_amd64.whl", hash = "sha256:40321634e3a05ed02abf7c7b47a50be50b53ef3eaa3a573847431a545585b407"}, + {file = "matplotlib-3.8.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:09074f8057917d17ab52c242fdf4916f30e99959c1908958b1fc6032e2d0f6d4"}, + {file = "matplotlib-3.8.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5745f6d0fb5acfabbb2790318db03809a253096e98c91b9a31969df28ee604aa"}, + {file = "matplotlib-3.8.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b97653d869a71721b639714b42d87cda4cfee0ee74b47c569e4874c7590c55c5"}, + {file = "matplotlib-3.8.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:242489efdb75b690c9c2e70bb5c6550727058c8a614e4c7716f363c27e10bba1"}, + {file = "matplotlib-3.8.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:83c0653c64b73926730bd9ea14aa0f50f202ba187c307a881673bad4985967b7"}, + {file = "matplotlib-3.8.3-cp312-cp312-win_amd64.whl", hash = "sha256:ef6c1025a570354297d6c15f7d0f296d95f88bd3850066b7f1e7b4f2f4c13a39"}, + {file = "matplotlib-3.8.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c4af3f7317f8a1009bbb2d0bf23dfaba859eb7dd4ccbd604eba146dccaaaf0a4"}, + {file = "matplotlib-3.8.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4c6e00a65d017d26009bac6808f637b75ceade3e1ff91a138576f6b3065eeeba"}, + {file = "matplotlib-3.8.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7b49ab49a3bea17802df6872f8d44f664ba8f9be0632a60c99b20b6db2165b7"}, + {file = "matplotlib-3.8.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6728dde0a3997396b053602dbd907a9bd64ec7d5cf99e728b404083698d3ca01"}, + {file = "matplotlib-3.8.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:813925d08fb86aba139f2d31864928d67511f64e5945ca909ad5bc09a96189bb"}, + {file = "matplotlib-3.8.3-cp39-cp39-win_amd64.whl", hash = "sha256:cd3a0c2be76f4e7be03d34a14d49ded6acf22ef61f88da600a18a5cd8b3c5f3c"}, + {file = "matplotlib-3.8.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:fa93695d5c08544f4a0dfd0965f378e7afc410d8672816aff1e81be1f45dbf2e"}, + {file = "matplotlib-3.8.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9764df0e8778f06414b9d281a75235c1e85071f64bb5d71564b97c1306a2afc"}, + {file = "matplotlib-3.8.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:5e431a09e6fab4012b01fc155db0ce6dccacdbabe8198197f523a4ef4805eb26"}, + {file = "matplotlib-3.8.3.tar.gz", hash = "sha256:7b416239e9ae38be54b028abbf9048aff5054a9aba5416bef0bd17f9162ce161"}, +] + +[package.dependencies] +contourpy = ">=1.0.1" +cycler = ">=0.10" +fonttools = ">=4.22.0" +kiwisolver = ">=1.3.1" +numpy = ">=1.21,<2" +packaging = ">=20.0" +pillow = ">=8" +pyparsing = ">=2.3.1" +python-dateutil = ">=2.7" + +[[package]] +name = "matplotlib-inline" +version = "0.1.6" +description = "Inline Matplotlib backend for Jupyter" +optional = false +python-versions = ">=3.5" +files = [ + {file = "matplotlib-inline-0.1.6.tar.gz", hash = "sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304"}, + {file = "matplotlib_inline-0.1.6-py3-none-any.whl", hash = "sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311"}, +] + +[package.dependencies] +traitlets = "*" + +[[package]] +name = "mdurl" +version = "0.1.2" +description = "Markdown URL utilities" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] + +[[package]] +name = "mygene" +version = "3.2.2" +description = "Python Client for MyGene.Info services." +optional = false +python-versions = "*" +files = [ + {file = "mygene-3.2.2-py2.py3-none-any.whl", hash = "sha256:18d85d1b28ecee2be31d844607fb0c5f7d7c58573278432df819ee2a5e88fe46"}, + {file = "mygene-3.2.2.tar.gz", hash = "sha256:e729cabbc28cf5afb221bca1ab637883b375cb1a3e2f067587ec79f71affdaea"}, +] + +[package.dependencies] +biothings-client = ">=0.2.6" + +[[package]] +name = "mypy" +version = "1.8.0" +description = "Optional static typing for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "mypy-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:485a8942f671120f76afffff70f259e1cd0f0cfe08f81c05d8816d958d4577d3"}, + {file = "mypy-1.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:df9824ac11deaf007443e7ed2a4a26bebff98d2bc43c6da21b2b64185da011c4"}, + {file = "mypy-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2afecd6354bbfb6e0160f4e4ad9ba6e4e003b767dd80d85516e71f2e955ab50d"}, + {file = "mypy-1.8.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8963b83d53ee733a6e4196954502b33567ad07dfd74851f32be18eb932fb1cb9"}, + {file = "mypy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:e46f44b54ebddbeedbd3d5b289a893219065ef805d95094d16a0af6630f5d410"}, + {file = "mypy-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:855fe27b80375e5c5878492f0729540db47b186509c98dae341254c8f45f42ae"}, + {file = "mypy-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4c886c6cce2d070bd7df4ec4a05a13ee20c0aa60cb587e8d1265b6c03cf91da3"}, + {file = "mypy-1.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d19c413b3c07cbecf1f991e2221746b0d2a9410b59cb3f4fb9557f0365a1a817"}, + {file = "mypy-1.8.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9261ed810972061388918c83c3f5cd46079d875026ba97380f3e3978a72f503d"}, + {file = "mypy-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:51720c776d148bad2372ca21ca29256ed483aa9a4cdefefcef49006dff2a6835"}, + {file = "mypy-1.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:52825b01f5c4c1c4eb0db253ec09c7aa17e1a7304d247c48b6f3599ef40db8bd"}, + {file = "mypy-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f5ac9a4eeb1ec0f1ccdc6f326bcdb464de5f80eb07fb38b5ddd7b0de6bc61e55"}, + {file = "mypy-1.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afe3fe972c645b4632c563d3f3eff1cdca2fa058f730df2b93a35e3b0c538218"}, + {file = "mypy-1.8.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:42c6680d256ab35637ef88891c6bd02514ccb7e1122133ac96055ff458f93fc3"}, + {file = "mypy-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:720a5ca70e136b675af3af63db533c1c8c9181314d207568bbe79051f122669e"}, + {file = "mypy-1.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:028cf9f2cae89e202d7b6593cd98db6759379f17a319b5faf4f9978d7084cdc6"}, + {file = "mypy-1.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4e6d97288757e1ddba10dd9549ac27982e3e74a49d8d0179fc14d4365c7add66"}, + {file = "mypy-1.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f1478736fcebb90f97e40aff11a5f253af890c845ee0c850fe80aa060a267c6"}, + {file = "mypy-1.8.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42419861b43e6962a649068a61f4a4839205a3ef525b858377a960b9e2de6e0d"}, + {file = "mypy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:2b5b6c721bd4aabaadead3a5e6fa85c11c6c795e0c81a7215776ef8afc66de02"}, + {file = "mypy-1.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5c1538c38584029352878a0466f03a8ee7547d7bd9f641f57a0f3017a7c905b8"}, + {file = "mypy-1.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ef4be7baf08a203170f29e89d79064463b7fc7a0908b9d0d5114e8009c3a259"}, + {file = "mypy-1.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7178def594014aa6c35a8ff411cf37d682f428b3b5617ca79029d8ae72f5402b"}, + {file = "mypy-1.8.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ab3c84fa13c04aeeeabb2a7f67a25ef5d77ac9d6486ff33ded762ef353aa5592"}, + {file = "mypy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:99b00bc72855812a60d253420d8a2eae839b0afa4938f09f4d2aa9bb4654263a"}, + {file = "mypy-1.8.0-py3-none-any.whl", hash = "sha256:538fd81bb5e430cc1381a443971c0475582ff9f434c16cd46d2c66763ce85d9d"}, + {file = "mypy-1.8.0.tar.gz", hash = "sha256:6ff8b244d7085a0b425b56d327b480c3b29cafbd2eff27316a004f9a7391ae07"}, +] + +[package.dependencies] +mypy-extensions = ">=1.0.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typing-extensions = ">=4.1.0" + +[package.extras] +dmypy = ["psutil (>=4.0)"] +install-types = ["pip"] +mypyc = ["setuptools (>=50)"] +reports = ["lxml"] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." +optional = false +python-versions = ">=3.5" +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] + +[[package]] +name = "nest-asyncio" +version = "1.6.0" +description = "Patch asyncio to allow nested event loops" +optional = false +python-versions = ">=3.5" +files = [ + {file = "nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c"}, + {file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"}, +] + +[[package]] +name = "nodeenv" +version = "1.8.0" +description = "Node.js virtual environment builder" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" +files = [ + {file = "nodeenv-1.8.0-py2.py3-none-any.whl", hash = "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec"}, + {file = "nodeenv-1.8.0.tar.gz", hash = "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2"}, +] + +[package.dependencies] +setuptools = "*" + +[[package]] +name = "numpy" +version = "1.26.4" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, + {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, + {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, + {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, + {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, + {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, + {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, + {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, + {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, + {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, +] + +[[package]] +name = "oauthlib" +version = "3.2.2" +description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" +optional = false +python-versions = ">=3.6" +files = [ + {file = "oauthlib-3.2.2-py3-none-any.whl", hash = "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca"}, + {file = "oauthlib-3.2.2.tar.gz", hash = "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918"}, +] + +[package.extras] +rsa = ["cryptography (>=3.0.0)"] +signals = ["blinker (>=1.4.0)"] +signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] + +[[package]] +name = "openai" +version = "1.13.3" +description = "The official Python library for the openai API" +optional = false +python-versions = ">=3.7.1" +files = [ + {file = "openai-1.13.3-py3-none-any.whl", hash = "sha256:5769b62abd02f350a8dd1a3a242d8972c947860654466171d60fb0972ae0a41c"}, + {file = "openai-1.13.3.tar.gz", hash = "sha256:ff6c6b3bc7327e715e4b3592a923a5a1c7519ff5dd764a83d69f633d49e77a7b"}, +] + +[package.dependencies] +anyio = ">=3.5.0,<5" +distro = ">=1.7.0,<2" +httpx = ">=0.23.0,<1" +pydantic = ">=1.9.0,<3" +sniffio = "*" +tqdm = ">4" +typing-extensions = ">=4.7,<5" + +[package.extras] +datalib = ["numpy (>=1)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] + +[[package]] +name = "openpyxl" +version = "3.1.2" +description = "A Python library to read/write Excel 2010 xlsx/xlsm files" +optional = false +python-versions = ">=3.6" +files = [ + {file = "openpyxl-3.1.2-py2.py3-none-any.whl", hash = "sha256:f91456ead12ab3c6c2e9491cf33ba6d08357d802192379bb482f1033ade496f5"}, + {file = "openpyxl-3.1.2.tar.gz", hash = "sha256:a6f5977418eff3b2d5500d54d9db50c8277a368436f4e4f8ddb1be3422870184"}, +] + +[package.dependencies] +et-xmlfile = "*" + +[[package]] +name = "packaging" +version = "23.2" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, + {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, +] + +[[package]] +name = "palantir-oauth-client" +version = "1.6.0" +description = "OAuth2 client for Palantir Foundry" +optional = false +python-versions = ">=3.8,<4.0" +files = [ + {file = "palantir-oauth-client-1.6.0.tar.gz", hash = "sha256:8341967ac463168016dd219d797265f76bd2fb955b5eb4142bbc958fad54e428"}, + {file = "palantir_oauth_client-1.6.0-py3-none-any.whl", hash = "sha256:5430e8fe322866b9c7dfb2a2272ee58a3866cd90c321cce16685f396f5282ec8"}, +] + +[package.dependencies] +oauthlib = ">=3.2.2,<4.0.0" +requests = ">=2.28.2,<3.0.0" +requests-oauthlib = ">=1.3.1,<2.0.0" + +[[package]] +name = "pandas" +version = "2.2.1" +description = "Powerful data structures for data analysis, time series, and statistics" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pandas-2.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8df8612be9cd1c7797c93e1c5df861b2ddda0b48b08f2c3eaa0702cf88fb5f88"}, + {file = "pandas-2.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0f573ab277252ed9aaf38240f3b54cfc90fff8e5cab70411ee1d03f5d51f3944"}, + {file = "pandas-2.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f02a3a6c83df4026e55b63c1f06476c9aa3ed6af3d89b4f04ea656ccdaaaa359"}, + {file = "pandas-2.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c38ce92cb22a4bea4e3929429aa1067a454dcc9c335799af93ba9be21b6beb51"}, + {file = "pandas-2.2.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c2ce852e1cf2509a69e98358e8458775f89599566ac3775e70419b98615f4b06"}, + {file = "pandas-2.2.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:53680dc9b2519cbf609c62db3ed7c0b499077c7fefda564e330286e619ff0dd9"}, + {file = "pandas-2.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:94e714a1cca63e4f5939cdce5f29ba8d415d85166be3441165edd427dc9f6bc0"}, + {file = "pandas-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f821213d48f4ab353d20ebc24e4faf94ba40d76680642fb7ce2ea31a3ad94f9b"}, + {file = "pandas-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c70e00c2d894cb230e5c15e4b1e1e6b2b478e09cf27cc593a11ef955b9ecc81a"}, + {file = "pandas-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e97fbb5387c69209f134893abc788a6486dbf2f9e511070ca05eed4b930b1b02"}, + {file = "pandas-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:101d0eb9c5361aa0146f500773395a03839a5e6ecde4d4b6ced88b7e5a1a6403"}, + {file = "pandas-2.2.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7d2ed41c319c9fb4fd454fe25372028dfa417aacb9790f68171b2e3f06eae8cd"}, + {file = "pandas-2.2.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:af5d3c00557d657c8773ef9ee702c61dd13b9d7426794c9dfeb1dc4a0bf0ebc7"}, + {file = "pandas-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:06cf591dbaefb6da9de8472535b185cba556d0ce2e6ed28e21d919704fef1a9e"}, + {file = "pandas-2.2.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:88ecb5c01bb9ca927ebc4098136038519aa5d66b44671861ffab754cae75102c"}, + {file = "pandas-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:04f6ec3baec203c13e3f8b139fb0f9f86cd8c0b94603ae3ae8ce9a422e9f5bee"}, + {file = "pandas-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a935a90a76c44fe170d01e90a3594beef9e9a6220021acfb26053d01426f7dc2"}, + {file = "pandas-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c391f594aae2fd9f679d419e9a4d5ba4bce5bb13f6a989195656e7dc4b95c8f0"}, + {file = "pandas-2.2.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9d1265545f579edf3f8f0cb6f89f234f5e44ba725a34d86535b1a1d38decbccc"}, + {file = "pandas-2.2.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:11940e9e3056576ac3244baef2fedade891977bcc1cb7e5cc8f8cc7d603edc89"}, + {file = "pandas-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:4acf681325ee1c7f950d058b05a820441075b0dd9a2adf5c4835b9bc056bf4fb"}, + {file = "pandas-2.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9bd8a40f47080825af4317d0340c656744f2bfdb6819f818e6ba3cd24c0e1397"}, + {file = "pandas-2.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:df0c37ebd19e11d089ceba66eba59a168242fc6b7155cba4ffffa6eccdfb8f16"}, + {file = "pandas-2.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:739cc70eaf17d57608639e74d63387b0d8594ce02f69e7a0b046f117974b3019"}, + {file = "pandas-2.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9d3558d263073ed95e46f4650becff0c5e1ffe0fc3a015de3c79283dfbdb3df"}, + {file = "pandas-2.2.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4aa1d8707812a658debf03824016bf5ea0d516afdea29b7dc14cf687bc4d4ec6"}, + {file = "pandas-2.2.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:76f27a809cda87e07f192f001d11adc2b930e93a2b0c4a236fde5429527423be"}, + {file = "pandas-2.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:1ba21b1d5c0e43416218db63037dbe1a01fc101dc6e6024bcad08123e48004ab"}, + {file = "pandas-2.2.1.tar.gz", hash = "sha256:0ab90f87093c13f3e8fa45b48ba9f39181046e8f3317d3aadb2fffbb1b978572"}, +] + +[package.dependencies] +numpy = [ + {version = ">=1.22.4,<2", markers = "python_version < \"3.11\""}, + {version = ">=1.23.2,<2", markers = "python_version == \"3.11\""}, + {version = ">=1.26.0,<2", markers = "python_version >= \"3.12\""}, +] +python-dateutil = ">=2.8.2" +pytz = ">=2020.1" +tzdata = ">=2022.7" + +[package.extras] +all = ["PyQt5 (>=5.15.9)", "SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)", "beautifulsoup4 (>=4.11.2)", "bottleneck (>=1.3.6)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=2022.12.0)", "fsspec (>=2022.11.0)", "gcsfs (>=2022.11.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.9.2)", "matplotlib (>=3.6.3)", "numba (>=0.56.4)", "numexpr (>=2.8.4)", "odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "pandas-gbq (>=0.19.0)", "psycopg2 (>=2.9.6)", "pyarrow (>=10.0.1)", "pymysql (>=1.0.2)", "pyreadstat (>=1.2.0)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "qtpy (>=2.3.0)", "s3fs (>=2022.11.0)", "scipy (>=1.10.0)", "tables (>=3.8.0)", "tabulate (>=0.9.0)", "xarray (>=2022.12.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)", "zstandard (>=0.19.0)"] +aws = ["s3fs (>=2022.11.0)"] +clipboard = ["PyQt5 (>=5.15.9)", "qtpy (>=2.3.0)"] +compression = ["zstandard (>=0.19.0)"] +computation = ["scipy (>=1.10.0)", "xarray (>=2022.12.0)"] +consortium-standard = ["dataframe-api-compat (>=0.1.7)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)"] +feather = ["pyarrow (>=10.0.1)"] +fss = ["fsspec (>=2022.11.0)"] +gcp = ["gcsfs (>=2022.11.0)", "pandas-gbq (>=0.19.0)"] +hdf5 = ["tables (>=3.8.0)"] +html = ["beautifulsoup4 (>=4.11.2)", "html5lib (>=1.1)", "lxml (>=4.9.2)"] +mysql = ["SQLAlchemy (>=2.0.0)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.9.0)"] +parquet = ["pyarrow (>=10.0.1)"] +performance = ["bottleneck (>=1.3.6)", "numba (>=0.56.4)", "numexpr (>=2.8.4)"] +plot = ["matplotlib (>=3.6.3)"] +postgresql = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "psycopg2 (>=2.9.6)"] +pyarrow = ["pyarrow (>=10.0.1)"] +spss = ["pyreadstat (>=1.2.0)"] +sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)"] +test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] +xml = ["lxml (>=4.9.2)"] + +[[package]] +name = "parso" +version = "0.8.3" +description = "A Python Parser" +optional = false +python-versions = ">=3.6" +files = [ + {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, + {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"}, +] + +[package.extras] +qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] +testing = ["docopt", "pytest (<6.0.0)"] + +[[package]] +name = "pathspec" +version = "0.12.1" +description = "Utility library for gitignore style pattern matching of file paths." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, + {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, +] + +[[package]] +name = "pdfminer" +version = "20191125" +description = "PDF parser and analyzer" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pdfminer-20191125.tar.gz", hash = "sha256:9e700bc731300ed5c8936343c1dd4529638184198e54e91dd2b59b64a755dc01"}, +] + +[package.dependencies] +pycryptodome = "*" + +[[package]] +name = "pdfminer-six" +version = "20221105" +description = "PDF parser and analyzer" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pdfminer.six-20221105-py3-none-any.whl", hash = "sha256:1eaddd712d5b2732f8ac8486824533514f8ba12a0787b3d5fe1e686cd826532d"}, + {file = "pdfminer.six-20221105.tar.gz", hash = "sha256:8448ab7b939d18b64820478ecac5394f482d7a79f5f7eaa7703c6c959c175e1d"}, +] + +[package.dependencies] +charset-normalizer = ">=2.0.0" +cryptography = ">=36.0.0" + +[package.extras] +dev = ["black", "mypy (==0.931)", "nox", "pytest"] +docs = ["sphinx", "sphinx-argparse"] +image = ["Pillow"] + +[[package]] +name = "pdfplumber" +version = "0.10.4" +description = "Plumb a PDF for detailed information about each char, rectangle, and line." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pdfplumber-0.10.4-py3-none-any.whl", hash = "sha256:c8f200259703324cd39a5c93b181a0d2370a6b2b6da670c117e75c3da6aca4a4"}, + {file = "pdfplumber-0.10.4.tar.gz", hash = "sha256:1c83a4e1fe75525ce1f161fa55a8142209a2da69b45542ce2c45be879e804fd6"}, +] + +[package.dependencies] +"pdfminer.six" = "20221105" +Pillow = ">=9.1" +pypdfium2 = ">=4.18.0" + +[[package]] +name = "pexpect" +version = "4.9.0" +description = "Pexpect allows easy control of interactive console applications." +optional = false +python-versions = "*" +files = [ + {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, + {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, +] + +[package.dependencies] +ptyprocess = ">=0.5" + +[[package]] +name = "pillow" +version = "10.2.0" +description = "Python Imaging Library (Fork)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pillow-10.2.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:7823bdd049099efa16e4246bdf15e5a13dbb18a51b68fa06d6c1d4d8b99a796e"}, + {file = "pillow-10.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:83b2021f2ade7d1ed556bc50a399127d7fb245e725aa0113ebd05cfe88aaf588"}, + {file = "pillow-10.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fad5ff2f13d69b7e74ce5b4ecd12cc0ec530fcee76356cac6742785ff71c452"}, + {file = "pillow-10.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da2b52b37dad6d9ec64e653637a096905b258d2fc2b984c41ae7d08b938a67e4"}, + {file = "pillow-10.2.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:47c0995fc4e7f79b5cfcab1fc437ff2890b770440f7696a3ba065ee0fd496563"}, + {file = "pillow-10.2.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:322bdf3c9b556e9ffb18f93462e5f749d3444ce081290352c6070d014c93feb2"}, + {file = "pillow-10.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:51f1a1bffc50e2e9492e87d8e09a17c5eea8409cda8d3f277eb6edc82813c17c"}, + {file = "pillow-10.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:69ffdd6120a4737710a9eee73e1d2e37db89b620f702754b8f6e62594471dee0"}, + {file = "pillow-10.2.0-cp310-cp310-win32.whl", hash = "sha256:c6dafac9e0f2b3c78df97e79af707cdc5ef8e88208d686a4847bab8266870023"}, + {file = "pillow-10.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:aebb6044806f2e16ecc07b2a2637ee1ef67a11840a66752751714a0d924adf72"}, + {file = "pillow-10.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:7049e301399273a0136ff39b84c3678e314f2158f50f517bc50285fb5ec847ad"}, + {file = "pillow-10.2.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:35bb52c37f256f662abdfa49d2dfa6ce5d93281d323a9af377a120e89a9eafb5"}, + {file = "pillow-10.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9c23f307202661071d94b5e384e1e1dc7dfb972a28a2310e4ee16103e66ddb67"}, + {file = "pillow-10.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:773efe0603db30c281521a7c0214cad7836c03b8ccff897beae9b47c0b657d61"}, + {file = "pillow-10.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11fa2e5984b949b0dd6d7a94d967743d87c577ff0b83392f17cb3990d0d2fd6e"}, + {file = "pillow-10.2.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:716d30ed977be8b37d3ef185fecb9e5a1d62d110dfbdcd1e2a122ab46fddb03f"}, + {file = "pillow-10.2.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a086c2af425c5f62a65e12fbf385f7c9fcb8f107d0849dba5839461a129cf311"}, + {file = "pillow-10.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c8de2789052ed501dd829e9cae8d3dcce7acb4777ea4a479c14521c942d395b1"}, + {file = "pillow-10.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:609448742444d9290fd687940ac0b57fb35e6fd92bdb65386e08e99af60bf757"}, + {file = "pillow-10.2.0-cp311-cp311-win32.whl", hash = "sha256:823ef7a27cf86df6597fa0671066c1b596f69eba53efa3d1e1cb8b30f3533068"}, + {file = "pillow-10.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:1da3b2703afd040cf65ec97efea81cfba59cdbed9c11d8efc5ab09df9509fc56"}, + {file = "pillow-10.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:edca80cbfb2b68d7b56930b84a0e45ae1694aeba0541f798e908a49d66b837f1"}, + {file = "pillow-10.2.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:1b5e1b74d1bd1b78bc3477528919414874748dd363e6272efd5abf7654e68bef"}, + {file = "pillow-10.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0eae2073305f451d8ecacb5474997c08569fb4eb4ac231ffa4ad7d342fdc25ac"}, + {file = "pillow-10.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7c2286c23cd350b80d2fc9d424fc797575fb16f854b831d16fd47ceec078f2c"}, + {file = "pillow-10.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e23412b5c41e58cec602f1135c57dfcf15482013ce6e5f093a86db69646a5aa"}, + {file = "pillow-10.2.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:52a50aa3fb3acb9cf7213573ef55d31d6eca37f5709c69e6858fe3bc04a5c2a2"}, + {file = "pillow-10.2.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:127cee571038f252a552760076407f9cff79761c3d436a12af6000cd182a9d04"}, + {file = "pillow-10.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8d12251f02d69d8310b046e82572ed486685c38f02176bd08baf216746eb947f"}, + {file = "pillow-10.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:54f1852cd531aa981bc0965b7d609f5f6cc8ce8c41b1139f6ed6b3c54ab82bfb"}, + {file = "pillow-10.2.0-cp312-cp312-win32.whl", hash = "sha256:257d8788df5ca62c980314053197f4d46eefedf4e6175bc9412f14412ec4ea2f"}, + {file = "pillow-10.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:154e939c5f0053a383de4fd3d3da48d9427a7e985f58af8e94d0b3c9fcfcf4f9"}, + {file = "pillow-10.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:f379abd2f1e3dddb2b61bc67977a6b5a0a3f7485538bcc6f39ec76163891ee48"}, + {file = "pillow-10.2.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8373c6c251f7ef8bda6675dd6d2b3a0fcc31edf1201266b5cf608b62a37407f9"}, + {file = "pillow-10.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:870ea1ada0899fd0b79643990809323b389d4d1d46c192f97342eeb6ee0b8483"}, + {file = "pillow-10.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4b6b1e20608493548b1f32bce8cca185bf0480983890403d3b8753e44077129"}, + {file = "pillow-10.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3031709084b6e7852d00479fd1d310b07d0ba82765f973b543c8af5061cf990e"}, + {file = "pillow-10.2.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:3ff074fc97dd4e80543a3e91f69d58889baf2002b6be64347ea8cf5533188213"}, + {file = "pillow-10.2.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:cb4c38abeef13c61d6916f264d4845fab99d7b711be96c326b84df9e3e0ff62d"}, + {file = "pillow-10.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b1b3020d90c2d8e1dae29cf3ce54f8094f7938460fb5ce8bc5c01450b01fbaf6"}, + {file = "pillow-10.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:170aeb00224ab3dc54230c797f8404507240dd868cf52066f66a41b33169bdbe"}, + {file = "pillow-10.2.0-cp38-cp38-win32.whl", hash = "sha256:c4225f5220f46b2fde568c74fca27ae9771536c2e29d7c04f4fb62c83275ac4e"}, + {file = "pillow-10.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:0689b5a8c5288bc0504d9fcee48f61a6a586b9b98514d7d29b840143d6734f39"}, + {file = "pillow-10.2.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:b792a349405fbc0163190fde0dc7b3fef3c9268292586cf5645598b48e63dc67"}, + {file = "pillow-10.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c570f24be1e468e3f0ce7ef56a89a60f0e05b30a3669a459e419c6eac2c35364"}, + {file = "pillow-10.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8ecd059fdaf60c1963c58ceb8997b32e9dc1b911f5da5307aab614f1ce5c2fb"}, + {file = "pillow-10.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c365fd1703040de1ec284b176d6af5abe21b427cb3a5ff68e0759e1e313a5e7e"}, + {file = "pillow-10.2.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:70c61d4c475835a19b3a5aa42492409878bbca7438554a1f89d20d58a7c75c01"}, + {file = "pillow-10.2.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b6f491cdf80ae540738859d9766783e3b3c8e5bd37f5dfa0b76abdecc5081f13"}, + {file = "pillow-10.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d189550615b4948f45252d7f005e53c2040cea1af5b60d6f79491a6e147eef7"}, + {file = "pillow-10.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:49d9ba1ed0ef3e061088cd1e7538a0759aab559e2e0a80a36f9fd9d8c0c21591"}, + {file = "pillow-10.2.0-cp39-cp39-win32.whl", hash = "sha256:babf5acfede515f176833ed6028754cbcd0d206f7f614ea3447d67c33be12516"}, + {file = "pillow-10.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:0304004f8067386b477d20a518b50f3fa658a28d44e4116970abfcd94fac34a8"}, + {file = "pillow-10.2.0-cp39-cp39-win_arm64.whl", hash = "sha256:0fb3e7fc88a14eacd303e90481ad983fd5b69c761e9e6ef94c983f91025da869"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:322209c642aabdd6207517e9739c704dc9f9db943015535783239022002f054a"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3eedd52442c0a5ff4f887fab0c1c0bb164d8635b32c894bc1faf4c618dd89df2"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb28c753fd5eb3dd859b4ee95de66cc62af91bcff5db5f2571d32a520baf1f04"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:33870dc4653c5017bf4c8873e5488d8f8d5f8935e2f1fb9a2208c47cdd66efd2"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3c31822339516fb3c82d03f30e22b1d038da87ef27b6a78c9549888f8ceda39a"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a2b56ba36e05f973d450582fb015594aaa78834fefe8dfb8fcd79b93e64ba4c6"}, + {file = "pillow-10.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:d8e6aeb9201e655354b3ad049cb77d19813ad4ece0df1249d3c793de3774f8c7"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:2247178effb34a77c11c0e8ac355c7a741ceca0a732b27bf11e747bbc950722f"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15587643b9e5eb26c48e49a7b33659790d28f190fc514a322d55da2fb5c2950e"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753cd8f2086b2b80180d9b3010dd4ed147efc167c90d3bf593fe2af21265e5a5"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:7c8f97e8e7a9009bcacbe3766a36175056c12f9a44e6e6f2d5caad06dcfbf03b"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d1b35bcd6c5543b9cb547dee3150c93008f8dd0f1fef78fc0cd2b141c5baf58a"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fe4c15f6c9285dc54ce6553a3ce908ed37c8f3825b5a51a15c91442bb955b868"}, + {file = "pillow-10.2.0.tar.gz", hash = "sha256:e87f0b2c78157e12d7686b27d63c070fd65d994e8ddae6f328e0dcf4a0cd007e"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] +fpx = ["olefile"] +mic = ["olefile"] +tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] +typing = ["typing-extensions"] +xmp = ["defusedxml"] + +[[package]] +name = "platformdirs" +version = "4.2.0" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +optional = false +python-versions = ">=3.8" +files = [ + {file = "platformdirs-4.2.0-py3-none-any.whl", hash = "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068"}, + {file = "platformdirs-4.2.0.tar.gz", hash = "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768"}, +] + +[package.extras] +docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] + +[[package]] +name = "pluggy" +version = "1.4.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pluggy-1.4.0-py3-none-any.whl", hash = "sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981"}, + {file = "pluggy-1.4.0.tar.gz", hash = "sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "pooch" +version = "1.8.1" +description = "\"Pooch manages your Python library's sample data files: it automatically downloads and stores them in a local directory, with support for versioning and corruption checks.\"" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pooch-1.8.1-py3-none-any.whl", hash = "sha256:6b56611ac320c239faece1ac51a60b25796792599ce5c0b1bb87bf01df55e0a9"}, + {file = "pooch-1.8.1.tar.gz", hash = "sha256:27ef63097dd9a6e4f9d2694f5cfbf2f0a5defa44fccafec08d601e731d746270"}, +] + +[package.dependencies] +packaging = ">=20.0" +platformdirs = ">=2.5.0" +requests = ">=2.19.0" + +[package.extras] +progress = ["tqdm (>=4.41.0,<5.0.0)"] +sftp = ["paramiko (>=2.7.0)"] +xxhash = ["xxhash (>=1.4.3)"] + +[[package]] +name = "pre-commit" +version = "3.6.2" +description = "A framework for managing and maintaining multi-language pre-commit hooks." +optional = false +python-versions = ">=3.9" +files = [ + {file = "pre_commit-3.6.2-py2.py3-none-any.whl", hash = "sha256:ba637c2d7a670c10daedc059f5c49b5bd0aadbccfcd7ec15592cf9665117532c"}, + {file = "pre_commit-3.6.2.tar.gz", hash = "sha256:c3ef34f463045c88658c5b99f38c1e297abdcc0ff13f98d3370055fbbfabc67e"}, +] + +[package.dependencies] +cfgv = ">=2.0.0" +identify = ">=1.0.0" +nodeenv = ">=0.11.1" +pyyaml = ">=5.1" +virtualenv = ">=20.10.0" + +[[package]] +name = "prompt-toolkit" +version = "3.0.43" +description = "Library for building powerful interactive command lines in Python" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "prompt_toolkit-3.0.43-py3-none-any.whl", hash = "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6"}, + {file = "prompt_toolkit-3.0.43.tar.gz", hash = "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d"}, +] + +[package.dependencies] +wcwidth = "*" + +[[package]] +name = "protobuf" +version = "4.25.3" +description = "" +optional = false +python-versions = ">=3.8" +files = [ + {file = "protobuf-4.25.3-cp310-abi3-win32.whl", hash = "sha256:d4198877797a83cbfe9bffa3803602bbe1625dc30d8a097365dbc762e5790faa"}, + {file = "protobuf-4.25.3-cp310-abi3-win_amd64.whl", hash = "sha256:209ba4cc916bab46f64e56b85b090607a676f66b473e6b762e6f1d9d591eb2e8"}, + {file = "protobuf-4.25.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:f1279ab38ecbfae7e456a108c5c0681e4956d5b1090027c1de0f934dfdb4b35c"}, + {file = "protobuf-4.25.3-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:e7cb0ae90dd83727f0c0718634ed56837bfeeee29a5f82a7514c03ee1364c019"}, + {file = "protobuf-4.25.3-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:7c8daa26095f82482307bc717364e7c13f4f1c99659be82890dcfc215194554d"}, + {file = "protobuf-4.25.3-cp38-cp38-win32.whl", hash = "sha256:f4f118245c4a087776e0a8408be33cf09f6c547442c00395fbfb116fac2f8ac2"}, + {file = "protobuf-4.25.3-cp38-cp38-win_amd64.whl", hash = "sha256:c053062984e61144385022e53678fbded7aea14ebb3e0305ae3592fb219ccfa4"}, + {file = "protobuf-4.25.3-cp39-cp39-win32.whl", hash = "sha256:19b270aeaa0099f16d3ca02628546b8baefe2955bbe23224aaf856134eccf1e4"}, + {file = "protobuf-4.25.3-cp39-cp39-win_amd64.whl", hash = "sha256:e3c97a1555fd6388f857770ff8b9703083de6bf1f9274a002a332d65fbb56c8c"}, + {file = "protobuf-4.25.3-py3-none-any.whl", hash = "sha256:f0700d54bcf45424477e46a9f0944155b46fb0639d69728739c0e47bab83f2b9"}, + {file = "protobuf-4.25.3.tar.gz", hash = "sha256:25b5d0b42fd000320bd7830b349e3b696435f3b329810427a6bcce6a5492cc5c"}, +] + +[[package]] +name = "psutil" +version = "5.9.8" +description = "Cross-platform lib for process and system monitoring in Python." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "psutil-5.9.8-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:26bd09967ae00920df88e0352a91cff1a78f8d69b3ecabbfe733610c0af486c8"}, + {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:05806de88103b25903dff19bb6692bd2e714ccf9e668d050d144012055cbca73"}, + {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:611052c4bc70432ec770d5d54f64206aa7203a101ec273a0cd82418c86503bb7"}, + {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:50187900d73c1381ba1454cf40308c2bf6f34268518b3f36a9b663ca87e65e36"}, + {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:02615ed8c5ea222323408ceba16c60e99c3f91639b07da6373fb7e6539abc56d"}, + {file = "psutil-5.9.8-cp27-none-win32.whl", hash = "sha256:36f435891adb138ed3c9e58c6af3e2e6ca9ac2f365efe1f9cfef2794e6c93b4e"}, + {file = "psutil-5.9.8-cp27-none-win_amd64.whl", hash = "sha256:bd1184ceb3f87651a67b2708d4c3338e9b10c5df903f2e3776b62303b26cb631"}, + {file = "psutil-5.9.8-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:aee678c8720623dc456fa20659af736241f575d79429a0e5e9cf88ae0605cc81"}, + {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cb6403ce6d8e047495a701dc7c5bd788add903f8986d523e3e20b98b733e421"}, + {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d06016f7f8625a1825ba3732081d77c94589dca78b7a3fc072194851e88461a4"}, + {file = "psutil-5.9.8-cp36-cp36m-win32.whl", hash = "sha256:7d79560ad97af658a0f6adfef8b834b53f64746d45b403f225b85c5c2c140eee"}, + {file = "psutil-5.9.8-cp36-cp36m-win_amd64.whl", hash = "sha256:27cc40c3493bb10de1be4b3f07cae4c010ce715290a5be22b98493509c6299e2"}, + {file = "psutil-5.9.8-cp37-abi3-win32.whl", hash = "sha256:bc56c2a1b0d15aa3eaa5a60c9f3f8e3e565303b465dbf57a1b730e7a2b9844e0"}, + {file = "psutil-5.9.8-cp37-abi3-win_amd64.whl", hash = "sha256:8db4c1b57507eef143a15a6884ca10f7c73876cdf5d51e713151c1236a0e68cf"}, + {file = "psutil-5.9.8-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:d16bbddf0693323b8c6123dd804100241da461e41d6e332fb0ba6058f630f8c8"}, + {file = "psutil-5.9.8.tar.gz", hash = "sha256:6be126e3225486dff286a8fb9a06246a5253f4c7c53b475ea5f5ac934e64194c"}, +] + +[package.extras] +test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +description = "Run a subprocess in a pseudo terminal" +optional = false +python-versions = "*" +files = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] + +[[package]] +name = "pure-eval" +version = "0.2.2" +description = "Safely evaluate AST nodes without side effects" +optional = false +python-versions = "*" +files = [ + {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, + {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, +] + +[package.extras] +tests = ["pytest"] + +[[package]] +name = "py3dmol" +version = "2.0.4" +description = "An IPython interface for embedding 3Dmol.js views in Jupyter notebooks" +optional = false +python-versions = "*" +files = [ + {file = "py3Dmol-2.0.4-py2.py3-none-any.whl", hash = "sha256:356a3a9fee9c48be9b010228790ce394bd4d90d3fd47448964fcbfa6dc5e0a84"}, + {file = "py3Dmol-2.0.4.tar.gz", hash = "sha256:07909c587ba7e40d17e2ca9383193ead807af834f9569b108cff784ec4cfb525"}, +] + +[package.extras] +ipython = ["IPython"] + +[[package]] +name = "pyarrow" +version = "15.0.0" +description = "Python library for Apache Arrow" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyarrow-15.0.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:0a524532fd6dd482edaa563b686d754c70417c2f72742a8c990b322d4c03a15d"}, + {file = "pyarrow-15.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:60a6bdb314affa9c2e0d5dddf3d9cbb9ef4a8dddaa68669975287d47ece67642"}, + {file = "pyarrow-15.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:66958fd1771a4d4b754cd385835e66a3ef6b12611e001d4e5edfcef5f30391e2"}, + {file = "pyarrow-15.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f500956a49aadd907eaa21d4fff75f73954605eaa41f61cb94fb008cf2e00c6"}, + {file = "pyarrow-15.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:6f87d9c4f09e049c2cade559643424da84c43a35068f2a1c4653dc5b1408a929"}, + {file = "pyarrow-15.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:85239b9f93278e130d86c0e6bb455dcb66fc3fd891398b9d45ace8799a871a1e"}, + {file = "pyarrow-15.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:5b8d43e31ca16aa6e12402fcb1e14352d0d809de70edd185c7650fe80e0769e3"}, + {file = "pyarrow-15.0.0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:fa7cd198280dbd0c988df525e50e35b5d16873e2cdae2aaaa6363cdb64e3eec5"}, + {file = "pyarrow-15.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8780b1a29d3c8b21ba6b191305a2a607de2e30dab399776ff0aa09131e266340"}, + {file = "pyarrow-15.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe0ec198ccc680f6c92723fadcb97b74f07c45ff3fdec9dd765deb04955ccf19"}, + {file = "pyarrow-15.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:036a7209c235588c2f07477fe75c07e6caced9b7b61bb897c8d4e52c4b5f9555"}, + {file = "pyarrow-15.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:2bd8a0e5296797faf9a3294e9fa2dc67aa7f10ae2207920dbebb785c77e9dbe5"}, + {file = "pyarrow-15.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:e8ebed6053dbe76883a822d4e8da36860f479d55a762bd9e70d8494aed87113e"}, + {file = "pyarrow-15.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:17d53a9d1b2b5bd7d5e4cd84d018e2a45bc9baaa68f7e6e3ebed45649900ba99"}, + {file = "pyarrow-15.0.0-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:9950a9c9df24090d3d558b43b97753b8f5867fb8e521f29876aa021c52fda351"}, + {file = "pyarrow-15.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:003d680b5e422d0204e7287bb3fa775b332b3fce2996aa69e9adea23f5c8f970"}, + {file = "pyarrow-15.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f75fce89dad10c95f4bf590b765e3ae98bcc5ba9f6ce75adb828a334e26a3d40"}, + {file = "pyarrow-15.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca9cb0039923bec49b4fe23803807e4ef39576a2bec59c32b11296464623dc2"}, + {file = "pyarrow-15.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:9ed5a78ed29d171d0acc26a305a4b7f83c122d54ff5270810ac23c75813585e4"}, + {file = "pyarrow-15.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:6eda9e117f0402dfcd3cd6ec9bfee89ac5071c48fc83a84f3075b60efa96747f"}, + {file = "pyarrow-15.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:9a3a6180c0e8f2727e6f1b1c87c72d3254cac909e609f35f22532e4115461177"}, + {file = "pyarrow-15.0.0-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:19a8918045993349b207de72d4576af0191beef03ea655d8bdb13762f0cd6eac"}, + {file = "pyarrow-15.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d0ec076b32bacb6666e8813a22e6e5a7ef1314c8069d4ff345efa6246bc38593"}, + {file = "pyarrow-15.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5db1769e5d0a77eb92344c7382d6543bea1164cca3704f84aa44e26c67e320fb"}, + {file = "pyarrow-15.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2617e3bf9df2a00020dd1c1c6dce5cc343d979efe10bc401c0632b0eef6ef5b"}, + {file = "pyarrow-15.0.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:d31c1d45060180131caf10f0f698e3a782db333a422038bf7fe01dace18b3a31"}, + {file = "pyarrow-15.0.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:c8c287d1d479de8269398b34282e206844abb3208224dbdd7166d580804674b7"}, + {file = "pyarrow-15.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:07eb7f07dc9ecbb8dace0f58f009d3a29ee58682fcdc91337dfeb51ea618a75b"}, + {file = "pyarrow-15.0.0-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:47af7036f64fce990bb8a5948c04722e4e3ea3e13b1007ef52dfe0aa8f23cf7f"}, + {file = "pyarrow-15.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:93768ccfff85cf044c418bfeeafce9a8bb0cee091bd8fd19011aff91e58de540"}, + {file = "pyarrow-15.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6ee87fd6892700960d90abb7b17a72a5abb3b64ee0fe8db6c782bcc2d0dc0b4"}, + {file = "pyarrow-15.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:001fca027738c5f6be0b7a3159cc7ba16a5c52486db18160909a0831b063c4e4"}, + {file = "pyarrow-15.0.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:d1c48648f64aec09accf44140dccb92f4f94394b8d79976c426a5b79b11d4fa7"}, + {file = "pyarrow-15.0.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:972a0141be402bb18e3201448c8ae62958c9c7923dfaa3b3d4530c835ac81aed"}, + {file = "pyarrow-15.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:f01fc5cf49081426429127aa2d427d9d98e1cb94a32cb961d583a70b7c4504e6"}, + {file = "pyarrow-15.0.0.tar.gz", hash = "sha256:876858f549d540898f927eba4ef77cd549ad8d24baa3207cf1b72e5788b50e83"}, +] + +[package.dependencies] +numpy = ">=1.16.6,<2" + +[[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 = "pycryptodome" +version = "3.20.0" +description = "Cryptographic library for Python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "pycryptodome-3.20.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:f0e6d631bae3f231d3634f91ae4da7a960f7ff87f2865b2d2b831af1dfb04e9a"}, + {file = "pycryptodome-3.20.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:baee115a9ba6c5d2709a1e88ffe62b73ecc044852a925dcb67713a288c4ec70f"}, + {file = "pycryptodome-3.20.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:417a276aaa9cb3be91f9014e9d18d10e840a7a9b9a9be64a42f553c5b50b4d1d"}, + {file = "pycryptodome-3.20.0-cp27-cp27m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a1250b7ea809f752b68e3e6f3fd946b5939a52eaeea18c73bdab53e9ba3c2dd"}, + {file = "pycryptodome-3.20.0-cp27-cp27m-musllinux_1_1_aarch64.whl", hash = "sha256:d5954acfe9e00bc83ed9f5cb082ed22c592fbbef86dc48b907238be64ead5c33"}, + {file = "pycryptodome-3.20.0-cp27-cp27m-win32.whl", hash = "sha256:06d6de87c19f967f03b4cf9b34e538ef46e99a337e9a61a77dbe44b2cbcf0690"}, + {file = "pycryptodome-3.20.0-cp27-cp27m-win_amd64.whl", hash = "sha256:ec0bb1188c1d13426039af8ffcb4dbe3aad1d7680c35a62d8eaf2a529b5d3d4f"}, + {file = "pycryptodome-3.20.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:5601c934c498cd267640b57569e73793cb9a83506f7c73a8ec57a516f5b0b091"}, + {file = "pycryptodome-3.20.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d29daa681517f4bc318cd8a23af87e1f2a7bad2fe361e8aa29c77d652a065de4"}, + {file = "pycryptodome-3.20.0-cp27-cp27mu-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3427d9e5310af6680678f4cce149f54e0bb4af60101c7f2c16fdf878b39ccccc"}, + {file = "pycryptodome-3.20.0-cp27-cp27mu-musllinux_1_1_aarch64.whl", hash = "sha256:3cd3ef3aee1079ae44afaeee13393cf68b1058f70576b11439483e34f93cf818"}, + {file = "pycryptodome-3.20.0-cp35-abi3-macosx_10_9_universal2.whl", hash = "sha256:ac1c7c0624a862f2e53438a15c9259d1655325fc2ec4392e66dc46cdae24d044"}, + {file = "pycryptodome-3.20.0-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:76658f0d942051d12a9bd08ca1b6b34fd762a8ee4240984f7c06ddfb55eaf15a"}, + {file = "pycryptodome-3.20.0-cp35-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f35d6cee81fa145333137009d9c8ba90951d7d77b67c79cbe5f03c7eb74d8fe2"}, + {file = "pycryptodome-3.20.0-cp35-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76cb39afede7055127e35a444c1c041d2e8d2f1f9c121ecef573757ba4cd2c3c"}, + {file = "pycryptodome-3.20.0-cp35-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49a4c4dc60b78ec41d2afa392491d788c2e06edf48580fbfb0dd0f828af49d25"}, + {file = "pycryptodome-3.20.0-cp35-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fb3b87461fa35afa19c971b0a2b7456a7b1db7b4eba9a8424666104925b78128"}, + {file = "pycryptodome-3.20.0-cp35-abi3-musllinux_1_1_i686.whl", hash = "sha256:acc2614e2e5346a4a4eab6e199203034924313626f9620b7b4b38e9ad74b7e0c"}, + {file = "pycryptodome-3.20.0-cp35-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:210ba1b647837bfc42dd5a813cdecb5b86193ae11a3f5d972b9a0ae2c7e9e4b4"}, + {file = "pycryptodome-3.20.0-cp35-abi3-win32.whl", hash = "sha256:8d6b98d0d83d21fb757a182d52940d028564efe8147baa9ce0f38d057104ae72"}, + {file = "pycryptodome-3.20.0-cp35-abi3-win_amd64.whl", hash = "sha256:9b3ae153c89a480a0ec402e23db8d8d84a3833b65fa4b15b81b83be9d637aab9"}, + {file = "pycryptodome-3.20.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:4401564ebf37dfde45d096974c7a159b52eeabd9969135f0426907db367a652a"}, + {file = "pycryptodome-3.20.0-pp27-pypy_73-win32.whl", hash = "sha256:ec1f93feb3bb93380ab0ebf8b859e8e5678c0f010d2d78367cf6bc30bfeb148e"}, + {file = "pycryptodome-3.20.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:acae12b9ede49f38eb0ef76fdec2df2e94aad85ae46ec85be3648a57f0a7db04"}, + {file = "pycryptodome-3.20.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f47888542a0633baff535a04726948e876bf1ed880fddb7c10a736fa99146ab3"}, + {file = "pycryptodome-3.20.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e0e4a987d38cfc2e71b4a1b591bae4891eeabe5fa0f56154f576e26287bfdea"}, + {file = "pycryptodome-3.20.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c18b381553638414b38705f07d1ef0a7cf301bc78a5f9bc17a957eb19446834b"}, + {file = "pycryptodome-3.20.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a60fedd2b37b4cb11ccb5d0399efe26db9e0dd149016c1cc6c8161974ceac2d6"}, + {file = "pycryptodome-3.20.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:405002eafad114a2f9a930f5db65feef7b53c4784495dd8758069b89baf68eab"}, + {file = "pycryptodome-3.20.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ab6ab0cb755154ad14e507d1df72de9897e99fd2d4922851a276ccc14f4f1a5"}, + {file = "pycryptodome-3.20.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:acf6e43fa75aca2d33e93409f2dafe386fe051818ee79ee8a3e21de9caa2ac9e"}, + {file = "pycryptodome-3.20.0.tar.gz", hash = "sha256:09609209ed7de61c2b560cc5c8c4fbf892f8b15b1faf7e4cbffac97db1fffda7"}, +] + +[[package]] +name = "pydantic" +version = "2.6.3" +description = "Data validation using Python type hints" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic-2.6.3-py3-none-any.whl", hash = "sha256:72c6034df47f46ccdf81869fddb81aade68056003900a8724a4f160700016a2a"}, + {file = "pydantic-2.6.3.tar.gz", hash = "sha256:e07805c4c7f5c6826e33a1d4c9d47950d7eaf34868e2690f8594d2e30241f11f"}, +] + +[package.dependencies] +annotated-types = ">=0.4.0" +pydantic-core = "2.16.3" +typing-extensions = ">=4.6.1" + +[package.extras] +email = ["email-validator (>=2.0.0)"] + +[[package]] +name = "pydantic-core" +version = "2.16.3" +description = "" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic_core-2.16.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:75b81e678d1c1ede0785c7f46690621e4c6e63ccd9192af1f0bd9d504bbb6bf4"}, + {file = "pydantic_core-2.16.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9c865a7ee6f93783bd5d781af5a4c43dadc37053a5b42f7d18dc019f8c9d2bd1"}, + {file = "pydantic_core-2.16.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:162e498303d2b1c036b957a1278fa0899d02b2842f1ff901b6395104c5554a45"}, + {file = "pydantic_core-2.16.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2f583bd01bbfbff4eaee0868e6fc607efdfcc2b03c1c766b06a707abbc856187"}, + {file = "pydantic_core-2.16.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b926dd38db1519ed3043a4de50214e0d600d404099c3392f098a7f9d75029ff8"}, + {file = "pydantic_core-2.16.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:716b542728d4c742353448765aa7cdaa519a7b82f9564130e2b3f6766018c9ec"}, + {file = "pydantic_core-2.16.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc4ad7f7ee1a13d9cb49d8198cd7d7e3aa93e425f371a68235f784e99741561f"}, + {file = "pydantic_core-2.16.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bd87f48924f360e5d1c5f770d6155ce0e7d83f7b4e10c2f9ec001c73cf475c99"}, + {file = "pydantic_core-2.16.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0df446663464884297c793874573549229f9eca73b59360878f382a0fc085979"}, + {file = "pydantic_core-2.16.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4df8a199d9f6afc5ae9a65f8f95ee52cae389a8c6b20163762bde0426275b7db"}, + {file = "pydantic_core-2.16.3-cp310-none-win32.whl", hash = "sha256:456855f57b413f077dff513a5a28ed838dbbb15082ba00f80750377eed23d132"}, + {file = "pydantic_core-2.16.3-cp310-none-win_amd64.whl", hash = "sha256:732da3243e1b8d3eab8c6ae23ae6a58548849d2e4a4e03a1924c8ddf71a387cb"}, + {file = "pydantic_core-2.16.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:519ae0312616026bf4cedc0fe459e982734f3ca82ee8c7246c19b650b60a5ee4"}, + {file = "pydantic_core-2.16.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b3992a322a5617ded0a9f23fd06dbc1e4bd7cf39bc4ccf344b10f80af58beacd"}, + {file = "pydantic_core-2.16.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d62da299c6ecb04df729e4b5c52dc0d53f4f8430b4492b93aa8de1f541c4aac"}, + {file = "pydantic_core-2.16.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2acca2be4bb2f2147ada8cac612f8a98fc09f41c89f87add7256ad27332c2fda"}, + {file = "pydantic_core-2.16.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1b662180108c55dfbf1280d865b2d116633d436cfc0bba82323554873967b340"}, + {file = "pydantic_core-2.16.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e7c6ed0dc9d8e65f24f5824291550139fe6f37fac03788d4580da0d33bc00c97"}, + {file = "pydantic_core-2.16.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6b1bb0827f56654b4437955555dc3aeeebeddc47c2d7ed575477f082622c49e"}, + {file = "pydantic_core-2.16.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e56f8186d6210ac7ece503193ec84104da7ceb98f68ce18c07282fcc2452e76f"}, + {file = "pydantic_core-2.16.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:936e5db01dd49476fa8f4383c259b8b1303d5dd5fb34c97de194560698cc2c5e"}, + {file = "pydantic_core-2.16.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:33809aebac276089b78db106ee692bdc9044710e26f24a9a2eaa35a0f9fa70ba"}, + {file = "pydantic_core-2.16.3-cp311-none-win32.whl", hash = "sha256:ded1c35f15c9dea16ead9bffcde9bb5c7c031bff076355dc58dcb1cb436c4721"}, + {file = "pydantic_core-2.16.3-cp311-none-win_amd64.whl", hash = "sha256:d89ca19cdd0dd5f31606a9329e309d4fcbb3df860960acec32630297d61820df"}, + {file = "pydantic_core-2.16.3-cp311-none-win_arm64.whl", hash = "sha256:6162f8d2dc27ba21027f261e4fa26f8bcb3cf9784b7f9499466a311ac284b5b9"}, + {file = "pydantic_core-2.16.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:0f56ae86b60ea987ae8bcd6654a887238fd53d1384f9b222ac457070b7ac4cff"}, + {file = "pydantic_core-2.16.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c9bd22a2a639e26171068f8ebb5400ce2c1bc7d17959f60a3b753ae13c632975"}, + {file = "pydantic_core-2.16.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4204e773b4b408062960e65468d5346bdfe139247ee5f1ca2a378983e11388a2"}, + {file = "pydantic_core-2.16.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f651dd19363c632f4abe3480a7c87a9773be27cfe1341aef06e8759599454120"}, + {file = "pydantic_core-2.16.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aaf09e615a0bf98d406657e0008e4a8701b11481840be7d31755dc9f97c44053"}, + {file = "pydantic_core-2.16.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8e47755d8152c1ab5b55928ab422a76e2e7b22b5ed8e90a7d584268dd49e9c6b"}, + {file = "pydantic_core-2.16.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:500960cb3a0543a724a81ba859da816e8cf01b0e6aaeedf2c3775d12ee49cade"}, + {file = "pydantic_core-2.16.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cf6204fe865da605285c34cf1172879d0314ff267b1c35ff59de7154f35fdc2e"}, + {file = "pydantic_core-2.16.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d33dd21f572545649f90c38c227cc8631268ba25c460b5569abebdd0ec5974ca"}, + {file = "pydantic_core-2.16.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:49d5d58abd4b83fb8ce763be7794d09b2f50f10aa65c0f0c1696c677edeb7cbf"}, + {file = "pydantic_core-2.16.3-cp312-none-win32.whl", hash = "sha256:f53aace168a2a10582e570b7736cc5bef12cae9cf21775e3eafac597e8551fbe"}, + {file = "pydantic_core-2.16.3-cp312-none-win_amd64.whl", hash = "sha256:0d32576b1de5a30d9a97f300cc6a3f4694c428d956adbc7e6e2f9cad279e45ed"}, + {file = "pydantic_core-2.16.3-cp312-none-win_arm64.whl", hash = "sha256:ec08be75bb268473677edb83ba71e7e74b43c008e4a7b1907c6d57e940bf34b6"}, + {file = "pydantic_core-2.16.3-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:b1f6f5938d63c6139860f044e2538baeee6f0b251a1816e7adb6cbce106a1f01"}, + {file = "pydantic_core-2.16.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2a1ef6a36fdbf71538142ed604ad19b82f67b05749512e47f247a6ddd06afdc7"}, + {file = "pydantic_core-2.16.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:704d35ecc7e9c31d48926150afada60401c55efa3b46cd1ded5a01bdffaf1d48"}, + {file = "pydantic_core-2.16.3-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d937653a696465677ed583124b94a4b2d79f5e30b2c46115a68e482c6a591c8a"}, + {file = "pydantic_core-2.16.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c9803edf8e29bd825f43481f19c37f50d2b01899448273b3a7758441b512acf8"}, + {file = "pydantic_core-2.16.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:72282ad4892a9fb2da25defeac8c2e84352c108705c972db82ab121d15f14e6d"}, + {file = "pydantic_core-2.16.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f752826b5b8361193df55afcdf8ca6a57d0232653494ba473630a83ba50d8c9"}, + {file = "pydantic_core-2.16.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4384a8f68ddb31a0b0c3deae88765f5868a1b9148939c3f4121233314ad5532c"}, + {file = "pydantic_core-2.16.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a4b2bf78342c40b3dc830880106f54328928ff03e357935ad26c7128bbd66ce8"}, + {file = "pydantic_core-2.16.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:13dcc4802961b5f843a9385fc821a0b0135e8c07fc3d9949fd49627c1a5e6ae5"}, + {file = "pydantic_core-2.16.3-cp38-none-win32.whl", hash = "sha256:e3e70c94a0c3841e6aa831edab1619ad5c511199be94d0c11ba75fe06efe107a"}, + {file = "pydantic_core-2.16.3-cp38-none-win_amd64.whl", hash = "sha256:ecdf6bf5f578615f2e985a5e1f6572e23aa632c4bd1dc67f8f406d445ac115ed"}, + {file = "pydantic_core-2.16.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:bda1ee3e08252b8d41fa5537413ffdddd58fa73107171a126d3b9ff001b9b820"}, + {file = "pydantic_core-2.16.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:21b888c973e4f26b7a96491c0965a8a312e13be108022ee510248fe379a5fa23"}, + {file = "pydantic_core-2.16.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be0ec334369316fa73448cc8c982c01e5d2a81c95969d58b8f6e272884df0074"}, + {file = "pydantic_core-2.16.3-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b5b6079cc452a7c53dd378c6f881ac528246b3ac9aae0f8eef98498a75657805"}, + {file = "pydantic_core-2.16.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ee8d5f878dccb6d499ba4d30d757111847b6849ae07acdd1205fffa1fc1253c"}, + {file = "pydantic_core-2.16.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7233d65d9d651242a68801159763d09e9ec96e8a158dbf118dc090cd77a104c9"}, + {file = "pydantic_core-2.16.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c6119dc90483a5cb50a1306adb8d52c66e447da88ea44f323e0ae1a5fcb14256"}, + {file = "pydantic_core-2.16.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:578114bc803a4c1ff9946d977c221e4376620a46cf78da267d946397dc9514a8"}, + {file = "pydantic_core-2.16.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d8f99b147ff3fcf6b3cc60cb0c39ea443884d5559a30b1481e92495f2310ff2b"}, + {file = "pydantic_core-2.16.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4ac6b4ce1e7283d715c4b729d8f9dab9627586dafce81d9eaa009dd7f25dd972"}, + {file = "pydantic_core-2.16.3-cp39-none-win32.whl", hash = "sha256:e7774b570e61cb998490c5235740d475413a1f6de823169b4cf94e2fe9e9f6b2"}, + {file = "pydantic_core-2.16.3-cp39-none-win_amd64.whl", hash = "sha256:9091632a25b8b87b9a605ec0e61f241c456e9248bfdcf7abdf344fdb169c81cf"}, + {file = "pydantic_core-2.16.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:36fa178aacbc277bc6b62a2c3da95226520da4f4e9e206fdf076484363895d2c"}, + {file = "pydantic_core-2.16.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:dcca5d2bf65c6fb591fff92da03f94cd4f315972f97c21975398bd4bd046854a"}, + {file = "pydantic_core-2.16.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a72fb9963cba4cd5793854fd12f4cfee731e86df140f59ff52a49b3552db241"}, + {file = "pydantic_core-2.16.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b60cc1a081f80a2105a59385b92d82278b15d80ebb3adb200542ae165cd7d183"}, + {file = "pydantic_core-2.16.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cbcc558401de90a746d02ef330c528f2e668c83350f045833543cd57ecead1ad"}, + {file = "pydantic_core-2.16.3-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:fee427241c2d9fb7192b658190f9f5fd6dfe41e02f3c1489d2ec1e6a5ab1e04a"}, + {file = "pydantic_core-2.16.3-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f4cb85f693044e0f71f394ff76c98ddc1bc0953e48c061725e540396d5c8a2e1"}, + {file = "pydantic_core-2.16.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:b29eeb887aa931c2fcef5aa515d9d176d25006794610c264ddc114c053bf96fe"}, + {file = "pydantic_core-2.16.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a425479ee40ff021f8216c9d07a6a3b54b31c8267c6e17aa88b70d7ebd0e5e5b"}, + {file = "pydantic_core-2.16.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:5c5cbc703168d1b7a838668998308018a2718c2130595e8e190220238addc96f"}, + {file = "pydantic_core-2.16.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99b6add4c0b39a513d323d3b93bc173dac663c27b99860dd5bf491b240d26137"}, + {file = "pydantic_core-2.16.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f76ee558751746d6a38f89d60b6228fa174e5172d143886af0f85aa306fd89"}, + {file = "pydantic_core-2.16.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:00ee1c97b5364b84cb0bd82e9bbf645d5e2871fb8c58059d158412fee2d33d8a"}, + {file = "pydantic_core-2.16.3-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:287073c66748f624be4cef893ef9174e3eb88fe0b8a78dc22e88eca4bc357ca6"}, + {file = "pydantic_core-2.16.3-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ed25e1835c00a332cb10c683cd39da96a719ab1dfc08427d476bce41b92531fc"}, + {file = "pydantic_core-2.16.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:86b3d0033580bd6bbe07590152007275bd7af95f98eaa5bd36f3da219dcd93da"}, + {file = "pydantic_core-2.16.3.tar.gz", hash = "sha256:1cac689f80a3abab2d3c0048b29eea5751114054f032a941a32de4c852c59cad"}, +] + +[package.dependencies] +typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" + +[[package]] +name = "pydeck" +version = "0.8.0" +description = "Widget for deck.gl maps" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pydeck-0.8.0-py2.py3-none-any.whl", hash = "sha256:a8fa7757c6f24bba033af39db3147cb020eef44012ba7e60d954de187f9ed4d5"}, + {file = "pydeck-0.8.0.tar.gz", hash = "sha256:07edde833f7cfcef6749124351195aa7dcd24663d4909fd7898dbd0b6fbc01ec"}, +] + +[package.dependencies] +jinja2 = ">=2.10.1" +numpy = ">=1.16.4" + +[package.extras] +carto = ["pydeck-carto"] +jupyter = ["ipykernel (>=5.1.2)", "ipython (>=5.8.0)", "ipywidgets (>=7,<8)", "traitlets (>=4.3.2)"] + +[[package]] +name = "pygments" +version = "2.17.2" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.7" +files = [ + {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, + {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, +] + +[package.extras] +plugins = ["importlib-metadata"] +windows-terminal = ["colorama (>=0.4.6)"] + +[[package]] +name = "pyparsing" +version = "3.1.1" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +optional = false +python-versions = ">=3.6.8" +files = [ + {file = "pyparsing-3.1.1-py3-none-any.whl", hash = "sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb"}, + {file = "pyparsing-3.1.1.tar.gz", hash = "sha256:ede28a1a32462f5a9705e07aea48001a08f7cf81a021585011deba701581a0db"}, +] + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + +[[package]] +name = "pypdf2" +version = "3.0.1" +description = "A pure-python PDF library capable of splitting, merging, cropping, and transforming PDF files" +optional = false +python-versions = ">=3.6" +files = [ + {file = "PyPDF2-3.0.1.tar.gz", hash = "sha256:a74408f69ba6271f71b9352ef4ed03dc53a31aa404d29b5d31f53bfecfee1440"}, + {file = "pypdf2-3.0.1-py3-none-any.whl", hash = "sha256:d16e4205cfee272fbdc0568b68d82be796540b1537508cef59388f839c191928"}, +] + +[package.extras] +crypto = ["PyCryptodome"] +dev = ["black", "flit", "pip-tools", "pre-commit (<2.18.0)", "pytest-cov", "wheel"] +docs = ["myst_parser", "sphinx", "sphinx_rtd_theme"] +full = ["Pillow", "PyCryptodome"] +image = ["Pillow"] + +[[package]] +name = "pypdfium2" +version = "4.27.0" +description = "Python bindings to PDFium" +optional = false +python-versions = ">= 3.6" +files = [ + {file = "pypdfium2-4.27.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:2938f423c79b49df9057993f747e537a05b71bc2c847801ac743f27c3220d363"}, + {file = "pypdfium2-4.27.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:f396941e070bf6c245890f2ffb2cb04f39585e3cda93ebb1648f1ed0e99b921f"}, + {file = "pypdfium2-4.27.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d593649fd787c4521f3b8e84892a070d62c19ae3dee7995f38e760e4e14c7c5"}, + {file = "pypdfium2-4.27.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:abb16df75dd0ba1c92553bbc9127edce46d59008047bb68abbf002963495d561"}, + {file = "pypdfium2-4.27.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:69c76670e62db707fa5374eb8c71c2e9f9e4d6518707cd47725f7c2725129f8a"}, + {file = "pypdfium2-4.27.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40fe503afef2a4c8180c75c1bb3c98eead4c60158b859c440c4c4bf4fa5b3ece"}, + {file = "pypdfium2-4.27.0-py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:bfeb8337c1435ecaa584649b21b691152e06be3b01db761a2cd863fb2fdfda04"}, + {file = "pypdfium2-4.27.0-py3-none-musllinux_1_1_i686.whl", hash = "sha256:83c5c12714a5302b9947fe8fe97b003e9b934dec2529e5c10414d3ef5a3c8f19"}, + {file = "pypdfium2-4.27.0-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:c85e6f4fe5475665237da8a698e92c68339bdbc3257e2bcb325feacde5873dbc"}, + {file = "pypdfium2-4.27.0-py3-none-win32.whl", hash = "sha256:5c3413d4eeab8f2618b7af7d827dde5b7d40e752033c555e5889508b94f42090"}, + {file = "pypdfium2-4.27.0-py3-none-win_amd64.whl", hash = "sha256:597d262152e4aff36f6b2a395826c74c28977055b3b7233963cc91b243c74c78"}, + {file = "pypdfium2-4.27.0-py3-none-win_arm64.whl", hash = "sha256:ee4f4f433c9896953ef2ff8622a0912775b88380f91c6a2b8126fc5387d05620"}, + {file = "pypdfium2-4.27.0.tar.gz", hash = "sha256:1ff6ac30b98850558c0d163e37fdb868f683b1b2e8ae734072138571a0546222"}, +] + +[[package]] +name = "pyproj" +version = "3.6.1" +description = "Python interface to PROJ (cartographic projections and coordinate transformations library)" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pyproj-3.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ab7aa4d9ff3c3acf60d4b285ccec134167a948df02347585fdd934ebad8811b4"}, + {file = "pyproj-3.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4bc0472302919e59114aa140fd7213c2370d848a7249d09704f10f5b062031fe"}, + {file = "pyproj-3.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5279586013b8d6582e22b6f9e30c49796966770389a9d5b85e25a4223286cd3f"}, + {file = "pyproj-3.6.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80fafd1f3eb421694857f254a9bdbacd1eb22fc6c24ca74b136679f376f97d35"}, + {file = "pyproj-3.6.1-cp310-cp310-win32.whl", hash = "sha256:c41e80ddee130450dcb8829af7118f1ab69eaf8169c4bf0ee8d52b72f098dc2f"}, + {file = "pyproj-3.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:db3aedd458e7f7f21d8176f0a1d924f1ae06d725228302b872885a1c34f3119e"}, + {file = "pyproj-3.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ebfbdbd0936e178091309f6cd4fcb4decd9eab12aa513cdd9add89efa3ec2882"}, + {file = "pyproj-3.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:447db19c7efad70ff161e5e46a54ab9cc2399acebb656b6ccf63e4bc4a04b97a"}, + {file = "pyproj-3.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7e13c40183884ec7f94eb8e0f622f08f1d5716150b8d7a134de48c6110fee85"}, + {file = "pyproj-3.6.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65ad699e0c830e2b8565afe42bd58cc972b47d829b2e0e48ad9638386d994915"}, + {file = "pyproj-3.6.1-cp311-cp311-win32.whl", hash = "sha256:8b8acc31fb8702c54625f4d5a2a6543557bec3c28a0ef638778b7ab1d1772132"}, + {file = "pyproj-3.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:38a3361941eb72b82bd9a18f60c78b0df8408416f9340521df442cebfc4306e2"}, + {file = "pyproj-3.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1e9fbaf920f0f9b4ee62aab832be3ae3968f33f24e2e3f7fbb8c6728ef1d9746"}, + {file = "pyproj-3.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6d227a865356f225591b6732430b1d1781e946893789a609bb34f59d09b8b0f8"}, + {file = "pyproj-3.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83039e5ae04e5afc974f7d25ee0870a80a6bd6b7957c3aca5613ccbe0d3e72bf"}, + {file = "pyproj-3.6.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb059ba3bced6f6725961ba758649261d85ed6ce670d3e3b0a26e81cf1aa8d"}, + {file = "pyproj-3.6.1-cp312-cp312-win32.whl", hash = "sha256:2d6ff73cc6dbbce3766b6c0bce70ce070193105d8de17aa2470009463682a8eb"}, + {file = "pyproj-3.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:7a27151ddad8e1439ba70c9b4b2b617b290c39395fa9ddb7411ebb0eb86d6fb0"}, + {file = "pyproj-3.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4ba1f9b03d04d8cab24d6375609070580a26ce76eaed54631f03bab00a9c737b"}, + {file = "pyproj-3.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:18faa54a3ca475bfe6255156f2f2874e9a1c8917b0004eee9f664b86ccc513d3"}, + {file = "pyproj-3.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd43bd9a9b9239805f406fd82ba6b106bf4838d9ef37c167d3ed70383943ade1"}, + {file = "pyproj-3.6.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50100b2726a3ca946906cbaa789dd0749f213abf0cbb877e6de72ca7aa50e1ae"}, + {file = "pyproj-3.6.1-cp39-cp39-win32.whl", hash = "sha256:9274880263256f6292ff644ca92c46d96aa7e57a75c6df3f11d636ce845a1877"}, + {file = "pyproj-3.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:36b64c2cb6ea1cc091f329c5bd34f9c01bb5da8c8e4492c709bda6a09f96808f"}, + {file = "pyproj-3.6.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fd93c1a0c6c4aedc77c0fe275a9f2aba4d59b8acf88cebfc19fe3c430cfabf4f"}, + {file = "pyproj-3.6.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6420ea8e7d2a88cb148b124429fba8cd2e0fae700a2d96eab7083c0928a85110"}, + {file = "pyproj-3.6.1.tar.gz", hash = "sha256:44aa7c704c2b7d8fb3d483bbf75af6cb2350d30a63b144279a09b75fead501bf"}, +] + +[package.dependencies] +certifi = "*" + +[[package]] +name = "pytest" +version = "8.0.2" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pytest-8.0.2-py3-none-any.whl", hash = "sha256:edfaaef32ce5172d5466b5127b42e0d6d35ebbe4453f0e3505d96afd93f6b096"}, + {file = "pytest-8.0.2.tar.gz", hash = "sha256:d4051d623a2e0b7e51960ba963193b09ce6daeb9759a451844a21e4ddedfc1bd"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=1.3.0,<2.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "python-dotenv" +version = "1.0.1" +description = "Read key-value pairs from a .env file and set them as environment variables" +optional = false +python-versions = ">=3.8" +files = [ + {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, + {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, +] + +[package.extras] +cli = ["click (>=5.0)"] + +[[package]] +name = "pytz" +version = "2024.1" +description = "World timezone definitions, modern and historical" +optional = false +python-versions = "*" +files = [ + {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, + {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, +] + +[[package]] +name = "pywin32" +version = "306" +description = "Python for Window Extensions" +optional = false +python-versions = "*" +files = [ + {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"}, + {file = "pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8"}, + {file = "pywin32-306-cp311-cp311-win32.whl", hash = "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407"}, + {file = "pywin32-306-cp311-cp311-win_amd64.whl", hash = "sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e"}, + {file = "pywin32-306-cp311-cp311-win_arm64.whl", hash = "sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a"}, + {file = "pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b"}, + {file = "pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e"}, + {file = "pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040"}, + {file = "pywin32-306-cp37-cp37m-win32.whl", hash = "sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65"}, + {file = "pywin32-306-cp37-cp37m-win_amd64.whl", hash = "sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36"}, + {file = "pywin32-306-cp38-cp38-win32.whl", hash = "sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a"}, + {file = "pywin32-306-cp38-cp38-win_amd64.whl", hash = "sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0"}, + {file = "pywin32-306-cp39-cp39-win32.whl", hash = "sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802"}, + {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"}, +] + +[[package]] +name = "pyyaml" +version = "6.0.1" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, + {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, + {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, + {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, + {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, + {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, + {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, + {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, + {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, + {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, + {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, + {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, +] + +[[package]] +name = "pyzmq" +version = "25.1.2" +description = "Python bindings for 0MQ" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pyzmq-25.1.2-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:e624c789359f1a16f83f35e2c705d07663ff2b4d4479bad35621178d8f0f6ea4"}, + {file = "pyzmq-25.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:49151b0efece79f6a79d41a461d78535356136ee70084a1c22532fc6383f4ad0"}, + {file = "pyzmq-25.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9a5f194cf730f2b24d6af1f833c14c10f41023da46a7f736f48b6d35061e76e"}, + {file = "pyzmq-25.1.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:faf79a302f834d9e8304fafdc11d0d042266667ac45209afa57e5efc998e3872"}, + {file = "pyzmq-25.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f51a7b4ead28d3fca8dda53216314a553b0f7a91ee8fc46a72b402a78c3e43d"}, + {file = "pyzmq-25.1.2-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:0ddd6d71d4ef17ba5a87becf7ddf01b371eaba553c603477679ae817a8d84d75"}, + {file = "pyzmq-25.1.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:246747b88917e4867e2367b005fc8eefbb4a54b7db363d6c92f89d69abfff4b6"}, + {file = "pyzmq-25.1.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:00c48ae2fd81e2a50c3485de1b9d5c7c57cd85dc8ec55683eac16846e57ac979"}, + {file = "pyzmq-25.1.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5a68d491fc20762b630e5db2191dd07ff89834086740f70e978bb2ef2668be08"}, + {file = "pyzmq-25.1.2-cp310-cp310-win32.whl", hash = "sha256:09dfe949e83087da88c4a76767df04b22304a682d6154de2c572625c62ad6886"}, + {file = "pyzmq-25.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:fa99973d2ed20417744fca0073390ad65ce225b546febb0580358e36aa90dba6"}, + {file = "pyzmq-25.1.2-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:82544e0e2d0c1811482d37eef297020a040c32e0687c1f6fc23a75b75db8062c"}, + {file = "pyzmq-25.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:01171fc48542348cd1a360a4b6c3e7d8f46cdcf53a8d40f84db6707a6768acc1"}, + {file = "pyzmq-25.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc69c96735ab501419c432110016329bf0dea8898ce16fab97c6d9106dc0b348"}, + {file = "pyzmq-25.1.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3e124e6b1dd3dfbeb695435dff0e383256655bb18082e094a8dd1f6293114642"}, + {file = "pyzmq-25.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7598d2ba821caa37a0f9d54c25164a4fa351ce019d64d0b44b45540950458840"}, + {file = "pyzmq-25.1.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d1299d7e964c13607efd148ca1f07dcbf27c3ab9e125d1d0ae1d580a1682399d"}, + {file = "pyzmq-25.1.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4e6f689880d5ad87918430957297c975203a082d9a036cc426648fcbedae769b"}, + {file = "pyzmq-25.1.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cc69949484171cc961e6ecd4a8911b9ce7a0d1f738fcae717177c231bf77437b"}, + {file = "pyzmq-25.1.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9880078f683466b7f567b8624bfc16cad65077be046b6e8abb53bed4eeb82dd3"}, + {file = "pyzmq-25.1.2-cp311-cp311-win32.whl", hash = "sha256:4e5837af3e5aaa99a091302df5ee001149baff06ad22b722d34e30df5f0d9097"}, + {file = "pyzmq-25.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:25c2dbb97d38b5ac9fd15586e048ec5eb1e38f3d47fe7d92167b0c77bb3584e9"}, + {file = "pyzmq-25.1.2-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:11e70516688190e9c2db14fcf93c04192b02d457b582a1f6190b154691b4c93a"}, + {file = "pyzmq-25.1.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:313c3794d650d1fccaaab2df942af9f2c01d6217c846177cfcbc693c7410839e"}, + {file = "pyzmq-25.1.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b3cbba2f47062b85fe0ef9de5b987612140a9ba3a9c6d2543c6dec9f7c2ab27"}, + {file = "pyzmq-25.1.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fc31baa0c32a2ca660784d5af3b9487e13b61b3032cb01a115fce6588e1bed30"}, + {file = "pyzmq-25.1.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02c9087b109070c5ab0b383079fa1b5f797f8d43e9a66c07a4b8b8bdecfd88ee"}, + {file = "pyzmq-25.1.2-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:f8429b17cbb746c3e043cb986328da023657e79d5ed258b711c06a70c2ea7537"}, + {file = "pyzmq-25.1.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5074adeacede5f810b7ef39607ee59d94e948b4fd954495bdb072f8c54558181"}, + {file = "pyzmq-25.1.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:7ae8f354b895cbd85212da245f1a5ad8159e7840e37d78b476bb4f4c3f32a9fe"}, + {file = "pyzmq-25.1.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b264bf2cc96b5bc43ce0e852be995e400376bd87ceb363822e2cb1964fcdc737"}, + {file = "pyzmq-25.1.2-cp312-cp312-win32.whl", hash = "sha256:02bbc1a87b76e04fd780b45e7f695471ae6de747769e540da909173d50ff8e2d"}, + {file = "pyzmq-25.1.2-cp312-cp312-win_amd64.whl", hash = "sha256:ced111c2e81506abd1dc142e6cd7b68dd53747b3b7ae5edbea4578c5eeff96b7"}, + {file = "pyzmq-25.1.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:7b6d09a8962a91151f0976008eb7b29b433a560fde056ec7a3db9ec8f1075438"}, + {file = "pyzmq-25.1.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:967668420f36878a3c9ecb5ab33c9d0ff8d054f9c0233d995a6d25b0e95e1b6b"}, + {file = "pyzmq-25.1.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5edac3f57c7ddaacdb4d40f6ef2f9e299471fc38d112f4bc6d60ab9365445fb0"}, + {file = "pyzmq-25.1.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:0dabfb10ef897f3b7e101cacba1437bd3a5032ee667b7ead32bbcdd1a8422fe7"}, + {file = "pyzmq-25.1.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:2c6441e0398c2baacfe5ba30c937d274cfc2dc5b55e82e3749e333aabffde561"}, + {file = "pyzmq-25.1.2-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:16b726c1f6c2e7625706549f9dbe9b06004dfbec30dbed4bf50cbdfc73e5b32a"}, + {file = "pyzmq-25.1.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:a86c2dd76ef71a773e70551a07318b8e52379f58dafa7ae1e0a4be78efd1ff16"}, + {file = "pyzmq-25.1.2-cp36-cp36m-win32.whl", hash = "sha256:359f7f74b5d3c65dae137f33eb2bcfa7ad9ebefd1cab85c935f063f1dbb245cc"}, + {file = "pyzmq-25.1.2-cp36-cp36m-win_amd64.whl", hash = "sha256:55875492f820d0eb3417b51d96fea549cde77893ae3790fd25491c5754ea2f68"}, + {file = "pyzmq-25.1.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b8c8a419dfb02e91b453615c69568442e897aaf77561ee0064d789705ff37a92"}, + {file = "pyzmq-25.1.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8807c87fa893527ae8a524c15fc505d9950d5e856f03dae5921b5e9aa3b8783b"}, + {file = "pyzmq-25.1.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5e319ed7d6b8f5fad9b76daa0a68497bc6f129858ad956331a5835785761e003"}, + {file = "pyzmq-25.1.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:3c53687dde4d9d473c587ae80cc328e5b102b517447456184b485587ebd18b62"}, + {file = "pyzmq-25.1.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:9add2e5b33d2cd765ad96d5eb734a5e795a0755f7fc49aa04f76d7ddda73fd70"}, + {file = "pyzmq-25.1.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:e690145a8c0c273c28d3b89d6fb32c45e0d9605b2293c10e650265bf5c11cfec"}, + {file = "pyzmq-25.1.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:00a06faa7165634f0cac1abb27e54d7a0b3b44eb9994530b8ec73cf52e15353b"}, + {file = "pyzmq-25.1.2-cp37-cp37m-win32.whl", hash = "sha256:0f97bc2f1f13cb16905a5f3e1fbdf100e712d841482b2237484360f8bc4cb3d7"}, + {file = "pyzmq-25.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6cc0020b74b2e410287e5942e1e10886ff81ac77789eb20bec13f7ae681f0fdd"}, + {file = "pyzmq-25.1.2-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:bef02cfcbded83473bdd86dd8d3729cd82b2e569b75844fb4ea08fee3c26ae41"}, + {file = "pyzmq-25.1.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e10a4b5a4b1192d74853cc71a5e9fd022594573926c2a3a4802020360aa719d8"}, + {file = "pyzmq-25.1.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8c5f80e578427d4695adac6fdf4370c14a2feafdc8cb35549c219b90652536ae"}, + {file = "pyzmq-25.1.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5dde6751e857910c1339890f3524de74007958557593b9e7e8c5f01cd919f8a7"}, + {file = "pyzmq-25.1.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea1608dd169da230a0ad602d5b1ebd39807ac96cae1845c3ceed39af08a5c6df"}, + {file = "pyzmq-25.1.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0f513130c4c361201da9bc69df25a086487250e16b5571ead521b31ff6b02220"}, + {file = "pyzmq-25.1.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:019744b99da30330798bb37df33549d59d380c78e516e3bab9c9b84f87a9592f"}, + {file = "pyzmq-25.1.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2e2713ef44be5d52dd8b8e2023d706bf66cb22072e97fc71b168e01d25192755"}, + {file = "pyzmq-25.1.2-cp38-cp38-win32.whl", hash = "sha256:07cd61a20a535524906595e09344505a9bd46f1da7a07e504b315d41cd42eb07"}, + {file = "pyzmq-25.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb7e49a17fb8c77d3119d41a4523e432eb0c6932187c37deb6fbb00cc3028088"}, + {file = "pyzmq-25.1.2-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:94504ff66f278ab4b7e03e4cba7e7e400cb73bfa9d3d71f58d8972a8dc67e7a6"}, + {file = "pyzmq-25.1.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6dd0d50bbf9dca1d0bdea219ae6b40f713a3fb477c06ca3714f208fd69e16fd8"}, + {file = "pyzmq-25.1.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:004ff469d21e86f0ef0369717351073e0e577428e514c47c8480770d5e24a565"}, + {file = "pyzmq-25.1.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c0b5ca88a8928147b7b1e2dfa09f3b6c256bc1135a1338536cbc9ea13d3b7add"}, + {file = "pyzmq-25.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c9a79f1d2495b167119d02be7448bfba57fad2a4207c4f68abc0bab4b92925b"}, + {file = "pyzmq-25.1.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:518efd91c3d8ac9f9b4f7dd0e2b7b8bf1a4fe82a308009016b07eaa48681af82"}, + {file = "pyzmq-25.1.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:1ec23bd7b3a893ae676d0e54ad47d18064e6c5ae1fadc2f195143fb27373f7f6"}, + {file = "pyzmq-25.1.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db36c27baed588a5a8346b971477b718fdc66cf5b80cbfbd914b4d6d355e44e2"}, + {file = "pyzmq-25.1.2-cp39-cp39-win32.whl", hash = "sha256:39b1067f13aba39d794a24761e385e2eddc26295826530a8c7b6c6c341584289"}, + {file = "pyzmq-25.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:8e9f3fabc445d0ce320ea2c59a75fe3ea591fdbdeebec5db6de530dd4b09412e"}, + {file = "pyzmq-25.1.2-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a8c1d566344aee826b74e472e16edae0a02e2a044f14f7c24e123002dcff1c05"}, + {file = "pyzmq-25.1.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:759cfd391a0996345ba94b6a5110fca9c557ad4166d86a6e81ea526c376a01e8"}, + {file = "pyzmq-25.1.2-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c61e346ac34b74028ede1c6b4bcecf649d69b707b3ff9dc0fab453821b04d1e"}, + {file = "pyzmq-25.1.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cb8fc1f8d69b411b8ec0b5f1ffbcaf14c1db95b6bccea21d83610987435f1a4"}, + {file = "pyzmq-25.1.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:3c00c9b7d1ca8165c610437ca0c92e7b5607b2f9076f4eb4b095c85d6e680a1d"}, + {file = "pyzmq-25.1.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:df0c7a16ebb94452d2909b9a7b3337940e9a87a824c4fc1c7c36bb4404cb0cde"}, + {file = "pyzmq-25.1.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:45999e7f7ed5c390f2e87ece7f6c56bf979fb213550229e711e45ecc7d42ccb8"}, + {file = "pyzmq-25.1.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ac170e9e048b40c605358667aca3d94e98f604a18c44bdb4c102e67070f3ac9b"}, + {file = "pyzmq-25.1.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1b604734bec94f05f81b360a272fc824334267426ae9905ff32dc2be433ab96"}, + {file = "pyzmq-25.1.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:a793ac733e3d895d96f865f1806f160696422554e46d30105807fdc9841b9f7d"}, + {file = "pyzmq-25.1.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0806175f2ae5ad4b835ecd87f5f85583316b69f17e97786f7443baaf54b9bb98"}, + {file = "pyzmq-25.1.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ef12e259e7bc317c7597d4f6ef59b97b913e162d83b421dd0db3d6410f17a244"}, + {file = "pyzmq-25.1.2-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea253b368eb41116011add00f8d5726762320b1bda892f744c91997b65754d73"}, + {file = "pyzmq-25.1.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b9b1f2ad6498445a941d9a4fee096d387fee436e45cc660e72e768d3d8ee611"}, + {file = "pyzmq-25.1.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:8b14c75979ce932c53b79976a395cb2a8cd3aaf14aef75e8c2cb55a330b9b49d"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:889370d5174a741a62566c003ee8ddba4b04c3f09a97b8000092b7ca83ec9c49"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a18fff090441a40ffda8a7f4f18f03dc56ae73f148f1832e109f9bffa85df15"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99a6b36f95c98839ad98f8c553d8507644c880cf1e0a57fe5e3a3f3969040882"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4345c9a27f4310afbb9c01750e9461ff33d6fb74cd2456b107525bbeebcb5be3"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3516e0b6224cf6e43e341d56da15fd33bdc37fa0c06af4f029f7d7dfceceabbc"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:146b9b1f29ead41255387fb07be56dc29639262c0f7344f570eecdcd8d683314"}, + {file = "pyzmq-25.1.2.tar.gz", hash = "sha256:93f1aa311e8bb912e34f004cf186407a4e90eec4f0ecc0efd26056bf7eda0226"}, +] + +[package.dependencies] +cffi = {version = "*", markers = "implementation_name == \"pypy\""} + +[[package]] +name = "rdkit" +version = "2023.9.5" +description = "A collection of chemoinformatics and machine-learning software written in C++ and Python" +optional = false +python-versions = "*" +files = [ + {file = "rdkit-2023.9.5-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:0cc1f623284962e5763bc0e67b1b4e9667a7bbd5e1ed22f205d2980100c2e779"}, + {file = "rdkit-2023.9.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:de0a7162423fe33dcb588a2048829db81bfff929a206793e83a52292fb86be0f"}, + {file = "rdkit-2023.9.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef0b02d12b883fa3d09b82f75db1c8baea96f4a941a84402c90a9c51243a92c5"}, + {file = "rdkit-2023.9.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9cf95598a285bd90fb730e5dbf5cc31407ce39e39638b667961e1bc024968aa1"}, + {file = "rdkit-2023.9.5-cp310-cp310-win_amd64.whl", hash = "sha256:2a3f1363bfeb89862e15fd3f88bea4e4d5036c469d389f2b615f30783ff7d1fd"}, + {file = "rdkit-2023.9.5-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:e7462b739d720bcb85cd0a633e5ae008ded73a38bbfa4302bea9e068a1bbe888"}, + {file = "rdkit-2023.9.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:80ee3cbf31f1808cd18b0e442c2a2d75de0a9837bcb1ac8009c2280e35c8018a"}, + {file = "rdkit-2023.9.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c56cef89057a83c4392d792c5e617b5bb0c2ad35ae2d7d2fec3cd77b2af94c3a"}, + {file = "rdkit-2023.9.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1fc360a266b83c19c7dcf85b5c67dbe4372c1e0cb0cc2580f3b3cf6af6819a98"}, + {file = "rdkit-2023.9.5-cp311-cp311-win_amd64.whl", hash = "sha256:fcf3a4447eff8abbd405029e840f2560f1773cde585af818a74947c5fba7e10f"}, + {file = "rdkit-2023.9.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c03ddac22acaaff28f66091f8d31128c0734c1e4f97ea8cb8d85edeee3e16176"}, + {file = "rdkit-2023.9.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0c44d467f4a234a3682235a03825db916d35caeeaf7d2b0c73a6a5be85e0a476"}, + {file = "rdkit-2023.9.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:04abe69371077a6daf419b6ed25c3ec86c8f858a468fb53508170467b799ef13"}, + {file = "rdkit-2023.9.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0620912f43019986b859d0c1a63dbf2ff339264ce796483ad7fd01bcb1fa0634"}, + {file = "rdkit-2023.9.5-cp312-cp312-win_amd64.whl", hash = "sha256:6f1cb9e295ebe77e8e70485adc78dda35c687bc3ac2063fb88202aba11148ae3"}, + {file = "rdkit-2023.9.5-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:7b43a43fd819de90dc3c81ad10b0bb25351351b36b20e63b6af4efb3fb0f3e30"}, + {file = "rdkit-2023.9.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:64c55039fd3861355176406c3385f5e81e17aefdfebd123e97909b63fc451dbc"}, + {file = "rdkit-2023.9.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6859310b7b04c0e6b46bbaf68d9137079a857ca1afe2b2c3beadfa4724515536"}, + {file = "rdkit-2023.9.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7bfda62f45eec82527e501ce74f08d514c22fd925bbf9631189fbff41e6280b"}, + {file = "rdkit-2023.9.5-cp38-cp38-win_amd64.whl", hash = "sha256:7e8078d01f4bb9aa77da5ef2087df1cbae6919de5b0f90b983ef920ec8792229"}, + {file = "rdkit-2023.9.5-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:4b848fbdc44f26d817963f90389af55b294d6b9efd07f20146255443fbcf6718"}, + {file = "rdkit-2023.9.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:443593f5e0ab119f09c63aed00b6739f5e6c8f617a0028e1e81036784fe96e47"}, + {file = "rdkit-2023.9.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c267b5a6135b58c2cbd2846d61b4663b75496a883e1ccd46eb3bff1098f53bf7"}, + {file = "rdkit-2023.9.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a7b39f1a98505017d6dd6876a592449cf76d718f370efd00e0ca6d80479812c"}, + {file = "rdkit-2023.9.5-cp39-cp39-win_amd64.whl", hash = "sha256:1b99cca22cad650392b25db1f8f86cae619fa62c6a710eb173d0e10faec9d2e5"}, +] + +[package.dependencies] +numpy = "*" +Pillow = "*" + +[[package]] +name = "referencing" +version = "0.33.0" +description = "JSON Referencing + Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "referencing-0.33.0-py3-none-any.whl", hash = "sha256:39240f2ecc770258f28b642dd47fd74bc8b02484de54e1882b74b35ebd779bd5"}, + {file = "referencing-0.33.0.tar.gz", hash = "sha256:c775fedf74bc0f9189c2a3be1c12fd03e8c23f4d371dce795df44e06c5b412f7"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +rpds-py = ">=0.7.0" + +[[package]] +name = "regex" +version = "2023.12.25" +description = "Alternative regular expression module, to replace re." +optional = false +python-versions = ">=3.7" +files = [ + {file = "regex-2023.12.25-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0694219a1d54336fd0445ea382d49d36882415c0134ee1e8332afd1529f0baa5"}, + {file = "regex-2023.12.25-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b014333bd0217ad3d54c143de9d4b9a3ca1c5a29a6d0d554952ea071cff0f1f8"}, + {file = "regex-2023.12.25-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d865984b3f71f6d0af64d0d88f5733521698f6c16f445bb09ce746c92c97c586"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e0eabac536b4cc7f57a5f3d095bfa557860ab912f25965e08fe1545e2ed8b4c"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c25a8ad70e716f96e13a637802813f65d8a6760ef48672aa3502f4c24ea8b400"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9b6d73353f777630626f403b0652055ebfe8ff142a44ec2cf18ae470395766e"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9cc99d6946d750eb75827cb53c4371b8b0fe89c733a94b1573c9dd16ea6c9e4"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88d1f7bef20c721359d8675f7d9f8e414ec5003d8f642fdfd8087777ff7f94b5"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cb3fe77aec8f1995611f966d0c656fdce398317f850d0e6e7aebdfe61f40e1cd"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7aa47c2e9ea33a4a2a05f40fcd3ea36d73853a2aae7b4feab6fc85f8bf2c9704"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:df26481f0c7a3f8739fecb3e81bc9da3fcfae34d6c094563b9d4670b047312e1"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c40281f7d70baf6e0db0c2f7472b31609f5bc2748fe7275ea65a0b4601d9b392"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:d94a1db462d5690ebf6ae86d11c5e420042b9898af5dcf278bd97d6bda065423"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ba1b30765a55acf15dce3f364e4928b80858fa8f979ad41f862358939bdd1f2f"}, + {file = "regex-2023.12.25-cp310-cp310-win32.whl", hash = "sha256:150c39f5b964e4d7dba46a7962a088fbc91f06e606f023ce57bb347a3b2d4630"}, + {file = "regex-2023.12.25-cp310-cp310-win_amd64.whl", hash = "sha256:09da66917262d9481c719599116c7dc0c321ffcec4b1f510c4f8a066f8768105"}, + {file = "regex-2023.12.25-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1b9d811f72210fa9306aeb88385b8f8bcef0dfbf3873410413c00aa94c56c2b6"}, + {file = "regex-2023.12.25-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d902a43085a308cef32c0d3aea962524b725403fd9373dea18110904003bac97"}, + {file = "regex-2023.12.25-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d166eafc19f4718df38887b2bbe1467a4f74a9830e8605089ea7a30dd4da8887"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7ad32824b7f02bb3c9f80306d405a1d9b7bb89362d68b3c5a9be53836caebdb"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:636ba0a77de609d6510235b7f0e77ec494d2657108f777e8765efc060094c98c"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fda75704357805eb953a3ee15a2b240694a9a514548cd49b3c5124b4e2ad01b"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f72cbae7f6b01591f90814250e636065850c5926751af02bb48da94dfced7baa"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db2a0b1857f18b11e3b0e54ddfefc96af46b0896fb678c85f63fb8c37518b3e7"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7502534e55c7c36c0978c91ba6f61703faf7ce733715ca48f499d3dbbd7657e0"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e8c7e08bb566de4faaf11984af13f6bcf6a08f327b13631d41d62592681d24fe"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:283fc8eed679758de38fe493b7d7d84a198b558942b03f017b1f94dda8efae80"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:f44dd4d68697559d007462b0a3a1d9acd61d97072b71f6d1968daef26bc744bd"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:67d3ccfc590e5e7197750fcb3a2915b416a53e2de847a728cfa60141054123d4"}, + {file = "regex-2023.12.25-cp311-cp311-win32.whl", hash = "sha256:68191f80a9bad283432385961d9efe09d783bcd36ed35a60fb1ff3f1ec2efe87"}, + {file = "regex-2023.12.25-cp311-cp311-win_amd64.whl", hash = "sha256:7d2af3f6b8419661a0c421584cfe8aaec1c0e435ce7e47ee2a97e344b98f794f"}, + {file = "regex-2023.12.25-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8a0ccf52bb37d1a700375a6b395bff5dd15c50acb745f7db30415bae3c2b0715"}, + {file = "regex-2023.12.25-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c3c4a78615b7762740531c27cf46e2f388d8d727d0c0c739e72048beb26c8a9d"}, + {file = "regex-2023.12.25-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ad83e7545b4ab69216cef4cc47e344d19622e28aabec61574b20257c65466d6a"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7a635871143661feccce3979e1727c4e094f2bdfd3ec4b90dfd4f16f571a87a"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d498eea3f581fbe1b34b59c697512a8baef88212f92e4c7830fcc1499f5b45a5"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:43f7cd5754d02a56ae4ebb91b33461dc67be8e3e0153f593c509e21d219c5060"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51f4b32f793812714fd5307222a7f77e739b9bc566dc94a18126aba3b92b98a3"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba99d8077424501b9616b43a2d208095746fb1284fc5ba490139651f971d39d9"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4bfc2b16e3ba8850e0e262467275dd4d62f0d045e0e9eda2bc65078c0110a11f"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8c2c19dae8a3eb0ea45a8448356ed561be843b13cbc34b840922ddf565498c1c"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:60080bb3d8617d96f0fb7e19796384cc2467447ef1c491694850ebd3670bc457"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b77e27b79448e34c2c51c09836033056a0547aa360c45eeeb67803da7b0eedaf"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:518440c991f514331f4850a63560321f833979d145d7d81186dbe2f19e27ae3d"}, + {file = "regex-2023.12.25-cp312-cp312-win32.whl", hash = "sha256:e2610e9406d3b0073636a3a2e80db05a02f0c3169b5632022b4e81c0364bcda5"}, + {file = "regex-2023.12.25-cp312-cp312-win_amd64.whl", hash = "sha256:cc37b9aeebab425f11f27e5e9e6cf580be7206c6582a64467a14dda211abc232"}, + {file = "regex-2023.12.25-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:da695d75ac97cb1cd725adac136d25ca687da4536154cdc2815f576e4da11c69"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d126361607b33c4eb7b36debc173bf25d7805847346dd4d99b5499e1fef52bc7"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4719bb05094d7d8563a450cf8738d2e1061420f79cfcc1fa7f0a44744c4d8f73"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5dd58946bce44b53b06d94aa95560d0b243eb2fe64227cba50017a8d8b3cd3e2"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22a86d9fff2009302c440b9d799ef2fe322416d2d58fc124b926aa89365ec482"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2aae8101919e8aa05ecfe6322b278f41ce2994c4a430303c4cd163fef746e04f"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e692296c4cc2873967771345a876bcfc1c547e8dd695c6b89342488b0ea55cd8"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:263ef5cc10979837f243950637fffb06e8daed7f1ac1e39d5910fd29929e489a"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:d6f7e255e5fa94642a0724e35406e6cb7001c09d476ab5fce002f652b36d0c39"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:88ad44e220e22b63b0f8f81f007e8abbb92874d8ced66f32571ef8beb0643b2b"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:3a17d3ede18f9cedcbe23d2daa8a2cd6f59fe2bf082c567e43083bba3fb00347"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d15b274f9e15b1a0b7a45d2ac86d1f634d983ca40d6b886721626c47a400bf39"}, + {file = "regex-2023.12.25-cp37-cp37m-win32.whl", hash = "sha256:ed19b3a05ae0c97dd8f75a5d8f21f7723a8c33bbc555da6bbe1f96c470139d3c"}, + {file = "regex-2023.12.25-cp37-cp37m-win_amd64.whl", hash = "sha256:a6d1047952c0b8104a1d371f88f4ab62e6275567d4458c1e26e9627ad489b445"}, + {file = "regex-2023.12.25-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b43523d7bc2abd757119dbfb38af91b5735eea45537ec6ec3a5ec3f9562a1c53"}, + {file = "regex-2023.12.25-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:efb2d82f33b2212898f1659fb1c2e9ac30493ac41e4d53123da374c3b5541e64"}, + {file = "regex-2023.12.25-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b7fca9205b59c1a3d5031f7e64ed627a1074730a51c2a80e97653e3e9fa0d415"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086dd15e9435b393ae06f96ab69ab2d333f5d65cbe65ca5a3ef0ec9564dfe770"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e81469f7d01efed9b53740aedd26085f20d49da65f9c1f41e822a33992cb1590"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:34e4af5b27232f68042aa40a91c3b9bb4da0eeb31b7632e0091afc4310afe6cb"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9852b76ab558e45b20bf1893b59af64a28bd3820b0c2efc80e0a70a4a3ea51c1"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff100b203092af77d1a5a7abe085b3506b7eaaf9abf65b73b7d6905b6cb76988"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cc038b2d8b1470364b1888a98fd22d616fba2b6309c5b5f181ad4483e0017861"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:094ba386bb5c01e54e14434d4caabf6583334090865b23ef58e0424a6286d3dc"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5cd05d0f57846d8ba4b71d9c00f6f37d6b97d5e5ef8b3c3840426a475c8f70f4"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:9aa1a67bbf0f957bbe096375887b2505f5d8ae16bf04488e8b0f334c36e31360"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:98a2636994f943b871786c9e82bfe7883ecdaba2ef5df54e1450fa9869d1f756"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:37f8e93a81fc5e5bd8db7e10e62dc64261bcd88f8d7e6640aaebe9bc180d9ce2"}, + {file = "regex-2023.12.25-cp38-cp38-win32.whl", hash = "sha256:d78bd484930c1da2b9679290a41cdb25cc127d783768a0369d6b449e72f88beb"}, + {file = "regex-2023.12.25-cp38-cp38-win_amd64.whl", hash = "sha256:b521dcecebc5b978b447f0f69b5b7f3840eac454862270406a39837ffae4e697"}, + {file = "regex-2023.12.25-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f7bc09bc9c29ebead055bcba136a67378f03d66bf359e87d0f7c759d6d4ffa31"}, + {file = "regex-2023.12.25-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e14b73607d6231f3cc4622809c196b540a6a44e903bcfad940779c80dffa7be7"}, + {file = "regex-2023.12.25-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9eda5f7a50141291beda3edd00abc2d4a5b16c29c92daf8d5bd76934150f3edc"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc6bb9aa69aacf0f6032c307da718f61a40cf970849e471254e0e91c56ffca95"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:298dc6354d414bc921581be85695d18912bea163a8b23cac9a2562bbcd5088b1"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f4e475a80ecbd15896a976aa0b386c5525d0ed34d5c600b6d3ebac0a67c7ddf"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:531ac6cf22b53e0696f8e1d56ce2396311254eb806111ddd3922c9d937151dae"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22f3470f7524b6da61e2020672df2f3063676aff444db1daa283c2ea4ed259d6"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:89723d2112697feaa320c9d351e5f5e7b841e83f8b143dba8e2d2b5f04e10923"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0ecf44ddf9171cd7566ef1768047f6e66975788258b1c6c6ca78098b95cf9a3d"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:905466ad1702ed4acfd67a902af50b8db1feeb9781436372261808df7a2a7bca"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:4558410b7a5607a645e9804a3e9dd509af12fb72b9825b13791a37cd417d73a5"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:7e316026cc1095f2a3e8cc012822c99f413b702eaa2ca5408a513609488cb62f"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3b1de218d5375cd6ac4b5493e0b9f3df2be331e86520f23382f216c137913d20"}, + {file = "regex-2023.12.25-cp39-cp39-win32.whl", hash = "sha256:11a963f8e25ab5c61348d090bf1b07f1953929c13bd2309a0662e9ff680763c9"}, + {file = "regex-2023.12.25-cp39-cp39-win_amd64.whl", hash = "sha256:e693e233ac92ba83a87024e1d32b5f9ab15ca55ddd916d878146f4e3406b5c91"}, + {file = "regex-2023.12.25.tar.gz", hash = "sha256:29171aa128da69afdf4bde412d5bedc335f2ca8fcfe4489038577d05f16181e5"}, +] + +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "requests-oauthlib" +version = "1.3.1" +description = "OAuthlib authentication support for Requests." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "requests-oauthlib-1.3.1.tar.gz", hash = "sha256:75beac4a47881eeb94d5ea5d6ad31ef88856affe2332b9aafb52c6452ccf0d7a"}, + {file = "requests_oauthlib-1.3.1-py2.py3-none-any.whl", hash = "sha256:2577c501a2fb8d05a304c09d090d6e47c306fef15809d102b327cf8364bddab5"}, +] + +[package.dependencies] +oauthlib = ">=3.0.0" +requests = ">=2.0.0" + +[package.extras] +rsa = ["oauthlib[signedtoken] (>=3.0.0)"] + +[[package]] +name = "rich" +version = "13.7.1" +description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "rich-13.7.1-py3-none-any.whl", hash = "sha256:4edbae314f59eb482f54e9e30bf00d33350aaa94f4bfcd4e9e3110e64d0d7222"}, + {file = "rich-13.7.1.tar.gz", hash = "sha256:9be308cb1fe2f1f57d67ce99e95af38a1e2bc71ad9813b0e247cf7ffbcc3a432"}, +] + +[package.dependencies] +markdown-it-py = ">=2.2.0" +pygments = ">=2.13.0,<3.0.0" + +[package.extras] +jupyter = ["ipywidgets (>=7.5.1,<9)"] + +[[package]] +name = "rpds-py" +version = "0.18.0" +description = "Python bindings to Rust's persistent data structures (rpds)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "rpds_py-0.18.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:5b4e7d8d6c9b2e8ee2d55c90b59c707ca59bc30058269b3db7b1f8df5763557e"}, + {file = "rpds_py-0.18.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c463ed05f9dfb9baebef68048aed8dcdc94411e4bf3d33a39ba97e271624f8f7"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01e36a39af54a30f28b73096dd39b6802eddd04c90dbe161c1b8dbe22353189f"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d62dec4976954a23d7f91f2f4530852b0c7608116c257833922a896101336c51"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dd18772815d5f008fa03d2b9a681ae38d5ae9f0e599f7dda233c439fcaa00d40"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:923d39efa3cfb7279a0327e337a7958bff00cc447fd07a25cddb0a1cc9a6d2da"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39514da80f971362f9267c600b6d459bfbbc549cffc2cef8e47474fddc9b45b1"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a34d557a42aa28bd5c48a023c570219ba2593bcbbb8dc1b98d8cf5d529ab1434"}, + {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:93df1de2f7f7239dc9cc5a4a12408ee1598725036bd2dedadc14d94525192fc3"}, + {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:34b18ba135c687f4dac449aa5157d36e2cbb7c03cbea4ddbd88604e076aa836e"}, + {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c0b5dcf9193625afd8ecc92312d6ed78781c46ecbf39af9ad4681fc9f464af88"}, + {file = "rpds_py-0.18.0-cp310-none-win32.whl", hash = "sha256:c4325ff0442a12113a6379af66978c3fe562f846763287ef66bdc1d57925d337"}, + {file = "rpds_py-0.18.0-cp310-none-win_amd64.whl", hash = "sha256:7223a2a5fe0d217e60a60cdae28d6949140dde9c3bcc714063c5b463065e3d66"}, + {file = "rpds_py-0.18.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:3a96e0c6a41dcdba3a0a581bbf6c44bb863f27c541547fb4b9711fd8cf0ffad4"}, + {file = "rpds_py-0.18.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30f43887bbae0d49113cbaab729a112251a940e9b274536613097ab8b4899cf6"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fcb25daa9219b4cf3a0ab24b0eb9a5cc8949ed4dc72acb8fa16b7e1681aa3c58"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d68c93e381010662ab873fea609bf6c0f428b6d0bb00f2c6939782e0818d37bf"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b34b7aa8b261c1dbf7720b5d6f01f38243e9b9daf7e6b8bc1fd4657000062f2c"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e6d75ab12b0bbab7215e5d40f1e5b738aa539598db27ef83b2ec46747df90e1"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b8612cd233543a3781bc659c731b9d607de65890085098986dfd573fc2befe5"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aec493917dd45e3c69d00a8874e7cbed844efd935595ef78a0f25f14312e33c6"}, + {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:661d25cbffaf8cc42e971dd570d87cb29a665f49f4abe1f9e76be9a5182c4688"}, + {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1df3659d26f539ac74fb3b0c481cdf9d725386e3552c6fa2974f4d33d78e544b"}, + {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a1ce3ba137ed54f83e56fb983a5859a27d43a40188ba798993812fed73c70836"}, + {file = "rpds_py-0.18.0-cp311-none-win32.whl", hash = "sha256:69e64831e22a6b377772e7fb337533c365085b31619005802a79242fee620bc1"}, + {file = "rpds_py-0.18.0-cp311-none-win_amd64.whl", hash = "sha256:998e33ad22dc7ec7e030b3df701c43630b5bc0d8fbc2267653577e3fec279afa"}, + {file = "rpds_py-0.18.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:7f2facbd386dd60cbbf1a794181e6aa0bd429bd78bfdf775436020172e2a23f0"}, + {file = "rpds_py-0.18.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1d9a5be316c15ffb2b3c405c4ff14448c36b4435be062a7f578ccd8b01f0c4d8"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd5bf1af8efe569654bbef5a3e0a56eca45f87cfcffab31dd8dde70da5982475"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5417558f6887e9b6b65b4527232553c139b57ec42c64570569b155262ac0754f"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:56a737287efecafc16f6d067c2ea0117abadcd078d58721f967952db329a3e5c"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8f03bccbd8586e9dd37219bce4d4e0d3ab492e6b3b533e973fa08a112cb2ffc9"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4457a94da0d5c53dc4b3e4de1158bdab077db23c53232f37a3cb7afdb053a4e3"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0ab39c1ba9023914297dd88ec3b3b3c3f33671baeb6acf82ad7ce883f6e8e157"}, + {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9d54553c1136b50fd12cc17e5b11ad07374c316df307e4cfd6441bea5fb68496"}, + {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0af039631b6de0397ab2ba16eaf2872e9f8fca391b44d3d8cac317860a700a3f"}, + {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:84ffab12db93b5f6bad84c712c92060a2d321b35c3c9960b43d08d0f639d60d7"}, + {file = "rpds_py-0.18.0-cp312-none-win32.whl", hash = "sha256:685537e07897f173abcf67258bee3c05c374fa6fff89d4c7e42fb391b0605e98"}, + {file = "rpds_py-0.18.0-cp312-none-win_amd64.whl", hash = "sha256:e003b002ec72c8d5a3e3da2989c7d6065b47d9eaa70cd8808b5384fbb970f4ec"}, + {file = "rpds_py-0.18.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:08f9ad53c3f31dfb4baa00da22f1e862900f45908383c062c27628754af2e88e"}, + {file = "rpds_py-0.18.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c0013fe6b46aa496a6749c77e00a3eb07952832ad6166bd481c74bda0dcb6d58"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e32a92116d4f2a80b629778280103d2a510a5b3f6314ceccd6e38006b5e92dcb"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e541ec6f2ec456934fd279a3120f856cd0aedd209fc3852eca563f81738f6861"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bed88b9a458e354014d662d47e7a5baafd7ff81c780fd91584a10d6ec842cb73"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2644e47de560eb7bd55c20fc59f6daa04682655c58d08185a9b95c1970fa1e07"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e8916ae4c720529e18afa0b879473049e95949bf97042e938530e072fde061d"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:465a3eb5659338cf2a9243e50ad9b2296fa15061736d6e26240e713522b6235c"}, + {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ea7d4a99f3b38c37eac212dbd6ec42b7a5ec51e2c74b5d3223e43c811609e65f"}, + {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:67071a6171e92b6da534b8ae326505f7c18022c6f19072a81dcf40db2638767c"}, + {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:41ef53e7c58aa4ef281da975f62c258950f54b76ec8e45941e93a3d1d8580594"}, + {file = "rpds_py-0.18.0-cp38-none-win32.whl", hash = "sha256:fdea4952db2793c4ad0bdccd27c1d8fdd1423a92f04598bc39425bcc2b8ee46e"}, + {file = "rpds_py-0.18.0-cp38-none-win_amd64.whl", hash = "sha256:7cd863afe7336c62ec78d7d1349a2f34c007a3cc6c2369d667c65aeec412a5b1"}, + {file = "rpds_py-0.18.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:5307def11a35f5ae4581a0b658b0af8178c65c530e94893345bebf41cc139d33"}, + {file = "rpds_py-0.18.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:77f195baa60a54ef9d2de16fbbfd3ff8b04edc0c0140a761b56c267ac11aa467"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39f5441553f1c2aed4de4377178ad8ff8f9d733723d6c66d983d75341de265ab"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a00312dea9310d4cb7dbd7787e722d2e86a95c2db92fbd7d0155f97127bcb40"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f2fc11e8fe034ee3c34d316d0ad8808f45bc3b9ce5857ff29d513f3ff2923a1"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:586f8204935b9ec884500498ccc91aa869fc652c40c093bd9e1471fbcc25c022"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddc2f4dfd396c7bfa18e6ce371cba60e4cf9d2e5cdb71376aa2da264605b60b9"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5ddcba87675b6d509139d1b521e0c8250e967e63b5909a7e8f8944d0f90ff36f"}, + {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7bd339195d84439cbe5771546fe8a4e8a7a045417d8f9de9a368c434e42a721e"}, + {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:d7c36232a90d4755b720fbd76739d8891732b18cf240a9c645d75f00639a9024"}, + {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6b0817e34942b2ca527b0e9298373e7cc75f429e8da2055607f4931fded23e20"}, + {file = "rpds_py-0.18.0-cp39-none-win32.whl", hash = "sha256:99f70b740dc04d09e6b2699b675874367885217a2e9f782bdf5395632ac663b7"}, + {file = "rpds_py-0.18.0-cp39-none-win_amd64.whl", hash = "sha256:6ef687afab047554a2d366e112dd187b62d261d49eb79b77e386f94644363294"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ad36cfb355e24f1bd37cac88c112cd7730873f20fb0bdaf8ba59eedf8216079f"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:36b3ee798c58ace201289024b52788161e1ea133e4ac93fba7d49da5fec0ef9e"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8a2f084546cc59ea99fda8e070be2fd140c3092dc11524a71aa8f0f3d5a55ca"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e4461d0f003a0aa9be2bdd1b798a041f177189c1a0f7619fe8c95ad08d9a45d7"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8db715ebe3bb7d86d77ac1826f7d67ec11a70dbd2376b7cc214199360517b641"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:793968759cd0d96cac1e367afd70c235867831983f876a53389ad869b043c948"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66e6a3af5a75363d2c9a48b07cb27c4ea542938b1a2e93b15a503cdfa8490795"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6ef0befbb5d79cf32d0266f5cff01545602344eda89480e1dd88aca964260b18"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1d4acf42190d449d5e89654d5c1ed3a4f17925eec71f05e2a41414689cda02d1"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:a5f446dd5055667aabaee78487f2b5ab72e244f9bc0b2ffebfeec79051679984"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:9dbbeb27f4e70bfd9eec1be5477517365afe05a9b2c441a0b21929ee61048124"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:22806714311a69fd0af9b35b7be97c18a0fc2826e6827dbb3a8c94eac6cf7eeb"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:b34ae4636dfc4e76a438ab826a0d1eed2589ca7d9a1b2d5bb546978ac6485461"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c8370641f1a7f0e0669ddccca22f1da893cef7628396431eb445d46d893e5cd"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c8362467a0fdeccd47935f22c256bec5e6abe543bf0d66e3d3d57a8fb5731863"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11a8c85ef4a07a7638180bf04fe189d12757c696eb41f310d2426895356dcf05"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b316144e85316da2723f9d8dc75bada12fa58489a527091fa1d5a612643d1a0e"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf1ea2e34868f6fbf070e1af291c8180480310173de0b0c43fc38a02929fc0e3"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e546e768d08ad55b20b11dbb78a745151acbd938f8f00d0cfbabe8b0199b9880"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:4901165d170a5fde6f589acb90a6b33629ad1ec976d4529e769c6f3d885e3e80"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:618a3d6cae6ef8ec88bb76dd80b83cfe415ad4f1d942ca2a903bf6b6ff97a2da"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ed4eb745efbff0a8e9587d22a84be94a5eb7d2d99c02dacf7bd0911713ed14dd"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6c81e5f372cd0dc5dc4809553d34f832f60a46034a5f187756d9b90586c2c307"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:43fbac5f22e25bee1d482c97474f930a353542855f05c1161fd804c9dc74a09d"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d7faa6f14017c0b1e69f5e2c357b998731ea75a442ab3841c0dbbbfe902d2c4"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:08231ac30a842bd04daabc4d71fddd7e6d26189406d5a69535638e4dcb88fe76"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:044a3e61a7c2dafacae99d1e722cc2d4c05280790ec5a05031b3876809d89a5c"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3f26b5bd1079acdb0c7a5645e350fe54d16b17bfc5e71f371c449383d3342e17"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:482103aed1dfe2f3b71a58eff35ba105289b8d862551ea576bd15479aba01f66"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1374f4129f9bcca53a1bba0bb86bf78325a0374577cf7e9e4cd046b1e6f20e24"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:635dc434ff724b178cb192c70016cc0ad25a275228f749ee0daf0eddbc8183b1"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:bc362ee4e314870a70f4ae88772d72d877246537d9f8cb8f7eacf10884862432"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:4832d7d380477521a8c1644bbab6588dfedea5e30a7d967b5fb75977c45fd77f"}, + {file = "rpds_py-0.18.0.tar.gz", hash = "sha256:42821446ee7a76f5d9f71f9e33a4fb2ffd724bb3e7f93386150b61a43115788d"}, +] + +[[package]] +name = "ruff" +version = "0.3.0" +description = "An extremely fast Python linter and code formatter, written in Rust." +optional = false +python-versions = ">=3.7" +files = [ + {file = "ruff-0.3.0-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:7deb528029bacf845bdbb3dbb2927d8ef9b4356a5e731b10eef171e3f0a85944"}, + {file = "ruff-0.3.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:e1e0d4381ca88fb2b73ea0766008e703f33f460295de658f5467f6f229658c19"}, + {file = "ruff-0.3.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f7dbba46e2827dfcb0f0cc55fba8e96ba7c8700e0a866eb8cef7d1d66c25dcb"}, + {file = "ruff-0.3.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:23dbb808e2f1d68eeadd5f655485e235c102ac6f12ad31505804edced2a5ae77"}, + {file = "ruff-0.3.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ef655c51f41d5fa879f98e40c90072b567c666a7114fa2d9fe004dffba00932"}, + {file = "ruff-0.3.0-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:d0d3d7ef3d4f06433d592e5f7d813314a34601e6c5be8481cccb7fa760aa243e"}, + {file = "ruff-0.3.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b08b356d06a792e49a12074b62222f9d4ea2a11dca9da9f68163b28c71bf1dd4"}, + {file = "ruff-0.3.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9343690f95710f8cf251bee1013bf43030072b9f8d012fbed6ad702ef70d360a"}, + {file = "ruff-0.3.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1f3ed501a42f60f4dedb7805fa8d4534e78b4e196f536bac926f805f0743d49"}, + {file = "ruff-0.3.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:cc30a9053ff2f1ffb505a585797c23434d5f6c838bacfe206c0e6cf38c921a1e"}, + {file = "ruff-0.3.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:5da894a29ec018a8293d3d17c797e73b374773943e8369cfc50495573d396933"}, + {file = "ruff-0.3.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:755c22536d7f1889be25f2baf6fedd019d0c51d079e8417d4441159f3bcd30c2"}, + {file = "ruff-0.3.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:dd73fe7f4c28d317855da6a7bc4aa29a1500320818dd8f27df95f70a01b8171f"}, + {file = "ruff-0.3.0-py3-none-win32.whl", hash = "sha256:19eacceb4c9406f6c41af806418a26fdb23120dfe53583df76d1401c92b7c14b"}, + {file = "ruff-0.3.0-py3-none-win_amd64.whl", hash = "sha256:128265876c1d703e5f5e5a4543bd8be47c73a9ba223fd3989d4aa87dd06f312f"}, + {file = "ruff-0.3.0-py3-none-win_arm64.whl", hash = "sha256:e3a4a6d46aef0a84b74fcd201a4401ea9a6cd85614f6a9435f2d33dd8cefbf83"}, + {file = "ruff-0.3.0.tar.gz", hash = "sha256:0886184ba2618d815067cf43e005388967b67ab9c80df52b32ec1152ab49f53a"}, +] + +[[package]] +name = "scikit-learn" +version = "1.4.1.post1" +description = "A set of python modules for machine learning and data mining" +optional = false +python-versions = ">=3.9" +files = [ + {file = "scikit-learn-1.4.1.post1.tar.gz", hash = "sha256:93d3d496ff1965470f9977d05e5ec3376fb1e63b10e4fda5e39d23c2d8969a30"}, + {file = "scikit_learn-1.4.1.post1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c540aaf44729ab5cd4bd5e394f2b375e65ceaea9cdd8c195788e70433d91bbc5"}, + {file = "scikit_learn-1.4.1.post1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:4310bff71aa98b45b46cd26fa641309deb73a5d1c0461d181587ad4f30ea3c36"}, + {file = "scikit_learn-1.4.1.post1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f43dd527dabff5521af2786a2f8de5ba381e182ec7292663508901cf6ceaf6e"}, + {file = "scikit_learn-1.4.1.post1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c02e27d65b0c7dc32f2c5eb601aaf5530b7a02bfbe92438188624524878336f2"}, + {file = "scikit_learn-1.4.1.post1-cp310-cp310-win_amd64.whl", hash = "sha256:629e09f772ad42f657ca60a1a52342eef786218dd20cf1369a3b8d085e55ef8f"}, + {file = "scikit_learn-1.4.1.post1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6145dfd9605b0b50ae72cdf72b61a2acd87501369a763b0d73d004710ebb76b5"}, + {file = "scikit_learn-1.4.1.post1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:1afed6951bc9d2053c6ee9a518a466cbc9b07c6a3f9d43bfe734192b6125d508"}, + {file = "scikit_learn-1.4.1.post1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce03506ccf5f96b7e9030fea7eb148999b254c44c10182ac55857bc9b5d4815f"}, + {file = "scikit_learn-1.4.1.post1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ba516fcdc73d60e7f48cbb0bccb9acbdb21807de3651531208aac73c758e3ab"}, + {file = "scikit_learn-1.4.1.post1-cp311-cp311-win_amd64.whl", hash = "sha256:78cd27b4669513b50db4f683ef41ea35b5dddc797bd2bbd990d49897fd1c8a46"}, + {file = "scikit_learn-1.4.1.post1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a1e289f33f613cefe6707dead50db31930530dc386b6ccff176c786335a7b01c"}, + {file = "scikit_learn-1.4.1.post1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:0df87de9ce1c0140f2818beef310fb2e2afdc1e66fc9ad587965577f17733649"}, + {file = "scikit_learn-1.4.1.post1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:712c1c69c45b58ef21635360b3d0a680ff7d83ac95b6f9b82cf9294070cda710"}, + {file = "scikit_learn-1.4.1.post1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1754b0c2409d6ed5a3380512d0adcf182a01363c669033a2b55cca429ed86a81"}, + {file = "scikit_learn-1.4.1.post1-cp312-cp312-win_amd64.whl", hash = "sha256:1d491ef66e37f4e812db7e6c8286520c2c3fc61b34bf5e59b67b4ce528de93af"}, + {file = "scikit_learn-1.4.1.post1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:aa0029b78ef59af22cfbd833e8ace8526e4df90212db7ceccbea582ebb5d6794"}, + {file = "scikit_learn-1.4.1.post1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:14e4c88436ac96bf69eb6d746ac76a574c314a23c6961b7d344b38877f20fee1"}, + {file = "scikit_learn-1.4.1.post1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7cd3a77c32879311f2aa93466d3c288c955ef71d191503cf0677c3340ae8ae0"}, + {file = "scikit_learn-1.4.1.post1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a3ee19211ded1a52ee37b0a7b373a8bfc66f95353af058a210b692bd4cda0dd"}, + {file = "scikit_learn-1.4.1.post1-cp39-cp39-win_amd64.whl", hash = "sha256:234b6bda70fdcae9e4abbbe028582ce99c280458665a155eed0b820599377d25"}, +] + +[package.dependencies] +joblib = ">=1.2.0" +numpy = ">=1.19.5,<2.0" +scipy = ">=1.6.0" +threadpoolctl = ">=2.0.0" + +[package.extras] +benchmark = ["matplotlib (>=3.3.4)", "memory-profiler (>=0.57.0)", "pandas (>=1.1.5)"] +docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.3.4)", "memory-profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)", "sphinx (>=6.0.0)", "sphinx-copybutton (>=0.5.2)", "sphinx-gallery (>=0.15.0)", "sphinx-prompt (>=1.3.0)", "sphinxext-opengraph (>=0.4.2)"] +examples = ["matplotlib (>=3.3.4)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)"] +tests = ["black (>=23.3.0)", "matplotlib (>=3.3.4)", "mypy (>=1.3)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "polars (>=0.19.12)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pyarrow (>=12.0.0)", "pytest (>=7.1.2)", "pytest-cov (>=2.9.0)", "ruff (>=0.0.272)", "scikit-image (>=0.17.2)"] + +[[package]] +name = "scipy" +version = "1.12.0" +description = "Fundamental algorithms for scientific computing in Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "scipy-1.12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:78e4402e140879387187f7f25d91cc592b3501a2e51dfb320f48dfb73565f10b"}, + {file = "scipy-1.12.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:f5f00ebaf8de24d14b8449981a2842d404152774c1a1d880c901bf454cb8e2a1"}, + {file = "scipy-1.12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e53958531a7c695ff66c2e7bb7b79560ffdc562e2051644c5576c39ff8efb563"}, + {file = "scipy-1.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e32847e08da8d895ce09d108a494d9eb78974cf6de23063f93306a3e419960c"}, + {file = "scipy-1.12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4c1020cad92772bf44b8e4cdabc1df5d87376cb219742549ef69fc9fd86282dd"}, + {file = "scipy-1.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:75ea2a144096b5e39402e2ff53a36fecfd3b960d786b7efd3c180e29c39e53f2"}, + {file = "scipy-1.12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:408c68423f9de16cb9e602528be4ce0d6312b05001f3de61fe9ec8b1263cad08"}, + {file = "scipy-1.12.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:5adfad5dbf0163397beb4aca679187d24aec085343755fcdbdeb32b3679f254c"}, + {file = "scipy-1.12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3003652496f6e7c387b1cf63f4bb720951cfa18907e998ea551e6de51a04467"}, + {file = "scipy-1.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b8066bce124ee5531d12a74b617d9ac0ea59245246410e19bca549656d9a40a"}, + {file = "scipy-1.12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8bee4993817e204d761dba10dbab0774ba5a8612e57e81319ea04d84945375ba"}, + {file = "scipy-1.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:a24024d45ce9a675c1fb8494e8e5244efea1c7a09c60beb1eeb80373d0fecc70"}, + {file = "scipy-1.12.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e7e76cc48638228212c747ada851ef355c2bb5e7f939e10952bc504c11f4e372"}, + {file = "scipy-1.12.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:f7ce148dffcd64ade37b2df9315541f9adad6efcaa86866ee7dd5db0c8f041c3"}, + {file = "scipy-1.12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c39f92041f490422924dfdb782527a4abddf4707616e07b021de33467f917bc"}, + {file = "scipy-1.12.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7ebda398f86e56178c2fa94cad15bf457a218a54a35c2a7b4490b9f9cb2676c"}, + {file = "scipy-1.12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:95e5c750d55cf518c398a8240571b0e0782c2d5a703250872f36eaf737751338"}, + {file = "scipy-1.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:e646d8571804a304e1da01040d21577685ce8e2db08ac58e543eaca063453e1c"}, + {file = "scipy-1.12.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:913d6e7956c3a671de3b05ccb66b11bc293f56bfdef040583a7221d9e22a2e35"}, + {file = "scipy-1.12.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:bba1b0c7256ad75401c73e4b3cf09d1f176e9bd4248f0d3112170fb2ec4db067"}, + {file = "scipy-1.12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:730badef9b827b368f351eacae2e82da414e13cf8bd5051b4bdfd720271a5371"}, + {file = "scipy-1.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6546dc2c11a9df6926afcbdd8a3edec28566e4e785b915e849348c6dd9f3f490"}, + {file = "scipy-1.12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:196ebad3a4882081f62a5bf4aeb7326aa34b110e533aab23e4374fcccb0890dc"}, + {file = "scipy-1.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:b360f1b6b2f742781299514e99ff560d1fe9bd1bff2712894b52abe528d1fd1e"}, + {file = "scipy-1.12.0.tar.gz", hash = "sha256:4bf5abab8a36d20193c698b0f1fc282c1d083c94723902c447e5d2f1780936a3"}, +] + +[package.dependencies] +numpy = ">=1.22.4,<1.29.0" + +[package.extras] +dev = ["click", "cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyle", "pydevtool", "rich-click", "ruff", "types-psutil", "typing_extensions"] +doc = ["jupytext", "matplotlib (>2)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] +test = ["asv", "gmpy2", "hypothesis", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] + +[[package]] +name = "setuptools" +version = "69.1.1" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "setuptools-69.1.1-py3-none-any.whl", hash = "sha256:02fa291a0471b3a18b2b2481ed902af520c69e8ae0919c13da936542754b4c56"}, + {file = "setuptools-69.1.1.tar.gz", hash = "sha256:5c0806c7d9af348e6dd3777b4f4dbb42c7ad85b190104837488eab9a7c945cf8"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pip (>=19.1)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + +[[package]] +name = "shapely" +version = "2.0.3" +description = "Manipulation and analysis of geometric objects" +optional = false +python-versions = ">=3.7" +files = [ + {file = "shapely-2.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:af7e9abe180b189431b0f490638281b43b84a33a960620e6b2e8d3e3458b61a1"}, + {file = "shapely-2.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:98040462b36ced9671e266b95c326b97f41290d9d17504a1ee4dc313a7667b9c"}, + {file = "shapely-2.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:71eb736ef2843f23473c6e37f6180f90f0a35d740ab284321548edf4e55d9a52"}, + {file = "shapely-2.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:881eb9dbbb4a6419667e91fcb20313bfc1e67f53dbb392c6840ff04793571ed1"}, + {file = "shapely-2.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f10d2ccf0554fc0e39fad5886c839e47e207f99fdf09547bc687a2330efda35b"}, + {file = "shapely-2.0.3-cp310-cp310-win32.whl", hash = "sha256:6dfdc077a6fcaf74d3eab23a1ace5abc50c8bce56ac7747d25eab582c5a2990e"}, + {file = "shapely-2.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:64c5013dacd2d81b3bb12672098a0b2795c1bf8190cfc2980e380f5ef9d9e4d9"}, + {file = "shapely-2.0.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:56cee3e4e8159d6f2ce32e421445b8e23154fd02a0ac271d6a6c0b266a8e3cce"}, + {file = "shapely-2.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:619232c8276fded09527d2a9fd91a7885ff95c0ff9ecd5e3cb1e34fbb676e2ae"}, + {file = "shapely-2.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b2a7d256db6f5b4b407dc0c98dd1b2fcf1c9c5814af9416e5498d0a2e4307a4b"}, + {file = "shapely-2.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e45f0c8cd4583647db3216d965d49363e6548c300c23fd7e57ce17a03f824034"}, + {file = "shapely-2.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13cb37d3826972a82748a450328fe02a931dcaed10e69a4d83cc20ba021bc85f"}, + {file = "shapely-2.0.3-cp311-cp311-win32.whl", hash = "sha256:9302d7011e3e376d25acd30d2d9e70d315d93f03cc748784af19b00988fc30b1"}, + {file = "shapely-2.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:6b464f2666b13902835f201f50e835f2f153f37741db88f68c7f3b932d3505fa"}, + {file = "shapely-2.0.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:e86e7cb8e331a4850e0c2a8b2d66dc08d7a7b301b8d1d34a13060e3a5b4b3b55"}, + {file = "shapely-2.0.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c91981c99ade980fc49e41a544629751a0ccd769f39794ae913e53b07b2f78b9"}, + {file = "shapely-2.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bd45d456983dc60a42c4db437496d3f08a4201fbf662b69779f535eb969660af"}, + {file = "shapely-2.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:882fb1ffc7577e88c1194f4f1757e277dc484ba096a3b94844319873d14b0f2d"}, + {file = "shapely-2.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b9f2d93bff2ea52fa93245798cddb479766a18510ea9b93a4fb9755c79474889"}, + {file = "shapely-2.0.3-cp312-cp312-win32.whl", hash = "sha256:99abad1fd1303b35d991703432c9481e3242b7b3a393c186cfb02373bf604004"}, + {file = "shapely-2.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:6f555fe3304a1f40398977789bc4fe3c28a11173196df9ece1e15c5bc75a48db"}, + {file = "shapely-2.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a983cc418c1fa160b7d797cfef0e0c9f8c6d5871e83eae2c5793fce6a837fad9"}, + {file = "shapely-2.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18bddb8c327f392189a8d5d6b9a858945722d0bb95ccbd6a077b8e8fc4c7890d"}, + {file = "shapely-2.0.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:442f4dcf1eb58c5a4e3428d88e988ae153f97ab69a9f24e07bf4af8038536325"}, + {file = "shapely-2.0.3-cp37-cp37m-win32.whl", hash = "sha256:31a40b6e3ab00a4fd3a1d44efb2482278642572b8e0451abdc8e0634b787173e"}, + {file = "shapely-2.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:59b16976c2473fec85ce65cc9239bef97d4205ab3acead4e6cdcc72aee535679"}, + {file = "shapely-2.0.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:705efbce1950a31a55b1daa9c6ae1c34f1296de71ca8427974ec2f27d57554e3"}, + {file = "shapely-2.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:601c5c0058a6192df704cb889439f64994708563f57f99574798721e9777a44b"}, + {file = "shapely-2.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f24ecbb90a45c962b3b60d8d9a387272ed50dc010bfe605f1d16dfc94772d8a1"}, + {file = "shapely-2.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8c2a2989222c6062f7a0656e16276c01bb308bc7e5d999e54bf4e294ce62e76"}, + {file = "shapely-2.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42bceb9bceb3710a774ce04908fda0f28b291323da2688f928b3f213373b5aee"}, + {file = "shapely-2.0.3-cp38-cp38-win32.whl", hash = "sha256:54d925c9a311e4d109ec25f6a54a8bd92cc03481a34ae1a6a92c1fe6729b7e01"}, + {file = "shapely-2.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:300d203b480a4589adefff4c4af0b13919cd6d760ba3cbb1e56275210f96f654"}, + {file = "shapely-2.0.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:083d026e97b6c1f4a9bd2a9171c7692461092ed5375218170d91705550eecfd5"}, + {file = "shapely-2.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:27b6e1910094d93e9627f2664121e0e35613262fc037051680a08270f6058daf"}, + {file = "shapely-2.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:71b2de56a9e8c0e5920ae5ddb23b923490557ac50cb0b7fa752761bf4851acde"}, + {file = "shapely-2.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d279e56bbb68d218d63f3efc80c819cedcceef0e64efbf058a1df89dc57201b"}, + {file = "shapely-2.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88566d01a30f0453f7d038db46bc83ce125e38e47c5f6bfd4c9c287010e9bf74"}, + {file = "shapely-2.0.3-cp39-cp39-win32.whl", hash = "sha256:58afbba12c42c6ed44c4270bc0e22f3dadff5656d711b0ad335c315e02d04707"}, + {file = "shapely-2.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:5026b30433a70911979d390009261b8c4021ff87c7c3cbd825e62bb2ffa181bc"}, + {file = "shapely-2.0.3.tar.gz", hash = "sha256:4d65d0aa7910af71efa72fd6447e02a8e5dd44da81a983de9d736d6e6ccbe674"}, +] + +[package.dependencies] +numpy = ">=1.14,<2" + +[package.extras] +docs = ["matplotlib", "numpydoc (==1.1.*)", "sphinx", "sphinx-book-theme", "sphinx-remove-toctrees"] +test = ["pytest", "pytest-cov"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "smmap" +version = "5.0.1" +description = "A pure Python implementation of a sliding window memory map manager" +optional = false +python-versions = ">=3.7" +files = [ + {file = "smmap-5.0.1-py3-none-any.whl", hash = "sha256:e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da"}, + {file = "smmap-5.0.1.tar.gz", hash = "sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62"}, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, +] + +[[package]] +name = "stack-data" +version = "0.6.3" +description = "Extract data from python stack frames and tracebacks for informative displays" +optional = false +python-versions = "*" +files = [ + {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, + {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, +] + +[package.dependencies] +asttokens = ">=2.1.0" +executing = ">=1.2.0" +pure-eval = "*" + +[package.extras] +tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] + +[[package]] +name = "streamlit" +version = "1.31.1" +description = "A faster way to build and share data apps" +optional = false +python-versions = ">=3.8, !=3.9.7" +files = [ + {file = "streamlit-1.31.1-py2.py3-none-any.whl", hash = "sha256:a1a84249f7a9b854fe356db06c85dc03c3f9da4df06a33aa5a922647b955e8c8"}, + {file = "streamlit-1.31.1.tar.gz", hash = "sha256:dfc43ca85b4b4c31d097c27b983b8ccc960222ad907862b2b2fb4ddf04c50fdc"}, +] + +[package.dependencies] +altair = ">=4.0,<6" +blinker = ">=1.0.0,<2" +cachetools = ">=4.0,<6" +click = ">=7.0,<9" +gitpython = ">=3.0.7,<3.1.19 || >3.1.19,<4" +importlib-metadata = ">=1.4,<8" +numpy = ">=1.19.3,<2" +packaging = ">=16.8,<24" +pandas = ">=1.3.0,<3" +pillow = ">=7.1.0,<11" +protobuf = ">=3.20,<5" +pyarrow = ">=7.0" +pydeck = ">=0.8.0b4,<1" +python-dateutil = ">=2.7.3,<3" +requests = ">=2.27,<3" +rich = ">=10.14.0,<14" +tenacity = ">=8.1.0,<9" +toml = ">=0.10.1,<2" +tornado = ">=6.0.3,<7" +typing-extensions = ">=4.3.0,<5" +tzlocal = ">=1.1,<6" +validators = ">=0.2,<1" +watchdog = {version = ">=2.1.5", markers = "platform_system != \"Darwin\""} + +[package.extras] +snowflake = ["snowflake-connector-python (>=2.8.0)", "snowflake-snowpark-python (>=0.9.0)"] + +[[package]] +name = "tabulate" +version = "0.9.0" +description = "Pretty-print tabular data" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f"}, + {file = "tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c"}, +] + +[package.extras] +widechars = ["wcwidth"] + +[[package]] +name = "tenacity" +version = "8.2.3" +description = "Retry code until it succeeds" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tenacity-8.2.3-py3-none-any.whl", hash = "sha256:ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c"}, + {file = "tenacity-8.2.3.tar.gz", hash = "sha256:5398ef0d78e63f40007c1fb4c0bff96e1911394d2fa8d194f77619c05ff6cc8a"}, +] + +[package.extras] +doc = ["reno", "sphinx", "tornado (>=4.5)"] + +[[package]] +name = "threadpoolctl" +version = "3.3.0" +description = "threadpoolctl" +optional = false +python-versions = ">=3.8" +files = [ + {file = "threadpoolctl-3.3.0-py3-none-any.whl", hash = "sha256:6155be1f4a39f31a18ea70f94a77e0ccd57dced08122ea61109e7da89883781e"}, + {file = "threadpoolctl-3.3.0.tar.gz", hash = "sha256:5dac632b4fa2d43f42130267929af3ba01399ef4bd1882918e92dbc30365d30c"}, +] + +[[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" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[[package]] +name = "toolz" +version = "0.12.1" +description = "List processing tools and functional utilities" +optional = false +python-versions = ">=3.7" +files = [ + {file = "toolz-0.12.1-py3-none-any.whl", hash = "sha256:d22731364c07d72eea0a0ad45bafb2c2937ab6fd38a3507bf55eae8744aa7d85"}, + {file = "toolz-0.12.1.tar.gz", hash = "sha256:ecca342664893f177a13dac0e6b41cbd8ac25a358e5f215316d43e2100224f4d"}, +] + +[[package]] +name = "tornado" +version = "6.4" +description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." +optional = false +python-versions = ">= 3.8" +files = [ + {file = "tornado-6.4-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:02ccefc7d8211e5a7f9e8bc3f9e5b0ad6262ba2fbb683a6443ecc804e5224ce0"}, + {file = "tornado-6.4-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:27787de946a9cffd63ce5814c33f734c627a87072ec7eed71f7fc4417bb16263"}, + {file = "tornado-6.4-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7894c581ecdcf91666a0912f18ce5e757213999e183ebfc2c3fdbf4d5bd764e"}, + {file = "tornado-6.4-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e43bc2e5370a6a8e413e1e1cd0c91bedc5bd62a74a532371042a18ef19e10579"}, + {file = "tornado-6.4-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0251554cdd50b4b44362f73ad5ba7126fc5b2c2895cc62b14a1c2d7ea32f212"}, + {file = "tornado-6.4-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fd03192e287fbd0899dd8f81c6fb9cbbc69194d2074b38f384cb6fa72b80e9c2"}, + {file = "tornado-6.4-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:88b84956273fbd73420e6d4b8d5ccbe913c65d31351b4c004ae362eba06e1f78"}, + {file = "tornado-6.4-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:71ddfc23a0e03ef2df1c1397d859868d158c8276a0603b96cf86892bff58149f"}, + {file = "tornado-6.4-cp38-abi3-win32.whl", hash = "sha256:6f8a6c77900f5ae93d8b4ae1196472d0ccc2775cc1dfdc9e7727889145c45052"}, + {file = "tornado-6.4-cp38-abi3-win_amd64.whl", hash = "sha256:10aeaa8006333433da48dec9fe417877f8bcc21f48dda8d661ae79da357b2a63"}, + {file = "tornado-6.4.tar.gz", hash = "sha256:72291fa6e6bc84e626589f1c29d90a5a6d593ef5ae68052ee2ef000dfd273dee"}, +] + +[[package]] +name = "tqdm" +version = "4.66.2" +description = "Fast, Extensible Progress Meter" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tqdm-4.66.2-py3-none-any.whl", hash = "sha256:1ee4f8a893eb9bef51c6e35730cebf234d5d0b6bd112b0271e10ed7c24a02bd9"}, + {file = "tqdm-4.66.2.tar.gz", hash = "sha256:6cd52cdf0fef0e0f543299cfc96fec90d7b8a7e88745f411ec33eb44d5ed3531"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] +notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] +telegram = ["requests"] + +[[package]] +name = "traitlets" +version = "5.14.1" +description = "Traitlets Python configuration system" +optional = false +python-versions = ">=3.8" +files = [ + {file = "traitlets-5.14.1-py3-none-any.whl", hash = "sha256:2e5a030e6eff91737c643231bfcf04a65b0132078dad75e4936700b213652e74"}, + {file = "traitlets-5.14.1.tar.gz", hash = "sha256:8585105b371a04b8316a43d5ce29c098575c2e477850b62b848b964f1444527e"}, +] + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<7.5)", "pytest-mock", "pytest-mypy-testing"] + +[[package]] +name = "typing-extensions" +version = "4.10.0" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.10.0-py3-none-any.whl", hash = "sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475"}, + {file = "typing_extensions-4.10.0.tar.gz", hash = "sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb"}, +] + +[[package]] +name = "tzdata" +version = "2024.1" +description = "Provider of IANA time zone data" +optional = false +python-versions = ">=2" +files = [ + {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, + {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, +] + +[[package]] +name = "tzlocal" +version = "5.2" +description = "tzinfo object for the local timezone" +optional = false +python-versions = ">=3.8" +files = [ + {file = "tzlocal-5.2-py3-none-any.whl", hash = "sha256:49816ef2fe65ea8ac19d19aa7a1ae0551c834303d5014c6d5a62e4cbda8047b8"}, + {file = "tzlocal-5.2.tar.gz", hash = "sha256:8d399205578f1a9342816409cc1e46a93ebd5755e39ea2d85334bea911bf0e6e"}, +] + +[package.dependencies] +tzdata = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +devenv = ["check-manifest", "pytest (>=4.3)", "pytest-cov", "pytest-mock (>=3.3)", "zest.releaser"] + +[[package]] +name = "urllib3" +version = "2.2.1" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.8" +files = [ + {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, + {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "validators" +version = "0.22.0" +description = "Python Data Validation for Humans™" +optional = false +python-versions = ">=3.8" +files = [ + {file = "validators-0.22.0-py3-none-any.whl", hash = "sha256:61cf7d4a62bbae559f2e54aed3b000cea9ff3e2fdbe463f51179b92c58c9585a"}, + {file = "validators-0.22.0.tar.gz", hash = "sha256:77b2689b172eeeb600d9605ab86194641670cdb73b60afd577142a9397873370"}, +] + +[package.extras] +docs-offline = ["myst-parser (>=2.0.0)", "pypandoc-binary (>=1.11)", "sphinx (>=7.1.1)"] +docs-online = ["mkdocs (>=1.5.2)", "mkdocs-git-revision-date-localized-plugin (>=1.2.0)", "mkdocs-material (>=9.2.6)", "mkdocstrings[python] (>=0.22.0)", "pyaml (>=23.7.0)"] +hooks = ["pre-commit (>=3.3.3)"] +package = ["build (>=1.0.0)", "twine (>=4.0.2)"] +runner = ["tox (>=4.11.1)"] +sast = ["bandit[toml] (>=1.7.5)"] +testing = ["pytest (>=7.4.0)"] +tooling = ["black (>=23.7.0)", "pyright (>=1.1.325)", "ruff (>=0.0.287)"] +tooling-extras = ["pyaml (>=23.7.0)", "pypandoc-binary (>=1.11)", "pytest (>=7.4.0)"] + +[[package]] +name = "virtualenv" +version = "20.25.1" +description = "Virtual Python Environment builder" +optional = false +python-versions = ">=3.7" +files = [ + {file = "virtualenv-20.25.1-py3-none-any.whl", hash = "sha256:961c026ac520bac5f69acb8ea063e8a4f071bcc9457b9c1f28f6b085c511583a"}, + {file = "virtualenv-20.25.1.tar.gz", hash = "sha256:e08e13ecdca7a0bd53798f356d5831434afa5b07b93f0abdf0797b7a06ffe197"}, +] + +[package.dependencies] +distlib = ">=0.3.7,<1" +filelock = ">=3.12.2,<4" +platformdirs = ">=3.9.1,<5" + +[package.extras] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] + +[[package]] +name = "watchdog" +version = "4.0.0" +description = "Filesystem events monitoring" +optional = false +python-versions = ">=3.8" +files = [ + {file = "watchdog-4.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:39cb34b1f1afbf23e9562501673e7146777efe95da24fab5707b88f7fb11649b"}, + {file = "watchdog-4.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c522392acc5e962bcac3b22b9592493ffd06d1fc5d755954e6be9f4990de932b"}, + {file = "watchdog-4.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6c47bdd680009b11c9ac382163e05ca43baf4127954c5f6d0250e7d772d2b80c"}, + {file = "watchdog-4.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8350d4055505412a426b6ad8c521bc7d367d1637a762c70fdd93a3a0d595990b"}, + {file = "watchdog-4.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c17d98799f32e3f55f181f19dd2021d762eb38fdd381b4a748b9f5a36738e935"}, + {file = "watchdog-4.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4986db5e8880b0e6b7cd52ba36255d4793bf5cdc95bd6264806c233173b1ec0b"}, + {file = "watchdog-4.0.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:11e12fafb13372e18ca1bbf12d50f593e7280646687463dd47730fd4f4d5d257"}, + {file = "watchdog-4.0.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5369136a6474678e02426bd984466343924d1df8e2fd94a9b443cb7e3aa20d19"}, + {file = "watchdog-4.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:76ad8484379695f3fe46228962017a7e1337e9acadafed67eb20aabb175df98b"}, + {file = "watchdog-4.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:45cc09cc4c3b43fb10b59ef4d07318d9a3ecdbff03abd2e36e77b6dd9f9a5c85"}, + {file = "watchdog-4.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eed82cdf79cd7f0232e2fdc1ad05b06a5e102a43e331f7d041e5f0e0a34a51c4"}, + {file = "watchdog-4.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ba30a896166f0fee83183cec913298151b73164160d965af2e93a20bbd2ab605"}, + {file = "watchdog-4.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d18d7f18a47de6863cd480734613502904611730f8def45fc52a5d97503e5101"}, + {file = "watchdog-4.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2895bf0518361a9728773083908801a376743bcc37dfa252b801af8fd281b1ca"}, + {file = "watchdog-4.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:87e9df830022488e235dd601478c15ad73a0389628588ba0b028cb74eb72fed8"}, + {file = "watchdog-4.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6e949a8a94186bced05b6508faa61b7adacc911115664ccb1923b9ad1f1ccf7b"}, + {file = "watchdog-4.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6a4db54edea37d1058b08947c789a2354ee02972ed5d1e0dca9b0b820f4c7f92"}, + {file = "watchdog-4.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d31481ccf4694a8416b681544c23bd271f5a123162ab603c7d7d2dd7dd901a07"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:8fec441f5adcf81dd240a5fe78e3d83767999771630b5ddfc5867827a34fa3d3"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:6a9c71a0b02985b4b0b6d14b875a6c86ddea2fdbebd0c9a720a806a8bbffc69f"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:557ba04c816d23ce98a06e70af6abaa0485f6d94994ec78a42b05d1c03dcbd50"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:d0f9bd1fd919134d459d8abf954f63886745f4660ef66480b9d753a7c9d40927"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:f9b2fdca47dc855516b2d66eef3c39f2672cbf7e7a42e7e67ad2cbfcd6ba107d"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:73c7a935e62033bd5e8f0da33a4dcb763da2361921a69a5a95aaf6c93aa03a87"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:6a80d5cae8c265842c7419c560b9961561556c4361b297b4c431903f8c33b269"}, + {file = "watchdog-4.0.0-py3-none-win32.whl", hash = "sha256:8f9a542c979df62098ae9c58b19e03ad3df1c9d8c6895d96c0d51da17b243b1c"}, + {file = "watchdog-4.0.0-py3-none-win_amd64.whl", hash = "sha256:f970663fa4f7e80401a7b0cbeec00fa801bf0287d93d48368fc3e6fa32716245"}, + {file = "watchdog-4.0.0-py3-none-win_ia64.whl", hash = "sha256:9a03e16e55465177d416699331b0f3564138f1807ecc5f2de9d55d8f188d08c7"}, + {file = "watchdog-4.0.0.tar.gz", hash = "sha256:e3e7065cbdabe6183ab82199d7a4f6b3ba0a438c5a512a68559846ccb76a78ec"}, +] + +[package.extras] +watchmedo = ["PyYAML (>=3.10)"] + +[[package]] +name = "wcwidth" +version = "0.2.13" +description = "Measures the displayed width of unicode strings in a terminal" +optional = false +python-versions = "*" +files = [ + {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, + {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, +] + +[[package]] +name = "werkzeug" +version = "3.0.1" +description = "The comprehensive WSGI web application library." +optional = false +python-versions = ">=3.8" +files = [ + {file = "werkzeug-3.0.1-py3-none-any.whl", hash = "sha256:90a285dc0e42ad56b34e696398b8122ee4c681833fb35b8334a095d82c56da10"}, + {file = "werkzeug-3.0.1.tar.gz", hash = "sha256:507e811ecea72b18a404947aded4b3390e1db8f826b494d76550ef45bb3b1dcc"}, +] + +[package.dependencies] +MarkupSafe = ">=2.1.1" + +[package.extras] +watchdog = ["watchdog (>=2.3)"] + +[[package]] +name = "wordcloud" +version = "1.9.3" +description = "A little word cloud generator" +optional = false +python-versions = ">=3.7" +files = [ + {file = "wordcloud-1.9.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5fce423a24e6ca1b89b2770a7c6917d6e26f04bcfefa601cf61819b2fc0770c4"}, + {file = "wordcloud-1.9.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3b6adfc1465b9176b8bc602745dd3ed8ea782b006a81cb59eab3dde92ad9f94c"}, + {file = "wordcloud-1.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad6db37a6f5abeba51a5d503228ea320d4f2fa774864103e7b24acd9dd86fd0e"}, + {file = "wordcloud-1.9.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5e74ac99e9582873d7ee28bd03e125dcf73ae46666d55fb4c13e82e90c0e074a"}, + {file = "wordcloud-1.9.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:4001317c0e3b5cb6fd106228ddcd27524d1caf9ae468b3c2c2fc571c6ce56b22"}, + {file = "wordcloud-1.9.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5f86042e5ce12e2795798033a56f0246906b4d7d9027d554b6cd951ce2fd342a"}, + {file = "wordcloud-1.9.3-cp310-cp310-win32.whl", hash = "sha256:3b90f0390c0a05ba4b4580fb765a3d45d8d21519b50ca5006d6dbdc2a0b86507"}, + {file = "wordcloud-1.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:6f7977285df9254b8704d3f895c06814a6183c6c89e140d6281848c076635e91"}, + {file = "wordcloud-1.9.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7ced0d5c946d82cfc778febafe3eedeb0bae07dd57ea4f21fe06b9ec8225ab31"}, + {file = "wordcloud-1.9.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6f5499e6360219e61808dc0d2b00cd5104f78a82d2ae8f7986df04731713835f"}, + {file = "wordcloud-1.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb1e8bb7d60f7a90fa8439c7b56dd1df60766115fd57480ac0d83ca5204e0117"}, + {file = "wordcloud-1.9.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e33328044db5c01487f2a3a023b5476947942dacd6a5dc8c217fa039f6c5bd9"}, + {file = "wordcloud-1.9.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:998dc0dc8fcbff88f566f17cb5e0eb3bb21fcafd387b0670be6c14feacaf4cdc"}, + {file = "wordcloud-1.9.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e1a1c3cfa86b605a19711ec58920ccb694dca9d5c9d00b373f4d5952d63793e9"}, + {file = "wordcloud-1.9.3-cp311-cp311-win32.whl", hash = "sha256:f504e3291256c0b6fca044602f8f0e5cb56b7c33724cde9d279c4077fa5b6d27"}, + {file = "wordcloud-1.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:103c9b0465e1cf5b7a38b49ab1c3a0b0301762fa56602ac79287f9d22b46ade3"}, + {file = "wordcloud-1.9.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:dfea303fc1dec4811e4a5671a8021a89724b6fa70639d059ad30c492932be447"}, + {file = "wordcloud-1.9.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:512f3c9a2e8579269a33ac9219d042fd0cc5a3a524ee68079238a3e4efe2b879"}, + {file = "wordcloud-1.9.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d00d916509a17b432032161d492ed7f30b2ebd921303090fe1d2b57011a49cc0"}, + {file = "wordcloud-1.9.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d5e0e7bbd269a62baa63ea2175faea4d74435c0ad828f3d5999fa4c33ebe0629"}, + {file = "wordcloud-1.9.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:483aa4f8d17b9744a3b238269593d1794b962fc757a72a9e7e8468c2665cffb7"}, + {file = "wordcloud-1.9.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:64b342a79553970fa04083761d041067323219ad62b5550a496e42436d23cbb3"}, + {file = "wordcloud-1.9.3-cp312-cp312-win32.whl", hash = "sha256:419acfe0b1d1227b9e3e14ec1bb6c40fd7fa652df4adf81f0ba3e00daca500b5"}, + {file = "wordcloud-1.9.3-cp312-cp312-win_amd64.whl", hash = "sha256:2061a9978a6243107ce1a8a9fa24f421b03a0f7e620769b6f5075857e75aa615"}, + {file = "wordcloud-1.9.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:21f47fabe189f39532378759300a624ae166519dfafbd6a22cfe65b14a7d104d"}, + {file = "wordcloud-1.9.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:524065f8a5a79e00748f45efbeacd25ac1d15850e0d0588753b17a8b2de2a6a7"}, + {file = "wordcloud-1.9.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b2bb53492bc8663ba90a300bbd2da7be5059f9ad192ed1150e9bbbda8016c9a"}, + {file = "wordcloud-1.9.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:643243474faee460e7d08944d3e529c58d0cbf8be11626fbb918ee8ccb913a23"}, + {file = "wordcloud-1.9.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d95f44739a6972abfb97c12656999952dd28ed03700ee8b6efe35d688d489b36"}, + {file = "wordcloud-1.9.3-cp37-cp37m-win32.whl", hash = "sha256:e56364c8829d399397a649501f834c12751ab106cba488ba8d86d532889b528c"}, + {file = "wordcloud-1.9.3-cp37-cp37m-win_amd64.whl", hash = "sha256:78f4a3fd3526884e4f526ae070bcb47401766c48c9cb6488933f608f810fadae"}, + {file = "wordcloud-1.9.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0058cf08573c99283fe189e93354d20ca8c9a8aac7207d96e74b93aedd02cdcc"}, + {file = "wordcloud-1.9.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:47d6918381a8a816141bdd391376bff703ec5aa3a6bd88631097a5e2963ebd1a"}, + {file = "wordcloud-1.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05aa3269c5af573cfb11e269de0fe73c2c72aefdd90cdb41368744e7d8bc7507"}, + {file = "wordcloud-1.9.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d74e206f42af172db4d3c0054853523bf46070b12f0626493a56599957dd2196"}, + {file = "wordcloud-1.9.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1932726635c8ed12bb74201d2a6b07f18c2f732aecadb9ae915832485241991f"}, + {file = "wordcloud-1.9.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:038de1701e7853c41850644453f1c9e69f878e480d42efae154684a47fd59f1a"}, + {file = "wordcloud-1.9.3-cp38-cp38-win32.whl", hash = "sha256:19aa05f60d9261301e4942fd1b1c4b458d903f24c12d2bd1c6ecbb752697a2f3"}, + {file = "wordcloud-1.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:ab5bae12cf27d8de986e4d4518d4778f2b56c660b250b631ff805024038311a1"}, + {file = "wordcloud-1.9.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:888d088f54a897b8597da2fae3954d74b1f7251f7d311bbcc30ec3c6987d3605"}, + {file = "wordcloud-1.9.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:daa6cfa11ce24e7eb4e42dc896dae4f74ae2166cf90ec997996300566e6811d1"}, + {file = "wordcloud-1.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:387dc2bd528ff6bb661451f2a9fd4ccf74b86072d7a2c868285d4c0cf26abeb4"}, + {file = "wordcloud-1.9.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40c32a324319db610b40f387a2a0b42d091817958a5272e0a4c4eb6a158588b5"}, + {file = "wordcloud-1.9.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:8078c6c58db4ccb893f120354e7e08bc48a5a5aac3e764f9008bc96a769b208c"}, + {file = "wordcloud-1.9.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:81f15eb60abc1676808bb85e2edfdbdc0a9011383f2a729c1c2a0cb941516768"}, + {file = "wordcloud-1.9.3-cp39-cp39-win32.whl", hash = "sha256:1d1680bf6c3d1b2f8e3bd02ccfa868fee2655fe13cf5b9e9905251050448fbbd"}, + {file = "wordcloud-1.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:c0f458681e4d49be36064f21bfb1dc8d8c3021fe30e474ee634666b4f84fd851"}, + {file = "wordcloud-1.9.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:baea9ac88ec1ab317461c75834b64ad5dad12a02c4f2384dd546eac3c316dbbb"}, + {file = "wordcloud-1.9.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e6956b9f0d0eb14a12f46d41aebb4e7ad2d4c2ec417cc7c586bebd2ddc9c8311"}, + {file = "wordcloud-1.9.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d221b4d0d1d2a1d79286c41d8a4c0ce70065488f153e5d81cc0be7fb494ff10f"}, + {file = "wordcloud-1.9.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:db39dbe91dd31ffb667edcd496f4eeb85ceea397fef4ad51d0766ab934088cc7"}, + {file = "wordcloud-1.9.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a6ae5db43807ca10f5c77dd2d22c78f8f9399758cc5ac6afd7f3c19e58b75d66"}, + {file = "wordcloud-1.9.3-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a1c431f20ee28a8840f2552a89bd8332c455c318f4de7b6c2ca3159b76df4f0"}, + {file = "wordcloud-1.9.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1847ca4466e2b1588478dd8eb87fa7baa28515b37ab7926471595e8ac81e6578"}, + {file = "wordcloud-1.9.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:7b0e14e4dfcff7dee331df7880a2031e352e95a7d30e74ff152f162488b04179"}, + {file = "wordcloud-1.9.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f1c0cff6037a3dc46437537a31925f3895d742fb6d67af71194149763de16a76"}, + {file = "wordcloud-1.9.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a36788c5c79604653327675023cbd97c68813640887b51ce651bb4f5c28c88b"}, + {file = "wordcloud-1.9.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3e3907c6496e197a9c4be76770c5ff8a03eddbdfe5a151a55e4eedeaa45ab3ad"}, + {file = "wordcloud-1.9.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:65e6f6b68eecb85c326ae19729dd4151fcdebffc2142c9ee882dc2de955210d0"}, + {file = "wordcloud-1.9.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0c8e18c4afa025819332efffe8008267a83a9c54fe72ae1bc889ddce0eec470d"}, + {file = "wordcloud-1.9.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4df25cb5dd347e43d53e02a009418f5776e7651063aff991865da8f6336bf193"}, + {file = "wordcloud-1.9.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53489ad22d58be3896ec16ed47604832e393224c89f7d7eed040096b07141ac4"}, + {file = "wordcloud-1.9.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:61de4a5f3bfd33e0cb013cce6143bcf71959f3cd8536650b90134d745a553c2c"}, + {file = "wordcloud-1.9.3.tar.gz", hash = "sha256:a9aa738d63ed674a40f0cc31adb83f4ca5fc195f03a6aff6e010d1f5807d1c58"}, +] + +[package.dependencies] +matplotlib = "*" +numpy = ">=1.6.1" +pillow = "*" + +[[package]] +name = "xlsxwriter" +version = "3.2.0" +description = "A Python module for creating Excel XLSX files." +optional = false +python-versions = ">=3.6" +files = [ + {file = "XlsxWriter-3.2.0-py3-none-any.whl", hash = "sha256:ecfd5405b3e0e228219bcaf24c2ca0915e012ca9464a14048021d21a995d490e"}, + {file = "XlsxWriter-3.2.0.tar.gz", hash = "sha256:9977d0c661a72866a61f9f7a809e25ebbb0fb7036baa3b9fe74afcfca6b3cb8c"}, +] + +[[package]] +name = "zipp" +version = "3.17.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +optional = false +python-versions = ">=3.8" +files = [ + {file = "zipp-3.17.0-py3-none-any.whl", hash = "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"}, + {file = "zipp-3.17.0.tar.gz", hash = "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] + +[metadata] +lock-version = "2.0" +python-versions = "^3.10" +content-hash = "09985f52b1d89c279703dc2ab8c5e888ccb0668fb1a6a1ea9a05acb234a4dc57" diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 00000000..2bcdb64a --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,90 @@ +[tool.poetry] +name = "gpt-code-ui" +version = "0.42.40" +description = "An Open Source version of ChatGPT Code Interpreter" +authors = ["Mathias Winkel", + "Tobias Plötz", + "Christian Röder", + "Rick Lamers"] +license = "MIT" +readme = "README.md" +packages = [ + { include = "gpt_code_ui" }, +] +include = [ + { path = "UserInterface.png", format = ["sdist", "wheel"] }, + { path = "LICENSE", format = ["sdist", "wheel"] }, + { path = "gpt_code_ui/webapp/static/**/*", format = ["sdist", "wheel"] }, +] +exclude = [ + "**/.gitignore", + "**/.DS_Store", +] + +[tool.poetry.dependencies] +python = "^3.10" +ipykernel = "^6.28.0" +requests = "^2.31.0" +flask = "^2.3.2" +flask-cors = "^3.0.10" +foundry-dev-tools = "^1.3" +python-dotenv = "^1.0.0" +pandas = "^2.1.4" +openai = "^1.10.0" + +[tool.poetry.group.dev.dependencies] +streamlit = "^1.31.1" +pre-commit = "^3.6.0" +pytest = "^8.0.2" + +[tool.poetry.group.devtools.dependencies] +mypy = "^1" +ruff = "^0" +black = "^23" + +# TODO why in poetry? groups are not really self-contained, but kernel env is +[tool.poetry.group.kernel.dependencies] +numpy = "^1.26.3" +rdkit = "^2023.9.3" +bio = "^1.6.2" +py3Dmol = "^2.0.4" +pandas = "^2.1.4" +ipykernel = "^6.28.0" +dateparser = "^1.2.0" +geopandas = "^0.14.2" +tabulate = "^0.9.0" +pypdf2 = "^3.0.1" +pdfminer = "^20191125" +pdfplumber = "^0.10.3" +matplotlib = "^3.8.2" +openpyxl = "^3.1.2" +scipy = "^1.11.4" +scikit-learn = "^1.3.2" +wordcloud = "^1.9.3" +xlsxwriter = "^3.1.9" +docx = "^0.2.4" + +[tool.poetry.scripts] +gptcode = "gpt_code_ui.main:main" + +[tool.mypy] +files = "gpt_code_ui/**/*.py" +ignore_missing_imports = true + +[tool.ruff] +# TODO refactor to have source in /src +include = ["gpt_code_ui/**/*.py", "tests/**/*.py"] +line-length = 120 +target-version = "py310" + +[tool.ruff.lint] +fixable = ["ALL"] +extend-select = ["I", "C90"] + +[tool.ruff.lint.mccabe] +# TODO refactor and reduce +max-complexity = 18 + +[build-system] +requires = ["poetry-core>=1.7.1"] +build-backend = "poetry.core.masonry.api" diff --git a/run_with_app_service_config.py b/run_with_app_service_config.py new file mode 100644 index 00000000..cb33ab3d --- /dev/null +++ b/run_with_app_service_config.py @@ -0,0 +1,34 @@ +import json +import os +import subprocess +import sys + +try: + config = json.loads(os.environ["APP_SERVICE_CONFIG"]) +except KeyError: + config = json.load(open(".app_service_config.json")) + +sub_env = os.environ.copy() + +for key, value in config.items(): + if isinstance(value, str): + if value.startswith("$"): + try: + value = os.environ[value[1:]] + except KeyError: + print(f"Failed to resolve environment variable {value}. Keeping the reference in the env.") + + sub_env[key] = value + elif isinstance(value, int): + sub_env[key] = str(value) + else: + sub_env[key] = json.dumps(value) + +sub_env["PYTHONUNBUFFERED"] = "1" + +if len(sys.argv) > 1: + args = sys.argv[1:] +else: + args = ["./gpt_code_ui/main.py"] + +subprocess.run([sys.executable] + args, env=sub_env) diff --git a/scripts/create_release.sh b/scripts/create_release.sh old mode 100644 new mode 100755 diff --git a/setup.py b/setup.py deleted file mode 100644 index 8a2a0e56..00000000 --- a/setup.py +++ /dev/null @@ -1,31 +0,0 @@ -from setuptools import setup, find_packages -from os import path - -this_directory = path.abspath(path.dirname(__file__)) -with open(path.join(this_directory, 'README.md'), encoding='utf-8') as f: - long_description = f.read() - -setup( - name='gpt_code_ui', - version='0.42.40', - description="An Open Source version of ChatGPT Code Interpreter", - long_description=long_description, - long_description_content_type='text/markdown', # This field specifies the format of the `long_description`. - packages=find_packages(), - package_data={'gpt_code_ui.webapp': ['static/*', 'static/assets/*']}, - install_requires=[ - 'ipykernel>=6,<7', - 'snakemq>=1,<2', - 'requests>=2,<3', - 'Flask>=2,<3', - 'flask-cors>=3,<4', - 'python-dotenv>=0.18,<2', - 'pandas>=1.3,<2', - 'openai>=0.25,<1', - ], - entry_points={ - 'console_scripts': [ - 'gptcode = gpt_code_ui.main:main', - ], - }, -) diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/integration/__init__.py b/tests/integration/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/unit/__init__.py b/tests/unit/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/unit/test_gpt_code_ui/__init__.py b/tests/unit/test_gpt_code_ui/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/unit/test_gpt_code_ui/test_chat_history.py b/tests/unit/test_gpt_code_ui/test_chat_history.py new file mode 100644 index 00000000..d905d6c3 --- /dev/null +++ b/tests/unit/test_gpt_code_ui/test_chat_history.py @@ -0,0 +1,23 @@ +from gpt_code_ui.webapp.main import ChatHistory + + +def test_chat_history(): + chat_history = ChatHistory() + # empty history should only include system message + messages = chat_history() + assert len(messages) == 1 + assert messages[0]["role"] == "system" + messages = chat_history(exclude_system=True) + assert len(messages) == 0 + + # add a message + chat_history.add_prompt("test") + messages = chat_history() + assert len(messages) == 2 + assert messages[1]["role"] == "user" + + # get messages with new system message + messages = chat_history(override_system_prompt="another system message") + assert len(messages) == 2 + assert messages[0]["role"] == "system" + assert messages[0]["content"] == "another system message" diff --git a/tests/unit/test_gpt_code_ui/test_function_prompts.py b/tests/unit/test_gpt_code_ui/test_function_prompts.py new file mode 100644 index 00000000..e0eed8a0 --- /dev/null +++ b/tests/unit/test_gpt_code_ui/test_function_prompts.py @@ -0,0 +1,49 @@ +from gpt_code_ui.function_library.examples import generate_derivate_molecules, predict_solubility +from gpt_code_ui.webapp.prompts import SYSTEM_PROMPT_TEMPLATE, function_to_prompt, get_system_prompt + +_predict_solubility_prompt = '''def predict_solubility(smiles: str) -> float: + """Predict the solubility of a molecule from its SMILES string. + + Args: + smiles: SMILES string of the molecule. + + Returns: + The predicted solubility. + """ + pass +''' + +_generate_derivate_molecules_prompt = '''def generate_derivate_molecules(smiles: str, n: int = 10) -> list[str]: + """Generate a list of molecules that are similar to the input molecule. + + Args: + smiles: SMILES string of the molecule. + n: Number of molecules to generate. + + Returns: + A list of SMILES strings of molecules that are similar to the input molecule. + """ + pass +''' + + +def test_function_prompt(): + prompt = function_to_prompt(predict_solubility) + assert prompt == _predict_solubility_prompt + + prompt = function_to_prompt(generate_derivate_molecules) + assert prompt == _generate_derivate_molecules_prompt + + +def test_system_prompt(): + prompt = get_system_prompt( + template=SYSTEM_PROMPT_TEMPLATE, + functions=[predict_solubility, generate_derivate_molecules], + ) + assert _predict_solubility_prompt in prompt + assert _generate_derivate_molecules_prompt in prompt + + # test with defaults + prompt = get_system_prompt() + assert _predict_solubility_prompt in prompt + assert _generate_derivate_molecules_prompt in prompt diff --git a/tests/unit/test_webapp.py b/tests/unit/test_webapp.py new file mode 100644 index 00000000..6549c30f --- /dev/null +++ b/tests/unit/test_webapp.py @@ -0,0 +1,15 @@ +from gpt_code_ui.webapp.prompts import type_to_string + + +def test_type_to_string(): + # test simple types + assert type_to_string(int) == "int" + assert type_to_string(str) == "str" + assert type_to_string(float) == "float" + + # test generic types + assert type_to_string(list[int]) == "list[int]" + assert type_to_string(list[str]) == "list[str]" + + # test None + assert type_to_string(None) == "None" diff --git a/workspace/.gitignore b/workspace/.gitignore deleted file mode 100644 index c96a04f0..00000000 --- a/workspace/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -* -!.gitignore \ No newline at end of file