From 6e689c27341d7ea66f155915ebf0febb12126c91 Mon Sep 17 00:00:00 2001 From: Juliya Smith Date: Tue, 17 Sep 2024 17:11:08 -0500 Subject: [PATCH] feat: pages --- .pre-commit-config.yaml | 36 - CONTRIBUTING.md | 58 - README.md | 133 +- ape_vyper/__init__.py | 13 - ape_vyper/_cli.py | 28 - ape_vyper/ast.py | 99 - ape_vyper/compiler.py | 2084 ----------------- ape_vyper/exceptions.py | 177 -- ape_vyper/interface.py | 134 -- index.html | 5 - latest/.buildinfo | 4 - latest/.doctrees/environment.pickle | Bin 456955 -> 0 bytes latest/.doctrees/index.doctree | Bin 3321 -> 0 bytes latest/.doctrees/methoddocs/compiler.doctree | Bin 231402 -> 0 bytes .../.doctrees/methoddocs/exceptions.doctree | Bin 273074 -> 0 bytes latest/.doctrees/methoddocs/interface.doctree | Bin 321492 -> 0 bytes .../.doctrees/userguides/quickstart.doctree | Bin 19728 -> 0 bytes latest/_sources/index.md.txt | 19 - latest/_sources/methoddocs/compiler.md.txt | 6 - latest/_sources/methoddocs/exceptions.md.txt | 6 - latest/_sources/methoddocs/interface.md.txt | 6 - latest/_sources/userguides/quickstart.md.txt | 2 - .../_sphinx_javascript_frameworks_compat.js | 123 - latest/_static/basic.css | 903 ------- latest/_static/custom.css | 3 - latest/_static/doctools.js | 156 -- latest/_static/documentation_options.js | 14 - latest/_static/favicon.ico | Bin 20915 -> 0 bytes latest/_static/file.png | Bin 286 -> 0 bytes latest/_static/jquery.js | 2 - latest/_static/language_data.js | 199 -- latest/_static/logo.gif | Bin 11889 -> 0 bytes latest/_static/logo_green.svg | 34 - latest/_static/logo_grey.svg | 34 - latest/_static/minus.png | Bin 90 -> 0 bytes latest/_static/plus.png | Bin 90 -> 0 bytes latest/_static/print.css | 42 - latest/_static/pygments.css | 1 - latest/_static/searchtools.js | 566 ----- latest/_static/shibuya.css | 1 - latest/_static/shibuya.js | 1 - latest/_static/sphinx_highlight.js | 144 -- latest/genindex.html | 314 --- latest/index.html | 166 -- latest/methoddocs/compiler.html | 480 ---- latest/methoddocs/exceptions.html | 261 --- latest/methoddocs/interface.html | 236 -- latest/objects.inv | Bin 795 -> 0 bytes latest/py-modindex.html | 120 - latest/search.html | 116 - latest/searchindex.js | 1 - latest/userguides/quickstart.html | 300 --- pyproject.toml | 38 - setup.cfg | 6 - setup.py | 93 - .../ExampleDependency/contracts/Dependency.vy | 4 - tests/__init__.py | 0 tests/ape-config.yaml | 7 - tests/conftest.py | 218 -- .../contract_undeclared_variable.vy | 6 - .../contract_unknown_pragma.vy | 5 - .../DirectoryWithExtension.vy/README.md | 3 - .../passing_contracts/contract_no_pragma.vy | 3 - .../contract_with_dev_messages.vy | 23 - tests/contracts/passing_contracts/empty.vy | 0 tests/contracts/passing_contracts/erc20.vy | 153 -- .../contracts/passing_contracts/evm_pragma.vy | 8 - .../contracts/passing_contracts/flatten_me.vy | 34 - .../passing_contracts/interfaces/IFace.vy | 4 - .../passing_contracts/interfaces/IFace2.vy | 4 - .../interfaces/IFaceZeroFour.vyi | 6 - .../passing_contracts/interfaces/IRegistry.vy | 7 - .../interfaces/ISubReverts.vy | 3 - .../interfaces/nested/IFaceNested.vy | 4 - .../passing_contracts/non_payable_default.vy | 8 - .../passing_contracts/older_version.vy | 5 - .../passing_contracts/optimize_codesize.vy | 8 - .../passing_contracts/payable_default.vy | 10 - .../passing_contracts/pragma_with_space.vy | 7 - .../subdir/zero_four_in_subdir.vy | 6 - .../contracts/passing_contracts/use_iface.vy | 25 - .../contracts/passing_contracts/use_iface2.vy | 10 - .../contracts/passing_contracts/zero_four.vy | 31 - .../passing_contracts/zero_four_module.vy | 14 - .../passing_contracts/zero_four_module_2.vy | 9 - tests/contracts/templates/contract.template | 120 - tests/contracts/templates/registry.template | 13 - tests/contracts/templates/reverts.template | 64 - .../contracts/templates/sub_reverts.template | 6 - .../templates/traceback_contract.template | 64 - tests/projects/coverage_project/README.md | 4 - .../projects/coverage_project/ape-config.yaml | 26 - .../contracts/coverage_test.vy | 24 - .../contracts/exclude_part_of_contract.vy | 9 - .../contracts/exclude_whole_contract.vy | 5 - .../coverage_project/tests/conftest.py | 16 - .../coverage_project/tests/test_coverage.py | 75 - .../version_in_config/ape-config.yaml | 2 - .../version_in_config/contracts/v_contract.vy | 5 - tests/test_ape_reverts.py | 132 -- tests/test_cli.py | 49 - tests/test_compiler.py | 736 ------ tests/test_coverage.py | 216 -- 103 files changed, 1 insertion(+), 9354 deletions(-) delete mode 100644 .pre-commit-config.yaml delete mode 100644 CONTRIBUTING.md delete mode 100644 ape_vyper/__init__.py delete mode 100644 ape_vyper/_cli.py delete mode 100644 ape_vyper/ast.py delete mode 100644 ape_vyper/compiler.py delete mode 100644 ape_vyper/exceptions.py delete mode 100644 ape_vyper/interface.py delete mode 100644 index.html delete mode 100644 latest/.buildinfo delete mode 100644 latest/.doctrees/environment.pickle delete mode 100644 latest/.doctrees/index.doctree delete mode 100644 latest/.doctrees/methoddocs/compiler.doctree delete mode 100644 latest/.doctrees/methoddocs/exceptions.doctree delete mode 100644 latest/.doctrees/methoddocs/interface.doctree delete mode 100644 latest/.doctrees/userguides/quickstart.doctree delete mode 100644 latest/_sources/index.md.txt delete mode 100644 latest/_sources/methoddocs/compiler.md.txt delete mode 100644 latest/_sources/methoddocs/exceptions.md.txt delete mode 100644 latest/_sources/methoddocs/interface.md.txt delete mode 100644 latest/_sources/userguides/quickstart.md.txt delete mode 100644 latest/_static/_sphinx_javascript_frameworks_compat.js delete mode 100644 latest/_static/basic.css delete mode 100644 latest/_static/custom.css delete mode 100644 latest/_static/doctools.js delete mode 100644 latest/_static/documentation_options.js delete mode 100644 latest/_static/favicon.ico delete mode 100644 latest/_static/file.png delete mode 100644 latest/_static/jquery.js delete mode 100644 latest/_static/language_data.js delete mode 100644 latest/_static/logo.gif delete mode 100644 latest/_static/logo_green.svg delete mode 100644 latest/_static/logo_grey.svg delete mode 100644 latest/_static/minus.png delete mode 100644 latest/_static/plus.png delete mode 100644 latest/_static/print.css delete mode 100644 latest/_static/pygments.css delete mode 100644 latest/_static/searchtools.js delete mode 100644 latest/_static/shibuya.css delete mode 100644 latest/_static/shibuya.js delete mode 100644 latest/_static/sphinx_highlight.js delete mode 100644 latest/genindex.html delete mode 100644 latest/index.html delete mode 100644 latest/methoddocs/compiler.html delete mode 100644 latest/methoddocs/exceptions.html delete mode 100644 latest/methoddocs/interface.html delete mode 100644 latest/objects.inv delete mode 100644 latest/py-modindex.html delete mode 100644 latest/search.html delete mode 100644 latest/searchindex.js delete mode 100644 latest/userguides/quickstart.html delete mode 100644 pyproject.toml delete mode 100644 setup.cfg delete mode 100644 setup.py delete mode 100644 tests/ExampleDependency/contracts/Dependency.vy delete mode 100644 tests/__init__.py delete mode 100644 tests/ape-config.yaml delete mode 100644 tests/conftest.py delete mode 100644 tests/contracts/failing_contracts/contract_undeclared_variable.vy delete mode 100644 tests/contracts/failing_contracts/contract_unknown_pragma.vy delete mode 100644 tests/contracts/passing_contracts/DirectoryWithExtension.vy/README.md delete mode 100644 tests/contracts/passing_contracts/contract_no_pragma.vy delete mode 100644 tests/contracts/passing_contracts/contract_with_dev_messages.vy delete mode 100644 tests/contracts/passing_contracts/empty.vy delete mode 100644 tests/contracts/passing_contracts/erc20.vy delete mode 100644 tests/contracts/passing_contracts/evm_pragma.vy delete mode 100644 tests/contracts/passing_contracts/flatten_me.vy delete mode 100644 tests/contracts/passing_contracts/interfaces/IFace.vy delete mode 100644 tests/contracts/passing_contracts/interfaces/IFace2.vy delete mode 100644 tests/contracts/passing_contracts/interfaces/IFaceZeroFour.vyi delete mode 100644 tests/contracts/passing_contracts/interfaces/IRegistry.vy delete mode 100644 tests/contracts/passing_contracts/interfaces/ISubReverts.vy delete mode 100644 tests/contracts/passing_contracts/interfaces/nested/IFaceNested.vy delete mode 100644 tests/contracts/passing_contracts/non_payable_default.vy delete mode 100644 tests/contracts/passing_contracts/older_version.vy delete mode 100644 tests/contracts/passing_contracts/optimize_codesize.vy delete mode 100644 tests/contracts/passing_contracts/payable_default.vy delete mode 100644 tests/contracts/passing_contracts/pragma_with_space.vy delete mode 100644 tests/contracts/passing_contracts/subdir/zero_four_in_subdir.vy delete mode 100644 tests/contracts/passing_contracts/use_iface.vy delete mode 100644 tests/contracts/passing_contracts/use_iface2.vy delete mode 100644 tests/contracts/passing_contracts/zero_four.vy delete mode 100644 tests/contracts/passing_contracts/zero_four_module.vy delete mode 100644 tests/contracts/passing_contracts/zero_four_module_2.vy delete mode 100644 tests/contracts/templates/contract.template delete mode 100644 tests/contracts/templates/registry.template delete mode 100644 tests/contracts/templates/reverts.template delete mode 100644 tests/contracts/templates/sub_reverts.template delete mode 100644 tests/contracts/templates/traceback_contract.template delete mode 100644 tests/projects/coverage_project/README.md delete mode 100644 tests/projects/coverage_project/ape-config.yaml delete mode 100644 tests/projects/coverage_project/contracts/coverage_test.vy delete mode 100644 tests/projects/coverage_project/contracts/exclude_part_of_contract.vy delete mode 100644 tests/projects/coverage_project/contracts/exclude_whole_contract.vy delete mode 100644 tests/projects/coverage_project/tests/conftest.py delete mode 100644 tests/projects/coverage_project/tests/test_coverage.py delete mode 100644 tests/projects/version_in_config/ape-config.yaml delete mode 100644 tests/projects/version_in_config/contracts/v_contract.vy delete mode 100644 tests/test_ape_reverts.py delete mode 100644 tests/test_cli.py delete mode 100644 tests/test_compiler.py delete mode 100644 tests/test_coverage.py diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml deleted file mode 100644 index 6292b9c7..00000000 --- a/.pre-commit-config.yaml +++ /dev/null @@ -1,36 +0,0 @@ -repos: -- repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.6.0 - hooks: - - id: check-yaml - -- repo: https://github.com/PyCQA/isort - rev: 5.13.2 - hooks: - - id: isort - -- repo: https://github.com/psf/black - rev: 24.4.2 - hooks: - - id: black - name: black - -- repo: https://github.com/pycqa/flake8 - rev: 7.1.0 - hooks: - - id: flake8 - -- repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.10.1 - hooks: - - id: mypy - additional_dependencies: [types-setuptools, pydantic==1.10.4] - -- repo: https://github.com/executablebooks/mdformat - rev: 0.7.17 - hooks: - - id: mdformat - additional_dependencies: [mdformat-gfm, mdformat-frontmatter, mdformat-pyproject] - -default_language_version: - python: python3 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index 3b654d3f..00000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,58 +0,0 @@ -# Development - -To get started with working on the codebase, use the following steps prepare your local environment: - -```bash -# clone the github repo and navigate into the folder -git clone https://github.com/ApeWorX/ape-vyper.git -cd ape-vyper - -# create and load a virtual environment -python3 -m venv venv -source venv/bin/activate - -# install ape-vyper into the virtual environment -python setup.py install - -# install the developer dependencies (-e is interactive mode) -pip install -e .'[dev]' -``` - -## Pre-Commit Hooks - -We use [`pre-commit`](https://pre-commit.com/) hooks to simplify linting and ensure consistent formatting among contributors. -Use of `pre-commit` is not a requirement, but is highly recommended. - -Install `pre-commit` locally from the root folder: - -```bash -pip install pre-commit -pre-commit install -``` - -Committing will now automatically run the local hooks and ensure that your commit passes all lint checks. - -## Pull Requests - -Pull requests are welcomed! Please adhere to the following: - -- Ensure your pull request passes our linting checks -- Include test cases for any new functionality -- Include any relevant documentation updates - -It's a good idea to make pull requests early on. -A pull request represents the start of a discussion, and doesn't necessarily need to be the final, finished submission. - -If you are opening a work-in-progress pull request to verify that it passes CI tests, please consider -[marking it as a draft](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/about-pull-requests#draft-pull-requests). - -Join the ApeWorX [Discord](https://discord.gg/apeworx) if you have any questions. - -## Testing - -By default, the test suite will use a new, temporary path for the Vyper compiler installations. -This ensures that the tests always run from a clean slate without any relying on existing installations. - -If you wish to use your existing `~/.vvm` installations instead, you must set the environment variable `APE_VYPER_USE_SYSTEM_VYPER=1`. - -This will ensure that vvm's default path will be used, but any compilers installed as part of the tests will not be removed after tests have completed. diff --git a/README.md b/README.md index 9d3ae00d..aefaeb69 100644 --- a/README.md +++ b/README.md @@ -1,132 +1 @@ -# Quick Start - -Ape compiler plugin around [VVM](https://github.com/vyperlang/vvm) - -## Dependencies - -- [python3](https://www.python.org/downloads) version 3.10 up to 3.12. - -## Installation - -### via `pip` - -You can install the latest release via [`pip`](https://pypi.org/project/pip/): - -```bash -pip install ape-vyper -``` - -### via `setuptools` - -You can clone the repository and use [`setuptools`](https://github.com/pypa/setuptools) for the most up-to-date version: - -```bash -git clone https://github.com/ApeWorX/ape-vyper.git -cd ape-vyper -python3 setup.py install -``` - -## Quick Usage - -First, place Vyper contract source files (files with extension `.vy`) in your Ape project's contracts folder. -An example Vyper contract can be found [here](https://vyper.readthedocs.io/en/stable/vyper-by-example.html). -Then, from your root Ape project folder, run the command: - -```bash -ape compile -``` - -The `.vy` files in your project will compile into `ContractTypes` that you can deploy and interact with in Ape. - -### Contract Flattening - -For ease of publishing, validation, and some other cases it's sometimes useful to "flatten" your contract into a single file. -This combines your contract and any imported interfaces together in a way the compiler can understand. -You can do so with a command like this: - -```bash -ape vyper flatten contracts/MyContract.vy build/MyContractFlattened.vy -``` - -> \[!WARNING\] -> This feature is experimental. Please [report any bugs](https://github.com/ApeWorX/ape-solidity/issues/new?assignees=&labels=bug&projects=&template=bug.md) you find when trying it out. - -### Compiler Version - -By default, the `ape-vyper` plugin uses version pragma for version specification. -However, you can also configure the version directly in your `ape-config.yaml` file: - -```yaml -vyper: - version: 0.3.7 -``` - -### EVM Versioning - -By default, `ape-vyper` will use whatever version of EVM rules are set as default in the compiler version that gets used, -or based on what the `#pragma evm-version ...` pragma comment specifies (available post-`v0.3.10`). -Sometimes, you might want to use a different version, such as deploying on Arbitrum or Optimism where new opcodes are not supported yet. -If you want to require a different version of EVM rules to use in the configuration of the compiler, set it in your `ape-config.yaml` like this: - -```yaml -vyper: - evm_version: paris -``` - -**NOTE**: The config value chosen will not override if a pragma is set in a contract. - -### Interfaces - -You can not compile interface source files directly. -Thus, you must place interface files in a directory named `interfaces` in your `contracts_folder` e.g. `contracts/interfaces/IFace.vy`. -Then, these files can be imported in other `.vy` sources files via: - -```python -import interfaces.IFace as IFace -``` - -Alternatively, use JSON interfaces from dependency contract types by listing them under the `import_remapping` key: - -```yaml -# Use `voting` example contracts from Vyperlang repo. -dependencies: - - name: VyperVoting - github: vyperlang/vyper - contracts_folder: examples/voting/ - version: v0.3.8 - -# Automatically allow importing voting contracts in your project. -vyper: - import_remapping: - - "voting=VyperVoting@v0.3.8" -``` - -Import the voting contract types like this: - -```python -# @version 0.3.10 - -import voting.ballot as ballot -``` - -### Pragmas - -Ape-Vyper supports Vyper 0.3.10's [new pragma formats](https://github.com/vyperlang/vyper/pull/3493) - -#### Version Pragma - -```python -#pragma version 0.3.10 -``` - -#### EVM Version Pragma - -```python -#pragma evm-version paris -``` - -#### Optimization Pragma - -```python -#pragma optimize codesize -``` +# ape-vyper \ No newline at end of file diff --git a/ape_vyper/__init__.py b/ape_vyper/__init__.py deleted file mode 100644 index ebd7db41..00000000 --- a/ape_vyper/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -from ape import plugins - -from .compiler import FileType, VyperCompiler, VyperConfig - - -@plugins.register(plugins.Config) -def config_class(): - return VyperConfig - - -@plugins.register(plugins.CompilerPlugin) -def register_compiler(): - return tuple(e.value for e in FileType), VyperCompiler diff --git a/ape_vyper/_cli.py b/ape_vyper/_cli.py deleted file mode 100644 index bfddd372..00000000 --- a/ape_vyper/_cli.py +++ /dev/null @@ -1,28 +0,0 @@ -from pathlib import Path - -import ape -import click -from ape.cli import ape_cli_context, project_option - - -@click.group -def cli(): - """`vyper` command group""" - - -@cli.command(short_help="Flatten select contract source files") -@ape_cli_context() -@project_option() -@click.argument("CONTRACT", type=click.Path(exists=True, resolve_path=True)) -@click.argument("OUTFILE", type=click.Path(exists=False, resolve_path=True, writable=True)) -def flatten(cli_ctx, project, contract: Path, outfile: Path): - """ - Flatten a contract into a single file - """ - with Path(outfile).open("w") as fout: - content = ape.compilers.vyper.flatten_contract( - Path(contract), - base_path=ape.project.contracts_folder, - project=project, - ) - fout.write(str(content)) diff --git a/ape_vyper/ast.py b/ape_vyper/ast.py deleted file mode 100644 index e9b40838..00000000 --- a/ape_vyper/ast.py +++ /dev/null @@ -1,99 +0,0 @@ -"""Utilities for dealing with Vyper AST""" - -from ethpm_types import ABI, MethodABI -from ethpm_types.abi import ABIType -from vyper.ast import parse_to_ast # type: ignore -from vyper.ast.nodes import FunctionDef, Module, Name, Subscript # type: ignore - -DEFAULT_VYPER_MUTABILITY = "nonpayable" -DECORATOR_MUTABILITY = { - "pure", # Function does not read contract state or environment variables - "view", # Function does not alter contract state - "payable", # Function is able to receive Ether and may alter state - "nonpayable", # Function may alter sate -} - - -def funcdef_decorators(funcdef: FunctionDef) -> list[str]: - return [d.id for d in funcdef.get("decorator_list") or []] - - -def funcdef_inputs(funcdef: FunctionDef) -> list[ABIType]: - """Get a FunctionDef's defined input args""" - args = funcdef.get("args") - # TODO: Does Vyper allow complex input types, like structs and arrays? - return ( - [ABIType.model_validate({"name": arg.arg, "type": arg.annotation.id}) for arg in args.args] - if args - else [] - ) - - -def funcdef_outputs(funcdef: FunctionDef) -> list[ABIType]: - """Get a FunctionDef's outputs, or return values""" - returns = funcdef.get("returns") - - if not returns: - return [] - - if isinstance(returns, Name): - # TODO: Structs fall in here. I think they're supposed to be a tuple of types in the ABI. - # Need to dig into that more. - return [ABIType.model_validate({"type": returns.id})] - - elif isinstance(returns, Subscript): - # An array type - length = returns.slice.value.value - if array_type := getattr(returns.value, "id", None): - # TOOD: Is this an accurate way to define a fixed length array for ABI? - return [ABIType.model_validate({"type": f"{array_type}[{length}]"})] - - raise NotImplementedError(f"Unhandled return type {type(returns)}") - - -def funcdef_state_mutability(funcdef: FunctionDef) -> str: - """Get a FunctionDef's declared state mutability""" - for decorator in funcdef_decorators(funcdef): - if decorator in DECORATOR_MUTABILITY: - return decorator - return DEFAULT_VYPER_MUTABILITY - - -def funcdef_is_external(funcdef: FunctionDef) -> bool: - """Check if a FunctionDef is declared external""" - for decorator in funcdef_decorators(funcdef): - if decorator == "external": - return True - return False - - -def funcdef_to_abi(func: FunctionDef) -> ABI: - """Return a MethodABI instance for a Vyper FunctionDef""" - return MethodABI.model_validate( - { - "name": func.get("name"), - "inputs": funcdef_inputs(func), - "outputs": funcdef_outputs(func), - "stateMutability": funcdef_state_mutability(func), - } - ) - - -def module_to_abi(module: Module) -> list[ABI]: - """ - Create a list of MethodABIs from a Vyper AST Module instance. - """ - abi = [] - for child in module.get_children(): - if isinstance(child, FunctionDef): - abi.append(funcdef_to_abi(child)) - return abi - - -def source_to_abi(source: str) -> list[ABI]: - """ - Given Vyper source code, return a list of Ape ABI elements needed for an external interface. - This currently does not include complex types or events. - """ - module = parse_to_ast(source) - return module_to_abi(module) diff --git a/ape_vyper/compiler.py b/ape_vyper/compiler.py deleted file mode 100644 index 96486dfc..00000000 --- a/ape_vyper/compiler.py +++ /dev/null @@ -1,2084 +0,0 @@ -import os -import re -import shutil -import time -from base64 import b64encode -from collections import defaultdict -from collections.abc import Iterable, Iterator -from enum import Enum -from fnmatch import fnmatch -from importlib import import_module -from pathlib import Path -from site import getsitepackages -from typing import Any, Optional, Union, cast - -import vvm # type: ignore -from ape.api import PluginConfig, TraceAPI -from ape.api.compiler import CompilerAPI -from ape.exceptions import ContractLogicError, ProjectError -from ape.logging import logger -from ape.managers.project import LocalProject, ProjectManager -from ape.types import ContractSourceCoverage, ContractType, SourceTraceback -from ape.utils import cached_property, get_relative_path, pragma_str_to_specifier_set -from ape.utils._github import _GithubClient -from ape.utils.os import clean_path, get_full_extension -from eth_pydantic_types import HexBytes -from eth_utils import is_0x_prefixed -from ethpm_types import ASTNode, PackageManifest, PCMap, SourceMapItem -from ethpm_types.ast import ASTClassification -from ethpm_types.contract_type import SourceMap -from ethpm_types.source import Compiler, Content, ContractSource, Function, SourceLocation -from evm_trace import TraceFrame -from evm_trace.enums import CALL_OPCODES -from evm_trace.geth import create_call_node_data -from packaging.specifiers import InvalidSpecifier, SpecifierSet -from packaging.version import Version -from pydantic import field_serializer, field_validator, model_validator -from vvm import compile_standard as vvm_compile_standard -from vvm.exceptions import VyperError # type: ignore - -from ape_vyper.ast import source_to_abi -from ape_vyper.exceptions import ( - RUNTIME_ERROR_MAP, - IntegerBoundsCheck, - RuntimeErrorType, - VyperCompileError, - VyperInstallError, -) -from ape_vyper.interface import ( - extract_import_aliases, - extract_imports, - extract_meta, - generate_interface, -) - -DEV_MSG_PATTERN = re.compile(r".*\s*#\s*(dev:.+)") -_RETURN_OPCODES = ("RETURN", "REVERT", "STOP") -_FUNCTION_DEF = "FunctionDef" -_FUNCTION_AST_TYPES = (_FUNCTION_DEF, "Name", "arguments") -_EMPTY_REVERT_OFFSET = 18 -_NON_PAYABLE_STR = f"dev: {RuntimeErrorType.NONPAYABLE_CHECK.value}" -Optimization = Union[str, bool] - -EVM_VERSION_DEFAULT = { - "0.2.15": "berlin", - "0.2.16": "berlin", - "0.3.0": "berlin", - "0.3.1": "berlin", - "0.3.2": "berlin", - "0.3.3": "berlin", - "0.3.4": "berlin", - "0.3.6": "berlin", - "0.3.7": "paris", - "0.3.8": "shanghai", - "0.3.9": "shanghai", - "0.3.10": "shanghai", - "0.4.0": "shanghai", -} - - -class FileType(str, Enum): - SOURCE = ".vy" - INTERFACE = ".vyi" - - def __str__(self) -> str: - return self.value - - -class Remapping(PluginConfig): - key: str - dependency_name: str - dependency_version: Optional[None] = None - - @model_validator(mode="before") - @classmethod - def validate_str(cls, value): - if isinstance(value, str): - parts = value.split("=") - key = parts[0].strip() - value = parts[1].strip() - if "@" in value: - value_parts = value.split("@") - dep_name = value_parts[0].strip() - dep_version = value_parts[1].strip() - else: - dep_name = value - dep_version = None - - return {"key": key, "dependency_name": dep_name, "dependency_version": dep_version} - - return value - - def __str__(self) -> str: - value = self.dependency_name - if _version := self.dependency_version: - value = f"{value}@{_version}" - - return f"{self.key}={value}" - - -class VyperConfig(PluginConfig): - version: Optional[SpecifierSet] = None - """ - Configure a version to use for all files, - regardless of pragma. - """ - - evm_version: Optional[str] = None - """ - The evm-version or hard-fork name. - """ - - import_remapping: list[Remapping] = [] - """ - Configuration of an import name mapped to a dependency listing. - To use a specific version of a dependency, specify using ``@`` symbol. - - Usage example:: - - vyper: - import_remapping: - - "dep_a=dependency_a@0.1.1" - - "dep_b=dependency" # Uses only version. Will raise if more than 1. - - """ - - @field_validator("version", mode="before") - def validate_version(cls, value): - return pragma_str_to_specifier_set(value) if isinstance(value, str) else value - - @field_serializer("version") - def serialize_version(self, value: Optional[SpecifierSet], _info) -> Optional[str]: - if version := value: - return str(version) - - return None - - -def _install_vyper(version: Version): - try: - vvm.install_vyper(version, show_progress=True) - except Exception as err: - raise VyperInstallError( - f"Unable to install Vyper version: '{version}'.\nReason: {err}" - ) from err - - -def get_version_pragma_spec(source: Union[str, Path]) -> Optional[SpecifierSet]: - """ - Extracts version pragma information from Vyper source code. - - Args: - source (str): Vyper source code - - Returns: - ``packaging.specifiers.SpecifierSet``, or None if no valid pragma is found. - """ - _version_pragma_patterns: tuple[str, str] = ( - r"(?:\n|^)\s*#\s*@version\s*([^\n]*)", - r"(?:\n|^)\s*#\s*pragma\s+version\s*([^\n]*)", - ) - - source_str = source if isinstance(source, str) else source.read_text(encoding="utf8") - for pattern in _version_pragma_patterns: - for match in re.finditer(pattern, source_str): - raw_pragma = match.groups()[0] - pragma_str = " ".join(raw_pragma.split()).replace("^", "~=") - if pragma_str and pragma_str[0].isnumeric(): - pragma_str = f"=={pragma_str}" - - try: - return SpecifierSet(pragma_str) - except InvalidSpecifier: - logger.warning(f"Invalid pragma spec: '{raw_pragma}'. Trying latest.") - return None - return None - - -def get_optimization_pragma(source: Union[str, Path]) -> Optional[str]: - """ - Extracts optimization pragma information from Vyper source code. - - Args: - source (Union[str, Path]): Vyper source code - - Returns: - ``str``, or None if no valid pragma is found. - """ - if isinstance(source, str): - source_str = source - elif not source.is_file(): - return None - else: - source_str = source.read_text(encoding="utf8") - - if pragma_match := next( - re.finditer(r"(?:\n|^)\s*#pragma\s+optimize\s+([^\n]*)", source_str), None - ): - return pragma_match.groups()[0] - - return None - - -def get_evmversion_pragma(source: Union[str, Path]) -> Optional[str]: - """ - Extracts evm version pragma information from Vyper source code. - - Args: - source (Union[str, Path]): Vyper source code - - Returns: - ``str``, or None if no valid pragma is found. - """ - if isinstance(source, str): - source_str = source - elif not source.is_file(): - return None - else: - source_str = source.read_text(encoding="utf8") - - if pragma_match := next( - re.finditer(r"(?:\n|^)\s*#pragma\s+evm-version\s+([^\n]*)", source_str), None - ): - return pragma_match.groups()[0] - - return None - - -def get_optimization_pragma_map( - contract_filepaths: Iterable[Path], - base_path: Path, - default: Optimization, -) -> dict[str, Optimization]: - pragma_map: dict[str, Optimization] = {} - - for path in contract_filepaths: - res = get_optimization_pragma(path) - pragma = default if res is None else res - source_id = str(get_relative_path(path.absolute(), base_path.absolute())) - pragma_map[source_id] = pragma - - return pragma_map - - -def get_evm_version_pragma_map( - contract_filepaths: Iterable[Path], base_path: Path -) -> dict[str, str]: - pragmas: dict[str, str] = {} - for path in contract_filepaths: - pragma = get_evmversion_pragma(path) - if not pragma: - continue - - source_id = str(get_relative_path(path.absolute(), base_path.absolute())) - pragmas[source_id] = pragma - - return pragmas - - -def _lookup_source_from_site_packages( - dependency_name: str, - filestem: str, - config_override: Optional[dict] = None, -) -> Optional[tuple[Path, ProjectManager]]: - # Attempt looking up dependency from site-packages. - config_override = config_override or {} - if "contracts_folder" not in config_override: - # Default to looking through the whole release for - # contracts. Most often, Python-based dependencies publish - # only their contracts this way, and we are only looking - # for sources so accurate project configuration is not required. - config_override["contracts_folder"] = "." - - try: - imported_project = ProjectManager.from_python_library( - dependency_name, - config_override=config_override, - ) - except ProjectError as err: - # Still attempt to let Vyper handle this during compilation. - logger.error( - f"'{dependency_name}' may not be installed. " - "Could not find it in Ape dependencies or Python's site-packages. " - f"Error: {err}" - ) - else: - extensions = [*[f"{t}" for t in FileType], ".json"] - - def seek() -> Optional[Path]: - for ext in extensions: - try_source_id = f"{filestem}{ext}" - if source_path := imported_project.sources.lookup(try_source_id): - return source_path - - return None - - if res := seek(): - return res, imported_project - - # Still not found. Try again without contracts_folder set. - # This will attempt to use Ape's contracts_folder detection system. - # However, I am not sure this situation occurs, as Vyper-python - # based dependencies are new at the time of writing this. - new_override = config_override or {} - if "contracts_folder" in new_override: - del new_override["contracts_folder"] - - imported_project.reconfigure(**new_override) - if res := seek(): - return res, imported_project - - # Still not found. Log a very helpful message. - existing_filestems = [f.stem for f in imported_project.path.iterdir()] - fs_str = ", ".join(existing_filestems) - contracts_folder = imported_project.contracts_folder - path = imported_project.path - - # This will log the calculated / user-set contracts_folder. - contracts_path = f"{get_relative_path(contracts_folder, path)}" - - logger.error( - f"Source for stem '{filestem}' not found in " - f"'{imported_project.path}'." - f"Contracts folder: {contracts_path}, " - f"Existing file(s): {fs_str}" - ) - - return None - - -class VyperCompiler(CompilerAPI): - @property - def name(self) -> str: - return "vyper" - - def get_imports( - self, - contract_filepaths: Iterable[Path], - project: Optional[ProjectManager] = None, - ) -> dict[str, list[str]]: - pm = project or self.local_project - return self._get_imports(contract_filepaths, project=pm, handled=set()) - - def _get_imports( - self, - contract_filepaths: Iterable[Path], - project: Optional[ProjectManager] = None, - handled: Optional[set[str]] = None, - ): - pm = project or self.local_project - - # When compiling projects outside the cwd, we must - # use absolute paths. - use_absolute_paths = pm.path != Path.cwd() - - import_map: defaultdict = defaultdict(list) - handled = handled or set() - dependencies = self.get_dependencies(project=pm) - for path in contract_filepaths: - if not path.is_file(): - continue - - content = path.read_text().splitlines() - source_id = ( - str(path.absolute()) - if use_absolute_paths - else str(get_relative_path(path.absolute(), pm.path.absolute())) - ) - - # Prevent infinitely handling imports when they cross over. - if source_id in handled: - continue - - handled.add(source_id) - for line in content: - if line.startswith("import "): - import_line_parts = line.replace("import ", "").split(" ") - prefix = import_line_parts[0] - - elif line.startswith("from ") and " import " in line: - import_line_parts = line.replace("from ", "").strip().split(" ") - module_name = import_line_parts[0].strip() - prefix = os.path.sep.join([module_name, import_line_parts[2].strip()]) - - else: - # Not an import line - continue - - dots = "" - while prefix.startswith("."): - dots += prefix[0] - prefix = prefix[1:] - - is_relative = dots != "" - - # Replace rest of dots with slashes. - prefix = prefix.replace(".", os.path.sep) - - if prefix.startswith("vyper/") or prefix.startswith("ethereum/"): - if f"{prefix}.json" not in import_map[source_id]: - import_map[source_id].append(f"{prefix}.json") - - continue - - local_path = ( - (path.parent / dots / prefix.lstrip(os.path.sep)).resolve() - if is_relative - else (pm.path / prefix.lstrip(os.path.sep)).resolve() - ) - local_prefix = str(local_path).replace(f"{pm.path}", "").lstrip(os.path.sep) - - import_source_id = None - is_local = True - - # NOTE: Defaults to JSON (assuming from input JSON or a local JSON), - # unless a Vyper file exists. - if (pm.path / f"{local_prefix}{FileType.SOURCE}").is_file(): - ext = FileType.SOURCE.value - elif (pm.path / f"{local_prefix}{FileType.SOURCE}").is_file(): - ext = FileType.INTERFACE.value - elif (pm.path / f"{local_prefix}{FileType.INTERFACE}").is_file(): - ext = FileType.INTERFACE.value - else: - ext = ".json" - dep_key = prefix.split(os.path.sep)[0] - dependency_name = prefix.split(os.path.sep)[0] - filestem = prefix.replace(f"{dependency_name}{os.path.sep}", "") - if dep_key in dependencies: - for version_str, dep_project in pm.dependencies[dependency_name].items(): - dependency = pm.dependencies.get_dependency( - dependency_name, version_str - ) - path_id = dependency.package_id.replace("/", "_") - contracts_path = dep_project.contracts_folder - dependency_source_prefix = ( - f"{get_relative_path(contracts_path, dep_project.path)}" - ) - source_id_stem = f"{dependency_source_prefix}{os.path.sep}{filestem}" - for ext in (".vy", ".json"): - if f"{source_id_stem}{ext}" in dep_project.sources: - import_source_id = os.path.sep.join( - (path_id, version_str, f"{source_id_stem}{ext}") - ) - - # Also include imports of imports. - sub_imports = self._get_imports( - (dep_project.path / f"{source_id_stem}{ext}",), - project=dep_project, - handled=handled, - ) - for sub_import_ls in sub_imports.values(): - import_map[source_id].extend(sub_import_ls) - - is_local = False - break - elif dependency_name: - # Attempt looking up dependency from site-packages. - if res := _lookup_source_from_site_packages(dependency_name, filestem): - source_path, imported_project = res - import_source_id = str(source_path) - # Also include imports of imports. - sub_imports = self._get_imports( - (source_path,), - project=imported_project, - handled=handled, - ) - for sub_import_ls in sub_imports.values(): - import_map[source_id].extend(sub_import_ls) - - is_local = False - - if is_local: - import_source_id = f"{local_prefix}{ext}" - full_path = local_path.parent / f"{local_path.stem}{ext}" - - # Also include imports of imports. - sub_imports = self._get_imports((full_path,), project=project, handled=handled) - for sub_import_ls in sub_imports.values(): - import_map[source_id].extend(sub_import_ls) - - if use_absolute_paths: - import_source_id = str(full_path) - - if import_source_id and import_source_id not in import_map[source_id]: - import_map[source_id].append(import_source_id) - - return dict(import_map) - - def get_versions(self, all_paths: Iterable[Path]) -> set[str]: - versions = set() - for path in all_paths: - if version_spec := get_version_pragma_spec(path): - try: - # Make sure we have the best compiler available to compile this - version_iter = version_spec.filter(self.available_versions) - - except VyperInstallError as err: - # Possible internet issues. Try to stick to installed versions. - logger.error( - "Error checking available versions, possibly due to Internet problems. " - "Attempting to use the best installed version. " - f"Error: {err}" - ) - version_iter = version_spec.filter(self.installed_versions) - - matching_versions = sorted(list(version_iter)) - if matching_versions: - versions.add(str(matching_versions[0])) - - return versions - - @cached_property - def package_version(self) -> Optional[Version]: - try: - vyper = import_module("vyper") - except ModuleNotFoundError: - return None - - version_str = getattr(vyper, "__version__", None) - return Version(version_str) if version_str else None - - @cached_property - def available_versions(self) -> list[Version]: - # NOTE: Package version should already be included in available versions - max_retries = 10 - buffer = 1 - times_tried = 0 - result = [] - headers = None - if token := os.environ.get(_GithubClient.TOKEN_KEY): - auth = b64encode(token.encode()).decode() - headers = {"Authorization": f"Basic {auth}"} - - while times_tried < max_retries: - try: - result = vvm.get_installable_vyper_versions(headers=headers) - except ConnectionError as err: - if "API rate limit exceeded" in str(err): - if times_tried == max_retries: - raise VyperInstallError(str(err)) from err - - # Retry - logger.warning( - f"GitHub throttled requests. Retrying in '{buffer}' seconds. " - f"Tries left={max_retries - times_tried}" - ) - time.sleep(buffer) - buffer += 1 - times_tried += 1 - continue - - else: - # This is a different error. - raise VyperInstallError(str(err)) from err - - # Succeeded. - break - - return result - - @property - def installed_versions(self) -> list[Version]: - # Doing this so it prefers package version - package_version = self.package_version - versions = [package_version] if package_version else [] - # currently package version is [] this should be ok - return versions + vvm.get_installed_vyper_versions() - - @cached_property - def vyper_json(self): - try: - from vyper.cli import vyper_json # type: ignore - - return vyper_json - except ImportError: - return None - - def get_dependencies( - self, project: Optional[ProjectManager] = None - ) -> dict[str, ProjectManager]: - pm = project or self.local_project - config = self.get_config(project=pm) - dependencies: dict[str, ProjectManager] = {} - handled: set[str] = set() - - # Add remappings from config. - for remapping in config.import_remapping: - name = remapping.dependency_name - if not (_version := remapping.dependency_version): - versions = pm.dependencies[name] - if len(versions) == 1: - _version = versions[0] - else: - continue - - dependency = pm.dependencies.get_dependency(name, _version) - dep_id = f"{dependency.name}_{dependency.version}" - if dep_id in handled or ( - isinstance(dependency.project, LocalProject) and dependency.project.path == pm.path - ): - continue - - handled.add(dep_id) - - try: - dependency.compile() - except Exception as err: - logger.warning( - f"Failed to compile dependency '{dependency.name}' @ '{dependency.version}'.\n" - f"Reason: {err}" - ) - continue - - dependencies[remapping.key] = dependency.project - - # Add auto-remapped dependencies. - for dependency in pm.dependencies.specified: - dep_id = f"{dependency.name}_{dependency.version}" - if dep_id in handled or ( - isinstance(dependency.project, LocalProject) and dependency.project.path == pm.path - ): - continue - - handled.add(dep_id) - - try: - dependency.compile() - except Exception as err: - logger.warning( - f"Failed to compile dependency '{dependency.name}' @ '{dependency.version}'.\n" - f"Reason: {err}" - ) - continue - - dependencies[dependency.name] = dependency.project - - return dependencies - - def get_import_remapping(self, project: Optional[ProjectManager] = None) -> dict[str, dict]: - """ - Configured interface imports from dependencies. - """ - pm = project or self.local_project - dependencies = self.get_dependencies(project=pm) - interfaces: dict[str, dict] = {} - for key, dependency_project in dependencies.items(): - manifest = dependency_project.manifest - for name, ct in (manifest.contract_types or {}).items(): - filename = f"{key}/{name}.json" - abi_list = [x.model_dump(mode="json", by_alias=True) for x in ct.abi] - interfaces[filename] = {"abi": abi_list} - - return interfaces - - def classify_ast(self, _node: ASTNode): - if _node.ast_type in _FUNCTION_AST_TYPES: - _node.classification = ASTClassification.FUNCTION - - for child in _node.children: - self.classify_ast(child) - - def compile( - self, - contract_filepaths: Iterable[Path], - project: Optional[ProjectManager] = None, - settings: Optional[dict] = None, - ) -> Iterator[ContractType]: - pm = project or self.local_project - - # (0.4.0): If compiling a project outside the cwd (such as a dependency), - # we are forced to use absolute paths. - use_absolute_paths = pm.path != Path.cwd() - - self.compiler_settings = {**self.compiler_settings, **(settings or {})} - contract_types: list[ContractType] = [] - import_map = self.get_imports(contract_filepaths, project=pm) - config = self.get_config(pm) - version_map = self._get_version_map_from_import_map( - contract_filepaths, - import_map, - project=pm, - config=config, - ) - compiler_data = self._get_compiler_arguments(version_map, project=pm, config=config) - all_settings = self._get_compiler_settings_from_version_map(version_map, project=pm) - contract_versions: dict[str, tuple[Version, str]] = {} - import_remapping = self.get_import_remapping(project=pm) - - for vyper_version, version_settings in all_settings.items(): - for settings_key, settings_set in version_settings.items(): - if vyper_version >= Version("0.4.0rc1"): - sources = settings_set.get("outputSelection", {}) - if not sources: - continue - - if use_absolute_paths: - src_dict = { - str(pm.path / p): {"content": (pm.path / p).read_text(encoding="utf8")} - for p in sources - } - else: - src_dict = { - p: {"content": Path(p).read_text(encoding="utf8")} for p in sources - } - - for src in sources: - if Path(src).is_absolute(): - src_id = ( - str(Path(src)) - if use_absolute_paths - else f"{get_relative_path(Path(src), pm.path)}" - ) - else: - src_id = src - - if imports := import_map.get(src_id): - for imp in imports: - if imp in src_dict: - continue - - imp_path = Path(imp) - if (pm.path / imp).is_file(): - imp_path = pm.path / imp - if not imp_path.is_file(): - continue - - src_dict[imp] = {"content": imp_path.read_text(encoding="utf8")} - - else: - for parent in imp_path.parents: - if parent.name == "site-packages": - src_id = f"{get_relative_path(imp_path, parent)}" - break - - elif parent.name == ".ape": - dm = self.local_project.dependencies - full_parent = dm.packages_cache.projects_folder - src_id = f"{get_relative_path(imp_path, full_parent)}" - break - - # Likely from a dependency. Exclude absolute prefixes so Vyper - # knows what to do. - if imp_path.is_file(): - src_dict[src_id] = { - "content": imp_path.read_text(encoding="utf8") - } - - else: - # NOTE: Pre vyper 0.4.0, interfaces CANNOT be in the source dict, - # but post 0.4.0, they MUST be. - src_dict = { - s: {"content": p.read_text(encoding="utf8")} - for s, p in { - p: pm.path / p for p in settings_set["outputSelection"] - }.items() - if p.parent != pm.path / "interfaces" - } - - input_json: dict = { - "language": "Vyper", - "settings": settings_set, - "sources": src_dict, - } - - if interfaces := import_remapping: - input_json["interfaces"] = interfaces - - # Output compiler details. - keys = ( - "\n\t".join( - sorted( - [ - clean_path(Path(x)) - for x in settings_set.get("outputSelection", {}).keys() - ] - ) - ) - or "No input." - ) - log_str = f"Compiling using Vyper compiler '{vyper_version}'.\nInput:\n\t{keys}" - logger.info(log_str) - - vyper_binary = compiler_data[vyper_version]["vyper_binary"] - comp_kwargs = {"vyper_version": vyper_version, "vyper_binary": vyper_binary} - - # `base_path` is required for pre-0.4 versions or else imports won't resolve. - if vyper_version < Version("0.4.0"): - comp_kwargs["base_path"] = pm.path - - try: - result = vvm_compile_standard(input_json, **comp_kwargs) - except VyperError as err: - raise VyperCompileError(err) from err - - for source_id, output_items in result["contracts"].items(): - content = { - i + 1: ln - for i, ln in enumerate( - (pm.path / source_id).read_text(encoding="utf8").splitlines() - ) - } - for name, output in output_items.items(): - # De-compress source map to get PC POS map. - ast = ASTNode.model_validate(result["sources"][source_id]["ast"]) - self.classify_ast(ast) - - # Track function offsets. - function_offsets = [] - for node in ast.children: - lineno = node.lineno - - # NOTE: Constructor is handled elsewhere. - if node.ast_type == "FunctionDef" and "__init__" not in content.get( - lineno, "" - ): - function_offsets.append((node.lineno, node.end_lineno)) - - evm = output["evm"] - bytecode = evm["deployedBytecode"] - opcodes = bytecode["opcodes"].split(" ") - - src_map_raw = bytecode["sourceMap"] - if isinstance(src_map_raw, str): - # <0.4 range. - compressed_src_map = SourceMap(root=src_map_raw) - else: - # >=0.4 range. - compressed_src_map = SourceMap( - root=src_map_raw["pc_pos_map_compressed"] - ) - - src_map = list(compressed_src_map.parse())[1:] - - pcmap = ( - _get_legacy_pcmap(ast, src_map, opcodes) - if vyper_version <= Version("0.3.7") - else _get_pcmap(bytecode) - ) - - # Find content-specified dev messages. - dev_messages = {} - for line_no, line in content.items(): - if match := re.search(DEV_MSG_PATTERN, line): - dev_messages[line_no] = match.group(1).strip() - - source_id_path = Path(source_id) - if source_id_path.is_absolute(): - final_source_id = f"{get_relative_path(Path(source_id), pm.path)}" - else: - final_source_id = source_id - - contract_type = ContractType.model_validate( - { - "ast": ast, - "contractName": name, - "sourceId": final_source_id, - "deploymentBytecode": {"bytecode": evm["bytecode"]["object"]}, - "runtimeBytecode": {"bytecode": bytecode["object"]}, - "abi": output["abi"], - "sourcemap": compressed_src_map, - "pcmap": pcmap, - "userdoc": output["userdoc"], - "devdoc": output["devdoc"], - "dev_messages": dev_messages, - } - ) - contract_types.append(contract_type) - contract_versions[name] = (vyper_version, settings_key) - yield contract_type - - # Output compiler data used. - compilers_used: dict[Version, dict[str, Compiler]] = {} - for ct in contract_types: - if not ct.name: - # Won't happen, but just for mypy. - continue - - ct_version, ct_settings_key = contract_versions[ct.name] - settings = all_settings[ct_version][ct_settings_key] - - if ct_version not in compilers_used: - compilers_used[ct_version] = {} - - if ct_settings_key in compilers_used[ct_version] and ct.name not in ( - compilers_used[ct_version][ct_settings_key].contractTypes or [] - ): - # Add contractType to already-tracked compiler. - compilers_used[ct_version][ct_settings_key].contractTypes = [ - *(compilers_used[ct_version][ct_settings_key].contractTypes or []), - ct.name, - ] - - elif ct_settings_key not in compilers_used[ct_version]: - # Add optimization-compiler for the first time. - compilers_used[ct_version][ct_settings_key] = Compiler( - name=self.name.lower(), - version=f"{ct_version}", - contractTypes=[ct.name], - settings=settings, - ) - - # Output compiler data to the cached project manifest. - compilers_ls = [ - compiler - for optimization_settings in compilers_used.values() - for compiler in optimization_settings.values() - ] - - # NOTE: This method handles merging contractTypes and filtered out - # no longer used Compilers. - pm.add_compiler_data(compilers_ls) - - def compile_code( - self, code: str, project: Optional[ProjectManager] = None, **kwargs - ) -> ContractType: - # NOTE: We are unable to use `vvm.compile_code()` because it does not - # appear to honor altered VVM install paths, thus always re-installs - # Vyper in our tests because of the monkeypatch. Also, their approach - # isn't really different than our approach implemented below. - pm = project or self.local_project - with pm.isolate_in_tempdir(): - name = kwargs.get("contractName", "code") - file = pm.path / f"{name}.vy" - file.write_text(code, encoding="utf8") - contract_type = next(self.compile((file,), project=pm), None) - if contract_type is None: - # Not sure when this would happen. - raise VyperCompileError("Failed to produce contract type.") - - return contract_type - - def _source_vyper_version(self, code: str) -> Version: - """Given source code, figure out which Vyper version to use""" - version_spec = get_version_pragma_spec(code) - - def first_full_release(versions: Iterable[Version]) -> Optional[Version]: - for vers in versions: - if not vers.is_devrelease and not vers.is_postrelease and not vers.is_prerelease: - return vers - - return None - - if version_spec is None: - if version := first_full_release(self.installed_versions + self.available_versions): - return version - - raise VyperInstallError("No available version.") - - return next(version_spec.filter(self.available_versions)) - - def _flatten_source( - self, - path: Path, - project: Optional[ProjectManager] = None, - include_pragma: bool = True, - sources_handled: Optional[set[Path]] = None, - warn_flattening_modules: bool = True, - ) -> str: - pm = project or self.local_project - handled = sources_handled or set() - handled.add(path) - # Get the non stdlib import paths for our contracts - imports = list( - filter( - lambda x: not x.startswith("vyper/"), - [y for x in self.get_imports((path,), project=pm).values() for y in x], - ) - ) - - dependencies: dict[str, PackageManifest] = {} - dependency_projects = self.get_dependencies(project=pm) - for key, dependency_project in dependency_projects.items(): - package = key.split("=")[0] - base = dependency_project.path if hasattr(dependency_project, "path") else package - manifest = dependency_project.manifest - if manifest.sources is None: - continue - - for source_id in manifest.sources.keys(): - import_match = f"{base}/{source_id}" - dependencies[import_match] = manifest - - interfaces_source = "" - og_source = (pm.path / path).read_text(encoding="utf8") - - # Get info about imports and source meta - aliases = extract_import_aliases(og_source) - pragma, source_without_meta = extract_meta(og_source) - version_specifier = get_version_pragma_spec(pragma) if pragma else None - stdlib_imports, _, source_without_imports = extract_imports(source_without_meta) - flattened_modules = "" - modules_prefixes: set[str] = set() - - for import_path in sorted(imports): - import_file = None - for base in (pm.path, pm.interfaces_folder): - for opt in {import_path, import_path.replace(f"interfaces{os.path.sep}", "")}: - try_import_file = base / opt - if try_import_file.is_file(): - import_file = try_import_file - break - - if import_file is None: - import_file = pm.path / import_path - - # Vyper imported interface names come from their file names - file_name = import_file.stem - # If we have a known alias, ("import X as Y"), use the alias as interface name - iface_name = aliases[file_name] if file_name in aliases else file_name - - def _match_source(imp_path: str) -> Optional[PackageManifest]: - for source_path in dependencies.keys(): - if source_path.endswith(imp_path): - return dependencies[source_path] - - return None - - if matched_source := _match_source(import_path): - if not matched_source.contract_types: - continue - - abis = [ - el - for k in matched_source.contract_types.keys() - for el in matched_source.contract_types[k].abi - ] - interfaces_source += generate_interface(abis, iface_name) - continue - - # Generate an ABI from the source code - elif import_file.is_file(): - if ( - version_specifier - and version_specifier.contains("0.4.0") - and import_file.suffix != ".vyi" - ): - if warn_flattening_modules: - logger.warning( - "Flattening modules DOES NOT yield the same bytecode! " - "This is **NOT** valid for contract-verification." - ) - warn_flattening_modules = False - - modules_prefixes.add(import_file.stem) - if import_file in handled: - # We have already included this source somewhere. - continue - - # Is a module or an interface imported from a module. - # Copy in the source code directly. - flattened_module = self._flatten_source( - import_file, - include_pragma=False, - sources_handled=handled, - warn_flattening_modules=warn_flattening_modules, - ) - flattened_modules = f"{flattened_modules}\n\n{flattened_module}" - - else: - # Vyper <0.4 interface from folder other than interfaces/ - # such as a .vyi file in the contracts folder. - abis = source_to_abi(import_file.read_text(encoding="utf8")) - interfaces_source += generate_interface(abis, iface_name) - - def no_nones(it: Iterable[Optional[str]]) -> Iterable[str]: - # Type guard like generator to remove Nones and make mypy happy - for el in it: - if el is not None: - yield el - - pragma_to_include = pragma if include_pragma else "" - - # Join all the OG and generated parts back together - flattened_source = "\n\n".join( - no_nones( - ( - pragma_to_include, - stdlib_imports, - interfaces_source, - flattened_modules, - source_without_imports, - ) - ) - ) - - # Clear module-usage prefixes. - for prefix in modules_prefixes: - # Replace usage lines like 'zero_four_module.moduleMethod()' - # with 'self.moduleMethod()'. - flattened_source = flattened_source.replace(f"{prefix}.", "self.") - - # Remove module-level doc-strings, as it causes compilation issues - # when used in root contracts. - lines_no_doc: list[str] = [] - in_str_comment = False - for line in flattened_source.splitlines(): - line_stripped = line.rstrip() - if not in_str_comment and line_stripped.startswith('"""'): - if line_stripped == '"""' or not line_stripped.endswith('"""'): - in_str_comment = True - continue - - elif in_str_comment: - if line_stripped.endswith('"""'): - in_str_comment = False - - continue - - lines_no_doc.append(line) - - flattened_source = "\n".join(lines_no_doc) - - # TODO: Replace this nonsense with a real code formatter - def format_source(source: str) -> str: - while "\n\n\n\n" in source: - source = source.replace("\n\n\n\n", "\n\n\n") - return source - - return format_source(flattened_source) - - def flatten_contract( - self, - path: Path, - project: Optional[ProjectManager] = None, - **kwargs, - ) -> Content: - """ - Returns the flattened contract suitable for compilation or verification as a single file - """ - pm = project or self.local_project - src = self._flatten_source(path, project=pm) - return Content({i: ln for i, ln in enumerate(src.splitlines())}) - - def get_version_map( - self, - contract_filepaths: Iterable[Path], - project: Optional[ProjectManager] = None, - ) -> dict[Version, set[Path]]: - pm = project or self.local_project - import_map = self.get_imports(contract_filepaths, project=pm) - return self._get_version_map_from_import_map(contract_filepaths, import_map, project=pm) - - def _get_version_map_from_import_map( - self, - contract_filepaths: Iterable[Path], - import_map: dict[str, list[str]], - project: Optional[ProjectManager] = None, - config: Optional[PluginConfig] = None, - ): - pm = project or self.local_project - self.compiler_settings = {**self.compiler_settings} - config = config or self.get_config(pm) - version_map: dict[Version, set[Path]] = {} - source_path_by_version_spec: dict[SpecifierSet, set[Path]] = {} - source_paths_without_pragma = set() - - # Sort contract_filepaths to promote consistent, reproduce-able behavior - for path in sorted(contract_filepaths): - src_id = f"{get_relative_path(path.absolute(), pm.path)}" - imports = [pm.path / imp for imp in import_map.get(src_id, [])] - - if config_spec := config.version: - _safe_append(source_path_by_version_spec, config_spec, {path, *imports}) - elif pragma := get_version_pragma_spec(path): - _safe_append(source_path_by_version_spec, pragma, {path, *imports}) - else: - source_paths_without_pragma.add(path) - - # Install all requires versions *before* building map - for pragma_spec, path_set in source_path_by_version_spec.items(): - if list(pragma_spec.filter(self.installed_versions)): - # Already met. - continue - - versions_can_install = sorted( - list(pragma_spec.filter(self.available_versions)), reverse=True - ) - if versions_can_install: - did_install = False - for version in versions_can_install: - if version == self.package_version: - break - else: - _install_vyper(version) - did_install = True - break - - if not did_install: - versions_str = ", ".join([f"{v}" for v in versions_can_install]) - raise VyperInstallError(f"Unable to install vyper version(s) '{versions_str}'.") - else: - raise VyperInstallError("No available version to install.") - - # By this point, all the of necessary versions will be installed. - # Thus, we will select only the best versions to use per source set. - for pragma_spec, path_set in source_path_by_version_spec.items(): - versions = sorted(list(pragma_spec.filter(self.installed_versions)), reverse=True) - if versions: - _safe_append( - version_map, versions[0], {p for p in path_set if p in contract_filepaths} - ) - - if not self.installed_versions: - # If we have no installed versions by this point, we need to install one. - # This happens when there are no pragmas in any sources and no vyper installations. - _install_vyper(max(self.available_versions)) - - # Handle no-pragma sources - if source_paths_without_pragma: - versions_given = [x for x in version_map.keys()] - max_installed_vyper_version = None - if versions_given: - version_given_non_pre = [x for x in versions_given if not x.pre] - if version_given_non_pre: - max_installed_vyper_version = max(version_given_non_pre) - - if max_installed_vyper_version is None: - max_installed_vyper_version = max(v for v in self.installed_versions if not v.pre) - - _safe_append( - version_map, - max_installed_vyper_version, - {p for p in source_paths_without_pragma if p in contract_filepaths}, - ) - - return version_map - - def get_compiler_settings( - self, - contract_filepaths: Iterable[Path], - project: Optional[ProjectManager] = None, - **kwargs, - ) -> dict[Version, dict]: - pm = project or self.local_project - # NOTE: Interfaces cannot be in the outputSelection - # (but are required in `sources` for the 0.4.0 range). - valid_paths = [ - p - for p in contract_filepaths - if get_full_extension(p) == FileType.SOURCE - and not str(p).startswith(str(pm.path / "interfaces")) - ] - version_map = self.get_version_map(valid_paths, project=pm) - return self._get_compiler_settings_from_version_map(version_map, project=pm) - - def _get_compiler_settings_from_version_map( - self, - version_map: dict[Version, set[Path]], - project: Optional[ProjectManager] = None, - ): - pm = project or self.local_project - - # When compiling projects outside the cwd, use absolute paths for ease. - # Also, struggled to get it work any other way. - use_absolute_path = pm.path != Path.cwd() - - compiler_data = self._get_compiler_arguments(version_map, project=pm) - settings = {} - for version, data in compiler_data.items(): - source_paths = list(version_map.get(version, [])) - if not source_paths: - continue - - default_optimization: Optimization = True if version < Version("0.3.10") else "gas" - output_selection: dict[str, set[str]] = {} - optimizations_map = get_optimization_pragma_map( - source_paths, pm.path, default_optimization - ) - evm_version_map = get_evm_version_pragma_map(source_paths, pm.path) - default_evm_version = data.get( - "evm_version", data.get("evmVersion") - ) or EVM_VERSION_DEFAULT.get(version.base_version) - for source_path in source_paths: - source_id = str(get_relative_path(source_path.absolute(), pm.path)) - - if not (optimization := optimizations_map.get(source_id)): - optimization = True if version < Version("0.3.10") else "gas" - - evm_version = evm_version_map.get(source_id, default_evm_version) - settings_key = f"{optimization}%{evm_version}".lower() - if settings_key not in output_selection: - output_selection[settings_key] = {source_id} - else: - output_selection[settings_key].add(source_id) - - version_settings: dict[str, dict] = {} - for settings_key, selection in output_selection.items(): - optimization, evm_version = settings_key.split("%") - if optimization == "true": - optimization = True - elif optimization == "false": - optimization = False - - if version >= Version("0.4.0"): - - def _to_src_id(s): - return str(pm.path / s) if use_absolute_path else s - - selection_dict = { - _to_src_id(s): ["*"] - for s in selection - if ((pm.path / s).is_file() if use_absolute_path else Path(s).is_file()) - and f"interfaces{os.path.sep}" not in s - and get_full_extension(pm.path / s) != FileType.INTERFACE - } - else: - selection_dict = { - s: ["*"] - for s in selection - if (pm.path / s).is_file() - if "interfaces" not in s - } - - search_paths = [*getsitepackages()] - if pm.path == Path.cwd(): - search_paths.append(".") - else: - search_paths.append(str(pm.path)) - # else: only seem to get absolute paths to work (for compiling deps alone). - - version_settings[settings_key] = { - "optimize": optimization, - "outputSelection": selection_dict, - "search_paths": search_paths, - } - if evm_version and evm_version not in ("none", "null"): - version_settings[settings_key]["evmVersion"] = f"{evm_version}" - - settings[version] = version_settings - - return settings - - def init_coverage_profile( - self, source_coverage: ContractSourceCoverage, contract_source: ContractSource - ): - exclusions = self.config_manager.get_config("test").coverage.exclude - contract_name = contract_source.contract_type.name or "__UnknownContract__" - - # Check if excluding this contract. - for exclusion in exclusions: - if fnmatch(contract_name, exclusion.contract_name) and ( - not exclusion.method_name or exclusion.method_name == "*" - ): - # Skip this whole source. - return - - contract_coverage = source_coverage.include(contract_name) - - def _exclude_fn(_name: str) -> bool: - for _exclusion in exclusions: - if fnmatch(contract_coverage.name, _exclusion.contract_name) and fnmatch( - _name, _exclusion.method_name - ): - # This function should be skipped. - return True - - return False - - def _profile(_name: str, _full_name: str): - # Ensure function isn't excluded. - if _exclude_fn(_name): - return - - _function_coverage = contract_coverage.include(_name, _full_name) - - # Only put the builtin-tags we expect users to be able to cover. - tag = ( - str(item["dev"]) - if item.get("dev") - and isinstance(item["dev"], str) - and item["dev"].startswith("dev: ") - and RuntimeErrorType.USER_ASSERT.value not in item["dev"] - else None - ) - _function_coverage.profile_statement(pc_int, location=location, tag=tag) - - # Some statements are too difficult to know right away where they belong, - # such as statement related to kwarg-default auto-generated implicit lookups. - # function_name -> (pc, location) - pending_statements: dict[str, list[tuple[int, SourceLocation]]] = {} - - for pc, item in contract_source.pcmap.root.items(): - pc_int = int(pc) - if pc_int < 0: - continue - - location: Optional[SourceLocation] - if item.get("location"): - location_list = item["location"] - if not isinstance(location_list, (list, tuple)): - raise TypeError(f"Unexpected location type '{type(location_list)}'.") - - # NOTE: Only doing 0 because mypy for some reason thinks it is optional. - location = ( - location_list[0] or 0, - location_list[1] or 0, - location_list[2] or 0, - location_list[3] or 0, - ) - else: - location = None - - if location is not None and not isinstance(location, tuple): - # Only really for mypy. - raise TypeError(f"Received unexpected type for location '{location}'.") - - if not location and not item.get("dev"): - # Not a statement we can measure. - continue - - if location: - function = contract_source.lookup_function(location) - if not function: - # Not sure if this happens. - continue - - matching_abis = [ - a for a in contract_source.contract_type.methods if a.name == function.name - ] - if len(matching_abis) > 1: - # In Vyper, if there are multiple method ABIs with the same name, - # that is evidence of the default key-word argument generated methods. - - is_part_of_signature = location[0] < function.offset - if is_part_of_signature and location[0] != location[2]: - # This likely is not a real statement, but not really sure what this is. - continue - - # In Vyper, the ABI with the most inputs should be the one without extra steps. - longest_abi = max(matching_abis, key=lambda x: len(x.inputs)) - if is_part_of_signature and longest_abi.name in pending_statements: - pending_statements[longest_abi.name].append((pc_int, location)) - elif is_part_of_signature: - pending_statements[longest_abi.name] = [(pc_int, location)] - else: - # Put actual source statements under the ABI with all parameters as inputs. - _profile(longest_abi.name, longest_abi.selector) - - elif len(matching_abis) == 1: - _profile(function.name, matching_abis[0].selector) - - elif len(matching_abis) == 0: - # Is likely an internal method. - _profile(function.name, function.full_name or function.name) - - else: - _profile("__builtin__", "__builtin__") - - if pending_statements: - # Handle auto-generated kwarg-default statements here. - # Sort each statement into buckets mapping to the method it belongs in. - for fn_name, pending_ls in pending_statements.items(): - matching_abis = [ - m for m in contract_source.contract_type.methods if m.name == fn_name - ] - longest_abi = max(matching_abis, key=lambda x: len(x.inputs)) - autogenerated_abis = [ - abi for abi in matching_abis if abi.selector != longest_abi.selector - ] - # Sort the autogenerated ABIs so we can loop through them in the correct order. - autogenerated_abis.sort(key=lambda a: len(a.inputs)) - buckets: dict[str, list[tuple[int, SourceLocation]]] = { - a.selector: [] for a in autogenerated_abis - } - selector_index = 0 - selector = autogenerated_abis[0].selector - # Must loop through PCs from smallest to greatest for this to work. - pending_ls.sort() - jump_threshold = 10 - for _pc, loc in pending_ls: - if selector_index < len(autogenerated_abis): - selector = autogenerated_abis[selector_index].selector - - if not buckets[selector]: - # No need for bounds checking when the bucket is empty. - buckets[selector].append((_pc, loc)) - continue - - last_pc = buckets[selector][-1][0] - - # Check if jumped. - distance = _pc - last_pc - if distance > jump_threshold: - selector_index += 1 - if selector_index >= len(autogenerated_abis): - break - - selector = autogenerated_abis[selector_index].selector - buckets[selector].append((_pc, loc)) - else: - buckets[selector].append((_pc, loc)) - - for full_name, statements in buckets.items(): - for _pc, location in statements: - if _exclude_fn(fn_name): - continue - - function_coverage = contract_coverage.include(fn_name, full_name) - function_coverage.profile_statement(_pc, location=location) - - # After handling all methods with locations, let's also add the auto-getters, - # which are not present in the source map. - for method in contract_source.contract_type.view_methods: - if method.selector not in [fn.full_name for fn in contract_coverage.functions]: - if _exclude_fn(method.name): - return - - # Auto-getter found. Profile function without statements. - contract_coverage.include(method.name, method.selector) - - def _get_compiler_arguments( - self, - version_map: dict, - project: Optional[ProjectManager] = None, - config: Optional[PluginConfig] = None, - ) -> dict[Version, dict]: - pm = project or self.local_project - config = config or self.get_config(pm) - evm_version = config.evm_version - arguments_map = {} - for vyper_version, source_paths in version_map.items(): - bin_arg = self._get_vyper_bin(vyper_version) - arguments_map[vyper_version] = { - "base_path": f"{pm.path}", - "evm_version": evm_version, - "vyper_version": str(vyper_version), - "vyper_binary": bin_arg, - } - - return arguments_map - - def _get_vyper_bin(self, vyper_version: Version): - return shutil.which("vyper") if vyper_version is self.package_version else None - - def enrich_error(self, err: ContractLogicError) -> ContractLogicError: - try: - dev_message = err.dev_message - except ValueError: - # Not available. - return err - - if not dev_message: - return err - - err_str = dev_message.replace("dev: ", "") - error_type = None - if err_str in [m.value for m in RuntimeErrorType]: - # Is a builtin compiler error. - error_type = RuntimeErrorType(err_str) - - elif "bounds check" in err_str: - error_type = RuntimeErrorType.INTEGER_BOUNDS_CHECK - - else: - # Check names - for name, _type in [(m.name, m) for m in RuntimeErrorType]: - if err_str == name: - error_type = _type - break - - if not error_type: - # Not a builtin compiler error; cannot enrich. - return err - - runtime_error_cls = RUNTIME_ERROR_MAP[error_type] - tx_kwargs: dict = { - "contract_address": err.contract_address, - "source_traceback": err.source_traceback, - "trace": err.trace, - "txn": err.txn, - } - return ( - runtime_error_cls(err_str.split(" ")[0], **tx_kwargs) - if runtime_error_cls == IntegerBoundsCheck - else runtime_error_cls(**tx_kwargs) - ) - - def trace_source( - self, contract_source: ContractSource, trace: TraceAPI, calldata: HexBytes - ) -> SourceTraceback: - frames = trace.get_raw_frames() - return self._get_traceback(contract_source, frames, calldata) - - def _get_traceback( - self, - contract_src: ContractSource, - frames: Iterator[dict], - calldata: HexBytes, - previous_depth: Optional[int] = None, - ) -> SourceTraceback: - traceback = SourceTraceback.model_validate([]) - method_id = HexBytes(calldata[:4]) - completed = False - pcmap = PCMap.model_validate({}) - - for frame in frames: - if frame["op"] in [c.value for c in CALL_OPCODES]: - start_depth = frame["depth"] - called_contract, sub_calldata = self._create_contract_from_call(frame) - if called_contract: - ext = get_full_extension(Path(called_contract.source_id)) - if ext in [x for x in FileType]: - # Called another Vyper contract. - sub_trace = self._get_traceback( - called_contract, frames, sub_calldata, previous_depth=frame["depth"] - ) - traceback.extend(sub_trace) - - else: - # Not a Vyper contract! - compiler = self.compiler_manager.registered_compilers[ext] - try: - sub_trace = compiler.trace_source( - called_contract.contract_type, frames, sub_calldata - ) - traceback.extend(sub_trace) - except NotImplementedError: - # Compiler not supported. Fast forward out of this call. - for fr in frames: - if fr["depth"] <= start_depth: - break - - continue - - else: - # Contract not found. Fast forward out of this call. - for fr in frames: - if fr["depth"] <= start_depth: - break - - continue - - elif frame["op"] in _RETURN_OPCODES: - # For the base CALL, don't mark as completed until trace is gone. - # This helps in cases where we failed to detect a subcall properly. - completed = previous_depth is not None - - pcs_to_try_adding = set() - if "PUSH" in frame["op"] and frame["pc"] in contract_src.pcmap: - # Check if next op is SSTORE to properly use AST from push op. - next_frame: Optional[dict] = frame - loc = contract_src.pcmap[frame["pc"]] - pcs_to_try_adding.add(frame["pc"]) - - while next_frame and "PUSH" in next_frame["op"]: - next_frame = next(frames, None) - if next_frame and "PUSH" in next_frame["op"]: - pcs_to_try_adding.add(next_frame["pc"]) - - is_non_payable_hit = False - if next_frame and next_frame["op"] == "SSTORE": - push_location = tuple(loc["location"]) # type: ignore - pcmap = PCMap.model_validate({next_frame["pc"]: {"location": push_location}}) - - elif next_frame and next_frame["op"] in _RETURN_OPCODES: - completed = True - - else: - pcmap = contract_src.pcmap - dev_val = str((loc.get("dev") or "")).replace("dev: ", "") - is_non_payable_hit = dev_val == RuntimeErrorType.NONPAYABLE_CHECK.value - - if not is_non_payable_hit and next_frame: - frame = next_frame - - else: - pcmap = contract_src.pcmap - - pcs_to_try_adding.add(frame["pc"]) - pcs_to_try_adding = {pc for pc in pcs_to_try_adding if pc in pcmap} - if not pcs_to_try_adding: - if ( - frame["op"] == "REVERT" - and frame["pc"] + 1 in pcmap - and RuntimeErrorType.USER_ASSERT.value - in str(pcmap[frame["pc"] + 1].get("dev", "")) - ): - # Not sure why this happens. Maybe an off-by-1 bug in Vyper. - pcs_to_try_adding.add(frame["pc"] + 1) - - pc_groups: list[list] = [] - for pc in pcs_to_try_adding: - location = ( - cast(tuple[int, int, int, int], tuple(pcmap[pc].get("location") or [])) or None - ) - dev_item = pcmap[pc].get("dev", "") - dev = str(dev_item).replace("dev: ", "") - - done = False - for group in pc_groups: - if group[0] != location: - continue - - group[1].add(pc) - dev = group[2] = dev or group[2] - done = True - break - - if not done: - # New group. - pc_groups.append([location, {pc}, dev]) - - dev_messages = contract_src.contract_type.dev_messages or {} - for location, pcs, dev in pc_groups: - if dev in [m.value for m in RuntimeErrorType if m != RuntimeErrorType.USER_ASSERT]: - error_type = RuntimeErrorType(dev) - if ( - error_type != RuntimeErrorType.NONPAYABLE_CHECK - and traceback.last is not None - ): - # If the error type is not the non-payable check, - # it happened in the last method. - name = traceback.last.closure.name - full_name = traceback.last.closure.full_name - - elif method_id in contract_src.contract_type.methods: - # For non-payable checks, they should hit here. - method_checked = contract_src.contract_type.methods[method_id] - name = method_checked.name - full_name = method_checked.selector - - else: - # Not sure if possible to get here. - name = error_type.name.lower() - full_name = name - - if ( - dev == RuntimeErrorType.INVALID_CALLDATA_OR_VALUE.value - and len(traceback.source_statements) > 0 - ): - # NOTE: Skip adding invalid calldata / value checks when - # we have already hit source statements. The reason for this - # is because of misleading Vyper optimizations sharing revert PCs. - continue - - # Empty source (is builtin) - traceback.add_builtin_jump( - name, - f"dev: {dev}", - full_name=full_name, - pcs=pcs, - source_path=contract_src.source_path, - ) - continue - - elif not location: - # Unknown. - continue - - if not (function := contract_src.lookup_function(location, method_id=method_id)): - continue - - if ( - not traceback.last - or traceback.last.closure.full_name != function.full_name - or not isinstance(traceback.last.closure, Function) - ): - depth = ( - frame["depth"] + 1 - if traceback.last and traceback.last.depth == frame["depth"] - else frame["depth"] - ) - - traceback.add_jump( - location, - function, - depth, - pcs=pcs, - source_path=contract_src.source_path, - ) - else: - traceback.extend_last(location, pcs=pcs) - - if len(traceback.source_statements) > 0: - last_statement = traceback.source_statements[-1] - if dev.endswith(RuntimeErrorType.USER_ASSERT.value) or any( - DEV_MSG_PATTERN.match(str(s)) for s in str(last_statement).splitlines() - ): - # Add dev message to user assert - for lineno in range( - last_statement.end_lineno, last_statement.begin_lineno - 1, -1 - ): - if lineno in dev_messages: - last_statement.type = dev_messages[lineno] - - if completed: - break - - return traceback - - def _create_contract_from_call(self, frame: dict) -> tuple[Optional[ContractSource], HexBytes]: - evm_frame = TraceFrame(**frame) - data = create_call_node_data(evm_frame) - calldata = data.get("calldata", HexBytes("")) - if not (address := (data.get("address", evm_frame.contract_address) or None)): - return None, calldata - - try: - address = self.provider.network.ecosystem.decode_address(address) - except Exception: - return None, calldata - - if address not in self.chain_manager.contracts: - return None, calldata - - called_contract = self.chain_manager.contracts[address] - return self.local_project._create_contract_source(called_contract), calldata - - -def _safe_append(data: dict, version: Union[Version, SpecifierSet], paths: Union[Path, set]): - if isinstance(paths, Path): - paths = {paths} - if version in data: - data[version] = data[version].union(paths) - else: - data[version] = paths - - -def _is_revert_jump(op: str, value: Optional[int], revert_pc: int) -> bool: - return op == "JUMPI" and value is not None and value == revert_pc - - -def _has_empty_revert(opcodes: list[str]) -> bool: - return (len(opcodes) > 12 and opcodes[-13] == "JUMPDEST" and opcodes[-9] == "REVERT") or ( - len(opcodes) > 4 and opcodes[-5] == "JUMPDEST" and opcodes[-1] == "REVERT" - ) - - -def _get_pcmap(bytecode: dict) -> PCMap: - # Find the non payable value check. - src_info = bytecode["sourceMapFull"] if "sourceMapFull" in bytecode else bytecode["sourceMap"] - pc_data = {pc: {"location": ln} for pc, ln in src_info["pc_pos_map"].items()} - if not pc_data: - return PCMap.model_validate({}) - - # Apply other errors. - errors = src_info["error_map"] - for err_pc, error_type in errors.items(): - use_loc = True - if "safemul" in error_type or "safeadd" in error_type or "bounds check" in error_type: - # NOTE: Bound check may also occur for underflow. - error_str = RuntimeErrorType.INTEGER_OVERFLOW.value - elif "safesub" in error_type or "clamp" in error_type: - error_str = RuntimeErrorType.INTEGER_UNDERFLOW.value - elif "safediv" in error_type or "clamp gt 0" in error_type: - error_str = RuntimeErrorType.DIVISION_BY_ZERO.value - elif "safemod" in error_type: - error_str = RuntimeErrorType.MODULO_BY_ZERO.value - elif "bounds check" in error_type: - error_str = RuntimeErrorType.INDEX_OUT_OF_RANGE.value - elif "user assert" in error_type.lower() or "user revert" in error_type.lower(): - # Mark user-asserts so the Ape can correctly find dev messages. - error_str = RuntimeErrorType.USER_ASSERT.value - elif "fallback function" in error_type: - error_str = RuntimeErrorType.FALLBACK_NOT_DEFINED.value - use_loc = False - elif "bad calldatasize or callvalue" in error_type: - # Only on >=0.3.10. - # NOTE: We are no longer able to get Nonpayable checks errors since they - # are now combined. - error_str = RuntimeErrorType.INVALID_CALLDATA_OR_VALUE.value - elif "nonpayable check" in error_type: - error_str = RuntimeErrorType.NONPAYABLE_CHECK.value - else: - error_str = "" - error_type_name = error_type.upper().replace(" ", "_") - for _type in RuntimeErrorType: - if _type.name == error_type_name: - error_str = _type.value - break - - error_str = error_str or error_type_name - use_loc = False - - location = None - if use_loc: - # Add surrounding locations - for pc in range(int(err_pc), -1, -1): - if ( - (data := pc_data.get(f"{pc}")) - and "dev" not in data - and (location := data.get("location")) - ): - break - - if err_pc in pc_data: - pc_data[err_pc]["dev"] = f"dev: {error_str}" - else: - pc_data[err_pc] = {"dev": f"dev: {error_str}", "location": location} - - return PCMap.model_validate(pc_data) - - -def _get_legacy_pcmap(ast: ASTNode, src_map: list[SourceMapItem], opcodes: list[str]): - """ - For Vyper versions <= 0.3.7, allows us to still get a PCMap. - """ - - pc = 0 - pc_map_list: list[tuple[int, dict[str, Optional[Any]]]] = [] - last_value = None - revert_pc = -1 - if _has_empty_revert(opcodes): - revert_pc = _get_revert_pc(opcodes) - - processed_opcodes = [] - - # There is only 1 non-payable check and it happens early in the bytecode. - non_payable_check_found = False - - # There is at most 1 fallback error PC - fallback_found = False - - while src_map and opcodes: - src = src_map.pop(0) - op = opcodes.pop(0) - processed_opcodes.append(op) - pc += 1 - - # If immutable member load, ignore increasing pc by push size. - if _is_immutable_member_load(opcodes): - last_value = int(opcodes.pop(0), 16) - # Add the push number, e.g. PUSH1 adds `1`. - num_pushed = int(op[4:]) - pc += num_pushed - - # Add content PC item. - # Also check for compiler runtime error handling. - # Runtime error locations are marked in the PCMap for further analysis. - if src.start is not None and src.length is not None: - stmt = ast.get_node(src) - if stmt: - # Add located item. - line_nos = list(stmt.line_numbers) - item: dict = {"location": line_nos} - is_revert_jump = _is_revert_jump(op, last_value, revert_pc) - if op == "REVERT" or is_revert_jump: - dev = None - if stmt.ast_type in ("AugAssign", "BinOp"): - # SafeMath - for node in stmt.children: - dev = RuntimeErrorType.from_operator(node.ast_type) - if dev: - break - - elif stmt.ast_type == "Subscript": - dev = RuntimeErrorType.INDEX_OUT_OF_RANGE - - else: - # This is needed for finding the corresponding dev message. - dev = RuntimeErrorType.USER_ASSERT - - if dev: - val = f"dev: {dev.value}" - if is_revert_jump and len(pc_map_list) >= 1: - pc_map_list[-1][1]["dev"] = val - else: - item["dev"] = val - - pc_map_list.append((pc, item)) - - elif not fallback_found and _is_fallback_check(opcodes, op): - # You can tell this is the Fallback jump because it is checking for the method ID. - item = {"dev": f"dev: {RuntimeErrorType.FALLBACK_NOT_DEFINED.value}", "location": None} - # PC is actually the one before but it easier to detect here. - pc_map_list.append((pc - 1, item)) - fallback_found = True - - elif not non_payable_check_found and _is_non_payable_check(opcodes, op, revert_pc): - item = {"dev": _NON_PAYABLE_STR, "location": None} - pc_map_list.append((pc, item)) - non_payable_check_found = True - - elif op == "REVERT": - # Source-less revert found, use latest item with a source. - for item in [x[1] for x in pc_map_list[::-1] if x[1]["location"]]: - if not item.get("dev"): - item["dev"] = f"dev: {RuntimeErrorType.USER_ASSERT.value}" - break - - pcmap_data = dict(pc_map_list) - return PCMap.model_validate(pcmap_data) - - -def _find_non_payable_check(src_map: list[SourceMapItem], opcodes: list[str]) -> Optional[int]: - pc = 0 - revert_pc = -1 - if _has_empty_revert(opcodes): - revert_pc = _get_revert_pc(opcodes) - - while src_map and opcodes: - op = opcodes.pop(0) - pc += 1 - - # If immutable member load, ignore increasing pc by push size. - if _is_immutable_member_load(opcodes): - # Add the push number, e.g. PUSH1 adds `1`. - pc += int(op[4:]) - - if _is_non_payable_check(opcodes, op, revert_pc): - return pc - - return None - - -def _is_non_payable_check(opcodes: list[str], op: str, revert_pc: int) -> bool: - return ( - len(opcodes) >= 3 - and op == "CALLVALUE" - and "PUSH" in opcodes[0] - and is_0x_prefixed(opcodes[1]) - and _is_revert_jump(opcodes[2], int(opcodes[1], 16), revert_pc) - ) - - -def _get_revert_pc(opcodes: list[str]) -> int: - """ - Starting in vyper 0.2.14, reverts without a reason string are optimized - with a jump to the "end" of the bytecode. - """ - return ( - len(opcodes) - + sum(int(i[4:]) - 1 for i in opcodes if i.startswith("PUSH")) - - _EMPTY_REVERT_OFFSET - ) - - -def _is_immutable_member_load(opcodes: list[str]): - is_code_copy = len(opcodes) > 5 and opcodes[5] == "CODECOPY" - return not is_code_copy and opcodes and is_0x_prefixed(opcodes[0]) - - -def _extend_return(function: Function, traceback: SourceTraceback, last_pc: int, source_path: Path): - return_ast_result = [x for x in function.ast.children if x.ast_type == "Return"] - if not return_ast_result: - return - - # Ensure return statement added. - # Sometimes it is missing from the PCMap otherwise. - return_ast = return_ast_result[-1] - location = return_ast.line_numbers - - last_lineno = max(0, location[2] - 1) - for frameset in traceback.root[::-1]: - if frameset.end_lineno is not None: - last_lineno = frameset.end_lineno - break - - start = last_lineno + 1 - last_pcs = {last_pc + 1} if last_pc else set() - if traceback.last: - traceback.last.extend(location, pcs=last_pcs, ws_start=start) - else: - # Not sure if it ever gets here, but type-checks say it could. - traceback.add_jump(location, function, 1, last_pcs, source_path=source_path) - - -def _is_fallback_check(opcodes: list[str], op: str) -> bool: - return ( - "JUMP" in op - and len(opcodes) >= 7 - and opcodes[0] == "JUMPDEST" - and opcodes[6] == "SHR" - and opcodes[5] == "0xE0" - ) diff --git a/ape_vyper/exceptions.py b/ape_vyper/exceptions.py deleted file mode 100644 index b45fc9d7..00000000 --- a/ape_vyper/exceptions.py +++ /dev/null @@ -1,177 +0,0 @@ -from enum import Enum -from typing import Optional, Union - -from ape.exceptions import CompilerError, ContractLogicError -from ape.utils import USER_ASSERT_TAG -from vvm.exceptions import VyperError # type: ignore - - -class VyperCompilerPluginError(CompilerError): - """ - An error raised in the Vyper compiler. - """ - - -class VyperInstallError(VyperCompilerPluginError): - """ - An error raised failing to install Vyper. - """ - - -class VyperCompileError(VyperCompilerPluginError): - """ - A compiler-specific error in Vyper. - """ - - def __init__(self, err: Union[VyperError, str]): - if isinstance(err, VyperError): - self.base_err = err - message = "\n\n".join( - f"{e['sourceLocation']['file']}\n{e['type']}:" - f"{e.get('formattedMessage', e['message'])}" - for e in (err.error_dict or {}) - ) - # Try to find any indication of error. - message = message or getattr(err, "message", "") - - # If is only the default, check stderr. - if message == "An error occurred during execution" and getattr(err, "stderr_data", ""): - message = err.stderr_data - - else: - self.base_err = None - message = str(err) - - super().__init__(message) - - -class RuntimeErrorType(Enum): - NONPAYABLE_CHECK = "Cannot send ether to non-payable function" - INVALID_CALLDATA_OR_VALUE = "Invalid calldata or value" - INDEX_OUT_OF_RANGE = "Index out of range" - INTEGER_OVERFLOW = "Integer overflow" - INTEGER_UNDERFLOW = "Integer underflow" - INTEGER_BOUNDS_CHECK = "Integer bounds check" - DIVISION_BY_ZERO = "Division by zero" - MODULO_BY_ZERO = "Modulo by zero" - FALLBACK_NOT_DEFINED = "Fallback not defined" - USER_ASSERT = USER_ASSERT_TAG - - @classmethod - def from_operator(cls, operator: str) -> Optional["RuntimeErrorType"]: - if operator == "Add": - return cls.INTEGER_OVERFLOW - elif operator == "Sub": - return cls.INTEGER_UNDERFLOW - elif operator == "Div": - return cls.DIVISION_BY_ZERO - elif operator == "Mod": - return cls.MODULO_BY_ZERO - - return None - - -class VyperRuntimeError(ContractLogicError): - """ - An error raised when running EVM code, such as a index or math error. - It is a type of ``ContractLogicError`` where the code came from the - compiler and not directly from the source. - """ - - def __init__(self, error_type: Union[RuntimeErrorType, str], **kwargs): - super().__init__(error_type if isinstance(error_type, str) else error_type.value, **kwargs) - - -class NonPayableError(VyperRuntimeError): - """ - Raised when sending ether to a non-payable function. - """ - - def __init__(self, **kwargs): - super().__init__(RuntimeErrorType.NONPAYABLE_CHECK, **kwargs) - - -class InvalidCalldataOrValueError(VyperRuntimeError): - """ - Raises on Vyper versions >= 0.3.10 in place of NonPayableError. - """ - - def __init__(self, **kwargs): - super().__init__(RuntimeErrorType.INVALID_CALLDATA_OR_VALUE, **kwargs) - - -class IndexOutOfRangeError(VyperRuntimeError, IndexError): - """ - Raised when accessing an array using an out-of-range index. - """ - - def __init__(self, **kwargs): - super().__init__(RuntimeErrorType.INDEX_OUT_OF_RANGE, **kwargs) - - -class IntegerOverflowError(VyperRuntimeError): - """ - Raised when addition results in an integer exceeding its max size. - """ - - def __init__(self, **kwargs): - super().__init__(RuntimeErrorType.INTEGER_OVERFLOW, **kwargs) - - -class IntegerUnderflowError(VyperRuntimeError): - """ - Raised when addition results in an integer exceeding its max size. - """ - - def __init__(self, **kwargs): - super().__init__(RuntimeErrorType.INTEGER_UNDERFLOW, **kwargs) - - -class IntegerBoundsCheck(VyperRuntimeError): - """ - Raised when receiving any integer bounds check failure. - """ - - def __init__(self, _type: str, **kwargs): - super().__init__(f"{_type} {RuntimeErrorType.INTEGER_OVERFLOW.value}", **kwargs) - - -class DivisionByZeroError(VyperRuntimeError, ZeroDivisionError): - """ - Raised when dividing by zero. - """ - - def __init__(self, **kwargs): - super().__init__(RuntimeErrorType.DIVISION_BY_ZERO, **kwargs) - - -class ModuloByZeroError(VyperRuntimeError, ZeroDivisionError): - """ - Raised when modding by zero. - """ - - def __init__(self, **kwargs): - super().__init__(RuntimeErrorType.MODULO_BY_ZERO, **kwargs) - - -class FallbackNotDefinedError(VyperRuntimeError): - """ - Raised when calling a contract directly (with missing method bytes) that has no fallback - method defined in its ABI. - """ - - def __init__(self, **kwargs): - super().__init__(RuntimeErrorType.FALLBACK_NOT_DEFINED, **kwargs) - - -RUNTIME_ERROR_MAP: dict[RuntimeErrorType, type[ContractLogicError]] = { - RuntimeErrorType.NONPAYABLE_CHECK: NonPayableError, - RuntimeErrorType.INVALID_CALLDATA_OR_VALUE: InvalidCalldataOrValueError, - RuntimeErrorType.INDEX_OUT_OF_RANGE: IndexOutOfRangeError, - RuntimeErrorType.INTEGER_OVERFLOW: IntegerOverflowError, - RuntimeErrorType.INTEGER_UNDERFLOW: IntegerUnderflowError, - RuntimeErrorType.INTEGER_BOUNDS_CHECK: IntegerBoundsCheck, - RuntimeErrorType.DIVISION_BY_ZERO: DivisionByZeroError, - RuntimeErrorType.MODULO_BY_ZERO: ModuloByZeroError, - RuntimeErrorType.FALLBACK_NOT_DEFINED: FallbackNotDefinedError, -} diff --git a/ape_vyper/interface.py b/ape_vyper/interface.py deleted file mode 100644 index d59b372a..00000000 --- a/ape_vyper/interface.py +++ /dev/null @@ -1,134 +0,0 @@ -""" -Tools for working with ABI specs and Vyper interface source code -""" - -from typing import Any, Optional, Union - -from ethpm_types import ABI, MethodABI -from ethpm_types.abi import ABIType - -INDENT_SPACES = 4 -INDENT = " " * INDENT_SPACES - - -def indent_line(line: str, level=1) -> str: - """Indent a source line of code""" - return f"{INDENT * level}{line}" - - -def generate_inputs(inputs: list[ABIType]) -> str: - """Generate the source code input args from ABI inputs""" - return ", ".join(f"{i.name}: {i.type}" for i in inputs) - - -def generate_method(abi: MethodABI) -> str: - """Generate Vyper interface method definition""" - inputs = generate_inputs(abi.inputs) - return_maybe = f" -> {abi.outputs[0].type}" if abi.outputs else "" - return f"def {abi.name}({inputs}){return_maybe}: {abi.stateMutability}\n" - - -def abi_to_type(iface: dict[str, Any]) -> Optional[ABI]: - """Convert a dict JSON-like interface to an ethpm-types ABI type""" - if iface["type"] == "function": - return MethodABI.model_validate(iface) - return None - - -def generate_interface(abi: Union[list[dict[str, Any]], list[ABI]], iface_name: str) -> str: - """ - Generate a Vyper interface source code from an ABI spec - - Args: - abi (List[Union[Dict[str, Any], ABI]]): An ABI spec for a contract - iface_name (str): The name of the interface - - Returns: - ``str`` Vyper source code for the interface - """ - source = f"interface {iface_name}:\n" - - for iface in abi: - if isinstance(iface, dict): - _iface = abi_to_type(iface) - - if _iface is None: - continue - - # Re-assignment after None check because mypy - iface = _iface - - if isinstance(iface, MethodABI): - source += indent_line(generate_method(iface)) - - return f"{source}\n" - - -def extract_meta(source_code: str) -> tuple[Optional[str], str]: - """Extract version pragma, and return cleaned source""" - version_pragma: Optional[str] = None - cleaned_source_lines: list[str] = [] - - """ - Pragma format changed a bit. - - >= 3.10: #pragma version ^0.3.0 - < 3.10: # @version ^0.3.0 - - Both are valid until 0.4 where the latter may be deprecated - """ - for line in source_code.splitlines(): - if line.startswith("#") and ( - ("pragma version" in line or "@version" in line) and version_pragma is None - ): - version_pragma = line - else: - cleaned_source_lines.append(line) - - return (version_pragma, "\n".join(cleaned_source_lines)) - - -def extract_imports(source: str) -> tuple[str, str, str]: - """ - Extract import lines from the source, return them and the source without imports - - Returns: - Tuple[str, str, str]: (stdlib_import_lines, interface_import_lines, cleaned_source) - """ - interface_import_lines = [] - stdlib_import_lines = [] - cleaned_source_lines = [] - - for line in source.splitlines(): - if line.startswith("import ") or (line.startswith("from ") and " import " in line): - if "vyper.interfaces" in line: - stdlib_import_lines.append(line) - else: - interface_import_lines.append(line) - else: - cleaned_source_lines.append(line) - - return ( - "\n".join(stdlib_import_lines), - "\n".join(interface_import_lines), - "\n".join(cleaned_source_lines), - ) - - -def extract_import_aliases(source: str) -> dict[str, str]: - """ - Extract import aliases from import lines - - Returns: - Dict[str, str]: {import: alias} - """ - aliases = {} - for line in source.splitlines(): - if ( - line.startswith("import ") or (line.startswith("from ") and " import " in line) - ) and " as " in line: - subject_parts = line.split("import ")[1] - alias_parts = subject_parts.split(" as ") - iface_path_name = alias_parts[0].split(".")[-1] # Remove path parts from import - aliases[iface_path_name] = alias_parts[1] - return aliases diff --git a/index.html b/index.html deleted file mode 100644 index 80ffdd14..00000000 --- a/index.html +++ /dev/null @@ -1,5 +0,0 @@ - - - -Redirecting... - diff --git a/latest/.buildinfo b/latest/.buildinfo deleted file mode 100644 index 38ad2dda..00000000 --- a/latest/.buildinfo +++ /dev/null @@ -1,4 +0,0 @@ -# Sphinx build info version 1 -# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: 8388cda1962348bc92e7707e3b90bb3a -tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/latest/.doctrees/environment.pickle b/latest/.doctrees/environment.pickle deleted file mode 100644 index 5827cab436564f760e7b9edf4bad847ce9d44909..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 456955 zcmeEv378yLb*}aqjrPr!_qL6tkxBU=`hF$N)8J>50aUFzv>cXdlM z-mn80E2*%#!9dKK7YK_nhVTMOc#uaHLQGf#BmrJ90TRN?0%Rj3dFR}vs%~xF=Tx_3 z-e-TGM>AEoZk>D9|DJp9t$UZgVex{63-CX8z0<5z>vMUleze+Z)Mu@FyX&sKx>K!{ zuMJ#!u)FQP?%myScX6@V?Cx{N%8gRHWm)BFtLxq{S!v8#ldVp@ZnY+lHCjg|i%o0d z=zJ6Y^nZg#oXNrzb{)7{E4D4CJ(*V>I$d{}(<+I6FYLcxc&gN>PgiHU?kY7R{r9px z@`g8r<&C3Ot5q#q4vffM>R9cL7?L&Dw(3r`QFpqBV5BQ%=bd(;S!_8LjB%yxwNR>6 zOGmms+veK&VyE2z>bveKnwRRL)0v$uw&uI;hQN(_vDv6ujXH2yb=hi{3+;+EYx$R& zwPMGqPSvcg+5!0wBwTPx!q0cg^kv2xf^b|26zP|R~k4fefbuvINNnM;!qUTg&7N^3Bu_< z;I3|4vp^CE3i#2k0DIiAf_JT3bk|yQrCO(K;qA87QXE_+g$?xNuQ^aS&~CJFJgb~W zr&Y2FPG@?$IwzEBNxtQ@L8}($XUko86qt6T+&EV6cHFVqq5~Zk1b>%S>t$;Wxa6@1 zuFn>$z>PJiTzOytXy07E+5iFt+Z10%oJw`7Ghc)ei_6o+qk@b3)ZbG@$Lh3d-O4%c zTG7C17u(g6H`y9H%f{t%2@>5Ka{;TCCLyQZrD4 zTlHcMM0Tpu%0k(iE_Q0|0IlvCC9R2BYj($t0}W@oBkuw<3sk{w{u zs(NP@USE&|3w;}Lz+^yjpd|<7Z@CN5@j$Z<=%_pLoa#(oTw2;Lq7}NMx8T3x(pU)w zH8E9dpdT2!q3X1&^%=a=ahDw});hwij91PEU0MuYwY%?C-O72D^D7787k8bqSKx_f zp$kC9NVRC0tDIXoj4emNNue|9Rtoabk(O1nKu^63OTq0F=e<9di$4p~vtUW`iP2iI zKGP}A0R4+B=txko0theGtO5u~=+KD#+vyhN{mqgI1^ukhwt5l0(Fs=)`V?iK{D> z?Uf06YmIUiRvowwdK>H3cYUu9%@znTjxY?6`Tq% zMfQ)XrW}`i$64_7EGTHBU2n84FvV#L=s+LYES9Y9aoK96=t8<~M_*jsoS(ser2}TqHl)%>cZG1;2URAlEvPEj)8tvr^QxGvhllIB$tBzP!vv91~ zs)JBGV%9mGX0v61v+(X5QZG9NSSZ{#X#VVMqh5e^=>FlpAb1QSK*4HO!C`9Ah)ZBE zflKQJqYx?pW++V8ituhFr`1j1Aw*j*BrIxzZ3vZLSqGp33=&AEyKf(w*IIcEJ*JBJ zcf%dHv2wOpZ-UJ@1q=w2I7^vxlH;Y zEw~NJErBb7-@r{bA+YXUDEWU=WxphS4fxnf0UCgxM#IuiuM^j;+tE)e$EHYKp`QRd z*1Q>O*PH_Qlj`)mzO(`_l|Z{%ZAXuCtOHP|0AmLXsC#pOr|sK2pq3t|*9Wc@ipr5L zzWo~TOoH7TgZEXaL8vwEF4vAjc%DUe5#s5n0E8HY5OggD?t?o-Khm{2vcI#Wb`}7G zREkd30hCb#!Yhqh86Q*Du}Z`O4CKODRnDmtggC`z?Mtt_YE;191@02Oj&8^u6D=fA zsC=jL9lW;QzZM9b@}6p6ZG*MJTSWU6qP;>@;OoUjNs%6Mw^EarWzd4R*Q!nhprvlE zf|(Z=AP|Ud)`-3VuGZUCh>3s*MmqH)b;L)(mpdf^AuInZFOG_*I@NL)t_ZP6x=RRt zyUJtAOEb{Q(w7uNZd`bH^A?O zPO}V?2Z*x*n+Sg|ahd~~Hw7~+@D8#!`4EI$;9~=jEOd#&*0(o^K4t7gnN>@|Er}l2 zh07Iypr`AP><2 zrX~)A7}ckguZ(#Z($pl-U6jwMhvf?tsh;yxZ&w2q{0cf|!8iF@J;)NoWiZczh}TLe z2z<-ZfruHCR*`3c9~WJmDVT)-U*LOeWYrrQTiF{SX(AiScZpC7NDbl;yi0{l!L~~a z=nCMX(j`C@?TQUvN|=ayd8OTMIy)yPOXYgrc3_fJJ=)6Gt@dQSIXkJ^UUkW&uDSWz0|&0`$~SNFACrUH5|B*THi)+;CN`ns2mb^fN0l zSuzLqF@wRz9c`8YtHKr3M;Q7Vd0TsO0evbv+*O{J&tqF7r4!23ECZa>fw0ns$&Ki8 zOm?Z9x45)cUV?-jXsGa%zzuQd40#9rkNj;GG6awisdZ-S!0;fA*k%sgA|PLR{WSSR zyV0y!M`3cWrqVb!+b3IWlr17&I@oO>BrmEr6j>YOgW?|geE_!@=f!iY%*q8jT}x5g-91%OKCvY8-Pw@x?PM)H4E5+3!N5 z7uOYi0xAa0PTW-7mN#`E6n7NqAZ?LI@kn2bo*YnH>4-m#kS{vJzoYR~P*)<2#Ecs} zTMP5CFdr2GQ@z`J2clE72XXy0{|znccF0+@3l*y<@U-Uax?mGIy@lzCcsg*a4aq5p z23q!kJD3MXe7<*S^NV{IdX}^bAN2K8>EG#ib+&i}VzSH_VFCqy zYe0TiHQC^R5!5UhZ#A&7pXJ4jbzs!h`g8*`9Rk5=yAMzXf#`hu-{BGWoSW)a4hC%H z0zfp^n9g|_-&HqOosw097zq+^d{?kuzbD4>*XnywL(+HR?bajS=Zrh5GZspzHt89Z9nGH2`fjP!fDD0`%j%Pd}{O_$tu^vW>_X zxV@xPha7@*@f*ZF%+`4D!ke-pWuj{}lQv+7oE^$i_tutFuJVXA4;E0C)7lY8-OtpEI3V#`V;X1&7gU1_7#3^7-Q&!rS{Ew@qnK7` zcUmwRUZrx;kb{NEIwUCCl@^#PWRU^RfXfo(pIT}*C3=nKS44w#qCxC%HsY<60l{6s zL!B9TW8(-+)U>+eWAcX330w}+_fCU6aJ5;0Bwf7-qp%87#nKVT13DFGA?P``IS)$^ z^#aD1PW^U>WjMJl7uv9Br1EU4<$0>5f+}d5Fv|h74yzM2(cYU3ZUT)51GH*QKnV4+ z%GhC6A52W$5p(_x-k-W5AdP+YFDzQH0ORvU|906rifJ5?EM98WC&19WW-u!Yy-w#D z+=UnW%~t!(PUd!~_Ufr%z6R|6Vhh6FlVib&B7Y7&}ZlBnDqI*>PHvQ`P!p zrP^s%YyKkvc6t5EXV!Vo=o|i1IsZkVs<>Q$oa`2-TxjR}(E8s33$YR1ot_f1V;4CF}!~ zMqx6|D0vfc8s?a^4eMN&WSG9|)WBimx&|OK!IITt$O4?;njWH1aecG6t|Pge8j0i! zpfk~6lV~7p9ao_X;2vNFuDka$^7eXh+v!ZfI#?U*2$#=w-y8Hjh!X;=As%!W-UdHq1i4+A#+#&0mVFCzgvn#&$tD?M_h6d;Ef$(y5DL*ipsf5w*VjS{e73p zq5zaADqa{$FQx`ljXCI0S;{(`{L0l>k(R+)jiqu@A%!6p@WDA0-i*o4pp` z0wJyHF;O=-+iRfLaz(+xv1+@5jkO(|8)*iMe@Agj*t@0Ev`SR~j^UP1^ZGQhQNKCKZ3hxbzj?=s+8`Am#M-sD5=BZC?{X)?p@?=R-}6uD^M2z zj;f7gKQ(-_s+O1Fo~{t|9)tqGy`%2N&?9o`1lpe#x?vZO7L|m63|$JRd&9tp!Iuo?r_cY(jh z-AyHEbp#f$0ZxKzDPxHQxQGYbl})IkKmaZ#Y`9hu?y0My5x!YY04@eX`hv5>L zhIuc5dFIu1IveI#wQ0Ggavat@i%@VT(!-Gbb59X76Hr7*Uw|6>h78K!R~N{925<#} z&cVv!%4?3htMu{@NDtOiD>bOX#0Ltx9--roBF0Cn0;!GL7c5?|;JV#^{=T2>U3K&& z_7?B2?pLq2pXUAbrp~ME^Sr;_x@p2b-}~!rU;M?63xz_MG6xusH9hVMND$Xx@X`cV zsHhGZ^>+6`P!+6S09}EGi_w}M?7p&lGth!>N6X)k&ttV~K~=*#ZIEl%y=oGcZJ@jr ziW|!~IfP1#iZ!`k)PJ$Z-wG>_KW_E!yS?E>t z@e*bq4rE^@U}|^-S7&i}laL<8jJ-3dT%+jzg#+mxJZE!O#-&MEy%9ZcHn^%?ptyDG zKwf(E=ZD;UhX&GhP)}s(158{5>0BK_ zwulY}W6n5sO!7ICv#@9)I^I8!k)xkLlqI^H8Az8}UxU^Su@fdO)jPn$4wx%aBd|bQ zbo}Ch3<24VZo&a&14V|&AUc1+z&b~&(HqHr2NP#}qWzw485qS<`x;VwgW+=2>I9bu z6V!v9LvXK7!y54byZ0TPn2=*(qh!rKCdUIH&2-GC8$l)%(+B5WLLGAf9!>_Haj9VR zU}&?B0(L@6nS?qP0YY9YurOlN!Mq^`Dh;M%G{_KJx#7fv9BJC{S}`p^#-st0!8n_s zc@?LsDDc;cc?iCKC8+Gp*Y3XN#%pmy)N5gyqtapJu6+y4E9@7-51eLrPi*gRtDNk# z`&!3c1r=+!id?K6E6zKxK;fQJzzTOPki)qjEaqZ)c*Vl$@Mc-fhBqQN<*dtHqvr20 zyRGAr9ZZa%wJ39dDUsSdxV%+7CgA}lRz^z|*a`^i=rH9I6HehG^YZb^^Yv5qLonD% z!G06`1C<>1Ti{=JshEa(J&QK(*sTz9TDfa*I;fh<)=O@|3PzZ$1zWtbD|a+56HDLi zuKiBzcsUMGl5N8-$pw&55Zl#Y4G1UrumPeoRfH8v*v-TE;{*5uhtQdlTo^^**MN0#lWiVr?bkzNph!wTsnMg*2eCGH7Ch4D5wSN_yQ7n*mlTJ=Zl{_UGYg*dqY--Fkxr@VF?8 zvfULg09cf}4$Id;-i5`x21Io1-+`a@|HdCE9{YFkhmhA2$@EXc1<(yUmO<_s#ny>qEm$XpY+ccg z#qK#h(Vt@8gV3S7y3}cb$A(%e z?G;z*E7CjK&%|cy(23%7D?bgJ%3+HYwEUanrFRX+`6H$tUb+C|owy%c)LB4Yxl=%UJ zAPd`Z{4D5FQ7Q$)TCG+Xp#?S)L;oe4r6*@0RK; z^xa*FOU{tel~w5=c~#NwZHcm<2XsH+u7H@~WwSx0u=o|KQbpC2EKcp-xOS_(8yZ8= z5{~yO9PcJf<%^s+7NF=2mH-pr`osknT?$eB8u7^0_{bi7WI2>7>#a?rm>ORz3tkG| z7EWA$Xh03Ny${+yVDH68Z@@>-!b(a=+d<`qEZCOC4Y0D@62*M>bD$N(O0ZZ_oT?4P zz7DV3mt#k}@W&P6?b4Xf@|V( zQDqHQl#~FDv?pX8nFJ}PhFfEb4KnX09B~)!@DSd+ffoE*;yLNf_knIZiQZfWUN=HP ztb?_0fWG{=3nO0VQ!Z;^0Bzm~jRHZ~U3gK5zKaa{UfK_RG4JV*!VWCf1bHs8C*st| zknO!dN$iLY!3~&r08-VDyUXAY1iCOI7{QD3cY7JMv=`%u+~s&#Bz~ZgxN+POND=n{Fo+DR@P;1N8z+n4N0Wyxr5H>Bi7Suk~`H z$L0F1;-U3M|8gZ3ta?+pFLehHBseso!Jz#1&8UVWdr+a_&j(@rI6;GTJ3K%HDk>ZY z*GkYJU=y?QW5(qb-eqA+D|7_}ZhwZS#>(hdl}qviJDiY#$CO~X7qSiTATB)FUHB2u zM<3(=YQl|i`yJ*TcXW?lSk`kXVQKzlHGz^A_b!yKm~uRfzad24Cy)uwmqLig#5i%N zCORA1O_&V@aHyB-_U1-!HwXoO;jE{!!$Tzx;h%c8NgzBp#~F8*G>dpL>^tfXksa zRILE!HAS%VNZy=?xd#)g1&Ke=i>W=Pw*E>!M@2b$NQ-g6iHC~NP0#$E@&bVvzILE~)Alq~RP!F#W5BnuB=BwNt z2X~#1n-q5Dwh9h!y>feQmwul-2V!T=Ym(b~<&`kM(J2vOn5q!au*z?F%8pqR8zHd;`*G;i-Fh<=do*#azL&+E8Ka}#!~L3!Z90N40SR%AVBG$idFQrQ zf-t#*=dj5d@l@66#AmE2vqeGS-#bcOf_4hVunZB!-9&K#Ip?0tl{J0TMX zQ@^9aZ+M;TZ#dPt{ZNB2zBRvfo9YgmL%&ew0US&2Ri3ti2SK#wQ;37DLAcx8t2s{Y zPzGnHV~0__ShJ)SP8!ZcnXxKuw+wh-u8h-SzqSXZsm1z5_C5unPy-f?zIX$i<@# z06{in(NY>&u;~p?{KB1vFg+-zG{rhV;r}oV3x_yC?d43X(Sg0v@w$k_is?4i6=A_{ zN;_G-6)zh|55RsaQL?WappJ$GaN+hG)KH2R+hJdxn&Hm-LN~6eCH$SH5HGw?o)Wb) zcMmWZt9d|NfoSnf(?o|98CEU@-zV_e_u+jeUJFG#bqbLY6WoP49e!*%0n4cg&bUM? zr=;|sfCt@$$I`Q+8?jH})RFqmR5+8ChAZ9WkR#YBHwM5=Ta{>cRbcuC@<8-F8l~H{ zh8V2!p7+&ZOF>esLIbpc>nXTCU~(TeVntwF{KV4lQ6QW*o+jUiu+ zeJ3b=f>Od(aU8N7?!4&;%cR<8`Do!WB4jJE`iqi&O z!x;HgoCb6`fH%+)ki_xwKWG}NK+s5r$GkRsIInoxiGS?Tm5cMaEfnC|-A zh4u7!{8G=my%>Je-g={OVK{^)9;?`qDJwI6E!=6+4u2ce-p--6nNDpZOzkGP5SS(P zgf#ckiL%dyXHpjqeN3ZxSO`(IA}|NjOjFtiy9XfO4x1b1AZcpqiZ`*Bx*^XRFj(AW zj3#cy+FcGWms=;gl}B7SrF0tS3|;$Eu*po^)O+^Sfd?xv!;71+rmL`_%U#}_-zgJe zkQt4_8eA5c-zhK#lwL>x@p>d(0Ekz^Z=iQnNxqjcc7h}oRZVz{p z#h~ggcqUc9e645l>JJ!H(RuZt$*ZvX;w;!?)|VM%QPkI63`e`d{!~yF&A*F57D-#50GB&x{3At>6dLG0ldAW>%U~KomdZQ*XDC=L?16MX z%b;pGJd=tQeW=6qk{Md#HS@Rnd;?+@dAk3rkkM2__fY$PL-v^UPU=)h(|ppbr- zPyJvQj)=>>esmj*4jPu_NjuPzkKcIUC##uE&huegRps1pHkuw-n5iCPd6_)6_ z$ZEQlY%i!Y=09m7o(aZ4;?%r<#1kYX6Y$vvq%$%8B`H~57WKBlR*`oS7$&( z3<96kW?_`}?J{bIZyKTdQ3k!)!H{Hbl19fF932c@;DH$UC9yb6vnrbGSs#5~H4}DuXIQyiin8eav4os3O>nqACoF29o;u7Y6BZD&9X3%AWf9 zk<=Zkl*Zr-Si~9_N(Ng|MMXfH8B`H8n#rpz45|nkt*9a+pi3EKk+gLf2uKb#DPGWh zCROkEF_=b>rSeWx1oRRHRRjdY^yD^!Dmt&i2&li*&m4oc>}W?aGD&;mjEjqQdeyjV z024(!>jc^fKCjzKuoH9Nz&fvEaF$@VzXIJeu+G~VR1qSBqKfKG9$`>Lun z0`-U=SU+T@eLl$`K2F8^M>{=Be|ncr{Ek!~s-V8i7%M?giYhAH`8IJYi^$!fH z=)CHouF+DT|74IwQrBU?9VvpOfI)YgRJ}iS`A}iLa!^#ba{+@Y0^DIb^Gg_15%gYB z#e+M$8MI}GJCfui?Ts@oI@}o-aHWsEdK$$<5znUBE_8c|dJ@_g$mhijCKF8fR_LCA zd@2m82th(oMRhDk8B`IBMNt(-J_E_}Jis75PS^X#J=wE7uaLS!mD0nEp%SE|sG`E2 z_c5prSeWx*z@-cstB-$ z>B)b_po-2b9_$$#qr=ziutzd7Nqggriw=9X2+Y!RBfbVPQP8s?rUTttLY~+b2H-iL z!Cr##o&()80MEq?stDmhQAKqrzrdi1U?z&Hp#YxeGf0oq@)HSoZj`!1m6F96DnUw$ zDk|V{7*r87n#rsC7*x@DMFu>tVUR`A)?ol1DT1VsLHC(dy?-x*X#`m+??eSWzr~=6 z0C_s&(i{UCGlhi4Pc^hXKna#-BeJC*(|H>FDK}w1$D#BU1k`9mw8qMU@1_o7hUXc;bxeT&M+Byt`BSnxD zBj`Sps`r;Om`0GL@=jEQb3KD90>WW>@)t6wqVtM}a4ZIG*%6LpWRmvA85bSl?3O4c z!!gzx*hCQ!oM4FP$?IFUln^L#*T6vcFgQ-I=R2T#1_p8&R1qSEqKfKe-ol`YU^$Aa zFb3MD4l?Y0-no{0uYK(?ry72MF|;_t=pQ2uAPw{zQn{#N{1juX1TiYAs37T28B`He zp2@3kFsP#Qss~6Cr#Ty5>jw<7GODW}BGb_eNs4h$+pYB13lEyR4*rWVR=Q%Oi$F|h z3<<1UMaT5nB#?bll_UV~i!e$6hfD$F7(=BCfa=Ba465jsN%dm87*q|PSI=WmMdwwz z2`v@hC^0qbHU?eUj7U*&GW=MLF<824qzfVH$L?TIl}!Z0^JCjXfn>X>ZLekwl`a6P zAA6WV72P(&erz#(CdlNLxMGC3_c17=^D9i*!XDA+V<&_vsucf_K~;7sF6?nI=2sY0 z(IrUb)e{V==)6jIgfRzW{v(4dk|!KS;!#4nq|^;PQ9+gE*lIcqCdg8y1gMF}%?zpt ziAQGoWDA2TI_;k2^(jkoEC99U!9_$Bl8F>gIA572m`N zus1T8PB7`~p?gN|@gRdLLeNlDQ5{W{K^4Jx6jkBe<5_#szLBT}-Yeg@F4Bt$Oz&ij zEzUUlPd>&_lxa$IEJ4+Jq;_7z7&t-I6jkX+U@?3}(GL!l=qWI$A}BSJSF;SN=)59>o;w+2k<@hz+f6dmdZg!- zs3L$KrZazxK^2`>Jkaw=25s3vk7Q($_Qn|(9rT@75EB$tR6p_)22}*xP*e>G=qy`DN3?OueL{iGA|M*n zhbpMk8Dk{~N>N1xI^ztg2ujW5)iW4W(RoD%I@d7BBB|>zfQ}SFQmCN2O{(6%l)*HD zER}Kmbq0c`ts3IselUM)Epo-2bGW1!se#l6D7|=(GASrmz z-6mD)%$;BFpVHf<)Emj=)V|L5l|7+nXlYHhuw5u@les}4BE1z zBFV@k?Ts@oIx3R&&DLDCU1-z`R;$&3@@7i4&w7~+3U*+kpST7F;<<#uT!QINLiY^B zvztK`Avh?is1D^O22}(jQB(~H@e~=v$7%TqMLdV3`cMVcVT_d^C`A<&@w}Wt6+x+) zym}pjDmt&oi0ADLvPkMW48$WvkQ6iMZj-9_A7?O)AWP+-sEFr}7*r7u57U|d8G|Z1 zuXu>(I}F;gBOb}fB<+neE;{0o*_dX_ny$`~c5)6boieL_ksxY=8?A&_8!UYQ#;D4~k{N0NeEO4WTi(SYVL!4Uo z4{@?@;o1T;gA!52btPk{1aT>h*aCI?*tZdr4L=chbh%2TDu4RmsE&{5$9$-*4e041{ zsG{?#hq_`+Hr2JkAd94~!vN+|U6Y^kO*s zyy5}#k1%M<4$LJZle9O^xah!q;e{G+*%3AJZ;8|rG&R8W;|!({)aWzNeP^m@KMHBB zySwA|WAHCzxjrKQ8O-QMk67~};i{PsJ!N(=G|_ieiVd$AocL=7CkW2xuLLLTNO;?6 z(zS4>N!5=SR1w0PqKfJg7o0Lwz2|yBX=@|-8V9*BG|5?ifX(6gFzL+b`@1&+m(k9_ZMel4lMqk z45CTaJB&HzhlSbgy;M#_b?ura4xzqG~>hzMg-V!Dt+=m(5f}iJ*?-1 zz1lKKy(V13OnuRy?_36bgb1bRqfP`T8B`G>l%k3np{`(1MX<#LS&FYb^cSF_AEmg7 zL2|bEGzMo~R_il)w3|$c`@KN=K<0yzuLE@$nL4|9DY%69!^GYm#os=FzkPoR{CEU^ zo4{)ygx~fq>`X=8vl#9cRYqwXN~fwbU3UzAPBf-$tJLmVcC7T4%{I!Nn$>mJ7n@e$ zD4a&x%9k3m&1%hpS?i}3Em%+~xTDjZS`8<&UHck%jXPFoH%j<@^tRKr??FYv%lCKP z<>H3lvSa@aQvTJrG01@~#X)%k1&8%|c)(p*wwzL-)Tp z?~!_=3TcA5?s0de`W437nuovF)EjE(j=H1<@I~aKVAjLGr@e-rwFj{hDa*uIo7wsHGw<{j63-S~yub6UBf2BX~ucLagFTrIWX*xftt-loIixc$vg zM>`JgI=^krwRh&WiZO4!a(ix<&{D9mg3~OPAk*VD$!)#zO7BZK<1)x9r7>dchfpIu z?H78uPl#|INRS$YK9tA*40N?@)5s-vFjc8Gj&3t6QC{G-j>IR;OOKT9d~b zts|45RTIJ|nZHRtHK|3JZ_e+;?dG7X^_g5_y0_YSZq%Lx{}V71cSBT>L*F%xZDC0D zbJ4+hQcV!VxP3V~!d>tq-cd(ZL-N>Ocz_sQ+K(d%I#$@bLxWsp8liTmVr3+B&luQW zat3xI61uPdfn7xy*n!Z%&go&`zJ0$a^kjy$qkp1v#U=px{|ntGqn)^*9?_NCJeK~g z=*$j}{!DF3abD49T6i+CF7lXeD_vg9eM6s?ZwA#!aDNGgViTqqOQC!4qtq$JsSK(J zQw&8F)w^H7po-w#6;)vgFTvR82{nDONwzfv{7eSXaT?wKYLg@))AZsJp*DllKdPjk z&tMu|($pkafk73)%Q3BDmO&MrSK%bsqC4;QY(fN0ykIE)oea9NC%_~VBU3{PL<@(C zOr81j*`63B@}BoVr1Ivo_8i98dH9ilj_!tAX;WDHW!S+t@yEUR<6)E!{&|1b{zZK& zGFuIxC<(RRi%q?N1+nE7a3KI6y~!z*c$gCi?+&2`Bxe3~iHf-6+j8SENY%h~xml}S zX_R3e*0ZUe^2g4{-j<@vcK=hcpBTjHH;&^>w^b~)3)7HtXhLNvOvvsjHEK0TTEK#w zlP^w{^4GVmR&lCk9lQry)T&c?EdM;TJ=bhCFuMVd05|fp#d>iD7V`4ya(=(OeWSc? z*5_}}g=T<8_5QZp#FYtjv>UC1_W)~~vjv>bJ1`VA1pG6ds;1& z*?%|;!q!J0){Q03j%#2j(C4BO?KLB%0PR19?ioP)FBw!3fVQHF3cvoAK@|Z~D5}CT zUY(>2>6m*|KW4&@|6q(E8}8nmX%%9^V3A zb6PM~o4K_Fr)d+kOHq|B9=S`wFvYVNWMvc0%3#bKo;bW%CwJdJpTep6PK^94)8D({S zp%^KKq_{%&xK!Q$GX~=b@>IT!npOM`gDOH+kr@a6i9r>eSK+LpS#T=yiZOMi|IMH+ zduCBGGD&;m42+J7&P>b4_~9@dK1cOqx`{+X{$&FWZ9bhoDM(Caahqf@NB7^`% z71d>2%Aks128yb%JXeTv44I76BJBl&VwRqs!yrCRkNbx{y_cT)3KUmM6`~63#f1p*hVrkNqgfAtS7d~)S16(8nX~%|30R6y~?gYwJe-S z)oIlovs%`@I({vUw}zGO(PSF@;BBU^nAgCk^tW%3f=L6s8qpFO=q zLqOI>fd`&F_G!#y>&i}7vUNNq;I4@x#X zijJ|r+Kjj09)snuf1xB#&SFGGj^{7?PIgJi{&@+dt%}zeIyH@kc z$aBqFXQo#2yx7FL} z(|2U1*4T+LULe7>njzL~vr=@bVKnHM3mA;>FB`*ua|$6zE9fce`;a&Mt{6V0iy-)u zd$3l(3G>!mvsNut+puS91pbt}t8mYnXx=WiW-KUP{#AIJ3H%-a=Rdzw?R>LEWa?Ff zpd|Jt=qsq_3wr>+kK&lUpk&IDGJfTWeHJQu64fD0s96MHNZ-6=Xuuy1i~LVR$Fxli zK@G4!2#*Vq_NM`#!C`zDemr1*1b;<|+rNoFumm(xaFQhJ9+>f4*x?XmExg6TZ3Jf_ zo>-cD;@$^y)Tg%g>yZt8NpoEh6q-_&90VRB;LQVXY5JnNIEF$IU9?3P_8j~ZuwXCz z+u;!Q6;))B8^5WEm8iwqL362HMlOA`Hjl-qN2_IP3~{4=7~^2ETE~rPczLSmz&#Px ziuE!8M1Ybi;=wXTK6i~ZUF_7_BIsfJTBB5~jj7J?wmMr1Hf83HRS}0)iuD;w!cDQY zAHyX)S#9N7mea%{+M^ydP9T8ZXY#@Isz(gp;9WJuyyDD(YPug6N1)@xxQI8C>`R8y zQiLs^-|1^6Ce8t1}qH0yGg!RuhpW!K&!=2GIXSy1$@y#qS)!?E5g z9p|l&6g04KI`XUqV*U%d zLE9W0mhe4nS#UC8=7Bep-kLn~2t&HD(e1*M~*! zyH2QZ-!l;5{#8V{p%Up&42xSqqYqCYQf*!sZd@Si{nX~&NiNb*=(LV9g^VIuLlQy; zgNhbPS|FN9S?)V$-4+^iN84FmVC z8WQ~1!D_9a&Mwa-6YocQQ;Zfddw*v3@&?lGkAR_i)dlG*wM4#wF#j& z90c8QW3nLj|LM%9u@TUpCv1UH1%zO)$JYg2e#$!C#uU;L0^PWMF}#pDFIWrjqiJu- zyx?r;EbF|$-h+cV8*9vyd9Bxq#15j+TwtX%OH;;r#u=U!n61p@9m6Y#Wfb8RmXi4z z@d{`h1Mv!sfgAt>lzcSTV={BdKcLH8%nN&gxbx3sHfda@2A9dL&&elrVFJ;9BktyY z0ov3<-fwS$-;UdF7C+yDKNaWwqqoF?Y(k7;V>Bw5x0iBAyS|^L_6oy^Xl0AG^?Rb% zE^)oxR`fm0{ofD8F73)8;kd*>=^1x)UwGjWNGi-Ya`$$hH3rK2jz^A3S{Y=!IhiqU z8S$`=3Y8E)5}h=Ev$h?5oqP0zZ`PLD}*)@G1bPu5?Qc~Mv>)eA3stBbiiYjUe<~tcw5y}b`Rbe@b z?^|f}lsI=4vl!9T5bsAAB*!gp2Ga(WM|_AQPR}$lnSus$De}0n6xmk|+M_~m2Bv@% z0FYAnc(*eBG{{XB z5uAghZ=iC@)S16+CuT}+--UR~+qU!9P`n>V0=rxLJWtN!dU`NPNg+SZ5K5fR_Yad! z*jA6v2!&0W7sU-CVz~aMik>oz=!yjr9>S)I)05L?YG=g{Vce0O6=s4;Z?8BrxwE)E z76GM|`Q900)&Sli`TWbsVvOEZQN-Ff*mp7O6-!7TvOcDP;ZOc~K&q=Uy8f<)lbkM- zto@NOI$-TB3CmoN@k+cCUdIdWOwef(kqrsnFqk}c&S0idipl37F3%aP8Lq|m9bP><5y2CM&<=8 zse@`1u9-;H1)+Fhf7<(rIDgvvsh{gg>a^iy^7Kc@nwi{v_O7J{3LO(`{FVoH z`w)dYhQr7#+@6)xxnXfDX!PMgmTL2f6NBDQ^;t=s)={RA@%v=+&m1zItMlXHY=CmP zDmP%}8b_^G3$|Fo(Hf1G*iad)@d{S@=3sZXRr69zQ9vF^!Ano>UpCC|hQTV756Pb^ z%ul{M4(H(g#6TjH>a5*q{4r~rQ+o?RZ1>E=hm*K_*so_6G;B_4Xuf_bWiSjU=5Jt3 z9habRL@R_L*0kp`+03;*C)5lo{M`qext8niJ{S>QFsSf%A1o1F5VDruJ_7^w zcvlSxzG1K`<>xD3j~!F;mEnZN zepULfadp<$7Gzq+s&ulptdM(EauQAkQv${vgNL6UEDwFH`4o1XMQhBZJ8b}A*Sz-d z;b5=}yJNExW8_~S?8to={FT9W?5pJ$p<^0ARq(@COO(n$)RN%`{ml~Q3Xjkdubi0C zvAt!k-K0HoMx4SKUguGmp#RF9w||I?z7f7qWgJ`i-E) z@PxiAg(j{TvU+Bed7ei~!mfl0olBs5Si+1HiT2pwa4mx>LXoJVids~7fI$_ZP)<=5 zuC{`r2#Fk{B2P{uiV08LlZNmu#(?6AXo9)E^z9Gl_I5^@%cYA#=LV*{l(-zJCi1_f zJDEyV99JWq`Q>FXF3--RFcZtm&J#x&^%VxPYSnB0ztpN<&MrT{w5+H6B1(5Eyngtl zWo9fBpGkfcUK}kgGa4q8mId3ym6in*R@OhAW+)DXjs8o^ZogI_zFg6tXV(x01%2)XDe5&L+)_4h#5ur1aPNR$rYWkBlX6ydT#$7ap0Qx?y$%(dJnZa^>%gE zl0EvzsL8;365elk@{bv;Gba{Fo-oemsCm;#DU1v1i~jPjRE&=rqXWe_IfZebGswuy zWItu_S?pM(41AkF*pyfp7fv)?3TmDkj{*g+=FM~bV^H`e8SUktqKWZ-fa4Q`Wrm*) z{}yx%V;2Y}QuT&6lcpBoxaB_GIGMv^LEKEqPiBYmEcUO^aZk&HKds&U8QVQH{D z^fl!$cAQ01;^KfFRH*V}Fp=mEq?i@R4TbHT8orYva4Z2>(OG(L{v z6sJG^HvT3SG{kRD$_0&G)3su|ZPnq79hnQHEoxlc^8~1H|NSm(xObembA}=`3Z%FX z<_ce0V(g{#3hl=2ubFq;H=Bzp;V#GVTy|Jl34WbqXy;MML*K=+4SX(0C+ee%Fl)n9 z>ZTHlL~k1b^ed>|CvGw33(?n|d>z>f{=yC~$h>%Xvep8Mo=i0+U%DUE%x@IV_%Fdm z`nD9ZykrRW@1mR@-&Y8B`HgZWLA2m79_C$wpukR&Eqk5jh6M9L`R7 zPD%+_v^4~L8iVM#oL>K{Gv;StGB3nzf&nB0CBiDAuFNUfvF z_hk%r5ag?465k73MDVXfofl)ZkaXR?`4oh(&%BGQYFQZ z6j$gTm#X`pW-yK*PvzUFr&N8BK^5UpA!Z!-KMbnqyyBfw^?w<(Wk01#GBQbf;|z?B ziu}DWD)Y!WrE1yJ=;)iEP>Y~@n5l$AxIU1|NSW%32GHKfppW1jBz*&wQ>M=RGNPEt zy8Q%B;1bJ-&M;1?iqBy5nCXn*GBqYV3>oZT$RJL|`=9Kb9^9}L8cAj_lovWlS;~so zre7`8Q%n(c_$&x<2-QMor)SU9VN^H6*drA~(JYm&8p@@28do_K&{3J3|D2I^0B4X? zITSe`=r;A46S0#}CE8%&Pv=>oI;h$%PSxPU-%v&*Yk@@FP!9ftoru-xYDxZGbaKTU zmKkAN_(-^!zZu?Z3@bV~AS((kSco;U$9=CLIewe*rsP?EoQKAG$f$T)GC zW4zB~e+!8f$$kfa6Ulz@8!Opwd(6Px^J7cmbInXJc8{lRz2OGk<`VAgrCb_ZUc zzg7ObJtsZ|sLec@w%-&xI^AAo{Sw+3HtnLyp11`51JT#HFFSFIJPAzm07*ED|MDk+ zwrH6~)BSMzoLsL9>awT0nDPyLjw%db!3C_=|aPw$NVmX2L$a>RHch&Npvyi#|*NviDtlyIZ5L19GDVE=!2Fc7m%ZuO%_LF z{-eMa*_S1C6eo$ugw0=K`c^c{^XSn`L7*r9oK~Y6@{ks`d5nR8b zD(w1)xWsgTF`zgV?>`Qlm?fs0q}Ea8JHucHLB5JA>Jn3jK^4Ikn7n#9gDN_&dW6sD z64UD#WRWy_SW8S&3`uc??s2KQ|9%GJ2=Y|Ejk?72aRya{6#-@(_#*~YbYAh6nEs4G zTlOU;$;c$_jWaMhDjLWV)88}LLr|z6K=%N5!XaF*CK^K79*)N)o5){iCBLf{4sB;!}X|IMCf= zMx1AimjE;rRq0|lEisR3%4QdX)@-s#p=@XZ+a5|`Y&V&(pTPvWz^F*#r3|VF(XlTz zl7?h>)*6GXY#K9UYwnRyxtB3svT|f{{{F&sPv;+b&&we+3}NB={65y5)avzHfWMK| z>x6Y0y@Y*1AKk~TV+R7ETvdIgktGCQpR|rW9$Cn4TxYdm1$wsFY~ooLjcKu>tyd1= zk77G_tkJ2Jb5jSlV;&dYR5Z_VS;v?oMSLPW{_d-`Ab?=O5wJ@CHJG)u_!n2 z4FdsB;xQNl_&(I`=n7qKT(7Rc>TkPJt4`&`N}YF@My=|!(OU4Xe-KRc7>&5~Ib*62 z*T7KhFAtX0{vjKmhmL`>?}pk0H*&}Z-b`9?PA={W9l!7TYgERV{maHk|0d;~45jkF zT<~2nQc4#=Tu=ST)DLhNfy3=Fn)nA}DF5>MrEpQ~16E=Pv99-*3l?romJnsAiXfj` zil9U=AEMMX7nuw}o3{*MuNxNmtD$3BEmBa}_J4x31n9Tsnzd@F+U_3rcc9y!S_F6T z!w2nR3(6F__68hAW?}dIlEJoNaVzKq!iTG*`T*fJ;tp5o{nUCqUnAr|4c$oVA_5mv zimHOKT-e&{yl?|JcA1V<12s2g&h8O3vf=HSpS|T zNdMz2AC{=4|4&AHpII@2k9XCO;CEBBfD#*&`uWL#C$M8mG9Y{==0&?jg*Hyqy&RU8 z4uj;DcTpF1n-)iZ+~CW<43;nc*>6AQYPPRa$l4RFQ^pBzhF%$W3?6P6PxdgGbZaek zoJF@bh&9Tjod6*?7~Vh~U6C9g&_FXxW?i|eL72`y4T#n$q;L@~-b;)P>FgO%Ts4=( zu1x8Wq6%3!Gr|)5+O>W5hWz<@+Ay53q+K}h% zX&KUHysL0iQgyc3XtfJ1ORccc_TpXE*IvBvJNn&<=iYN-H)uuZWSqp;imsW4yB%+~ z8a8bDQ=dATE!K-Oun3t~m-GAO?HlFw++8`W8_iuI{t=%(5>eV|w|ef?+ZZQd6A#8W zG4RT-(>-vO?;gD~`no5FBE%lIcX^mwXBa^f@ z&cIT3RQ#s!-bt>lug?5R{TMiDe+2z}Vx|6?M10-D8$~lg<1yFP)8v)$>(2 z#IQA8ELl03wsLaQt;TGwY&ETV*{YY|I4^IdUoN7PpEi<98-Za-ODYrupi@#C{N4q`K zS6qjdMBYwFB0K%&j=dZf;TX3MBw3)Y<@;^Br5;Rb^F=pKp_bYh>D z+LP|&wUvgPEoEpT|5g>x82)E&v=<`Q{kxAjnry6|sdL>x6j*RRmjL z@@f}@Dmt%vgwNT%mhhs_vH=j3dZX`8Mi0VT(Z(VV#f} z2kvE1MduZ7o$%ER+On?`N=7DWZ=8YkL`9i8^VbPuQWEw7jN^&xgd6>J!nm|d50?~O zEPR9^kvNVex}@+9C)!98?QEmqArF zDGb*_dn7zAV+@xrgvey02UUAc1XY=3Fs1Q$1?c$Mlxf(8BUd*e`nG-Z%Grm9hLa&CupJml9ruKFNz( zQr0D7a3JfGbH3W01{r-VF{W(<_qSBfVaH(I6L zr@S+1l`_Se{bR&_LyVNtMQ|=gJ#_6697f?WJ9O=7~?s@3i4~NCApc4om6O`%$gxiQa zh^6;aTl@8@h96ApHv$AHC$YVTtS|~L_$RTsqKl_aVjI9oY?~*N0}sW6D;fFWZXXRWKI;fM_E<$SiK8bBd%GeS(n&~9AykK-f&#}sSh4yn2zv?%Oidp{B9VtYUJ zbA1w9+VC=Y`gLT@Oz`v!D*R)(j&tLUf8Ga9of2!6V@*sA#6O0sBSY43j^TP4-Q}cF z?avwS!j36(#_%y*m&;?g;NlS7zGzwJBV%x14EKtxg<1+&3YI4{K87>}^}$Pnrb2DTP3a|5nO%0Srl|F49KM zupR%boL>QoY2aSb=GzXc(22Gk<4`dpavOIHy!$(Y6^?I1AH$Bb*wCOCP`@ysks82( zHjj%rZ_LCHN{#%p(jOOUq-q@xns$Zv647J`6NZjsi!N+_FQqezk!InJpo%cf4KgQk z&R7QS#H{W8>`A~LNfwho-eGmpbs~41spJ%!2t83PS)WfT?I1Scj(Z-&hOOlGxf@ZR z#r8Sz8*BTVx5Z^h2eDm_8@AMOtpzxTjkbO6qQ17z1-c*R7P>!;E=va9{AAchm-xlL z?KwC`*Zee&w+0^FWVa?HGZRQh?iz?}n(kw>Y_^+D*k`zT1wP@_k45|o4V~VQqu8YBLxO+ci z3~@`BL6Dw)Alnc(+`T73yL!}xev-ihf_5pY(x*=`8}2^GAS;__2E5@eNgQ63Q+NwP0X>L^YUDW&Bdsk$d~!`*)~_)cKgf5;J1UH_^{`uvcf4T>tN z>pz1*6~Xl@s=}^+h#T%E7z2t^@&4n$iP>=&cMmeCB5b&0 z#({S-sG{?Vx8d$l25s3l+(||zX>Xi?^+ZLPI`cQ&#iS+dHe#N{4R<@lhC5~gr-#Fe zZpZsmhP>kV*?$Ng(8++G1;XPd^*yFtPcX(yh-QkabTOQkC|q-4>>nAlW|K_{Wtn$p zB?+v@*1aVc4Hb$js;J>=J%cKO3+_ve7DFc2RG1uts%#1)Xc(Gm^swbi8N(g4Et}a3 zBLRLjgS>3gFo_wOSbC&VZe@&{E|$nNrUzB!6G2rb(BN<7>j@en?>PjJVhCIL&PrYA zQrr3N0nSFY^F`K%^p?JJQoD@X))#KBv{mvQh0?iK#;=8*>Lx;L58_{pR{(A z!e_tm>&@7)DE#sj5E17vH{4mN8}9alZXSZ8QYUiP*PETTsj|6itm$H>))vZKtksOW zV@<2&eKU2a`|o~hu;TDHBzy!q2JVYumdO4)yh$%13vbODy&g`5E>6`fbD7(}Y#8|C zDeq(`p1=R@kHttST?8jz)ctpVio*zO$wF_Qvj0wrA;h}g`|rLxEN&@+5@%c?N?p0; zWmJ{MEQ9^?u*m%pbWE$73JTZ$Hat$)Z}+b_jLgFAx!-Qp#mVMJ(PI_sd{YP-eRwlS zs?7^G5w{tn_fuD9bgqVzNPArb#8I~4eTb|_in;zayhlVAPi?~+z&5;R57q$usCOB3 zoEY`+W@6M67Lc?JFZIcgD;?A}yyqjeeQ(1%kTSLemy&54-c5qh2|dT|wn^EBcL+M8 zZ^JVqZVsqbn>)7XF8j7Q21*7$haLYuv_juquWS92Cf@Y9NPh={Q;P@*xz3QKQOQivRZx_ zbPrRG$ofi;YWd9!stBt-iYn?l?G^@Agmqd)Ral~ft(JclV+?T_?qDM6q*cpbnxI`h zmU?es@PMFQimK4eH?-L}CQbNa23greGvFoOByo75C%#&~&KNgY97#xvP>d+;GpVCE zNu<<;EfT6rNfAUk^XtN5VxzqfxtdrPHX20*>G~S24|zR9Y;jEL-;)fcKIGMc^U;vh z!)d&mFI=(Zv(M)=1HX3H^1&#hJ;S#g$tGypUYz|Dgfn0UGvSZt)^G+_+V>j#{~P z#loG(Sanf6TCCP^nblj7_6sraH05@s>g1ZW&I}x$422o$+~nNh!yZmPd^oU%EmD+w z2lyg0+4*-V`WrcxXq7=^e{lZCDKDS|8kQfLZ7I`dHP5~aSe7X5{kaDqNo!~Q^E-Zlo&#+>s=`Ff?;t>5tInmLX7~?pZi;_prDXbOPbRkyIa$SUA%Asr51L(r^T6U2uc$ z`!NrgBkP6=DgMF>hLns8FDpeC_HY*G-alAP@fYWQ13S(VOE1{n2e9=5r_87H`HZ1G zzdKkC_{(-57jmP7k%;yn6Hm1E7-vBmaoD(H@bJ$E%R^s_zKR`Z(V_ulcm94rgA0NL zV%%^=zK0MvejpS_B^g8KLgGC-Ruc|9dg9-bOOrdJsD3u)Kpuw6oX~kCY0SwKOTI58 zLSae78=x@^#2YXM;xFQxlR$HsjM1^bh;QaY!d9QQh%Z1`&qaJ}B^U88N2L{u_~N%G zYQ5Snlp3&?rZ{62nytokwPw){_j^Xq)%@6(4D*P;H<(GY*!PdCbFcN_VU-^S zl5fv9Ehn!p=Jzz}?N+hWKG5j2O4c65sO^x~lGh8e7kJoeSDLd0`MA6odU%`8C`Ahb zHpNn?+e-(V(8h?6x6u7$mJ)&e(bu^zJ8>lf2~6|WU=A!blN`+xEpaWtaXVaTur)$T zyrTI%gjcE8gnG~|rLsis8ftPRDz`z_Ak0Abki((YAj~tUBCItis;D&xuVPR|s6kLv zg{6B+x;i8$y99trdfHHeH!}tnm){Ixs`SEyZGHRK?CV``5IUFygb0h!Qa}{Q5m`6B z4g8QyZI=X95pQr#B$}Aw*R~z4K3WrcQnyrIAbi(QfKM*{uHDp1>%(wSQme+5oIw3Sywvo~bjx zXlOd% zk^UFH4_^p5$-*`Cj}tY)Lt7GDg;<#6#?V7*QI`fKvJ8yn^7bk%|# z+@ZVh?O-{*g6|1WG;76@70M?L|8<57$bnRnGBZgg6z2j|=D60rTot_h6(ad zT1F=1yvOzzTg6!mHkw0Ca&R|X@P@(c%M2>aJO+c=e$H|Sb}Vw1zUCw9PFzKH%q3s1 zJaWAMJ)|!R%{g-82aIX4INbo(QDnO@sQ;L;>X2G!2kgkR29<0;i}DO2`cdJ?Ovd1Q z@vPF zsE(`6C(Y`S=@j}BR5H`%%qhXFgq~yfV5Mx%Y(i)B&6ya8{MBx`IrH3@*+__O%EO5d zAqi8Xzp0GT^W;ZOXT*fdOOW2>E~4X&kP2UNtwa=ccKmvH-Mys zU*9RcRq`#~DdEkew?+!#E;xL+Ckw;h0-Xe5>!N0KiF{tpj8}H##;a4;uyveue-o=v;WI-IB<%swKM0n%5A;!N^dW~ zxJ0(2`cV@@QbyDc?>IOO@h$on+)L0F zSa-Gwg(809Mmn67c7_*vz@Q{^R?JI5+N-c*>09KOUunFFc6OiQsE^uA21dA?7-+^N zYV+f%6`S^`{EGc{Bv;_Jci?XVw~60axXot=LXF2vjNm~H`%wTM2tXc#e*pueO!wUp zm>0vAFsFM6+CL5*y3fM$7)#BAX@x_*j{ynx-7l8&!WjWuebU5M!PolV1C`lUR7I+V)(C&KGbg-1 zL=)dHgyp|fwAA+{L{rxccYoe90c#Lb(gaIB8@gv$@7b^o2YD@ci9kWn;}wy?KTCQ$x-+h8B`H$S5ZZ^-PbaxBG|5?Dq_1~k@vD)ue~AY zcQJ_1X1nLWB4FCoB)bv6O=#Buj99XMphldjGrw*xW^QBu5rQahp7GbG8%qFga36{Y z;Q55vUJpH56MoE4r^ipcI{5_`@x#gt<35wBPI1N%L0|rHLOlf+QIHRTSci}q3>_yV zc;`*%MTYQ)Fz!f((45}u^2*S0Lcz}BswxATD)VU{M%DG8VoDBiJd#BGy8L>ROruPQ zH)HN1R8grX**V-vl^^qKU1Uy0Jkgl4tx{VoxEHH+CkM$Cm6e3-RHG(OJIS?+N31&3 zT#8%py1E1VxZnup{MZXCaKk&u2##bHRcsTbMj1{_X_SiC3Lb>Qv|05#yrWdI9H)v0 zA5FI!v!YW;hgT;eV*vTe}kLDqm{e zaf3yoM!8<_hQZ{qX9caTuRL6AW?3=WuO1!2j>Rg0Z{avc8)o(B5pCMadF96U7@I3a zQPyt1j0PQmsHMpjg;mxjq@9B472COEMF$G2#VSNOH#H9z;oLEG!C#h$sV5ClVS?=R z(ya>yD-OSO>s;sAPH02_mIi>kl6`xf-t1O5Gju%#>Fpp|rTLs`Sk- z$_frJT$GhMzQm%e-cMaOC|xp4GVQ$)M39pA3Hm)zU2wM00S1@-(ycS38qJx0$4?D} zm-VJa5YCO?qShtk=jkxywk!v}Mpv!R$fzqro;7EcI^tq+Y`Rky!8BL4rmJpNRX8PVc9lKY05y99S9!nH<<5vc4#h@g3L|IwzJJ*GUtBBKD}|RhS7l z4mc;+h=NrM?M8E=2Ira9#QLj;+oOJomV)~@Dw;PZG6OWld=xu;@AOf@(F9n4HscAla%fmgYuz3a8O~JN*z-o6zKibmOd52FqE`zGa1TylA3cpBuGnWd#NE>GniA6855kjf>ZGcduPhKLrAWWi0;H=atQ`#y03|FfiksUfIeNys=v9_NfLZX=7Bq`{(>^B(q6%;hQUJ?Lf?x;dlH! z6=rJ1jFya!{pvh3H5oR~?0YI+g5ngld57>fQJW`zW7Xz)r81eu{N7W65)*pZkK;AH zx{%Pjsz_WaHlKDA%MopF$Va>(i{E+=`C+eY{_S2x>WA<*K^bN{hEtEYO_lQ1r>ir$ zaWOuen?|>bz$TKjqgV5R$73rF#b^Y_#Rx?ZFvr#RmX6!L0R@+V_l*}yMF&bLt-1rp z4;+Q<8B-0&X5W?D*Qi^$E5twBa|Nq@6b@>GY4_aD9DHXi_CB8CwljB4qYaI3!91GR z$^M2@ox^Whjc?6w-KM(3=Fl%Bz+uXt+-r5F-e^HXJP#p-xVq)Et#YAk)vB{q*ejph zVYAqR0oP%81sF-Mc2>PJ>mwr2c(@Q8Hry*A)cyVI;$ z_{a8KKA%72a}6Z`yuvQvI|!Hqal9(PJ+M*Nf^ z7mqfo<$~=r>M4yZT*-hM-IjHGr`od0DNQ>d4q-Eea--xF;JLy~tI=ut>@sx`iM8h7 z2*F0ZV6|EekYTLOV!Je*b*xg$YCDB;)zbph(Xaq6+^#=10fn=$gXu^SJ~J_scbZlS z&)#S``2+e_5J~uH>*#C&PU67NaK>s#brw(f05;7Qn@wQ|LN{WZ#Lc?NAu!8>hqmV~ zyzpqT*0F$1_khHZCeVSvfq&usSv&mwS%Tg4%~{HI8_?|)=%meP;Ds6TrWH4(vn23L zD3(B4X<#I>R_pJ~x;ILzJ97fI^kI4?3~kBU5TiOe87gP>u`LXlzB4*BPo@cC z7`HFS6UTPJkNC(Q;bb1$i!5{uC+&A22^vsD_MNQ=L@;x3#vNl&k8%ceBNDl<|3O_v z7*wd%`?k+RWPU0dCx8nX#h!}B1}eh{_f#}~5=Z0i8x}5DxB&lC$&l!&tmpS(^4i5k z>o(Vfp4Kg;r;pq<9O56)9imOB;`}}69%fwBy%b+&P(`TXR8&!`IKR!HiU3R$RpBbm z6#-nUB|F}u0&fXEW2V)A%pg8)g}whxw~~mo+Pe2Zpmax@^D@=g-51Pk2~hA4Qhlg` z8rcc9mHiql%gu4)OTs|NW)urmnnfw45|o9&E(bj465k73T2o5$^fypvIOUL zCbKSPkVR70Cs6m6LpGxglX9!wbtMr4P}hXa7sG8*^?omdX#`m+2lb!8xxmRG?!qfV zdVhr}$`>)HTD}Y`TH^$&e8kT@jLmfBGYqQeygCEM5#*IrGGkFBM)^Ao+O{Tg%-!I0 znj*pA%obbi+dGh)bGpYBBR2vxkuxyK$RzEJlSO1Y=WikVg!J6u4WnnLClR$GMKR8b zz=OJ#bhE}C1KYfs!A1hM`6cL{fo&dUP(=s>iYlt>cprl*f;lLv!q{faPa|ug_JTIi z<3xU!L3*4v_m6CP9w*Wh*nCXt4pmBDU<{QYB}Ek#*nEpY6+xq!y!s)7Dmt&oz~-k6 zvPjxG3}7QgkQ5r|K9j2V8!sO!pjY0B3T)0}P(=VXOiz9hgDQgFE2?CAu!M7_KGT3+jydPnt8TS26|?r{?`5o**firpWh6g`$e?&5RKfM5m~t z0-yIVs3NF2lUE;QP(|kz8TfpfK^94AhXH(~2$Dhv-H}rD{+kS@5oD=c78UsX9fK+Y z@L{_5e`iod=T#W^tTyYKv~QPDJABg!-6Ol`pf)=glFUug=s1I;gP{vN5Cgv?)^=%D zMUy@2qtENclCN4Fd8Dx>Pbr=XpiXbUo z(0wLV@88W}8bOxIJ5dqPZ!)MNARwkE|KAL%=)4Lep#IjhzQCX@JKB+qOw!&sN*BhbY79+ z&I=f1k<@hp)?%d6wiU4<*&it1dRMC0GgFA0#(3TzU zNJb`UZ=7+_;m){#D}8LW(ngzg#0=Ti)-2th(o zMRhEH%Aks1EQ+cy@)<~$=dT!~$LV_ixF>s-=NnRYs8ad~W2givDXOTjXVH~()J)K5 zCa=~qsG{?V413OIkVVqgVZa_Kf~3Gf_nB0^e-?vj1X(KYM1?)iVNgYYJxou23xg^; zuXwO$ia}d;*drO4q`h&*MTb3G1ZL^Ek6weADCpS`(}8X+Ax~@z1Mu9*U@yUVk3shg zz;m2I6(Kw*s;DmIAqG_hGf`9x1@OF=L3*5)pGd&->r!{9Qu+jAs01k~s;GeHPZ(4Y zG@8k)KW9)y=M@?7e4jxUNn3{jc%%rDLI&MuQuTh}FVG=1L6*upQ31~y22}*W!}R25 zF{q;RiU)X}&Y&$j;E{|>(%v}Zq640%1@KDZkqa8YMB&cb@Z-9v#5&R22GF^N!B&FN zUIpDVfX>Yfst930QAKqnhZ$56%tKKX208;;(`qq@kJIn|q0Ru-wCYlQsDiqmF;;@0 z6jfBL(`8UaP--Tx-o>Db&MPw3`4EFFlDZB9>qrqKMGLyyr0V@=8B8O{QaLCp*7-Vv zDgxGFI`i)_sG{?Vhjo6!pe;Mrk&H~z-Z_bt!`? zIWMx!WK}4pb7m^g?ptf7-uNNLP$9gMctaQal7lD}27;&S_pemaL zvQMg#1aK%MfJ3GL<`_ez3xMjy?q^U%w@j)R>oTYsKCj-zpo-3`bQ4-CJ~3iy)`u8$ zWiuj0#mVqvzt0#fT{Y5$5cOkUVo;S$1jF-V+e3bAyQyv8V+@rp0IDDR34236Um2q%1-yb7K8y`4c7 zU4m3z?PO3z=T*8Rj5+l9xeT&Mo^Tk6M+xbYQaAKO1yz<)45kresZs*e#AA~|6(RA+ zOrPAtpo-2bUgFVZ(3U;%C>fcgy>Z4xPdx4v$wAh)>;4~mUmhS=Rpp(1>4YpK5Fh~_ zgoNsl?kpfnAdnS^Ast8{fH8Ket6z85OLbLKOOghHATDVvMWGY{7aX^7a2ZfXWkyBE zS#;b!9A_NI758P_#(i}B&bjw(_ujXi`|5S$%=90(Ue|kd-?`_Ud+zU?a~H?Bsu9P< zL6tg>b2m2l5n+IRiw4sPUHXksy+-WuJsMOI1`V4ks-gL)233U4V^bx^9#7vIb;O|~ z@VI#6LZucFn0{WPZ9$zQdGIlSqEs%?XG2siCbaWijfN9c&88|E2~36a3Po}JQiG~= z;$SpnB7hh$J$q}W5Z@L6wXZMHpo-Af!<01!Os~+Oimt3wUY)N&6`fbnT_^xdZ`L4- z)Q7SF(_Asa;0S%>rOI-@2Ga<#w8uCqm@aBiMF7*9c;JWzRdinIf$0}%(3T!db4G?~ zZ&2r=gXxvNOnb!P)gCaC0o9^_3Y@1oZVr4xfX%PhU@xKbJ_OZkz~*;oP(>IXY^tax zkd^)U)N|VK}t4NN~ARg@cdYVDuPC9 z^6K{*RMB}w20R_x=t!ERtyusbE`qQjgKjgadVh`v(+IM(trHdStkca*Jvw2P&QRm(DQx`st8K0$*aH9po-2bGU)ld23aI^%>wjr5rhpJ zbhAm-`~T2j8bOw}fue$*|I(m}0D3fy`Rwgiu77FpVHf+dxr)&c`*VA^;stWB!x|RdinI0iCaF(3T$Pa7Kn{ zZ&2r=1D#F=bjkvUt$TI@;`K<<*34QpNP`w89nRz80 zfD=Xun<}bhIZ1;mLT|CD$_V&y}X>U;HqN5@{zu7!mtoK&Ry=Jvq zsnU?pi98zQuRugUK@SLs=cO9VC3M}FK=m4k=Rpms2!n%771f};O@k^zC$Xu@2=RPS zgZLmVA6LZlKCV7gL48`Itpq{YR8bMnziUuMP-;zHeP4qrIK{#KT1p zHfGSxCROhjUY#k@w+$2(@tmna6#?;R8uKmBM^F4dqdJ>uachiPw6=b|GX z9*r5Pnghk78;n}LYTV8yG{??sp2Lt1|DgzRggXMZxn6^fgid-bRIh<;`ZTB_3d9wyp1dZ0@ z)#Dme(RoD%Hcx7hMbg$RfDIQx*w8??nN+?1k_OWVvb3!e71(@FgDL{B(X`~h(x8gY zD?MN{Z3i8orUy2hkzv{!)Vb)uW@T^9EL6=pq_&C>#No*1+I)Q|DZrWQuRugN;w=H< zoUXx8LU%nCs@H%x=V?$y7!Yi#s7B-x4XOwo!=_4xI13e3aD*GTkCVE4>Q0Ro1gZCU zBAu(a3Q>jCtI+DaDzRb3y|pelQH{h$U_bY8`%D_cb^45j~|K^93}vjFB?UBjRaeWa(F>2GK- zjUY>VOr-+zpJ-4;0OmGTR9^i-gDN_&^nm%CXHNt$=Zp-~-k{D!2j-JkIe5!b)X2N_ z)~S;wHQ`agBAlba6oMKVP<^8>Z@nAdeXNzU9)nNVK=D2Nqdl!(e%P$minyk7?}%9_ z4iwGmUbCLmCz)yg+T|c)ll!f}tjjc*MX*m7GiF)J2)IF{ZSn?DgwNKXiZBA&R8cL# zO&U}YEP+jx?1?N2PyvT~alXi0|8GSWTN;fCQtsqV$yp=$!lC?Nu{_vabF{kFEl`*W z0}gOqqe}G-4Mq^8YEz~3fS7Hyni^CQdVnUc9@3zS&MPto{BsSmNV=Q_2IL|L8%60h zma6w3(_k7wmbNuh2JelI?Xu7D+9;Z(&uLIa7`!zt|5r7rqVq}*1O7;Zw)DYS&d4zB z4eDHU40wilc(~U^LX@nt?}wtg&GFw6fY9`vbSO>eq?4g~jgagj4XOykfK3(EbeyF@ z6`?!WRLMZ7Em`ODHAoNA=H##^eb#vm*Bz>quF_~KK}t4NRA6(122})&*5p+|gDN_& z$iU_n4YEkungy`oA_yBA=r)t8_b=688bOw}b)o{B2Q{c702@t9{x%J&=)BScHt*A* zEj_T|j11G>pw2}HHkTBKM=I4i>?JXr9~l9Mc!R;ttI?{6K>$LZ7jz zlF`rE@fzYtJT59UO+705_Zn>q>I=zX5ho&5z~?t1S`~Ai(1L5|NS~lpHdWDM{j#X8 zE_%dgXpoyuG||LmA~M&o*--)MaOw3LJRplK%;wYW9Mz&+snI;TMWG^=>ouq%AQnyQ z+owSlomVnqnc@w-Tto2-VFVq~pesFE;YQLBZ5Y~2&xB^A&;ChIQ0(UTz<}%0(}o?&_}QiHhqf69Fq)tiw0E$ z<7ZPvwOQ}cpo-8BLuAR$z;jMBjvivwBm4eNgXEwt6bf<_Z@L3c0>FG1_M24W=0}0_ z@T4cfsAAlN)`?dv1ffc{}l*vyLu-XGfth ztstRU$KY1;L=|_ntS6^Tnl#jFJs&H04BvPsUi}QU1^<0<%X)!xt6}{$()uscpm--< z`6%SgIEEFx18;p79s+apLilaxT`im{@Bn-bFM17p9Ke|a@IcTV!qkH1OtW0C7R_1< zEBq8x*u2me;x=+>d%O3chq<*<9w-hP`8xc%uTeKUTg_F`&vyIjZ4LGI)LVJZjiL3t z<^QR6ujWO#V-UQeJZMw~48jYT)O&z^PlYfkXZ@>qr@6$}Fo9T?;hRC(d<<_2*#O6? zu*nj_9bt@^yUQu_2Q}a@H=?@*XHcbn`sCzZwc#zc%6jtXIrZU)QXy8LAAM zYpRWM*{rTPQmGzV1Dx$*kpuCHM-$e#(S(uF4XFfz-O&1q#P`6sJav#eQ*CD)TP?yM zw-l-e(y4=7mj+dYLC&TsW*me5Bf_XlHK+_Vq)i0Wa>d=KvU$sxg$W_IJS!goliBe%S05 zow_7H5C-!%3bZ8}%mcxt&4n${01gYMVZ~gmoC~iP-V_eygS6hR{cZ%I3>1hg{K2nqZmZjy5^z8=smSDqLFUq%63%3B;{Nr1u2BFPTL!fJv@ z0L1ETp(A}>Q13(?DGe(Atopj<(eXmX!9ogz#-yZ;fX7je5n% z8~x^pS?)K>g;6$31mnpa*H;YKl^br_D=7+wi;*GB=KINN`-xF_9;0vv4{kbm(5Q_L z_f<+Rdd~5j$moPoCB`?N6VVB*mCHmYVLEG(=m$*RBv#lLQDI2TE(+$a01~(gAf+I9 z7BZaWa#gTwQH`N=M8(DUC$Fn#31rDyH~)rOeh@sWqxs>HlDR>G7xTosA_s33 z>Q033qB!U|N?t3bg|y-!7^<5ml!|q;nlJVCl`4fpt@~U4Fz$<3)g)7wc!~;6IVsf*?T~SwR8&?kE0qeht8ARj9|HG=(gwJil&vn z(Pw|#;o!azo5CF2Kf^2L;Ib<{2iN6Cb`I`($HY^TIxA!RTD#7~?(F##ch;#~!;4+y z_hQ|8oXpu~h$;ImfV;L;@LAn&1%v!IC~hxMk;D^7bEMT07WqiRzX?Wjhq&;6kWdFec&l49sPF#xWW4ib@zwK?qh72@P9&I8{JuF%@;rcdXy8$y$2huvl$ahuJq;+y?iH%t5m zykb7qU*Z)r42W;C$(mgV^E-MW$7=VnUfzFlokp%$2KTnVQGy<*q{d*jSdbGESXZEH z!5YaxIBR%7bCb{e+7$TOT&>c8^Lm{>Bi?-Zn&wwu6awA{zf48Tke2n$-df2AwS^0 z9gm)bJR|V+4QfNZHH_r$H3~K-*Nw zvb1MWiUN;D+3HTS-_#(T1hVNf1K$P;?wc9dV~@$+tiZ2v-Jwe9*BVVFNXe#3(dZbL zaQd}mV^47jHF>p2gDN_&qLr0z@+ugmvoy#`r>%4SC?MU63@(Z=G)lIeVHE|nR~h|p za!3Dnvd%=wX(^R?D>CATylIM4Qo(E7?w48b(;oNbY4X(Yd~CUOoObTP8~Y2NF%P5P+e2moNq$c5A`@iWURdB zC19o671MGSZoLul0E=I}9VLSQ+6%XuO9DNPTxUy(VEF(&Z`&Bw>N;-`5v-gV!rFec zUd1iS-5h%7dE%XB$F=z?Og4uJ2sP2w^4}2n`*DE`7R`zCO{1nu z9KdAXg{niT5X`uaR6c>U8)v3?af(t ziEn5+Zl;iNb-oms@o(*A#+@!Rz5o?N+nLup#mI>>R`90Rb43wYp;rDiQY)u3HaT42 zud=@r+W6y$w^7iT-Ju?E+xSD)MoJa_frQWZp9AOinMX%T#X_;(8f(ske_>s+$rrx* z*Lhh##b!JXFF$U*2T5S2^u2JUx@|V|C5Bn=$DjE_Ig|H`a+!HuxLhdBR5)c5lvuP3 z^a-S@P;^OF#4d)4Y4Lo&Sgon>b2ddanOIN7W~32obINK%>;(9Q&;!?xuYov zHo*7Xloh!fq2lqA?3T2WwZ5)&SZQOEo3i4REm&s0CwGe4g!e+NH~YnOVLs3M)DEnYqWTH>za` z_qg8*7U0G0RTK~O+>I5d0X>}z=0MsQkB`B5o8^iDo5B?P?R2qGtU*?}QSNt>J2_>Z z@yvqUdGAC|5*c#ask&5gsc!#Wt;|18o{|pQz$B!$%#+evLSFogNlSkh6~c{dh*}+j!*iB?TKb#n z>$2U)B!vGFiD?!l3eY^!;)gyZSk+&t&5a8Hq)AQ(aM$`JlJF;yoSwUftcsN6^em_z z!URebJSI7Png&&bD7Z}(HSL+xpo$O$x2eh`IlV!HbW)@|gXHvuTz9Ba>d|N_K}t4N ziblsIr=P1q6+xpld1Yx(Mdwv$Sco~30Re)e8f2x@);1=mxhTTGDIqz{?Lk;YLG4xY z$zF1L8nBe+5h#^;$?5nZFO%f-pN+d(q)$%2p7EW$`PpA-G?maXZK|k7?Bg0#5sa87 zub$GNiq5MTBc>jX`*jVnf;zQ7_&oGZUj`wI7GysS876BIg(OO*0$SA|Tbnr|p)MeLzeVzr(FKPRN9N3a=b#F`*Q{o<@xMU`u^ z6!imHk=ufbX?~c$!%`*tU|Pw>r>NhZ6{l>$2BxU-Ua0jBO;N}HDlSDGRf7U%DJkks zvRWt!I~@B{ChSgPRb-T+{z`<*CGT0l`*JU3~2+|8Lsk>QPJj`;_fj{xj$PIl;h`{Vpo10|@JAk{^HAuprL2K$v7q?5ww8Dy|u#&w4( zrMGA_l^`XXDn+AXGT86Ypo*Z;n!Ng`232%kg+`6SGT5KhAS<1=wlRavMG=Nw2^nl| z55g)6YOj)X_A=P}fu%HuL8;8kV8;)6at2#xv&Lw(iP(Vfx8trpDK{XDUG@4)COvW< z{Dd3GIMX6@Z<{KrDO{>S6~Pp0@~TsVDmt&Cbvj^?_C*?G1(^na95nMhI2S=G%jM<4 zV~vgSo@YUCX?GrcH`)}I2fq;|g8vG6@BrT>C=c#)40ulUBCOYS1pz82&x2p;=E3ck zYp1|d)g<^{2il~rcC>07v)=&%bY@(0Nj*ns8c1qlvfovK3^8DqDiB=3idi7oQ&RNZ z5@)~9au#UAYNPDdWWS`n?e`MicSFU{+~9;a-t@Yu$o1q2ZW-cV9icao)`1n#k; zrVQMdSQQzis{REVzVbO`jDlE=(zgvx0U08Huu?CA>_`{O5 z7OtD~;2e`iy;!Psv$EBkx6M6f>zZP%?jAAJ{>n4(POQH_rk_JmjD&k1}xUY7d_Vbth|7g&tm0;th|Vo7qjvbD4Sc8y&n%~ zSp)l|R|gx#ezUgbmPWB~s0Jr_*O4Y`1FP^-D6Pw|cs5XS+}a42AezhJW7mRntO< z{G-7?j_{Aipo(Lyob?g-*ZL6_pTXjbSWLyu5@%uYHayh!9ay~c6eu3Y!aN-c3yURZ zL9q;rPo53M=dif@94L-s@o)}`H)3(wDkwH%aiANDJ}iE)4vL>(vGW2buEk=`g-|TS z;xDmy9~QS=0>zzJOu^H2@=VkZXRhG`btjuB_4TWnH0`sWt9^$qJ* zXcsW%cK&e(d;quZ3VZ9uRW3VU2o|bhVTtYo9 z{_$$~=&>H)|2)Y4anT6~3ITz%*35M@Bcqov3srJa|3ZugT4YW|2-mNS8sHbb0_AtzIO- zZRBPtyFJTegg>3_eJ$X-vQBe$p;_pGBH^~{oA7zIIZJ$V_Dao}4m*%EU=uF8E%HX- z(rr1PDc$By9IsJe!wczbpk$`+gz9PFQR!J;cIEc;m3i5fSb-?G2#1Jv2RuiR{Vd@5 zX1v0G?SLn{wh`99pmAX?nXdl_g=o%~Crj2XGty2^-GG-3U( zaV>hEM1Y~0v{Ld{B z*SLR!juv-jsrr^ct+uW~?R7P}(brt)Q8!#HH|k~(eQPE9)(Z4}KM8#S?@2~s!}fK8 z82Lqbb6^X;2R9m4pm+31xMlqVl5E+I5`HsQW9K}91A(_JJesFAp)Lh8GYk;uzvt#?wf(iRdRpj05{5OPA@T42z&1@8$k5__=6Xumf zjDi>@@f%i>Ll4^z4^{e^Z*RKoU=BUA%qI$@0@ofB`Gs_n>g}nw^7aU`o_BANY~DGS zV^bJJz+tiN?f4Y7W6`$a;bIL`Vaw=q%xYzOwOXkPM_PGwcLzP1ur2iY!M^u~dxpM; zf{62&m;4N^(*r8Xty*>HNWMB)>vT+DPB}jI!u^*mubW5f8;o;Zs?NQ9wQ(6lo(jFS z;vmc@&*Ldv?qkNemtPKg$Gsl=;Q86^Z^hj>uXeTiJ0a?vvwj$I$C4C%E!5?p`@nUr z&FRG&=x^(|4J&^D6*G-&_ENojw>h;4|K58@%#e$H0u3N?VLcX`vB;)JEV&YnRP4(a z4)s*(+suJt+3dG_#pvm&H=@$ooM4@TM35y1=1vOiJdXL}u6W2Z0u*_r+FUo< z8X}rB!MOnLTCYG7!h&;F5%2oLa-jxAXxAHb+NB?*i*J`4rJLmpg09TuK%MeL&iaEC z>YK7^mHTt%<=__rAKpvngEe~wj%X2p^Y?Ca@-Lx!&`vpsID?PxB5lr>0(~FTppP&~ zo6{%9F`~e!Vj8?K;yYMlLwZFZzm&?nFk-C6C`4QEdIxCatfNbyUyMQ#5>Y+|x0;KC ztOP%v0f77Su?p6|SRnD~8|{CcKqB6v5^$QUlxYWM{ASd6|=@T)tG`cS@Z z4CQOM_4a@bH9G7^`Z?Z!Lvf5E9GA0s%MK}6IUy7X`u|;ld*V1t(KK65UO==Y%jsLf zn`kjMyLK-iDhi$ZS3b=M9gUr%o?VO@zQy!^BfTsr`bWHCK~Z)U9~5O?wdcOF(2U2A z?7Y9lJIej$(cO*u?twk|@}Ox0-Oiw1*d6$6Qj}ZI8s!F3rvq`%2&!q~@$IQM`K^}N z@5uP}tcc3OIxzv?BCVl4D%rT>;oFl`TALH8O<9853)Qw}32p;eYds4|2nDzE@U9=+ z23rte#Mq|OD1Brb->3;fwl~xHKtZ-QK=rAR?VtvI1Z2zUQ$S)w*i`|e91 z9J%JpM!s6jj~WdIWZ~aRqux~+=&B-G0GJBsK|-jhY7*>5Q)rDi;!z~8AkBp`-^PSD zr9_&d5IEBGNh)+)Bp}T_QgN(1h6r!s30KD(apur)f|{uvj)#vLuD&ocD{7b8p%L3!AIE->%jmIS42F z7ikI$`^h`eDCKK4SPo+SHBJS&&kfJ#pcUcxi{Nc=7AwGA&)fJF*KN6b zwk6+jorc^9`Ho$Tp(*kmy&Cipa9dIVaf#uF>QqAYpwr1%I2C&w8 z3P}j{1s}z`eqS)yf(RqVH*^}M?+wN`O7;d7{HQp9$`d*>YJNrM110b9bErO5-eKBv zK(;PE5iLxZQ6L~pPM-qS^gMwdv&M!|6@&;P@(!^YqY(WLczyd3ChJ@bVV;Acz<(Wt ziPs9kd9&RLxqW1oK~D8VsZy9H@y?FwA}gpg1>X zIDgcr6>pWnW;-ertVpMZb_VHzf;-~QBvHpaRE5?6lU>D!Fno#<182`_9gmL5)uJR9Sbi;&3Efu3guwshjL z=YF9_h$90Tdln)p3p3~h?1{97_9`m&yiujKIidQLWg_CJ+Sn|?X8>=lBS=Ch_`DYH z`oU+284<>f7wfc2AAQERYJ$+`!*o7S(B}hCeJb?%b`AOn=#$f@069JMc|U7xn6U~% z9TDg=R$~;RuY=dOAAPdk#n9&`P!#yDgFf+EL7zwPDSv$Pdi>&lDEj=2&^B=dr09Wy zKKII8{3qc}Dbc4W5{^E7atj?N3F!0NNH0U5-@z+}KG~HX`t!KCgP&_dCc}jPBq9kEBp~kmuf)MH^Iv*$q^)jeF6+-RNppSr1IeiM)(?h5iv&M!QE+RsW)fk27UqNqZ zKSE`Fj3LxAiUR+25Gr0P2-VkP`Q{$K#ZIb)P_JO|(V784(S0yIv})ML3e=3tHyUfZ z&+lHh7NeviCD>ZRs0 zO+{gFZ0eI(=x9m6ruQJd44b|buNXFES9;jg<41Pbbm6W_f1^|pc7a(Lh)C53lj6`@ zvc{n*X*%e0sZ!0vW6rk-Js>6Kd}l;uVWyjaIg!@TUPQ&5Z&Yb*PM98Li8Mc^HZ;p9 zXaHZWk0J@7Nb@1Q>qnXaCPNq>KBvmJ)D~1f&l^!zm_>mnloG!s_xKMs9DJraFjS6MLbTHwm zQY90Q2%jxzzSzgeQOG?Jm4$U!0wP3OLwgSu5nid%+MFOA$`TI_s?E$24+e168bA_4 z@!%DB*N+DkLm`X_4W0Jrqrv$0Ob{Bpht3BI8hkNSp9&4WMuR>A8szjTz)BAdzJN70 z%s>&*V64U{L~nxEw;v6%e#Ow>2T&CFuY(5hT0w&Y_>@0dwiUl{(HAH~;{DAo@T0++ zS!QSuwp)g{W4!_!os}!)t`QzyGzJ>wLcnPXdQ}LP;zI)c;>bpkwSpeE$eemYcvDLB zD6*ZSN1tp$$3Fsk{AZ+>p~o-a6+@5gN)J7H{KyVHuH6G$-WP{?I2zCHF>-9}C!5uDv$mm^u@ONBBWfVo7jB?l?>h8eK|#CmVTX~t3dX4BL8 zDqNxS{Y2;zV&@~n%3nuR7S@vquo7tv?N(G+`9qb~=0vGZmbh~60srVA3OGb2X)@XY zY_;Yf31PUhxj^m-;?@T0Z9#ue(`lYQ%#3fI3^S$Us^m50(rtN*0O@wiGSNN}k;_zBQalSsmbH?8j z>=6aUDF<4KUYdLume74}Kw@3&n8-Q=8d?Q=eHWYKN2z;+H_?>IuH9Q@Ei#K^FCRxk z2MHT{*#lwl#>7J}vr0%S!(GF8#c&t9(!*UIFS5g3{6O-p{BT8khGB3%m(42>9!!d? zGS9=Qr0GDbif#Y$V7U|=z_!h~yYek|y?_y0Emz~6ZE}IDF@tm^3&Qy5bxy$$DV&4cn`v*GD zC?M@`p?bg#)E&9Lpg|R3M=qNx>W*CB)S!xB#%!u&xV<1;;P*%F&(-1mP(0q^mm2K| z3S=hVrt8$uVXoDjQ#A)_BW9sEP%N~@nzLbNE=U45;G}lz3Rs>TxmDNCxO!0qIs18F zS%?UeAV`}kMd@!BJLBZrMX@Z=po*aMn!H+}K^2`>(VDF8G zJmlxge8>xLO6ehsOywT3kMp4ro{*im4e4cG^6hxVykvHz=Ougm$j(bXh3SOt{8q0m zH3p02?feMLz@t04j~MiPQlI%~*4c>A7HPQ7)=N>4+zlA-6E9ySXn#s4_;nGLg_&Q% zK#H`6_8_Vge4k2dbE35-%Y?+^YJ0Qvg#*}YJ%%KN`og|Wz&*Ket09aOPwF&G-zAQ1 zm@@u1fxz~U|BPL1{Qo>M0RMHyf4o-4e;@OCNtHZ*4d-#utl?x9h9rwp4RxXgHGvNObWi~Mb{_I|O zwcG8*E=7)dFN~-xtbY;)e55tBvrq^887i&g6!i{Jmn=v6m1;w?9O(o2YOO#LLPvU^ z_VbZGz%mHKzy&%j(jVeuTcix}lYqeX5AlpoY>2-K8G!#fLp)w9L%fgce2AYa@Qvc) zcgjON?m3Q&R$zi+kz4RUN1yOJLBiJvl!{g<%#b7+=%--C{(*jn@TQaly~tob(EFqi zYP$#neF5oZ1ARYUv4Ngl=?(NAKe8U^{qu`j&4__sc<`Au&=3|L>mei|6g$-Lu9`6y*d&ZBZ`Wy&K6Z$2k(@E#lHMRVNjLRqtF!%;`Q{5J$TM;dJkf^o^y?g>{hq{?c3kE^MwsS5G5+c3b{R8dp#^E9X; zbOudcEz_Wi&>3v1qIFwM!LQPwDxEr~Pr>u1Djq6518N4q^6s)s>GHl#BS9m!V*YYyRjV069|2F2%U&_|dm!Rc$OoKjWh zO_jJ6gf1CC5#1^8slzYYA4g%Bk;PGNM^WIvP8ONxBDvfHvJL)6Hm3m(`Z4hUM-Q{$WS52EVc@q9v*WL)lJEu;X7uF*2-BAz>Vg~!Hf_)<%ue<#CMN5?+$on*gzd*|7=BC0Yvin8#W5Gg)JYt zx^2=CjEl>+0NR!A6|wwV$&ekEJHZ_Smr@4K#2&>1XTEM1>bMgEXMch8vcTD+c*O!| z>`E_i=JA6VR%p)P-Ku3R2Zgrzd_QQfwO|_R_Ci)(gkN;-gW^i||5Z>PXjwbp<5<1wfJ`^8%9HG8qR9E)vOSXhi;F&|H1JP8XtMbqMkZ{i6#?2shf zdER0h*5eMJ7TXvU_hPcx7EZVh-(t)6aV?j{mVn{hHj7P(!z{POlH(W*w^$4v&AEl6 zK*PF~Q+Yf8xC1_*b$9ZQ7x0f4@{bqukK_E~9{AWf*?K8{OtPBrVZ9uRW6*>5w5m%@w$0ij+E(h1diYPgCC-EBIfwOPx0 zM$|SqwX_DuO8NJ;^x`;K9jW&Xx>(Yzvkl;^^>rj6G+?z6yPZE^wJ3;Df=&O4PMh>Y zR`G3;LsklG&*ntEX?b9ssKzc72^XguK|I0%`#tCsZOm3G z^MHM<#wbMNSk!)C&-xYv_Ulm;_^$)(@mc})zMjef+GgyWu7**7{ptQaT>8QEMQrI8 z^Q_SKFVfJd2rRl~DKroVK5G*;)t?BxKzI{PH*C&&D}zNw@;Cap9XhfR@LUhl%kbQ8 zykdBcUFqRDj~{3Ro`>8S#$qbsq7$+Bb1c}w(vKiQVn_XLM_j~?UHJiCu}!Y;MTEpQ zHM{_E5!;~V-|&hpm%arN5}Ou&Cn6*^HS8C7#d60(h>#Er%RPnzxn_rVPF~Bj1pF@C z%UkaUAp;cpAp79*8M@99IMV=xpIq(d;}uhTyrPMo0B08i1hc)hHvm~Z))I!vPGRM# ztUQgCOQE!uVR1SX0Qb(|A7{cxk7cm(ELNV4H>OxSpt_yYt>yUNbn6^;YXvJ;LV4WU z4)=$SS?9t(Rt}3!ELLH0p8MTuyz0WD8;dnq?7|lNTu3efHUapU3djiuU$~7 z-xHs_PIS8Ae{R>f#tlN3t@VWs+T4JtZwb_D>l$pZtI>_V=0cCU;bOT_H-qR~E77-B zpzlZ$`U2jQjKYTPzy&dK0Nxzfg2Qm5VFkK;H^D9I1|-?Cy+8bBtY&d1klnIQgsxqi zP``_rnTJ4H$6BCRXQR@!pzx^;bS)biKOAx+XFVd`Y0kz|G^+z}5`!pF-}l0Z`X*!+ zGj^}TD^#3V6d5t1q9ya2)#jFDj#Yo9P+Kz$yS%~fzj#@6TG2h+-{PI*5rI-**<)fS z^SJeHAOf9zls6cCVO$VLg62#U0)<8B5(nV<4?%^^rF`w_rG_{8#3iQHJdNM=t;_Ll z22IWpiDv9=9!SO#_x(O*z|vS`50DJ;QHXT9&vbiaaQ5S{y%pe%Po0{ZuCG)|HDdt6 zr(hEfVI4<`5Jug+Wru+))gXon!A~|P2Li3O8rfk_7Ks&ADt&c=CVo_qZ)#2Su-%hb zu^-!sLdimtK82dpmG3L|)+=l>Q?Apa))diNZGeD#p}rqfdo{-KK{vZMmq!nD8eNwgcYs|O z8D@N};oG|*WDO5C3iV1Ab@z7li7R0eeP6zCDCG7YvtSkvn<001F*_7;bNgX18DaM@ z(-3lRFC#eQ<_+bMYNcS-YGyxw0(N?K4S3Fy!$XUMG)3&3!H)BSmof9tsI9Q^<)9!GOHIb;lZ9C^Sj&u8)Kt5~#sTw&JW zV)H0VN%aEO_ia1gv?!3)s1;01P zqxc)xmPOcSz1|Ex6$W8vIY&0Cyr2(S!%)nBV7ro_m^5+Dx$5hh^=yr9Fx!1|9yg0y zfizDJ`-MN+8upN2C(cw`8wU|{mVUrBfVtKgNCF?iL0jd3>l~l*Ihv-#T!S7`cg%6K zQGPBtUkY4#7M&}U$$aaedT6RLe`$l;K$bV1yg^LXZq=ZQFn`IWikcm|PJ=2!cF3km zo`b?>3ppMXb#hZdgXAE;DEVByxXDe;MFFFJD{^<7UZzB0aRoxKopV@@!bN#jN_^bg zaHK1esvssRm3hJTcx&;k(?l<5Uf9qSts>L#XJTi2`MB!{Cn9RP=3$^IQYY?V+*b|D ze#x-x7u))08f_&Q7MrSQ5wIR27~#Lvpejhg+Sf}hZ2_#71h85Zz{fS3N*4gtvOlFk z6~VG=s>RnesCuTVg^Qi}M5)OKM78*ZMpMaZk;?FY6YMYdzG7{)@}8N{I>)WdSx1*Z zO`}i*?~!XAgImF)r1j(!mZ^9?)^HZGjO9h=73_cQylC^3V9=cFY$@4NA0*|in=MEJ zuv^%P7da&`m)p*rIfMI#hV2{jsfYG=u)Y){_kLWO{AYsET#T)zIZJ^qz0DFg&^ECy z5EsHip=}_9>%|zTFSK!U=$+?@cbYTznDs`rEOFocR$y+YKtLi-G>W+gfE3=cl~^&$ z>v)=n9zt0p)@`7oWb<$1nzVtd*D+C-l)FN!Hng`@Ol2OO3JtmlDyC&vZLJ#?7!#U7 zkK*l3ZWYTJ6;^VMn8P)K%{UhMDBKZvcw>8c=xN6FSaBN7n77Rhy^6t_XgD?ver-B-qz@(IR63s+g?4(9R_PVB49H7PV zQKMpSj+F?%WP1oZ%7oOObCeiNBns+xZ~z1LHa^Abb9lw3Sh1`4DON1E&IHNw zb<9|c5%_G94(mibn<(3`JRr;@WgBXlrx`Ag3HOC~Sx&It7%7=NT?k_qED;)qEW`Iv z>@?txkR@ys#+;B{l}a(ZFDBp?w5DR%`V^c%HdStb+$_-OqaNpKstSIV6P z38T_u=LW&CS2jaPI_sfIFA(8M4o9xELx5!=ypo z%pXj{$jbyd(OjCR3XPh81l2l$fYe;|(h%KPF^g<@DvTay;sn*kT&><;D)u=uWSO?E z_EsWD-xo?|zHIjQa!qy5$>eGBlywPuxTU=u^O9dzK*cG8y2$j<&}N`xW%mXz`E?$v zBID#&Z+m&@Y29Z~WDG7%6!i+FE3HH*6$|x4y&l>9mP-&VZSVG1qNwBtZ=8gX&IKziHWK6A(tQ_zE z6J~*&2aM7U1%*=bfWyF~ltTtu%(e^}8V&LCfFceOVTeY>ULH_{%kt0=l?P;oBtae! zpW}JJALA9v1G1}UZXVFh-@y{we3B(cK}!^cN|I&(o7VVbtgvBrx(c+Lu%Ky+CS36J-V*Tp616>9rW*s;XPt~Bgr*x8$Xe$%P2LeU^htFklbyq4s_fRsAf9kX z;8Yi#QBtw2yOy*g9eEd%h-zD6mNh-7(O80Qv8jp{!Yl_;h;f9sX^zp(t^4A*8Zns3#1o0;{s3Hji7pMrrNI!ccOaL({ zpRZ^%l`a4U1jMARe>g5wQ9;0OHK-zhfJEj)Ro0nK7lq!Mk$dFYVj8d^y-!Jd51-npP56i3g{#y{~ za{69Ydr=JweMAfghd6&}LR>}lby?2}kk}tJwO)DDzvy?qd{?k)x2p}yGS(HqN9#5u zAvD&tB9YoT>ZVM(r~O=wip}7!ck5?fu=AzB$@}P>q=X}04%KVK!XD9}ihy@)s;Dsd zT^dvoV6aV<91A-=(sDT>&c!4mr(rFk=l!HcbAq5ja{SDRNHrh(Z$cC*CIIr!8f_&g zlucE10AxwX=p#zyX$?x#NhOr7Oav9O2X-9h?`}Ye;J=Q)yHLVXK`yTk&Tw~b0PAz*N^yD5zshz~*dcWG z3|n><9YZAso|wpI=i(-?K}bcb1_9P=YLiwfZm)@K@w>eng*VZ(%C6mWdqt*mx7R0` zHn_bvBDu`%y$P?F+sm%>++L3z*}1(J_|(_ltvkuwj+H?Ryw$3bI={MG$=){4P^)(DgLXtL-cAxMi{>Rq1Bt-?$GKzcW-F* zma{W-z#V&EX!XusXIE(TmbfSM0hnvTHp=cT!?~5-+>~+f&2JGpa^}AIu=={@NVb!R zR4t5f&rb|`+V7zUJs{ZNJJl9u>7)lR)OtRW5ay)c)CoQF|GFXHYd*FcdXAZ z5H<>C?0=2@^7te>@>4?jKB!(J9P?%kst8V*O%*j9^SB08 zgm8>al_bTRrh~S#f!Q0j|FV5>T1?jt zWhPb(RnHk0s;D|Uq(K#3XBA%EF5=e7w~IP^Sc59M1gX4wp$1iSUd4>OYTE5S4YEib zT$#2uap32z8f~R3Mzjc~GuKm8*!ODCMUsJHWas+hc-ffQ7$EwO8f|X3EY6Svlwtr= z6w<$F5KI!1(oy2b%LKf}V5c8waDgs1s%`y^23760txIKP@{aNv2374=p;KfPauThg2EAH?)N~pYPS`{!&|he@KYIoG zfCg3BE0CR!7ZvF5HAro@0y%_DgaUm@qy5<{(DyW`YPSL@LxnqSL)4&OY0#QZgCZ!K z2o>r$ME57MSD{lhsA{(gDIT;quRzqJl^O)6)1x@@GEt_OK=TF-F3^=p3F*dAb@g~q zrOb?_&%@?f`ml&?S{IZyFQ6I`0}r5R~XFkD@C)8ReoJj7>u_-_akJ_a=S zOqizL2i0p#_^4}8MbJr`Dr(T_1sYTl44h4sG~uJkvZlJT<69ae2Py4%CV5}MbS7*y z0$KUm+BZ{G=B<&4pDWnbH4-2G6V!qyBDEk$M-{{Bt&xc3w<6aeFvV?OBk=;92*TD# zd=({v|2k_V7OT@;gO*A7CY17J5*AkJ&fr(UcPWRl#1yC`tkFA%UV&p`B1#fzNU3_c!^4r%)?VE<2bDGcJ z#J>_WrZeJQVMB9}QMNVa0k?%KSqmvu_^}6Zhi>aUY=-ZQT4r~Hx97H5FR{ydKT_^r zcOY-wy(KG7*#w2oE|4f~+7k@~VuL0h?8%DY-Kj)tT@F8I4sfDlcCG8N8QF@~%8FA| z(b|VC`_(YuSm;}`BKHVXOj}v#@3U0F-k!Z+@5_o)RKW_)9kcrE8^IL+SysfpVO+)f z=CopM;@JR#byE%tcp@uSk>!f>Y6V)=nYRCw6|w&~u5$f!TDe+ZSBBUFBJlZUR-CfM zDvzY`iuTitDM~!(PX(|mD;j(w7?8=s;kc0k#1t&|-{Y!iQ?VJT2K-n>J2fj#1uI&- z=C90{AU5Po?iBR}i4FBL*e|9VPv3dJLH*Tf5$>3vuu%jkks8Xm9w(3$*4FtWuK&`( zsz~mwc6lLr15VzmGQaeCIQk72m>ZP=wn;^?Y;P>!bY;~o^+)i9fyIAA;NqV4>W=56 z_CUp`t;YLi(%*6;-#}&(yUX!)_HAD+}F0C2(n--H@ByD*lsIK{!Ni z<{ozFq!cG~zZE3-j`sE^FG%=yte6rc+zJi$1qqwyLf^MT)c);!FrtTtXa-o%mCM8$ zW*$5UbsRkC*w-+d^3nG4UvSzlwL77rBW( zn@4O1m^aZAtlM6olj>I zWuuujP(7GAW!BjShiX3NPTnB86q_}uBFsCosiMw1+O0tqVcwBVl|1igwj$~993%5D zd_NF+L|%jZpj4vY$%;M?OPQ|gH6_&y%L7cSLaZTOJt+W0ncU*d8aywOsvu4(m3cFh z;_XRWXC}RL+;xNHS5j%gOVab(o0$~LZ$(L_!Ry;TGwDo}1Dl!jC|=>e&dell_f|d_ z22D%yjX2!hnTfTyXaX#8;sZ-oxwDewIZ6EWM!z{wEEn-~P|=oCekj6-o#3zSP-z)hMCI5)zvb|bAfmh4}VOM${h{ulX zJdmzpx!)|;drQT#nZ)}zGsye!)sfiqC}z8Lrk^AouVbaJf*dl3ZEd>RD4B=N(#Cb; zD=akoqr|pWmW}IX zI7fpjf+t~9CCgEmp={`_?Igma&FMEg6TCq73*RD|Um`#Al75RckzPTnX|2LB6G4QWs{ zdj?|cAT_e%+`k7RIMTJLS_;4Lrz|F~lc-uJQgv8^s&hlBYA&iZMn)>tdT(twU#;KL zsMO6`Ys@BgF>D#@C$_Enl&Uh%?~EUA+Uj?{N`w7D>M)*G<&{kT!>mdWb&4_Y{LWZ@ zD{}oe82sDrcm4tq1@k-KhZ4bm9l!GgA4UrDIelP+EBBYNE*A(;e9mP%nAZTy1MKu7 z0uP*(alF76gPTf=7a{je&*Y`!gRyE)%eoIPp`I51cr|?VSP$@j9%TRcI~ztk;{B0J zaooHN3NvtYRSZ_QJI*q8xi4gDnYAwm`HtRtr5AQi1S86W_ibRwzZ2NCa0F--Wgn+%6c_IVs9wXxJ5z%yf{SNUMRoDIG^irDcs5nC zi#N|x6j9{S?%p)EC%Yi)D>Ud2!am8787CrDO5oBE4T{+kb+1NS2^wTm6)ghQdY z8$eoi@)nI2leHrZuo40z+$M)r6eI%$XL(Vg+0ba32ccBvdG!IHO#&XWSO05eCX~2E zGaO5&JmK4SH|VyvpK8!ucWOY;O=k<_3xM}T2%A-6%8&B%%@G2GPNk?jDjC(P(?5%n!Nh0 z232%kMI(?ozWyuf^UPc5xIdjfXSZ**rht}euz)Tgsxo(KP?fzhU!*}5ombJy+~JKj zqAqXOATFIQXSRE{rYhg8!2!B>sH!}uK~?su+|Zzk&Z}ru4x7(;w+3zLG&!sJoSKUK zfCdBT!l5eiTQsQ3UXkCUK^2`>(TY6Ff$^e6{-_3N>GU|Goy;}W_zN2Cr;CQF#^2PS zDtk5lnFdvKUd5@gvu(K$m-(XxY3){Hhp>ro_ZC&@P6AytR5d(TY4z4CIO0e47S= z>9ko1#YyB%gi7D5!3DaQs4D$B4XUzN=|?rFqVpk`!T zYi&|fWwPB@kX8Q4c3&3WL`#*~wR?-WL_zS$c0Or^&Sy)$i0fBKE}LxkYrJBU?bwyx zWIK-?IA!L)kU6t)`r1F^%(bVn__+ziD*5R?OFCK;a*6Uoo$19rb z2(twj!|XVFir5?AwLR7nHeK!%R-Ver(^$C_N^2Pwr$YfV@y_5MXTnF1Ww7!rR-TPF zrdT_mx}DRl<@n!p>l}7#1uIuVdED9#_lJ&I=fXc$4vS7KR$+0T``v21>cXNMi#1s6 z!XK8bwQ$`t)X`(DgA3Tj;u84U+JMD+ykniu$_rTeELL8~%8OWeF)J^DlFg{JHn9IM z#s4qE;@MEqacd)7LQ^k?k6jDSwKl_-J=PWYj!jrxflqG2VjH`&1;5;i#b*5Btf70y ztSxwZD;7O)hzT?6hewJfICEm8)EF$5jeHe4S--J=-@aW3 zazpj{NNvNKHG{?aP@}IKo?UYo52z^R%Y$nUA0F;>TAkw)ca}!fD7s}g3&e?RupWX& zv8fMc)hrjx*8MG?pqf*GH0Qniwd@;#%Y}&QqiujVj5TLe&4EU>*lHSaylB}H$>XaT zPMIc4L~L{@rihX^TYL~)yCU!8iad9lIb!0{i$W1immeF7w*)5N-XYKHt;wBS(&O^DnzA)xkCWl_TX+CEs7`GyrJVV4nly{O)yY zjm8K9Yq(tB?XW6m^#O%`C7o&4?mWR2)%{lBV@qhA*cT|uYTW`Ad5Rj=992xHNC3Y{;L=%jGVuAOZt%Q}=&`#mXYZ_emz zluBm3)tubrFq~~-8T=|)!DTiz=l1)1sN>VxmO{B30mYTRmBwuBDA(%wQYo))0y0;) zC8)>W3v3nDLqmYx2-qR3@!tw>0yR!<5oaGR=8c0R#SwR>N_&W#hBw5q>|ce~hz+vj z4KSxdouW}--v}J~T115!9AcYaGQFECb4VmzYee$+uhjm}LOTKwNYBlchEaeRMUg8K z+eH-A$*k3ls#!AgHPb+T?`M+mEcM9fNRip-k!r;<3-vX?)HR*%o?^DB&P`amD9!&A zh?b-&n|VQ+I->q##M@GddY&xm{}SFrbGiA*a=HV70@?3aIS>CRB#5kah8215H}NS^ z0J2>q4Ic_Uihhpuh@<$)pjWPL!VWcE4E=V9{Wt6(-laJfKcgP+eTsu$a~6W^Mt;z2 zHK+CEYeOw%diQal)+c4w!x!-P$t{!l)|?65stZk#Je1%KgWrf4MU<|d!qhInHy*6P z{>UTsN~KgwU~w-2c7{1oipA~lsul(3zaiM)%@Nh7>XeIp;$l9U*pQU=SE>C%p&bGC z_o!nb3niHP&a7|M9I4cb^-6UVV#obP11#`Pw>~jjiAmrD0Z0=-dyy1?}!xgaP zjghW;rK=yzx&t6(OT8iy9ipASL1>(4CKNdC7q#Qw$mTle8HRiPHv~P&N05+8PfnKg zFL+RuAIher=~LRT?HD~+lF-OR9&{JAyvWY8K|l~TW1 z?e2i%YRseg;gOQ^F7zGxOn8vREQcUo=#5Vdt94h+d_Rmt{gpzkyI5Icme+vG+E+4p zAhWA)w9Br#d#FBK>g?`-V>ZgG4R+QpBd%Jh)cq9NRIN6ujWQcCAu2iyL!~^XU6GPU z;%N7nAQe&m3gVdx>=hM@eIqE;2O}!fP$~Q=;a>@2`Fxwi!acUjoH0$OFQ{-Jp=c*}6WEkgVAchg*kC>m zZsf>*c8Pvp6__q+sMxvWA%%oT6ox6rRmLN80a-XX83{s&w|E2iDEtdhnsFKR&*AS= zS|MkaDj*nx8F_=-f5+0>R^B*LER~#Q!Y}~w^n);;g&hceJx)|P2$nTp$I*d>hamV_ zs&I#dO-6uoqoE2IQlMTKJbZC@rWe!j^`Z_=YY;rfB=&P|M1`sBXHK@CBI%CqgO9}q z*m%ySV8jW6P(lqt z3rW-}cwS!}hEuQ&HNcp~I-o}Uwq6{De<5Ts&?sS!?(6~1o3lC0bP*~uIN)|b^#Ccc zA0g~3BJvpSgB|B;((@Py$(O;k8^*02&3?34W_19tZw+2E2ovmp7U+n1<4Atg!Gt`k zjsO*~DdZ39P)m1*6X@u#0L9#ft63xg}f<(nm!Uty=gvI}2V0>hdK|_MTiJN_h6SdGMqqvj`imZ<9lQI;!3ZV!C zj)tu#ps0L|uC3WM>KGvKHH^MSvDEMT&bCQrKirg1OxtSZY~z5$1Z^A_0JPQ)dkESO z_KeL~nbTLQ6b|*WO<%=1E8gTH87Y1Ix%ZIPn)OQeR`R=6Srn&>o;7H*!_0fB`MmN7ocIMyP6~4bR}qx(V(!L~QZv?&1DU2F2jKhkoM-_{T=QIts=U zEU!^%)Mfb9;WkOy$LCgoZApwq{4Z88qY=k5vCl`=D*J8oC3cIWta4ZA&G$q!m;w^H zH&=GNIXyW;0OeAjtnpt@-uRy+bJhR5K(-+wBOPdZdbF|#91?2~RU(zWQ)oRR$buF^ zx95s9unOjaDz(c9N2a~G$g!PWwlPJ(CI=+lha8K`ABu=eDo`s0rd+VqnG3j&&vz14 zUA-+x^1T9oMM+Y0U6~Dbk*sx(32#!-Wb>_CM)7o-e4_+0N&siZK^V$-?)IQF&k;~! z%}GZ=@G(C)oM%}KXR23i#4HpCiUkHdyF0F~9Dx%$s;il5BdE)l0Kb7u2a1Detnn?* zPy35in3GV#Q~-xn?DhQF?$P{k=^(?LGRRvXQ!N^;j|r_7`Kv?#XS)p+W$61}5Z)&v zD%TL67Y)2b7M|D)$7EcnCl&&S0^>{~F%nPNFE*wUJb^wr8#x~(=+hZdj>=s@n%|mW zY0j|qTOcZm*Rr)F1=$o8Q|yC`Y)@gRc0-5ZblDBY+V1naFOr~Y_+z|b91H#)n4JQ9 zqCH49wc|4WKDl)=@0tt1on+2umu--gVa9#JX@7LuO)Hz_o`#9?q7|EE6SY`)lRCcK^lOM#_>HxHcwv!EoHcO-0+={tI6TH}?6L9H z2Ij@`FlInn)X3MIkqSo(97P=IxxZtPPzW-x$VUI_4hWOLd?1KIz=ULc2_NB>+hdq{ zc-WD<(cRq*;~gK{Fvb9Wgkg_sKte8mI9~)n2q6%d@=@OZvI$U))Fo5&(>kgr-jas8H#9M^nT67SA#Ld;dBJ9FAYyjQ6M<7H~ ztPP_R0So{~#Hftm-u|2+WyrMI=Vw6kM$LM6$BqFu;ySOcnzuAybPamF$X}aGm#2K3 zW`j9C=w~$04T1nyCVaRK4b05-tAS|kR|r}pjV-dZ_l?U!kMMmjbcU{o$~8KJH(qa* zJA>E^XT0v?5&SImoWRY%v0Wrw;y?SvNr63y@LpMpOF}xKXyrnm5+r=p1WR~Ta>J2= zV>4}=BXY?7R^Z6Z6U>n*ol;&iUc=-VXuvOmLWjqnDdv|T*`$3isJ-=xu=0eq$^BeG z--69n?h0Cb+XQRz9DkNUpe#T+-NPMZkVyjQ%9x@6EE%9La{)TQnO+;lZZJmj)nZKo z>Cun!26EthKX86rfcn+^eM&3k*zXOiR`u+@e*3Cb8;t82@I#P->8=K#z@bVF;;al! zA}p!^6RO32hzbt?_^~k^M2H!5!OW8rUXp^bL%o8G-xQ&JJcvD`R+0swZ9{xb`4bW7g!w&x9yTqiP#PYmF#LSBZan!ZxrD~s@|crP1YN^_U1ev#t(`j z;(Z5{#|97;?1v7ZxNzwk(-S!7{JCPYN&kCGbc%-f2 zEV6RQlQcyY((I@~;QljK=h_@gfDHu(N(eWT!B)#@1f1ce{wQ@?nCmb0_BY7XZ| zM&N;i#vyZ59&w+WB?)5h+8faslzid>nR?Oiska5K-XHO*R0HA7@<1py${7f!b5;v9 ziBF35E>%xcXj1e}>S;Hv1LV2fxB+0>!NV2Q9YB2cau;{-;flA<*?b39$B$IHJ6uJC zZCfy%)y0722EHO^AFB(#H4HvsWCNeg#W(N4n%F(}754bP!FhRY4X0)ed(3shS;X$* zj*jKV=0?3T485fQTR_0%>{6+6#GWFF`p$=WE)#GE5khs(k}(0 zaCdtRmA7+EQ8rX@MxnWWxv|Oab1XT%Zf!>g7qZ>6y8E!lu?!-=61#*}1%8EiWh#Xr z4bX>zRYEqyO}`5!Pn{C)Ma-B|A_FM`9y70H$yI5~EcaVMx8BiS-SR>mx5&EncHvEG zsH52rvqQU>QFYR-HG2^!&j7=8`u&)jwZn`9l`5F|;CZIZhI=E*ni1IbXwCT-Tynm= zHQYHd?_|@|MTGK%&<=5kR#y0*s1htM}*_)&Bz92GPz9}&LOKoDfGGnkIGw)x8H$jh(AXwAQ$x0?y zY)$A>e!KZSc-J^NHb=PKlv}6R&3SgKx_F0H<^wtR?G7J38%SYp3f(!;Hyg+Z(x0FQ z1Ra`sw5?$j&#K-g>(C_OO#wP|T2S^sC}kD(pkI>~!W+j)la6sslG~_g(uuy*Lzp(< zGfw&;kwz)3PN7kY_!OgC`AnZ6l?r@9(5cmeq{VTEG7ur4TZco5z}B zAAL6>fTe=NWMHYha1KmnD;(--u#G@uK+A7J5DIq*iQE=N*}_BKno9%~^hFTyYWZ(DaBX#d}^t^3sT*Iy!{ zF!qh#rX5aT)972fGc8QGwflOJ!pZAxM}}L#7bl@lV{3O#Vbs>{4R~|l*6uHY8^K$< z=d3}vXZ2(8BzETyVevZLmgFHU&c|Xc7O%qMJ}i3i;pbxUE?jx=C>9Gb^EVHRPhj!) zSiBWs_?xh}5g)!Di$CDMzr$iB{<|ED-B?@$MZ?}*o)b032pVI=j4?vS7!hNPfHC&+ zG4|py_R=x-!ZG%;G4`S{_L4F7g0Y6ZS$&Q-mKjafShg82Yb@JeiZzyPsK^@2w!C7E zW%ivlmaYC`jb*d*S!3BW4%S!}>tT&$LlA2$!|bfF40B;)EgUHuZQL)PzD+)}-_ADq zjpi&^QlE#V_xYA}J=)zHplD9(FBa-BJ?KTPJ*}Lz0=_!dYR+~KKxiFn<(kv+-&$+u zl;%w5JcON-8Z~Prd)j&&8VZkD?}bk|7vg>Rfw#|zzI}G|ZQRxWSWBpU*ABb(DUDjA zIip^z!`yqMkkKvg=kKl3Ws?~@c!Xpd>>MR@=O=+&8Z7q#LBM#(gqT;)+G;Q15MKQ0 zlrKj1#=N*=`_Y04P_t4N+x(@JuSU_uyn6NyXQGYJ=1V3gV^nzPuvnR33=I_@5`!1`sgBVUI3kC2HS zHd{lzcJE>P3bRd9Pk?u6t>2vkKje~~#i|HBMj&VXEilcupTEb2cf$>o1|D<*ryU9B zA&GkzHfI2@VSP-CH)EZ1iA)4NH6v8k~xx8>SqN>U2KaY`ESvwNhtYm zu$rF<278IX1IGZuxv~D>*5X@J_veLB1r0AJm279MWSv$C8E!VJ%%fA4P{MP_H7k94 z7OP_XjQO%aRp`ZJkE9QqfwGkL{c5-P`iw&lHBY#joTI9VJbzr$l3%9RlAn|LlvGPDOr|Ar z6ICVo37y1*O7bIe%@eL9OT&~zwjgKUmKu?s2~}j{p>$Dnqo%6FGCE}mRpL}~%@eK? zXR0b;&n)eQMQxJF*qvT2t|7B1smWNEOf7t^Q&nRJow|goaV5Ft30DotfyGhTW}a*= zZcnclqh$Uh)r$lUtiNfhQXHm}mQX2brEEf@vf?mLs#$H$kh`CS6YP>zY zcD$9$sHEDF0FDN>QB{*S(P>PmCXbM7o^UleQ5;rS+TR}n{g?DQ@p&>=lIq0D_>qJ) z$mX(_%=#Riq=YK)X>!dIt^(5Vfd@gEy?lQf$v{lKJvG{#1XW~%HWLgV{-&vR;SXfd zH4`eu@5nWWD22uh1#glAPrhhWkvPxV{+gH>fZUR=4VpM4LQ&a>y#XjD#&#py<7`)UItEwQzo%A&x?_(&?-g72kCSrl<@&_ z&5C__4y$7PlWt5Il<1Hjf!q(2rA)fLg3O;4vTrC#) z?0vWG#0vJ|$@JRrAu?N%YQwp4+TgTEQGzGvG$mAm_mgW5Q34I%;9(Cw3Taf47<;sR z#?KNAHo!1t%M5&GJf}uN#J^3ij=v%cD5*LI&JYP~l?sOclTKAah5RYGW#d%EAL z$Ta^-*^0JdOk{MG}6 zEk3)Cti-_@h|P&x5pb`r?7g|v72!l& zaXn~Ow^ZPS`r6hZvv5cl9WG6;1{agLlGG&R!qh-%lA;99q7#)+3D%Qqo^T}qYrr_R z8$kB}?BJ_fgQ4_lV3PTgR1HF{K|rGvMd+iGl~56S$u&>7BAjF^!VNGwglNL6(rdzf zWX2@b1iv>aj0;Q?q*f`aa4(&%gsRXa*F52>uyjWmPN6FHZw1_l+rR9t?!!Z=RMYUW z^a}A2GJBFLgny2opb+70Q`F*b=+q@tiw}}(o^Z8TxU16NC{@Co$)BWGh98lcl2jS| zX%U|?s4Y@d;QMr%5~{#=$Td&63e4}Rl&{T?;-SH+HCXoi)NaG6P(?Ow!-`Xssak-;={2B6W=c{G2pIy@7AYz)LZ>OA3JjBLo^Ta7#m}(nwWY>jv8-ys zo6>8-BV^tr)dc@EO`k0YZJ44EucMQeP$3>7*F510!EM5hGHe)JDyf?Ax%8UwX);ri zYC@Dv5L%?Dz$fW6B~*cbAlLj1Q33y0Dg+Y$kX{9TM`lVpR6uBvq5{9B)09vJenGA| zLN=BeFIFZH~i%<9X&OFfk?m4CfTt|`8lz4} zxrt6pLSt|Pxn{)}>|s@mU&i?q^C+%!srTAbk0F?tubJ{n(3b*LDO1kJ$-GIb0{(Ea zrvkz4Qnlelbh;91!wbkYPq;QL6uBm=!3WZ-!TZQeNva0t1X=>AL8|;8rxTP={_iH& zJmK=6=dcU6lb42pZ>Jaj(`1e$6~2GtLe&OfYgEa9jZRHM$$yz#^Mp%&;hzY zuL75m`I1xx{Lulg|Eq0MwcrvuO$oK&LUPR$t_7YI0FyaX>6cWXlwJjjWTqrlffy^m z8>GsAfKE_C`4`AFPq_TypaM9tpx#@8nWvKMA51U%SCbi%RQADMpsz8i-0!ColThxj zAlDosca3)PkFC-LtILsHxsvE3#*q*qc&=+)t?*)aP zVpWV!P>3BzFn60dVq(WH;Grk})zrVvigV2qmc#KW-b?Ks;4KUIMS4E|Ot%WJ2mF|e zBJ5xYogFMV$L)*-J4jRD_-QYo0_}vl3LG!;#1DU|!to{WW*R=XtMD{;F{@%+G&g54 zMov3i%o_p&H!ucT(g7USH}Gt{*FXn`lYrPSr;Zdygdc7ubKY)03v<2`sIE*ICD^Xk#EVRN@xAsRoC&EfY>} zv9{uQhkl87z`nYTk$R<45{=v~?Drb{3KINce##Kil#Sr$Gr{|sqR4-cy<4L_p8WfD ztB~cdfj>M5!_A3C6&@8?8E_kG+`x|f^^cfuB`Z_X9zS=v{|sV9>Tl8&nJ4u}SQX=9 zzPSxvwAJ1V-MF%puh-2o?0PNO=P}JD20T6|VkmdagdHTZN~^AL4=u zgCQE5S+F5+fwMQgvCpjH;!}b5-_MNq3xW51tMe{<{kY2b@91*PQ|E8$R*^a5=WXA& z%i+1K@^kOb3INVu4*Qch91qm?+3@a^5O9WW6`3==V~2BUsW|+v$&BH10CC%~)PVh} zSL<@h)9_B+DiSkW+ryc8E!zM`Wc8lRSUqbw-*6{@&%1S*e3DjPq=RY;Z0L zcDb4v69HQCaiEJcQ?<&K^t>$TR^jPvk&C0zD=5rba{)W*8m9wR&Avvl)Xz>e$7k<_->iVoSFj&> z|KYE_|F9bOzee)}JP;ddV`S7?_qLh~Ielio@NGwbWjGH>8(7DRFKkXOu#Y*_N~PXg z8y)Velv-8}>Tb^1%m2H-WuMpkD16(~oLejQLF#I7b02J7-}3(7V#0EH_)AWu%DjEN<2Tj$1>o0%sLB72$U{oA8_3C`{174s-g7`v7csNa(#e@ zSHiysfYv9c0hyo0V%l^l{(K1(?>YsFfzzQl1-%ocn%b=%|Wqo6%^0whT@0o zpt$A&DCS-W#ba39ehCy)cR}$HU+YBZWtEK~&G4)72<=FDMSkqhY+M>(bq=i&5t z-xDVcEe)m-_HTiuV~nw5tchccs4@1Eu?ADJp?7*!aDw4&81PtJX^b=G4}61gTMPI z1ibn0mIeIIJ1*G&!>Onh_qi`L0)8kg?`ipe{5JTVbqF+qzcm;4WA{)~et{ipp1L|oWS|Jp*HLPS9UeAaT8Ivv@~tCBxyE4k&sFb6bdR3A>{<(M?_qrl%Rsd zB{JT%xAw$q2YcOQ3q6u-)q!3taVUofA#tDwgt#Ci&h&zi5C?vQxU>f(P=!!?00G~d zvAu7y-raDB6?^=?dGlu8%zJNVo-aXNHG>O#f*i5p!q!k<*p8W4#@yp1&;Uu^NTs&G^Os~ve)JrUqRqVpAgb&sfx#k^P-a2bJ90yO5ea7u9_26?{G|UrYU`7tcYlQW|=>qGaF<5zr8zbjaPz%3oRn^=?V`U&oumQ47E8Evt z*@lZ|SQ=I?nxAQHJb|@wG)$oc+TT}cNeylmfFO<+le~DAR#CkMsDzXAw8-|?4%T9J zRh#n3u`mxlzKf+0lR*o@#}I-6F6{ zu%0weOidWrV5$xdafNKJd6-=q;=xJ*?@so>0iGk1?Yk0yO@fREejZSzKi~-0384+6 zZ&WL|5u(q^a)=9LGQI_qQA4n0f-%7%jPutVNs`@pvqY*EsX{W2xpIhoWVJfDjBO7W zOQGpXl{*CS@#{H+I7g z+bE|^#UlIw@;k`i5X-ocHKp`!g>&Iqo~5eP%g0Z6`=s(_1T7!^QZ?jsX*uM|Qtj-> z1975!>D;T*ZuWtsqXHDNh7Z-9rC44RlK)h=UK4@caIxnD49mli5H)f$6Tg8G&yth5 zw-iK8J8%)2uwIGnFoD|)n3Xu%BwqUta~xnIaqYP2W#VteRRvY;jCx~k1z+ULYc;A8cf76IGrOYP zy}4bLq_lA{3j3l^?azgIr!eBNP#Z3*_le_-*i% zz`@K#nRa{#=;(|1W+2(0uZI2`i+;1C<#;(mq{InSgeen~fR>Ys(MA|VwnG$&eofY+ z*hjt!JHW|A`Uqhf`>0MHp$LYRhlpe?c3bdU@GILUjSG14`Xtj&~XCN1(jItn5H>5oQDqc6`_=$R)biV+ybx1=&Yw7>z;FS88!jztCBNZZ=GEM)X_Yj_IdQqHYOZ((Z@hm|G6swhnO;mQo z>$C$)&+|J3Hrqm!F^q5k3LXzyu0n%7d2}O+oy1yqW2^0lX~)f$zQUZ5HWE~hfldMv z9}&P59$JnY;8zUD0#C0hSdx$5>Z0EB=et^35K`Tt@Q(!nMjKYHls!4apC;=#gR}cp z2RebJr6*_gt4@?sZ}}nZ*hl-P(sk&Di$U7)1UjlGr}KX;1UwU*?9Id%#8=VJ=%?md oBicm4MQ>*n+Ti(Ty#RkS${e?lIQrEO&tdpNE!7}JZ6s92N805%*Q0Z#&ql1^M~^}{3tzaR8Oc21v*RrB;-(mg zTVlhF5ob46S)p8>EZ|W=CD!0j#a8o0tm?hz5Qw+~q@Ks`1^iyZ?=F5fsZ%;actA+Y zGN@C!;SASPC-J(YZ=HVp#3i{U_Zb8fKLEi4n6VFTzotipUlOlCu`zlE~zTD zsLk0yBdKzix`taT^C=3_0lZfgW}+1kM8440LzX&Fwkc6!@05B|j!a}$X}m};VaR#Q zvI2{p%1s2@XIS>@rPC=^yI@lkay{(AT_-T}!qe4>QZ`qXFKi+sc0+jswWHZY=`7^P z&>+`}2!se#)4=4-O2SiKN}_XVMbuOrc&rc9CFqm}niopjDCLiM>QAmvU$C@YcIbf5 zB(So~I@2h1sFU!qo5J1joar1`K|^zvLDI7tEDJ&TpJ*ua!r2IXQVFy?^_-m?y>VnD zzHcpWMqF#9Bf;_{a2pSY*kbExPdU46rBhn*bhxs!VnX~%!^-I81)8I`mN!;T(tZfQ z03`u@(vUW^o3ecB*pvhA1nVoPJ#^L5zSyCQ*S>E@xhB z(U3W-qDv87kzmwr;<6%YSqD^0L7B2SOM}6^QUYjm6W;z(R2c3O70t51r+q#vl;P3h z$&wzAfp`OGm=7Z$Y{ELlwWGV}MJ>&XV zayuz~Am>NIW+|NYEE^+*lF*U5bO=IbQJb4>0FfyIL*}$^E^^Cek&si7;s^3>rYi7$ zU@|nm=v#-RHUR2cxvrK`s$y0(K{|{D!+lVzt7HSpC4@MA<_fq7Gf&yj>LP&d2Z_ul z;6PIqu7)~c+;~M#W`Vq^VpS@JQRU2oGia3w^7jH)5S&{$xe-I_EaDlHX@v1i^KxMM zi4N)k3uH|vRZW}I2G1Xbk%zifEkW{viWmnZlEX&m_*0JBgmLEpmjbmcN-AiB-d{~d zdzfI77}JP73SSt;di3Fzwb7Aq@6R-D| z3%F03gR~Wj4KRF+Q7j0nZ*eZHpN>fk}F`&6_zZVz=`OgUc2mb(d0`oj74kmDe%%~i;C3Z=?(~3)S@6-b)l4%-v b-A_Uns0(J8NT{D(7_`mQVTyR{-T3%lwdEt! diff --git a/latest/.doctrees/methoddocs/compiler.doctree b/latest/.doctrees/methoddocs/compiler.doctree deleted file mode 100644 index d7f29dc0fe252a736d099106b8479f7702691bcb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 231402 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 P^t94k1v!eYJqG_9nnP2G diff --git a/latest/.doctrees/methoddocs/exceptions.doctree b/latest/.doctrees/methoddocs/exceptions.doctree deleted file mode 100644 index a9aaa0453ab6908e8649a246b992f31fa4a524ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 273074 zcmeFa37i~9bw6(1(&|1fSz38yV{0W#yT%t-KCqCCQDn=CFEFwh&F=Q@Olx*#Jcp$9 z$!RQTz`^4HA^8Cz1VTa}2T6d0D;xn56OsTw5&{JNgoGanm?QuE5+J|ttD~#BySl1- zcC>=e2Y)_Z^>kO&JL=VYuU@^XdclIn&pK<)S@d79vehV8YA1(F@-5n|~2^O>~?W(7J3I?t}Ip#H}LaR%qP-y;b-bsQU`S#K-$7Nxo z1jy}fd3CU)7@}I97c3MQ9t!4HD>biss54p$21@OAvohLggEFFIUS+&RST7o@mRc>m z#Pfn$X^KBB9`7{NkI~ZDv8FdcWjev4c4?A6b;~QuTMy1D4+i^2%JnI4q}i#}yynP> zdh^&wsp0KDKHb1i^#l}KBU4_xTpwqTUP$in)OfeNxxB2rr97`QT0SdSP^pc3CpG49 zzLn1f=H+c*&H4EM0{p)n|L-6wz=≺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 Y;m-zksJJ;CZ?MC&Bj5@a81?u3U)&TSl>h($ diff --git a/latest/.doctrees/userguides/quickstart.doctree b/latest/.doctrees/userguides/quickstart.doctree deleted file mode 100644 index 1fc5db9ea4d57ee315182ef1ac4bd477debc43aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19728 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 diff --git a/latest/_sources/index.md.txt b/latest/_sources/index.md.txt deleted file mode 100644 index 594b37fa..00000000 --- a/latest/_sources/index.md.txt +++ /dev/null @@ -1,19 +0,0 @@ -# Vyper Docs - -```{eval-rst} -.. toctree:: - :caption: User Guides - :maxdepth: 1 - - userguides/quickstart -``` - -```{eval-rst} -.. toctree:: - :caption: Python Reference - :maxdepth: 1 - - methoddocs/compiler.md - methoddocs/exceptions.md - methoddocs/interface.md -``` diff --git a/latest/_sources/methoddocs/compiler.md.txt b/latest/_sources/methoddocs/compiler.md.txt deleted file mode 100644 index aed23796..00000000 --- a/latest/_sources/methoddocs/compiler.md.txt +++ /dev/null @@ -1,6 +0,0 @@ -# Compiler - -```{eval-rst} -.. automodule:: ape_vyper.compiler - :members: -``` diff --git a/latest/_sources/methoddocs/exceptions.md.txt b/latest/_sources/methoddocs/exceptions.md.txt deleted file mode 100644 index 5bc2108b..00000000 --- a/latest/_sources/methoddocs/exceptions.md.txt +++ /dev/null @@ -1,6 +0,0 @@ -# Exceptions - -```{eval-rst} -.. automodule:: ape_vyper.exceptions - :members: -``` diff --git a/latest/_sources/methoddocs/interface.md.txt b/latest/_sources/methoddocs/interface.md.txt deleted file mode 100644 index 49d18540..00000000 --- a/latest/_sources/methoddocs/interface.md.txt +++ /dev/null @@ -1,6 +0,0 @@ -# Interface - -```{eval-rst} -.. automodule:: ape_vyper.interface - :members: -``` diff --git a/latest/_sources/userguides/quickstart.md.txt b/latest/_sources/userguides/quickstart.md.txt deleted file mode 100644 index c7719d82..00000000 --- a/latest/_sources/userguides/quickstart.md.txt +++ /dev/null @@ -1,2 +0,0 @@ -```{include} ../../README.md -``` diff --git a/latest/_static/_sphinx_javascript_frameworks_compat.js b/latest/_static/_sphinx_javascript_frameworks_compat.js deleted file mode 100644 index 81415803..00000000 --- a/latest/_static/_sphinx_javascript_frameworks_compat.js +++ /dev/null @@ -1,123 +0,0 @@ -/* Compatability shim for jQuery and underscores.js. - * - * Copyright Sphinx contributors - * Released under the two clause BSD licence - */ - -/** - * small helper function to urldecode strings - * - * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL - */ -jQuery.urldecode = function(x) { - if (!x) { - return x - } - return decodeURIComponent(x.replace(/\+/g, ' ')); -}; - -/** - * small helper function to urlencode strings - */ -jQuery.urlencode = encodeURIComponent; - -/** - * This function returns the parsed url parameters of the - * current request. Multiple values per key are supported, - * it will always return arrays of strings for the value parts. - */ -jQuery.getQueryParameters = function(s) { - if (typeof s === 'undefined') - s = document.location.search; - var parts = s.substr(s.indexOf('?') + 1).split('&'); - var result = {}; - for (var i = 0; i < parts.length; i++) { - var tmp = parts[i].split('=', 2); - var key = jQuery.urldecode(tmp[0]); - var value = jQuery.urldecode(tmp[1]); - if (key in result) - result[key].push(value); - else - result[key] = [value]; - } - return result; -}; - -/** - * highlight a given string on a jquery object by wrapping it in - * span elements with the given class name. - */ -jQuery.fn.highlightText = function(text, className) { - function highlight(node, addItems) { - if (node.nodeType === 3) { - var val = node.nodeValue; - var pos = val.toLowerCase().indexOf(text); - if (pos >= 0 && - !jQuery(node.parentNode).hasClass(className) && - !jQuery(node.parentNode).hasClass("nohighlight")) { - var span; - var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); - if (isInSVG) { - span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); - } else { - span = document.createElement("span"); - span.className = className; - } - span.appendChild(document.createTextNode(val.substr(pos, text.length))); - node.parentNode.insertBefore(span, node.parentNode.insertBefore( - document.createTextNode(val.substr(pos + text.length)), - node.nextSibling)); - node.nodeValue = val.substr(0, pos); - if (isInSVG) { - var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); - var bbox = node.parentElement.getBBox(); - rect.x.baseVal.value = bbox.x; - rect.y.baseVal.value = bbox.y; - rect.width.baseVal.value = bbox.width; - rect.height.baseVal.value = bbox.height; - rect.setAttribute('class', className); - addItems.push({ - "parent": node.parentNode, - "target": rect}); - } - } - } - else if (!jQuery(node).is("button, select, textarea")) { - jQuery.each(node.childNodes, function() { - highlight(this, addItems); - }); - } - } - var addItems = []; - var result = this.each(function() { - highlight(this, addItems); - }); - for (var i = 0; i < addItems.length; ++i) { - jQuery(addItems[i].parent).before(addItems[i].target); - } - return result; -}; - -/* - * backward compatibility for jQuery.browser - * This will be supported until firefox bug is fixed. - */ -if (!jQuery.browser) { - jQuery.uaMatch = function(ua) { - ua = ua.toLowerCase(); - - var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || - /(webkit)[ \/]([\w.]+)/.exec(ua) || - /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || - /(msie) ([\w.]+)/.exec(ua) || - ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || - []; - - return { - browser: match[ 1 ] || "", - version: match[ 2 ] || "0" - }; - }; - jQuery.browser = {}; - jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; -} diff --git a/latest/_static/basic.css b/latest/_static/basic.css deleted file mode 100644 index 7577acb1..00000000 --- a/latest/_static/basic.css +++ /dev/null @@ -1,903 +0,0 @@ -/* - * basic.css - * ~~~~~~~~~ - * - * Sphinx stylesheet -- basic theme. - * - * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -/* -- main layout ----------------------------------------------------------- */ - -div.clearer { - clear: both; -} - -div.section::after { - display: block; - content: ''; - clear: left; -} - -/* -- relbar ---------------------------------------------------------------- */ - -div.related { - width: 100%; - font-size: 90%; -} - -div.related h3 { - display: none; -} - -div.related ul { - margin: 0; - padding: 0 0 0 10px; - list-style: none; -} - -div.related li { - display: inline; -} - -div.related li.right { - float: right; - margin-right: 5px; -} - -/* -- sidebar --------------------------------------------------------------- */ - -div.sphinxsidebarwrapper { - padding: 10px 5px 0 10px; -} - -div.sphinxsidebar { - float: left; - width: 230px; - margin-left: -100%; - font-size: 90%; - word-wrap: break-word; - overflow-wrap : break-word; -} - -div.sphinxsidebar ul { - list-style: none; -} - -div.sphinxsidebar ul ul, -div.sphinxsidebar ul.want-points { - margin-left: 20px; - list-style: square; -} - -div.sphinxsidebar ul ul { - margin-top: 0; - margin-bottom: 0; -} - -div.sphinxsidebar form { - margin-top: 10px; -} - -div.sphinxsidebar input { - border: 1px solid #98dbcc; - font-family: sans-serif; - font-size: 1em; -} - -div.sphinxsidebar #searchbox form.search { - overflow: hidden; -} - -div.sphinxsidebar #searchbox input[type="text"] { - float: left; - width: 80%; - padding: 0.25em; - box-sizing: border-box; -} - -div.sphinxsidebar #searchbox input[type="submit"] { - float: left; - width: 20%; - border-left: none; - padding: 0.25em; - box-sizing: border-box; -} - - -img { - border: 0; - max-width: 100%; -} - -/* -- search page ----------------------------------------------------------- */ - -ul.search { - margin: 10px 0 0 20px; - padding: 0; -} - -ul.search li { - padding: 5px 0 5px 20px; - background-image: url(file.png); - background-repeat: no-repeat; - background-position: 0 7px; -} - -ul.search li a { - font-weight: bold; -} - -ul.search li p.context { - color: #888; - margin: 2px 0 0 30px; - text-align: left; -} - -ul.keywordmatches li.goodmatch a { - font-weight: bold; -} - -/* -- index page ------------------------------------------------------------ */ - -table.contentstable { - width: 90%; - margin-left: auto; - margin-right: auto; -} - -table.contentstable p.biglink { - line-height: 150%; -} - -a.biglink { - font-size: 1.3em; -} - -span.linkdescr { - font-style: italic; - padding-top: 5px; - font-size: 90%; -} - -/* -- general index --------------------------------------------------------- */ - -table.indextable { - width: 100%; -} - -table.indextable td { - text-align: left; - vertical-align: top; -} - -table.indextable ul { - margin-top: 0; - margin-bottom: 0; - list-style-type: none; -} - -table.indextable > tbody > tr > td > ul { - padding-left: 0em; -} - -table.indextable tr.pcap { - height: 10px; -} - -table.indextable tr.cap { - margin-top: 10px; - background-color: #f2f2f2; -} - -img.toggler { - margin-right: 3px; - margin-top: 3px; - cursor: pointer; -} - -div.modindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -div.genindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -/* -- domain module index --------------------------------------------------- */ - -table.modindextable td { - padding: 2px; - border-collapse: collapse; -} - -/* -- general body styles --------------------------------------------------- */ - -div.body { - min-width: 360px; - max-width: 800px; -} - -div.body p, div.body dd, div.body li, div.body blockquote { - -moz-hyphens: auto; - -ms-hyphens: auto; - -webkit-hyphens: auto; - hyphens: auto; -} - -a.headerlink { - visibility: hidden; -} - -h1:hover > a.headerlink, -h2:hover > a.headerlink, -h3:hover > a.headerlink, -h4:hover > a.headerlink, -h5:hover > a.headerlink, -h6:hover > a.headerlink, -dt:hover > a.headerlink, -caption:hover > a.headerlink, -p.caption:hover > a.headerlink, -div.code-block-caption:hover > a.headerlink { - visibility: visible; -} - -div.body p.caption { - text-align: inherit; -} - -div.body td { - text-align: left; -} - -.first { - margin-top: 0 !important; -} - -p.rubric { - margin-top: 30px; - font-weight: bold; -} - -img.align-left, figure.align-left, .figure.align-left, object.align-left { - clear: left; - float: left; - margin-right: 1em; -} - -img.align-right, figure.align-right, .figure.align-right, object.align-right { - clear: right; - float: right; - margin-left: 1em; -} - -img.align-center, figure.align-center, .figure.align-center, object.align-center { - display: block; - margin-left: auto; - margin-right: auto; -} - -img.align-default, figure.align-default, .figure.align-default { - display: block; - margin-left: auto; - margin-right: auto; -} - -.align-left { - text-align: left; -} - -.align-center { - text-align: center; -} - -.align-default { - text-align: center; -} - -.align-right { - text-align: right; -} - -/* -- sidebars -------------------------------------------------------------- */ - -div.sidebar, -aside.sidebar { - margin: 0 0 0.5em 1em; - border: 1px solid #ddb; - padding: 7px; - background-color: #ffe; - width: 40%; - float: right; - clear: right; - overflow-x: auto; -} - -p.sidebar-title { - font-weight: bold; -} - -nav.contents, -aside.topic, -div.admonition, div.topic, blockquote { - clear: left; -} - -/* -- topics ---------------------------------------------------------------- */ - -nav.contents, -aside.topic, -div.topic { - border: 1px solid #ccc; - padding: 7px; - margin: 10px 0 10px 0; -} - -p.topic-title { - font-size: 1.1em; - font-weight: bold; - margin-top: 10px; -} - -/* -- admonitions ----------------------------------------------------------- */ - -div.admonition { - margin-top: 10px; - margin-bottom: 10px; - padding: 7px; -} - -div.admonition dt { - font-weight: bold; -} - -p.admonition-title { - margin: 0px 10px 5px 0px; - font-weight: bold; -} - -div.body p.centered { - text-align: center; - margin-top: 25px; -} - -/* -- content of sidebars/topics/admonitions -------------------------------- */ - -div.sidebar > :last-child, -aside.sidebar > :last-child, -nav.contents > :last-child, -aside.topic > :last-child, -div.topic > :last-child, -div.admonition > :last-child { - margin-bottom: 0; -} - -div.sidebar::after, -aside.sidebar::after, -nav.contents::after, -aside.topic::after, -div.topic::after, -div.admonition::after, -blockquote::after { - display: block; - content: ''; - clear: both; -} - -/* -- tables ---------------------------------------------------------------- */ - -table.docutils { - margin-top: 10px; - margin-bottom: 10px; - border: 0; - border-collapse: collapse; -} - -table.align-center { - margin-left: auto; - margin-right: auto; -} - -table.align-default { - margin-left: auto; - margin-right: auto; -} - -table caption span.caption-number { - font-style: italic; -} - -table caption span.caption-text { -} - -table.docutils td, table.docutils th { - padding: 1px 8px 1px 5px; - border-top: 0; - border-left: 0; - border-right: 0; - border-bottom: 1px solid #aaa; -} - -th { - text-align: left; - padding-right: 5px; -} - -table.citation { - border-left: solid 1px gray; - margin-left: 1px; -} - -table.citation td { - border-bottom: none; -} - -th > :first-child, -td > :first-child { - margin-top: 0px; -} - -th > :last-child, -td > :last-child { - margin-bottom: 0px; -} - -/* -- figures --------------------------------------------------------------- */ - -div.figure, figure { - margin: 0.5em; - padding: 0.5em; -} - -div.figure p.caption, figcaption { - padding: 0.3em; -} - -div.figure p.caption span.caption-number, -figcaption span.caption-number { - font-style: italic; -} - -div.figure p.caption span.caption-text, -figcaption span.caption-text { -} - -/* -- field list styles ----------------------------------------------------- */ - -table.field-list td, table.field-list th { - border: 0 !important; -} - -.field-list ul { - margin: 0; - padding-left: 1em; -} - -.field-list p { - margin: 0; -} - -.field-name { - -moz-hyphens: manual; - -ms-hyphens: manual; - -webkit-hyphens: manual; - hyphens: manual; -} - -/* -- hlist styles ---------------------------------------------------------- */ - -table.hlist { - margin: 1em 0; -} - -table.hlist td { - vertical-align: top; -} - -/* -- object description styles --------------------------------------------- */ - -.sig { - font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; -} - -.sig-name, code.descname { - background-color: transparent; - font-weight: bold; -} - -.sig-name { - font-size: 1.1em; -} - -code.descname { - font-size: 1.2em; -} - -.sig-prename, code.descclassname { - background-color: transparent; -} - -.optional { - font-size: 1.3em; -} - -.sig-paren { - font-size: larger; -} - -.sig-param.n { - font-style: italic; -} - -/* C++ specific styling */ - -.sig-inline.c-texpr, -.sig-inline.cpp-texpr { - font-family: unset; -} - -.sig.c .k, .sig.c .kt, -.sig.cpp .k, .sig.cpp .kt { - color: #0033B3; -} - -.sig.c .m, -.sig.cpp .m { - color: #1750EB; -} - -.sig.c .s, .sig.c .sc, -.sig.cpp .s, .sig.cpp .sc { - color: #067D17; -} - - -/* -- other body styles ----------------------------------------------------- */ - -ol.arabic { - list-style: decimal; -} - -ol.loweralpha { - list-style: lower-alpha; -} - -ol.upperalpha { - list-style: upper-alpha; -} - -ol.lowerroman { - list-style: lower-roman; -} - -ol.upperroman { - list-style: upper-roman; -} - -:not(li) > ol > li:first-child > :first-child, -:not(li) > ul > li:first-child > :first-child { - margin-top: 0px; -} - -:not(li) > ol > li:last-child > :last-child, -:not(li) > ul > li:last-child > :last-child { - margin-bottom: 0px; -} - -ol.simple ol p, -ol.simple ul p, -ul.simple ol p, -ul.simple ul p { - margin-top: 0; -} - -ol.simple > li:not(:first-child) > p, -ul.simple > li:not(:first-child) > p { - margin-top: 0; -} - -ol.simple p, -ul.simple p { - margin-bottom: 0; -} - -aside.footnote > span, -div.citation > span { - float: left; -} -aside.footnote > span:last-of-type, -div.citation > span:last-of-type { - padding-right: 0.5em; -} -aside.footnote > p { - margin-left: 2em; -} -div.citation > p { - margin-left: 4em; -} -aside.footnote > p:last-of-type, -div.citation > p:last-of-type { - margin-bottom: 0em; -} -aside.footnote > p:last-of-type:after, -div.citation > p:last-of-type:after { - content: ""; - clear: both; -} - -dl.field-list { - display: grid; - grid-template-columns: fit-content(30%) auto; -} - -dl.field-list > dt { - font-weight: bold; - word-break: break-word; - padding-left: 0.5em; - padding-right: 5px; -} - -dl.field-list > dd { - padding-left: 0.5em; - margin-top: 0em; - margin-left: 0em; - margin-bottom: 0em; -} - -dl { - margin-bottom: 15px; -} - -dd > :first-child { - margin-top: 0px; -} - -dd ul, dd table { - margin-bottom: 10px; -} - -dd { - margin-top: 3px; - margin-bottom: 10px; - margin-left: 30px; -} - -dl > dd:last-child, -dl > dd:last-child > :last-child { - margin-bottom: 0; -} - -dt:target, span.highlighted { - background-color: #fbe54e; -} - -rect.highlighted { - fill: #fbe54e; -} - -dl.glossary dt { - font-weight: bold; - font-size: 1.1em; -} - -.versionmodified { - font-style: italic; -} - -.system-message { - background-color: #fda; - padding: 5px; - border: 3px solid red; -} - -.footnote:target { - background-color: #ffa; -} - -.line-block { - display: block; - margin-top: 1em; - margin-bottom: 1em; -} - -.line-block .line-block { - margin-top: 0; - margin-bottom: 0; - margin-left: 1.5em; -} - -.guilabel, .menuselection { - font-family: sans-serif; -} - -.accelerator { - text-decoration: underline; -} - -.classifier { - font-style: oblique; -} - -.classifier:before { - font-style: normal; - margin: 0 0.5em; - content: ":"; - display: inline-block; -} - -abbr, acronym { - border-bottom: dotted 1px; - cursor: help; -} - -/* -- code displays --------------------------------------------------------- */ - -pre { - overflow: auto; - overflow-y: hidden; /* fixes display issues on Chrome browsers */ -} - -pre, div[class*="highlight-"] { - clear: both; -} - -span.pre { - -moz-hyphens: none; - -ms-hyphens: none; - -webkit-hyphens: none; - hyphens: none; - white-space: nowrap; -} - -div[class*="highlight-"] { - margin: 1em 0; -} - -td.linenos pre { - border: 0; - background-color: transparent; - color: #aaa; -} - -table.highlighttable { - display: block; -} - -table.highlighttable tbody { - display: block; -} - -table.highlighttable tr { - display: flex; -} - -table.highlighttable td { - margin: 0; - padding: 0; -} - -table.highlighttable td.linenos { - padding-right: 0.5em; -} - -table.highlighttable td.code { - flex: 1; - overflow: hidden; -} - -.highlight .hll { - display: block; -} - -div.highlight pre, -table.highlighttable pre { - margin: 0; -} - -div.code-block-caption + div { - margin-top: 0; -} - -div.code-block-caption { - margin-top: 1em; - padding: 2px 5px; - font-size: small; -} - -div.code-block-caption code { - background-color: transparent; -} - -table.highlighttable td.linenos, -span.linenos, -div.highlight span.gp { /* gp: Generic.Prompt */ - user-select: none; - -webkit-user-select: text; /* Safari fallback only */ - -webkit-user-select: none; /* Chrome/Safari */ - -moz-user-select: none; /* Firefox */ - -ms-user-select: none; /* IE10+ */ -} - -div.code-block-caption span.caption-number { - padding: 0.1em 0.3em; - font-style: italic; -} - -div.code-block-caption span.caption-text { -} - -div.literal-block-wrapper { - margin: 1em 0; -} - -code.xref, a code { - background-color: transparent; - font-weight: bold; -} - -h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { - background-color: transparent; -} - -.viewcode-link { - float: right; -} - -.viewcode-back { - float: right; - font-family: sans-serif; -} - -div.viewcode-block:target { - margin: -1px -10px; - padding: 0 10px; -} - -/* -- math display ---------------------------------------------------------- */ - -img.math { - vertical-align: middle; -} - -div.body div.math p { - text-align: center; -} - -span.eqno { - float: right; -} - -span.eqno a.headerlink { - position: absolute; - z-index: 1; -} - -div.math:hover a.headerlink { - visibility: visible; -} - -/* -- printout stylesheet --------------------------------------------------- */ - -@media print { - div.document, - div.documentwrapper, - div.bodywrapper { - margin: 0 !important; - width: 100%; - } - - div.sphinxsidebar, - div.related, - div.footer, - #top-link { - display: none; - } -} \ No newline at end of file diff --git a/latest/_static/custom.css b/latest/_static/custom.css deleted file mode 100644 index cd8af758..00000000 --- a/latest/_static/custom.css +++ /dev/null @@ -1,3 +0,0 @@ -html[data-accent-color='lime'] { - --accent-9: #7efa01; -} \ No newline at end of file diff --git a/latest/_static/doctools.js b/latest/_static/doctools.js deleted file mode 100644 index d06a71d7..00000000 --- a/latest/_static/doctools.js +++ /dev/null @@ -1,156 +0,0 @@ -/* - * doctools.js - * ~~~~~~~~~~~ - * - * Base JavaScript utilities for all Sphinx HTML documentation. - * - * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ -"use strict"; - -const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ - "TEXTAREA", - "INPUT", - "SELECT", - "BUTTON", -]); - -const _ready = (callback) => { - if (document.readyState !== "loading") { - callback(); - } else { - document.addEventListener("DOMContentLoaded", callback); - } -}; - -/** - * Small JavaScript module for the documentation. - */ -const Documentation = { - init: () => { - Documentation.initDomainIndexTable(); - Documentation.initOnKeyListeners(); - }, - - /** - * i18n support - */ - TRANSLATIONS: {}, - PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), - LOCALE: "unknown", - - // gettext and ngettext don't access this so that the functions - // can safely bound to a different name (_ = Documentation.gettext) - gettext: (string) => { - const translated = Documentation.TRANSLATIONS[string]; - switch (typeof translated) { - case "undefined": - return string; // no translation - case "string": - return translated; // translation exists - default: - return translated[0]; // (singular, plural) translation tuple exists - } - }, - - ngettext: (singular, plural, n) => { - const translated = Documentation.TRANSLATIONS[singular]; - if (typeof translated !== "undefined") - return translated[Documentation.PLURAL_EXPR(n)]; - return n === 1 ? singular : plural; - }, - - addTranslations: (catalog) => { - Object.assign(Documentation.TRANSLATIONS, catalog.messages); - Documentation.PLURAL_EXPR = new Function( - "n", - `return (${catalog.plural_expr})` - ); - Documentation.LOCALE = catalog.locale; - }, - - /** - * helper function to focus on search bar - */ - focusSearchBar: () => { - document.querySelectorAll("input[name=q]")[0]?.focus(); - }, - - /** - * Initialise the domain index toggle buttons - */ - initDomainIndexTable: () => { - const toggler = (el) => { - const idNumber = el.id.substr(7); - const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); - if (el.src.substr(-9) === "minus.png") { - el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; - toggledRows.forEach((el) => (el.style.display = "none")); - } else { - el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; - toggledRows.forEach((el) => (el.style.display = "")); - } - }; - - const togglerElements = document.querySelectorAll("img.toggler"); - togglerElements.forEach((el) => - el.addEventListener("click", (event) => toggler(event.currentTarget)) - ); - togglerElements.forEach((el) => (el.style.display = "")); - if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); - }, - - initOnKeyListeners: () => { - // only install a listener if it is really needed - if ( - !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && - !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS - ) - return; - - document.addEventListener("keydown", (event) => { - // bail for input elements - if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; - // bail with special keys - if (event.altKey || event.ctrlKey || event.metaKey) return; - - if (!event.shiftKey) { - switch (event.key) { - case "ArrowLeft": - if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; - - const prevLink = document.querySelector('link[rel="prev"]'); - if (prevLink && prevLink.href) { - window.location.href = prevLink.href; - event.preventDefault(); - } - break; - case "ArrowRight": - if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; - - const nextLink = document.querySelector('link[rel="next"]'); - if (nextLink && nextLink.href) { - window.location.href = nextLink.href; - event.preventDefault(); - } - break; - } - } - - // some keyboard layouts may need Shift to get / - switch (event.key) { - case "/": - if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; - Documentation.focusSearchBar(); - event.preventDefault(); - } - }); - }, -}; - -// quick alias for translations -const _ = Documentation.gettext; - -_ready(Documentation.init); diff --git a/latest/_static/documentation_options.js b/latest/_static/documentation_options.js deleted file mode 100644 index b57ae3b8..00000000 --- a/latest/_static/documentation_options.js +++ /dev/null @@ -1,14 +0,0 @@ -var DOCUMENTATION_OPTIONS = { - URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), - VERSION: '', - LANGUAGE: 'en', - COLLAPSE_INDEX: false, - BUILDER: 'html', - FILE_SUFFIX: '.html', - LINK_SUFFIX: '.html', - HAS_SOURCE: true, - SOURCELINK_SUFFIX: '.txt', - NAVIGATION_WITH_KEYS: false, - SHOW_SEARCH_SUMMARY: true, - ENABLE_SEARCH_SHORTCUTS: true, -}; \ No newline at end of file diff --git a/latest/_static/favicon.ico b/latest/_static/favicon.ico deleted file mode 100644 index 05f17aa6ab75d43d3a9e87760cd2919fffc8d3d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20915 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"Yq4&OE@>8tQjArj%e{Hr*X zrUg+6e7Ha&+f`92+lL6DwO7h59FguyUG9RpYeeQFlJ=$=37Ll6w_2<)W?oHmu4Pv0 z#G=}6VNzE);b&Y2Nh^n6_ZoHtQvP7E3m^fTwY>^3A-L+YhO2_wzr!9stz$aSKyCfwm2HrYw>Qr-lUQ0uq${7KyQn zOb;Qz5I3{v)~NH7?lmDqHF?s=12sE8%x!~VJd?cL8(E4E z?exxzpiv(z^N8yp-TBa7EICr|4;XEW*MRKDq0b8(MiPyhE-_RUH1s>7ZM=2py&DW5Ec)vgpr zq4grM>4;=3Mh@U80*l`0r5+4wb{Y6A@5Y^QWC-VtZ|cdlycKtm>BMx2>>xlhkAKjG zK)(6P&A6ZJ372#u8_4Ow2{x?X-!GYBPTkSsIF`&++{h4N{a6%Ghs%7)NY|!*uYcnY z1r=EN7Fe@Y+?};nQ(RCXw6O1OhC9KlUJz)$+#B4J0zqR7!6bvL@jjzOX<6L&x&NZm zB6&xjDth+upHt}o=Jq_|YSM58b$jd6kSx0`tfdZ;0tu1A-%pIjKMb>Mwooypv%S=k zW55L7mqszeH)M<@2EkHwW)Nlq=wkWS}TajEh2yRJWj|56>_4f z)VrGA+k0J#8+WyI0E)3WH}CSa>Kuh8@UoO!EHNMYr0s?X%F2klV0&5PFppe`3wSw` z%Nbc!ZLc;D3e zX>}W-c7NhtuiO`9hs-i$_gr|d4hzlAUT8ComWZX9Wf@UG?$5|==;S3vEDVRS>X+zQ z-tpoJJ3L4GWa1}To>PRvVFDCqMy9I`&ZuB;*98kOl@c2~N_6|pNI2qHs4Kkr{-|}y zFTVev*Jd4mW4&E??HQLhi_Y~=y8I)uh(94q@yx@A)s2jf_I?1o!tVY!L- z!~%HPe}irGrTSD1zF&#%)D|!$q-By)1rdF)R=e2-Som9 z@XXQg4SOrQlo&?DJO;E2ZcWsb0rqvpM_ z2yc@_Mf-#m{4{}*hD|u^ICJ{0ELvO4m=L=RCaz@TM6C0*`c|{>=ww3@P<3XCAlBOb zo6Uu`^Hk+_9RU*o2TwxFcKxJFR|c?*$m$`RI*9tBo9ZwqGV z1-Z*Y15G%SFIF8d5L77pJlB`sLx5p`0D|VF;}(~dMSNa$rx}|WxIrHi6z32^!N2=v zqxQw!82<4OMWUfOGvbATB8r&>QH= z){zTFb2F{H_+&fzwDI6;V8uO`tK*3&iHvVj=+FSEij|V*V|)`AUUVT;W#sm^%Mbe| z)}DmZu`zD~iPle&Rpomd+FV3g+vjc_hy>jL?tU^S*-rH!ZfnXPNpYG5B zF?n3Y@F1~GmK0Bvj588jtP26gAt{scr9IFiGj#tiJ&|2l*x%)ek}t)&ye6hNiX{91q0qz z>i^&dSBE>YS~Cs&ilflIsGttws%qMC>K6CrE!&S+`4(u@wZ|vA=SN$sq2&_-;q-Zy z1zglg9Mq4KDaBxYEKOvJA@$xqovmiwu0?GRZ951Y3&!d5z*_#i8;^HsBn!S9F2+}<*mO;|a4V~rt1TU-OidU=-`d4gDH8`8Qt|s1pY+@Z1MRy&n$?g#;LHJP zthUjRZsGz-B&%_ruthQa5`JEs7tykLuI~c!zINAaiMQ5XQ}-C;4WE|1DopU+_)|7}`1!MSV zo~t~D={jxB{KNLe(AhtLD0M(C1|WG7%$Kop<25grg6fMbsY0;rm>f!ISAJ%b3dKb4 zIeI6m#_HOr7fGY?#K*{*KX3G7Ph!$P#eCa)QJee%zF~bw%hMvMfYCQ_Abz@+n~#$; z6Vd^>^#bL3(TOQq#!hx`G_Jc||H{x3n@M*Bc8{(4U!rW7eVKMXP?ybQt^Z%6N+zqM zmMScS)|Lws>b$3=>DhLogm*8}TogqaH-3;xXnDUUxHW^=F zzTHX<7M)K0tQR>giQRsCgf=^NyK&6d_Ds`c#6*_$>DP-A@j}E4dgM^}>2r(5abop0 z)?N&~&u3zN)1I_k2R7!j=wp_p_NoR4=^dBXVy^vlOTu#sMX&{_*t%ZosGIn2ne8}n zvtAetfHAT8@<`1^Ea6$JS)HK2{R9_j=^5Glac7grjVKr!FP&TIuVC&O7hzL>2uX48 z>%<4l_rV;mdpCeR_Pm3NMlM@u+;i+q85i`YR0Mw@Rpuv@i-z->oKz57^N1JqgfD`N zPw*o^@CJwh`o1p1H{`;iV{LkQ*)k@ZCGIn=B`IViUO-dc!H$;(6jux{_{*7 z)|Zs3omf~_%@31PJ=U`$s2u#oqNmAVjezu>=r4I5*fmFSf_ypx+6m442PdRYQPkr4 zSGn(})keaG&iY84lx}n%tiFa?k8A0$ugTf`48`4Jjm30TT+x@TPq{y$lf&xHNF*s%}*b4K@Ht}Ill0Y7V@*84Q3iw zWoJxm^t>7k`diDra~?vpOg~tnTrD2+L`1J$9d2(lGz^W5mj0kn-=UAi%xm#VaqxD3 zODd_YR-V8#v9M#&s}hZC5lvV|nM6m2r@l9U{y}%kZ~t31=l9=}8l?ZHqXq{uA>zr4 VW@&8pv;TSu&5f;35c7M{{|5?#y{!NM diff --git a/latest/_static/file.png b/latest/_static/file.png deleted file mode 100644 index a858a410e4faa62ce324d814e4b816fff83a6fb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 286 zcmV+(0pb3MP)s`hMrGg#P~ix$^RISR_I47Y|r1 z_CyJOe}D1){SET-^Amu_i71Lt6eYfZjRyw@I6OQAIXXHDfiX^GbOlHe=Ae4>0m)d(f|Me07*qoM6N<$f}vM^LjV8( diff --git a/latest/_static/jquery.js b/latest/_static/jquery.js deleted file mode 100644 index c4c6022f..00000000 --- a/latest/_static/jquery.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ -!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 00 - var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 - var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 - var s_v = "^(" + C + ")?" + v; // vowel in stem - - this.stemWord = function (w) { - var stem; - var suffix; - var firstch; - var origword = w; - - if (w.length < 3) - return w; - - var re; - var re2; - var re3; - var re4; - - firstch = w.substr(0,1); - if (firstch == "y") - w = firstch.toUpperCase() + w.substr(1); - - // Step 1a - re = /^(.+?)(ss|i)es$/; - re2 = /^(.+?)([^s])s$/; - - if (re.test(w)) - w = w.replace(re,"$1$2"); - else if (re2.test(w)) - w = w.replace(re2,"$1$2"); - - // Step 1b - re = /^(.+?)eed$/; - re2 = /^(.+?)(ed|ing)$/; - if (re.test(w)) { - var fp = re.exec(w); - re = new RegExp(mgr0); - if (re.test(fp[1])) { - re = /.$/; - w = w.replace(re,""); - } - } - else if (re2.test(w)) { - var fp = re2.exec(w); - stem = fp[1]; - re2 = new RegExp(s_v); - if (re2.test(stem)) { - w = stem; - re2 = /(at|bl|iz)$/; - re3 = new RegExp("([^aeiouylsz])\\1$"); - re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); - if (re2.test(w)) - w = w + "e"; - else if (re3.test(w)) { - re = /.$/; - w = w.replace(re,""); - } - else if (re4.test(w)) - w = w + "e"; - } - } - - // Step 1c - re = /^(.+?)y$/; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - re = new RegExp(s_v); - if (re.test(stem)) - w = stem + "i"; - } - - // Step 2 - re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - suffix = fp[2]; - re = new RegExp(mgr0); - if (re.test(stem)) - w = stem + step2list[suffix]; - } - - // Step 3 - re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - suffix = fp[2]; - re = new RegExp(mgr0); - if (re.test(stem)) - w = stem + step3list[suffix]; - } - - // Step 4 - re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; - re2 = /^(.+?)(s|t)(ion)$/; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - re = new RegExp(mgr1); - if (re.test(stem)) - w = stem; - } - else if (re2.test(w)) { - var fp = re2.exec(w); - stem = fp[1] + fp[2]; - re2 = new RegExp(mgr1); - if (re2.test(stem)) - w = stem; - } - - // Step 5 - re = /^(.+?)e$/; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - re = new RegExp(mgr1); - re2 = new RegExp(meq1); - re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); - if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) - w = stem; - } - re = /ll$/; - re2 = new RegExp(mgr1); - if (re.test(w) && re2.test(w)) { - re = /.$/; - w = w.replace(re,""); - } - - // and turn initial Y back to y - if (firstch == "y") - w = firstch.toLowerCase() + w.substr(1); - return w; - } -} - diff --git a/latest/_static/logo.gif b/latest/_static/logo.gif deleted file mode 100644 index b3a1bcc2d7f73a117c68f028d5fa07cc626fffdc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11889 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/latest/_static/logo_grey.svg b/latest/_static/logo_grey.svg deleted file mode 100644 index f59c51c0..00000000 --- a/latest/_static/logo_grey.svg +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/latest/_static/minus.png b/latest/_static/minus.png deleted file mode 100644 index d96755fdaf8bb2214971e0db9c1fd3077d7c419d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^+#t*WBp7;*Yy1LIik>cxAr*|t7R?Mi>2?kWtu=nj kDsEF_5m^0CR;1wuP-*O&G^0G}KYk!hp00i_>zopr08q^qX#fBK diff --git a/latest/_static/plus.png b/latest/_static/plus.png deleted file mode 100644 index 7107cec93a979b9a5f64843235a16651d563ce2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^+#t*WBp7;*Yy1LIik>cxAr*|t7R?Mi>2?kWtu>-2 m3q%Vub%g%s<8sJhVPMczOq}xhg9DJoz~JfX=d#Wzp$Pyb1r*Kz diff --git a/latest/_static/print.css b/latest/_static/print.css deleted file mode 100644 index bd88769f..00000000 --- a/latest/_static/print.css +++ /dev/null @@ -1,42 +0,0 @@ -.sy-head { - position: static; - border-bottom: 1px solid var(--sy-c-divider); -} - -.sy-head-inner { - padding: 0; -} - -.sy-breadcrumbs { - display: none; -} - -h1, h2, h3, h4, h5, h6 { - page-break-inside: avoid; - page-break-after: avoid; -} - -.code-block-caption, -pre, code { - page-break-inside: avoid; - white-space: pre-wrap; - - -webkit-print-color-adjust: exact; -} - -.yue a.headerlink { - display: none; -} - -.highlight .linenos { - box-shadow: none; -} - -.admonition, -.sd-sphinx-override { - -webkit-print-color-adjust: exact; -} - -.sd-card { - page-break-inside: avoid; -} diff --git a/latest/_static/pygments.css b/latest/_static/pygments.css deleted file mode 100644 index 449a846d..00000000 --- a/latest/_static/pygments.css +++ /dev/null @@ -1 +0,0 @@ -:root{--syntax-pre-bg: var(--accent-a2);--syntax-cap-bg: var(--accent-a3);--syntax-highlight-bg: var(--accent-a3);--syntax-linenos-divider: var(--gray-a6);--syntax-light-text: #24292f;--syntax-light-meta: #807c87;--syntax-light-comment: #6e7781;--syntax-light-constant: #0550ae;--syntax-light-entity: #268bd2;--syntax-light-property: #8250df;--syntax-light-definition: #24292f;--syntax-light-tag: #085;--syntax-light-builtin: #b58900;--syntax-light-keyword: #cf222e;--syntax-light-exception: #e6212e;--syntax-light-string: #0a3069;--syntax-light-regexp: #e40;--syntax-light-variable: #a4480f;--syntax-light-invalid-illegal-text: #f6f8fa;--syntax-light-invalid-illegal-bg: #82071e;--syntax-light-markup-heading: #0550ae;--syntax-light-markup-italic: #24292f;--syntax-light-markup-bold: #24292f;--syntax-light-markup-deleted-text: #82071e;--syntax-light-markup-deleted-bg: #FFEBE9;--syntax-light-markup-inserted-text: #116329;--syntax-light-markup-inserted-bg: #dafbe1;--syntax-light-markup-changed-text: #953800;--syntax-light-markup-changed-bg: #ffd8b5;--syntax-light-markup-ignored-text: #eaeef2;--syntax-light-markup-ignored-bg: #0550ae;--syntax-light-meta-diff-range: #8250df;--syntax-light-special-bg: #dccafa;--syntax-dark-text: #c9d1d9;--syntax-dark-meta: #6e7781;--syntax-dark-comment: #8b949e;--syntax-dark-constant: #79c0ff;--syntax-dark-entity: #47b0fa;--syntax-dark-property: #d2a8ff;--syntax-dark-definition: #c9d1d9;--syntax-dark-tag: #7ee787;--syntax-dark-builtin: #ffd34c;--syntax-dark-keyword: #ff7b72;--syntax-dark-exception: #da473c;--syntax-dark-string: #a5d6ff;--syntax-dark-regexp: #ef954e;--syntax-dark-variable: #ffa657;--syntax-dark-invalid-illegal-text: #f0f6fc;--syntax-dark-invalid-illegal-bg: #8e1519;--syntax-dark-markup-heading: #1f6feb;--syntax-dark-markup-italic: #c9d1d9;--syntax-dark-markup-bold: #c9d1d9;--syntax-dark-markup-deleted-text: #ffdcd7;--syntax-dark-markup-deleted-bg: #67060c;--syntax-dark-markup-inserted-text: #aff5b4;--syntax-dark-markup-inserted-bg: #033a16;--syntax-dark-markup-changed-text: #ffdfb6;--syntax-dark-markup-changed-bg: #5a1e02;--syntax-dark-markup-ignored-text: #c9d1d9;--syntax-dark-markup-ignored-bg: #1158c7;--syntax-dark-meta-diff-range: #d2a8ff;--syntax-dark-special-bg: #4f425d}:root,html.light{--syntax-text: var(--syntax-light-text);--syntax-meta: var(--syntax-light-meta);--syntax-comment: var(--syntax-light-comment);--syntax-constant: var(--syntax-light-constant);--syntax-entity: var(--syntax-light-entity);--syntax-property: var(--syntax-light-property);--syntax-definition: var(--syntax-light-definition);--syntax-tag: var(--syntax-light-tag);--syntax-builtin: var(--syntax-light-builtin);--syntax-keyword: var(--syntax-light-keyword);--syntax-exception: var(--syntax-light-exception);--syntax-string: var(--syntax-light-string);--syntax-regexp: var(--syntax-light-regexp);--syntax-variable: var(--syntax-light-variable);--syntax-invalid-illegal-text: var(--syntax-light-invalid-illegal-text);--syntax-invalid-illegal-bg: var(--syntax-light-invalid-illegal-bg);--syntax-markup-heading: var(--syntax-light-markup-heading);--syntax-markup-italic: var(--syntax-light-markup-italic);--syntax-markup-bold: var(--syntax-light-markup-bold);--syntax-markup-deleted-text: var(--syntax-light-markup-deleted-text);--syntax-markup-deleted-bg: var(--syntax-light-markup-deleted-bg);--syntax-markup-inserted-text: var(--syntax-light-markup-inserted-text);--syntax-markup-inserted-bg: var(--syntax-light-markup-inserted-bg);--syntax-markup-changed-text: var(--syntax-light-markup-changed-text);--syntax-markup-changed-bg: var(--syntax-light-markup-changed-bg);--syntax-markup-ignored-text: var(--syntax-light-markup-ignored-text);--syntax-markup-ignored-bg: var(--syntax-light-markup-ignored-bg);--syntax-meta-diff-range: var(--syntax-light-meta-diff-range);--syntax-special-bg: var(--syntax-light-special-bg)}@media (prefers-color-scheme: dark){:root{--syntax-text: var(--syntax-dark-text);--syntax-meta: var(--syntax-dark-meta);--syntax-comment: var(--syntax-dark-comment);--syntax-constant: var(--syntax-dark-constant);--syntax-entity: var(--syntax-dark-entity);--syntax-property: var(--syntax-dark-property);--syntax-definition: var(--syntax-dark-definition);--syntax-tag: var(--syntax-dark-tag);--syntax-builtin: var(--syntax-dark-builtin);--syntax-keyword: var(--syntax-dark-keyword);--syntax-exception: var(--syntax-dark-exception);--syntax-string: var(--syntax-dark-string);--syntax-regexp: var(--syntax-dark-regexp);--syntax-variable: var(--syntax-dark-variable);--syntax-invalid-illegal-text: var(--syntax-dark-invalid-illegal-text);--syntax-invalid-illegal-bg: var(--syntax-dark-invalid-illegal-bg);--syntax-markup-heading: var(--syntax-dark-markup-heading);--syntax-markup-italic: var(--syntax-dark-markup-italic);--syntax-markup-bold: var(--syntax-dark-markup-bold);--syntax-markup-deleted-text: var(--syntax-dark-markup-deleted-text);--syntax-markup-deleted-bg: var(--syntax-dark-markup-deleted-bg);--syntax-markup-inserted-text: var(--syntax-dark-markup-inserted-text);--syntax-markup-inserted-bg: var(--syntax-dark-markup-inserted-bg);--syntax-markup-changed-text: var(--syntax-dark-markup-changed-text);--syntax-markup-changed-bg: var(--syntax-dark-markup-changed-bg);--syntax-markup-ignored-text: var(--syntax-dark-markup-ignored-text);--syntax-markup-ignored-bg: var(--syntax-dark-markup-ignored-bg);--syntax-meta-diff-range: var(--syntax-dark-meta-diff-range);--syntax-special-bg: var(--syntax-dark-special-bg)}}html.dark{--syntax-text: var(--syntax-dark-text);--syntax-meta: var(--syntax-dark-meta);--syntax-comment: var(--syntax-dark-comment);--syntax-constant: var(--syntax-dark-constant);--syntax-entity: var(--syntax-dark-entity);--syntax-property: var(--syntax-dark-property);--syntax-definition: var(--syntax-dark-definition);--syntax-tag: var(--syntax-dark-tag);--syntax-builtin: var(--syntax-dark-builtin);--syntax-keyword: var(--syntax-dark-keyword);--syntax-exception: var(--syntax-dark-exception);--syntax-string: var(--syntax-dark-string);--syntax-regexp: var(--syntax-dark-regexp);--syntax-variable: var(--syntax-dark-variable);--syntax-invalid-illegal-text: var(--syntax-dark-invalid-illegal-text);--syntax-invalid-illegal-bg: var(--syntax-dark-invalid-illegal-bg);--syntax-markup-heading: var(--syntax-dark-markup-heading);--syntax-markup-italic: var(--syntax-dark-markup-italic);--syntax-markup-bold: var(--syntax-dark-markup-bold);--syntax-markup-deleted-text: var(--syntax-dark-markup-deleted-text);--syntax-markup-deleted-bg: var(--syntax-dark-markup-deleted-bg);--syntax-markup-inserted-text: var(--syntax-dark-markup-inserted-text);--syntax-markup-inserted-bg: var(--syntax-dark-markup-inserted-bg);--syntax-markup-changed-text: var(--syntax-dark-markup-changed-text);--syntax-markup-changed-bg: var(--syntax-dark-markup-changed-bg);--syntax-markup-ignored-text: var(--syntax-dark-markup-ignored-text);--syntax-markup-ignored-bg: var(--syntax-dark-markup-ignored-bg);--syntax-meta-diff-range: var(--syntax-dark-meta-diff-range);--syntax-special-bg: var(--syntax-dark-special-bg)}.light .dark-code{--syntax-pre-bg: var(--black-a12);--syntax-cap-bg: #1C2024;--syntax-highlight-bg: var(--white-a2);--syntax-linenos-divider: var(--white-a4);--syntax-text: var(--syntax-dark-text);--syntax-meta: var(--syntax-dark-meta);--syntax-comment: var(--syntax-dark-comment);--syntax-constant: var(--syntax-dark-constant);--syntax-entity: var(--syntax-dark-entity);--syntax-property: var(--syntax-dark-property);--syntax-definition: var(--syntax-dark-definition);--syntax-tag: var(--syntax-dark-tag);--syntax-builtin: var(--syntax-dark-builtin);--syntax-keyword: var(--syntax-dark-keyword);--syntax-exception: var(--syntax-dark-exception);--syntax-string: var(--syntax-dark-string);--syntax-regexp: var(--syntax-dark-regexp);--syntax-variable: var(--syntax-dark-variable);--syntax-invalid-illegal-text: var(--syntax-dark-invalid-illegal-text);--syntax-invalid-illegal-bg: var(--syntax-dark-invalid-illegal-bg);--syntax-markup-heading: var(--syntax-dark-markup-heading);--syntax-markup-italic: var(--syntax-dark-markup-italic);--syntax-markup-bold: var(--syntax-dark-markup-bold);--syntax-markup-deleted-text: var(--syntax-dark-markup-deleted-text);--syntax-markup-deleted-bg: var(--syntax-dark-markup-deleted-bg);--syntax-markup-inserted-text: var(--syntax-dark-markup-inserted-text);--syntax-markup-inserted-bg: var(--syntax-dark-markup-inserted-bg);--syntax-markup-changed-text: var(--syntax-dark-markup-changed-text);--syntax-markup-changed-bg: var(--syntax-dark-markup-changed-bg);--syntax-markup-ignored-text: var(--syntax-dark-markup-ignored-text);--syntax-markup-ignored-bg: var(--syntax-dark-markup-ignored-bg);--syntax-meta-diff-range: var(--syntax-dark-meta-diff-range);--syntax-special-bg: var(--syntax-dark-special-bg)}html.light .sd-tab-content,html.light .jupyter_container .cell_output{--syntax-pre-bg: var(--color-surface-accent);--syntax-cap-bg: var(--accent-3);--syntax-highlight-bg: var(--accent-a3);--syntax-text: var(--syntax-light-text);--syntax-meta: var(--syntax-light-meta);--syntax-comment: var(--syntax-light-comment);--syntax-constant: var(--syntax-light-constant);--syntax-entity: var(--syntax-light-entity);--syntax-property: var(--syntax-light-property);--syntax-definition: var(--syntax-light-definition);--syntax-tag: var(--syntax-light-tag);--syntax-builtin: var(--syntax-light-builtin);--syntax-keyword: var(--syntax-light-keyword);--syntax-exception: var(--syntax-light-exception);--syntax-string: var(--syntax-light-string);--syntax-regexp: var(--syntax-light-regexp);--syntax-variable: var(--syntax-light-variable);--syntax-invalid-illegal-text: var(--syntax-light-invalid-illegal-text);--syntax-invalid-illegal-bg: var(--syntax-light-invalid-illegal-bg);--syntax-markup-heading: var(--syntax-light-markup-heading);--syntax-markup-italic: var(--syntax-light-markup-italic);--syntax-markup-bold: var(--syntax-light-markup-bold);--syntax-markup-deleted-text: var(--syntax-light-markup-deleted-text);--syntax-markup-deleted-bg: var(--syntax-light-markup-deleted-bg);--syntax-markup-inserted-text: var(--syntax-light-markup-inserted-text);--syntax-markup-inserted-bg: var(--syntax-light-markup-inserted-bg);--syntax-markup-changed-text: var(--syntax-light-markup-changed-text);--syntax-markup-changed-bg: var(--syntax-light-markup-changed-bg);--syntax-markup-ignored-text: var(--syntax-light-markup-ignored-text);--syntax-markup-ignored-bg: var(--syntax-light-markup-ignored-bg);--syntax-meta-diff-range: var(--syntax-light-meta-diff-range);--syntax-highlight-bg: var(--syntax-light-highlight-bg);--syntax-special-bg: var(--syntax-light-special-bg)}.highlight{color:var(--syntax-text);background-color:transparent}.highlight .hll{display:block;background-color:var(--syntax-highlight-bg)}.highlight .c{color:var(--syntax-comment)}.highlight .err{color:var(--syntax-invalid-illegal-text);background-color:var(--syntax-invalid-illegal-bg)}.highlight .g{color:var(--syntax-meta)}.highlight .k{color:var(--syntax-keyword)}.highlight .l{color:var(--syntax-meta)}.highlight .o{color:var(--syntax-constant)}.highlight .x{color:var(--syntax-meta)}.highlight .cm{color:var(--syntax-comment)}.highlight .cp{color:var(--syntax-constant)}.highlight .c1{color:var(--syntax-comment)}.highlight .cs{color:var(--syntax-comment);background-color:var(--syntax-special-bg)}.highlight .gd{color:var(--syntax-markup-deleted-text);background-color:var(--syntax-markup-deleted-bg)}.highlight .ge{color:var(--syntax-markup-italic);font-style:italic}.highlight .gr{color:var(--syntax-invalid-illegal-text);background-color:var(--syntax-invalid-illegal-bg)}.highlight .gh{color:var(--syntax-markup-heading)}.highlight .gi{color:var(--syntax-markup-inserted-text);background-color:var(--syntax-markup-inserted-bg)}.highlight .go,.highlight .gp{color:var(--syntax-meta)}.highlight .gs{color:var(--syntax-markup-bold);font-weight:700}.highlight .gu{color:var(--syntax-markup-heading)}.highlight .gt{color:var(--syntax-meta)}.highlight .kc{color:var(--syntax-constant)}.highlight .kd,.highlight .kn,.highlight .kp,.highlight .kr{color:var(--syntax-keyword)}.highlight .kt{color:var(--syntax-entity)}.highlight .ld{color:var(--syntax-meta)}.highlight .m{color:var(--syntax-constant)}.highlight .s{color:var(--syntax-string)}.highlight .il,.highlight .na{color:var(--syntax-constant)}.highlight .nb{color:var(--syntax-builtin)}.highlight .nc{color:var(--syntax-definition)}.highlight .no{color:var(--syntax-constant)}.highlight .nd,.highlight .ni{color:var(--syntax-entity)}.highlight .ne{color:var(--syntax-exception)}.highlight .nf{color:var(--syntax-definition)}.highlight .nt{color:var(--syntax-tag)}.highlight .ow{color:var(--syntax-constant)}.highlight .w{color:var(--syntax-meta)}.highlight .mf,.highlight .mh,.highlight .mi,.highlight .mo{color:var(--syntax-constant)}.highlight .sb{color:var(--syntax-meta)}.highlight .sc{color:var(--syntax-string)}.highlight .sd{color:var(--syntax-comment)}.highlight .s2,.highlight .se{color:var(--syntax-string)}.highlight .sh{color:var(--syntax-comment)}.highlight .si,.highlight .sx{color:var(--syntax-string)}.highlight .sr{color:var(--syntax-regexp)}.highlight .s1,.highlight .ss{color:var(--syntax-string)}.highlight .bp,.highlight .vc,.highlight .vg,.highlight .vi{color:var(--syntax-variable)} diff --git a/latest/_static/searchtools.js b/latest/_static/searchtools.js deleted file mode 100644 index 97d56a74..00000000 --- a/latest/_static/searchtools.js +++ /dev/null @@ -1,566 +0,0 @@ -/* - * searchtools.js - * ~~~~~~~~~~~~~~~~ - * - * Sphinx JavaScript utilities for the full-text search. - * - * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ -"use strict"; - -/** - * Simple result scoring code. - */ -if (typeof Scorer === "undefined") { - var Scorer = { - // Implement the following function to further tweak the score for each result - // The function takes a result array [docname, title, anchor, descr, score, filename] - // and returns the new score. - /* - score: result => { - const [docname, title, anchor, descr, score, filename] = result - return score - }, - */ - - // query matches the full name of an object - objNameMatch: 11, - // or matches in the last dotted part of the object name - objPartialMatch: 6, - // Additive scores depending on the priority of the object - objPrio: { - 0: 15, // used to be importantResults - 1: 5, // used to be objectResults - 2: -5, // used to be unimportantResults - }, - // Used when the priority is not in the mapping. - objPrioDefault: 0, - - // query found in title - title: 15, - partialTitle: 7, - // query found in terms - term: 5, - partialTerm: 2, - }; -} - -const _removeChildren = (element) => { - while (element && element.lastChild) element.removeChild(element.lastChild); -}; - -/** - * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping - */ -const _escapeRegExp = (string) => - string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string - -const _displayItem = (item, searchTerms) => { - const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; - const docUrlRoot = DOCUMENTATION_OPTIONS.URL_ROOT; - const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; - const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; - const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; - - const [docName, title, anchor, descr, score, _filename] = item; - - let listItem = document.createElement("li"); - let requestUrl; - let linkUrl; - if (docBuilder === "dirhtml") { - // dirhtml builder - let dirname = docName + "/"; - if (dirname.match(/\/index\/$/)) - dirname = dirname.substring(0, dirname.length - 6); - else if (dirname === "index/") dirname = ""; - requestUrl = docUrlRoot + dirname; - linkUrl = requestUrl; - } else { - // normal html builders - requestUrl = docUrlRoot + docName + docFileSuffix; - linkUrl = docName + docLinkSuffix; - } - let linkEl = listItem.appendChild(document.createElement("a")); - linkEl.href = linkUrl + anchor; - linkEl.dataset.score = score; - linkEl.innerHTML = title; - if (descr) - listItem.appendChild(document.createElement("span")).innerHTML = - " (" + descr + ")"; - else if (showSearchSummary) - fetch(requestUrl) - .then((responseData) => responseData.text()) - .then((data) => { - if (data) - listItem.appendChild( - Search.makeSearchSummary(data, searchTerms) - ); - }); - Search.output.appendChild(listItem); -}; -const _finishSearch = (resultCount) => { - Search.stopPulse(); - Search.title.innerText = _("Search Results"); - if (!resultCount) - Search.status.innerText = Documentation.gettext( - "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." - ); - else - Search.status.innerText = _( - `Search finished, found ${resultCount} page(s) matching the search query.` - ); -}; -const _displayNextItem = ( - results, - resultCount, - searchTerms -) => { - // results left, load the summary and display it - // this is intended to be dynamic (don't sub resultsCount) - if (results.length) { - _displayItem(results.pop(), searchTerms); - setTimeout( - () => _displayNextItem(results, resultCount, searchTerms), - 5 - ); - } - // search finished, update title and status message - else _finishSearch(resultCount); -}; - -/** - * Default splitQuery function. Can be overridden in ``sphinx.search`` with a - * custom function per language. - * - * The regular expression works by splitting the string on consecutive characters - * that are not Unicode letters, numbers, underscores, or emoji characters. - * This is the same as ``\W+`` in Python, preserving the surrogate pair area. - */ -if (typeof splitQuery === "undefined") { - var splitQuery = (query) => query - .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) - .filter(term => term) // remove remaining empty strings -} - -/** - * Search Module - */ -const Search = { - _index: null, - _queued_query: null, - _pulse_status: -1, - - htmlToText: (htmlString) => { - const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); - htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); - const docContent = htmlElement.querySelector('[role="main"]'); - if (docContent !== undefined) return docContent.textContent; - console.warn( - "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." - ); - return ""; - }, - - init: () => { - const query = new URLSearchParams(window.location.search).get("q"); - document - .querySelectorAll('input[name="q"]') - .forEach((el) => (el.value = query)); - if (query) Search.performSearch(query); - }, - - loadIndex: (url) => - (document.body.appendChild(document.createElement("script")).src = url), - - setIndex: (index) => { - Search._index = index; - if (Search._queued_query !== null) { - const query = Search._queued_query; - Search._queued_query = null; - Search.query(query); - } - }, - - hasIndex: () => Search._index !== null, - - deferQuery: (query) => (Search._queued_query = query), - - stopPulse: () => (Search._pulse_status = -1), - - startPulse: () => { - if (Search._pulse_status >= 0) return; - - const pulse = () => { - Search._pulse_status = (Search._pulse_status + 1) % 4; - Search.dots.innerText = ".".repeat(Search._pulse_status); - if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); - }; - pulse(); - }, - - /** - * perform a search for something (or wait until index is loaded) - */ - performSearch: (query) => { - // create the required interface elements - const searchText = document.createElement("h2"); - searchText.textContent = _("Searching"); - const searchSummary = document.createElement("p"); - searchSummary.classList.add("search-summary"); - searchSummary.innerText = ""; - const searchList = document.createElement("ul"); - searchList.classList.add("search"); - - const out = document.getElementById("search-results"); - Search.title = out.appendChild(searchText); - Search.dots = Search.title.appendChild(document.createElement("span")); - Search.status = out.appendChild(searchSummary); - Search.output = out.appendChild(searchList); - - const searchProgress = document.getElementById("search-progress"); - // Some themes don't use the search progress node - if (searchProgress) { - searchProgress.innerText = _("Preparing search..."); - } - Search.startPulse(); - - // index already loaded, the browser was quick! - if (Search.hasIndex()) Search.query(query); - else Search.deferQuery(query); - }, - - /** - * execute search (requires search index to be loaded) - */ - query: (query) => { - const filenames = Search._index.filenames; - const docNames = Search._index.docnames; - const titles = Search._index.titles; - const allTitles = Search._index.alltitles; - const indexEntries = Search._index.indexentries; - - // stem the search terms and add them to the correct list - const stemmer = new Stemmer(); - const searchTerms = new Set(); - const excludedTerms = new Set(); - const highlightTerms = new Set(); - const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); - splitQuery(query.trim()).forEach((queryTerm) => { - const queryTermLower = queryTerm.toLowerCase(); - - // maybe skip this "word" - // stopwords array is from language_data.js - if ( - stopwords.indexOf(queryTermLower) !== -1 || - queryTerm.match(/^\d+$/) - ) - return; - - // stem the word - let word = stemmer.stemWord(queryTermLower); - // select the correct list - if (word[0] === "-") excludedTerms.add(word.substr(1)); - else { - searchTerms.add(word); - highlightTerms.add(queryTermLower); - } - }); - - if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js - localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) - } - - // console.debug("SEARCH: searching for:"); - // console.info("required: ", [...searchTerms]); - // console.info("excluded: ", [...excludedTerms]); - - // array of [docname, title, anchor, descr, score, filename] - let results = []; - _removeChildren(document.getElementById("search-progress")); - - const queryLower = query.toLowerCase(); - for (const [title, foundTitles] of Object.entries(allTitles)) { - if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { - for (const [file, id] of foundTitles) { - let score = Math.round(100 * queryLower.length / title.length) - results.push([ - docNames[file], - titles[file] !== title ? `${titles[file]} > ${title}` : title, - id !== null ? "#" + id : "", - null, - score, - filenames[file], - ]); - } - } - } - - // search for explicit entries in index directives - for (const [entry, foundEntries] of Object.entries(indexEntries)) { - if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { - for (const [file, id] of foundEntries) { - let score = Math.round(100 * queryLower.length / entry.length) - results.push([ - docNames[file], - titles[file], - id ? "#" + id : "", - null, - score, - filenames[file], - ]); - } - } - } - - // lookup as object - objectTerms.forEach((term) => - results.push(...Search.performObjectSearch(term, objectTerms)) - ); - - // lookup as search terms in fulltext - results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); - - // let the scorer override scores with a custom scoring function - if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); - - // now sort the results by score (in opposite order of appearance, since the - // display function below uses pop() to retrieve items) and then - // alphabetically - results.sort((a, b) => { - const leftScore = a[4]; - const rightScore = b[4]; - if (leftScore === rightScore) { - // same score: sort alphabetically - const leftTitle = a[1].toLowerCase(); - const rightTitle = b[1].toLowerCase(); - if (leftTitle === rightTitle) return 0; - return leftTitle > rightTitle ? -1 : 1; // inverted is intentional - } - return leftScore > rightScore ? 1 : -1; - }); - - // remove duplicate search results - // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept - let seen = new Set(); - results = results.reverse().reduce((acc, result) => { - let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); - if (!seen.has(resultStr)) { - acc.push(result); - seen.add(resultStr); - } - return acc; - }, []); - - results = results.reverse(); - - // for debugging - //Search.lastresults = results.slice(); // a copy - // console.info("search results:", Search.lastresults); - - // print the results - _displayNextItem(results, results.length, searchTerms); - }, - - /** - * search for object names - */ - performObjectSearch: (object, objectTerms) => { - const filenames = Search._index.filenames; - const docNames = Search._index.docnames; - const objects = Search._index.objects; - const objNames = Search._index.objnames; - const titles = Search._index.titles; - - const results = []; - - const objectSearchCallback = (prefix, match) => { - const name = match[4] - const fullname = (prefix ? prefix + "." : "") + name; - const fullnameLower = fullname.toLowerCase(); - if (fullnameLower.indexOf(object) < 0) return; - - let score = 0; - const parts = fullnameLower.split("."); - - // check for different match types: exact matches of full name or - // "last name" (i.e. last dotted part) - if (fullnameLower === object || parts.slice(-1)[0] === object) - score += Scorer.objNameMatch; - else if (parts.slice(-1)[0].indexOf(object) > -1) - score += Scorer.objPartialMatch; // matches in last name - - const objName = objNames[match[1]][2]; - const title = titles[match[0]]; - - // If more than one term searched for, we require other words to be - // found in the name/title/description - const otherTerms = new Set(objectTerms); - otherTerms.delete(object); - if (otherTerms.size > 0) { - const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); - if ( - [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) - ) - return; - } - - let anchor = match[3]; - if (anchor === "") anchor = fullname; - else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; - - const descr = objName + _(", in ") + title; - - // add custom score for some objects according to scorer - if (Scorer.objPrio.hasOwnProperty(match[2])) - score += Scorer.objPrio[match[2]]; - else score += Scorer.objPrioDefault; - - results.push([ - docNames[match[0]], - fullname, - "#" + anchor, - descr, - score, - filenames[match[0]], - ]); - }; - Object.keys(objects).forEach((prefix) => - objects[prefix].forEach((array) => - objectSearchCallback(prefix, array) - ) - ); - return results; - }, - - /** - * search for full-text terms in the index - */ - performTermsSearch: (searchTerms, excludedTerms) => { - // prepare search - const terms = Search._index.terms; - const titleTerms = Search._index.titleterms; - const filenames = Search._index.filenames; - const docNames = Search._index.docnames; - const titles = Search._index.titles; - - const scoreMap = new Map(); - const fileMap = new Map(); - - // perform the search on the required terms - searchTerms.forEach((word) => { - const files = []; - const arr = [ - { files: terms[word], score: Scorer.term }, - { files: titleTerms[word], score: Scorer.title }, - ]; - // add support for partial matches - if (word.length > 2) { - const escapedWord = _escapeRegExp(word); - Object.keys(terms).forEach((term) => { - if (term.match(escapedWord) && !terms[word]) - arr.push({ files: terms[term], score: Scorer.partialTerm }); - }); - Object.keys(titleTerms).forEach((term) => { - if (term.match(escapedWord) && !titleTerms[word]) - arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); - }); - } - - // no match but word was a required one - if (arr.every((record) => record.files === undefined)) return; - - // found search word in contents - arr.forEach((record) => { - if (record.files === undefined) return; - - let recordFiles = record.files; - if (recordFiles.length === undefined) recordFiles = [recordFiles]; - files.push(...recordFiles); - - // set score for the word in each file - recordFiles.forEach((file) => { - if (!scoreMap.has(file)) scoreMap.set(file, {}); - scoreMap.get(file)[word] = record.score; - }); - }); - - // create the mapping - files.forEach((file) => { - if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) - fileMap.get(file).push(word); - else fileMap.set(file, [word]); - }); - }); - - // now check if the files don't contain excluded terms - const results = []; - for (const [file, wordList] of fileMap) { - // check if all requirements are matched - - // as search terms with length < 3 are discarded - const filteredTermCount = [...searchTerms].filter( - (term) => term.length > 2 - ).length; - if ( - wordList.length !== searchTerms.size && - wordList.length !== filteredTermCount - ) - continue; - - // ensure that none of the excluded terms is in the search result - if ( - [...excludedTerms].some( - (term) => - terms[term] === file || - titleTerms[term] === file || - (terms[term] || []).includes(file) || - (titleTerms[term] || []).includes(file) - ) - ) - break; - - // select one (max) score for the file. - const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); - // add result to the result list - results.push([ - docNames[file], - titles[file], - "", - null, - score, - filenames[file], - ]); - } - return results; - }, - - /** - * helper function to return a node containing the - * search summary for a given text. keywords is a list - * of stemmed words. - */ - makeSearchSummary: (htmlText, keywords) => { - const text = Search.htmlToText(htmlText); - if (text === "") return null; - - const textLower = text.toLowerCase(); - const actualStartPosition = [...keywords] - .map((k) => textLower.indexOf(k.toLowerCase())) - .filter((i) => i > -1) - .slice(-1)[0]; - const startWithContext = Math.max(actualStartPosition - 120, 0); - - const top = startWithContext === 0 ? "" : "..."; - const tail = startWithContext + 240 < text.length ? "..." : ""; - - let summary = document.createElement("p"); - summary.classList.add("context"); - summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; - - return summary; - }, -}; - -_ready(Search.init); diff --git a/latest/_static/shibuya.css b/latest/_static/shibuya.css deleted file mode 100644 index 87873c8d..00000000 --- a/latest/_static/shibuya.css +++ /dev/null @@ -1 +0,0 @@ -/*! tailwindcss v3.4.3 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:initial;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:initial}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,::backdrop,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }.collapse{visibility:collapse}.order-last{order:9999}.mx-auto{margin-left:auto;margin-right:auto}.ml-1{margin-left:.25rem}.mr-3{margin-right:.75rem}.block{display:block}.flex{display:flex}.table{display:table}.contents{display:contents}.hidden{display:none}.w-64{width:16rem}.w-8{width:2rem}.w-full{width:100%}.min-w-0{min-width:0}.max-w-6xl{max-width:72rem}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.flex-grow{flex-grow:1}.-translate-x-1{--tw-translate-x:-0.25rem}.-translate-x-1,.-translate-x-2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-x-2{--tw-translate-x:-0.5rem}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-around{justify-content:space-around}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.p-6{padding:1.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pb-6{padding-bottom:1.5rem}.pr-3{padding-right:.75rem}.pt-12{padding-top:3rem}.pt-6{padding-top:1.5rem}.pt-8{padding-top:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-sm{font-size:.875rem;line-height:1.25rem}@font-face{font-family:Twemoji Country Flags;unicode-range:u+1f1e6-1f1ff,u+1f3f4,u+e0062-e0063,u+e0065,u+e0067,u+e006c,u+e006e,u+e0073-e0074,u+e0077,u+e007f;src:url(https://cdn.jsdelivr.net/npm/country-flag-emoji-polyfill@0.1/dist/TwemojiCountryFlags.woff2) format("woff2")}::-moz-selection{color:var(--accent-a11);background-color:var(--accent-a3)}::selection{color:var(--accent-a11);background-color:var(--accent-a3)}html{scroll-behavior:smooth}body{font-family:var(--sy-f-text);color:var(--sy-c-text)}.win{font-family:"Twemoji Country Flags",var(--sy-f-text)}h1,h2,h3,h4,h5{color:var(--sy-c-heading);font-family:var(--sy-f-heading)}em,strong{color:var(--sy-c-bold)}.sy-container{max-width:90rem}.sy-scrollbar{overflow-y:auto;scrollbar-gutter:stable}.sy-scrollbar::-webkit-scrollbar{height:.75rem;width:.75rem}.sy-scrollbar::-webkit-scrollbar-thumb{border-radius:10px}.sy-scrollbar::-webkit-scrollbar-track{background-color:initial}.sy-scrollbar:hover::-webkit-scrollbar-thumb{background-color:var(--gray-a3);background-clip:content-box;border:3px solid #0000}.i-icon,.i-lucide,.i-simpleicons{-webkit-mask:var(--icon-url) no-repeat;mask:var(--icon-url) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;width:1em;height:1em;display:inline-block;vertical-align:middle;font-style:normal;background-color:currentColor}.theme-switch .theme-icon,[data-color-mode=auto] .theme-switch .theme-icon{--icon-url:var(--lucide-laptop-url)}[data-color-mode=light] .theme-switch .theme-icon{--icon-url:var(--lucide-sun-url)}[data-color-mode=dark] .theme-switch .theme-icon{--icon-url:var(--lucide-moon-url)}.light,.light-theme,:root{--tomato-1:#fffcfc;--tomato-2:#fff8f7;--tomato-3:#feebe7;--tomato-4:#ffdcd3;--tomato-5:#ffcdc2;--tomato-6:#fdbdaf;--tomato-7:#f5a898;--tomato-8:#ec8e7b;--tomato-9:#e54d2e;--tomato-10:#dd4425;--tomato-11:#d13415;--tomato-12:#5c271f}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--tomato-1:color(display-p3 0.998 0.989 0.988);--tomato-2:color(display-p3 0.994 0.974 0.969);--tomato-3:color(display-p3 0.985 0.924 0.909);--tomato-4:color(display-p3 0.996 0.868 0.835);--tomato-5:color(display-p3 0.98 0.812 0.77);--tomato-6:color(display-p3 0.953 0.75 0.698);--tomato-7:color(display-p3 0.917 0.673 0.611);--tomato-8:color(display-p3 0.875 0.575 0.502);--tomato-9:color(display-p3 0.831 0.345 0.231);--tomato-10:color(display-p3 0.802 0.313 0.2);--tomato-11:color(display-p3 0.755 0.259 0.152);--tomato-12:color(display-p3 0.335 0.165 0.132)}}}.dark,.dark-theme{--tomato-1:#181111;--tomato-2:#1f1513;--tomato-3:#391714;--tomato-4:#4e1511;--tomato-5:#5e1c16;--tomato-6:#6e2920;--tomato-7:#853a2d;--tomato-8:#ac4d39;--tomato-9:#e54d2e;--tomato-10:#ec6142;--tomato-11:#ff977d;--tomato-12:#fbd3cb}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--tomato-1:color(display-p3 0.09 0.068 0.067);--tomato-2:color(display-p3 0.115 0.084 0.076);--tomato-3:color(display-p3 0.205 0.097 0.083);--tomato-4:color(display-p3 0.282 0.099 0.077);--tomato-5:color(display-p3 0.339 0.129 0.101);--tomato-6:color(display-p3 0.398 0.179 0.141);--tomato-7:color(display-p3 0.487 0.245 0.194);--tomato-8:color(display-p3 0.629 0.322 0.248);--tomato-9:color(display-p3 0.831 0.345 0.231);--tomato-10:color(display-p3 0.862 0.415 0.298);--tomato-11:color(display-p3 1 0.585 0.455);--tomato-12:color(display-p3 0.959 0.833 0.802)}}}.light,.light-theme,:root{--tomato-a1:#ff000003;--tomato-a2:#ff200008;--tomato-a3:#f52b0018;--tomato-a4:#ff35002c;--tomato-a5:#ff2e003d;--tomato-a6:#f92d0050;--tomato-a7:#e7280067;--tomato-a8:#db250084;--tomato-a9:#df2600d1;--tomato-a10:#d72400da;--tomato-a11:#cd2200ea;--tomato-a12:#460900e0}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--tomato-a1:color(display-p3 0.675 0.024 0.024/0.012);--tomato-a2:color(display-p3 0.757 0.145 0.02/0.032);--tomato-a3:color(display-p3 0.831 0.184 0.012/0.091);--tomato-a4:color(display-p3 0.976 0.192 0.004/0.165);--tomato-a5:color(display-p3 0.918 0.192 0.004/0.232);--tomato-a6:color(display-p3 0.847 0.173 0.004/0.302);--tomato-a7:color(display-p3 0.788 0.165 0.004/0.389);--tomato-a8:color(display-p3 0.749 0.153 0.004/0.499);--tomato-a9:color(display-p3 0.78 0.149 0/0.769);--tomato-a10:color(display-p3 0.757 0.141 0/0.8);--tomato-a11:color(display-p3 0.755 0.259 0.152);--tomato-a12:color(display-p3 0.335 0.165 0.132)}}}.dark,.dark-theme{--tomato-a1:#f1121208;--tomato-a2:#ff55330f;--tomato-a3:#ff35232b;--tomato-a4:#fd201142;--tomato-a5:#fe332153;--tomato-a6:#ff4f3864;--tomato-a7:#fd644a7d;--tomato-a8:#fe6d4ea7;--tomato-a9:#fe5431e4;--tomato-a10:#ff6847eb;--tomato-a11:#ff977d;--tomato-a12:#ffd6cefb}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--tomato-a1:color(display-p3 0.973 0.071 0.071/0.026);--tomato-a2:color(display-p3 0.992 0.376 0.224/0.051);--tomato-a3:color(display-p3 0.996 0.282 0.176/0.148);--tomato-a4:color(display-p3 1 0.204 0.118/0.232);--tomato-a5:color(display-p3 1 0.286 0.192/0.29);--tomato-a6:color(display-p3 1 0.392 0.278/0.353);--tomato-a7:color(display-p3 1 0.459 0.349/0.45);--tomato-a8:color(display-p3 1 0.49 0.369/0.601);--tomato-a9:color(display-p3 1 0.408 0.267/0.82);--tomato-a10:color(display-p3 1 0.478 0.341/0.853);--tomato-a11:color(display-p3 1 0.585 0.455);--tomato-a12:color(display-p3 0.959 0.833 0.802)}}}.light,.light-theme,:root{--red-1:#fffcfc;--red-2:#fff7f7;--red-3:#feebec;--red-4:#ffdbdc;--red-5:#ffcdce;--red-6:#fdbdbe;--red-7:#f4a9aa;--red-8:#eb8e90;--red-9:#e5484d;--red-10:#dc3e42;--red-11:#ce2c31;--red-12:#641723}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--red-1:color(display-p3 0.998 0.989 0.988);--red-2:color(display-p3 0.995 0.971 0.971);--red-3:color(display-p3 0.985 0.925 0.925);--red-4:color(display-p3 0.999 0.866 0.866);--red-5:color(display-p3 0.984 0.812 0.811);--red-6:color(display-p3 0.955 0.751 0.749);--red-7:color(display-p3 0.915 0.675 0.672);--red-8:color(display-p3 0.872 0.575 0.572);--red-9:color(display-p3 0.83 0.329 0.324);--red-10:color(display-p3 0.798 0.294 0.285);--red-11:color(display-p3 0.744 0.234 0.222);--red-12:color(display-p3 0.36 0.115 0.143)}}}.dark,.dark-theme{--red-1:#191111;--red-2:#201314;--red-3:#3b1219;--red-4:#500f1c;--red-5:#611623;--red-6:#72232d;--red-7:#8c333a;--red-8:#b54548;--red-9:#e5484d;--red-10:#ec5d5e;--red-11:#ff9592;--red-12:#ffd1d9}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--red-1:color(display-p3 0.093 0.068 0.067);--red-2:color(display-p3 0.118 0.077 0.079);--red-3:color(display-p3 0.211 0.081 0.099);--red-4:color(display-p3 0.287 0.079 0.113);--red-5:color(display-p3 0.348 0.11 0.142);--red-6:color(display-p3 0.414 0.16 0.183);--red-7:color(display-p3 0.508 0.224 0.236);--red-8:color(display-p3 0.659 0.298 0.297);--red-9:color(display-p3 0.83 0.329 0.324);--red-10:color(display-p3 0.861 0.403 0.387);--red-11:color(display-p3 1 0.57 0.55);--red-12:color(display-p3 0.971 0.826 0.852)}}}.light,.light-theme,:root{--red-a1:#ff000003;--red-a2:#ff000008;--red-a3:#f3000d14;--red-a4:#ff000824;--red-a5:#ff000632;--red-a6:#f8000442;--red-a7:#df000356;--red-a8:#d2000571;--red-a9:#db0007b7;--red-a10:#d10005c1;--red-a11:#c40006d3;--red-a12:#55000de8}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--red-a1:color(display-p3 0.675 0.024 0.024/0.012);--red-a2:color(display-p3 0.863 0.024 0.024/0.028);--red-a3:color(display-p3 0.792 0.008 0.008/0.075);--red-a4:color(display-p3 1 0.008 0.008/0.134);--red-a5:color(display-p3 0.918 0.008 0.008/0.189);--red-a6:color(display-p3 0.831 0.02 0.004/0.251);--red-a7:color(display-p3 0.741 0.016 0.004/0.33);--red-a8:color(display-p3 0.698 0.012 0.004/0.428);--red-a9:color(display-p3 0.749 0.008 0/0.675);--red-a10:color(display-p3 0.714 0.012 0/0.714);--red-a11:color(display-p3 0.744 0.234 0.222);--red-a12:color(display-p3 0.36 0.115 0.143)}}}.dark,.dark-theme{--red-a1:#f4121209;--red-a2:#f22f3e11;--red-a3:#ff173f2d;--red-a4:#fe0a3b44;--red-a5:#ff204756;--red-a6:#ff3e5668;--red-a7:#ff536184;--red-a8:#ff5d61b0;--red-a9:#fe4e54e4;--red-a10:#ff6465eb;--red-a11:#ff9592;--red-a12:#ffd1d9}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--red-a1:color(display-p3 0.984 0.071 0.071/0.03);--red-a2:color(display-p3 0.996 0.282 0.282/0.055);--red-a3:color(display-p3 1 0.169 0.271/0.156);--red-a4:color(display-p3 1 0.118 0.267/0.236);--red-a5:color(display-p3 1 0.212 0.314/0.303);--red-a6:color(display-p3 1 0.318 0.38/0.374);--red-a7:color(display-p3 1 0.4 0.424/0.475);--red-a8:color(display-p3 1 0.431 0.431/0.635);--red-a9:color(display-p3 1 0.388 0.384/0.82);--red-a10:color(display-p3 1 0.463 0.447/0.853);--red-a11:color(display-p3 1 0.57 0.55);--red-a12:color(display-p3 0.971 0.826 0.852)}}}.light,.light-theme,:root{--ruby-1:#fffcfd;--ruby-2:#fff7f8;--ruby-3:#feeaed;--ruby-4:#ffdce1;--ruby-5:#ffced6;--ruby-6:#f8bfc8;--ruby-7:#efacb8;--ruby-8:#e592a3;--ruby-9:#e54666;--ruby-10:#dc3b5d;--ruby-11:#ca244d;--ruby-12:#64172b}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--ruby-1:color(display-p3 0.998 0.989 0.992);--ruby-2:color(display-p3 0.995 0.971 0.974);--ruby-3:color(display-p3 0.983 0.92 0.928);--ruby-4:color(display-p3 0.987 0.869 0.885);--ruby-5:color(display-p3 0.968 0.817 0.839);--ruby-6:color(display-p3 0.937 0.758 0.786);--ruby-7:color(display-p3 0.897 0.685 0.721);--ruby-8:color(display-p3 0.851 0.588 0.639);--ruby-9:color(display-p3 0.83 0.323 0.408);--ruby-10:color(display-p3 0.795 0.286 0.375);--ruby-11:color(display-p3 0.728 0.211 0.311);--ruby-12:color(display-p3 0.36 0.115 0.171)}}}.dark,.dark-theme{--ruby-1:#191113;--ruby-2:#1e1517;--ruby-3:#3a141e;--ruby-4:#4e1325;--ruby-5:#5e1a2e;--ruby-6:#6f2539;--ruby-7:#883447;--ruby-8:#b3445a;--ruby-9:#e54666;--ruby-10:#ec5a72;--ruby-11:#ff949d;--ruby-12:#fed2e1}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--ruby-1:color(display-p3 0.093 0.068 0.074);--ruby-2:color(display-p3 0.113 0.083 0.089);--ruby-3:color(display-p3 0.208 0.088 0.117);--ruby-4:color(display-p3 0.279 0.092 0.147);--ruby-5:color(display-p3 0.337 0.12 0.18);--ruby-6:color(display-p3 0.401 0.166 0.223);--ruby-7:color(display-p3 0.495 0.224 0.281);--ruby-8:color(display-p3 0.652 0.295 0.359);--ruby-9:color(display-p3 0.83 0.323 0.408);--ruby-10:color(display-p3 0.857 0.392 0.455);--ruby-11:color(display-p3 1 0.57 0.59);--ruby-12:color(display-p3 0.968 0.83 0.88)}}}.light,.light-theme,:root{--ruby-a1:#ff005503;--ruby-a2:#ff002008;--ruby-a3:#f3002515;--ruby-a4:#ff002523;--ruby-a5:#ff002a31;--ruby-a6:#e4002440;--ruby-a7:#ce002553;--ruby-a8:#c300286d;--ruby-a9:#db002cb9;--ruby-a10:#d2002cc4;--ruby-a11:#c10030db;--ruby-a12:#550016e8}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--ruby-a1:color(display-p3 0.675 0.024 0.349/0.012);--ruby-a2:color(display-p3 0.863 0.024 0.024/0.028);--ruby-a3:color(display-p3 0.804 0.008 0.11/0.079);--ruby-a4:color(display-p3 0.91 0.008 0.125/0.13);--ruby-a5:color(display-p3 0.831 0.004 0.133/0.185);--ruby-a6:color(display-p3 0.745 0.004 0.118/0.244);--ruby-a7:color(display-p3 0.678 0.004 0.114/0.314);--ruby-a8:color(display-p3 0.639 0.004 0.125/0.412);--ruby-a9:color(display-p3 0.753 0 0.129/0.679);--ruby-a10:color(display-p3 0.714 0 0.125/0.714);--ruby-a11:color(display-p3 0.728 0.211 0.311);--ruby-a12:color(display-p3 0.36 0.115 0.171)}}}.dark,.dark-theme{--ruby-a1:#f4124a09;--ruby-a2:#fe5a7f0e;--ruby-a3:#ff235d2c;--ruby-a4:#fd195e42;--ruby-a5:#fe2d6b53;--ruby-a6:#ff447665;--ruby-a7:#ff577d80;--ruby-a8:#ff5c7cae;--ruby-a9:#fe4c70e4;--ruby-a10:#ff617beb;--ruby-a11:#ff949d;--ruby-a12:#ffd3e2}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--ruby-a1:color(display-p3 0.984 0.071 0.329/0.03);--ruby-a2:color(display-p3 0.992 0.376 0.529/0.051);--ruby-a3:color(display-p3 0.996 0.196 0.404/0.152);--ruby-a4:color(display-p3 1 0.173 0.416/0.227);--ruby-a5:color(display-p3 1 0.259 0.459/0.29);--ruby-a6:color(display-p3 1 0.341 0.506/0.358);--ruby-a7:color(display-p3 1 0.412 0.541/0.458);--ruby-a8:color(display-p3 1 0.431 0.537/0.627);--ruby-a9:color(display-p3 1 0.376 0.482/0.82);--ruby-a10:color(display-p3 1 0.447 0.522/0.849);--ruby-a11:color(display-p3 1 0.57 0.59);--ruby-a12:color(display-p3 0.968 0.83 0.88)}}}.light,.light-theme,:root{--crimson-1:#fffcfd;--crimson-2:#fef7f9;--crimson-3:#ffe9f0;--crimson-4:#fedce7;--crimson-5:#facedd;--crimson-6:#f3bed1;--crimson-7:#eaacc3;--crimson-8:#e093b2;--crimson-9:#e93d82;--crimson-10:#df3478;--crimson-11:#cb1d63;--crimson-12:#621639}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--crimson-1:color(display-p3 0.998 0.989 0.992);--crimson-2:color(display-p3 0.991 0.969 0.976);--crimson-3:color(display-p3 0.987 0.917 0.941);--crimson-4:color(display-p3 0.975 0.866 0.904);--crimson-5:color(display-p3 0.953 0.813 0.864);--crimson-6:color(display-p3 0.921 0.755 0.817);--crimson-7:color(display-p3 0.88 0.683 0.761);--crimson-8:color(display-p3 0.834 0.592 0.694);--crimson-9:color(display-p3 0.843 0.298 0.507);--crimson-10:color(display-p3 0.807 0.266 0.468);--crimson-11:color(display-p3 0.731 0.195 0.388);--crimson-12:color(display-p3 0.352 0.111 0.221)}}}.dark,.dark-theme{--crimson-1:#191114;--crimson-2:#201318;--crimson-3:#381525;--crimson-4:#4d122f;--crimson-5:#5c1839;--crimson-6:#6d2545;--crimson-7:#873356;--crimson-8:#b0436e;--crimson-9:#e93d82;--crimson-10:#ee518a;--crimson-11:#ff92ad;--crimson-12:#fdd3e8}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--crimson-1:color(display-p3 0.093 0.068 0.078);--crimson-2:color(display-p3 0.117 0.078 0.095);--crimson-3:color(display-p3 0.203 0.091 0.143);--crimson-4:color(display-p3 0.277 0.087 0.182);--crimson-5:color(display-p3 0.332 0.115 0.22);--crimson-6:color(display-p3 0.394 0.162 0.268);--crimson-7:color(display-p3 0.489 0.222 0.336);--crimson-8:color(display-p3 0.638 0.289 0.429);--crimson-9:color(display-p3 0.843 0.298 0.507);--crimson-10:color(display-p3 0.864 0.364 0.539);--crimson-11:color(display-p3 1 0.56 0.66);--crimson-12:color(display-p3 0.966 0.834 0.906)}}}.light,.light-theme,:root{--crimson-a1:#ff005503;--crimson-a2:#e0004008;--crimson-a3:#ff005216;--crimson-a4:#f8005123;--crimson-a5:#e5004f31;--crimson-a6:#d0004b41;--crimson-a7:#bf004753;--crimson-a8:#b6004a6c;--crimson-a9:#e2005bc2;--crimson-a10:#d70056cb;--crimson-a11:#c4004fe2;--crimson-a12:#530026e9}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--crimson-a1:color(display-p3 0.675 0.024 0.349/0.012);--crimson-a2:color(display-p3 0.757 0.02 0.267/0.032);--crimson-a3:color(display-p3 0.859 0.008 0.294/0.083);--crimson-a4:color(display-p3 0.827 0.008 0.298/0.134);--crimson-a5:color(display-p3 0.753 0.008 0.275/0.189);--crimson-a6:color(display-p3 0.682 0.004 0.247/0.244);--crimson-a7:color(display-p3 0.62 0.004 0.251/0.318);--crimson-a8:color(display-p3 0.6 0.004 0.251/0.408);--crimson-a9:color(display-p3 0.776 0 0.298/0.702);--crimson-a10:color(display-p3 0.737 0 0.275/0.734);--crimson-a11:color(display-p3 0.731 0.195 0.388);--crimson-a12:color(display-p3 0.352 0.111 0.221)}}}.dark,.dark-theme{--crimson-a1:#f4126709;--crimson-a2:#f22f7a11;--crimson-a3:#fe2a8b2a;--crimson-a4:#fd158741;--crimson-a5:#fd278f51;--crimson-a6:#fe459763;--crimson-a7:#fd559b7f;--crimson-a8:#fe5b9bab;--crimson-a9:#fe418de8;--crimson-a10:#ff5693ed;--crimson-a11:#ff92ad;--crimson-a12:#ffd5eafd}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--crimson-a1:color(display-p3 0.984 0.071 0.463/0.03);--crimson-a2:color(display-p3 0.996 0.282 0.569/0.055);--crimson-a3:color(display-p3 0.996 0.227 0.573/0.148);--crimson-a4:color(display-p3 1 0.157 0.569/0.227);--crimson-a5:color(display-p3 1 0.231 0.604/0.286);--crimson-a6:color(display-p3 1 0.337 0.643/0.349);--crimson-a7:color(display-p3 1 0.416 0.663/0.454);--crimson-a8:color(display-p3 0.996 0.427 0.651/0.614);--crimson-a9:color(display-p3 1 0.345 0.596/0.832);--crimson-a10:color(display-p3 1 0.42 0.62/0.853);--crimson-a11:color(display-p3 1 0.56 0.66);--crimson-a12:color(display-p3 0.966 0.834 0.906)}}}.light,.light-theme,:root{--pink-1:#fffcfe;--pink-2:#fef7fb;--pink-3:#fee9f5;--pink-4:#fbdcef;--pink-5:#f6cee7;--pink-6:#efbfdd;--pink-7:#e7acd0;--pink-8:#dd93c2;--pink-9:#d6409f;--pink-10:#cf3897;--pink-11:#c2298a;--pink-12:#651249}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--pink-1:color(display-p3 0.998 0.989 0.996);--pink-2:color(display-p3 0.992 0.97 0.985);--pink-3:color(display-p3 0.981 0.917 0.96);--pink-4:color(display-p3 0.963 0.867 0.932);--pink-5:color(display-p3 0.939 0.815 0.899);--pink-6:color(display-p3 0.907 0.756 0.859);--pink-7:color(display-p3 0.869 0.683 0.81);--pink-8:color(display-p3 0.825 0.59 0.751);--pink-9:color(display-p3 0.775 0.297 0.61);--pink-10:color(display-p3 0.748 0.27 0.581);--pink-11:color(display-p3 0.698 0.219 0.528);--pink-12:color(display-p3 0.363 0.101 0.279)}}}.dark,.dark-theme{--pink-1:#191117;--pink-2:#21121d;--pink-3:#37172f;--pink-4:#4b143d;--pink-5:#591c47;--pink-6:#692955;--pink-7:#833869;--pink-8:#a84885;--pink-9:#d6409f;--pink-10:#de51a8;--pink-11:#ff8dcc;--pink-12:#fdd1ea}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--pink-1:color(display-p3 0.093 0.068 0.089);--pink-2:color(display-p3 0.121 0.073 0.11);--pink-3:color(display-p3 0.198 0.098 0.179);--pink-4:color(display-p3 0.271 0.095 0.231);--pink-5:color(display-p3 0.32 0.127 0.273);--pink-6:color(display-p3 0.382 0.177 0.326);--pink-7:color(display-p3 0.477 0.238 0.405);--pink-8:color(display-p3 0.612 0.304 0.51);--pink-9:color(display-p3 0.775 0.297 0.61);--pink-10:color(display-p3 0.808 0.356 0.645);--pink-11:color(display-p3 1 0.535 0.78);--pink-12:color(display-p3 0.964 0.826 0.912)}}}.light,.light-theme,:root{--pink-a1:#ff00aa03;--pink-a2:#e0008008;--pink-a3:#f4008c16;--pink-a4:#e2008b23;--pink-a5:#d1008331;--pink-a6:#c0007840;--pink-a7:#b6006f53;--pink-a8:#af006f6c;--pink-a9:#c8007fbf;--pink-a10:#c2007ac7;--pink-a11:#b60074d6;--pink-a12:#59003bed}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--pink-a1:color(display-p3 0.675 0.024 0.675/0.012);--pink-a2:color(display-p3 0.757 0.02 0.51/0.032);--pink-a3:color(display-p3 0.765 0.008 0.529/0.083);--pink-a4:color(display-p3 0.737 0.008 0.506/0.134);--pink-a5:color(display-p3 0.663 0.004 0.451/0.185);--pink-a6:color(display-p3 0.616 0.004 0.424/0.244);--pink-a7:color(display-p3 0.596 0.004 0.412/0.318);--pink-a8:color(display-p3 0.573 0.004 0.404/0.412);--pink-a9:color(display-p3 0.682 0 0.447/0.702);--pink-a10:color(display-p3 0.655 0 0.424/0.73);--pink-a11:color(display-p3 0.698 0.219 0.528);--pink-a12:color(display-p3 0.363 0.101 0.279)}}}.dark,.dark-theme{--pink-a1:#f412bc09;--pink-a2:#f420bb12;--pink-a3:#fe37cc29;--pink-a4:#fc1ec43f;--pink-a5:#fd35c24e;--pink-a6:#fd51c75f;--pink-a7:#fd62c87b;--pink-a8:#ff68c8a2;--pink-a9:#fe49bcd4;--pink-a10:#ff5cc0dc;--pink-a11:#ff8dcc;--pink-a12:#ffd3ecfd}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--pink-a1:color(display-p3 0.984 0.071 0.855/0.03);--pink-a2:color(display-p3 1 0.2 0.8/0.059);--pink-a3:color(display-p3 1 0.294 0.886/0.139);--pink-a4:color(display-p3 1 0.192 0.82/0.219);--pink-a5:color(display-p3 1 0.282 0.827/0.274);--pink-a6:color(display-p3 1 0.396 0.835/0.337);--pink-a7:color(display-p3 1 0.459 0.831/0.442);--pink-a8:color(display-p3 1 0.478 0.827/0.585);--pink-a9:color(display-p3 1 0.373 0.784/0.761);--pink-a10:color(display-p3 1 0.435 0.792/0.795);--pink-a11:color(display-p3 1 0.535 0.78);--pink-a12:color(display-p3 0.964 0.826 0.912)}}}.light,.light-theme,:root{--plum-1:#fefcff;--plum-2:#fdf7fd;--plum-3:#fbebfb;--plum-4:#f7def8;--plum-5:#f2d1f3;--plum-6:#e9c2ec;--plum-7:#deade3;--plum-8:#cf91d8;--plum-9:#ab4aba;--plum-10:#a144af;--plum-11:#953ea3;--plum-12:#53195d}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--plum-1:color(display-p3 0.995 0.988 0.999);--plum-2:color(display-p3 0.988 0.971 0.99);--plum-3:color(display-p3 0.973 0.923 0.98);--plum-4:color(display-p3 0.953 0.875 0.966);--plum-5:color(display-p3 0.926 0.825 0.945);--plum-6:color(display-p3 0.89 0.765 0.916);--plum-7:color(display-p3 0.84 0.686 0.877);--plum-8:color(display-p3 0.775 0.58 0.832);--plum-9:color(display-p3 0.624 0.313 0.708);--plum-10:color(display-p3 0.587 0.29 0.667);--plum-11:color(display-p3 0.543 0.263 0.619);--plum-12:color(display-p3 0.299 0.114 0.352)}}}.dark,.dark-theme{--plum-1:#181118;--plum-2:#201320;--plum-3:#351a35;--plum-4:#451d47;--plum-5:#512454;--plum-6:#5e3061;--plum-7:#734079;--plum-8:#92549c;--plum-9:#ab4aba;--plum-10:#b658c4;--plum-11:#e796f3;--plum-12:#f4d4f4}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--plum-1:color(display-p3 0.09 0.068 0.092);--plum-2:color(display-p3 0.118 0.077 0.121);--plum-3:color(display-p3 0.192 0.105 0.202);--plum-4:color(display-p3 0.25 0.121 0.271);--plum-5:color(display-p3 0.293 0.152 0.319);--plum-6:color(display-p3 0.343 0.198 0.372);--plum-7:color(display-p3 0.424 0.262 0.461);--plum-8:color(display-p3 0.54 0.341 0.595);--plum-9:color(display-p3 0.624 0.313 0.708);--plum-10:color(display-p3 0.666 0.365 0.748);--plum-11:color(display-p3 0.86 0.602 0.933);--plum-12:color(display-p3 0.936 0.836 0.949)}}}.light,.light-theme,:root{--plum-a1:#aa00ff03;--plum-a2:#c000c008;--plum-a3:#cc00cc14;--plum-a4:#c200c921;--plum-a5:#b700bd2e;--plum-a6:#a400b03d;--plum-a7:#9900a852;--plum-a8:#9000a56e;--plum-a9:#89009eb5;--plum-a10:#7f0092bb;--plum-a11:#730086c1;--plum-a12:#40004be6}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--plum-a1:color(display-p3 0.675 0.024 1/0.012);--plum-a2:color(display-p3 0.58 0.024 0.58/0.028);--plum-a3:color(display-p3 0.655 0.008 0.753/0.079);--plum-a4:color(display-p3 0.627 0.008 0.722/0.126);--plum-a5:color(display-p3 0.58 0.004 0.69/0.177);--plum-a6:color(display-p3 0.537 0.004 0.655/0.236);--plum-a7:color(display-p3 0.49 0.004 0.616/0.314);--plum-a8:color(display-p3 0.471 0.004 0.6/0.42);--plum-a9:color(display-p3 0.451 0 0.576/0.687);--plum-a10:color(display-p3 0.42 0 0.529/0.71);--plum-a11:color(display-p3 0.543 0.263 0.619);--plum-a12:color(display-p3 0.299 0.114 0.352)}}}.dark,.dark-theme{--plum-a1:#f112f108;--plum-a2:#f22ff211;--plum-a3:#fd4cfd27;--plum-a4:#f646ff3a;--plum-a5:#f455ff48;--plum-a6:#f66dff56;--plum-a7:#f07cfd70;--plum-a8:#ee84ff95;--plum-a9:#e961feb6;--plum-a10:#ed70ffc0;--plum-a11:#f19cfef3;--plum-a12:#feddfef4}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--plum-a1:color(display-p3 0.973 0.071 0.973/0.026);--plum-a2:color(display-p3 0.933 0.267 1/0.059);--plum-a3:color(display-p3 0.918 0.333 0.996/0.148);--plum-a4:color(display-p3 0.91 0.318 1/0.219);--plum-a5:color(display-p3 0.914 0.388 1/0.269);--plum-a6:color(display-p3 0.906 0.463 1/0.328);--plum-a7:color(display-p3 0.906 0.529 1/0.425);--plum-a8:color(display-p3 0.906 0.553 1/0.568);--plum-a9:color(display-p3 0.875 0.427 1/0.69);--plum-a10:color(display-p3 0.886 0.471 0.996/0.732);--plum-a11:color(display-p3 0.86 0.602 0.933);--plum-a12:color(display-p3 0.936 0.836 0.949)}}}.light,.light-theme,:root{--purple-1:#fefcfe;--purple-2:#fbf7fe;--purple-3:#f7edfe;--purple-4:#f2e2fc;--purple-5:#ead5f9;--purple-6:#e0c4f4;--purple-7:#d1afec;--purple-8:#be93e4;--purple-9:#8e4ec6;--purple-10:#8347b9;--purple-11:#8145b5;--purple-12:#402060}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--purple-1:color(display-p3 0.995 0.988 0.996);--purple-2:color(display-p3 0.983 0.971 0.993);--purple-3:color(display-p3 0.963 0.931 0.989);--purple-4:color(display-p3 0.937 0.888 0.981);--purple-5:color(display-p3 0.904 0.837 0.966);--purple-6:color(display-p3 0.86 0.774 0.942);--purple-7:color(display-p3 0.799 0.69 0.91);--purple-8:color(display-p3 0.719 0.583 0.874);--purple-9:color(display-p3 0.523 0.318 0.751);--purple-10:color(display-p3 0.483 0.289 0.7);--purple-11:color(display-p3 0.473 0.281 0.687);--purple-12:color(display-p3 0.234 0.132 0.363)}}}.dark,.dark-theme{--purple-1:#18111b;--purple-2:#1e1523;--purple-3:#301c3b;--purple-4:#3d224e;--purple-5:#48295c;--purple-6:#54346b;--purple-7:#664282;--purple-8:#8457aa;--purple-9:#8e4ec6;--purple-10:#9a5cd0;--purple-11:#d19dff;--purple-12:#ecd9fa}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--purple-1:color(display-p3 0.09 0.068 0.103);--purple-2:color(display-p3 0.113 0.082 0.134);--purple-3:color(display-p3 0.175 0.112 0.224);--purple-4:color(display-p3 0.224 0.137 0.297);--purple-5:color(display-p3 0.264 0.167 0.349);--purple-6:color(display-p3 0.311 0.208 0.406);--purple-7:color(display-p3 0.381 0.266 0.496);--purple-8:color(display-p3 0.49 0.349 0.649);--purple-9:color(display-p3 0.523 0.318 0.751);--purple-10:color(display-p3 0.57 0.373 0.791);--purple-11:color(display-p3 0.8 0.62 1);--purple-12:color(display-p3 0.913 0.854 0.971)}}}.light,.light-theme,:root{--purple-a1:#aa00aa03;--purple-a2:#8000e008;--purple-a3:#8e00f112;--purple-a4:#8d00e51d;--purple-a5:#8000db2a;--purple-a6:#7a01d03b;--purple-a7:#6d00c350;--purple-a8:#6600c06c;--purple-a9:#5c00adb1;--purple-a10:#53009eb8;--purple-a11:#52009aba;--purple-a12:#250049df}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--purple-a1:color(display-p3 0.675 0.024 0.675/0.012);--purple-a2:color(display-p3 0.443 0.024 0.722/0.028);--purple-a3:color(display-p3 0.506 0.008 0.835/0.071);--purple-a4:color(display-p3 0.451 0.004 0.831/0.114);--purple-a5:color(display-p3 0.431 0.004 0.788/0.165);--purple-a6:color(display-p3 0.384 0.004 0.745/0.228);--purple-a7:color(display-p3 0.357 0.004 0.71/0.31);--purple-a8:color(display-p3 0.322 0.004 0.702/0.416);--purple-a9:color(display-p3 0.298 0 0.639/0.683);--purple-a10:color(display-p3 0.271 0 0.58/0.71);--purple-a11:color(display-p3 0.473 0.281 0.687);--purple-a12:color(display-p3 0.234 0.132 0.363)}}}.dark,.dark-theme{--purple-a1:#b412f90b;--purple-a2:#b744f714;--purple-a3:#c150ff2d;--purple-a4:#bb53fd42;--purple-a5:#be5cfd51;--purple-a6:#c16dfd61;--purple-a7:#c378fd7a;--purple-a8:#c47effa4;--purple-a9:#b661ffc2;--purple-a10:#bc6fffcd;--purple-a11:#d19dff;--purple-a12:#f1ddfffa}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--purple-a1:color(display-p3 0.686 0.071 0.996/0.038);--purple-a2:color(display-p3 0.722 0.286 0.996/0.072);--purple-a3:color(display-p3 0.718 0.349 0.996/0.169);--purple-a4:color(display-p3 0.702 0.353 1/0.248);--purple-a5:color(display-p3 0.718 0.404 1/0.303);--purple-a6:color(display-p3 0.733 0.455 1/0.366);--purple-a7:color(display-p3 0.753 0.506 1/0.458);--purple-a8:color(display-p3 0.749 0.522 1/0.622);--purple-a9:color(display-p3 0.686 0.408 1/0.736);--purple-a10:color(display-p3 0.71 0.459 1/0.778);--purple-a11:color(display-p3 0.8 0.62 1);--purple-a12:color(display-p3 0.913 0.854 0.971)}}}.light,.light-theme,:root{--violet-1:#fdfcfe;--violet-2:#faf8ff;--violet-3:#f4f0fe;--violet-4:#ebe4ff;--violet-5:#e1d9ff;--violet-6:#d4cafe;--violet-7:#c2b5f5;--violet-8:#aa99ec;--violet-9:#6e56cf;--violet-10:#654dc4;--violet-11:#6550b9;--violet-12:#2f265f}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--violet-1:color(display-p3 0.991 0.988 0.995);--violet-2:color(display-p3 0.978 0.974 0.998);--violet-3:color(display-p3 0.953 0.943 0.993);--violet-4:color(display-p3 0.916 0.897 1);--violet-5:color(display-p3 0.876 0.851 1);--violet-6:color(display-p3 0.825 0.793 0.981);--violet-7:color(display-p3 0.752 0.712 0.943);--violet-8:color(display-p3 0.654 0.602 0.902);--violet-9:color(display-p3 0.417 0.341 0.784);--violet-10:color(display-p3 0.381 0.306 0.741);--violet-11:color(display-p3 0.383 0.317 0.702);--violet-12:color(display-p3 0.179 0.15 0.359)}}}.dark,.dark-theme{--violet-1:#14121f;--violet-2:#1b1525;--violet-3:#291f43;--violet-4:#33255b;--violet-5:#3c2e69;--violet-6:#473876;--violet-7:#56468b;--violet-8:#6958ad;--violet-9:#6e56cf;--violet-10:#7d66d9;--violet-11:#baa7ff;--violet-12:#e2ddfe}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--violet-1:color(display-p3 0.077 0.071 0.118);--violet-2:color(display-p3 0.101 0.084 0.141);--violet-3:color(display-p3 0.154 0.123 0.256);--violet-4:color(display-p3 0.191 0.148 0.345);--violet-5:color(display-p3 0.226 0.182 0.396);--violet-6:color(display-p3 0.269 0.223 0.449);--violet-7:color(display-p3 0.326 0.277 0.53);--violet-8:color(display-p3 0.399 0.346 0.656);--violet-9:color(display-p3 0.417 0.341 0.784);--violet-10:color(display-p3 0.477 0.402 0.823);--violet-11:color(display-p3 0.72 0.65 1);--violet-12:color(display-p3 0.883 0.867 0.986)}}}.light,.light-theme,:root{--violet-a1:#5500aa03;--violet-a2:#4900ff07;--violet-a3:#4400ee0f;--violet-a4:#4300ff1b;--violet-a5:#3600ff26;--violet-a6:#3100fb35;--violet-a7:#2d01dd4a;--violet-a8:#2b00d066;--violet-a9:#2400b7a9;--violet-a10:#2300abb2;--violet-a11:#1f0099af;--violet-a12:#0b0043d9}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--violet-a1:color(display-p3 0.349 0.024 0.675/0.012);--violet-a2:color(display-p3 0.161 0.024 0.863/0.028);--violet-a3:color(display-p3 0.204 0.004 0.871/0.059);--violet-a4:color(display-p3 0.196 0.004 1/0.102);--violet-a5:color(display-p3 0.165 0.008 1/0.15);--violet-a6:color(display-p3 0.153 0.004 0.906/0.208);--violet-a7:color(display-p3 0.141 0.004 0.796/0.287);--violet-a8:color(display-p3 0.133 0.004 0.753/0.397);--violet-a9:color(display-p3 0.114 0 0.675/0.659);--violet-a10:color(display-p3 0.11 0 0.627/0.695);--violet-a11:color(display-p3 0.383 0.317 0.702);--violet-a12:color(display-p3 0.179 0.15 0.359)}}}.dark,.dark-theme{--violet-a1:#4422ff0f;--violet-a2:#853ff916;--violet-a3:#8354fe36;--violet-a4:#7d51fd50;--violet-a5:#845ffd5f;--violet-a6:#8f6cfd6d;--violet-a7:#9879ff83;--violet-a8:#977dfea8;--violet-a9:#8668ffcc;--violet-a10:#9176fed7;--violet-a11:#baa7ff;--violet-a12:#e3deff}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--violet-a1:color(display-p3 0.282 0.141 0.996/0.055);--violet-a2:color(display-p3 0.51 0.263 1/0.08);--violet-a3:color(display-p3 0.494 0.337 0.996/0.202);--violet-a4:color(display-p3 0.49 0.345 1/0.299);--violet-a5:color(display-p3 0.525 0.392 1/0.353);--violet-a6:color(display-p3 0.569 0.455 1/0.408);--violet-a7:color(display-p3 0.588 0.494 1/0.496);--violet-a8:color(display-p3 0.596 0.51 1/0.631);--violet-a9:color(display-p3 0.522 0.424 1/0.769);--violet-a10:color(display-p3 0.576 0.482 1/0.811);--violet-a11:color(display-p3 0.72 0.65 1);--violet-a12:color(display-p3 0.883 0.867 0.986)}}}.light,.light-theme,:root{--iris-1:#fdfdff;--iris-2:#f8f8ff;--iris-3:#f0f1fe;--iris-4:#e6e7ff;--iris-5:#dadcff;--iris-6:#cbcdff;--iris-7:#b8baf8;--iris-8:#9b9ef0;--iris-9:#5b5bd6;--iris-10:#5151cd;--iris-11:#5753c6;--iris-12:#272962}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--iris-1:color(display-p3 0.992 0.992 0.999);--iris-2:color(display-p3 0.972 0.973 0.998);--iris-3:color(display-p3 0.943 0.945 0.992);--iris-4:color(display-p3 0.902 0.906 1);--iris-5:color(display-p3 0.857 0.861 1);--iris-6:color(display-p3 0.799 0.805 0.987);--iris-7:color(display-p3 0.721 0.727 0.955);--iris-8:color(display-p3 0.61 0.619 0.918);--iris-9:color(display-p3 0.357 0.357 0.81);--iris-10:color(display-p3 0.318 0.318 0.774);--iris-11:color(display-p3 0.337 0.326 0.748);--iris-12:color(display-p3 0.154 0.161 0.371)}}}.dark,.dark-theme{--iris-1:#13131e;--iris-2:#171625;--iris-3:#202248;--iris-4:#262a65;--iris-5:#303374;--iris-6:#3d3e82;--iris-7:#4a4a95;--iris-8:#5958b1;--iris-9:#5b5bd6;--iris-10:#6e6ade;--iris-11:#b1a9ff;--iris-12:#e0dffe}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--iris-1:color(display-p3 0.075 0.075 0.114);--iris-2:color(display-p3 0.089 0.086 0.14);--iris-3:color(display-p3 0.128 0.134 0.272);--iris-4:color(display-p3 0.153 0.165 0.382);--iris-5:color(display-p3 0.192 0.201 0.44);--iris-6:color(display-p3 0.239 0.241 0.491);--iris-7:color(display-p3 0.291 0.289 0.565);--iris-8:color(display-p3 0.35 0.345 0.673);--iris-9:color(display-p3 0.357 0.357 0.81);--iris-10:color(display-p3 0.428 0.416 0.843);--iris-11:color(display-p3 0.685 0.662 1);--iris-12:color(display-p3 0.878 0.875 0.986)}}}.light,.light-theme,:root{--iris-a1:#0000ff02;--iris-a2:#0000ff07;--iris-a3:#0011ee0f;--iris-a4:#000bff19;--iris-a5:#000eff25;--iris-a6:#000aff34;--iris-a7:#0008e647;--iris-a8:#0008d964;--iris-a9:#0000c0a4;--iris-a10:#0000b6ae;--iris-a11:#0600abac;--iris-a12:#000246d8}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--iris-a1:color(display-p3 0.02 0.02 1/0.008);--iris-a2:color(display-p3 0.024 0.024 0.863/0.028);--iris-a3:color(display-p3 0.004 0.071 0.871/0.059);--iris-a4:color(display-p3 0.012 0.051 1/0.099);--iris-a5:color(display-p3 0.008 0.035 1/0.142);--iris-a6:color(display-p3 0 0.02 0.941/0.2);--iris-a7:color(display-p3 0.004 0.02 0.847/0.279);--iris-a8:color(display-p3 0.004 0.024 0.788/0.389);--iris-a9:color(display-p3 0 0 0.706/0.644);--iris-a10:color(display-p3 0 0 0.667/0.683);--iris-a11:color(display-p3 0.337 0.326 0.748);--iris-a12:color(display-p3 0.154 0.161 0.371)}}}.dark,.dark-theme{--iris-a1:#3636fe0e;--iris-a2:#564bf916;--iris-a3:#525bff3b;--iris-a4:#4d58ff5a;--iris-a5:#5b62fd6b;--iris-a6:#6d6ffd7a;--iris-a7:#7777fe8e;--iris-a8:#7b7afeac;--iris-a9:#6a6afed4;--iris-a10:#7d79ffdc;--iris-a11:#b1a9ff;--iris-a12:#e1e0ff}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--iris-a1:color(display-p3 0.224 0.224 0.992/0.051);--iris-a2:color(display-p3 0.361 0.314 1/0.08);--iris-a3:color(display-p3 0.357 0.373 1/0.219);--iris-a4:color(display-p3 0.325 0.361 1/0.337);--iris-a5:color(display-p3 0.38 0.4 1/0.4);--iris-a6:color(display-p3 0.447 0.447 1/0.454);--iris-a7:color(display-p3 0.486 0.486 1/0.534);--iris-a8:color(display-p3 0.502 0.494 1/0.652);--iris-a9:color(display-p3 0.431 0.431 1/0.799);--iris-a10:color(display-p3 0.502 0.486 1/0.832);--iris-a11:color(display-p3 0.685 0.662 1);--iris-a12:color(display-p3 0.878 0.875 0.986)}}}.light,.light-theme,:root{--indigo-1:#fdfdfe;--indigo-2:#f7f9ff;--indigo-3:#edf2fe;--indigo-4:#e1e9ff;--indigo-5:#d2deff;--indigo-6:#c1d0ff;--indigo-7:#abbdf9;--indigo-8:#8da4ef;--indigo-9:#3e63dd;--indigo-10:#3358d4;--indigo-11:#3a5bc7;--indigo-12:#1f2d5c}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--indigo-1:color(display-p3 0.992 0.992 0.996);--indigo-2:color(display-p3 0.971 0.977 0.998);--indigo-3:color(display-p3 0.933 0.948 0.992);--indigo-4:color(display-p3 0.885 0.914 1);--indigo-5:color(display-p3 0.831 0.87 1);--indigo-6:color(display-p3 0.767 0.814 0.995);--indigo-7:color(display-p3 0.685 0.74 0.957);--indigo-8:color(display-p3 0.569 0.639 0.916);--indigo-9:color(display-p3 0.276 0.384 0.837);--indigo-10:color(display-p3 0.234 0.343 0.801);--indigo-11:color(display-p3 0.256 0.354 0.755);--indigo-12:color(display-p3 0.133 0.175 0.348)}}}.dark,.dark-theme{--indigo-1:#11131f;--indigo-2:#141726;--indigo-3:#182449;--indigo-4:#1d2e62;--indigo-5:#253974;--indigo-6:#304384;--indigo-7:#3a4f97;--indigo-8:#435db1;--indigo-9:#3e63dd;--indigo-10:#5472e4;--indigo-11:#9eb1ff;--indigo-12:#d6e1ff}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--indigo-1:color(display-p3 0.068 0.074 0.118);--indigo-2:color(display-p3 0.081 0.089 0.144);--indigo-3:color(display-p3 0.105 0.141 0.275);--indigo-4:color(display-p3 0.129 0.18 0.369);--indigo-5:color(display-p3 0.163 0.22 0.439);--indigo-6:color(display-p3 0.203 0.262 0.5);--indigo-7:color(display-p3 0.245 0.309 0.575);--indigo-8:color(display-p3 0.285 0.362 0.674);--indigo-9:color(display-p3 0.276 0.384 0.837);--indigo-10:color(display-p3 0.354 0.445 0.866);--indigo-11:color(display-p3 0.63 0.69 1);--indigo-12:color(display-p3 0.848 0.881 0.99)}}}.light,.light-theme,:root{--indigo-a1:#00008002;--indigo-a2:#0040ff08;--indigo-a3:#0047f112;--indigo-a4:#0044ff1e;--indigo-a5:#0044ff2d;--indigo-a6:#003eff3e;--indigo-a7:#0037ed54;--indigo-a8:#0034dc72;--indigo-a9:#0031d2c1;--indigo-a10:#002ec9cc;--indigo-a11:#002bb7c5;--indigo-a12:#001046e0}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--indigo-a1:color(display-p3 0.02 0.02 0.51/0.008);--indigo-a2:color(display-p3 0.024 0.161 0.863/0.028);--indigo-a3:color(display-p3 0.008 0.239 0.886/0.067);--indigo-a4:color(display-p3 0.004 0.247 1/0.114);--indigo-a5:color(display-p3 0.004 0.235 1/0.169);--indigo-a6:color(display-p3 0.004 0.208 0.984/0.232);--indigo-a7:color(display-p3 0.004 0.176 0.863/0.314);--indigo-a8:color(display-p3 0.004 0.165 0.812/0.432);--indigo-a9:color(display-p3 0 0.153 0.773/0.726);--indigo-a10:color(display-p3 0 0.137 0.737/0.765);--indigo-a11:color(display-p3 0.256 0.354 0.755);--indigo-a12:color(display-p3 0.133 0.175 0.348)}}}.dark,.dark-theme{--indigo-a1:#1133ff0f;--indigo-a2:#3354fa17;--indigo-a3:#2f62ff3c;--indigo-a4:#3566ff57;--indigo-a5:#4171fd6b;--indigo-a6:#5178fd7c;--indigo-a7:#5a7fff90;--indigo-a8:#5b81feac;--indigo-a9:#4671ffdb;--indigo-a10:#5c7efee3;--indigo-a11:#9eb1ff;--indigo-a12:#d6e1ff}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--indigo-a1:color(display-p3 0.071 0.212 0.996/0.055);--indigo-a2:color(display-p3 0.251 0.345 0.988/0.085);--indigo-a3:color(display-p3 0.243 0.404 1/0.223);--indigo-a4:color(display-p3 0.263 0.42 1/0.324);--indigo-a5:color(display-p3 0.314 0.451 1/0.4);--indigo-a6:color(display-p3 0.361 0.49 1/0.467);--indigo-a7:color(display-p3 0.388 0.51 1/0.547);--indigo-a8:color(display-p3 0.404 0.518 1/0.652);--indigo-a9:color(display-p3 0.318 0.451 1/0.824);--indigo-a10:color(display-p3 0.404 0.506 1/0.858);--indigo-a11:color(display-p3 0.63 0.69 1);--indigo-a12:color(display-p3 0.848 0.881 0.99)}}}.light,.light-theme,:root{--blue-1:#fbfdff;--blue-2:#f4faff;--blue-3:#e6f4fe;--blue-4:#d5efff;--blue-5:#c2e5ff;--blue-6:#acd8fc;--blue-7:#8ec8f6;--blue-8:#5eb1ef;--blue-9:#0090ff;--blue-10:#0588f0;--blue-11:#0d74ce;--blue-12:#113264}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--blue-1:color(display-p3 0.986 0.992 0.999);--blue-2:color(display-p3 0.96 0.979 0.998);--blue-3:color(display-p3 0.912 0.956 0.991);--blue-4:color(display-p3 0.853 0.932 1);--blue-5:color(display-p3 0.788 0.894 0.998);--blue-6:color(display-p3 0.709 0.843 0.976);--blue-7:color(display-p3 0.606 0.777 0.947);--blue-8:color(display-p3 0.451 0.688 0.917);--blue-9:color(display-p3 0.247 0.556 0.969);--blue-10:color(display-p3 0.234 0.523 0.912);--blue-11:color(display-p3 0.15 0.44 0.84);--blue-12:color(display-p3 0.102 0.193 0.379)}}}.dark,.dark-theme{--blue-1:#0d1520;--blue-2:#111927;--blue-3:#0d2847;--blue-4:#003362;--blue-5:#004074;--blue-6:#104d87;--blue-7:#205d9e;--blue-8:#2870bd;--blue-9:#0090ff;--blue-10:#3b9eff;--blue-11:#70b8ff;--blue-12:#c2e6ff}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--blue-1:color(display-p3 0.057 0.081 0.122);--blue-2:color(display-p3 0.072 0.098 0.147);--blue-3:color(display-p3 0.078 0.154 0.27);--blue-4:color(display-p3 0.033 0.197 0.37);--blue-5:color(display-p3 0.08 0.245 0.441);--blue-6:color(display-p3 0.14 0.298 0.511);--blue-7:color(display-p3 0.195 0.361 0.6);--blue-8:color(display-p3 0.239 0.434 0.72);--blue-9:color(display-p3 0.247 0.556 0.969);--blue-10:color(display-p3 0.344 0.612 0.973);--blue-11:color(display-p3 0.49 0.72 1);--blue-12:color(display-p3 0.788 0.898 0.99)}}}.light,.light-theme,:root{--blue-a1:#0080ff04;--blue-a2:#008cff0b;--blue-a3:#008ff519;--blue-a4:#009eff2a;--blue-a5:#0093ff3d;--blue-a6:#0088f653;--blue-a7:#0083eb71;--blue-a8:#0084e6a1;--blue-a9:#0090ff;--blue-a10:#0086f0fa;--blue-a11:#006dcbf2;--blue-a12:#002359ee}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--blue-a1:color(display-p3 0.024 0.514 1/0.016);--blue-a2:color(display-p3 0.024 0.514 0.906/0.04);--blue-a3:color(display-p3 0.012 0.506 0.914/0.087);--blue-a4:color(display-p3 0.008 0.545 1/0.146);--blue-a5:color(display-p3 0.004 0.502 0.984/0.212);--blue-a6:color(display-p3 0.004 0.463 0.922/0.291);--blue-a7:color(display-p3 0.004 0.431 0.863/0.393);--blue-a8:color(display-p3 0 0.427 0.851/0.55);--blue-a9:color(display-p3 0 0.412 0.961/0.753);--blue-a10:color(display-p3 0 0.376 0.886/0.765);--blue-a11:color(display-p3 0.15 0.44 0.84);--blue-a12:color(display-p3 0.102 0.193 0.379)}}}.dark,.dark-theme{--blue-a1:#004df211;--blue-a2:#1166fb18;--blue-a3:#0077ff3a;--blue-a4:#0075ff57;--blue-a5:#0081fd6b;--blue-a6:#0f89fd7f;--blue-a7:#2a91fe98;--blue-a8:#3094feb9;--blue-a9:#0090ff;--blue-a10:#3b9eff;--blue-a11:#70b8ff;--blue-a12:#c2e6ff}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--blue-a1:color(display-p3 0 0.333 1/0.059);--blue-a2:color(display-p3 0.114 0.435 0.988/0.085);--blue-a3:color(display-p3 0.122 0.463 1/0.219);--blue-a4:color(display-p3 0 0.467 1/0.324);--blue-a5:color(display-p3 0.098 0.51 1/0.4);--blue-a6:color(display-p3 0.224 0.557 1/0.475);--blue-a7:color(display-p3 0.294 0.584 1/0.572);--blue-a8:color(display-p3 0.314 0.592 1/0.702);--blue-a9:color(display-p3 0.251 0.573 0.996/0.967);--blue-a10:color(display-p3 0.357 0.631 1/0.971);--blue-a11:color(display-p3 0.49 0.72 1);--blue-a12:color(display-p3 0.788 0.898 0.99)}}}.light,.light-theme,:root{--cyan-1:#fafdfe;--cyan-2:#f2fafb;--cyan-3:#def7f9;--cyan-4:#caf1f6;--cyan-5:#b5e9f0;--cyan-6:#9ddde7;--cyan-7:#7dcedc;--cyan-8:#3db9cf;--cyan-9:#00a2c7;--cyan-10:#0797b9;--cyan-11:#107d98;--cyan-12:#0d3c48}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--cyan-1:color(display-p3 0.982 0.992 0.996);--cyan-2:color(display-p3 0.955 0.981 0.984);--cyan-3:color(display-p3 0.888 0.965 0.975);--cyan-4:color(display-p3 0.821 0.941 0.959);--cyan-5:color(display-p3 0.751 0.907 0.935);--cyan-6:color(display-p3 0.671 0.862 0.9);--cyan-7:color(display-p3 0.564 0.8 0.854);--cyan-8:color(display-p3 0.388 0.715 0.798);--cyan-9:color(display-p3 0.282 0.627 0.765);--cyan-10:color(display-p3 0.264 0.583 0.71);--cyan-11:color(display-p3 0.08 0.48 0.63);--cyan-12:color(display-p3 0.108 0.232 0.277)}}}.dark,.dark-theme{--cyan-1:#0b161a;--cyan-2:#101b20;--cyan-3:#082c36;--cyan-4:#003848;--cyan-5:#004558;--cyan-6:#045468;--cyan-7:#12677e;--cyan-8:#11809c;--cyan-9:#00a2c7;--cyan-10:#23afd0;--cyan-11:#4ccce6;--cyan-12:#b6ecf7}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--cyan-1:color(display-p3 0.053 0.085 0.098);--cyan-2:color(display-p3 0.072 0.105 0.122);--cyan-3:color(display-p3 0.073 0.168 0.209);--cyan-4:color(display-p3 0.063 0.216 0.277);--cyan-5:color(display-p3 0.091 0.267 0.336);--cyan-6:color(display-p3 0.137 0.324 0.4);--cyan-7:color(display-p3 0.186 0.398 0.484);--cyan-8:color(display-p3 0.23 0.496 0.6);--cyan-9:color(display-p3 0.282 0.627 0.765);--cyan-10:color(display-p3 0.331 0.675 0.801);--cyan-11:color(display-p3 0.446 0.79 0.887);--cyan-12:color(display-p3 0.757 0.919 0.962)}}}.light,.light-theme,:root{--cyan-a1:#0099cc05;--cyan-a2:#009db10d;--cyan-a3:#00c2d121;--cyan-a4:#00bcd435;--cyan-a5:#01b4cc4a;--cyan-a6:#00a7c162;--cyan-a7:#009fbb82;--cyan-a8:#00a3c0c2;--cyan-a9:#00a2c7;--cyan-a10:#0094b7f8;--cyan-a11:#007491ef;--cyan-a12:#00323ef2}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--cyan-a1:color(display-p3 0.02 0.608 0.804/0.02);--cyan-a2:color(display-p3 0.02 0.557 0.647/0.044);--cyan-a3:color(display-p3 0.004 0.694 0.796/0.114);--cyan-a4:color(display-p3 0.004 0.678 0.784/0.181);--cyan-a5:color(display-p3 0.004 0.624 0.733/0.248);--cyan-a6:color(display-p3 0.004 0.584 0.706/0.33);--cyan-a7:color(display-p3 0.004 0.541 0.667/0.436);--cyan-a8:color(display-p3 0 0.533 0.667/0.612);--cyan-a9:color(display-p3 0 0.482 0.675/0.718);--cyan-a10:color(display-p3 0 0.435 0.608/0.738);--cyan-a11:color(display-p3 0.08 0.48 0.63);--cyan-a12:color(display-p3 0.108 0.232 0.277)}}}.dark,.dark-theme{--cyan-a1:#0091f70a;--cyan-a2:#02a7f211;--cyan-a3:#00befd28;--cyan-a4:#00baff3b;--cyan-a5:#00befd4d;--cyan-a6:#00c7fd5e;--cyan-a7:#14cdff75;--cyan-a8:#11cfff95;--cyan-a9:#00cfffc3;--cyan-a10:#28d6ffcd;--cyan-a11:#52e1fee5;--cyan-a12:#bbf3fef7}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--cyan-a1:color(display-p3 0 0.647 0.992/0.034);--cyan-a2:color(display-p3 0.133 0.733 1/0.059);--cyan-a3:color(display-p3 0.122 0.741 0.996/0.152);--cyan-a4:color(display-p3 0.051 0.725 1/0.227);--cyan-a5:color(display-p3 0.149 0.757 1/0.29);--cyan-a6:color(display-p3 0.267 0.792 1/0.358);--cyan-a7:color(display-p3 0.333 0.808 1/0.446);--cyan-a8:color(display-p3 0.357 0.816 1/0.572);--cyan-a9:color(display-p3 0.357 0.82 1/0.748);--cyan-a10:color(display-p3 0.4 0.839 1/0.786);--cyan-a11:color(display-p3 0.446 0.79 0.887);--cyan-a12:color(display-p3 0.757 0.919 0.962)}}}.light,.light-theme,:root{--teal-1:#fafefd;--teal-2:#f3fbf9;--teal-3:#e0f8f3;--teal-4:#ccf3ea;--teal-5:#b8eae0;--teal-6:#a1ded2;--teal-7:#83cdc1;--teal-8:#53b9ab;--teal-9:#12a594;--teal-10:#0d9b8a;--teal-11:#008573;--teal-12:#0d3d38}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--teal-1:color(display-p3 0.983 0.996 0.992);--teal-2:color(display-p3 0.958 0.983 0.976);--teal-3:color(display-p3 0.895 0.971 0.952);--teal-4:color(display-p3 0.831 0.949 0.92);--teal-5:color(display-p3 0.761 0.914 0.878);--teal-6:color(display-p3 0.682 0.864 0.825);--teal-7:color(display-p3 0.581 0.798 0.756);--teal-8:color(display-p3 0.433 0.716 0.671);--teal-9:color(display-p3 0.297 0.637 0.581);--teal-10:color(display-p3 0.275 0.599 0.542);--teal-11:color(display-p3 0.08 0.5 0.43);--teal-12:color(display-p3 0.11 0.235 0.219)}}}.dark,.dark-theme{--teal-1:#0d1514;--teal-2:#111c1b;--teal-3:#0d2d2a;--teal-4:#023b37;--teal-5:#084843;--teal-6:#145750;--teal-7:#1c6961;--teal-8:#207e73;--teal-9:#12a594;--teal-10:#0eb39e;--teal-11:#0bd8b6;--teal-12:#adf0dd}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--teal-1:color(display-p3 0.059 0.083 0.079);--teal-2:color(display-p3 0.075 0.11 0.107);--teal-3:color(display-p3 0.087 0.175 0.165);--teal-4:color(display-p3 0.087 0.227 0.214);--teal-5:color(display-p3 0.12 0.277 0.261);--teal-6:color(display-p3 0.162 0.335 0.314);--teal-7:color(display-p3 0.205 0.406 0.379);--teal-8:color(display-p3 0.245 0.489 0.453);--teal-9:color(display-p3 0.297 0.637 0.581);--teal-10:color(display-p3 0.319 0.69 0.62);--teal-11:color(display-p3 0.388 0.835 0.719);--teal-12:color(display-p3 0.734 0.934 0.87)}}}.light,.light-theme,:root{--teal-a1:#00cc9905;--teal-a2:#00aa800c;--teal-a3:#00c69d1f;--teal-a4:#00c39633;--teal-a5:#00b49047;--teal-a6:#00a6855e;--teal-a7:#0099807c;--teal-a8:#009783ac;--teal-a9:#009e8ced;--teal-a10:#009684f2;--teal-a11:#008573;--teal-a12:#00332df2}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--teal-a1:color(display-p3 0.024 0.757 0.514/0.016);--teal-a2:color(display-p3 0.02 0.647 0.467/0.044);--teal-a3:color(display-p3 0.004 0.741 0.557/0.106);--teal-a4:color(display-p3 0.004 0.702 0.537/0.169);--teal-a5:color(display-p3 0.004 0.643 0.494/0.24);--teal-a6:color(display-p3 0.004 0.569 0.447/0.318);--teal-a7:color(display-p3 0.004 0.518 0.424/0.42);--teal-a8:color(display-p3 0 0.506 0.424/0.569);--teal-a9:color(display-p3 0 0.482 0.404/0.702);--teal-a10:color(display-p3 0 0.451 0.369/0.726);--teal-a11:color(display-p3 0.08 0.5 0.43);--teal-a12:color(display-p3 0.11 0.235 0.219)}}}.dark,.dark-theme{--teal-a1:#00deab05;--teal-a2:#12fbe60c;--teal-a3:#00ffe61e;--teal-a4:#00ffe92d;--teal-a5:#00ffea3b;--teal-a6:#1cffe84b;--teal-a7:#2efde85f;--teal-a8:#32ffe775;--teal-a9:#13ffe49f;--teal-a10:#0dffe0ae;--teal-a11:#0afed5d6;--teal-a12:#b8ffebef}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--teal-a1:color(display-p3 0 0.992 0.761/0.017);--teal-a2:color(display-p3 0.235 0.988 0.902/0.047);--teal-a3:color(display-p3 0.235 1 0.898/0.118);--teal-a4:color(display-p3 0.18 0.996 0.929/0.173);--teal-a5:color(display-p3 0.31 1 0.933/0.227);--teal-a6:color(display-p3 0.396 1 0.933/0.286);--teal-a7:color(display-p3 0.443 1 0.925/0.366);--teal-a8:color(display-p3 0.459 1 0.925/0.454);--teal-a9:color(display-p3 0.443 0.996 0.906/0.61);--teal-a10:color(display-p3 0.439 0.996 0.89/0.669);--teal-a11:color(display-p3 0.388 0.835 0.719);--teal-a12:color(display-p3 0.734 0.934 0.87)}}}.light,.light-theme,:root{--jade-1:#fbfefd;--jade-2:#f4fbf7;--jade-3:#e6f7ed;--jade-4:#d6f1e3;--jade-5:#c3e9d7;--jade-6:#acdec8;--jade-7:#8bceb6;--jade-8:#56ba9f;--jade-9:#29a383;--jade-10:#26997b;--jade-11:#208368;--jade-12:#1d3b31}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--jade-1:color(display-p3 0.986 0.996 0.992);--jade-2:color(display-p3 0.962 0.983 0.969);--jade-3:color(display-p3 0.912 0.965 0.932);--jade-4:color(display-p3 0.858 0.941 0.893);--jade-5:color(display-p3 0.795 0.909 0.847);--jade-6:color(display-p3 0.715 0.864 0.791);--jade-7:color(display-p3 0.603 0.802 0.718);--jade-8:color(display-p3 0.44 0.72 0.629);--jade-9:color(display-p3 0.319 0.63 0.521);--jade-10:color(display-p3 0.299 0.592 0.488);--jade-11:color(display-p3 0.15 0.5 0.37);--jade-12:color(display-p3 0.142 0.229 0.194)}}}.dark,.dark-theme{--jade-1:#0d1512;--jade-2:#121c18;--jade-3:#0f2e22;--jade-4:#0b3b2c;--jade-5:#114837;--jade-6:#1b5745;--jade-7:#246854;--jade-8:#2a7e68;--jade-9:#29a383;--jade-10:#27b08b;--jade-11:#1fd8a4;--jade-12:#adf0d4}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--jade-1:color(display-p3 0.059 0.083 0.071);--jade-2:color(display-p3 0.078 0.11 0.094);--jade-3:color(display-p3 0.091 0.176 0.138);--jade-4:color(display-p3 0.102 0.228 0.177);--jade-5:color(display-p3 0.133 0.279 0.221);--jade-6:color(display-p3 0.174 0.334 0.273);--jade-7:color(display-p3 0.219 0.402 0.335);--jade-8:color(display-p3 0.263 0.488 0.411);--jade-9:color(display-p3 0.319 0.63 0.521);--jade-10:color(display-p3 0.338 0.68 0.555);--jade-11:color(display-p3 0.4 0.835 0.656);--jade-12:color(display-p3 0.734 0.934 0.838)}}}.light,.light-theme,:root{--jade-a1:#00c08004;--jade-a2:#00a3460b;--jade-a3:#00ae4819;--jade-a4:#00a85129;--jade-a5:#00a2553c;--jade-a6:#009a5753;--jade-a7:#00945f74;--jade-a8:#00976ea9;--jade-a9:#00916bd6;--jade-a10:#008764d9;--jade-a11:#007152df;--jade-a12:#002217e2}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--jade-a1:color(display-p3 0.024 0.757 0.514/0.016);--jade-a2:color(display-p3 0.024 0.612 0.22/0.04);--jade-a3:color(display-p3 0.012 0.596 0.235/0.087);--jade-a4:color(display-p3 0.008 0.588 0.255/0.142);--jade-a5:color(display-p3 0.004 0.561 0.251/0.204);--jade-a6:color(display-p3 0.004 0.525 0.278/0.287);--jade-a7:color(display-p3 0.004 0.506 0.29/0.397);--jade-a8:color(display-p3 0 0.506 0.337/0.561);--jade-a9:color(display-p3 0 0.459 0.298/0.683);--jade-a10:color(display-p3 0 0.42 0.271/0.702);--jade-a11:color(display-p3 0.15 0.5 0.37);--jade-a12:color(display-p3 0.142 0.229 0.194)}}}.dark,.dark-theme{--jade-a1:#00de4505;--jade-a2:#27fba60c;--jade-a3:#02f99920;--jade-a4:#00ffaa2d;--jade-a5:#11ffb63b;--jade-a6:#34ffc24b;--jade-a7:#45fdc75e;--jade-a8:#48ffcf75;--jade-a9:#38feca9d;--jade-a10:#31fec7ab;--jade-a11:#21fec0d6;--jade-a12:#b8ffe1ef}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--jade-a1:color(display-p3 0 0.992 0.298/0.017);--jade-a2:color(display-p3 0.318 0.988 0.651/0.047);--jade-a3:color(display-p3 0.267 1 0.667/0.118);--jade-a4:color(display-p3 0.275 0.996 0.702/0.173);--jade-a5:color(display-p3 0.361 1 0.741/0.227);--jade-a6:color(display-p3 0.439 1 0.796/0.286);--jade-a7:color(display-p3 0.49 1 0.804/0.362);--jade-a8:color(display-p3 0.506 1 0.835/0.45);--jade-a9:color(display-p3 0.478 0.996 0.816/0.606);--jade-a10:color(display-p3 0.478 1 0.816/0.656);--jade-a11:color(display-p3 0.4 0.835 0.656);--jade-a12:color(display-p3 0.734 0.934 0.838)}}}.light,.light-theme,:root{--green-1:#fbfefc;--green-2:#f4fbf6;--green-3:#e6f6eb;--green-4:#d6f1df;--green-5:#c4e8d1;--green-6:#adddc0;--green-7:#8eceaa;--green-8:#5bb98b;--green-9:#30a46c;--green-10:#2b9a66;--green-11:#218358;--green-12:#193b2d}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--green-1:color(display-p3 0.986 0.996 0.989);--green-2:color(display-p3 0.963 0.983 0.967);--green-3:color(display-p3 0.913 0.964 0.925);--green-4:color(display-p3 0.859 0.94 0.879);--green-5:color(display-p3 0.796 0.907 0.826);--green-6:color(display-p3 0.718 0.863 0.761);--green-7:color(display-p3 0.61 0.801 0.675);--green-8:color(display-p3 0.451 0.715 0.559);--green-9:color(display-p3 0.332 0.634 0.442);--green-10:color(display-p3 0.308 0.595 0.417);--green-11:color(display-p3 0.19 0.5 0.32);--green-12:color(display-p3 0.132 0.228 0.18)}}}.dark,.dark-theme{--green-1:#0e1512;--green-2:#121b17;--green-3:#132d21;--green-4:#113b29;--green-5:#174933;--green-6:#20573e;--green-7:#28684a;--green-8:#2f7c57;--green-9:#30a46c;--green-10:#33b074;--green-11:#3dd68c;--green-12:#b1f1cb}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--green-1:color(display-p3 0.062 0.083 0.071);--green-2:color(display-p3 0.079 0.106 0.09);--green-3:color(display-p3 0.1 0.173 0.133);--green-4:color(display-p3 0.115 0.229 0.166);--green-5:color(display-p3 0.147 0.282 0.206);--green-6:color(display-p3 0.185 0.338 0.25);--green-7:color(display-p3 0.227 0.403 0.298);--green-8:color(display-p3 0.27 0.479 0.351);--green-9:color(display-p3 0.332 0.634 0.442);--green-10:color(display-p3 0.357 0.682 0.474);--green-11:color(display-p3 0.434 0.828 0.573);--green-12:color(display-p3 0.747 0.938 0.807)}}}.light,.light-theme,:root{--green-a1:#00c04004;--green-a2:#00a32f0b;--green-a3:#00a43319;--green-a4:#00a83829;--green-a5:#019c393b;--green-a6:#00963c52;--green-a7:#00914071;--green-a8:#00924ba4;--green-a9:#008f4acf;--green-a10:#008647d4;--green-a11:#00713fde;--green-a12:#002616e6}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--green-a1:color(display-p3 0.024 0.757 0.267/0.016);--green-a2:color(display-p3 0.024 0.565 0.129/0.036);--green-a3:color(display-p3 0.012 0.596 0.145/0.087);--green-a4:color(display-p3 0.008 0.588 0.145/0.142);--green-a5:color(display-p3 0.004 0.541 0.157/0.204);--green-a6:color(display-p3 0.004 0.518 0.157/0.283);--green-a7:color(display-p3 0.004 0.486 0.165/0.389);--green-a8:color(display-p3 0 0.478 0.2/0.55);--green-a9:color(display-p3 0 0.455 0.165/0.667);--green-a10:color(display-p3 0 0.416 0.153/0.691);--green-a11:color(display-p3 0.19 0.5 0.32);--green-a12:color(display-p3 0.132 0.228 0.18)}}}.dark,.dark-theme{--green-a1:#00de4505;--green-a2:#29f99d0b;--green-a3:#22ff991e;--green-a4:#11ff992d;--green-a5:#2bffa23c;--green-a6:#44ffaa4b;--green-a7:#50fdac5e;--green-a8:#54ffad73;--green-a9:#44ffa49e;--green-a10:#43fea4ab;--green-a11:#46fea5d4;--green-a12:#bbffd7f0}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--green-a1:color(display-p3 0 0.992 0.298/0.017);--green-a2:color(display-p3 0.341 0.98 0.616/0.043);--green-a3:color(display-p3 0.376 0.996 0.655/0.114);--green-a4:color(display-p3 0.341 0.996 0.635/0.173);--green-a5:color(display-p3 0.408 1 0.678/0.232);--green-a6:color(display-p3 0.475 1 0.706/0.29);--green-a7:color(display-p3 0.514 1 0.706/0.362);--green-a8:color(display-p3 0.529 1 0.718/0.442);--green-a9:color(display-p3 0.502 0.996 0.682/0.61);--green-a10:color(display-p3 0.506 1 0.682/0.66);--green-a11:color(display-p3 0.434 0.828 0.573);--green-a12:color(display-p3 0.747 0.938 0.807)}}}.light,.light-theme,:root{--grass-1:#fbfefb;--grass-2:#f5fbf5;--grass-3:#e9f6e9;--grass-4:#daf1db;--grass-5:#c9e8ca;--grass-6:#b2ddb5;--grass-7:#94ce9a;--grass-8:#65ba74;--grass-9:#46a758;--grass-10:#3e9b4f;--grass-11:#2a7e3b;--grass-12:#203c25}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--grass-1:color(display-p3 0.986 0.996 0.985);--grass-2:color(display-p3 0.966 0.983 0.964);--grass-3:color(display-p3 0.923 0.965 0.917);--grass-4:color(display-p3 0.872 0.94 0.865);--grass-5:color(display-p3 0.811 0.908 0.802);--grass-6:color(display-p3 0.733 0.864 0.724);--grass-7:color(display-p3 0.628 0.803 0.622);--grass-8:color(display-p3 0.477 0.72 0.482);--grass-9:color(display-p3 0.38 0.647 0.378);--grass-10:color(display-p3 0.344 0.598 0.342);--grass-11:color(display-p3 0.263 0.488 0.261);--grass-12:color(display-p3 0.151 0.233 0.153)}}}.dark,.dark-theme{--grass-1:#0e1511;--grass-2:#141a15;--grass-3:#1b2a1e;--grass-4:#1d3a24;--grass-5:#25482d;--grass-6:#2d5736;--grass-7:#366740;--grass-8:#3e7949;--grass-9:#46a758;--grass-10:#53b365;--grass-11:#71d083;--grass-12:#c2f0c2}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--grass-1:color(display-p3 0.062 0.083 0.067);--grass-2:color(display-p3 0.083 0.103 0.085);--grass-3:color(display-p3 0.118 0.163 0.122);--grass-4:color(display-p3 0.142 0.225 0.15);--grass-5:color(display-p3 0.178 0.279 0.186);--grass-6:color(display-p3 0.217 0.337 0.224);--grass-7:color(display-p3 0.258 0.4 0.264);--grass-8:color(display-p3 0.302 0.47 0.305);--grass-9:color(display-p3 0.38 0.647 0.378);--grass-10:color(display-p3 0.426 0.694 0.426);--grass-11:color(display-p3 0.535 0.807 0.542);--grass-12:color(display-p3 0.797 0.936 0.776)}}}.light,.light-theme,:root{--grass-a1:#00c00004;--grass-a2:#0099000a;--grass-a3:#00970016;--grass-a4:#009f0725;--grass-a5:#00930536;--grass-a6:#008f0a4d;--grass-a7:#018b0f6b;--grass-a8:#008d199a;--grass-a9:#008619b9;--grass-a10:#007b17c1;--grass-a11:#006514d5;--grass-a12:#002006df}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--grass-a1:color(display-p3 0.024 0.757 0.024/0.016);--grass-a2:color(display-p3 0.024 0.565 0.024/0.036);--grass-a3:color(display-p3 0.059 0.576 0.008/0.083);--grass-a4:color(display-p3 0.035 0.565 0.008/0.134);--grass-a5:color(display-p3 0.047 0.545 0.008/0.197);--grass-a6:color(display-p3 0.031 0.502 0.004/0.275);--grass-a7:color(display-p3 0.012 0.482 0.004/0.377);--grass-a8:color(display-p3 0 0.467 0.008/0.522);--grass-a9:color(display-p3 0.008 0.435 0/0.624);--grass-a10:color(display-p3 0.008 0.388 0/0.659);--grass-a11:color(display-p3 0.263 0.488 0.261);--grass-a12:color(display-p3 0.151 0.233 0.153)}}}.dark,.dark-theme{--grass-a1:#00de1205;--grass-a2:#5ef7780a;--grass-a3:#70fe8c1b;--grass-a4:#57ff802c;--grass-a5:#68ff8b3b;--grass-a6:#71ff8f4b;--grass-a7:#77fd925d;--grass-a8:#77fd9070;--grass-a9:#65ff82a1;--grass-a10:#72ff8dae;--grass-a11:#89ff9fcd;--grass-a12:#ceffceef}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--grass-a1:color(display-p3 0 0.992 0.071/0.017);--grass-a2:color(display-p3 0.482 0.996 0.584/0.038);--grass-a3:color(display-p3 0.549 0.992 0.588/0.106);--grass-a4:color(display-p3 0.51 0.996 0.557/0.169);--grass-a5:color(display-p3 0.553 1 0.588/0.227);--grass-a6:color(display-p3 0.584 1 0.608/0.29);--grass-a7:color(display-p3 0.604 1 0.616/0.358);--grass-a8:color(display-p3 0.608 1 0.62/0.433);--grass-a9:color(display-p3 0.573 1 0.569/0.622);--grass-a10:color(display-p3 0.6 0.996 0.6/0.673);--grass-a11:color(display-p3 0.535 0.807 0.542);--grass-a12:color(display-p3 0.797 0.936 0.776)}}}.light,.light-theme,:root{--orange-1:#fefcfb;--orange-2:#fff7ed;--orange-3:#ffefd6;--orange-4:#ffdfb5;--orange-5:#ffd19a;--orange-6:#ffc182;--orange-7:#f5ae73;--orange-8:#ec9455;--orange-9:#f76b15;--orange-10:#ef5f00;--orange-11:#cc4e00;--orange-12:#582d1d}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--orange-1:color(display-p3 0.995 0.988 0.985);--orange-2:color(display-p3 0.994 0.968 0.934);--orange-3:color(display-p3 0.989 0.938 0.85);--orange-4:color(display-p3 1 0.874 0.687);--orange-5:color(display-p3 1 0.821 0.583);--orange-6:color(display-p3 0.975 0.767 0.545);--orange-7:color(display-p3 0.919 0.693 0.486);--orange-8:color(display-p3 0.877 0.597 0.379);--orange-9:color(display-p3 0.9 0.45 0.2);--orange-10:color(display-p3 0.87 0.409 0.164);--orange-11:color(display-p3 0.76 0.34 0);--orange-12:color(display-p3 0.323 0.185 0.127)}}}.dark,.dark-theme{--orange-1:#17120e;--orange-2:#1e160f;--orange-3:#331e0b;--orange-4:#462100;--orange-5:#562800;--orange-6:#66350c;--orange-7:#7e451d;--orange-8:#a35829;--orange-9:#f76b15;--orange-10:#ff801f;--orange-11:#ffa057;--orange-12:#ffe0c2}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--orange-1:color(display-p3 0.088 0.07 0.057);--orange-2:color(display-p3 0.113 0.089 0.061);--orange-3:color(display-p3 0.189 0.12 0.056);--orange-4:color(display-p3 0.262 0.132 0);--orange-5:color(display-p3 0.315 0.168 0.016);--orange-6:color(display-p3 0.376 0.219 0.088);--orange-7:color(display-p3 0.465 0.283 0.147);--orange-8:color(display-p3 0.601 0.359 0.201);--orange-9:color(display-p3 0.9 0.45 0.2);--orange-10:color(display-p3 0.98 0.51 0.23);--orange-11:color(display-p3 1 0.63 0.38);--orange-12:color(display-p3 0.98 0.883 0.775)}}}.light,.light-theme,:root{--orange-a1:#c0400004;--orange-a2:#ff8e0012;--orange-a3:#ff9c0029;--orange-a4:#ff91014a;--orange-a5:#ff8b0065;--orange-a6:#ff81007d;--orange-a7:#ed6c008c;--orange-a8:#e35f00aa;--orange-a9:#f65e00ea;--orange-a10:#ef5f00;--orange-a11:#cc4e00;--orange-a12:#431200e2}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--orange-a1:color(display-p3 0.757 0.267 0.024/0.016);--orange-a2:color(display-p3 0.886 0.533 0.008/0.067);--orange-a3:color(display-p3 0.922 0.584 0.008/0.15);--orange-a4:color(display-p3 1 0.604 0.004/0.314);--orange-a5:color(display-p3 1 0.569 0.004/0.416);--orange-a6:color(display-p3 0.949 0.494 0.004/0.455);--orange-a7:color(display-p3 0.839 0.408 0/0.514);--orange-a8:color(display-p3 0.804 0.349 0/0.62);--orange-a9:color(display-p3 0.878 0.314 0/0.8);--orange-a10:color(display-p3 0.843 0.29 0/0.836);--orange-a11:color(display-p3 0.76 0.34 0);--orange-a12:color(display-p3 0.323 0.185 0.127)}}}.dark,.dark-theme{--orange-a1:#ec360007;--orange-a2:#fe6d000e;--orange-a3:#fb6a0025;--orange-a4:#ff590039;--orange-a5:#ff61004a;--orange-a6:#fd75045c;--orange-a7:#ff832c75;--orange-a8:#fe84389d;--orange-a9:#fe6d15f7;--orange-a10:#ff801f;--orange-a11:#ffa057;--orange-a12:#ffe0c2}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--orange-a1:color(display-p3 0.961 0.247 0/0.022);--orange-a2:color(display-p3 0.992 0.529 0/0.051);--orange-a3:color(display-p3 0.996 0.486 0/0.131);--orange-a4:color(display-p3 0.996 0.384 0/0.211);--orange-a5:color(display-p3 1 0.455 0/0.265);--orange-a6:color(display-p3 1 0.529 0.129/0.332);--orange-a7:color(display-p3 1 0.569 0.251/0.429);--orange-a8:color(display-p3 1 0.584 0.302/0.572);--orange-a9:color(display-p3 1 0.494 0.216/0.895);--orange-a10:color(display-p3 1 0.522 0.235/0.979);--orange-a11:color(display-p3 1 0.63 0.38);--orange-a12:color(display-p3 0.98 0.883 0.775)}}}.light,.light-theme,:root{--brown-1:#fefdfc;--brown-2:#fcf9f6;--brown-3:#f6eee7;--brown-4:#f0e4d9;--brown-5:#ebdaca;--brown-6:#e4cdb7;--brown-7:#dcbc9f;--brown-8:#cea37e;--brown-9:#ad7f58;--brown-10:#a07553;--brown-11:#815e46;--brown-12:#3e332e}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--brown-1:color(display-p3 0.995 0.992 0.989);--brown-2:color(display-p3 0.987 0.976 0.964);--brown-3:color(display-p3 0.959 0.936 0.909);--brown-4:color(display-p3 0.934 0.897 0.855);--brown-5:color(display-p3 0.909 0.856 0.798);--brown-6:color(display-p3 0.88 0.808 0.73);--brown-7:color(display-p3 0.841 0.742 0.639);--brown-8:color(display-p3 0.782 0.647 0.514);--brown-9:color(display-p3 0.651 0.505 0.368);--brown-10:color(display-p3 0.601 0.465 0.344);--brown-11:color(display-p3 0.485 0.374 0.288);--brown-12:color(display-p3 0.236 0.202 0.183)}}}.dark,.dark-theme{--brown-1:#12110f;--brown-2:#1c1816;--brown-3:#28211d;--brown-4:#322922;--brown-5:#3e3128;--brown-6:#4d3c2f;--brown-7:#614a39;--brown-8:#7c5f46;--brown-9:#ad7f58;--brown-10:#b88c67;--brown-11:#dbb594;--brown-12:#f2e1ca}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--brown-1:color(display-p3 0.071 0.067 0.059);--brown-2:color(display-p3 0.107 0.095 0.087);--brown-3:color(display-p3 0.151 0.13 0.115);--brown-4:color(display-p3 0.191 0.161 0.138);--brown-5:color(display-p3 0.235 0.194 0.162);--brown-6:color(display-p3 0.291 0.237 0.192);--brown-7:color(display-p3 0.365 0.295 0.232);--brown-8:color(display-p3 0.469 0.377 0.287);--brown-9:color(display-p3 0.651 0.505 0.368);--brown-10:color(display-p3 0.697 0.557 0.423);--brown-11:color(display-p3 0.835 0.715 0.597);--brown-12:color(display-p3 0.938 0.885 0.802)}}}.light,.light-theme,:root{--brown-a1:#aa550003;--brown-a2:#aa550009;--brown-a3:#a04b0018;--brown-a4:#9b4a0026;--brown-a5:#9f4d0035;--brown-a6:#a04e0048;--brown-a7:#a34e0060;--brown-a8:#9f4a0081;--brown-a9:#823c00a7;--brown-a10:#723300ac;--brown-a11:#522100b9;--brown-a12:#140600d1}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--brown-a1:color(display-p3 0.675 0.349 0.024/0.012);--brown-a2:color(display-p3 0.675 0.349 0.024/0.036);--brown-a3:color(display-p3 0.573 0.314 0.012/0.091);--brown-a4:color(display-p3 0.545 0.302 0.008/0.146);--brown-a5:color(display-p3 0.561 0.29 0.004/0.204);--brown-a6:color(display-p3 0.553 0.294 0.004/0.271);--brown-a7:color(display-p3 0.557 0.286 0.004/0.361);--brown-a8:color(display-p3 0.549 0.275 0.004/0.487);--brown-a9:color(display-p3 0.447 0.22 0/0.632);--brown-a10:color(display-p3 0.388 0.188 0/0.655);--brown-a11:color(display-p3 0.485 0.374 0.288);--brown-a12:color(display-p3 0.236 0.202 0.183)}}}.dark,.dark-theme{--brown-a1:#91110002;--brown-a2:#fba67c0c;--brown-a3:#fcb58c19;--brown-a4:#fbbb8a24;--brown-a5:#fcb88931;--brown-a6:#fdba8741;--brown-a7:#ffbb8856;--brown-a8:#ffbe8773;--brown-a9:#feb87da8;--brown-a10:#ffc18cb3;--brown-a11:#fed1aad9;--brown-a12:#feecd4f2}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--brown-a1:color(display-p3 0.855 0.071 0/0.005);--brown-a2:color(display-p3 0.98 0.706 0.525/0.043);--brown-a3:color(display-p3 0.996 0.745 0.576/0.093);--brown-a4:color(display-p3 1 0.765 0.592/0.135);--brown-a5:color(display-p3 1 0.761 0.588/0.181);--brown-a6:color(display-p3 1 0.773 0.592/0.24);--brown-a7:color(display-p3 0.996 0.776 0.58/0.32);--brown-a8:color(display-p3 1 0.78 0.573/0.433);--brown-a9:color(display-p3 1 0.769 0.549/0.627);--brown-a10:color(display-p3 1 0.792 0.596/0.677);--brown-a11:color(display-p3 0.835 0.715 0.597);--brown-a12:color(display-p3 0.938 0.885 0.802)}}}.light,.light-theme,:root{--sky-1:#f9feff;--sky-2:#f1fafd;--sky-3:#e1f6fd;--sky-4:#d1f0fa;--sky-5:#bee7f5;--sky-6:#a9daed;--sky-7:#8dcae3;--sky-8:#60b3d7;--sky-9:#7ce2fe;--sky-10:#74daf8;--sky-11:#00749e;--sky-12:#1d3e56}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--sky-1:color(display-p3 0.98 0.995 0.999);--sky-2:color(display-p3 0.953 0.98 0.99);--sky-3:color(display-p3 0.899 0.963 0.989);--sky-4:color(display-p3 0.842 0.937 0.977);--sky-5:color(display-p3 0.777 0.9 0.954);--sky-6:color(display-p3 0.701 0.851 0.921);--sky-7:color(display-p3 0.604 0.785 0.879);--sky-8:color(display-p3 0.457 0.696 0.829);--sky-9:color(display-p3 0.585 0.877 0.983);--sky-10:color(display-p3 0.555 0.845 0.959);--sky-11:color(display-p3 0.193 0.448 0.605);--sky-12:color(display-p3 0.145 0.241 0.329)}}}.dark,.dark-theme{--sky-1:#0d141f;--sky-2:#111a27;--sky-3:#112840;--sky-4:#113555;--sky-5:#154467;--sky-6:#1b537b;--sky-7:#1f6692;--sky-8:#197cae;--sky-9:#7ce2fe;--sky-10:#a8eeff;--sky-11:#75c7f0;--sky-12:#c2f3ff}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--sky-1:color(display-p3 0.056 0.078 0.116);--sky-2:color(display-p3 0.075 0.101 0.149);--sky-3:color(display-p3 0.089 0.154 0.244);--sky-4:color(display-p3 0.106 0.207 0.323);--sky-5:color(display-p3 0.135 0.261 0.394);--sky-6:color(display-p3 0.17 0.322 0.469);--sky-7:color(display-p3 0.205 0.394 0.557);--sky-8:color(display-p3 0.232 0.48 0.665);--sky-9:color(display-p3 0.585 0.877 0.983);--sky-10:color(display-p3 0.718 0.925 0.991);--sky-11:color(display-p3 0.536 0.772 0.924);--sky-12:color(display-p3 0.799 0.947 0.993)}}}.light,.light-theme,:root{--sky-a1:#00d5ff06;--sky-a2:#00a4db0e;--sky-a3:#00b3ee1e;--sky-a4:#00ace42e;--sky-a5:#00a1d841;--sky-a6:#0092ca56;--sky-a7:#0089c172;--sky-a8:#0085bf9f;--sky-a9:#00c7fe83;--sky-a10:#00bcf38b;--sky-a11:#00749e;--sky-a12:#002540e2}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--sky-a1:color(display-p3 0.02 0.804 1/0.02);--sky-a2:color(display-p3 0.024 0.592 0.757/0.048);--sky-a3:color(display-p3 0.004 0.655 0.886/0.102);--sky-a4:color(display-p3 0.004 0.604 0.851/0.157);--sky-a5:color(display-p3 0.004 0.565 0.792/0.224);--sky-a6:color(display-p3 0.004 0.502 0.737/0.299);--sky-a7:color(display-p3 0.004 0.459 0.694/0.397);--sky-a8:color(display-p3 0 0.435 0.682/0.542);--sky-a9:color(display-p3 0.004 0.71 0.965/0.416);--sky-a10:color(display-p3 0.004 0.647 0.914/0.444);--sky-a11:color(display-p3 0.193 0.448 0.605);--sky-a12:color(display-p3 0.145 0.241 0.329)}}}.dark,.dark-theme{--sky-a1:#0044ff0f;--sky-a2:#1171fb18;--sky-a3:#1184fc33;--sky-a4:#128fff49;--sky-a5:#1c9dfd5d;--sky-a6:#28a5ff72;--sky-a7:#2badfe8b;--sky-a8:#1db2fea9;--sky-a9:#7ce3ff;--sky-a10:#a8eeff;--sky-a11:#7cd3ffef;--sky-a12:#c2f3ff}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--sky-a1:color(display-p3 0 0.282 0.996/0.055);--sky-a2:color(display-p3 0.157 0.467 0.992/0.089);--sky-a3:color(display-p3 0.192 0.522 0.996/0.19);--sky-a4:color(display-p3 0.212 0.584 1/0.274);--sky-a5:color(display-p3 0.259 0.631 1/0.349);--sky-a6:color(display-p3 0.302 0.655 1/0.433);--sky-a7:color(display-p3 0.329 0.686 1/0.526);--sky-a8:color(display-p3 0.325 0.71 1/0.643);--sky-a9:color(display-p3 0.592 0.894 1/0.984);--sky-a10:color(display-p3 0.722 0.933 1/0.992);--sky-a11:color(display-p3 0.536 0.772 0.924);--sky-a12:color(display-p3 0.799 0.947 0.993)}}}.light,.light-theme,:root{--mint-1:#f9fefd;--mint-2:#f2fbf9;--mint-3:#ddf9f2;--mint-4:#c8f4e9;--mint-5:#b3ecde;--mint-6:#9ce0d0;--mint-7:#7ecfbd;--mint-8:#4cbba5;--mint-9:#86ead4;--mint-10:#7de0cb;--mint-11:#027864;--mint-12:#16433c}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--mint-1:color(display-p3 0.98 0.995 0.992);--mint-2:color(display-p3 0.957 0.985 0.977);--mint-3:color(display-p3 0.888 0.972 0.95);--mint-4:color(display-p3 0.819 0.951 0.916);--mint-5:color(display-p3 0.747 0.918 0.873);--mint-6:color(display-p3 0.668 0.87 0.818);--mint-7:color(display-p3 0.567 0.805 0.744);--mint-8:color(display-p3 0.42 0.724 0.649);--mint-9:color(display-p3 0.62 0.908 0.834);--mint-10:color(display-p3 0.585 0.871 0.797);--mint-11:color(display-p3 0.203 0.463 0.397);--mint-12:color(display-p3 0.136 0.259 0.236)}}}.dark,.dark-theme{--mint-1:#0e1515;--mint-2:#0f1b1b;--mint-3:#092c2b;--mint-4:#003a38;--mint-5:#004744;--mint-6:#105650;--mint-7:#1e685f;--mint-8:#277f70;--mint-9:#86ead4;--mint-10:#a8f5e5;--mint-11:#58d5ba;--mint-12:#c4f5e1}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--mint-1:color(display-p3 0.059 0.082 0.081);--mint-2:color(display-p3 0.068 0.104 0.105);--mint-3:color(display-p3 0.077 0.17 0.168);--mint-4:color(display-p3 0.068 0.224 0.22);--mint-5:color(display-p3 0.104 0.275 0.264);--mint-6:color(display-p3 0.154 0.332 0.313);--mint-7:color(display-p3 0.207 0.403 0.373);--mint-8:color(display-p3 0.258 0.49 0.441);--mint-9:color(display-p3 0.62 0.908 0.834);--mint-10:color(display-p3 0.725 0.954 0.898);--mint-11:color(display-p3 0.482 0.825 0.733);--mint-12:color(display-p3 0.807 0.955 0.887)}}}.light,.light-theme,:root{--mint-a1:#00d5aa06;--mint-a2:#00b18a0d;--mint-a3:#00d29e22;--mint-a4:#00cc9937;--mint-a5:#00c0914c;--mint-a6:#00b08663;--mint-a7:#00a17d81;--mint-a8:#009e7fb3;--mint-a9:#00d3a579;--mint-a10:#00c39982;--mint-a11:#007763fd;--mint-a12:#00312ae9}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--mint-a1:color(display-p3 0.02 0.804 0.608/0.02);--mint-a2:color(display-p3 0.02 0.647 0.467/0.044);--mint-a3:color(display-p3 0.004 0.761 0.553/0.114);--mint-a4:color(display-p3 0.004 0.741 0.545/0.181);--mint-a5:color(display-p3 0.004 0.678 0.51/0.255);--mint-a6:color(display-p3 0.004 0.616 0.463/0.334);--mint-a7:color(display-p3 0.004 0.549 0.412/0.432);--mint-a8:color(display-p3 0 0.529 0.392/0.581);--mint-a9:color(display-p3 0.004 0.765 0.569/0.381);--mint-a10:color(display-p3 0.004 0.69 0.51/0.416);--mint-a11:color(display-p3 0.203 0.463 0.397);--mint-a12:color(display-p3 0.136 0.259 0.236)}}}.dark,.dark-theme{--mint-a1:#00dede05;--mint-a2:#00f9f90b;--mint-a3:#00fff61d;--mint-a4:#00fff42c;--mint-a5:#00fff23a;--mint-a6:#0effeb4a;--mint-a7:#34fde55e;--mint-a8:#41ffdf76;--mint-a9:#92ffe7e9;--mint-a10:#aefeedf5;--mint-a11:#67ffded2;--mint-a12:#cbfee9f5}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--mint-a1:color(display-p3 0 0.992 0.992/0.017);--mint-a2:color(display-p3 0.071 0.98 0.98/0.043);--mint-a3:color(display-p3 0.176 0.996 0.996/0.11);--mint-a4:color(display-p3 0.071 0.996 0.973/0.169);--mint-a5:color(display-p3 0.243 1 0.949/0.223);--mint-a6:color(display-p3 0.369 1 0.933/0.286);--mint-a7:color(display-p3 0.459 1 0.914/0.362);--mint-a8:color(display-p3 0.49 1 0.89/0.454);--mint-a9:color(display-p3 0.678 0.996 0.914/0.904);--mint-a10:color(display-p3 0.761 1 0.941/0.95);--mint-a11:color(display-p3 0.482 0.825 0.733);--mint-a12:color(display-p3 0.807 0.955 0.887)}}}.light,.light-theme,:root{--lime-1:#fcfdfa;--lime-2:#f8faf3;--lime-3:#eef6d6;--lime-4:#e2f0bd;--lime-5:#d3e7a6;--lime-6:#c2da91;--lime-7:#abc978;--lime-8:#8db654;--lime-9:#bdee63;--lime-10:#b0e64c;--lime-11:#5c7c2f;--lime-12:#37401c}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--lime-1:color(display-p3 0.989 0.992 0.981);--lime-2:color(display-p3 0.975 0.98 0.954);--lime-3:color(display-p3 0.939 0.965 0.851);--lime-4:color(display-p3 0.896 0.94 0.76);--lime-5:color(display-p3 0.843 0.903 0.678);--lime-6:color(display-p3 0.778 0.852 0.599);--lime-7:color(display-p3 0.694 0.784 0.508);--lime-8:color(display-p3 0.585 0.707 0.378);--lime-9:color(display-p3 0.78 0.928 0.466);--lime-10:color(display-p3 0.734 0.896 0.397);--lime-11:color(display-p3 0.386 0.482 0.227);--lime-12:color(display-p3 0.222 0.25 0.128)}}}.dark,.dark-theme{--lime-1:#11130c;--lime-2:#151a10;--lime-3:#1f2917;--lime-4:#29371d;--lime-5:#334423;--lime-6:#3d522a;--lime-7:#496231;--lime-8:#577538;--lime-9:#bdee63;--lime-10:#d4ff70;--lime-11:#bde56c;--lime-12:#e3f7ba}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--lime-1:color(display-p3 0.067 0.073 0.048);--lime-2:color(display-p3 0.086 0.1 0.067);--lime-3:color(display-p3 0.13 0.16 0.099);--lime-4:color(display-p3 0.172 0.214 0.126);--lime-5:color(display-p3 0.213 0.266 0.153);--lime-6:color(display-p3 0.257 0.321 0.182);--lime-7:color(display-p3 0.307 0.383 0.215);--lime-8:color(display-p3 0.365 0.456 0.25);--lime-9:color(display-p3 0.78 0.928 0.466);--lime-10:color(display-p3 0.865 0.995 0.519);--lime-11:color(display-p3 0.771 0.893 0.485);--lime-12:color(display-p3 0.905 0.966 0.753)}}}.light,.light-theme,:root{--lime-a1:#66990005;--lime-a2:#6b95000c;--lime-a3:#96c80029;--lime-a4:#8fc60042;--lime-a5:#81bb0059;--lime-a6:#72aa006e;--lime-a7:#61990087;--lime-a8:#559200ab;--lime-a9:#93e4009c;--lime-a10:#8fdc00b3;--lime-a11:#375f00d0;--lime-a12:#1e2900e3}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--lime-a1:color(display-p3 0.412 0.608 0.02/0.02);--lime-a2:color(display-p3 0.514 0.592 0.024/0.048);--lime-a3:color(display-p3 0.584 0.765 0.008/0.15);--lime-a4:color(display-p3 0.561 0.757 0.004/0.24);--lime-a5:color(display-p3 0.514 0.698 0.004/0.322);--lime-a6:color(display-p3 0.443 0.627 0/0.4);--lime-a7:color(display-p3 0.376 0.561 0.004/0.491);--lime-a8:color(display-p3 0.333 0.529 0/0.624);--lime-a9:color(display-p3 0.588 0.867 0/0.534);--lime-a10:color(display-p3 0.561 0.827 0/0.604);--lime-a11:color(display-p3 0.386 0.482 0.227);--lime-a12:color(display-p3 0.222 0.25 0.128)}}}.dark,.dark-theme{--lime-a1:#11bb0003;--lime-a2:#78f7000a;--lime-a3:#9bfd4c1a;--lime-a4:#a7fe5c29;--lime-a5:#affe6537;--lime-a6:#b2fe6d46;--lime-a7:#b6ff6f57;--lime-a8:#b6fd6d6c;--lime-a9:#caff69ed;--lime-a10:#d4ff70;--lime-a11:#d1fe77e4;--lime-a12:#e9febff7}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--lime-a1:color(display-p3 0.067 0.941 0/0.009);--lime-a2:color(display-p3 0.584 0.996 0.071/0.038);--lime-a3:color(display-p3 0.69 1 0.38/0.101);--lime-a4:color(display-p3 0.729 1 0.435/0.16);--lime-a5:color(display-p3 0.745 1 0.471/0.215);--lime-a6:color(display-p3 0.769 1 0.482/0.274);--lime-a7:color(display-p3 0.769 1 0.506/0.341);--lime-a8:color(display-p3 0.784 1 0.51/0.416);--lime-a9:color(display-p3 0.839 1 0.502/0.925);--lime-a10:color(display-p3 0.871 1 0.522/0.996);--lime-a11:color(display-p3 0.771 0.893 0.485);--lime-a12:color(display-p3 0.905 0.966 0.753)}}}.light,.light-theme,:root{--yellow-1:#fdfdf9;--yellow-2:#fefce9;--yellow-3:#fffab8;--yellow-4:#fff394;--yellow-5:#ffe770;--yellow-6:#f3d768;--yellow-7:#e4c767;--yellow-8:#d5ae39;--yellow-9:#ffe629;--yellow-10:#ffdc00;--yellow-11:#9e6c00;--yellow-12:#473b1f}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--yellow-1:color(display-p3 0.992 0.992 0.978);--yellow-2:color(display-p3 0.995 0.99 0.922);--yellow-3:color(display-p3 0.997 0.982 0.749);--yellow-4:color(display-p3 0.992 0.953 0.627);--yellow-5:color(display-p3 0.984 0.91 0.51);--yellow-6:color(display-p3 0.934 0.847 0.474);--yellow-7:color(display-p3 0.876 0.785 0.46);--yellow-8:color(display-p3 0.811 0.689 0.313);--yellow-9:color(display-p3 1 0.92 0.22);--yellow-10:color(display-p3 0.977 0.868 0.291);--yellow-11:color(display-p3 0.6 0.44 0);--yellow-12:color(display-p3 0.271 0.233 0.137)}}}.dark,.dark-theme{--yellow-1:#14120b;--yellow-2:#1b180f;--yellow-3:#2d2305;--yellow-4:#362b00;--yellow-5:#433500;--yellow-6:#524202;--yellow-7:#665417;--yellow-8:#836a21;--yellow-9:#ffe629;--yellow-10:#ffff57;--yellow-11:#f5e147;--yellow-12:#f6eeb4}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--yellow-1:color(display-p3 0.078 0.069 0.047);--yellow-2:color(display-p3 0.103 0.094 0.063);--yellow-3:color(display-p3 0.168 0.137 0.039);--yellow-4:color(display-p3 0.209 0.169 0);--yellow-5:color(display-p3 0.255 0.209 0);--yellow-6:color(display-p3 0.31 0.261 0.07);--yellow-7:color(display-p3 0.389 0.331 0.135);--yellow-8:color(display-p3 0.497 0.42 0.182);--yellow-9:color(display-p3 1 0.92 0.22);--yellow-10:color(display-p3 1 1 0.456);--yellow-11:color(display-p3 0.948 0.885 0.392);--yellow-12:color(display-p3 0.959 0.934 0.731)}}}.light,.light-theme,:root{--yellow-a1:#aaaa0006;--yellow-a2:#f4dd0016;--yellow-a3:#ffee0047;--yellow-a4:#ffe3016b;--yellow-a5:#ffd5008f;--yellow-a6:#ebbc0097;--yellow-a7:#d2a10098;--yellow-a8:#c99700c6;--yellow-a9:#ffe100d6;--yellow-a10:#ffdc00;--yellow-a11:#9e6c00;--yellow-a12:#2e2000e0}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--yellow-a1:color(display-p3 0.675 0.675 0.024/0.024);--yellow-a2:color(display-p3 0.953 0.855 0.008/0.079);--yellow-a3:color(display-p3 0.988 0.925 0.004/0.251);--yellow-a4:color(display-p3 0.98 0.875 0.004/0.373);--yellow-a5:color(display-p3 0.969 0.816 0.004/0.491);--yellow-a6:color(display-p3 0.875 0.71 0/0.526);--yellow-a7:color(display-p3 0.769 0.604 0/0.542);--yellow-a8:color(display-p3 0.725 0.549 0/0.687);--yellow-a9:color(display-p3 1 0.898 0/0.781);--yellow-a10:color(display-p3 0.969 0.812 0/0.71);--yellow-a11:color(display-p3 0.6 0.44 0);--yellow-a12:color(display-p3 0.271 0.233 0.137)}}}.dark,.dark-theme{--yellow-a1:#d1510004;--yellow-a2:#f9b4000b;--yellow-a3:#ffaa001e;--yellow-a4:#fdb70028;--yellow-a5:#febb0036;--yellow-a6:#fec40046;--yellow-a7:#fdcb225c;--yellow-a8:#fdca327b;--yellow-a9:#ffe629;--yellow-a10:#ffff57;--yellow-a11:#fee949f5;--yellow-a12:#fef6baf6}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--yellow-a1:color(display-p3 0.973 0.369 0/0.013);--yellow-a2:color(display-p3 0.996 0.792 0/0.038);--yellow-a3:color(display-p3 0.996 0.71 0/0.11);--yellow-a4:color(display-p3 0.996 0.741 0/0.152);--yellow-a5:color(display-p3 0.996 0.765 0/0.202);--yellow-a6:color(display-p3 0.996 0.816 0.082/0.261);--yellow-a7:color(display-p3 1 0.831 0.263/0.345);--yellow-a8:color(display-p3 1 0.831 0.314/0.463);--yellow-a9:color(display-p3 1 0.922 0.22);--yellow-a10:color(display-p3 1 1 0.455);--yellow-a11:color(display-p3 0.948 0.885 0.392);--yellow-a12:color(display-p3 0.959 0.934 0.731)}}}.light,.light-theme,:root{--amber-1:#fefdfb;--amber-2:#fefbe9;--amber-3:#fff7c2;--amber-4:#ffee9c;--amber-5:#fbe577;--amber-6:#f3d673;--amber-7:#e9c162;--amber-8:#e2a336;--amber-9:#ffc53d;--amber-10:#ffba18;--amber-11:#ab6400;--amber-12:#4f3422}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--amber-1:color(display-p3 0.995 0.992 0.985);--amber-2:color(display-p3 0.994 0.986 0.921);--amber-3:color(display-p3 0.994 0.969 0.782);--amber-4:color(display-p3 0.989 0.937 0.65);--amber-5:color(display-p3 0.97 0.902 0.527);--amber-6:color(display-p3 0.936 0.844 0.506);--amber-7:color(display-p3 0.89 0.762 0.443);--amber-8:color(display-p3 0.85 0.65 0.3);--amber-9:color(display-p3 1 0.77 0.26);--amber-10:color(display-p3 0.959 0.741 0.274);--amber-11:color(display-p3 0.64 0.4 0);--amber-12:color(display-p3 0.294 0.208 0.145)}}}.dark,.dark-theme{--amber-1:#16120c;--amber-2:#1d180f;--amber-3:#302008;--amber-4:#3f2700;--amber-5:#4d3000;--amber-6:#5c3d05;--amber-7:#714f19;--amber-8:#8f6424;--amber-9:#ffc53d;--amber-10:#ffd60a;--amber-11:#ffca16;--amber-12:#ffe7b3}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--amber-1:color(display-p3 0.082 0.07 0.05);--amber-2:color(display-p3 0.111 0.094 0.064);--amber-3:color(display-p3 0.178 0.128 0.049);--amber-4:color(display-p3 0.239 0.156 0);--amber-5:color(display-p3 0.29 0.193 0);--amber-6:color(display-p3 0.344 0.245 0.076);--amber-7:color(display-p3 0.422 0.314 0.141);--amber-8:color(display-p3 0.535 0.399 0.189);--amber-9:color(display-p3 1 0.77 0.26);--amber-10:color(display-p3 1 0.87 0.15);--amber-11:color(display-p3 1 0.8 0.29);--amber-12:color(display-p3 0.984 0.909 0.726)}}}.light,.light-theme,:root{--amber-a1:#c0800004;--amber-a2:#f4d10016;--amber-a3:#ffde003d;--amber-a4:#ffd40063;--amber-a5:#f8cf0088;--amber-a6:#eab5008c;--amber-a7:#dc9b009d;--amber-a8:#da8a00c9;--amber-a9:#ffb300c2;--amber-a10:#ffb300e7;--amber-a11:#ab6400;--amber-a12:#341500dd}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--amber-a1:color(display-p3 0.757 0.514 0.024/0.016);--amber-a2:color(display-p3 0.902 0.804 0.008/0.079);--amber-a3:color(display-p3 0.965 0.859 0.004/0.22);--amber-a4:color(display-p3 0.969 0.82 0.004/0.35);--amber-a5:color(display-p3 0.933 0.796 0.004/0.475);--amber-a6:color(display-p3 0.875 0.682 0.004/0.495);--amber-a7:color(display-p3 0.804 0.573 0/0.557);--amber-a8:color(display-p3 0.788 0.502 0/0.699);--amber-a9:color(display-p3 1 0.686 0/0.742);--amber-a10:color(display-p3 0.945 0.643 0/0.726);--amber-a11:color(display-p3 0.64 0.4 0);--amber-a12:color(display-p3 0.294 0.208 0.145)}}}.dark,.dark-theme{--amber-a1:#e63c0006;--amber-a2:#fd9b000d;--amber-a3:#fa820022;--amber-a4:#fc820032;--amber-a5:#fd8b0041;--amber-a6:#fd9b0051;--amber-a7:#ffab2567;--amber-a8:#ffae3587;--amber-a9:#ffc53d;--amber-a10:#ffd60a;--amber-a11:#ffca16;--amber-a12:#ffe7b3}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--amber-a1:color(display-p3 0.992 0.298 0/0.017);--amber-a2:color(display-p3 0.988 0.651 0/0.047);--amber-a3:color(display-p3 1 0.6 0/0.118);--amber-a4:color(display-p3 1 0.557 0/0.185);--amber-a5:color(display-p3 1 0.592 0/0.24);--amber-a6:color(display-p3 1 0.659 0.094/0.299);--amber-a7:color(display-p3 1 0.714 0.263/0.383);--amber-a8:color(display-p3 0.996 0.729 0.306/0.5);--amber-a9:color(display-p3 1 0.769 0.259);--amber-a10:color(display-p3 1 0.871 0.149);--amber-a11:color(display-p3 1 0.8 0.29);--amber-a12:color(display-p3 0.984 0.909 0.726)}}}.light,.light-theme,:root{--gold-1:#fdfdfc;--gold-2:#faf9f2;--gold-3:#f2f0e7;--gold-4:#eae6db;--gold-5:#e1dccf;--gold-6:#d8d0bf;--gold-7:#cbc0aa;--gold-8:#b9a88d;--gold-9:#978365;--gold-10:#8c7a5e;--gold-11:#71624b;--gold-12:#3b352b}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--gold-1:color(display-p3 0.992 0.992 0.989);--gold-2:color(display-p3 0.98 0.976 0.953);--gold-3:color(display-p3 0.947 0.94 0.909);--gold-4:color(display-p3 0.914 0.904 0.865);--gold-5:color(display-p3 0.88 0.865 0.816);--gold-6:color(display-p3 0.84 0.818 0.756);--gold-7:color(display-p3 0.788 0.753 0.677);--gold-8:color(display-p3 0.715 0.66 0.565);--gold-9:color(display-p3 0.579 0.517 0.41);--gold-10:color(display-p3 0.538 0.479 0.38);--gold-11:color(display-p3 0.433 0.386 0.305);--gold-12:color(display-p3 0.227 0.209 0.173)}}}.dark,.dark-theme{--gold-1:#121211;--gold-2:#1b1a17;--gold-3:#24231f;--gold-4:#2d2b26;--gold-5:#38352e;--gold-6:#444039;--gold-7:#544f46;--gold-8:#696256;--gold-9:#978365;--gold-10:#a39073;--gold-11:#cbb99f;--gold-12:#e8e2d9}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--gold-1:color(display-p3 0.071 0.071 0.067);--gold-2:color(display-p3 0.104 0.101 0.09);--gold-3:color(display-p3 0.141 0.136 0.122);--gold-4:color(display-p3 0.177 0.17 0.152);--gold-5:color(display-p3 0.217 0.207 0.185);--gold-6:color(display-p3 0.265 0.252 0.225);--gold-7:color(display-p3 0.327 0.31 0.277);--gold-8:color(display-p3 0.407 0.384 0.342);--gold-9:color(display-p3 0.579 0.517 0.41);--gold-10:color(display-p3 0.628 0.566 0.463);--gold-11:color(display-p3 0.784 0.728 0.635);--gold-12:color(display-p3 0.906 0.887 0.855)}}}.light,.light-theme,:root{--gold-a1:#55550003;--gold-a2:#9d8a000d;--gold-a3:#75600018;--gold-a4:#6b4e0024;--gold-a5:#60460030;--gold-a6:#64440040;--gold-a7:#63420055;--gold-a8:#633d0072;--gold-a9:#5332009a;--gold-a10:#492d00a1;--gold-a11:#362100b4;--gold-a12:#130c00d4}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--gold-a1:color(display-p3 0.349 0.349 0.024/0.012);--gold-a2:color(display-p3 0.592 0.514 0.024/0.048);--gold-a3:color(display-p3 0.4 0.357 0.012/0.091);--gold-a4:color(display-p3 0.357 0.298 0.008/0.134);--gold-a5:color(display-p3 0.345 0.282 0.004/0.185);--gold-a6:color(display-p3 0.341 0.263 0.004/0.244);--gold-a7:color(display-p3 0.345 0.235 0.004/0.322);--gold-a8:color(display-p3 0.345 0.22 0.004/0.436);--gold-a9:color(display-p3 0.286 0.18 0/0.589);--gold-a10:color(display-p3 0.255 0.161 0/0.62);--gold-a11:color(display-p3 0.433 0.386 0.305);--gold-a12:color(display-p3 0.227 0.209 0.173)}}}.dark,.dark-theme{--gold-a1:#91911102;--gold-a2:#f9e29d0b;--gold-a3:#f8ecbb15;--gold-a4:#ffeec41e;--gold-a5:#feecc22a;--gold-a6:#feebcb37;--gold-a7:#ffedcd48;--gold-a8:#fdeaca5f;--gold-a9:#ffdba690;--gold-a10:#fedfb09d;--gold-a11:#fee7c6c8;--gold-a12:#fef7ede7}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--gold-a1:color(display-p3 0.855 0.855 0.071/0.005);--gold-a2:color(display-p3 0.98 0.89 0.616/0.043);--gold-a3:color(display-p3 1 0.949 0.753/0.08);--gold-a4:color(display-p3 1 0.933 0.8/0.118);--gold-a5:color(display-p3 1 0.949 0.804/0.16);--gold-a6:color(display-p3 1 0.925 0.8/0.215);--gold-a7:color(display-p3 1 0.945 0.831/0.278);--gold-a8:color(display-p3 1 0.937 0.82/0.366);--gold-a9:color(display-p3 0.996 0.882 0.69/0.551);--gold-a10:color(display-p3 1 0.894 0.725/0.601);--gold-a11:color(display-p3 0.784 0.728 0.635);--gold-a12:color(display-p3 0.906 0.887 0.855)}}}.light,.light-theme,:root{--bronze-1:#fdfcfc;--bronze-2:#fdf7f5;--bronze-3:#f6edea;--bronze-4:#efe4df;--bronze-5:#e7d9d3;--bronze-6:#dfcdc5;--bronze-7:#d3bcb3;--bronze-8:#c2a499;--bronze-9:#a18072;--bronze-10:#957468;--bronze-11:#7d5e54;--bronze-12:#43302b}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--bronze-1:color(display-p3 0.991 0.988 0.988);--bronze-2:color(display-p3 0.989 0.97 0.961);--bronze-3:color(display-p3 0.958 0.932 0.919);--bronze-4:color(display-p3 0.929 0.894 0.877);--bronze-5:color(display-p3 0.898 0.853 0.832);--bronze-6:color(display-p3 0.861 0.805 0.778);--bronze-7:color(display-p3 0.812 0.739 0.706);--bronze-8:color(display-p3 0.741 0.647 0.606);--bronze-9:color(display-p3 0.611 0.507 0.455);--bronze-10:color(display-p3 0.563 0.461 0.414);--bronze-11:color(display-p3 0.471 0.373 0.336);--bronze-12:color(display-p3 0.251 0.191 0.172)}}}.dark,.dark-theme{--bronze-1:#141110;--bronze-2:#1c1917;--bronze-3:#262220;--bronze-4:#302a27;--bronze-5:#3b3330;--bronze-6:#493e3a;--bronze-7:#5a4c47;--bronze-8:#6f5f58;--bronze-9:#a18072;--bronze-10:#ae8c7e;--bronze-11:#d4b3a5;--bronze-12:#ede0d9}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--bronze-1:color(display-p3 0.076 0.067 0.063);--bronze-2:color(display-p3 0.106 0.097 0.093);--bronze-3:color(display-p3 0.147 0.132 0.125);--bronze-4:color(display-p3 0.185 0.166 0.156);--bronze-5:color(display-p3 0.227 0.202 0.19);--bronze-6:color(display-p3 0.278 0.246 0.23);--bronze-7:color(display-p3 0.343 0.302 0.281);--bronze-8:color(display-p3 0.426 0.374 0.347);--bronze-9:color(display-p3 0.611 0.507 0.455);--bronze-10:color(display-p3 0.66 0.556 0.504);--bronze-11:color(display-p3 0.81 0.707 0.655);--bronze-12:color(display-p3 0.921 0.88 0.854)}}}.light,.light-theme,:root{--bronze-a1:#55000003;--bronze-a2:#cc33000a;--bronze-a3:#92250015;--bronze-a4:#80280020;--bronze-a5:#7423002c;--bronze-a6:#7324003a;--bronze-a7:#6c1f004c;--bronze-a8:#671c0066;--bronze-a9:#551a008d;--bronze-a10:#4c150097;--bronze-a11:#3d0f00ab;--bronze-a12:#1d0600d4}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--bronze-a1:color(display-p3 0.349 0.024 0.024/0.012);--bronze-a2:color(display-p3 0.71 0.22 0.024/0.04);--bronze-a3:color(display-p3 0.482 0.2 0.008/0.083);--bronze-a4:color(display-p3 0.424 0.133 0.004/0.122);--bronze-a5:color(display-p3 0.4 0.145 0.004/0.169);--bronze-a6:color(display-p3 0.388 0.125 0.004/0.224);--bronze-a7:color(display-p3 0.365 0.11 0.004/0.295);--bronze-a8:color(display-p3 0.341 0.102 0.004/0.393);--bronze-a9:color(display-p3 0.29 0.094 0/0.546);--bronze-a10:color(display-p3 0.255 0.082 0/0.585);--bronze-a11:color(display-p3 0.471 0.373 0.336);--bronze-a12:color(display-p3 0.251 0.191 0.172)}}}.dark,.dark-theme{--bronze-a1:#d1110004;--bronze-a2:#fbbc910c;--bronze-a3:#faceb817;--bronze-a4:#facdb622;--bronze-a5:#ffd2c12d;--bronze-a6:#ffd1c03c;--bronze-a7:#fdd0c04f;--bronze-a8:#ffd6c565;--bronze-a9:#fec7b09b;--bronze-a10:#fecab5a9;--bronze-a11:#ffd7c6d1;--bronze-a12:#fff1e9ec}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--bronze-a1:color(display-p3 0.941 0.067 0/0.009);--bronze-a2:color(display-p3 0.98 0.8 0.706/0.043);--bronze-a3:color(display-p3 0.988 0.851 0.761/0.085);--bronze-a4:color(display-p3 0.996 0.839 0.78/0.127);--bronze-a5:color(display-p3 0.996 0.863 0.773/0.173);--bronze-a6:color(display-p3 1 0.863 0.796/0.227);--bronze-a7:color(display-p3 1 0.867 0.8/0.295);--bronze-a8:color(display-p3 1 0.859 0.788/0.387);--bronze-a9:color(display-p3 1 0.82 0.733/0.585);--bronze-a10:color(display-p3 1 0.839 0.761/0.635);--bronze-a11:color(display-p3 0.81 0.707 0.655);--bronze-a12:color(display-p3 0.921 0.88 0.854)}}}.light,.light-theme,:root{--gray-1:#fcfcfc;--gray-2:#f9f9f9;--gray-3:#f0f0f0;--gray-4:#e8e8e8;--gray-5:#e0e0e0;--gray-6:#d9d9d9;--gray-7:#cecece;--gray-8:#bbb;--gray-9:#8d8d8d;--gray-10:#838383;--gray-11:#646464;--gray-12:#202020}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--gray-1:color(display-p3 0.988 0.988 0.988);--gray-2:color(display-p3 0.975 0.975 0.975);--gray-3:color(display-p3 0.939 0.939 0.939);--gray-4:color(display-p3 0.908 0.908 0.908);--gray-5:color(display-p3 0.88 0.88 0.88);--gray-6:color(display-p3 0.849 0.849 0.849);--gray-7:color(display-p3 0.807 0.807 0.807);--gray-8:color(display-p3 0.732 0.732 0.732);--gray-9:color(display-p3 0.553 0.553 0.553);--gray-10:color(display-p3 0.512 0.512 0.512);--gray-11:color(display-p3 0.392 0.392 0.392);--gray-12:color(display-p3 0.125 0.125 0.125)}}}.dark,.dark-theme{--gray-1:#111;--gray-2:#191919;--gray-3:#222;--gray-4:#2a2a2a;--gray-5:#313131;--gray-6:#3a3a3a;--gray-7:#484848;--gray-8:#606060;--gray-9:#6e6e6e;--gray-10:#7b7b7b;--gray-11:#b4b4b4;--gray-12:#eee}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--gray-1:color(display-p3 0.067 0.067 0.067);--gray-2:color(display-p3 0.098 0.098 0.098);--gray-3:color(display-p3 0.135 0.135 0.135);--gray-4:color(display-p3 0.163 0.163 0.163);--gray-5:color(display-p3 0.192 0.192 0.192);--gray-6:color(display-p3 0.228 0.228 0.228);--gray-7:color(display-p3 0.283 0.283 0.283);--gray-8:color(display-p3 0.375 0.375 0.375);--gray-9:color(display-p3 0.431 0.431 0.431);--gray-10:color(display-p3 0.484 0.484 0.484);--gray-11:color(display-p3 0.706 0.706 0.706);--gray-12:color(display-p3 0.933 0.933 0.933)}}}.light,.light-theme,:root{--gray-a1:#00000003;--gray-a2:#00000006;--gray-a3:#0000000f;--gray-a4:#00000017;--gray-a5:#0000001f;--gray-a6:#00000026;--gray-a7:#00000031;--gray-a8:#00000044;--gray-a9:#00000072;--gray-a10:#0000007c;--gray-a11:#0000009b;--gray-a12:#000000df}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--gray-a1:color(display-p3 0 0 0/0.012);--gray-a2:color(display-p3 0 0 0/0.024);--gray-a3:color(display-p3 0 0 0/0.063);--gray-a4:color(display-p3 0 0 0/0.09);--gray-a5:color(display-p3 0 0 0/0.122);--gray-a6:color(display-p3 0 0 0/0.153);--gray-a7:color(display-p3 0 0 0/0.192);--gray-a8:color(display-p3 0 0 0/0.267);--gray-a9:color(display-p3 0 0 0/0.447);--gray-a10:color(display-p3 0 0 0/0.486);--gray-a11:color(display-p3 0 0 0/0.608);--gray-a12:color(display-p3 0 0 0/0.875)}}}.dark,.dark-theme{--gray-a1:#0000;--gray-a2:#ffffff09;--gray-a3:#ffffff12;--gray-a4:#ffffff1b;--gray-a5:#ffffff22;--gray-a6:#ffffff2c;--gray-a7:#ffffff3b;--gray-a8:#ffffff55;--gray-a9:#ffffff64;--gray-a10:#ffffff72;--gray-a11:#ffffffaf;--gray-a12:#ffffffed}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--gray-a1:color(display-p3 0 0 0/0);--gray-a2:color(display-p3 1 1 1/0.034);--gray-a3:color(display-p3 1 1 1/0.071);--gray-a4:color(display-p3 1 1 1/0.105);--gray-a5:color(display-p3 1 1 1/0.134);--gray-a6:color(display-p3 1 1 1/0.172);--gray-a7:color(display-p3 1 1 1/0.231);--gray-a8:color(display-p3 1 1 1/0.332);--gray-a9:color(display-p3 1 1 1/0.391);--gray-a10:color(display-p3 1 1 1/0.445);--gray-a11:color(display-p3 1 1 1/0.685);--gray-a12:color(display-p3 1 1 1/0.929)}}}.light,.light-theme,:root{--mauve-1:#fdfcfd;--mauve-2:#faf9fb;--mauve-3:#f2eff3;--mauve-4:#eae7ec;--mauve-5:#e3dfe6;--mauve-6:#dbd8e0;--mauve-7:#d0cdd7;--mauve-8:#bcbac7;--mauve-9:#8e8c99;--mauve-10:#84828e;--mauve-11:#65636d;--mauve-12:#211f26}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--mauve-1:color(display-p3 0.991 0.988 0.992);--mauve-2:color(display-p3 0.98 0.976 0.984);--mauve-3:color(display-p3 0.946 0.938 0.952);--mauve-4:color(display-p3 0.915 0.906 0.925);--mauve-5:color(display-p3 0.886 0.876 0.901);--mauve-6:color(display-p3 0.856 0.846 0.875);--mauve-7:color(display-p3 0.814 0.804 0.84);--mauve-8:color(display-p3 0.735 0.728 0.777);--mauve-9:color(display-p3 0.555 0.549 0.596);--mauve-10:color(display-p3 0.514 0.508 0.552);--mauve-11:color(display-p3 0.395 0.388 0.424);--mauve-12:color(display-p3 0.128 0.122 0.147)}}}.dark,.dark-theme{--mauve-1:#121113;--mauve-2:#1a191b;--mauve-3:#232225;--mauve-4:#2b292d;--mauve-5:#323035;--mauve-6:#3c393f;--mauve-7:#49474e;--mauve-8:#625f69;--mauve-9:#6f6d78;--mauve-10:#7c7a85;--mauve-11:#b5b2bc;--mauve-12:#eeeef0}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--mauve-1:color(display-p3 0.07 0.067 0.074);--mauve-2:color(display-p3 0.101 0.098 0.105);--mauve-3:color(display-p3 0.138 0.134 0.144);--mauve-4:color(display-p3 0.167 0.161 0.175);--mauve-5:color(display-p3 0.196 0.189 0.206);--mauve-6:color(display-p3 0.232 0.225 0.245);--mauve-7:color(display-p3 0.286 0.277 0.302);--mauve-8:color(display-p3 0.383 0.373 0.408);--mauve-9:color(display-p3 0.434 0.428 0.467);--mauve-10:color(display-p3 0.487 0.48 0.519);--mauve-11:color(display-p3 0.707 0.7 0.735);--mauve-12:color(display-p3 0.933 0.933 0.94)}}}.light,.light-theme,:root{--mauve-a1:#55005503;--mauve-a2:#2b005506;--mauve-a3:#30004010;--mauve-a4:#20003618;--mauve-a5:#20003820;--mauve-a6:#14003527;--mauve-a7:#10003332;--mauve-a8:#08003145;--mauve-a9:#05001d73;--mauve-a10:#0500197d;--mauve-a11:#0400119c;--mauve-a12:#020008e0}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--mauve-a1:color(display-p3 0.349 0.024 0.349/0.012);--mauve-a2:color(display-p3 0.184 0.024 0.349/0.024);--mauve-a3:color(display-p3 0.129 0.008 0.255/0.063);--mauve-a4:color(display-p3 0.094 0.012 0.216/0.095);--mauve-a5:color(display-p3 0.098 0.008 0.224/0.126);--mauve-a6:color(display-p3 0.055 0.004 0.18/0.153);--mauve-a7:color(display-p3 0.067 0.008 0.184/0.197);--mauve-a8:color(display-p3 0.02 0.004 0.176/0.271);--mauve-a9:color(display-p3 0.02 0.004 0.106/0.451);--mauve-a10:color(display-p3 0.012 0.004 0.09/0.491);--mauve-a11:color(display-p3 0.016 0 0.059/0.612);--mauve-a12:color(display-p3 0.008 0 0.027/0.879)}}}.dark,.dark-theme{--mauve-a1:#0000;--mauve-a2:#f5f4f609;--mauve-a3:#ebeaf814;--mauve-a4:#eee5f81d;--mauve-a5:#efe6fe25;--mauve-a6:#f1e6fd30;--mauve-a7:#eee9ff40;--mauve-a8:#eee7ff5d;--mauve-a9:#eae6fd6e;--mauve-a10:#ece9fd7c;--mauve-a11:#f5f1ffb7;--mauve-a12:#fdfdffef}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--mauve-a1:color(display-p3 0 0 0/0);--mauve-a2:color(display-p3 0.996 0.992 1/0.034);--mauve-a3:color(display-p3 0.937 0.933 0.992/0.077);--mauve-a4:color(display-p3 0.957 0.918 0.996/0.111);--mauve-a5:color(display-p3 0.937 0.906 0.996/0.145);--mauve-a6:color(display-p3 0.953 0.925 0.996/0.183);--mauve-a7:color(display-p3 0.945 0.929 1/0.246);--mauve-a8:color(display-p3 0.937 0.918 1/0.361);--mauve-a9:color(display-p3 0.933 0.918 1/0.424);--mauve-a10:color(display-p3 0.941 0.925 1/0.479);--mauve-a11:color(display-p3 0.965 0.961 1/0.712);--mauve-a12:color(display-p3 0.992 0.992 1/0.937)}}}.light,.light-theme,:root{--slate-1:#fcfcfd;--slate-2:#f9f9fb;--slate-3:#f0f0f3;--slate-4:#e8e8ec;--slate-5:#e0e1e6;--slate-6:#d9d9e0;--slate-7:#cdced6;--slate-8:#b9bbc6;--slate-9:#8b8d98;--slate-10:#80838d;--slate-11:#60646c;--slate-12:#1c2024}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--slate-1:color(display-p3 0.988 0.988 0.992);--slate-2:color(display-p3 0.976 0.976 0.984);--slate-3:color(display-p3 0.94 0.941 0.953);--slate-4:color(display-p3 0.908 0.909 0.925);--slate-5:color(display-p3 0.88 0.881 0.901);--slate-6:color(display-p3 0.85 0.852 0.876);--slate-7:color(display-p3 0.805 0.808 0.838);--slate-8:color(display-p3 0.727 0.733 0.773);--slate-9:color(display-p3 0.547 0.553 0.592);--slate-10:color(display-p3 0.503 0.512 0.549);--slate-11:color(display-p3 0.379 0.392 0.421);--slate-12:color(display-p3 0.113 0.125 0.14)}}}.dark,.dark-theme{--slate-1:#111113;--slate-2:#18191b;--slate-3:#212225;--slate-4:#272a2d;--slate-5:#2e3135;--slate-6:#363a3f;--slate-7:#43484e;--slate-8:#5a6169;--slate-9:#696e77;--slate-10:#777b84;--slate-11:#b0b4ba;--slate-12:#edeef0}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--slate-1:color(display-p3 0.067 0.067 0.074);--slate-2:color(display-p3 0.095 0.098 0.105);--slate-3:color(display-p3 0.13 0.135 0.145);--slate-4:color(display-p3 0.156 0.163 0.176);--slate-5:color(display-p3 0.183 0.191 0.206);--slate-6:color(display-p3 0.215 0.226 0.244);--slate-7:color(display-p3 0.265 0.28 0.302);--slate-8:color(display-p3 0.357 0.381 0.409);--slate-9:color(display-p3 0.415 0.431 0.463);--slate-10:color(display-p3 0.469 0.483 0.514);--slate-11:color(display-p3 0.692 0.704 0.728);--slate-12:color(display-p3 0.93 0.933 0.94)}}}.light,.light-theme,:root{--slate-a1:#00005503;--slate-a2:#00005506;--slate-a3:#0000330f;--slate-a4:#00002d17;--slate-a5:#0009321f;--slate-a6:#00002f26;--slate-a7:#00062e32;--slate-a8:#00083046;--slate-a9:#00051d74;--slate-a10:#00071b7f;--slate-a11:#0007149f;--slate-a12:#000509e3}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--slate-a1:color(display-p3 0.024 0.024 0.349/0.012);--slate-a2:color(display-p3 0.024 0.024 0.349/0.024);--slate-a3:color(display-p3 0.004 0.004 0.204/0.059);--slate-a4:color(display-p3 0.012 0.012 0.184/0.091);--slate-a5:color(display-p3 0.004 0.039 0.2/0.122);--slate-a6:color(display-p3 0.008 0.008 0.165/0.15);--slate-a7:color(display-p3 0.008 0.027 0.184/0.197);--slate-a8:color(display-p3 0.004 0.031 0.176/0.275);--slate-a9:color(display-p3 0.004 0.02 0.106/0.455);--slate-a10:color(display-p3 0.004 0.027 0.098/0.499);--slate-a11:color(display-p3 0 0.02 0.063/0.62);--slate-a12:color(display-p3 0 0.012 0.031/0.887)}}}.dark,.dark-theme{--slate-a1:#0000;--slate-a2:#d8f4f609;--slate-a3:#ddeaf814;--slate-a4:#d3edf81d;--slate-a5:#d9edfe25;--slate-a6:#d6ebfd30;--slate-a7:#d9edff40;--slate-a8:#d9edff5d;--slate-a9:#dfebfd6d;--slate-a10:#e5edfd7b;--slate-a11:#f1f7feb5;--slate-a12:#fcfdffef}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--slate-a1:color(display-p3 0 0 0/0);--slate-a2:color(display-p3 0.875 0.992 1/0.034);--slate-a3:color(display-p3 0.882 0.933 0.992/0.077);--slate-a4:color(display-p3 0.882 0.953 0.996/0.111);--slate-a5:color(display-p3 0.878 0.929 0.996/0.145);--slate-a6:color(display-p3 0.882 0.949 0.996/0.183);--slate-a7:color(display-p3 0.882 0.929 1/0.246);--slate-a8:color(display-p3 0.871 0.937 1/0.361);--slate-a9:color(display-p3 0.898 0.937 1/0.42);--slate-a10:color(display-p3 0.918 0.945 1/0.475);--slate-a11:color(display-p3 0.949 0.969 0.996/0.708);--slate-a12:color(display-p3 0.988 0.992 1/0.937)}}}.light,.light-theme,:root{--sage-1:#fbfdfc;--sage-2:#f7f9f8;--sage-3:#eef1f0;--sage-4:#e6e9e8;--sage-5:#dfe2e0;--sage-6:#d7dad9;--sage-7:#cbcfcd;--sage-8:#b8bcba;--sage-9:#868e8b;--sage-10:#7c8481;--sage-11:#5f6563;--sage-12:#1a211e}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--sage-1:color(display-p3 0.986 0.992 0.988);--sage-2:color(display-p3 0.97 0.977 0.974);--sage-3:color(display-p3 0.935 0.944 0.94);--sage-4:color(display-p3 0.904 0.913 0.909);--sage-5:color(display-p3 0.875 0.885 0.88);--sage-6:color(display-p3 0.844 0.854 0.849);--sage-7:color(display-p3 0.8 0.811 0.806);--sage-8:color(display-p3 0.725 0.738 0.732);--sage-9:color(display-p3 0.531 0.556 0.546);--sage-10:color(display-p3 0.492 0.515 0.506);--sage-11:color(display-p3 0.377 0.395 0.389);--sage-12:color(display-p3 0.107 0.129 0.118)}}}.dark,.dark-theme{--sage-1:#101211;--sage-2:#171918;--sage-3:#202221;--sage-4:#272a29;--sage-5:#2e3130;--sage-6:#373b39;--sage-7:#444947;--sage-8:#5b625f;--sage-9:#63706b;--sage-10:#717d79;--sage-11:#adb5b2;--sage-12:#eceeed}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--sage-1:color(display-p3 0.064 0.07 0.067);--sage-2:color(display-p3 0.092 0.098 0.094);--sage-3:color(display-p3 0.128 0.135 0.131);--sage-4:color(display-p3 0.155 0.164 0.159);--sage-5:color(display-p3 0.183 0.193 0.188);--sage-6:color(display-p3 0.218 0.23 0.224);--sage-7:color(display-p3 0.269 0.285 0.277);--sage-8:color(display-p3 0.362 0.382 0.373);--sage-9:color(display-p3 0.398 0.438 0.421);--sage-10:color(display-p3 0.453 0.49 0.474);--sage-11:color(display-p3 0.685 0.709 0.697);--sage-12:color(display-p3 0.927 0.933 0.93)}}}.light,.light-theme,:root{--sage-a1:#00804004;--sage-a2:#00402008;--sage-a3:#002d1e11;--sage-a4:#001f1519;--sage-a5:#00180820;--sage-a6:#00140d28;--sage-a7:#00140a34;--sage-a8:#000f0847;--sage-a9:#00110b79;--sage-a10:#00100a83;--sage-a11:#000a07a0;--sage-a12:#000805e5}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--sage-a1:color(display-p3 0.024 0.514 0.267/0.016);--sage-a2:color(display-p3 0.02 0.267 0.145/0.032);--sage-a3:color(display-p3 0.008 0.184 0.125/0.067);--sage-a4:color(display-p3 0.012 0.094 0.051/0.095);--sage-a5:color(display-p3 0.008 0.098 0.035/0.126);--sage-a6:color(display-p3 0.004 0.078 0.027/0.157);--sage-a7:color(display-p3 0 0.059 0.039/0.2);--sage-a8:color(display-p3 0.004 0.047 0.031/0.275);--sage-a9:color(display-p3 0.004 0.059 0.035/0.471);--sage-a10:color(display-p3 0 0.047 0.031/0.51);--sage-a11:color(display-p3 0 0.031 0.02/0.624);--sage-a12:color(display-p3 0 0.027 0.012/0.895)}}}.dark,.dark-theme{--sage-a1:#0000;--sage-a2:#f0f2f108;--sage-a3:#f3f5f412;--sage-a4:#f2fefd1a;--sage-a5:#f1fbfa22;--sage-a6:#edfbf42d;--sage-a7:#edfcf73c;--sage-a8:#ebfdf657;--sage-a9:#dffdf266;--sage-a10:#e5fdf674;--sage-a11:#f4fefbb0;--sage-a12:#fdfffeed}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--sage-a1:color(display-p3 0 0 0/0);--sage-a2:color(display-p3 0.976 0.988 0.984/0.03);--sage-a3:color(display-p3 0.992 0.945 0.941/0.072);--sage-a4:color(display-p3 0.988 0.996 0.992/0.102);--sage-a5:color(display-p3 0.992 1 0.996/0.131);--sage-a6:color(display-p3 0.973 1 0.976/0.173);--sage-a7:color(display-p3 0.957 1 0.976/0.233);--sage-a8:color(display-p3 0.957 1 0.984/0.334);--sage-a9:color(display-p3 0.902 1 0.957/0.397);--sage-a10:color(display-p3 0.929 1 0.973/0.452);--sage-a11:color(display-p3 0.969 1 0.988/0.688);--sage-a12:color(display-p3 0.992 1 0.996/0.929)}}}.light,.light-theme,:root{--olive-1:#fcfdfc;--olive-2:#f8faf8;--olive-3:#eff1ef;--olive-4:#e7e9e7;--olive-5:#dfe2df;--olive-6:#d7dad7;--olive-7:#cccfcc;--olive-8:#b9bcb8;--olive-9:#898e87;--olive-10:#7f847d;--olive-11:#60655f;--olive-12:#1d211c}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--olive-1:color(display-p3 0.989 0.992 0.989);--olive-2:color(display-p3 0.974 0.98 0.973);--olive-3:color(display-p3 0.939 0.945 0.937);--olive-4:color(display-p3 0.907 0.914 0.905);--olive-5:color(display-p3 0.878 0.885 0.875);--olive-6:color(display-p3 0.846 0.855 0.843);--olive-7:color(display-p3 0.803 0.812 0.8);--olive-8:color(display-p3 0.727 0.738 0.723);--olive-9:color(display-p3 0.541 0.556 0.532);--olive-10:color(display-p3 0.5 0.515 0.491);--olive-11:color(display-p3 0.38 0.395 0.374);--olive-12:color(display-p3 0.117 0.129 0.111)}}}.dark,.dark-theme{--olive-1:#111210;--olive-2:#181917;--olive-3:#212220;--olive-4:#282a27;--olive-5:#2f312e;--olive-6:#383a36;--olive-7:#454843;--olive-8:#5c625b;--olive-9:#687066;--olive-10:#767d74;--olive-11:#afb5ad;--olive-12:#eceeec}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--olive-1:color(display-p3 0.067 0.07 0.063);--olive-2:color(display-p3 0.095 0.098 0.091);--olive-3:color(display-p3 0.131 0.135 0.126);--olive-4:color(display-p3 0.158 0.163 0.153);--olive-5:color(display-p3 0.186 0.192 0.18);--olive-6:color(display-p3 0.221 0.229 0.215);--olive-7:color(display-p3 0.273 0.284 0.266);--olive-8:color(display-p3 0.365 0.382 0.359);--olive-9:color(display-p3 0.414 0.438 0.404);--olive-10:color(display-p3 0.467 0.49 0.458);--olive-11:color(display-p3 0.69 0.709 0.682);--olive-12:color(display-p3 0.927 0.933 0.926)}}}.light,.light-theme,:root{--olive-a1:#00550003;--olive-a2:#00490007;--olive-a3:#00200010;--olive-a4:#00160018;--olive-a5:#00180020;--olive-a6:#00140028;--olive-a7:#000f0033;--olive-a8:#040f0047;--olive-a9:#050f0078;--olive-a10:#040e0082;--olive-a11:#020a00a0;--olive-a12:#010600e3}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--olive-a1:color(display-p3 0.024 0.349 0.024/0.012);--olive-a2:color(display-p3 0.024 0.302 0.024/0.028);--olive-a3:color(display-p3 0.008 0.129 0.008/0.063);--olive-a4:color(display-p3 0.012 0.094 0.012/0.095);--olive-a5:color(display-p3 0.035 0.098 0.008/0.126);--olive-a6:color(display-p3 0.027 0.078 0.004/0.157);--olive-a7:color(display-p3 0.02 0.059 0/0.2);--olive-a8:color(display-p3 0.02 0.059 0.004/0.279);--olive-a9:color(display-p3 0.02 0.051 0.004/0.467);--olive-a10:color(display-p3 0.024 0.047 0/0.51);--olive-a11:color(display-p3 0.012 0.039 0/0.628);--olive-a12:color(display-p3 0.008 0.024 0/0.891)}}}.dark,.dark-theme{--olive-a1:#0000;--olive-a2:#f1f2f008;--olive-a3:#f4f5f312;--olive-a4:#f3fef21a;--olive-a5:#f2fbf122;--olive-a6:#f4faed2c;--olive-a7:#f2fced3b;--olive-a8:#edfdeb57;--olive-a9:#ebfde766;--olive-a10:#f0fdec74;--olive-a11:#f6fef4b0;--olive-a12:#fdfffded}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--olive-a1:color(display-p3 0 0 0/0);--olive-a2:color(display-p3 0.984 0.988 0.976/0.03);--olive-a3:color(display-p3 0.992 0.996 0.988/0.068);--olive-a4:color(display-p3 0.953 0.996 0.949/0.102);--olive-a5:color(display-p3 0.969 1 0.965/0.131);--olive-a6:color(display-p3 0.973 1 0.969/0.169);--olive-a7:color(display-p3 0.98 1 0.961/0.228);--olive-a8:color(display-p3 0.961 1 0.957/0.334);--olive-a9:color(display-p3 0.949 1 0.922/0.397);--olive-a10:color(display-p3 0.953 1 0.941/0.452);--olive-a11:color(display-p3 0.976 1 0.965/0.688);--olive-a12:color(display-p3 0.992 1 0.992/0.929)}}}.light,.light-theme,:root{--sand-1:#fdfdfc;--sand-2:#f9f9f8;--sand-3:#f1f0ef;--sand-4:#e9e8e6;--sand-5:#e2e1de;--sand-6:#dad9d6;--sand-7:#cfceca;--sand-8:#bcbbb5;--sand-9:#8d8d86;--sand-10:#82827c;--sand-11:#63635e;--sand-12:#21201c}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--sand-1:color(display-p3 0.992 0.992 0.989);--sand-2:color(display-p3 0.977 0.977 0.973);--sand-3:color(display-p3 0.943 0.942 0.936);--sand-4:color(display-p3 0.913 0.912 0.903);--sand-5:color(display-p3 0.885 0.883 0.873);--sand-6:color(display-p3 0.854 0.852 0.839);--sand-7:color(display-p3 0.813 0.81 0.794);--sand-8:color(display-p3 0.738 0.734 0.713);--sand-9:color(display-p3 0.553 0.553 0.528);--sand-10:color(display-p3 0.511 0.511 0.488);--sand-11:color(display-p3 0.388 0.388 0.37);--sand-12:color(display-p3 0.129 0.126 0.111)}}}.dark,.dark-theme{--sand-1:#111110;--sand-2:#191918;--sand-3:#222221;--sand-4:#2a2a28;--sand-5:#31312e;--sand-6:#3b3a37;--sand-7:#494844;--sand-8:#62605b;--sand-9:#6f6d66;--sand-10:#7c7b74;--sand-11:#b5b3ad;--sand-12:#eeeeec}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--sand-1:color(display-p3 0.067 0.067 0.063);--sand-2:color(display-p3 0.098 0.098 0.094);--sand-3:color(display-p3 0.135 0.135 0.129);--sand-4:color(display-p3 0.164 0.163 0.156);--sand-5:color(display-p3 0.193 0.192 0.183);--sand-6:color(display-p3 0.23 0.229 0.217);--sand-7:color(display-p3 0.285 0.282 0.267);--sand-8:color(display-p3 0.384 0.378 0.357);--sand-9:color(display-p3 0.434 0.428 0.403);--sand-10:color(display-p3 0.487 0.481 0.456);--sand-11:color(display-p3 0.707 0.703 0.68);--sand-12:color(display-p3 0.933 0.933 0.926)}}}.light,.light-theme,:root{--sand-a1:#55550003;--sand-a2:#25250007;--sand-a3:#20100010;--sand-a4:#1f150019;--sand-a5:#1f180021;--sand-a6:#19130029;--sand-a7:#19140035;--sand-a8:#1915014a;--sand-a9:#0f0f0079;--sand-a10:#0c0c0083;--sand-a11:#080800a1;--sand-a12:#060500e3}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.light,.light-theme,:root{--sand-a1:color(display-p3 0.349 0.349 0.024/0.012);--sand-a2:color(display-p3 0.161 0.161 0.024/0.028);--sand-a3:color(display-p3 0.067 0.067 0.008/0.063);--sand-a4:color(display-p3 0.129 0.129 0.012/0.099);--sand-a5:color(display-p3 0.098 0.067 0.008/0.126);--sand-a6:color(display-p3 0.102 0.075 0.004/0.161);--sand-a7:color(display-p3 0.098 0.098 0.004/0.208);--sand-a8:color(display-p3 0.086 0.075 0.004/0.287);--sand-a9:color(display-p3 0.051 0.051 0.004/0.471);--sand-a10:color(display-p3 0.047 0.047 0/0.514);--sand-a11:color(display-p3 0.031 0.031 0/0.632);--sand-a12:color(display-p3 0.024 0.02 0/0.891)}}}.dark,.dark-theme{--sand-a1:#0000;--sand-a2:#f4f4f309;--sand-a3:#f6f6f513;--sand-a4:#fefef31b;--sand-a5:#fbfbeb23;--sand-a6:#fffaed2d;--sand-a7:#fffbed3c;--sand-a8:#fff9eb57;--sand-a9:#fffae965;--sand-a10:#fffdee73;--sand-a11:#fffcf4b0;--sand-a12:#fffffded}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){.dark,.dark-theme{--sand-a1:color(display-p3 0 0 0/0);--sand-a2:color(display-p3 0.992 0.992 0.988/0.034);--sand-a3:color(display-p3 0.996 0.996 0.992/0.072);--sand-a4:color(display-p3 0.992 0.992 0.953/0.106);--sand-a5:color(display-p3 1 1 0.965/0.135);--sand-a6:color(display-p3 1 0.976 0.929/0.177);--sand-a7:color(display-p3 1 0.984 0.929/0.236);--sand-a8:color(display-p3 1 0.976 0.925/0.341);--sand-a9:color(display-p3 1 0.98 0.925/0.395);--sand-a10:color(display-p3 1 0.992 0.933/0.45);--sand-a11:color(display-p3 1 0.996 0.961/0.685);--sand-a12:color(display-p3 1 1 0.992/0.929)}}}:root{--black-a1:#0000000d;--black-a2:#0000001a;--black-a3:#00000026;--black-a4:#0003;--black-a5:#0000004d;--black-a6:#0006;--black-a7:#00000080;--black-a8:#0009;--black-a9:#000000b3;--black-a10:#000c;--black-a11:#000000e6;--black-a12:#000000f2}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){:root{--black-a1:color(display-p3 0 0 0/0.05);--black-a2:color(display-p3 0 0 0/0.1);--black-a3:color(display-p3 0 0 0/0.15);--black-a4:color(display-p3 0 0 0/0.2);--black-a5:color(display-p3 0 0 0/0.3);--black-a6:color(display-p3 0 0 0/0.4);--black-a7:color(display-p3 0 0 0/0.5);--black-a8:color(display-p3 0 0 0/0.6);--black-a9:color(display-p3 0 0 0/0.7);--black-a10:color(display-p3 0 0 0/0.8);--black-a11:color(display-p3 0 0 0/0.9);--black-a12:color(display-p3 0 0 0/0.95)}}}:root{--white-a1:#ffffff0d;--white-a2:#ffffff1a;--white-a3:#ffffff26;--white-a4:#fff3;--white-a5:#ffffff4d;--white-a6:#fff6;--white-a7:#ffffff80;--white-a8:#fff9;--white-a9:#ffffffb3;--white-a10:#fffc;--white-a11:#ffffffe6;--white-a12:#fffffff2}@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){:root{--white-a1:color(display-p3 1 1 1/0.05);--white-a2:color(display-p3 1 1 1/0.1);--white-a3:color(display-p3 1 1 1/0.15);--white-a4:color(display-p3 1 1 1/0.2);--white-a5:color(display-p3 1 1 1/0.3);--white-a6:color(display-p3 1 1 1/0.4);--white-a7:color(display-p3 1 1 1/0.5);--white-a8:color(display-p3 1 1 1/0.6);--white-a9:color(display-p3 1 1 1/0.7);--white-a10:color(display-p3 1 1 1/0.8);--white-a11:color(display-p3 1 1 1/0.9);--white-a12:color(display-p3 1 1 1/0.95)}}}:root{--tomato-9-contrast:#fff;--red-9-contrast:#fff;--ruby-9-contrast:#fff;--crimson-9-contrast:#fff;--pink-9-contrast:#fff;--plum-9-contrast:#fff;--purple-9-contrast:#fff;--violet-9-contrast:#fff;--iris-9-contrast:#fff;--indigo-9-contrast:#fff;--blue-9-contrast:#fff;--cyan-9-contrast:#fff;--teal-9-contrast:#fff;--jade-9-contrast:#fff;--green-9-contrast:#fff;--grass-9-contrast:#fff;--orange-9-contrast:#fff;--brown-9-contrast:#fff;--sky-9-contrast:#1c2024;--mint-9-contrast:#1a211e;--lime-9-contrast:#1d211c;--yellow-9-contrast:#21201c;--amber-9-contrast:#21201c;--gold-9-contrast:#fff;--bronze-9-contrast:#fff;--gray-9-contrast:#fff}.light,.light-theme,:root{--gray-surface:#fffc;--mauve-surface:#fffc;--slate-surface:#fffc;--sage-surface:#fffc;--olive-surface:#fffc;--sand-surface:#fffc;--tomato-surface:#fff6f5cc;--red-surface:#fff5f5cc;--ruby-surface:#fff5f6cc;--crimson-surface:#fef5f8cc;--pink-surface:#fef5facc;--plum-surface:#fdf5fdcc;--purple-surface:#faf5fecc;--violet-surface:#f9f6ffcc;--iris-surface:#f6f6ffcc;--indigo-surface:#f5f8ffcc;--blue-surface:#f1f9ffcc;--cyan-surface:#eff9facc;--teal-surface:#f0faf8cc;--jade-surface:#f1faf5cc;--green-surface:#f1faf4cc;--grass-surface:#f3faf3cc;--brown-surface:#fbf8f4cc;--bronze-surface:#fdf5f3cc;--gold-surface:#f9f8efcc;--sky-surface:#eef9fdcc;--mint-surface:#effaf8cc;--lime-surface:#f6f9f0cc;--yellow-surface:#fefbe4cc;--amber-surface:#fefae4cc;--orange-surface:#fff5e9cc;@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){&{--gray-surface:color(display-p3 1 1 1/0.8);--mauve-surface:color(display-p3 1 1 1/0.8);--slate-surface:color(display-p3 1 1 1/0.8);--sage-surface:color(display-p3 1 1 1/0.8);--olive-surface:color(display-p3 1 1 1/0.8);--sand-surface:color(display-p3 1 1 1/0.8);--tomato-surface:color(display-p3 0.9922 0.9647 0.9608/0.8);--red-surface:color(display-p3 0.9961 0.9647 0.9647/0.8);--ruby-surface:color(display-p3 0.9961 0.9647 0.9647/0.8);--crimson-surface:color(display-p3 0.9922 0.9608 0.9725/0.8);--pink-surface:color(display-p3 0.9922 0.9608 0.9804/0.8);--plum-surface:color(display-p3 0.9843 0.9647 0.9843/0.8);--purple-surface:color(display-p3 0.9804 0.9647 0.9922/0.8);--violet-surface:color(display-p3 0.9725 0.9647 0.9961/0.8);--iris-surface:color(display-p3 0.9647 0.9647 0.9961/0.8);--indigo-surface:color(display-p3 0.9647 0.9725 0.9961/0.8);--blue-surface:color(display-p3 0.9529 0.9765 0.9961/0.8);--cyan-surface:color(display-p3 0.9412 0.9765 0.9804/0.8);--teal-surface:color(display-p3 0.9451 0.9804 0.9725/0.8);--jade-surface:color(display-p3 0.9529 0.9804 0.9608/0.8);--green-surface:color(display-p3 0.9569 0.9804 0.9608/0.8);--grass-surface:color(display-p3 0.9569 0.9804 0.9569/0.8);--brown-surface:color(display-p3 0.9843 0.9725 0.9569/0.8);--bronze-surface:color(display-p3 0.9843 0.9608 0.9529/0.8);--gold-surface:color(display-p3 0.9765 0.9725 0.9412/0.8);--sky-surface:color(display-p3 0.9412 0.9765 0.9843/0.8);--mint-surface:color(display-p3 0.9451 0.9804 0.9725/0.8);--lime-surface:color(display-p3 0.9725 0.9765 0.9412/0.8);--yellow-surface:color(display-p3 0.9961 0.9922 0.902/0.8);--amber-surface:color(display-p3 0.9922 0.9843 0.902/0.8);--orange-surface:color(display-p3 0.9961 0.9608 0.9176/0.8)}}}}.dark,.dark-theme{--gray-surface:#21212180;--mauve-surface:#22212380;--slate-surface:#1f212380;--sage-surface:#1e201f80;--olive-surface:#1f201e80;--sand-surface:#21212080;--tomato-surface:#2d191580;--red-surface:#2f151780;--ruby-surface:#2b191d80;--crimson-surface:#2f151f80;--pink-surface:#31132980;--plum-surface:#2f152f80;--purple-surface:#2b173580;--violet-surface:#25193980;--iris-surface:#1d1b3980;--indigo-surface:#171d3b80;--blue-surface:#11213d80;--cyan-surface:#11252d80;--teal-surface:#13272580;--jade-surface:#13271f80;--green-surface:#15251d80;--grass-surface:#19231b80;--brown-surface:#271f1b80;--bronze-surface:#27211d80;--gold-surface:#25231d80;--sky-surface:#13233b80;--mint-surface:#15272780;--lime-surface:#1b211580;--yellow-surface:#231f1380;--amber-surface:#271f1380;--orange-surface:#271d1380;@supports (color:color(display-p3 1 1 1)){@media (color-gamut:p3){&{--gray-surface:color(display-p3 0.1255 0.1255 0.1255/0.5);--mauve-surface:color(display-p3 0.1333 0.1255 0.1333/0.5);--slate-surface:color(display-p3 0.1176 0.1255 0.1333/0.5);--sage-surface:color(display-p3 0.1176 0.1255 0.1176/0.5);--olive-surface:color(display-p3 0.1176 0.1255 0.1176/0.5);--sand-surface:color(display-p3 0.1255 0.1255 0.1255/0.5);--tomato-surface:color(display-p3 0.1569 0.0941 0.0784/0.5);--red-surface:color(display-p3 0.1647 0.0863 0.0863/0.5);--ruby-surface:color(display-p3 0.1569 0.0941 0.1098/0.5);--crimson-surface:color(display-p3 0.1647 0.0863 0.1176/0.5);--pink-surface:color(display-p3 0.1725 0.0784 0.149/0.5);--plum-surface:color(display-p3 0.1647 0.0863 0.1725/0.5);--purple-surface:color(display-p3 0.149 0.0941 0.1961/0.5);--violet-surface:color(display-p3 0.1333 0.102 0.2118/0.5);--iris-surface:color(display-p3 0.1098 0.102 0.2118/0.5);--indigo-surface:color(display-p3 0.0941 0.1098 0.2196/0.5);--blue-surface:color(display-p3 0.0706 0.1255 0.2196/0.5);--cyan-surface:color(display-p3 0.0784 0.1412 0.1725/0.5);--teal-surface:color(display-p3 0.0863 0.149 0.1412/0.5);--jade-surface:color(display-p3 0.0863 0.149 0.1176/0.5);--green-surface:color(display-p3 0.0941 0.1412 0.1098/0.5);--grass-surface:color(display-p3 0.102 0.1333 0.102/0.5);--brown-surface:color(display-p3 0.1412 0.1176 0.102/0.5);--bronze-surface:color(display-p3 0.1412 0.1255 0.1176/0.5);--gold-surface:color(display-p3 0.1412 0.1333 0.1098/0.5);--sky-surface:color(display-p3 0.0863 0.1333 0.2196/0.5);--mint-surface:color(display-p3 0.0941 0.149 0.1412/0.5);--lime-surface:color(display-p3 0.1098 0.1255 0.0784/0.5);--yellow-surface:color(display-p3 0.1333 0.1176 0.0706/0.5);--amber-surface:color(display-p3 0.1412 0.1176 0.0784/0.5);--orange-surface:color(display-p3 0.1412 0.1098 0.0706/0.5)}}}}[data-accent-color=tomato]{--color-surface-accent:var(--tomato-surface);--accent-1:var(--tomato-1);--accent-2:var(--tomato-2);--accent-3:var(--tomato-3);--accent-4:var(--tomato-4);--accent-5:var(--tomato-5);--accent-6:var(--tomato-6);--accent-7:var(--tomato-7);--accent-8:var(--tomato-8);--accent-9:var(--tomato-9);--accent-9-contrast:var(--tomato-9-contrast);--accent-10:var(--tomato-10);--accent-11:var(--tomato-11);--accent-12:var(--tomato-12);--accent-a1:var(--tomato-a1);--accent-a2:var(--tomato-a2);--accent-a3:var(--tomato-a3);--accent-a4:var(--tomato-a4);--accent-a5:var(--tomato-a5);--accent-a6:var(--tomato-a6);--accent-a7:var(--tomato-a7);--accent-a8:var(--tomato-a8);--accent-a9:var(--tomato-a9);--accent-a10:var(--tomato-a10);--accent-a11:var(--tomato-a11);--accent-a12:var(--tomato-a12)}[data-accent-color=red]{--color-surface-accent:var(--red-surface);--accent-1:var(--red-1);--accent-2:var(--red-2);--accent-3:var(--red-3);--accent-4:var(--red-4);--accent-5:var(--red-5);--accent-6:var(--red-6);--accent-7:var(--red-7);--accent-8:var(--red-8);--accent-9:var(--red-9);--accent-9-contrast:var(--red-9-contrast);--accent-10:var(--red-10);--accent-11:var(--red-11);--accent-12:var(--red-12);--accent-a1:var(--red-a1);--accent-a2:var(--red-a2);--accent-a3:var(--red-a3);--accent-a4:var(--red-a4);--accent-a5:var(--red-a5);--accent-a6:var(--red-a6);--accent-a7:var(--red-a7);--accent-a8:var(--red-a8);--accent-a9:var(--red-a9);--accent-a10:var(--red-a10);--accent-a11:var(--red-a11);--accent-a12:var(--red-a12)}[data-accent-color=ruby]{--color-surface-accent:var(--ruby-surface);--accent-1:var(--ruby-1);--accent-2:var(--ruby-2);--accent-3:var(--ruby-3);--accent-4:var(--ruby-4);--accent-5:var(--ruby-5);--accent-6:var(--ruby-6);--accent-7:var(--ruby-7);--accent-8:var(--ruby-8);--accent-9:var(--ruby-9);--accent-9-contrast:var(--ruby-9-contrast);--accent-10:var(--ruby-10);--accent-11:var(--ruby-11);--accent-12:var(--ruby-12);--accent-a1:var(--ruby-a1);--accent-a2:var(--ruby-a2);--accent-a3:var(--ruby-a3);--accent-a4:var(--ruby-a4);--accent-a5:var(--ruby-a5);--accent-a6:var(--ruby-a6);--accent-a7:var(--ruby-a7);--accent-a8:var(--ruby-a8);--accent-a9:var(--ruby-a9);--accent-a10:var(--ruby-a10);--accent-a11:var(--ruby-a11);--accent-a12:var(--ruby-a12)}[data-accent-color=crimson]{--color-surface-accent:var(--crimson-surface);--accent-1:var(--crimson-1);--accent-2:var(--crimson-2);--accent-3:var(--crimson-3);--accent-4:var(--crimson-4);--accent-5:var(--crimson-5);--accent-6:var(--crimson-6);--accent-7:var(--crimson-7);--accent-8:var(--crimson-8);--accent-9:var(--crimson-9);--accent-9-contrast:var(--crimson-9-contrast);--accent-10:var(--crimson-10);--accent-11:var(--crimson-11);--accent-12:var(--crimson-12);--accent-a1:var(--crimson-a1);--accent-a2:var(--crimson-a2);--accent-a3:var(--crimson-a3);--accent-a4:var(--crimson-a4);--accent-a5:var(--crimson-a5);--accent-a6:var(--crimson-a6);--accent-a7:var(--crimson-a7);--accent-a8:var(--crimson-a8);--accent-a9:var(--crimson-a9);--accent-a10:var(--crimson-a10);--accent-a11:var(--crimson-a11);--accent-a12:var(--crimson-a12)}[data-accent-color=pink]{--color-surface-accent:var(--pink-surface);--accent-1:var(--pink-1);--accent-2:var(--pink-2);--accent-3:var(--pink-3);--accent-4:var(--pink-4);--accent-5:var(--pink-5);--accent-6:var(--pink-6);--accent-7:var(--pink-7);--accent-8:var(--pink-8);--accent-9:var(--pink-9);--accent-9-contrast:var(--pink-9-contrast);--accent-10:var(--pink-10);--accent-11:var(--pink-11);--accent-12:var(--pink-12);--accent-a1:var(--pink-a1);--accent-a2:var(--pink-a2);--accent-a3:var(--pink-a3);--accent-a4:var(--pink-a4);--accent-a5:var(--pink-a5);--accent-a6:var(--pink-a6);--accent-a7:var(--pink-a7);--accent-a8:var(--pink-a8);--accent-a9:var(--pink-a9);--accent-a10:var(--pink-a10);--accent-a11:var(--pink-a11);--accent-a12:var(--pink-a12)}[data-accent-color=plum]{--color-surface-accent:var(--plum-surface);--accent-1:var(--plum-1);--accent-2:var(--plum-2);--accent-3:var(--plum-3);--accent-4:var(--plum-4);--accent-5:var(--plum-5);--accent-6:var(--plum-6);--accent-7:var(--plum-7);--accent-8:var(--plum-8);--accent-9:var(--plum-9);--accent-9-contrast:var(--plum-9-contrast);--accent-10:var(--plum-10);--accent-11:var(--plum-11);--accent-12:var(--plum-12);--accent-a1:var(--plum-a1);--accent-a2:var(--plum-a2);--accent-a3:var(--plum-a3);--accent-a4:var(--plum-a4);--accent-a5:var(--plum-a5);--accent-a6:var(--plum-a6);--accent-a7:var(--plum-a7);--accent-a8:var(--plum-a8);--accent-a9:var(--plum-a9);--accent-a10:var(--plum-a10);--accent-a11:var(--plum-a11);--accent-a12:var(--plum-a12)}[data-accent-color=purple]{--color-surface-accent:var(--purple-surface);--accent-1:var(--purple-1);--accent-2:var(--purple-2);--accent-3:var(--purple-3);--accent-4:var(--purple-4);--accent-5:var(--purple-5);--accent-6:var(--purple-6);--accent-7:var(--purple-7);--accent-8:var(--purple-8);--accent-9:var(--purple-9);--accent-9-contrast:var(--purple-9-contrast);--accent-10:var(--purple-10);--accent-11:var(--purple-11);--accent-12:var(--purple-12);--accent-a1:var(--purple-a1);--accent-a2:var(--purple-a2);--accent-a3:var(--purple-a3);--accent-a4:var(--purple-a4);--accent-a5:var(--purple-a5);--accent-a6:var(--purple-a6);--accent-a7:var(--purple-a7);--accent-a8:var(--purple-a8);--accent-a9:var(--purple-a9);--accent-a10:var(--purple-a10);--accent-a11:var(--purple-a11);--accent-a12:var(--purple-a12)}[data-accent-color=violet]{--color-surface-accent:var(--violet-surface);--accent-1:var(--violet-1);--accent-2:var(--violet-2);--accent-3:var(--violet-3);--accent-4:var(--violet-4);--accent-5:var(--violet-5);--accent-6:var(--violet-6);--accent-7:var(--violet-7);--accent-8:var(--violet-8);--accent-9:var(--violet-9);--accent-9-contrast:var(--violet-9-contrast);--accent-10:var(--violet-10);--accent-11:var(--violet-11);--accent-12:var(--violet-12);--accent-a1:var(--violet-a1);--accent-a2:var(--violet-a2);--accent-a3:var(--violet-a3);--accent-a4:var(--violet-a4);--accent-a5:var(--violet-a5);--accent-a6:var(--violet-a6);--accent-a7:var(--violet-a7);--accent-a8:var(--violet-a8);--accent-a9:var(--violet-a9);--accent-a10:var(--violet-a10);--accent-a11:var(--violet-a11);--accent-a12:var(--violet-a12)}[data-accent-color=iris]{--color-surface-accent:var(--iris-surface);--accent-1:var(--iris-1);--accent-2:var(--iris-2);--accent-3:var(--iris-3);--accent-4:var(--iris-4);--accent-5:var(--iris-5);--accent-6:var(--iris-6);--accent-7:var(--iris-7);--accent-8:var(--iris-8);--accent-9:var(--iris-9);--accent-9-contrast:var(--iris-9-contrast);--accent-10:var(--iris-10);--accent-11:var(--iris-11);--accent-12:var(--iris-12);--accent-a1:var(--iris-a1);--accent-a2:var(--iris-a2);--accent-a3:var(--iris-a3);--accent-a4:var(--iris-a4);--accent-a5:var(--iris-a5);--accent-a6:var(--iris-a6);--accent-a7:var(--iris-a7);--accent-a8:var(--iris-a8);--accent-a9:var(--iris-a9);--accent-a10:var(--iris-a10);--accent-a11:var(--iris-a11);--accent-a12:var(--iris-a12)}[data-accent-color=indigo]{--color-surface-accent:var(--indigo-surface);--accent-1:var(--indigo-1);--accent-2:var(--indigo-2);--accent-3:var(--indigo-3);--accent-4:var(--indigo-4);--accent-5:var(--indigo-5);--accent-6:var(--indigo-6);--accent-7:var(--indigo-7);--accent-8:var(--indigo-8);--accent-9:var(--indigo-9);--accent-9-contrast:var(--indigo-9-contrast);--accent-10:var(--indigo-10);--accent-11:var(--indigo-11);--accent-12:var(--indigo-12);--accent-a1:var(--indigo-a1);--accent-a2:var(--indigo-a2);--accent-a3:var(--indigo-a3);--accent-a4:var(--indigo-a4);--accent-a5:var(--indigo-a5);--accent-a6:var(--indigo-a6);--accent-a7:var(--indigo-a7);--accent-a8:var(--indigo-a8);--accent-a9:var(--indigo-a9);--accent-a10:var(--indigo-a10);--accent-a11:var(--indigo-a11);--accent-a12:var(--indigo-a12)}[data-accent-color=blue]{--color-surface-accent:var(--blue-surface);--accent-1:var(--blue-1);--accent-2:var(--blue-2);--accent-3:var(--blue-3);--accent-4:var(--blue-4);--accent-5:var(--blue-5);--accent-6:var(--blue-6);--accent-7:var(--blue-7);--accent-8:var(--blue-8);--accent-9:var(--blue-9);--accent-9-contrast:var(--blue-9-contrast);--accent-10:var(--blue-10);--accent-11:var(--blue-11);--accent-12:var(--blue-12);--accent-a1:var(--blue-a1);--accent-a2:var(--blue-a2);--accent-a3:var(--blue-a3);--accent-a4:var(--blue-a4);--accent-a5:var(--blue-a5);--accent-a6:var(--blue-a6);--accent-a7:var(--blue-a7);--accent-a8:var(--blue-a8);--accent-a9:var(--blue-a9);--accent-a10:var(--blue-a10);--accent-a11:var(--blue-a11);--accent-a12:var(--blue-a12)}[data-accent-color=cyan]{--color-surface-accent:var(--cyan-surface);--accent-1:var(--cyan-1);--accent-2:var(--cyan-2);--accent-3:var(--cyan-3);--accent-4:var(--cyan-4);--accent-5:var(--cyan-5);--accent-6:var(--cyan-6);--accent-7:var(--cyan-7);--accent-8:var(--cyan-8);--accent-9:var(--cyan-9);--accent-9-contrast:var(--cyan-9-contrast);--accent-10:var(--cyan-10);--accent-11:var(--cyan-11);--accent-12:var(--cyan-12);--accent-a1:var(--cyan-a1);--accent-a2:var(--cyan-a2);--accent-a3:var(--cyan-a3);--accent-a4:var(--cyan-a4);--accent-a5:var(--cyan-a5);--accent-a6:var(--cyan-a6);--accent-a7:var(--cyan-a7);--accent-a8:var(--cyan-a8);--accent-a9:var(--cyan-a9);--accent-a10:var(--cyan-a10);--accent-a11:var(--cyan-a11);--accent-a12:var(--cyan-a12)}[data-accent-color=teal]{--color-surface-accent:var(--teal-surface);--accent-1:var(--teal-1);--accent-2:var(--teal-2);--accent-3:var(--teal-3);--accent-4:var(--teal-4);--accent-5:var(--teal-5);--accent-6:var(--teal-6);--accent-7:var(--teal-7);--accent-8:var(--teal-8);--accent-9:var(--teal-9);--accent-9-contrast:var(--teal-9-contrast);--accent-10:var(--teal-10);--accent-11:var(--teal-11);--accent-12:var(--teal-12);--accent-a1:var(--teal-a1);--accent-a2:var(--teal-a2);--accent-a3:var(--teal-a3);--accent-a4:var(--teal-a4);--accent-a5:var(--teal-a5);--accent-a6:var(--teal-a6);--accent-a7:var(--teal-a7);--accent-a8:var(--teal-a8);--accent-a9:var(--teal-a9);--accent-a10:var(--teal-a10);--accent-a11:var(--teal-a11);--accent-a12:var(--teal-a12)}[data-accent-color=jade]{--color-surface-accent:var(--jade-surface);--accent-1:var(--jade-1);--accent-2:var(--jade-2);--accent-3:var(--jade-3);--accent-4:var(--jade-4);--accent-5:var(--jade-5);--accent-6:var(--jade-6);--accent-7:var(--jade-7);--accent-8:var(--jade-8);--accent-9:var(--jade-9);--accent-9-contrast:var(--jade-9-contrast);--accent-10:var(--jade-10);--accent-11:var(--jade-11);--accent-12:var(--jade-12);--accent-a1:var(--jade-a1);--accent-a2:var(--jade-a2);--accent-a3:var(--jade-a3);--accent-a4:var(--jade-a4);--accent-a5:var(--jade-a5);--accent-a6:var(--jade-a6);--accent-a7:var(--jade-a7);--accent-a8:var(--jade-a8);--accent-a9:var(--jade-a9);--accent-a10:var(--jade-a10);--accent-a11:var(--jade-a11);--accent-a12:var(--jade-a12)}[data-accent-color=green]{--color-surface-accent:var(--green-surface);--accent-1:var(--green-1);--accent-2:var(--green-2);--accent-3:var(--green-3);--accent-4:var(--green-4);--accent-5:var(--green-5);--accent-6:var(--green-6);--accent-7:var(--green-7);--accent-8:var(--green-8);--accent-9:var(--green-9);--accent-9-contrast:var(--green-9-contrast);--accent-10:var(--green-10);--accent-11:var(--green-11);--accent-12:var(--green-12);--accent-a1:var(--green-a1);--accent-a2:var(--green-a2);--accent-a3:var(--green-a3);--accent-a4:var(--green-a4);--accent-a5:var(--green-a5);--accent-a6:var(--green-a6);--accent-a7:var(--green-a7);--accent-a8:var(--green-a8);--accent-a9:var(--green-a9);--accent-a10:var(--green-a10);--accent-a11:var(--green-a11);--accent-a12:var(--green-a12)}[data-accent-color=grass]{--color-surface-accent:var(--grass-surface);--accent-1:var(--grass-1);--accent-2:var(--grass-2);--accent-3:var(--grass-3);--accent-4:var(--grass-4);--accent-5:var(--grass-5);--accent-6:var(--grass-6);--accent-7:var(--grass-7);--accent-8:var(--grass-8);--accent-9:var(--grass-9);--accent-9-contrast:var(--grass-9-contrast);--accent-10:var(--grass-10);--accent-11:var(--grass-11);--accent-12:var(--grass-12);--accent-a1:var(--grass-a1);--accent-a2:var(--grass-a2);--accent-a3:var(--grass-a3);--accent-a4:var(--grass-a4);--accent-a5:var(--grass-a5);--accent-a6:var(--grass-a6);--accent-a7:var(--grass-a7);--accent-a8:var(--grass-a8);--accent-a9:var(--grass-a9);--accent-a10:var(--grass-a10);--accent-a11:var(--grass-a11);--accent-a12:var(--grass-a12)}[data-accent-color=orange]{--color-surface-accent:var(--orange-surface);--accent-1:var(--orange-1);--accent-2:var(--orange-2);--accent-3:var(--orange-3);--accent-4:var(--orange-4);--accent-5:var(--orange-5);--accent-6:var(--orange-6);--accent-7:var(--orange-7);--accent-8:var(--orange-8);--accent-9:var(--orange-9);--accent-9-contrast:var(--orange-9-contrast);--accent-10:var(--orange-10);--accent-11:var(--orange-11);--accent-12:var(--orange-12);--accent-a1:var(--orange-a1);--accent-a2:var(--orange-a2);--accent-a3:var(--orange-a3);--accent-a4:var(--orange-a4);--accent-a5:var(--orange-a5);--accent-a6:var(--orange-a6);--accent-a7:var(--orange-a7);--accent-a8:var(--orange-a8);--accent-a9:var(--orange-a9);--accent-a10:var(--orange-a10);--accent-a11:var(--orange-a11);--accent-a12:var(--orange-a12)}[data-accent-color=brown]{--color-surface-accent:var(--brown-surface);--accent-1:var(--brown-1);--accent-2:var(--brown-2);--accent-3:var(--brown-3);--accent-4:var(--brown-4);--accent-5:var(--brown-5);--accent-6:var(--brown-6);--accent-7:var(--brown-7);--accent-8:var(--brown-8);--accent-9:var(--brown-9);--accent-9-contrast:var(--brown-9-contrast);--accent-10:var(--brown-10);--accent-11:var(--brown-11);--accent-12:var(--brown-12);--accent-a1:var(--brown-a1);--accent-a2:var(--brown-a2);--accent-a3:var(--brown-a3);--accent-a4:var(--brown-a4);--accent-a5:var(--brown-a5);--accent-a6:var(--brown-a6);--accent-a7:var(--brown-a7);--accent-a8:var(--brown-a8);--accent-a9:var(--brown-a9);--accent-a10:var(--brown-a10);--accent-a11:var(--brown-a11);--accent-a12:var(--brown-a12)}[data-accent-color=sky]{--color-surface-accent:var(--sky-surface);--accent-1:var(--sky-1);--accent-2:var(--sky-2);--accent-3:var(--sky-3);--accent-4:var(--sky-4);--accent-5:var(--sky-5);--accent-6:var(--sky-6);--accent-7:var(--sky-7);--accent-8:var(--sky-8);--accent-9:var(--sky-9);--accent-9-contrast:var(--sky-9-contrast);--accent-10:var(--sky-10);--accent-11:var(--sky-11);--accent-12:var(--sky-12);--accent-a1:var(--sky-a1);--accent-a2:var(--sky-a2);--accent-a3:var(--sky-a3);--accent-a4:var(--sky-a4);--accent-a5:var(--sky-a5);--accent-a6:var(--sky-a6);--accent-a7:var(--sky-a7);--accent-a8:var(--sky-a8);--accent-a9:var(--sky-a9);--accent-a10:var(--sky-a10);--accent-a11:var(--sky-a11);--accent-a12:var(--sky-a12)}[data-accent-color=mint]{--color-surface-accent:var(--mint-surface);--accent-1:var(--mint-1);--accent-2:var(--mint-2);--accent-3:var(--mint-3);--accent-4:var(--mint-4);--accent-5:var(--mint-5);--accent-6:var(--mint-6);--accent-7:var(--mint-7);--accent-8:var(--mint-8);--accent-9:var(--mint-9);--accent-9-contrast:var(--mint-9-contrast);--accent-10:var(--mint-10);--accent-11:var(--mint-11);--accent-12:var(--mint-12);--accent-a1:var(--mint-a1);--accent-a2:var(--mint-a2);--accent-a3:var(--mint-a3);--accent-a4:var(--mint-a4);--accent-a5:var(--mint-a5);--accent-a6:var(--mint-a6);--accent-a7:var(--mint-a7);--accent-a8:var(--mint-a8);--accent-a9:var(--mint-a9);--accent-a10:var(--mint-a10);--accent-a11:var(--mint-a11);--accent-a12:var(--mint-a12)}[data-accent-color=lime]{--color-surface-accent:var(--lime-surface);--accent-1:var(--lime-1);--accent-2:var(--lime-2);--accent-3:var(--lime-3);--accent-4:var(--lime-4);--accent-5:var(--lime-5);--accent-6:var(--lime-6);--accent-7:var(--lime-7);--accent-8:var(--lime-8);--accent-9:var(--lime-9);--accent-9-contrast:var(--lime-9-contrast);--accent-10:var(--lime-10);--accent-11:var(--lime-11);--accent-12:var(--lime-12);--accent-a1:var(--lime-a1);--accent-a2:var(--lime-a2);--accent-a3:var(--lime-a3);--accent-a4:var(--lime-a4);--accent-a5:var(--lime-a5);--accent-a6:var(--lime-a6);--accent-a7:var(--lime-a7);--accent-a8:var(--lime-a8);--accent-a9:var(--lime-a9);--accent-a10:var(--lime-a10);--accent-a11:var(--lime-a11);--accent-a12:var(--lime-a12)}[data-accent-color=yellow]{--color-surface-accent:var(--yellow-surface);--accent-1:var(--yellow-1);--accent-2:var(--yellow-2);--accent-3:var(--yellow-3);--accent-4:var(--yellow-4);--accent-5:var(--yellow-5);--accent-6:var(--yellow-6);--accent-7:var(--yellow-7);--accent-8:var(--yellow-8);--accent-9:var(--yellow-9);--accent-9-contrast:var(--yellow-9-contrast);--accent-10:var(--yellow-10);--accent-11:var(--yellow-11);--accent-12:var(--yellow-12);--accent-a1:var(--yellow-a1);--accent-a2:var(--yellow-a2);--accent-a3:var(--yellow-a3);--accent-a4:var(--yellow-a4);--accent-a5:var(--yellow-a5);--accent-a6:var(--yellow-a6);--accent-a7:var(--yellow-a7);--accent-a8:var(--yellow-a8);--accent-a9:var(--yellow-a9);--accent-a10:var(--yellow-a10);--accent-a11:var(--yellow-a11);--accent-a12:var(--yellow-a12)}[data-accent-color=amber]{--color-surface-accent:var(--amber-surface);--accent-1:var(--amber-1);--accent-2:var(--amber-2);--accent-3:var(--amber-3);--accent-4:var(--amber-4);--accent-5:var(--amber-5);--accent-6:var(--amber-6);--accent-7:var(--amber-7);--accent-8:var(--amber-8);--accent-9:var(--amber-9);--accent-9-contrast:var(--amber-9-contrast);--accent-10:var(--amber-10);--accent-11:var(--amber-11);--accent-12:var(--amber-12);--accent-a1:var(--amber-a1);--accent-a2:var(--amber-a2);--accent-a3:var(--amber-a3);--accent-a4:var(--amber-a4);--accent-a5:var(--amber-a5);--accent-a6:var(--amber-a6);--accent-a7:var(--amber-a7);--accent-a8:var(--amber-a8);--accent-a9:var(--amber-a9);--accent-a10:var(--amber-a10);--accent-a11:var(--amber-a11);--accent-a12:var(--amber-a12)}[data-accent-color=gold]{--color-surface-accent:var(--gold-surface);--accent-1:var(--gold-1);--accent-2:var(--gold-2);--accent-3:var(--gold-3);--accent-4:var(--gold-4);--accent-5:var(--gold-5);--accent-6:var(--gold-6);--accent-7:var(--gold-7);--accent-8:var(--gold-8);--accent-9:var(--gold-9);--accent-9-contrast:var(--gold-9-contrast);--accent-10:var(--gold-10);--accent-11:var(--gold-11);--accent-12:var(--gold-12);--accent-a1:var(--gold-a1);--accent-a2:var(--gold-a2);--accent-a3:var(--gold-a3);--accent-a4:var(--gold-a4);--accent-a5:var(--gold-a5);--accent-a6:var(--gold-a6);--accent-a7:var(--gold-a7);--accent-a8:var(--gold-a8);--accent-a9:var(--gold-a9);--accent-a10:var(--gold-a10);--accent-a11:var(--gold-a11);--accent-a12:var(--gold-a12)}[data-accent-color=bronze]{--color-surface-accent:var(--bronze-surface);--accent-1:var(--bronze-1);--accent-2:var(--bronze-2);--accent-3:var(--bronze-3);--accent-4:var(--bronze-4);--accent-5:var(--bronze-5);--accent-6:var(--bronze-6);--accent-7:var(--bronze-7);--accent-8:var(--bronze-8);--accent-9:var(--bronze-9);--accent-9-contrast:var(--bronze-9-contrast);--accent-10:var(--bronze-10);--accent-11:var(--bronze-11);--accent-12:var(--bronze-12);--accent-a1:var(--bronze-a1);--accent-a2:var(--bronze-a2);--accent-a3:var(--bronze-a3);--accent-a4:var(--bronze-a4);--accent-a5:var(--bronze-a5);--accent-a6:var(--bronze-a6);--accent-a7:var(--bronze-a7);--accent-a8:var(--bronze-a8);--accent-a9:var(--bronze-a9);--accent-a10:var(--bronze-a10);--accent-a11:var(--bronze-a11);--accent-a12:var(--bronze-a12)}[data-accent-color=gray]{--color-surface-accent:var(--gray-surface);--accent-1:var(--gray-1);--accent-2:var(--gray-2);--accent-3:var(--gray-3);--accent-4:var(--gray-4);--accent-5:var(--gray-5);--accent-6:var(--gray-6);--accent-7:var(--gray-7);--accent-8:var(--gray-8);--accent-9:var(--gray-9);--accent-9-contrast:var(--gray-9-contrast);--accent-10:var(--gray-10);--accent-11:var(--gray-11);--accent-12:var(--gray-12);--accent-a1:var(--gray-a1);--accent-a2:var(--gray-a2);--accent-a3:var(--gray-a3);--accent-a4:var(--gray-a4);--accent-a5:var(--gray-a5);--accent-a6:var(--gray-a6);--accent-a7:var(--gray-a7);--accent-a8:var(--gray-a8);--accent-a9:var(--gray-a9);--accent-a10:var(--gray-a10);--accent-a11:var(--gray-a11);--accent-a12:var(--gray-a12)}:root{--sy-f-sys:-apple-system,BlinkMacSystemFont,Segoe UI,Oxygen,Ubuntu,Droid Sans,Helvetica Neue;--sy-f-cjk:PingFang SC,Hiragino Sans GB,Droid Sans Fallback,Microsoft YaHei;--sy-f-heading:var(--sy-f-sys),var(--sy-f-cjk),sans-serif;--sy-f-text:var(--sy-f-sys),var(--sy-f-cjk),sans-serif;--sy-f-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--sy-s-banner-height:0rem;--sy-s-navbar-height:56px;--sy-s-offset-top:calc(var(--sy-s-navbar-height) + var(--sy-s-banner-height));--sy-c-divider:var(--gray-4);--sy-c-border:var(--gray-5);--sy-c-text:var(--gray-12);--sy-c-light:var(--gray-11);--sy-c-bold:var(--slate-12);--sy-c-heading:var(--sage-12);--sy-c-link:var(--accent-9);--sy-c-link-hover:var(--accent-a11);--sy-c-background:#fff;--sy-c-surface:var(--gray-a2);--sy-c-overlay:var(--black-a5);--sy-c-background-contrast:#000;--sy-c-foot-text:var(--sy-c-text);--sy-c-foot-background:var(--slate-2);--sy-c-foot-divider:var(--sy-c-divider);--sy-dropdown-shadow:0 12px 32px var(--gray-a6),0 2px 6px var(--gray-a4)}[data-accent-color=amber],[data-accent-color=lime],[data-accent-color=mint],[data-accent-color=sky],[data-accent-color=yellow]{--sy-c-link:var(--accent-a10)}html.light{color-scheme:light;--sy-c-background:#fff;--sy-c-background-contrast:#000}html.dark{color-scheme:dark;--sy-c-background:var(--slate-1);--sy-c-overlay:var(--white-a2);--sy-c-background-contrast:var(--white-a10);--sy-c-foot-background:var(--black-a11);--sy-c-foot-divider:var(--black-a12)}html{color:var(--sy-c-text);background-color:var(--sy-c-background)}:root{--lucide-alert-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Cpath d='m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3zM12 9v4m0 4h.01'/%3E%3C/svg%3E");--lucide-arrows-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Cpath d='m7 15 5 5 5-5M7 9l5-5 5 5'/%3E%3C/svg%3E");--lucide-award-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Ccircle cx='12' cy='8' r='6'/%3E%3Cpath d='M15.477 12.89 17 22l-5-3-5 3 1.523-9.11'/%3E%3C/svg%3E");--lucide-bell-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Cpath d='M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9m-4.27 13a2 2 0 0 1-3.46 0'/%3E%3C/svg%3E");--lucide-bookmark-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Cpath d='m19 21-7-4-7 4V5a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2v16z'/%3E%3C/svg%3E");--lucide-calendar-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Crect width='18' height='18' x='3' y='4' rx='2' ry='2'/%3E%3Cpath d='M16 2v4M8 2v4m-5 4h18'/%3E%3C/svg%3E");--lucide-check-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Cpath d='M20 6 9 17l-5-5'/%3E%3C/svg%3E");--lucide-chevron-down-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' class='lucide lucide-chevron-down'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");--lucide-chevron-left-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' class='lucide lucide-chevron-left'%3E%3Cpath d='m15 18-6-6 6-6'/%3E%3C/svg%3E");--lucide-chevron-right-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' class='lucide lucide-chevron-right'%3E%3Cpath d='m9 18 6-6-6-6'/%3E%3C/svg%3E");--lucide-chevron-up-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' class='lucide lucide-chevron-up'%3E%3Cpath d='m18 15-6-6-6 6'/%3E%3C/svg%3E");--lucide-close-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Cpath d='M18 6 6 18M6 6l12 12'/%3E%3C/svg%3E");--lucide-external-link-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Cpath d='M13 5h6v6m0-6L5 19'/%3E%3C/svg%3E");--lucide-flame-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Cpath d='M8.5 14.5A2.5 2.5 0 0 0 11 12c0-1.38-.5-2-1-3-1.072-2.143-.224-4.054 2-6 .5 2.5 2 4.9 4 6.5 2 1.6 3 3.5 3 5.5a7 7 0 1 1-14 0c0-1.153.433-2.294 1-3a2.5 2.5 0 0 0 2.5 2.5z'/%3E%3C/svg%3E");--lucide-git-fork-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Ccircle cx='12' cy='18' r='3'/%3E%3Ccircle cx='6' cy='6' r='3'/%3E%3Ccircle cx='18' cy='6' r='3'/%3E%3Cpath d='M18 9v1a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2V9m6 3v3'/%3E%3C/svg%3E");--lucide-help-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Ccircle cx='12' cy='12' r='10'/%3E%3Cpath d='M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3m.08 4h.01'/%3E%3C/svg%3E");--lucide-languages-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' class='lucide lucide-languages'%3E%3Cpath d='m5 8 6 6m-7 0 6-6 2-3M2 5h12M7 2h1m14 20-5-10-5 10m2-4h6'/%3E%3C/svg%3E");--lucide-laptop-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Crect width='18' height='12' x='3' y='4' rx='2' ry='2'/%3E%3Cpath d='M2 20h20'/%3E%3C/svg%3E");--lucide-link-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Cpath d='M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71'/%3E%3Cpath d='M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71'/%3E%3C/svg%3E");--lucide-menu-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' class='lucide lucide-menu'%3E%3Cpath d='M4 12h16M4 6h16M4 18h16'/%3E%3C/svg%3E");--lucide-milestone-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Cpath d='M18 6H5a2 2 0 0 0-2 2v3a2 2 0 0 0 2 2h13l4-3.5L18 6zm-6 7v8m0-18v3'/%3E%3C/svg%3E");--lucide-moon-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Cpath d='M12 3a6.364 6.364 0 0 0 9 9 9 9 0 1 1-9-9z'/%3E%3C/svg%3E");--lucide-outdent-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Cpath d='m7 8-4 4 4 4m14-4H11m10-6H11m10 12H11'/%3E%3C/svg%3E");--lucide-rocket-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Cpath d='M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09zM12 15l-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2z'/%3E%3Cpath d='M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0m1 7v5s3.03-.55 4-2c1.08-1.62 0-5 0-5'/%3E%3C/svg%3E");--lucide-skull-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Ccircle cx='9' cy='12' r='1'/%3E%3Ccircle cx='15' cy='12' r='1'/%3E%3Cpath d='M8 20v2h8v-2m-3.5-3-.5-1-.5 1h1z'/%3E%3Cpath d='M16 20a2 2 0 0 0 1.56-3.25 8 8 0 1 0-11.12 0A2 2 0 0 0 8 20'/%3E%3C/svg%3E");--lucide-star-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Cpath d='m12 2 3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z'/%3E%3C/svg%3E");--lucide-sun-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Ccircle cx='12' cy='12' r='4'/%3E%3Cpath d='M12 2v2m0 16v2M4.93 4.93l1.41 1.41m11.32 11.32 1.41 1.41M2 12h2m16 0h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41'/%3E%3C/svg%3E");--lucide-zap-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Cpath d='M13 2 3 14h9l-1 8 10-12h-9l1-8z'/%3E%3C/svg%3E")}.i-icon.alert,.i-lucide.alert{--icon-url:var(--lucide-alert-url)}.i-icon.arrows,.i-lucide.arrows{--icon-url:var(--lucide-arrows-url)}.i-icon.award,.i-lucide.award{--icon-url:var(--lucide-award-url)}.i-icon.bell,.i-lucide.bell{--icon-url:var(--lucide-bell-url)}.i-icon.bookmark,.i-lucide.bookmark{--icon-url:var(--lucide-bookmark-url)}.i-icon.calendar,.i-lucide.calendar{--icon-url:var(--lucide-calendar-url)}.i-icon.check,.i-lucide.check{--icon-url:var(--lucide-check-url)}.i-icon.chevron-down,.i-lucide.chevron-down{--icon-url:var(--lucide-chevron-down-url)}.i-icon.chevron-left,.i-lucide.chevron-left{--icon-url:var(--lucide-chevron-left-url)}.i-icon.chevron-right,.i-lucide.chevron-right{--icon-url:var(--lucide-chevron-right-url)}.i-icon.chevron-up,.i-lucide.chevron-up{--icon-url:var(--lucide-chevron-up-url)}.i-icon.close,.i-lucide.close{--icon-url:var(--lucide-close-url)}.i-icon.external-link,.i-lucide.external-link{--icon-url:var(--lucide-external-link-url)}.i-icon.flame,.i-lucide.flame{--icon-url:var(--lucide-flame-url)}.i-icon.git-fork,.i-lucide.git-fork{--icon-url:var(--lucide-git-fork-url)}.i-icon.help,.i-lucide.help{--icon-url:var(--lucide-help-url)}.i-icon.languages,.i-lucide.languages{--icon-url:var(--lucide-languages-url)}.i-icon.laptop,.i-lucide.laptop{--icon-url:var(--lucide-laptop-url)}.i-icon.link,.i-lucide.link{--icon-url:var(--lucide-link-url)}.i-icon.menu,.i-lucide.menu{--icon-url:var(--lucide-menu-url)}.i-icon.milestone,.i-lucide.milestone{--icon-url:var(--lucide-milestone-url)}.i-icon.moon,.i-lucide.moon{--icon-url:var(--lucide-moon-url)}.i-icon.outdent,.i-lucide.outdent{--icon-url:var(--lucide-outdent-url)}.i-icon.rocket,.i-lucide.rocket{--icon-url:var(--lucide-rocket-url)}.i-icon.skull,.i-lucide.skull{--icon-url:var(--lucide-skull-url)}.i-icon.star,.i-lucide.star{--icon-url:var(--lucide-star-url)}.i-icon.sun,.i-lucide.sun{--icon-url:var(--lucide-sun-url)}.i-icon.zap,.i-lucide.zap{--icon-url:var(--lucide-zap-url)}:root{--simpleicons-bitbucket-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M.778 1.213a.768.768 0 0 0-.768.892l3.263 19.81c.084.5.515.868 1.022.873H19.95a.772.772 0 0 0 .77-.646l3.27-20.03a.768.768 0 0 0-.768-.891zM14.52 15.53H9.522L8.17 8.466h7.561z'/%3E%3C/svg%3E");--simpleicons-discord-url:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0 12.64 12.64 0 0 0-.617-1.25.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057 19.9 19.9 0 0 0 5.993 3.03.078.078 0 0 0 .084-.028 14.09 14.09 0 0 0 1.226-1.994.076.076 0 0 0-.041-.106 13.107 13.107 0 0 1-1.872-.892.077.077 0 0 1-.008-.128 10.2 10.2 0 0 0 .372-.292.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127 12.299 12.299 0 0 1-1.873.892.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028 19.839 19.839 0 0 0 6.002-3.03.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.946 2.418-2.157 2.418z'/%3E%3C/svg%3E");--simpleicons-git-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M23.546 10.93 13.067.452a1.55 1.55 0 0 0-2.188 0L8.708 2.627l2.76 2.76a1.838 1.838 0 0 1 2.327 2.341l2.658 2.66a1.838 1.838 0 0 1 1.9 3.039 1.837 1.837 0 0 1-2.6 0 1.846 1.846 0 0 1-.404-1.996L12.86 8.955v6.525c.176.086.342.203.488.348a1.848 1.848 0 0 1 0 2.6 1.844 1.844 0 0 1-2.609 0 1.834 1.834 0 0 1 0-2.598c.182-.18.387-.316.605-.406V8.835a1.834 1.834 0 0 1-.996-2.41L7.636 3.7.45 10.881c-.6.605-.6 1.584 0 2.189l10.48 10.477a1.545 1.545 0 0 0 2.186 0l10.43-10.43a1.544 1.544 0 0 0 0-2.187'/%3E%3C/svg%3E");--simpleicons-github-url:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E");--simpleicons-gitlab-url:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='m23.6 9.593-.033-.086L20.3.98a.851.851 0 0 0-.336-.405.875.875 0 0 0-1 .054.875.875 0 0 0-.29.44L16.47 7.818H7.537L5.332 1.07a.857.857 0 0 0-.29-.441.875.875 0 0 0-1-.054.859.859 0 0 0-.336.405L.433 9.502l-.032.086a6.066 6.066 0 0 0 2.012 7.01l.01.009.03.021 4.977 3.727 2.462 1.863 1.5 1.132a1.008 1.008 0 0 0 1.22 0l1.499-1.132 2.461-1.863 5.006-3.75.013-.01a6.068 6.068 0 0 0 2.01-7.002z'/%3E%3C/svg%3E");--simpleicons-linkedin-url:url("data:image/svg+xml;utf8,%3Csvg role='img' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Ctitle%3ELinkedIn%3C/title%3E%3Cpath d='M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z'/%3E%3C/svg%3E");--simpleicons-mastodon-url:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M23.268 5.313c-.35-2.578-2.617-4.61-5.304-5.004C17.51.242 15.792 0 11.813 0h-.03c-3.98 0-4.835.242-5.288.309C3.882.692 1.496 2.518.917 5.127.64 6.412.61 7.837.661 9.143c.074 1.874.088 3.745.26 5.611.118 1.24.325 2.47.62 3.68.55 2.237 2.777 4.098 4.96 4.857 2.336.792 4.849.923 7.256.38.265-.061.527-.132.786-.213.585-.184 1.27-.39 1.774-.753a.057.057 0 0 0 .023-.043v-1.809a.052.052 0 0 0-.02-.041.053.053 0 0 0-.046-.01 20.282 20.282 0 0 1-4.709.545c-2.73 0-3.463-1.284-3.674-1.818a5.593 5.593 0 0 1-.319-1.433.053.053 0 0 1 .066-.054c1.517.363 3.072.546 4.632.546.376 0 .75 0 1.125-.01 1.57-.044 3.224-.124 4.768-.422.038-.008.077-.015.11-.024 2.435-.464 4.753-1.92 4.989-5.604.008-.145.03-1.52.03-1.67.002-.512.167-3.63-.024-5.545zm-3.748 9.195h-2.561V8.29c0-1.309-.55-1.976-1.67-1.976-1.23 0-1.846.79-1.846 2.35v3.403h-2.546V8.663c0-1.56-.617-2.35-1.848-2.35-1.112 0-1.668.668-1.67 1.977v6.218H4.822V8.102c0-1.31.337-2.35 1.011-3.12.696-.77 1.608-1.164 2.74-1.164 1.311 0 2.302.5 2.962 1.498l.638 1.06.638-1.06c.66-.999 1.65-1.498 2.96-1.498 1.13 0 2.043.395 2.74 1.164.675.77 1.012 1.81 1.012 3.12z'/%3E%3C/svg%3E");--simpleicons-readthedocs-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M7.732 0a59.316 59.316 0 0 0-4.977.218V24a62.933 62.933 0 0 1 3.619-.687c.17-.028.34-.053.509-.078.215-.033.43-.066.644-.096l.205-.03zm1.18.003V22.96a61.042 61.042 0 0 1 12.333-.213V1.485A60.859 60.859 0 0 0 8.912.003zm1.707 1.81a.59.59 0 0 1 .015 0c3.06.088 6.125.404 9.167.95a.59.59 0 0 1 .476.686.59.59 0 0 1-.569.484.59.59 0 0 1-.116-.009 60.622 60.622 0 0 0-8.992-.931.59.59 0 0 1-.573-.607.59.59 0 0 1 .592-.572zm-4.212.028a.59.59 0 0 1 .578.565.59.59 0 0 1-.564.614 59.74 59.74 0 0 0-2.355.144.59.59 0 0 1-.04.002.59.59 0 0 1-.595-.542.59.59 0 0 1 .54-.635c.8-.065 1.6-.114 2.401-.148a.59.59 0 0 1 .035 0zm4.202 2.834a.59.59 0 0 1 .015 0 61.6 61.6 0 0 1 9.167.8.59.59 0 0 1 .488.677.59.59 0 0 1-.602.494.59.59 0 0 1-.076-.006 60.376 60.376 0 0 0-8.99-.786.59.59 0 0 1-.584-.596.59.59 0 0 1 .582-.583zm-4.211.097a.59.59 0 0 1 .587.555.59.59 0 0 1-.554.622c-.786.046-1.572.107-2.356.184a.59.59 0 0 1-.04.003.59.59 0 0 1-.603-.533.59.59 0 0 1 .53-.644c.8-.078 1.599-.14 2.4-.187a.59.59 0 0 1 .036 0zM10.6 7.535a.59.59 0 0 1 .015 0c3.06-.013 6.125.204 9.167.65a.59.59 0 0 1 .498.67.59.59 0 0 1-.593.504.59.59 0 0 1-.076-.006 60.142 60.142 0 0 0-8.992-.638.59.59 0 0 1-.592-.588.59.59 0 0 1 .573-.592zm1.153 2.846a61.093 61.093 0 0 1 8.02.515.59.59 0 0 1 .509.66.59.59 0 0 1-.586.514.59.59 0 0 1-.076-.005 59.982 59.982 0 0 0-8.99-.492.59.59 0 0 1-.603-.577.59.59 0 0 1 .578-.603c.382-.008.765-.012 1.148-.012zm1.139 2.832a60.92 60.92 0 0 1 6.871.394.59.59 0 0 1 .52.652.59.59 0 0 1-.577.523.59.59 0 0 1-.076-.004 59.936 59.936 0 0 0-8.991-.344.59.59 0 0 1-.61-.568.59.59 0 0 1 .567-.611c.765-.028 1.53-.042 2.296-.042z'/%3E%3C/svg%3E");--simpleicons-reddit-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 0C5.373 0 0 5.373 0 12c0 3.314 1.343 6.314 3.515 8.485l-2.286 2.286A.72.72 0 0 0 1.738 24H12c6.627 0 12-5.373 12-12S18.627 0 12 0Zm4.388 3.199a1.999 1.999 0 1 1-1.947 2.46v.002a2.368 2.368 0 0 0-2.032 2.341v.007c1.776.067 3.4.567 4.686 1.363a2.802 2.802 0 1 1 2.908 4.753c-.088 3.256-3.637 5.876-7.997 5.876-4.361 0-7.905-2.617-7.998-5.87a2.8 2.8 0 0 1 1.189-5.34c.645 0 1.239.218 1.712.585 1.275-.79 2.881-1.291 4.64-1.365v-.01a3.229 3.229 0 0 1 2.88-3.207 2 2 0 0 1 1.959-1.595Zm-8.085 8.376c-.784 0-1.459.78-1.506 1.797-.047 1.016.64 1.429 1.426 1.429.786 0 1.371-.369 1.418-1.385.047-1.017-.553-1.841-1.338-1.841Zm7.406 0c-.786 0-1.385.824-1.338 1.841.047 1.017.634 1.385 1.418 1.385.785 0 1.473-.413 1.426-1.429-.046-1.017-.721-1.797-1.506-1.797Zm-3.703 4.013c-.974 0-1.907.048-2.77.135a.222.222 0 0 0-.183.305 3.199 3.199 0 0 0 2.953 1.964 3.2 3.2 0 0 0 2.953-1.964.222.222 0 0 0-.184-.305 27.75 27.75 0 0 0-2.769-.135Z'/%3E%3C/svg%3E");--simpleicons-slack-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M5.042 15.165a2.528 2.528 0 0 1-2.52 2.523A2.528 2.528 0 0 1 0 15.165a2.527 2.527 0 0 1 2.522-2.52h2.52v2.52zm1.271 0a2.527 2.527 0 0 1 2.521-2.52 2.527 2.527 0 0 1 2.521 2.52v6.313A2.528 2.528 0 0 1 8.834 24a2.528 2.528 0 0 1-2.521-2.522v-6.313zM8.834 5.042a2.528 2.528 0 0 1-2.521-2.52A2.528 2.528 0 0 1 8.834 0a2.528 2.528 0 0 1 2.521 2.522v2.52H8.834zm0 1.271a2.528 2.528 0 0 1 2.521 2.521 2.528 2.528 0 0 1-2.521 2.521H2.522A2.528 2.528 0 0 1 0 8.834a2.528 2.528 0 0 1 2.522-2.521h6.312zm10.122 2.521a2.528 2.528 0 0 1 2.522-2.521A2.528 2.528 0 0 1 24 8.834a2.528 2.528 0 0 1-2.522 2.521h-2.522V8.834zm-1.268 0a2.528 2.528 0 0 1-2.523 2.521 2.527 2.527 0 0 1-2.52-2.521V2.522A2.527 2.527 0 0 1 15.165 0a2.528 2.528 0 0 1 2.523 2.522v6.312zm-2.523 10.122a2.528 2.528 0 0 1 2.523 2.522A2.528 2.528 0 0 1 15.165 24a2.527 2.527 0 0 1-2.52-2.522v-2.522h2.52zm0-1.268a2.527 2.527 0 0 1-2.52-2.523 2.526 2.526 0 0 1 2.52-2.52h6.313A2.527 2.527 0 0 1 24 15.165a2.528 2.528 0 0 1-2.522 2.523h-6.313z'/%3E%3C/svg%3E");--simpleicons-x-twitter-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M18.901 1.153h3.68l-8.04 9.19L24 22.846h-7.406l-5.8-7.584-6.638 7.584H.474l8.6-9.83L0 1.154h7.594l5.243 6.932ZM17.61 20.644h2.039L6.486 3.24H4.298Z'/%3E%3C/svg%3E");--simpleicons-youtube-url:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M23.498 6.186a3.016 3.016 0 0 0-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 0 0 .502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 0 0 2.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 0 0 2.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z'/%3E%3C/svg%3E")}.i-icon.bitbucket,.i-simpleicons.bitbucket{--icon-url:var(--simpleicons-bitbucket-url)}.i-icon.discord,.i-simpleicons.discord{--icon-url:var(--simpleicons-discord-url)}.i-icon.git,.i-simpleicons.git{--icon-url:var(--simpleicons-git-url)}.i-icon.github,.i-simpleicons.github{--icon-url:var(--simpleicons-github-url)}.i-icon.gitlab,.i-simpleicons.gitlab{--icon-url:var(--simpleicons-gitlab-url)}.i-icon.linkedin,.i-simpleicons.linkedin{--icon-url:var(--simpleicons-linkedin-url)}.i-icon.mastodon,.i-simpleicons.mastodon{--icon-url:var(--simpleicons-mastodon-url)}.i-icon.readthedocs,.i-simpleicons.readthedocs{--icon-url:var(--simpleicons-readthedocs-url)}.i-icon.reddit,.i-simpleicons.reddit{--icon-url:var(--simpleicons-reddit-url)}.i-icon.slack,.i-simpleicons.slack{--icon-url:var(--simpleicons-slack-url)}.i-icon.x-twitter,.i-simpleicons.x-twitter{--icon-url:var(--simpleicons-x-twitter-url)}.i-icon.youtube,.i-simpleicons.youtube{--icon-url:var(--simpleicons-youtube-url)}.hamburger{position:relative;display:inline-block;width:16px;height:14px;overflow:hidden;cursor:pointer}.hamburger>span{position:absolute;width:16px;height:2px;left:0;background-color:var(--sy-c-text);transition:top .25s,transform .25s}.hamburger_1{top:0}.hamburger_2{top:6px}.hamburger_3{top:12px}button[aria-expanded=true] .hamburger .hamburger_1{top:6px;transform:translate(0) rotate(225deg)}button[aria-expanded=true] .hamburger .hamburger_2{top:6px;transform:translate(18px)}button[aria-expanded=true] .hamburger .hamburger_3{top:6px;transform:translate(0) rotate(135deg)}.searchbox{position:relative}.searchbox input{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:100%;padding:6px 12px;font-size:.92rem;font-family:var(--sy-f-text);border-radius:6px;outline:0;background:var(--sy-c-surface)}.searchbox button,.searchbox kbd{position:absolute;font-size:.68rem;font-weight:600;font-family:var(--sy-f-mono);padding:2px 6px;margin:6px;right:0;border-radius:3px;border:1px solid var(--sy-c-border);background-color:var(--sy-c-background);opacity:1;transition:opacity .2s ease}.searchbox input:focus+kbd{opacity:0}.searchform{display:flex;position:relative;align-items:center}.searchform input[name=q]{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:100%;padding:6px 12px;font-size:.92rem;font-family:var(--sy-f-text);border-radius:6px;outline:0;background:var(--sy-c-surface)}.searchform input[name=q]+button{position:absolute;font-size:.68rem;font-weight:600;font-family:var(--sy-f-text);padding:2px 6px;margin:6px;right:0;border-radius:3px;border:1px solid var(--sy-c-divider);background-color:var(--sy-c-background);opacity:1;transition:opacity .2s ease}.search .highlighted{background-color:var(--accent-a4)}#search-results{border-top:1px solid var(--sy-c-border)}#search-results h2{margin-top:2rem;margin-bottom:.725rem}#search-results .search-summary{font-weight:500;color:var(--sy-c-light)}#search-results ul.search{list-style-type:none;margin-left:0;padding-left:0;padding-top:.625rem;padding-bottom:2rem}#search-results ul.search>li{padding-left:0}#search-results ul.search>li+li{padding-top:1rem;border-top:1px solid var(--sy-c-divider)}#search-results ul.search li>a{font-weight:600}#search-results ul.search p.context{margin-top:.5rem;font-size:.875rem}.demo{border:1px solid var(--sy-c-border);border-radius:6px}.demo-code .highlight>pre{border-bottom-left-radius:0;border-bottom-right-radius:0}.demo-result{padding:1rem}.container.image-1{border:.5rem solid var(--accent-a3);border-radius:6px}.container.image-1>img{border-radius:4px;margin:0}.container.image-2{border:1px solid var(--sy-c-border);padding:1rem;border-radius:6px}.container.image-2>img{margin:0}.container.buttons{margin:2rem 0 4.2rem}.container.buttons>p{display:flex;gap:1rem}.container.buttons a{display:inline-block;padding:0 2rem;line-height:2.6rem;border-radius:2.6rem;border:2px solid var(--sy-c-border);font-weight:600;background-color:var(--sy-c-surface);transition:all .2s ease}.container.buttons a:first-child{color:var(--accent-9-contrast);background-color:var(--accent-9);border-color:var(--accent-9)}.container.buttons a:hover{color:var(--sy-c-bold);border-color:var(--accent-9);background-color:var(--sy-c-background)}#ethical-ad-placement .ethical-sidebar{position:relative;background-color:var(--sy-c-surface);border:none;padding:.8rem}#ethical-ad-placement .ethical-text a{color:var(--sy-c-text)!important}#ethical-ad-placement .ethical-text a:hover{color:var(--sy-c-link-hover)!important}.sy-main #ethical-ad-placement .ethical-sidebar{margin-left:0;max-width:380px}.sy-main #ethical-ad-placement .ethical-image-link{flex-shrink:0;margin-right:.4rem}.sy-main #ethical-ad-placement .ethical-content{display:flex}.sy-main #ethical-ad-placement .ethical-text{margin-top:0}.sy-main #ethical-ad-placement .ethical-callout{position:absolute;right:.4rem;bottom:.4rem}#carbonads{margin:1rem 0;position:relative;display:block;background-color:var(--sy-c-surface);border:none;border-radius:8px;padding:.8rem .8rem 1.6rem}#carbonads a{border:0;font-weight:400}#carbonads img{margin:0}.carbon-wrap{display:flex;align-items:center;justify-content:space-between;flex-direction:column}.carbon-text{display:block;margin:.5rem 0;line-height:1.42;font-size:.78rem;text-align:center}.carbon-text:hover{color:var(--sy-c-link-hover)}.carbon-poweredby{position:absolute;opacity:.68;right:.8rem;bottom:.5rem;font-size:.68rem;text-transform:uppercase}.carbon-poweredby:hover{text-decoration:underline}.sy-main #carbonads{max-width:380px;padding:1rem;margin-top:1.6rem}.sy-main .carbon-wrap{flex-direction:row;align-items:flex-start}.sy-main .carbon-text{text-align:left;margin-top:0;margin-left:1rem;font-size:.86rem}.bsa-bar{justify-content:space-between;padding:15px 20px;border-radius:10px;box-shadow:inset 0 0 2px #00000026;text-decoration:none}.bsa-bar,.bsa-main{display:flex;flex-flow:row nowrap;align-items:center}.bsa-main{flex-grow:1;justify-content:center;margin:0 auto}.bsa-img{max-height:40px;margin-right:20px;line-height:0}.bsa-details{display:flex;flex-flow:column nowrap;margin-right:20px}.bsa-tagline{margin-bottom:3px;font-weight:600;font-size:9px;line-height:1;letter-spacing:1.5px;text-transform:uppercase}.bsa-desc{max-width:600px;font-weight:400;font-size:12px;line-height:1.4;letter-spacing:1px}.bsa-cta{padding:10px 16px;transform:translateY(-1px);border-radius:3px;font-weight:600;font-size:10px;line-height:1;letter-spacing:1px;text-transform:uppercase;white-space:nowrap;transition:all .3s ease-in-out}@media (max-width:940px){.bsa-details{font-size:14px;margin-right:0}.bsa-cta{display:none}}@media (min-width:768px) and (max-width:820px){.bsa-img{display:none}}@media (max-width:480px){.bsa-img{display:none}}.repo-stats{margin-bottom:1rem;padding:.5rem;border:1px solid var(--sy-c-divider);border-radius:6px}.repo-stats:hover{background-color:var(--sy-c-surface)}.repo-stats-count{color:var(--sy-c-light)}.repo-stats strong{font-weight:500;font-family:var(--sy-f-mono);color:inherit}.edit-this-page{border-top:1px solid var(--sy-c-divider);margin:1rem 0;padding:.5rem 0;font-size:.8rem;font-weight:600}.repo-stats+.edit-this-page{border-top:0;margin-top:0;padding-top:0}.edit-this-page a{color:var(--sy-c-text)}.edit-this-page a:hover{color:var(--sy-c-link-hover)}.edit-this-page a:after{content:" →"}.back-to-top{display:none;align-items:center;gap:.25rem;position:fixed;z-index:10;bottom:68px;left:50%;transform:translateX(-50%);background:var(--sy-c-background);border-radius:2rem;box-shadow:0 .2rem .5rem #0000000d,0 0 1px 0 #6b728080;font-size:.8rem;padding:.4rem .8rem .4rem .6rem}.dark .back-to-top{background:var(--slate-2);box-shadow:0 .2rem .5rem #ffffff0d,0 0 1px 0 #9aa4b880}.back-to-top:hover{color:var(--accent-9-contrast);background:var(--accent-9)}.back-to-top svg{height:1rem;width:1rem;fill:currentColor;display:inline-block}.back-to-top[data-visible=true]{display:flex}.icon-link,.icon-link span{display:inline-block}.icon-link span{vertical-align:middle}.icon-link .icon{padding:.1rem;border-radius:6px;border:1px solid var(--sy-c-border);margin-right:.4rem;opacity:.8}.icon-link svg{width:1.5rem;height:1.5rem}.icon-link:hover .icon{opacity:1}.announcement{position:sticky;top:0;left:0;width:100%;padding:.8rem 2rem;display:flex;align-items:center;color:var(--sy-c-banner,var(--accent-9-contrast));background-color:var(--sy-c-banner-bg,var(--accent-a11));z-index:20}.announcement a{text-decoration:underline}.announcement ::-moz-selection{color:var(--sy-c-banner,var(--accent-9-contrast))}.announcement ::selection{color:var(--sy-c-banner,var(--accent-9-contrast))}.announcement-inner{width:100%}.announcement-close{position:absolute;top:.8rem;right:1rem}.sy-head{position:sticky;top:var(--sy-s-banner-height);height:var(--sy-s-navbar-height);background-color:initial;z-index:20}.sy-head-blur{position:absolute;top:0;left:0;width:100%;height:100%;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);background-color:var(--sand-a1);box-shadow:0 0 var(--sy-c-background-contrast),0 2px 4px var(--gray-a1),0 1px 0 var(--sy-c-divider);z-index:-1}.sy-head-inner{display:flex;padding-left:max(env(safe-area-inset-right),1.5rem);padding-right:max(env(safe-area-inset-right),1rem);justify-content:space-between;align-items:center;height:var(--sy-s-navbar-height)}.sy-head-brand img{height:28px}.sy-head-brand .dark-logo,.sy-head-brand img+strong{display:none}.dark .sy-head-brand .dark-logo{display:inline}.dark .sy-head-brand .light-logo{display:none}.light .sy-head-brand .light-logo{display:inline}.light .sy-head-brand .dark-logo{display:none}.sy-head-links a,.sy-head-links button{padding:.5rem;font-size:.95rem;font-weight:500;white-space:nowrap}.sy-head-links .link i.external-link{font-size:68%;opacity:.6;color:var(--sy-c-light);margin-left:2px}.sy-head-links .link>ul a{display:block;white-space:normal}.sy-head-links .link>ul a:hover{background:var(--sy-c-surface);border-radius:6px}.sy-head-links .link>ul small{display:block;color:var(--sy-c-light);font-weight:400}.sy-head-socials,.sy-head-socials a{display:flex;align-items:center}.sy-head-socials a{padding:.5rem}.sy-head-actions button{height:var(--sy-s-navbar-height);padding:0 .5rem}@media (max-width:767px){body[data-expanded-headnav=true]{overflow:hidden}.sy-head-nav{display:none;position:fixed;top:var(--sy-s-offset-top);bottom:0;left:0;right:0;padding:4rem 1.8rem 0;width:100%;box-sizing:border-box;border-top:1px solid var(--sy-c-divider);background-color:var(--sy-c-background);overflow-y:auto}.sy-head-nav._expanded{display:block}.sy-head-links{margin-left:auto;margin-right:auto}.sy-head-links .link{margin:.5rem 0}.sy-head-links .link i.chevron{display:none}.sy-head-links .link>ul{margin:.5rem 0 .5rem 1rem}.sy-head-extra form.searchbox{position:absolute;top:1rem;left:1.8rem;right:1.8rem}.sy-head-extra{flex-direction:column;padding:2rem 0 1rem;width:100%}}@media (min-width:768px){.sy-head-inner{padding-right:max(env(safe-area-inset-right),1.5rem)}.sy-head-nav{display:flex;flex-grow:1;align-items:center;justify-content:space-between}.sy-head-links[data-align=right]{--head-links-justify-content:flex-end}.sy-head-links[data-align=center]{--head-links-justify-content:center}.sy-head-links{display:flex;flex-grow:1;white-space:nowrap;overflow:auto;padding:0 1rem;justify-content:var(--head-links-justify-content,flex-start)}.sy-head-links .link{display:inline-flex;align-items:center;height:var(--sy-s-navbar-height)}.sy-head-links a:hover{color:var(--sy-c-link-hover)}.sy-head-links .link:hover>a{background-color:var(--sy-c-surface);border-radius:6px}.sy-head-links .link i.chevron-down{color:var(--sy-c-light)}.sy-head-links .link>ul{position:absolute;height:0;visibility:hidden;background-color:var(--sy-c-background);top:var(--sy-s-navbar-height);margin-top:-10px;padding:15px;border-radius:6px;border:1px solid var(--sy-c-divider);box-shadow:var(--sy-dropdown-shadow);z-index:9;max-width:320px}.sy-head-links .link:hover>ul{height:auto;visibility:visible}.sy-head-links .link>ul>li{padding:.2rem 0}.sy-head-socials{margin-left:.5rem}}.sy-foot{border-top:1px solid var(--sy-c-foot-divider);padding-top:1.5rem;padding-bottom:1rem;color:var(--sy-c-foot-text);background-color:var(--sy-c-foot-background)}.sy-foot-inner{padding-left:max(env(safe-area-inset-right),1.5rem);padding-right:max(env(safe-area-inset-right),1.5rem)}.sy-foot-copyright{font-size:.84rem}.sy-foot-copyright a{font-weight:500}.sy-foot-copyright a:hover{text-decoration:underline}.sy-foot-socials a{font-size:1.4rem;color:var(--sy-c-foot-text)}.sy-foot-socials a+a{margin-left:.5rem}.sy-foot-socials a svg{display:inline-block;width:1.4rem;height:1.4rem}.sy-lside .sidebar-links{margin-bottom:2rem}@media (min-width:768px){.sy-lside .sy-lside-inner{top:var(--sy-s-offset-top)}.sy-lside .sy-scrollbar{height:calc(100vh - var(--sy-s-offset-top));overflow-x:hidden}}.yue *{scroll-margin-top:calc(var(--sy-s-offset-top) + 68px)}.sy-content{max-width:64rem;min-height:calc(100vh - var(--sy-s-offset-top) - 80px)}@media (max-width:767px){#lside{position:fixed;z-index:18;top:var(--sy-s-offset-top);left:0;bottom:0;width:300px;max-width:100%;height:calc(100vh - var(---sy-s-offset-top));overflow:auto;background:var(--sy-c-background);transform:translateX(-100%);transition:transform .2s ease}#lside._expanded{transform:translateX(0)}.lside-overlay{position:fixed;top:var(--sy-s-offset-top);left:0;width:0;height:0;background-color:var(--sy-c-overlay);opacity:0;transition:width 0 .25s,height 0 .25s,opacity .25s}#lside._expanded+.lside-overlay{width:100%;height:100%;opacity:1;z-index:16}}@media (max-width:1279px){.sy-rside{position:fixed;z-index:25;top:0;right:0;bottom:0;width:20rem;max-width:100%;padding-top:2rem;padding-bottom:1rem;overflow:auto;background:var(--sy-c-background);transform:translateX(110%);transition:transform .2s ease;box-shadow:0 0 var(--sy-c-background-contrast),-12px 0 16px var(--gray-a1)}#rside._expanded{transform:translateX(0)}.rside-close{position:absolute;top:16px;right:16px;width:2rem;height:2rem;display:flex;align-items:center;justify-content:center;font-size:1.4rem}.rside-overlay{position:fixed;top:0;left:0;width:0;height:0;background-color:var(--sy-c-overlay);opacity:0;transition:width 0 .25s,height 0 .25s,opacity .25s}#rside._expanded+.rside-overlay{width:100%;height:100%;opacity:1;z-index:22}}@media (min-width:768px){.sy-main{width:calc(100% - 18rem);max-width:52rem}}@media (min-width:1280px){.sy-main{width:calc(100% - 34rem);max-width:none}.sy-rside .sy-scrollbar{max-height:calc(100vh - var(--sy-s-offset-top) - env(safe-area-inset-bottom))}.yue *{scroll-margin-top:calc(var(--sy-s-offset-top) + 24px)}}.nav-languages button,.nav-versions button{cursor:pointer;padding:0;margin:0;background:#0000;border:0;white-space:nowrap}.nav-versions .chevron-down{color:var(--sy-c-light)}@media (max-width:767px){.nav-languages,.nav-versions{width:100%;background-color:var(--sy-c-surface);border-radius:6px;padding-bottom:.6rem;margin-bottom:1rem}.nav-languages button,.nav-versions button{padding:.5rem 1rem;font-weight:500;font-size:.76rem;color:var(--sy-c-light)}.nav-languages button>i,.nav-versions button>i{display:none}.nav-versions ul{padding:0 .6rem}.nav-versions li{padding:.2rem .4rem;display:inline-block}.nav-languages li{font-size:.94rem;padding:.32rem 1rem}}@media (min-width:768px){.nav-languages,.nav-versions{display:flex;align-items:center;position:relative;width:auto;height:var(--sy-s-navbar-height);background:#0000;color:var(--sy-c-text)}.nav-languages button,.nav-versions button{padding:0 .5rem;border-right:1px solid var(--gray-3)}.nav-languages-choices,.nav-versions-choices{position:absolute;visibility:hidden;top:3rem;right:-.6rem;min-width:120px;max-height:60vh;box-sizing:border-box;background-color:var(--sy-c-background);border-radius:6px;overflow-x:hidden;overflow-y:auto;padding:.8rem 1rem;box-shadow:var(--sy-dropdown-shadow)}.nav-languages:hover .nav-languages-choices,.nav-versions:hover .nav-versions-choices{visibility:visible}.nav-languages li,.nav-versions li{padding:.1rem 0}.nav-languages a,.nav-versions a{display:block;padding:.2rem .6rem;color:var(--sy-c-text);white-space:nowrap}.nav-languages a:hover,.nav-versions a:hover{color:var(--sy-c-link-hover);background:var(--sy-c-surface);border-radius:6px}}.sy-breadcrumbs{position:sticky;top:var(--sy-s-offset-top);background-color:var(--sy-c-background);padding:0 1.5rem;z-index:5}.sy-breadcrumbs-inner{padding:.8rem 0;border-bottom:1px solid var(--sy-c-divider)}.sy-breadcrumbs ol{display:flex;font-size:.94rem;white-space:nowrap;overflow:auto}.sy-breadcrumbs button{display:flex;align-items:center}.sy-breadcrumbs ol a{color:var(--sy-c-light)}.sy-breadcrumbs ol a:hover{color:var(--sy-c-bold)}.sy-breadcrumbs ol a+span{padding:0 .4rem;font-weight:300;color:var(--sy-c-light)}@media (min-width:1280px){.sy-breadcrumbs{display:none}}@media (min-width:768px){.sy-breadcrumbs-inner{padding:1.5rem 0 1rem}}.globaltoc{padding-bottom:20px}.globaltoc .caption{font-size:.86rem;font-weight:500;font-family:var(--sy-f-heading);color:var(--sy-c-light);text-transform:uppercase;letter-spacing:.4px;padding:.8rem 0 .4rem;border-top:1px solid var(--sy-c-divider)}.globaltoc>p.caption:first-of-type{padding-top:0;border-top:none}.globaltoc .caption+ul{margin-bottom:1.5rem}.globaltoc ul+.caption{margin-top:2.5rem}.globaltoc li{margin:.6rem 0}.globaltoc li>ul{margin-left:.6rem;font-size:.96rem}.globaltoc li.toctree-l1>ul{margin-left:.2rem;border-left:1px solid var(--gray-3)}.globaltoc li.toctree-l2{padding-left:.9rem;margin-left:-1px;border-left:1px solid #0000}.globaltoc li.toctree-l2.current{border-color:var(--sy-c-link)}.globaltoc>ul a.current{font-weight:500;color:var(--sy-c-link)}.globaltoc>ul a:hover{color:var(--sy-c-link-hover)}.globaltoc a.external:after{content:"";-webkit-mask:var(--lucide-external-link-url) no-repeat;mask:var(--lucide-external-link-url) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;width:.825rem;height:.825rem;margin-left:.2rem;display:inline-block;vertical-align:middle;font-style:normal;background-color:var(--sy-c-light)}.globaltoc li{position:relative}.globaltoc li>button{position:absolute;top:.2rem;right:0;display:flex;justify-content:center;align-items:center;width:1.2rem;height:1.2rem;border-radius:3px}.globaltoc li>button:hover{background-color:var(--sy-c-surface)}.globaltoc li._expand>ul,.globaltoc li.current>ul{display:block}.globaltoc li._collapse>ul,.globaltoc li>ul{display:none}.globaltoc li>button>i{transform:rotate(0deg);transition:transform .2s ease}.globaltoc li._expand>button>i,.globaltoc li.current>button>i{transform:rotate(90deg)}.globaltoc li._collapse>button>i{transform:rotate(0deg)}.sy-deprecated{padding:.8rem;font-size:.85rem;background-color:#ffdd001a;border-radius:6px}.sy-deprecated a{color:var(--sy-c-link);text-decoration:underline}.sy-deprecated a:hover{color:var(--sy-c-link-hover)}.sy-rside-inner>div{margin-bottom:1rem}.sy-rside-inner>div>h3{font-size:.8rem;font-weight:500;letter-spacing:.4px;text-transform:uppercase;margin-bottom:1rem}html[lang=ja] .sy-rside-inner>div>h3,html[lang=ko] .sy-rside-inner>div>h3,html[lang=zh-TW] .sy-rside-inner>div>h3,html[lang=zh] .sy-rside-inner>div>h3{letter-spacing:0;font-size:.86rem;font-weight:600}.localtoc>ul li{margin-top:.36rem;margin-bottom:.36rem}.localtoc>ul li>a:hover{color:var(--sy-c-link-hover)}.localtoc>ul li.active>a{font-weight:500;color:var(--sy-c-link)}.localtoc>ul>li ul{padding-left:.8rem}.sy-rside ul.this-page-menu{margin-top:-.6rem}.sy-rside ul.this-page-menu a{font-size:.96rem}.sy-rside ul.this-page-menu a:hover{color:var(--sy-c-link-hover)}.navigation{gap:2rem;margin-top:2rem;padding-top:1rem;border-top:1px solid var(--sy-c-divider)}.navigation>div{width:100%}.navigation a{display:inline-flex;align-items:center}.navigation a:hover{color:var(--sy-c-link-hover)}.navigation-next{text-align:right}.navigation-next a{justify-content:end}.navigation .page-info{padding:0 8px}.navigation .page-info>span{font-size:.8rem;color:var(--sy-c-light)}:root{--yue-c-text:var(--sy-c-text);--yue-c-heading:var(--sy-c-heading);--yue-c-bold:var(--sy-c-bold);--yue-c-link-1:var(--sy-c-text);--yue-c-link-2:var(--sy-c-bold);--yue-c-link-border:var(--sy-c-link);--yue-c-ol-marker:var(--gray-9);--yue-c-ul-marker:var(--sage-a5);--yue-c-hr:var(--sy-c-border);--yue-c-quote:var(--sy-c-text);--yue-c-quote-border:var(--accent-a3);--yue-c-quote-symbol:var(--accent-9);--yue-c-caption:var(--sy-c-light);--yue-c-code-text:var(--accent-a11);--yue-c-code-background:var(--accent-a3);--yue-c-table-border:var(--gray-a5);--yue-c-th-background:var(--color-surface-accent);--yue-c-th-border:var(--gray-a5);--yue-c-td-border:var(--gray-a4);--yue-c-row-background:var(--sy-c-surface)}.yue{font-size:1rem;line-height:1.75;color:var(--yue-c-text)}.yue p{margin-top:1rem;margin-bottom:1.25rem}.yue a{color:var(--yue-c-link-1);font-weight:500;text-decoration:none;border-bottom:1px solid var(--yue-c-link-border)}.yue a:hover{color:var(--yue-c-link-2);border-bottom-width:2px}.yue pre a,.yue pre a:hover{border-bottom:none}.yue strong{color:var(--yue-c-bold);font-weight:600}.yue a strong,.yue blockquote strong,.yue thead th strong{color:inherit}.yue ol{margin-top:1.25em;margin-bottom:1.25em;padding-left:1.625em}.yue ol,.yue ol[type="1"]{list-style-type:decimal}.yue ol.upperalpha,.yue ol[type=A]{list-style-type:upper-alpha}.yue ol.loweralpha,.yue ol[type=a]{list-style-type:lower-alpha}.yue ol.upperroman,.yue ol[type=I]{list-style-type:upper-roman}.yue ol.lowerroman,.yue ol[type=i]{list-style-type:lower-roman}.yue ul{list-style-type:disc;margin-top:1.25em;margin-bottom:1.25em;padding-left:1.625em}.yue ol>li::marker{font-weight:400;color:var(--yue-c-ol-marker)}.yue ul>li::marker{color:var(--yue-c-ul-marker)}.yue dl{margin-top:1.5rem;margin-bottom:1.5rem}.yue dt{color:var(--yue-c-bold);font-weight:600}.yue dd{margin-left:1.5rem}.yue hr{border-color:var(--yue-c-hr);border-top-width:1px;margin-top:3em;margin-bottom:3em}.yue blockquote{color:var(--yue-c-quote);border-left-width:.25rem;border-left-color:var(--yue-c-quote-border);margin-top:1.2rem;margin-bottom:1.2rem;padding-left:1rem}.yue blockquote .attribution{font-size:.85em;font-style:italic}[lang=ja] .yue blockquote .attribution,[lang=ko] .yue blockquote .attribution,[lang^=zh] .yue blockquote .attribution{font-style:normal}.yue h1{color:var(--yue-c-heading);font-weight:800;font-size:2.25em;margin-top:0;margin-bottom:.8888889em;line-height:1.1111111}.yue h1 strong{font-weight:900;color:inherit}.yue h2{color:var(--yue-c-heading);font-weight:700;font-size:1.5em;margin-top:2em;margin-bottom:1em;line-height:1.3333333}.yue h2 strong{font-weight:800;color:inherit}.yue h3{color:var(--yue-c-heading);font-weight:600;font-size:1.25em;margin-top:1.6em;margin-bottom:.6em;line-height:1.6}.yue h3 strong{font-weight:700;color:inherit}.yue h4{color:var(--yue-c-heading);font-weight:600;margin-top:1.5em;margin-bottom:.5em;line-height:1.5}.yue h4 strong{font-weight:700;color:inherit}.yue h5,.yue h6{color:var(--yue-c-heading);font-weight:600}.yue img{display:inline;margin-top:2em;margin-bottom:2em}.yue img.rounded{border-radius:.5rem}.yue a>img,.yue figure img,.yue figure>*{margin-top:0;margin-bottom:0}.yue figcaption{color:var(--yue-c-caption);font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.yue figcaption>p{margin-top:0}.yue code{color:var(--yue-c-code-text);font-weight:600;font-size:.875em}.yue a code,.yue blockquote code,.yue h1 code,.yue h2 code,.yue h3 code,.yue h4 code,.yue th code{color:inherit}.yue h2 code{font-size:.875em}.yue li>code,.yue p>code{padding:2px 4px;border-radius:3px;font-weight:500;background-color:var(--yue-c-code-background)}.yue h3 code{font-size:.9em}.yue kbd{font-family:var(--sy-f-mono)}.yue figure,.yue video{margin-top:2em;margin-bottom:2em}.yue li{margin-top:.5em;margin-bottom:.5em}.yue ol>li,.yue ul>li{padding-left:.375em}.yue ol ol,.yue ol ul,.yue ul ol,.yue ul ul{margin-top:.75em;margin-bottom:.75em}.yue h2+*,.yue h3+*,.yue h4+*,.yue hr+*{margin-top:0}.yue table{width:100%;table-layout:auto;text-align:left;margin-top:2em;margin-bottom:2em;font-size:.86em;line-height:1.7}.yue table>caption{margin-bottom:.4rem;color:var(--yue-c-caption)}.yue thead tr{border-bottom-width:1px;border-bottom-color:var(--yue-c-th-border)}.yue thead th{color:var(--yue-c-heading);font-weight:600;vertical-align:middle}.yue tbody tr{border-bottom-width:1px;border-bottom-color:var(--yue-c-td-border)}.yue tbody tr:last-child{border-bottom-width:0}.yue tbody td{vertical-align:middle}.yue tfoot{border-top-width:1px;border-top-color:var(--yue-c-th-border)}.yue tfoot td{vertical-align:top}.yue td>p{margin:.25rem 0}.yue thead th>p{margin:0}.yue tbody td,.yue tfoot td,.yue thead th{padding:.5rem}.yue section{clear:both}.yue section>div{margin-bottom:2rem}.yue dd>p:first-child{margin-top:0}.yue p.lead{font-size:1.2rem;color:var(--sy-c-light);margin-bottom:0}.yue p.lead+hr{margin-top:1rem}.yue p.rubric{color:var(--yue-c-heading);font-weight:600;margin-top:2rem}.yue .sidebar{background-color:var(--sy-c-surface);border:1px solid var(--sy-c-border);border-radius:6px;clear:right;float:right;margin-left:1rem;margin-bottom:1rem;margin-right:0;width:30%}@media (max-width:767px){.yue .sidebar{float:none;width:100%;margin-left:0}}.yue .sidebar>*{padding-left:1rem;padding-right:1rem}.yue .sidebar img{margin-top:1rem;margin-bottom:1rem}.yue .sidebar-title{font-weight:500;border-bottom:1px solid var(--sy-c-border);margin:0;padding-top:.5rem;padding-bottom:.5rem}.yue dl.simple>dd>p,.yue ol.simple>li>p,.yue ul.simple>li>p{margin:0}.yue a.headerlink{visibility:hidden;margin-left:6px;color:var(--sy-c-light);font-weight:300;font-size:58%;font-family:var(--sy-f-mono);--icon-url:var(--lucide-link-url);-webkit-mask:var(--icon-url) no-repeat;mask:var(--icon-url) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;width:1em;height:1em;display:inline-block;vertical-align:middle;font-style:normal;background-color:currentColor}.yue .math a.headerlink,h1:hover a.headerlink,h2:hover a.headerlink,h3:hover a.headerlink,h4:hover a.headerlink,h5:hover a.headerlink,h6:hover a.headerlink{visibility:visible}.yue .toctree-wrapper a,.yue a.image-reference{border-bottom:none}.yue .toctree-wrapper p.caption{font-size:.86rem;font-weight:500;font-family:var(--sy-f-heading);color:var(--sy-c-light);text-transform:uppercase;letter-spacing:.4px;padding:.8rem 0 .4rem;border-bottom:1px solid var(--sy-c-divider)}.yue .align-left{clear:left;float:left;margin:0 1rem 1rem}.yue .align-right{clear:right;float:right;margin:0 1rem 1rem}.yue .align-center{display:block;text-align:center}.yue .align-center,.yue figure.align-center img{margin-left:auto;margin-right:auto}a.footnote-reference{font-size:.65rem;vertical-align:top}aside.footnote>span,div.citation>span{float:left;font-weight:500;padding-right:.25rem}aside.footnote>p,div.citation>p{margin-bottom:.5rem;margin-top:.5rem;margin-left:2rem}.yue kbd.kbd:not(.compound){font-size:.86rem;padding:2px 5px;border-radius:3px;margin-right:.25rem}.yue kbd.compound>kbd{margin-left:.25rem}.yue .menuselection{font-weight:500;font-size:.86rem}.light .searchbox kbd,.light .yue kbd.kbd:not(.compound){border:0;background:linear-gradient(-225deg,#e6e6e6,#f8f8f8);box-shadow:inset 0 -2px #dbdbdb,inset 0 0 1px 1px #fff,0 1px 2px 1px #50505066}.dark .searchbox kbd,.dark .yue kbd.kbd:not(.compound){border:0;background:linear-gradient(-225deg,#353434,#141414);box-shadow:inset 0 -2px #373737,inset 0 0 1px 1px #222,0 1px 2px 1px #000}.yue p.centered{text-align:center}.hlist td{vertical-align:top}.dark .dark-hidden,.dark .light-only,.light .dark-only,.light .light-hidden{display:none}.yue .genindex-jumpbox,.yue .modindex-jumpbox{border-top:1px solid var(--sy-c-border);border-bottom:1px solid var(--sy-c-border);padding:2px .4rem}.yue table.modindextable td:first-of-type{width:28px}.yue table.modindextable img.toggler{margin:0}.yue table.modindextable tr.cap{font-size:1.12rem;background:var(--sy-c-surface);font-family:var(--sy-f-mono)}.yue h2+table.indextable,.yue table.indextable ul{margin-top:0}:root{--attention-icon:var(--lucide-alert-url);--attention-1:var(--crimson-surface);--attention-2:var(--crimson-a3);--attention-3:var(--crimson-9);--attention-4:var(--crimson-a11);--caution-icon:var(--lucide-zap-url);--caution-1:var(--amber-surface);--caution-2:var(--amber-a3);--caution-3:var(--amber-9);--caution-4:var(--amber-11);--danger-icon:var(--lucide-skull-url);--danger-1:var(--ruby-surface);--danger-2:var(--ruby-a3);--danger-3:var(--ruby-9);--danger-4:var(--ruby-a11);--error-icon:var(--lucide-close-url);--error-1:var(--red-surface);--error-2:var(--red-a3);--error-3:var(--red-9);--error-4:var(--red-a11);--hint-icon:var(--lucide-bell-url);--hint-1:var(--cyan-surface);--hint-2:var(--cyan-a3);--hint-3:var(--cyan-9);--hint-4:var(--cyan-a11);--important-icon:var(--lucide-flame-url);--important-1:var(--violet-surface);--important-2:var(--violet-a3);--important-3:var(--violet-9);--important-4:var(--violet-a11);--note-icon:var(--lucide-calendar-url);--note-1:var(--blue-surface);--note-2:var(--blue-a3);--note-3:var(--blue-9);--note-4:var(--blue-a11);--tip-icon:var(--lucide-rocket-url);--tip-1:var(--green-surface);--tip-2:var(--green-a3);--tip-3:var(--green-9);--tip-4:var(--green-a11);--warning-icon:var(--lucide-zap-url);--warning-1:var(--orange-surface);--warning-2:var(--orange-a3);--warning-3:var(--orange-9);--warning-4:var(--orange-a11);--seealso-icon:var(--lucide-link-url);--seealso-1:var(--gold-surface);--seealso-2:var(--gold-a3);--seealso-3:var(--gold-9);--seealso-4:var(--gold-a11);--todo-icon:var(--lucide-bookmark-url);--todo-1:var(--bronze-surface);--todo-2:var(--bronze-a3);--todo-3:var(--bronze-9);--todo-4:var(--bronze-a11);--versionadded-1:var(--green-surface);--versionadded-2:var(--green-9);--versionchanged-1:var(--amber-surface);--versionchanged-2:var(--amber-9);--deprecated-1:var(--red-surface);--deprecated-2:var(--red-9)}.admonition{--icon-url:var(--lucide-bell-url);--color-1:var(--color-surface-accent);--color-2:var(--accent-a3);--color-3:var(--accent-9);--color-4:var(--accent-a11);display:flex;flex-direction:column;position:relative;padding:.825rem 1rem;margin-top:1rem;margin-bottom:1rem;border-left:4px solid var(--color-3);background-color:var(--color-1)}.admonition:before{position:absolute;content:"";top:6px;left:-12px;width:20px;height:20px;border-radius:100%;background-color:var(--color-3)}.admonition:after{position:absolute;content:"";top:10px;left:-8px;-webkit-mask:var(--icon-url) no-repeat;mask:var(--icon-url) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;font-style:normal;width:12px;height:12px;background-color:#fff}.admonition p.admonition-title{position:relative;margin:-.825rem -1rem .825rem -19px;padding:4px 18px;font-size:.85rem;font-weight:600;line-height:1.72;color:var(--color-4);background-color:var(--color-2);--yue-c-code:var(--color-4);--yue-c-bold:var(--color-4)}.admonition p.admonition-title svg{display:inline-block}.admonition.attention{--icon-url:var(--attention-icon);--color-1:var(--attention-1);--color-2:var(--attention-2);--color-3:var(--attention-3);--color-4:var(--attention-4)}.admonition.caution{--icon-url:var(--caution-icon);--color-1:var(--caution-1);--color-2:var(--caution-2);--color-3:var(--caution-3);--color-4:var(--caution-4)}.admonition.danger{--icon-url:var(--danger-icon);--color-1:var(--danger-1);--color-2:var(--danger-2);--color-3:var(--danger-3);--color-4:var(--danger-4)}.admonition.error{--icon-url:var(--error-icon);--color-1:var(--error-1);--color-2:var(--error-2);--color-3:var(--error-3);--color-4:var(--error-4)}.admonition.hint{--icon-url:var(--hint-icon);--color-1:var(--hint-1);--color-2:var(--hint-2);--color-3:var(--hint-3);--color-4:var(--hint-4)}.admonition.important{--icon-url:var(--important-icon);--color-1:var(--important-1);--color-2:var(--important-2);--color-3:var(--important-3);--color-4:var(--important-4)}.admonition.note{--icon-url:var(--note-icon);--color-1:var(--note-1);--color-2:var(--note-2);--color-3:var(--note-3);--color-4:var(--note-4)}.admonition.tip{--icon-url:var(--tip-icon);--color-1:var(--tip-1);--color-2:var(--tip-2);--color-3:var(--tip-3);--color-4:var(--tip-4)}.admonition.warning{--icon-url:var(--warning-icon);--color-1:var(--warning-1);--color-2:var(--warning-2);--color-3:var(--warning-3);--color-4:var(--warning-4)}.admonition.seealso{--icon-url:var(--seealso-icon);--color-1:var(--seealso-1);--color-2:var(--seealso-2);--color-3:var(--seealso-3);--color-4:var(--seealso-4)}.admonition.admonition-todo{--icon-url:var(--todo-icon);--color-1:var(--todo-1);--color-2:var(--todo-2);--color-3:var(--todo-3);--color-4:var(--todo-4)}.admonition p.admonition-title+p{margin-top:0}.admonition>:last-child{margin-bottom:0}span.versionmodified{color:var(--sy-c-bold);font-weight:600}div.deprecated,div.versionadded,div.versionchanged{position:relative;padding:6px 1rem;margin:1rem 0;border-left:4px solid var(--color-2);background-color:var(--color-1);line-height:1.72}div.deprecated:before,div.versionadded:before,div.versionchanged:before{position:absolute;content:var(--version-icon);top:10px;left:-12px;color:#fff;width:20px;height:20px;border-radius:100%;background-color:var(--color-2);text-align:center;font:normal 700 14px/20px var(--sy-f-mono)}div.versionadded{--color-1:var(--versionadded-1);--color-2:var(--versionadded-2);--version-icon:"#"}div.versionchanged{--color-1:var(--versionchanged-1);--color-2:var(--versionchanged-2);--version-icon:"%"}div.deprecated{--color-1:var(--deprecated-1);--color-2:var(--deprecated-2);--version-icon:"!"}div.deprecated>p,div.versionadded>p,div.versionchanged>p{margin:0}.yue blockquote.epigraph{padding:1rem 2.4rem;border-left:0;text-align:center}.yue blockquote.highlights{border-left-width:4px;padding-top:.2rem;padding-bottom:.2rem;background-color:var(--sy-c-surface)}.yue blockquote.pull-quote{position:relative;font-size:1.24rem;padding:2.4rem 3.6rem 1.2rem;border-left:0}.yue blockquote.pull-quote:before{content:"\201c";position:absolute;top:0;left:.5rem;color:var(--yue-c-quote-symbol);font:700 4rem/1 Times New Roman,Georgia,Palatino,Times,serif}.yue blockquote.pull-quote .attribution{text-align:right}pre.literal-block{line-height:1.48;padding:1rem;font-size:.96rem;background-color:var(--syntax-pre-bg);border-radius:6px;overflow:auto}.highlight,.literal-block-wrapper{--margin:1rem;--radius:6px}.literal-block-wrapper div[class^=highlight-]{display:flex}.literal-block-wrapper .highlight{width:100%}.highlight>pre{line-height:1.48;padding:var(--margin);font-size:.96rem;font-family:var(--sy-f-mono);background-color:var(--syntax-pre-bg);border-radius:var(--radius);overflow:auto}.win .highlight>pre{font-family:"Twemoji Country Flags",var(--sy-f-mono)}.highlight .linenos{display:inline-block;box-shadow:-.05rem 0 var(--syntax-linenos-divider) inset;-webkit-user-select:none;-moz-user-select:none;user-select:none;margin-right:.8rem;padding-right:.8rem;opacity:.6}.highlight .hll{margin-left:calc(0rem - var(--margin));margin-right:calc(0rem - var(--margin));padding:0 var(--margin)}.code-block-caption{display:flex;font-size:.84rem;font-weight:600;color:var(--syntax-text);background-color:var(--syntax-cap-bg);padding:.4rem var(--margin);border-radius:var(--radius) var(--radius) 0 0}.code-block-caption+div>.highlight>pre{border-top-left-radius:0;border-top-right-radius:0}div[class^=highlight]>.highlight>pre{display:grid}.yue .table-wrapper{width:100%;overflow-x:auto;margin-top:2rem;margin-bottom:2rem;border:1px solid var(--yue-c-table-border);border-radius:6px}.yue .table-wrapper table{margin:0}.yue .table-wrapper thead tr{border-top:1px solid var(--yue-c-td-border)}.yue .table-wrapper thead tr:first-child{border-top:0}.yue .table-wrapper th{background-color:var(--yue-c-th-background);border-left:1px solid var(--yue-c-td-border);padding:.725rem 1rem}.yue .table-wrapper td{border-left:1px solid var(--yue-c-td-border);padding:.5rem 1rem}.yue .table-wrapper tr>td:first-child,.yue .table-wrapper tr>th:first-child{border-left:0}.yue .table-wrapper caption{padding:.5rem;margin:0;border-bottom:1px solid var(--yue-c-th-border)}.yue .table-wrapper tbody tr.row-odd{background-color:var(--yue-c-row-background)}.yue table.hlist td{vertical-align:top}.table-wrapper{overflow-x:auto;scrollbar-gutter:auto}.table-wrapper::-webkit-scrollbar{height:.75rem;width:.75rem}.table-wrapper::-webkit-scrollbar-thumb{border-radius:10px}.table-wrapper::-webkit-scrollbar-track{background-color:initial}.table-wrapper:hover::-webkit-scrollbar-thumb{background-color:#9b9b9b33;background-clip:content-box;border:3px solid #0000}.yue table.ghost td,.yue table.ghost th{border-left:0;border-right:0;background-color:initial}.yue table.ghost caption{margin-bottom:0;padding-bottom:.5rem;border-bottom:3px solid var(--yue-c-td-border)}.yue table.ghost thead tr:first-child{border-top:0;border-bottom-width:3px}.yue .table-wrapper.ghost{border:0}:root{--sig-property:var(--syntax-keyword);--sig-name:var(--syntax-property);--sig-typehint:var(--syntax-constant);--sig-param:var(--syntax-meta)}dt.sig{position:relative;font-size:.92rem;padding:.25rem .5rem .25rem 3rem;text-indent:-2.4rem;border-radius:6px}dt.sig:after{content:"";display:table;clear:both}dt.sig:hover{background:var(--sy-c-surface)}dt.sig+dd{font-size:.92rem;margin-left:2rem}dt.sig>em.property:first-child{color:var(--sig-property)}dl.field-list a{font-weight:400}dt.sig+dd>div{margin-bottom:1rem}dt.sig+dd>dl.field-list>dt{text-transform:uppercase;font-size:.76rem}em.property,em.sig-param{font-style:normal}em.sig-param{color:var(--sy-c-light)}span.sig-name,span.sig-prename{color:var(--sig-name)}span.sig-name{font-weight:600}span.sig-return-icon{color:var(--sy-c-light)}span.sig-return-typehint,span.sig-return-typehint>a{color:var(--sig-typehint)}span.pre,span.sig-paren{font-family:var(--sy-f-mono)}dt.sig>a.internal{font-size:.82rem;border:0;color:var(--sy-c-light)}dt.sig>a.internal:before{content:"\a";white-space:pre}.viewcode-block{position:relative}.viewcode-back{position:absolute;top:-1.5rem;font-size:.8rem}.classifier{font-style:oblique;font-weight:400}.classifier:before{font-style:normal;margin-left:.1rem;margin-right:.5rem;content:":";display:inline-block}.yue .table-wrapper.autosummary{border-left:0;border-right:0;border-radius:0}.yue .table-wrapper table.autosummary td{border:none;padding-top:.25rem;padding-bottom:.25rem}.yue p.rubric+div.autosummary{margin-top:0}.sy-lside{--height:42px}.sy-lside-bottom{position:sticky;bottom:0;padding:0;border-top:1px solid var(--sy-c-divider);background-color:var(--sy-c-background);--tw-shadow:0 -12px 16px var(--sy-c-background);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.sy-lside .rst-versions{position:static;width:100%;background-color:var(--sy-c-surface);font-family:var(--sy-f-text)}.sy-lside .rst-versions a{color:var(--sy-c-link)}.sy-lside .rst-versions a:hover{color:var(--sy-c-link-hover)}.sy-lside .rst-versions .rst-current-version{background-color:var(--sy-c-background);color:var(--sy-c-text);padding:0 1rem;height:var(--height);line-height:var(--height)}.sy-lside .rst-versions.rst-badge .rst-current-version{text-align:left;font-size:.94rem;padding:0 1rem;height:var(--height);line-height:var(--height)}.sy-lside .rst-versions .rst-current-version .fa{color:var(--sy-c-text)}.sy-lside .rst-versions.rst-badge.shift-up .rst-current-version{text-align:left}.sy-lside .rst-versions.rst-badge.shift-up .rst-current-version .fa-book{float:none}.sy-lside .rst-other-versions{font-size:.86rem;border-top:1px solid var(--sy-c-divider)}.sy-lside .rst-other-versions dt{font-size:.68rem;font-weight:500;padding:4px 6px;color:var(--sy-c-light)}.sy-lside .rst-versions .rst-other-versions dd a{color:var(--sy-c-text)}.sy-lside .rst-versions .rst-other-versions dd a:hover{text-decoration:underline;color:var(--sy-c-link-hover)}.sy-lside .rst-versions input{width:100%;padding:6px 12px;font-size:.92rem;font-family:var(--sy-f-text);border-radius:6px;outline:0;background:var(--sy-c-background);border:1px solid var(--sy-c-border)}.sy-lside .rst-versions .rst-other-versions hr{border-color:var(--sy-c-divider)}@media (min-width:90rem){.sy-lside .rst-versions{background:var(--sy-c-background)}}.yue button.copybtn{align-items:center;justify-content:center;background-color:initial;border:none;color:var(--syntax-text)}.yue button.copybtn>svg{width:1.4rem;height:1.4rem}.yue button.copybtn:hover{color:var(--syntax-meta)}.yue .highlight button.copybtn:hover{background-color:initial}.yue button.copybtn:after{background-color:initial;color:var(--syntax-text)}.yue button.copybtn.success{border-color:var(--green-a10);color:var(--green-a10)}.yue button.copybtn.success:after{color:var(--green-a10)}.yue{--sd-color-primary:var(--accent-a11);--sd-color-secondary:var(--gold-a11);--sd-color-success:var(--green-a11);--sd-color-info:var(--blue-a11);--sd-color-warning:var(--orange-a11);--sd-color-danger:var(--red-a11);--sd-color-light:var(--sand-a2);--sd-color-muted:var(--gray-8);--sd-color-dark:#212122;--sd-color-black:#000;--sd-color-white:#fff;--sd-color-primary-highlight:var(--accent-a8);--sd-color-secondary-highlight:var(--gold-a8);--sd-color-success-highlight:var(--green-a8);--sd-color-info-highlight:var(--blue-a8);--sd-color-warning-highlight:var(--orange-a8);--sd-color-danger-highlight:var(--red-a8);--sd-color-light-highlight:var(--gray-4);--sd-color-muted-highlight:var(--gray-11);--sd-color-dark-highlight:#121211;--sd-color-black-highlight:#000;--sd-color-white-highlight:#d9d9d9;--sd-color-primary-text:var(--accent-9-contrast);--sd-color-secondary-text:var(--gold-9-contrast);--sd-color-success-text:var(--green-9-contrast);--sd-color-info-text:var(--blue-9-contrast);--sd-color-warning-text:var(--orange-9-contrast);--sd-color-danger-text:var(--red-9-contrast);--sd-color-light-text:var(--sy-c-text);--sd-color-muted-text:#fff;--sd-color-dark-text:#fff;--sd-color-black-text:#fff;--sd-color-white-text:#212529;--sd-color-shadow:var(--gray-1);--sd-color-card-border:var(--sy-c-border);--sd-color-card-border-hover:var(--accent-a9);--sd-color-tabs-label-inactive:var(--sy-c-bold);--sd-color-tabs-label-active:var(--sd-color-primary);--sd-color-tabs-underline-active:var(--sd-color-primary);--sd-color-tabs-label-hover:var(--accent-9);--sd-color-tabs-underline-hover:var(--accent-9)}.yue .surface{--sd-color-card-text:var(--sy-c-light);--sd-color-card-border:#0000;--sd-color-card-background:var(--sy-c-surface)}.yue a.sd-badge,.yue a.sd-badge:hover{border-bottom:0}.yue .sd-badge{font-weight:600;border-radius:3px}.yue .sd-btn{border-color:var(--sy-c-border)}.yue .sd-tab-set>label{padding:1rem .25rem .5rem;font-size:.84rem;font-weight:500}.yue .sd-tab-set>label~label{margin-left:1rem}.yue .sd-tab-content{padding:0;box-shadow:0 -.0625rem var(--sy-c-divider)}.yue .sd-tab-content .code-block-caption,.yue .sd-tab-content .highlight pre{border-radius:0}.yue .sd-card-title{color:var(--sy-c-text)}.yue .sd-card-title>svg{position:relative;top:-1px;margin-right:.25rem}.yue .sd-card-hover:hover{transform:scale(1)}.yue .sd-card-hover:hover .sd-card-title{color:var(--sy-c-link-hover)}.yue .sd-card a,.yue .sd-card a:hover{border-bottom:0}.yue .surface .sd-card-body,.yue .surface .sd-card-footer,.yue .surface .sd-card-header{padding-left:1.5rem;padding-right:1.5rem}.yue .surface .sd-card-footer,.yue .surface .sd-card-header{border-color:var(--sy-c-border)}@media (print){.yue .sd-card{page-break-inside:avoid}}.yue a.sd-text-wrap:hover{border-bottom-width:1px}.sphinx-tabs [role=tablist]{border-color:var(--sy-c-divider)}.yue .sphinx-tabs-tab{color:var(--sy-c-text);line-height:inherit;padding:1rem .25rem .5rem;font-size:.84rem;font-weight:500;border:none;border-bottom:.125rem solid #0000}.yue .sphinx-tabs-tab:hover{color:var(--sd-color-tabs-label-hover);border-color:var(--sd-color-tabs-underline-hover)}.yue .sphinx-tabs-tab[aria-selected=true]{border:none;border-bottom:.125rem solid var(--sd-color-tabs-underline-active);color:var(--sd-color-tabs-label-active);background-color:initial}.yue .sphinx-tabs-tab+.sphinx-tabs-tab{margin-left:1rem}.yue .sphinx-tabs-panel{border:none;padding:0;margin:0;border-radius:0;background-color:initial}.yue .sphinx-tabs-panel.code-tab{padding:0}.yue .sphinx-tabs-panel.code-tab .code-block-caption,.yue .sphinx-tabs-panel.code-tab .highlight pre{border-radius:0}.yue{--jp-widgets-input-border-color:var(--gray-5);--jp-widgets-input-focus-border-color:var(--gray-8);--jp-widgets-slider-active-handle-color:var(--gray-4);--jp-widgets-slider-handle-border-color:var(--sy-c-border)}.yue .jupyter_container{background-color:var(--sy-c-background);border:3px solid var(--sy-c-border);border-radius:6px;overflow:hidden;box-shadow:none}.sy-main .yue .jupyter_container div[class^=highlight]{padding:0}.yue .jupyter_container div.cell_input{background-color:var(--syntax-pre-bg);border:0;border-radius:0}.yue .jupyter_container div.code_cell pre{padding:0}.jupyter_container div.cell_output .output,.jupyter_container div.cell_output .stderr,.jupyter_container div.cell_output .widget-subarea{padding:.5rem}.jupyter_container div.cell_output .stderr .stderr{padding:0}.jupyter-widget-hslider .slider-container,.widget-hslider .slider-container{display:flex;align-items:center}.jupyter-widget-slider .noUi-target,.widget-slider .noUi-target{width:100%}.jupyter_container div.code_cell .highlight>pre{padding:1rem}.jupyter_container div.code_cell .highlight .hll{margin-left:-1rem;margin-right:-1rem;padding:0 1rem}.jupyter_container div.code_cell .highlight .linenos{margin-right:.8rem}.yue .jupyter_container .stderr{color:var(--red-a11);background-color:var(--red-a3)}.yue .jupyter_container .stderr .stderr{background-color:initial}.nbinput .highlight{--radius:1px}.yue div.nblast.container{padding-top:5px}.yue div.nbinput.container div.input_area{border-color:var(--sy-c-border)}.yue div.nboutput.container div.output_area.stderr{color:var(--red-a11);background-color:var(--red-a3)}.yue div.nboutput.container div.output_area>.math-wrapper>div.math{padding-top:0}.yue .jp-RenderedHTMLCommon thead,.yue div.rendered_html thead{border-color:var(--sy-c-border)}.yue .jp-RenderedHTMLCommon tbody tr,.yue div.rendered_html tbody tr{color:var(--sy-c-text)}.yue .jp-RenderedHTMLCommon tbody tr:nth-child(odd),.yue div.rendered_html tbody tr:nth-child(odd){background-color:var(--sy-c-surface)}.yue .jp-RenderedHTMLCommon tbody tr:hover,.yue div.rendered_html tbody tr:hover{background-color:var(--color-surface-accent)}.yue{--sg-text-color:var(--sy-c-text);--sg-background-color:var(--sy-c-background);--sg-code-background-color:var(--syntax-pre-bg);--sg-tr-hover-color:var(--accent-a3);--sg-tr-odd-color:var(--sy-c-surface);--sg-tooltip-foreground:var(--sy-c-background-contrast);--sg-tooltip-background:var(--sy-c-background);--sg-tooltip-border:var(--gray-7) #0000;--sg-thumb-box-shadow-color:var(--gray-a4);--sg-thumb-hover-border:var(--accent-a9);--sg-script-out:var(--sy-c-light);--sg-script-pre:var(--syntax-pre-bg);--sg-pytb-foreground:var(--syntax-text);--sg-pytb-background:var(--red-a2);--sg-pytb-border-color:var(--red-a8);--sg-download-a-background-color:var(--accent-a3);--sg-download-a-background-image:none;--sg-download-a-border-color:1px solid var(--accent-a3);--sg-download-a-color:var(--accent-a11);--sg-download-a-hover-background-color:var(--accent-a4);--sg-download-a-hover-box-shadow-1:#0000;--sg-download-a-hover-box-shadow-2:#0000}.yue .sphx-glr-download a,.yue .sphx-glr-download a:hover,.yue .sphx-glr-thumbnails a{border-bottom:0}.yue p.sphx-glr-signature a{border-radius:0;border-bottom:0;text-decoration:underline}.yue p.sphx-glr-signature a:hover{color:var(--sy-c-link-hover)}.yue .sphx-glr-footer img{display:inline;margin:0}html.dark,html.light{--docsearch-primary-color:var(--accent-9);--docsearch-text-color:var(--sy-c-text);--docsearch-modal-background:var(--sy-c-background);--docsearch-footer-background:var(--sy-c-surface);--docsearch-searchbox-background:var(--sy-c-surface);--docsearch-searchbox-focus-background:var(--sy-c-background);--docsearch-muted-color:var(--sy-c-light);--docsearch-hit-color:var(--sy-c-text);--docsearch-hit-background:var(--sy-c-surface);--docsearch-hit-active-color:var(--accent-9-contrast);--docsearch-hit-shadow:inset 0 0 1px 0 var(--gray-a11);--docsearch-container-background:var(--sy-c-overlay)}html.light{--docsearch-key-gradient:linear-gradient(-225deg,#e6e6e6,#f8f8f8);--docsearch-key-shadow:inset 0 -2px #dbdbdb,inset 0 0 1px 1px #fff,0 1px 2px 1px #50505066}html.dark{--docsearch-key-gradient:linear-gradient(-225deg,#353434,#141414);--docsearch-key-shadow:inset 0 -2px #373737,inset 0 0 1px 1px #222,0 1px 2px 1px #000;--docsearch-footer-shadow:0 -1px 0 0 #373737,0 -3px 6px 0 #141414;--docsearch-modal-shadow:inset 1px 1px 0 0 #373737,0 3px 8px 0 #141414}#docsearch .DocSearch-Button{border-radius:6px}#docsearch .DocSearch-Button-Key,#docsearch .DocSearch-Button-Placeholder{font-size:.825rem}#docsearch .DocSearch-Button-Keys,#docsearch .DocSearch-Button-Placeholder{display:flex!important}#docsearch .DocSearch-Search-Icon{width:.875rem!important;height:.875rem!important}@media (max-width:767px){#docsearch{position:absolute;top:1rem;left:1.8rem;right:1.8rem}#docsearch .DocSearch-Button{margin-left:0;width:100%}}dl.sqla dt{color:var(--sig-name);margin-bottom:.5rem}dl.sqla dt>em{font-weight:400;font-style:normal;color:var(--sig-param)}dl.sqla dd>p.rubric{margin-top:1.5rem;text-transform:uppercase;font-size:.76rem}dl.sqla dd>p.rubric+.table-wrapper{margin-top:.75rem;border-left:0;border-right:0;border-radius:0}dl.sqla p.rubric+.table-wrapper td,dl.sqla p.rubric+.table-wrapper th{border-left:0;border-right:0;background-color:initial}dl.sqla p.rubric+.table-wrapper td>p{margin:0}dl.sqla p.rubric+.table-wrapper tr.row-odd{background-color:initial}dl.sqla p.rubric+.table-wrapper tr.row-even{background-color:var(--yue-c-row-background)}.yue details.toggle-details{background-color:var(--slate-a2);padding:0 1rem;border-radius:.2em}.yue details.toggle-details summary{border-left-color:var(--accent-a9);background-color:var(--gray-a2);margin-left:-1rem;margin-right:-1rem}.yue details.toggle-details[open] summary{border-radius:.2em .2em 0 0}.yue .toggle-details__container{margin-top:0;margin-bottom:0;padding-top:1rem;padding-bottom:1rem}.yue .toggle-details__container :first-child{margin-top:0}.yue .toggle-details__container :last-child{margin-bottom:0}.yue{--xr-font-color0:var(--sy-c-heading);--xr-font-color2:var(--sy-c-text);--xr-font-color3:var(--sy-c-light);--xr-border-color:var(--sy-c-border);--xr-disabled-color:var(--gray-a6);--xr-background-color:var(--sy-c-background);--xr-background-color-row-even:var(--sy-c-background);--xr-background-color-row-odd:var(--gray-2)}.yue .xr-array-data pre{margin:0}@media not all and (min-width:640px){.max-sm\:max-w-full{max-width:100%}}@media (min-width:768px){.md\:sticky{position:sticky}.md\:inline{display:inline}.md\:flex{display:flex}.md\:hidden{display:none}.md\:w-72{width:18rem}.md\:shrink-0{flex-shrink:0}}@media (min-width:1280px){.xl\:sticky{position:sticky}.xl\:top-16{top:4rem}.xl\:hidden{display:none}.xl\:px-12{padding-left:3rem;padding-right:3rem}.xl\:pl-0{padding-left:0}}@media print{.print\:hidden{display:none}.print\:pt-6{padding-top:1.5rem}} \ No newline at end of file diff --git a/latest/_static/shibuya.js b/latest/_static/shibuya.js deleted file mode 100644 index 94f927f7..00000000 --- a/latest/_static/shibuya.js +++ /dev/null @@ -1 +0,0 @@ -(()=>{function _(t){let e=t.getAttribute("aria-controls"),o=document.getElementById(e),c="data-expanded-"+e;t.addEventListener("click",function(){document.body.hasAttribute(c)?(document.body.removeAttribute(c),o.classList.remove("_expanded"),y(e,"false")):(document.body.setAttribute(c,"true"),o.classList.add("_expanded"),y(e,"true"))})}function y(t,e){let o=document.querySelectorAll('[aria-controls="'+t+'"]');for(el of o)el.setAttribute("aria-expanded",e)}var S=document.querySelectorAll(".js-menu");for(let t=0;t{a.parentNode.removeChild(a),document.head.removeChild(t)}),e(),window.addEventListener("resize",e)}var C;var l=["auto","light","dark"],d=document.querySelector(".js-theme");function k(){let t=h();t+=1,l[t]||(t=0);let e=l[t];setColorMode(e),localStorage._theme=e,L(e)}function h(){return l.indexOf(document.documentElement.getAttribute("data-color-mode")||"auto")}function L(t){let e=d.getAttribute("data-aria-"+t);d.setAttribute("aria-label",e)}d&&(d.addEventListener("click",k),L(l[h()]||"auto"));function I(){let t=document.querySelector(".globaltoc");if(!t)return;let e=parseInt(t.getAttribute("data-expand-depth"),10),o=n=>{if(!e)return!1;let s=0;for(;n.parentNode&&n.parentNode!==t;)n=n.parentNode,n.nodeName==="UL"&&(s+=1);return e>=s};t.querySelectorAll("li > ul").forEach(n=>{let s=n.parentNode;s.classList.contains("current")||o(s)?s.classList.add("_expand"):s.classList.add("_collapse");let i=N(n);s.appendChild(i)})}function N(t){let e=document.createElement("button");e.innerHTML='';let o=t.parentNode,c=t.previousSibling,n=c.textContent,s=()=>{o.classList.contains("_expand")?e.setAttribute("aria-label","Collapse "+n):e.setAttribute("aria-label","Expand "+n)};s();let i=E=>{E.preventDefault(),o.classList.contains("_expand")?(o.classList.remove("_expand"),o.classList.add("_collapse")):(o.classList.remove("_collapse"),o.classList.add("_expand")),s()};return c.getAttribute("href")==="#"&&c.addEventListener("click",i),e.addEventListener("click",i),e}var f=document.querySelector(".globaltoc a.current");f&&f.scrollIntoViewIfNeeded&&f.scrollIntoViewIfNeeded();I();var v=0,m=200,u=document.querySelectorAll(".yue > section section[id]"),r=document.querySelector(".back-to-top");function w(){let t=document.querySelector(".yue > section");t&&(m=t.computedStyleMap().get("scroll-margin-top").value)}function O(t){let e=t.getBoundingClientRect();return e.top<=m&&e.bottom>=m}function A(t){document.querySelectorAll(".localtoc li.active").forEach(e=>{e.classList.remove("active")}),document.querySelector(`.localtoc a[href="#${t}"]`).parentNode.classList.add("active")}function x(){let t;for(let e=0;e=document.body.offsetHeight){let t=u[u.length-1];t&&A(t.id)}else x();r&&(window.scrollY&&window.scrollY{window.scrollTo(0,0)});window.addEventListener("scroll",j);window.addEventListener("DOMContentLoaded",()=>{w(),x()});window.addEventListener("resize",w);var p=document.querySelector(".js-repo-stats");async function M(t,e){let o=`https://api.github.com/repos/${t}/${e}`,n=await(await fetch(o)).json(),s={stars:n.watchers,forks:n.forks};b(s),sessionStorage.setItem("_sy/repo/stats",JSON.stringify(s))}async function T(t,e){let o="https://gitlab.com/api/v4/projects/"+encodeURIComponent(t+"/"+e),n=await(await fetch(o)).json(),s={stars:n.star_count,forks:n.forks_count};b(s),sessionStorage.setItem("_sy/repo/stats",JSON.stringify(s))}function b({stars:t,forks:e}){t&&(document.querySelector(".js-repo-stars").textContent=t),e&&(document.querySelector(".js-repo-forks").textContent=e)}function B(){let t=sessionStorage.getItem("_sy/repo/stats");if(t)b(JSON.parse(t));else{let e=p.getAttribute("data-user"),o=p.getAttribute("data-repo"),c=p.getAttribute("data-type");c==="github"?M(e,o):c==="gitlab"&&T(e,o)}}p&&B();function R(t,e){let o=document.createElement("script");o.id="_carbonads_js",o.src=`//cdn.carbonads.com/carbon.js?serve=${t}&placement=${e}`;let c=document.querySelector(".yue > section"),n=document.querySelector(".yue > section > section");if(n)c.insertBefore(o,n);else{let s=document.querySelector(".yue > section > p");s?c.insertBefore(o,s.nextSibling):c.appendChild(o)}}var g=document.querySelector(".js-carbon");if(g){let t=g.getAttribute("data-carbon-code"),e=g.getAttribute("data-carbon-placement");t&&e&&R(t,e)}/windows/i.test(navigator.userAgent)&&document.body.classList.add("win");})(); diff --git a/latest/_static/sphinx_highlight.js b/latest/_static/sphinx_highlight.js deleted file mode 100644 index aae669d7..00000000 --- a/latest/_static/sphinx_highlight.js +++ /dev/null @@ -1,144 +0,0 @@ -/* Highlighting utilities for Sphinx HTML documentation. */ -"use strict"; - -const SPHINX_HIGHLIGHT_ENABLED = true - -/** - * highlight a given string on a node by wrapping it in - * span elements with the given class name. - */ -const _highlight = (node, addItems, text, className) => { - if (node.nodeType === Node.TEXT_NODE) { - const val = node.nodeValue; - const parent = node.parentNode; - const pos = val.toLowerCase().indexOf(text); - if ( - pos >= 0 && - !parent.classList.contains(className) && - !parent.classList.contains("nohighlight") - ) { - let span; - - const closestNode = parent.closest("body, svg, foreignObject"); - const isInSVG = closestNode && closestNode.matches("svg"); - if (isInSVG) { - span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); - } else { - span = document.createElement("span"); - span.classList.add(className); - } - - span.appendChild(document.createTextNode(val.substr(pos, text.length))); - parent.insertBefore( - span, - parent.insertBefore( - document.createTextNode(val.substr(pos + text.length)), - node.nextSibling - ) - ); - node.nodeValue = val.substr(0, pos); - - if (isInSVG) { - const rect = document.createElementNS( - "http://www.w3.org/2000/svg", - "rect" - ); - const bbox = parent.getBBox(); - rect.x.baseVal.value = bbox.x; - rect.y.baseVal.value = bbox.y; - rect.width.baseVal.value = bbox.width; - rect.height.baseVal.value = bbox.height; - rect.setAttribute("class", className); - addItems.push({ parent: parent, target: rect }); - } - } - } else if (node.matches && !node.matches("button, select, textarea")) { - node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); - } -}; -const _highlightText = (thisNode, text, className) => { - let addItems = []; - _highlight(thisNode, addItems, text, className); - addItems.forEach((obj) => - obj.parent.insertAdjacentElement("beforebegin", obj.target) - ); -}; - -/** - * Small JavaScript module for the documentation. - */ -const SphinxHighlight = { - - /** - * highlight the search words provided in localstorage in the text - */ - highlightSearchWords: () => { - if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight - - // get and clear terms from localstorage - const url = new URL(window.location); - const highlight = - localStorage.getItem("sphinx_highlight_terms") - || url.searchParams.get("highlight") - || ""; - localStorage.removeItem("sphinx_highlight_terms") - url.searchParams.delete("highlight"); - window.history.replaceState({}, "", url); - - // get individual terms from highlight string - const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); - if (terms.length === 0) return; // nothing to do - - // There should never be more than one element matching "div.body" - const divBody = document.querySelectorAll("div.body"); - const body = divBody.length ? divBody[0] : document.querySelector("body"); - window.setTimeout(() => { - terms.forEach((term) => _highlightText(body, term, "highlighted")); - }, 10); - - const searchBox = document.getElementById("searchbox"); - if (searchBox === null) return; - searchBox.appendChild( - document - .createRange() - .createContextualFragment( - '" - ) - ); - }, - - /** - * helper function to hide the search marks again - */ - hideSearchWords: () => { - document - .querySelectorAll("#searchbox .highlight-link") - .forEach((el) => el.remove()); - document - .querySelectorAll("span.highlighted") - .forEach((el) => el.classList.remove("highlighted")); - localStorage.removeItem("sphinx_highlight_terms") - }, - - initEscapeListener: () => { - // only install a listener if it is really needed - if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; - - document.addEventListener("keydown", (event) => { - // bail for input elements - if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; - // bail with special keys - if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; - if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { - SphinxHighlight.hideSearchWords(); - event.preventDefault(); - } - }); - }, -}; - -_ready(SphinxHighlight.highlightSearchWords); -_ready(SphinxHighlight.initEscapeListener); diff --git a/latest/genindex.html b/latest/genindex.html deleted file mode 100644 index b8b3f23f..00000000 --- a/latest/genindex.html +++ /dev/null @@ -1,314 +0,0 @@ - - - - - Index - ape-vyper documentation - - - - - - - - -
-
-
- - - - ape-vyper - -
- -
-
-
-
-
-
-
-
- - -

Index

- -
- A - | C - | D - | E - | F - | G - | I - | M - | N - | R - | T - | V - -
-

A

- - - -
    -
  • - ape_vyper.exceptions - -
  • -
  • - ape_vyper.interface - -
  • -
- -

C

- - - -
- -

D

- - -
- -

E

- - - -
- -

F

- - - -
- -

G

- - - -
- -

I

- - - -
- -

M

- - - -
- -

N

- - - -
- -

R

- - - -
- -

T

- - -
- -

V

- - - -
- - - -
- -
-
- - - - - - - - \ No newline at end of file diff --git a/latest/index.html b/latest/index.html deleted file mode 100644 index c310d654..00000000 --- a/latest/index.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - ape-vyper documentation - - - - - - - - - - - - -
-
-
- - - - ape-vyper - -
- -
-
-
-
-
-
-
- - - - -
-
-
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/latest/methoddocs/compiler.html b/latest/methoddocs/compiler.html deleted file mode 100644 index 23ee5feb..00000000 --- a/latest/methoddocs/compiler.html +++ /dev/null @@ -1,480 +0,0 @@ - - - - - Compiler - ape-vyper documentation - - - - - - - - - - - - -
-
-
- - - - ape-vyper - -
- -
-
-
-
-
-
-
- - - - -
-
-
-
-

Compiler

-
-
-class ape_vyper.compiler.FileType(value)
-

An enumeration.

-
- -
-
-class ape_vyper.compiler.Remapping(_case_sensitive: bool | None = None, _env_prefix: str | None = None, _env_file: DotenvType | None = PosixPath('.'), _env_file_encoding: str | None = None, _env_ignore_empty: bool | None = None, _env_nested_delimiter: str | None = None, _env_parse_none_str: str | None = None, _env_parse_enums: bool | None = None, _cli_prog_name: str | None = None, _cli_parse_args: bool | list[str] | tuple[str, ...] | None = None, _cli_settings_source: CliSettingsSource[Any] | None = None, _cli_parse_none_str: str | None = None, _cli_hide_none_type: bool | None = None, _cli_avoid_json: bool | None = None, _cli_enforce_required: bool | None = None, _cli_use_class_docs_for_groups: bool | None = None, _cli_exit_on_error: bool | None = None, _cli_prefix: str | None = None, _secrets_dir: str | Path | None = None, *, key: str, dependency_name: str, dependency_version: None = None, **values: Any)
-
- -
-
-class ape_vyper.compiler.VyperCompiler(*, compiler_settings: dict = {})
-
-
-compile(contract_filepaths: Iterable[Path], project: ProjectManager | None = None, settings: dict | None = None) Iterator[ContractType]
-

Compile the given source files. All compiler plugins must implement this function.

-
-
Parameters:
-
    -
  • contract_filepaths (Iterable[pathlib.Path]) – A list of source file paths to compile.

  • -
  • project (Optional[ProjectManager]) – Optionally provide -the project containing the base paths and full source set. Defaults to the local -project. Dependencies will change this value to their respective projects.

  • -
  • settings (Optional[dict]) – Adhoc compiler settings.

  • -
-
-
Returns:
-

list[ContractType]

-
-
-
- -
-
-compile_code(code: str, project: ProjectManager | None = None, **kwargs) ContractType
-

Compile a program.

-
-
Parameters:
-
    -
  • code (str) – The code to compile.

  • -
  • project (Optional[ProjectManager]) – Optionally provide -the project containing the base paths and full source set. Defaults to the local -project. Dependencies will change this value to their respective projects.

  • -
  • settings (Optional[Dict]) – Adhoc compiler settings.

  • -
  • **kwargs – Additional overrides for the ethpm_types.ContractType model.

  • -
-
-
Returns:
-

A compiled contract artifact.

-
-
Return type:
-

ContractType

-
-
-
- -
-
-enrich_error(err: ContractLogicError) ContractLogicError
-

Enrich a contract logic error using compiler information, such as -known PC locations for compiler runtime errors.

-
-
Parameters:
-

err (ContractLogicError) – The exception -to enrich.

-
-
Returns:
-

The enriched exception.

-
-
Return type:
-

ContractLogicError

-
-
-
- -
-
-flatten_contract(path: Path, project: ProjectManager | None = None, **kwargs) Content
-

Returns the flattened contract suitable for compilation or verification as a single file

-
- -
-
-get_compiler_settings(contract_filepaths: Iterable[Path], project: ProjectManager | None = None, **kwargs) dict[packaging.version.Version, dict]
-

Get a mapping of the settings that would be used to compile each of the sources -by the compiler version number.

-
-
Parameters:
-
    -
  • contract_filepaths (Iterable[pathlib.Path]) – The list of paths.

  • -
  • project (Optional[ProjectManager]) – Optionally provide -the project containing the base paths and full source set. Defaults to the local -project. Dependencies will change this value to their respective projects.

  • -
  • **overrides – Settings overrides.

  • -
-
-
Returns:
-

A dict of compiler settings by compiler version.

-
-
Return type:
-

dict[Version, dict]

-
-
-
- -
-
-get_import_remapping(project: ProjectManager | None = None) dict[str, dict]
-

Configured interface imports from dependencies.

-
- -
-
-get_imports(contract_filepaths: Iterable[Path], project: ProjectManager | None = None) dict[str, list[str]]
-

Returns a list of imports as source_ids for each contract’s source_id in a given -compiler.

-
-
Parameters:
-
    -
  • contract_filepaths (Iterable[pathlib.Path]) – A list of source file paths to compile.

  • -
  • project (Optional[ProjectManager]) – Optionally provide -the project containing the base paths and full source set. Defaults to the local -project. Dependencies will change this value to their respective projects.

  • -
-
-
Returns:
-

A dictionary like {source_id: [import_source_id, ...], ...}

-
-
Return type:
-

dict[str, list[str]]

-
-
-
- -
-
-get_version_map(contract_filepaths: Iterable[Path], project: ProjectManager | None = None) dict[packaging.version.Version, set[pathlib.Path]]
-

Get a map of versions to source paths.

-
-
Parameters:
-
    -
  • contract_filepaths (Iterable[Path]) – Input source paths. Defaults to all source paths -per compiler.

  • -
  • project (Optional[ProjectManager]) – Optionally provide -the project containing the base paths and full source set. Defaults to the local -project. Dependencies will change this value to their respective projects.

  • -
-
-
Returns:
-

dict[Version, set[Path]]

-
-
-
- -
-
-get_versions(all_paths: Iterable[Path]) set[str]
-

Retrieve the set of available compiler versions for this plugin to compile all_paths.

-
-
Parameters:
-

all_paths (Iterable[pathlib.Path]) – The list of paths.

-
-
Returns:
-

A set of available compiler versions.

-
-
Return type:
-

set[str]

-
-
-
- -
-
-init_coverage_profile(source_coverage: ContractSourceCoverage, contract_source: ContractSource)
-

Initialize an empty report for the given source ID. Modifies the given source -coverage in-place.

-
-
Parameters:
-
    -
  • source_coverage (SourceCoverage) – The source -to generate an empty coverage profile for.

  • -
  • contract_source (ethpm_types.source.ContractSource) – The contract with -source content.

  • -
-
-
-
- -
-
-property name: str
-

The name of the compiler.

-
- -
-
-trace_source(contract_source: ContractSource, trace: TraceAPI, calldata: HexBytes) SourceTraceback
-

Get a source-traceback for the given contract type. -The source traceback object contains all the control paths taken in the transaction. -When available, source-code location information is accessible from the object.

-
-
Parameters:
-
    -
  • contract_source (ContractSource) – A contract type with a local-source that was -compiled by this compiler.

  • -
  • trace (TraceAPI]) – The resulting trace from executing a -function defined in the given contract type.

  • -
  • calldata (HexBytes) – Calldata passed to the top-level call.

  • -
-
-
Returns:
-

SourceTraceback

-
-
-
- -
- -
-
-class ape_vyper.compiler.VyperConfig(_case_sensitive: bool | None = None, _env_prefix: str | None = None, _env_file: DotenvType | None = PosixPath('.'), _env_file_encoding: str | None = None, _env_ignore_empty: bool | None = None, _env_nested_delimiter: str | None = None, _env_parse_none_str: str | None = None, _env_parse_enums: bool | None = None, _cli_prog_name: str | None = None, _cli_parse_args: bool | list[str] | tuple[str, ...] | None = None, _cli_settings_source: CliSettingsSource[Any] | None = None, _cli_parse_none_str: str | None = None, _cli_hide_none_type: bool | None = None, _cli_avoid_json: bool | None = None, _cli_enforce_required: bool | None = None, _cli_use_class_docs_for_groups: bool | None = None, _cli_exit_on_error: bool | None = None, _cli_prefix: str | None = None, _secrets_dir: str | Path | None = None, *, version: SpecifierSet | None = None, evm_version: str | None = None, import_remapping: list[ape_vyper.compiler.Remapping] = [], **values: Any)
-
-
-evm_version: str | None
-

The evm-version or hard-fork name.

-
- -
-
-import_remapping: list[ape_vyper.compiler.Remapping]
-

Configuration of an import name mapped to a dependency listing. -To use a specific version of a dependency, specify using @ symbol.

-

Usage example:

-
vyper:
-  import_remapping:
-    - "dep_a=dependency_a@0.1.1"
-    - "dep_b=dependency"  # Uses only version. Will raise if more than 1.
-
-
-
- -
-
-version: SpecifierSet | None
-

Configure a version to use for all files, -regardless of pragma.

-
- -
- -
-
-ape_vyper.compiler.get_evmversion_pragma(source: str | Path) str | None
-

Extracts evm version pragma information from Vyper source code.

-
-
Parameters:
-

source (Union[str, Path]) – Vyper source code

-
-
Returns:
-

str, or None if no valid pragma is found.

-
-
-
- -
-
-ape_vyper.compiler.get_optimization_pragma(source: str | Path) str | None
-

Extracts optimization pragma information from Vyper source code.

-
-
Parameters:
-

source (Union[str, Path]) – Vyper source code

-
-
Returns:
-

str, or None if no valid pragma is found.

-
-
-
- -
-
-ape_vyper.compiler.get_version_pragma_spec(source: str | Path) SpecifierSet | None
-

Extracts version pragma information from Vyper source code.

-
-
Parameters:
-

source (str) – Vyper source code

-
-
Returns:
-

packaging.specifiers.SpecifierSet, or None if no valid pragma is found.

-
-
-
- -
- -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/latest/methoddocs/exceptions.html b/latest/methoddocs/exceptions.html deleted file mode 100644 index 75db9da7..00000000 --- a/latest/methoddocs/exceptions.html +++ /dev/null @@ -1,261 +0,0 @@ - - - - - Exceptions - ape-vyper documentation - - - - - - - - - - - - -
-
-
- - - - ape-vyper - -
- -
-
-
-
-
-
-
- - - - -
-
-
-
-

Exceptions

-
-
-exception ape_vyper.exceptions.DivisionByZeroError(**kwargs)
-

Raised when dividing by zero.

-
- -
-
-exception ape_vyper.exceptions.FallbackNotDefinedError(**kwargs)
-

Raised when calling a contract directly (with missing method bytes) that has no fallback -method defined in its ABI.

-
- -
-
-exception ape_vyper.exceptions.IndexOutOfRangeError(**kwargs)
-

Raised when accessing an array using an out-of-range index.

-
- -
-
-exception ape_vyper.exceptions.IntegerBoundsCheck(_type: str, **kwargs)
-

Raised when receiving any integer bounds check failure.

-
- -
-
-exception ape_vyper.exceptions.IntegerOverflowError(**kwargs)
-

Raised when addition results in an integer exceeding its max size.

-
- -
-
-exception ape_vyper.exceptions.IntegerUnderflowError(**kwargs)
-

Raised when addition results in an integer exceeding its max size.

-
- -
-
-exception ape_vyper.exceptions.InvalidCalldataOrValueError(**kwargs)
-

Raises on Vyper versions >= 0.3.10 in place of NonPayableError.

-
- -
-
-exception ape_vyper.exceptions.ModuloByZeroError(**kwargs)
-

Raised when modding by zero.

-
- -
-
-exception ape_vyper.exceptions.NonPayableError(**kwargs)
-

Raised when sending ether to a non-payable function.

-
- -
-
-class ape_vyper.exceptions.RuntimeErrorType(value)
-

An enumeration.

-
- -
-
-exception ape_vyper.exceptions.VyperCompileError(err: VyperError | str)
-

A compiler-specific error in Vyper.

-
- -
-
-exception ape_vyper.exceptions.VyperCompilerPluginError
-

An error raised in the Vyper compiler.

-
- -
-
-exception ape_vyper.exceptions.VyperInstallError
-

An error raised failing to install Vyper.

-
- -
-
-exception ape_vyper.exceptions.VyperRuntimeError(error_type: RuntimeErrorType | str, **kwargs)
-

An error raised when running EVM code, such as a index or math error. -It is a type of ContractLogicError where the code came from the -compiler and not directly from the source.

-
- -
- -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/latest/methoddocs/interface.html b/latest/methoddocs/interface.html deleted file mode 100644 index 303a4514..00000000 --- a/latest/methoddocs/interface.html +++ /dev/null @@ -1,236 +0,0 @@ - - - - - Interface - ape-vyper documentation - - - - - - - - - - - - -
-
-
- - - - ape-vyper - -
- -
-
-
-
-
-
-
- - - - -
-
-
-
-

Interface

-

Tools for working with ABI specs and Vyper interface source code

-
-
-ape_vyper.interface.abi_to_type(iface: dict[str, Any]) ConstructorABI | FallbackABI | ReceiveABI | MethodABI | EventABI | ErrorABI | StructABI | UnprocessedABI | None
-

Convert a dict JSON-like interface to an ethpm-types ABI type

-
- -
-
-ape_vyper.interface.extract_import_aliases(source: str) dict[str, str]
-

Extract import aliases from import lines

-
-
Returns:
-

{import: alias}

-
-
Return type:
-

Dict[str, str]

-
-
-
- -
-
-ape_vyper.interface.extract_imports(source: str) tuple[str, str, str]
-

Extract import lines from the source, return them and the source without imports

-
-
Returns:
-

(stdlib_import_lines, interface_import_lines, cleaned_source)

-
-
Return type:
-

Tuple[str, str, str]

-
-
-
- -
-
-ape_vyper.interface.extract_meta(source_code: str) tuple[Optional[str], str]
-

Extract version pragma, and return cleaned source

-
- -
-
-ape_vyper.interface.generate_inputs(inputs: list[ethpm_types.abi.ABIType]) str
-

Generate the source code input args from ABI inputs

-
- -
-
-ape_vyper.interface.generate_interface(abi: list[dict[str, Any]] | list[Union[ethpm_types.abi.ConstructorABI, ethpm_types.abi.FallbackABI, ethpm_types.abi.ReceiveABI, ethpm_types.abi.MethodABI, ethpm_types.abi.EventABI, ethpm_types.abi.ErrorABI, ethpm_types.abi.StructABI, ethpm_types.abi.UnprocessedABI]], iface_name: str) str
-

Generate a Vyper interface source code from an ABI spec

-
-
Parameters:
-
    -
  • abi (List[Union[Dict[str, Any], ABI]]) – An ABI spec for a contract

  • -
  • iface_name (str) – The name of the interface

  • -
-
-
Returns:
-

str Vyper source code for the interface

-
-
-
- -
-
-ape_vyper.interface.generate_method(abi: MethodABI) str
-

Generate Vyper interface method definition

-
- -
-
-ape_vyper.interface.indent_line(line: str, level=1) str
-

Indent a source line of code

-
- -
- -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/latest/objects.inv b/latest/objects.inv deleted file mode 100644 index 2fcdcb64921487ae1f97b03a514a29bd161397ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 795 zcmV+$1LXW8AX9K?X>NERX>N99Zgg*Qc_4OWa&u{KZXhxWBOp+6Z)#;@bUGkmaAhra zd2nTN3L_v^WpZ8b#rNMXCQiPX<{x4c-pm>O>^5I5Qgvi70k3(JIyu6e9h#L*mc?*dSNhH z$xIMXK(5ta-$jZXIhE4Z-d;Qd>^^#d{lLNj-!=~XT-wSh4W7B?qOy6dfqh~X#Es2! zE5lj8KHtPjf9Nb`AK5Guzai$g`1=K?5=&|k0z02ZO)yqa3Fnk4Pk}t8;niSgB%pq} zJ*pN&MdZ@vlvprc$qfhZttZ45TEqwj)tcyqjD+YCBJY=YfEY0X0x@4z&icsxFv7_3 z)S|cGgR+LB=Kn*c6s(L&*N9|M0(agPwCQ3*)#8wh)3G@jn8Fx%u(g*YI!&P{3Rl9+ zVO#Zgl#rNuUajj0Ct}C4fQn5dH$^Azz7Kte(Nu{9EoviU`oM8a>!PaEPZ3F}hcbC^ zAdjQMPJ)a3lpJZsuNLpL z;$&C}248d$xH7IL5I5ir?wJPp@`5{+r?B*z$Tc>%e`2AIt|a# z*7msU)eKq5XkgK161&E4WFv2fq0`jUg7t+X8%??i#G9;SH~Vomw(SYZ;jys0ewbmJ zjvS6_X8l6vaNi|-cT9uTKe#O$RA3Ih0|+lShmPG`=kwUDFY)h6RtNB9t#Sxw-)kkG Zu{ioT+~TM~$N8Mb>@iJbzW^tWb@-X#e~AD9 diff --git a/latest/py-modindex.html b/latest/py-modindex.html deleted file mode 100644 index 08c1b4fb..00000000 --- a/latest/py-modindex.html +++ /dev/null @@ -1,120 +0,0 @@ - - - - - Python Module Index - ape-vyper documentation - - - - - - - - - - - -
-
-
- - - - ape-vyper - -
- -
-
-
-
-
-
-
- - -
-
- - - - - - - - \ No newline at end of file diff --git a/latest/search.html b/latest/search.html deleted file mode 100644 index c636fd31..00000000 --- a/latest/search.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - Search - ape-vyper documentation - - - - - - - - - - - -
-
-
- - - - ape-vyper - -
- -
-
-
-
-
-
-
-
- -

Search

- - - - -

- Searching for multiple words only shows matches that contain - all words. -

- - -
- - -
-

- - - -
- -
- - -
- -
-
- - - - - - - - - - - \ No newline at end of file diff --git a/latest/searchindex.js b/latest/searchindex.js deleted file mode 100644 index 95c8f625..00000000 --- a/latest/searchindex.js +++ /dev/null @@ -1 +0,0 @@ -Search.setIndex({"docnames": ["index", "methoddocs/compiler", "methoddocs/exceptions", "methoddocs/interface", "userguides/quickstart"], "filenames": ["index.md", "methoddocs/compiler.md", "methoddocs/exceptions.md", "methoddocs/interface.md", "userguides/quickstart.md"], "titles": ["Vyper Docs", "Compiler", "Exceptions", "Interface", "Quick Start"], "terms": {"quick": 0, "start": 0, "compil": [0, 2], "except": [0, 1], "interfac": [0, 1], "class": [1, 2], "ape_vyp": [1, 2, 3], "filetyp": 1, "valu": [1, 2, 4], "an": [1, 2, 3, 4], "enumer": [1, 2], "remap": 1, "_case_sensit": 1, "bool": 1, "none": [1, 3], "_env_prefix": 1, "str": [1, 2, 3], "_env_fil": 1, "dotenvtyp": 1, "posixpath": 1, "_env_file_encod": 1, "_env_ignore_empti": 1, "_env_nested_delimit": 1, "_env_parse_none_str": 1, "_env_parse_enum": 1, "_cli_prog_nam": 1, "_cli_parse_arg": 1, "list": [1, 3, 4], "tupl": [1, 3], "_cli_settings_sourc": 1, "clisettingssourc": 1, "ani": [1, 2, 3, 4], "_cli_parse_none_str": 1, "_cli_hide_none_typ": 1, "_cli_avoid_json": 1, "_cli_enforce_requir": 1, "_cli_use_class_docs_for_group": 1, "_cli_exit_on_error": 1, "_cli_prefix": 1, "_secrets_dir": 1, "path": 1, "kei": [1, 4], "dependency_nam": 1, "dependency_vers": 1, "vypercompil": 1, "compiler_set": 1, "dict": [1, 3], "contract_filepath": 1, "iter": 1, "project": [1, 4], "projectmanag": 1, "set": [1, 4], "contracttyp": [1, 4], "given": 1, "sourc": [1, 2, 3, 4], "file": [1, 4], "all": 1, "plugin": [1, 4], "must": [1, 4], "implement": 1, "thi": [1, 4], "function": [1, 2], "paramet": [1, 3], "pathlib": 1, "A": [1, 2], "option": [1, 3], "provid": 1, "contain": 1, "base": [1, 4], "full": 1, "default": [1, 4], "local": 1, "depend": 1, "chang": 1, "respect": 1, "adhoc": 1, "return": [1, 3], "compile_cod": 1, "code": [1, 2, 3], "kwarg": [1, 2], "program": 1, "The": [1, 3, 4], "addit": [1, 2], "overrid": [1, 4], "ethpm_typ": [1, 3], "model": 1, "contract": [1, 2, 3], "artifact": 1, "type": [1, 2, 3, 4], "enrich_error": 1, "err": [1, 2], "contractlogicerror": [1, 2], "enrich": 1, "logic": 1, "error": [1, 2], "us": [1, 2, 4], "inform": 1, "known": 1, "pc": 1, "locat": 1, "runtim": 1, "flatten_contract": 1, "content": 1, "flatten": 1, "suitabl": 1, "verif": 1, "singl": [1, 4], "get_compiler_set": 1, "packag": 1, "version": [1, 2, 3], "get": [1, 4], "map": 1, "would": 1, "each": 1, "number": 1, "get_import_remap": 1, "configur": [1, 4], "import": [1, 3, 4], "from": [1, 2, 3, 4], "get_import": 1, "source_id": 1, "": [1, 4], "dictionari": 1, "like": [1, 3, 4], "import_source_id": 1, "get_version_map": 1, "input": [1, 3], "per": 1, "get_vers": 1, "all_path": 1, "retriev": 1, "avail": [1, 4], "init_coverage_profil": 1, "source_coverag": 1, "contractsourcecoverag": 1, "contract_sourc": 1, "contractsourc": 1, "initi": 1, "empti": 1, "report": [1, 4], "id": 1, "modifi": 1, "coverag": 1, "place": [1, 2, 4], "sourcecoverag": 1, "gener": [1, 3], "profil": 1, "properti": 1, "name": [1, 3, 4], "trace_sourc": 1, "trace": 1, "traceapi": 1, "calldata": 1, "hexbyt": 1, "sourcetraceback": 1, "traceback": 1, "object": 1, "control": 1, "taken": 1, "transact": 1, "when": [1, 2, 4], "i": [1, 2, 4], "access": [1, 2], "wa": 1, "result": [1, 2], "execut": 1, "defin": [1, 2], "pass": 1, "top": 1, "level": [1, 3], "call": [1, 2], "vyperconfig": 1, "specifierset": 1, "evm_vers": [1, 4], "import_remap": [1, 4], "evm": [1, 2], "hard": 1, "fork": 1, "To": 1, "specif": [1, 2, 4], "specifi": [1, 4], "symbol": 1, "usag": 1, "exampl": [1, 4], "vyper": [1, 2, 3, 4], "dep_a": 1, "dependency_a": 1, "0": [1, 2, 4], "1": [1, 3], "dep_b": 1, "onli": 1, "Will": 1, "rais": [1, 2], "more": 1, "than": 1, "regardless": 1, "pragma": [1, 3], "get_evmversion_pragma": 1, "extract": [1, 3], "union": [1, 3], "valid": [1, 4], "found": [1, 4], "get_optimization_pragma": 1, "optim": 1, "get_version_pragma_spec": 1, "divisionbyzeroerror": 2, "divid": 2, "zero": 2, "fallbacknotdefinederror": 2, "directli": [2, 4], "miss": 2, "method": [2, 3], "byte": 2, "ha": 2, "fallback": 2, "its": 2, "abi": [2, 3], "indexoutofrangeerror": 2, "arrai": 2, "out": [2, 4], "rang": 2, "index": 2, "integerboundscheck": 2, "_type": 2, "receiv": 2, "integ": 2, "bound": 2, "check": 2, "failur": 2, "integeroverflowerror": 2, "exceed": 2, "max": 2, "size": 2, "integerunderflowerror": 2, "invalidcalldataorvalueerror": 2, "3": [2, 4], "10": [2, 4], "nonpayableerror": 2, "modulobyzeroerror": 2, "mod": 2, "send": 2, "ether": 2, "non": 2, "payabl": 2, "runtimeerrortyp": 2, "vypercompileerror": 2, "vypererror": 2, "vypercompilerpluginerror": 2, "vyperinstallerror": 2, "fail": 2, "instal": 2, "vyperruntimeerror": 2, "error_typ": 2, "run": [2, 4], "math": 2, "It": 2, "where": [2, 4], "came": 2, "tool": 3, "work": 3, "spec": 3, "abi_to_typ": 3, "ifac": [3, 4], "constructorabi": 3, "fallbackabi": 3, "receiveabi": 3, "methodabi": 3, "eventabi": 3, "errorabi": 3, "structabi": 3, "unprocessedabi": 3, "convert": 3, "json": [3, 4], "ethpm": 3, "extract_import_alias": 3, "alias": 3, "line": 3, "alia": 3, "extract_import": 3, "them": [3, 4], "without": 3, "stdlib_import_lin": 3, "interface_import_lin": 3, "cleaned_sourc": 3, "extract_meta": 3, "source_cod": 3, "clean": 3, "generate_input": 3, "abityp": 3, "arg": 3, "generate_interfac": 3, "iface_nam": 3, "generate_method": 3, "definit": 3, "indent_lin": 3, "indent": 3, "ap": 4, "around": 4, "vvm": 4, "python3": 4, "up": 4, "12": 4, "you": 4, "can": 4, "latest": 4, "releas": 4, "clone": 4, "repositori": 4, "most": 4, "date": 4, "git": 4, "http": 4, "github": 4, "com": 4, "apeworx": 4, "cd": 4, "setup": 4, "py": 4, "first": 4, "extens": 4, "vy": 4, "your": 4, "folder": 4, "here": 4, "Then": 4, "root": 4, "command": 4, "deploi": 4, "interact": 4, "For": 4, "eas": 4, "publish": 4, "some": 4, "other": 4, "case": 4, "sometim": 4, "combin": 4, "togeth": 4, "wai": 4, "understand": 4, "do": 4, "so": 4, "mycontract": 4, "build": 4, "mycontractflatten": 4, "warn": 4, "featur": 4, "experiment": 4, "pleas": 4, "bug": 4, "find": 4, "try": 4, "By": 4, "howev": 4, "also": 4, "config": 4, "yaml": 4, "7": 4, "whatev": 4, "rule": 4, "ar": 4, "what": 4, "comment": 4, "post": 4, "v0": 4, "might": 4, "want": 4, "differ": 4, "arbitrum": 4, "new": 4, "opcod": 4, "support": 4, "yet": 4, "If": 4, "requir": 4, "pari": 4, "note": 4, "chosen": 4, "thu": 4, "directori": 4, "contracts_fold": 4, "e": 4, "g": 4, "altern": 4, "under": 4, "vote": 4, "vyperlang": 4, "repo": 4, "vypervot": 4, "8": 4, "automat": 4, "allow": 4, "ballot": 4, "format": 4, "codes": 4}, "objects": {"ape_vyper": [[1, 0, 0, "-", "compiler"], [2, 0, 0, "-", "exceptions"], [3, 0, 0, "-", "interface"]], "ape_vyper.compiler": [[1, 1, 1, "", "FileType"], [1, 1, 1, "", "Remapping"], [1, 1, 1, "", "VyperCompiler"], [1, 1, 1, "", "VyperConfig"], [1, 5, 1, "", "get_evmversion_pragma"], [1, 5, 1, "", "get_optimization_pragma"], [1, 5, 1, "", "get_version_pragma_spec"]], "ape_vyper.compiler.VyperCompiler": [[1, 2, 1, "", "compile"], [1, 2, 1, "", "compile_code"], [1, 2, 1, "", "enrich_error"], [1, 2, 1, "", "flatten_contract"], [1, 2, 1, "", "get_compiler_settings"], [1, 2, 1, "", "get_import_remapping"], [1, 2, 1, "", "get_imports"], [1, 2, 1, "", "get_version_map"], [1, 2, 1, "", "get_versions"], [1, 2, 1, "", "init_coverage_profile"], [1, 3, 1, "", "name"], [1, 2, 1, "", "trace_source"]], "ape_vyper.compiler.VyperConfig": [[1, 4, 1, "", "evm_version"], [1, 4, 1, "", "import_remapping"], [1, 4, 1, "", "version"]], "ape_vyper.exceptions": [[2, 6, 1, "", "DivisionByZeroError"], [2, 6, 1, "", "FallbackNotDefinedError"], [2, 6, 1, "", "IndexOutOfRangeError"], [2, 6, 1, "", "IntegerBoundsCheck"], [2, 6, 1, "", "IntegerOverflowError"], [2, 6, 1, "", "IntegerUnderflowError"], [2, 6, 1, "", "InvalidCalldataOrValueError"], [2, 6, 1, "", "ModuloByZeroError"], [2, 6, 1, "", "NonPayableError"], [2, 1, 1, "", "RuntimeErrorType"], [2, 6, 1, "", "VyperCompileError"], [2, 6, 1, "", "VyperCompilerPluginError"], [2, 6, 1, "", "VyperInstallError"], [2, 6, 1, "", "VyperRuntimeError"]], "ape_vyper.interface": [[3, 5, 1, "", "abi_to_type"], [3, 5, 1, "", "extract_import_aliases"], [3, 5, 1, "", "extract_imports"], [3, 5, 1, "", "extract_meta"], [3, 5, 1, "", "generate_inputs"], [3, 5, 1, "", "generate_interface"], [3, 5, 1, "", "generate_method"], [3, 5, 1, "", "indent_line"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:method", "3": "py:property", "4": "py:attribute", "5": "py:function", "6": "py:exception"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "method", "Python method"], "3": ["py", "property", "Python property"], "4": ["py", "attribute", "Python attribute"], "5": ["py", "function", "Python function"], "6": ["py", "exception", "Python exception"]}, "titleterms": {"vyper": 0, "doc": 0, "user": 0, "guid": 0, "python": 0, "refer": 0, "compil": [1, 4], "except": 2, "interfac": [3, 4], "quick": 4, "start": 4, "depend": 4, "instal": 4, "via": 4, "pip": 4, "setuptool": 4, "usag": 4, "contract": 4, "flatten": 4, "version": 4, "evm": 4, "pragma": 4, "optim": 4}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 57}, "alltitles": {"Vyper Docs": [[0, "vyper-docs"]], "User Guides": [[0, null]], "Python Reference": [[0, null]], "Compiler": [[1, "module-ape_vyper.compiler"]], "Exceptions": [[2, "module-ape_vyper.exceptions"]], "Interface": [[3, "module-ape_vyper.interface"]], "Quick Start": [[4, "quick-start"]], "Dependencies": [[4, "dependencies"]], "Installation": [[4, "installation"]], "via pip": [[4, "via-pip"]], "via setuptools": [[4, "via-setuptools"]], "Quick Usage": [[4, "quick-usage"]], "Contract Flattening": [[4, "contract-flattening"]], "Compiler Version": [[4, "compiler-version"]], "EVM Versioning": [[4, "evm-versioning"]], "Interfaces": [[4, "interfaces"]], "Pragmas": [[4, "pragmas"]], "Version Pragma": [[4, "version-pragma"]], "EVM Version Pragma": [[4, "evm-version-pragma"]], "Optimization Pragma": [[4, "optimization-pragma"]]}, "indexentries": {"filetype (class in ape_vyper.compiler)": [[1, "ape_vyper.compiler.FileType"]], "remapping (class in ape_vyper.compiler)": [[1, "ape_vyper.compiler.Remapping"]], "vypercompiler (class in ape_vyper.compiler)": [[1, "ape_vyper.compiler.VyperCompiler"]], "vyperconfig (class in ape_vyper.compiler)": [[1, "ape_vyper.compiler.VyperConfig"]], "ape_vyper.compiler": [[1, "module-ape_vyper.compiler"]], "compile() (ape_vyper.compiler.vypercompiler method)": [[1, "ape_vyper.compiler.VyperCompiler.compile"]], "compile_code() (ape_vyper.compiler.vypercompiler method)": [[1, "ape_vyper.compiler.VyperCompiler.compile_code"]], "enrich_error() (ape_vyper.compiler.vypercompiler method)": [[1, "ape_vyper.compiler.VyperCompiler.enrich_error"]], "evm_version (ape_vyper.compiler.vyperconfig attribute)": [[1, "ape_vyper.compiler.VyperConfig.evm_version"]], "flatten_contract() (ape_vyper.compiler.vypercompiler method)": [[1, "ape_vyper.compiler.VyperCompiler.flatten_contract"]], "get_compiler_settings() (ape_vyper.compiler.vypercompiler method)": [[1, "ape_vyper.compiler.VyperCompiler.get_compiler_settings"]], "get_evmversion_pragma() (in module ape_vyper.compiler)": [[1, "ape_vyper.compiler.get_evmversion_pragma"]], "get_import_remapping() (ape_vyper.compiler.vypercompiler method)": [[1, "ape_vyper.compiler.VyperCompiler.get_import_remapping"]], "get_imports() (ape_vyper.compiler.vypercompiler method)": [[1, "ape_vyper.compiler.VyperCompiler.get_imports"]], "get_optimization_pragma() (in module ape_vyper.compiler)": [[1, "ape_vyper.compiler.get_optimization_pragma"]], "get_version_map() (ape_vyper.compiler.vypercompiler method)": [[1, "ape_vyper.compiler.VyperCompiler.get_version_map"]], "get_version_pragma_spec() (in module ape_vyper.compiler)": [[1, "ape_vyper.compiler.get_version_pragma_spec"]], "get_versions() (ape_vyper.compiler.vypercompiler method)": [[1, "ape_vyper.compiler.VyperCompiler.get_versions"]], "import_remapping (ape_vyper.compiler.vyperconfig attribute)": [[1, "ape_vyper.compiler.VyperConfig.import_remapping"]], "init_coverage_profile() (ape_vyper.compiler.vypercompiler method)": [[1, "ape_vyper.compiler.VyperCompiler.init_coverage_profile"]], "module": [[1, "module-ape_vyper.compiler"], [2, "module-ape_vyper.exceptions"], [3, "module-ape_vyper.interface"]], "name (ape_vyper.compiler.vypercompiler property)": [[1, "ape_vyper.compiler.VyperCompiler.name"]], "trace_source() (ape_vyper.compiler.vypercompiler method)": [[1, "ape_vyper.compiler.VyperCompiler.trace_source"]], "version (ape_vyper.compiler.vyperconfig attribute)": [[1, "ape_vyper.compiler.VyperConfig.version"]], "divisionbyzeroerror": [[2, "ape_vyper.exceptions.DivisionByZeroError"]], "fallbacknotdefinederror": [[2, "ape_vyper.exceptions.FallbackNotDefinedError"]], "indexoutofrangeerror": [[2, "ape_vyper.exceptions.IndexOutOfRangeError"]], "integerboundscheck": [[2, "ape_vyper.exceptions.IntegerBoundsCheck"]], "integeroverflowerror": [[2, "ape_vyper.exceptions.IntegerOverflowError"]], "integerunderflowerror": [[2, "ape_vyper.exceptions.IntegerUnderflowError"]], "invalidcalldataorvalueerror": [[2, "ape_vyper.exceptions.InvalidCalldataOrValueError"]], "modulobyzeroerror": [[2, "ape_vyper.exceptions.ModuloByZeroError"]], "nonpayableerror": [[2, "ape_vyper.exceptions.NonPayableError"]], "runtimeerrortype (class in ape_vyper.exceptions)": [[2, "ape_vyper.exceptions.RuntimeErrorType"]], "vypercompileerror": [[2, "ape_vyper.exceptions.VyperCompileError"]], "vypercompilerpluginerror": [[2, "ape_vyper.exceptions.VyperCompilerPluginError"]], "vyperinstallerror": [[2, "ape_vyper.exceptions.VyperInstallError"]], "vyperruntimeerror": [[2, "ape_vyper.exceptions.VyperRuntimeError"]], "ape_vyper.exceptions": [[2, "module-ape_vyper.exceptions"]], "abi_to_type() (in module ape_vyper.interface)": [[3, "ape_vyper.interface.abi_to_type"]], "ape_vyper.interface": [[3, "module-ape_vyper.interface"]], "extract_import_aliases() (in module ape_vyper.interface)": [[3, "ape_vyper.interface.extract_import_aliases"]], "extract_imports() (in module ape_vyper.interface)": [[3, "ape_vyper.interface.extract_imports"]], "extract_meta() (in module ape_vyper.interface)": [[3, "ape_vyper.interface.extract_meta"]], "generate_inputs() (in module ape_vyper.interface)": [[3, "ape_vyper.interface.generate_inputs"]], "generate_interface() (in module ape_vyper.interface)": [[3, "ape_vyper.interface.generate_interface"]], "generate_method() (in module ape_vyper.interface)": [[3, "ape_vyper.interface.generate_method"]], "indent_line() (in module ape_vyper.interface)": [[3, "ape_vyper.interface.indent_line"]]}}) \ No newline at end of file diff --git a/latest/userguides/quickstart.html b/latest/userguides/quickstart.html deleted file mode 100644 index 82e6f548..00000000 --- a/latest/userguides/quickstart.html +++ /dev/null @@ -1,300 +0,0 @@ - - - - - Quick Start - ape-vyper documentation - - - - - - - - - - - - -
-
-
- - - - ape-vyper - -
- -
-
-
-
-
-
-
- - - - -
-
-
-
-

Quick Start

-

Ape compiler plugin around VVM

-
-

Dependencies

-
    -
  • python3 version 3.10 up to 3.12.

  • -
-
-
-

Installation

-
-

via pip

-

You can install the latest release via pip:

-
pip install ape-vyper
-
-
-
-
-

via setuptools

-

You can clone the repository and use setuptools for the most up-to-date version:

-
git clone https://github.com/ApeWorX/ape-vyper.git
-cd ape-vyper
-python3 setup.py install
-
-
-
-
-
-

Quick Usage

-

First, place Vyper contract source files (files with extension .vy) in your Ape project’s contracts folder. -An example Vyper contract can be found here. -Then, from your root Ape project folder, run the command:

-
ape compile
-
-
-

The .vy files in your project will compile into ContractTypes that you can deploy and interact with in Ape.

-
-

Contract Flattening

-

For ease of publishing, validation, and some other cases it’s sometimes useful to “flatten” your contract into a single file. -This combines your contract and any imported interfaces together in a way the compiler can understand. -You can do so with a command like this:

-
ape vyper flatten contracts/MyContract.vy build/MyContractFlattened.vy
-
-
-
-

[!WARNING] -This feature is experimental. Please report any bugs you find when trying it out.

-
-
-
-

Compiler Version

-

By default, the ape-vyper plugin uses version pragma for version specification. -However, you can also configure the version directly in your ape-config.yaml file:

-
vyper:
-  version: 0.3.7
-
-
-
-
-

EVM Versioning

-

By default, ape-vyper will use whatever version of EVM rules are set as default in the compiler version that gets used, -or based on what the #pragma evm-version ... pragma comment specifies (available post-v0.3.10). -Sometimes, you might want to use a different version, such as deploying on Arbitrum or Optimism where new opcodes are not supported yet. -If you want to require a different version of EVM rules to use in the configuration of the compiler, set it in your ape-config.yaml like this:

-
vyper:
-  evm_version: paris
-
-
-

NOTE: The config value chosen will not override if a pragma is set in a contract.

-
-
-

Interfaces

-

You can not compile interface source files directly. -Thus, you must place interface files in a directory named interfaces in your contracts_folder e.g. contracts/interfaces/IFace.vy. -Then, these files can be imported in other .vy sources files via:

-
import interfaces.IFace as IFace
-
-
-

Alternatively, use JSON interfaces from dependency contract types by listing them under the import_remapping key:

-
# Use `voting` example contracts from Vyperlang repo.
-dependencies:
-  - name: VyperVoting
-    github: vyperlang/vyper
-    contracts_folder: examples/voting/
-    version: v0.3.8
-
-# Automatically allow importing voting contracts in your project.
-vyper:
-  import_remapping:
-    - "voting=VyperVoting@v0.3.8"
-
-
-

Import the voting contract types like this:

-
# @version 0.3.10
-
-import voting.ballot as ballot
-
-
-
-
-

Pragmas

-

Ape-Vyper supports Vyper 0.3.10’s new pragma formats

-
-

Version Pragma

-
#pragma version 0.3.10
-
-
-
-
-

EVM Version Pragma

-
#pragma evm-version paris
-
-
-
-
-

Optimization Pragma

-
#pragma optimize codesize
-
-
-
-
-
-
- -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml deleted file mode 100644 index 196f5504..00000000 --- a/pyproject.toml +++ /dev/null @@ -1,38 +0,0 @@ -[build-system] -requires = ["setuptools>=51.1.1", "wheel", "setuptools_scm[toml]>=5.0"] - -[tool.mypy] -exclude = "build/" -plugins = ["pydantic.mypy"] - -[tool.setuptools_scm] -write_to = "ape_vyper/version.py" - -# NOTE: you have to use single-quoted strings in TOML for regular expressions. -# It's the equivalent of r-strings in Python. Multiline strings are treated as -# verbose regular expressions by Black. Use [ ] to denote a significant space -# character. - -[tool.black] -line-length = 100 -target-version = ['py310', 'py311', 'py312'] -include = '\.pyi?$' - -[tool.pytest.ini_options] -norecursedirs = "projects" -addopts = """ - -p no:ape_test -""" -python_files = "test_*.py" -testpaths = "tests" -markers = "fuzzing: Run Hypothesis fuzz test suite" - -[tool.isort] -line_length = 100 -force_grid_wrap = 0 -include_trailing_comma = true -multi_line_output = 3 -use_parentheses = true - -[tool.mdformat] -number = true diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index 1c2ef4d5..00000000 --- a/setup.cfg +++ /dev/null @@ -1,6 +0,0 @@ -[flake8] -max-line-length = 100 -exclude = - venv* - docs - build diff --git a/setup.py b/setup.py deleted file mode 100644 index ca1bc907..00000000 --- a/setup.py +++ /dev/null @@ -1,93 +0,0 @@ -#!/usr/bin/env python -from setuptools import find_packages, setup - -extras_require = { - "test": [ # `test` GitHub Action jobs uses this - "pytest>=6.0", # Core testing package - "pytest-mock", - "pytest-xdist", # multi-process runner - "pytest-cov", # Coverage analyzer plugin - "hypothesis>=6.2.0,<7.0", # Strategy-based fuzzer - "snekmate", # Python package-sources integration testing - ], - "lint": [ - "black>=24.4.2,<25", # Auto-formatter and linter - "mypy>=1.10.1,<2", # Static type analyzer - "types-setuptools", # Needed due to mypy typeshed - "flake8>=7.1.0,<8", # Style linter - "isort>=5.13.2", # Import sorting linter - "mdformat>=0.7.17", # Auto-formatter for markdown - "mdformat-gfm>=0.3.5", # Needed for formatting GitHub-flavored markdown - "mdformat-frontmatter>=0.4.1", # Needed for frontmatters-style headers in issue templates - "mdformat-pyproject>=0.0.1", # Allows configuring in pyproject.toml - ], - "release": [ # `release` GitHub Action job uses this - "setuptools", # Installation tool - "wheel", # Packaging tool - "twine", # Package upload tool - ], - "dev": [ - "commitizen", # Manage commits and publishing releases - "pre-commit", # Ensure that linters are run prior to committing - "pytest-watch", # `ptw` test watcher/runner - "IPython", # Console for interacting - "ipdb", # Debugger (Must use `export PYTHONBREAKPOINT=ipdb.set_trace`) - ], -} - -# NOTE: `pip install -e .[dev]` to install package -extras_require["dev"] = ( - extras_require["test"] - + extras_require["lint"] - + extras_require["release"] - + extras_require["dev"] -) - -with open("./README.md") as readme: - long_description = readme.read() - - -setup( - name="ape-vyper", - use_scm_version=True, - setup_requires=["setuptools_scm"], - description="Plugin for Ape Ethereum Framework for compiling Vyper contracts", - long_description=long_description, - long_description_content_type="text/markdown", - author="ApeWorX Ltd.", - author_email="admin@apeworx.io", - url="https://github.com/ApeWorX/ape-vyper", - include_package_data=True, - install_requires=[ - "eth-ape>=0.8.7,<0.9", - "ethpm-types", # Use same version as eth-ape - "tqdm", # Use same version as eth-ape - "vvm>=0.2.0,<0.3", - "vyper>=0.3.7,<0.5", - ], - python_requires=">=3.10,<4", - extras_require=extras_require, - py_modules=["ape_vyper"], - entry_points={ - "ape_cli_subcommands": [ - "ape_vyper=ape_vyper._cli:cli", - ], - }, - license="Apache-2.0", - zip_safe=False, - keywords="ethereum", - packages=find_packages(exclude=["tests", "tests.*"]), - package_data={"ape_vyper": ["py.typed"]}, - classifiers=[ - "Development Status :: 5 - Production/Stable", - "Intended Audience :: Developers", - "License :: OSI Approved :: MIT License", - "Natural Language :: English", - "Operating System :: MacOS", - "Operating System :: POSIX", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", - ], -) diff --git a/tests/ExampleDependency/contracts/Dependency.vy b/tests/ExampleDependency/contracts/Dependency.vy deleted file mode 100644 index 15e83484..00000000 --- a/tests/ExampleDependency/contracts/Dependency.vy +++ /dev/null @@ -1,4 +0,0 @@ -@view -@external -def read_stuff_2() -> uint256: - return 123 diff --git a/tests/__init__.py b/tests/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/ape-config.yaml b/tests/ape-config.yaml deleted file mode 100644 index bd35d1e3..00000000 --- a/tests/ape-config.yaml +++ /dev/null @@ -1,7 +0,0 @@ -# Allows compiling to work from the project-level. -contracts_folder: contracts/passing_contracts - -# Specify a dependency to use in Vyper imports. -dependencies: - - name: exampledependency - local: ./ExampleDependency diff --git a/tests/conftest.py b/tests/conftest.py deleted file mode 100644 index e2ce1825..00000000 --- a/tests/conftest.py +++ /dev/null @@ -1,218 +0,0 @@ -import os -import shutil -from contextlib import contextmanager -from pathlib import Path - -import ape -import pytest -import vvm # type: ignore -from ape.contracts import ContractContainer -from ape.utils import create_tempdir -from click.testing import CliRunner - -BASE_CONTRACTS_PATH = Path(__file__).parent / "contracts" -TEMPLATES_PATH = BASE_CONTRACTS_PATH / "templates" -FAILING_BASE = BASE_CONTRACTS_PATH / "failing_contracts" -PASSING_BASE = BASE_CONTRACTS_PATH / "passing_contracts" -ALL_VERSIONS = ( - "0.2.1", - "0.2.2", - "0.2.3", - "0.2.15", - "0.2.16", - "0.3.0", - "0.3.1", - "0.3.2", - "0.3.3", - "0.3.4", - "0.3.7", - "0.3.9", - "0.3.10", - "0.4.0", -) - -CONTRACT_VERSION_GEN_MAP = { - "": ( - "0.3.7", - "0.3.9", - "0.3.10", - ), - "sub_reverts": [v for v in ALL_VERSIONS if "0.4.0" not in v], -} - - -@pytest.fixture(scope="session", autouse=True) -def from_tests_dir(): - # Makes default project correct. - here = Path(__file__).parent - orig = Path.cwd() - if orig != here: - os.chdir(f"{here}") - - yield - - if Path.cwd() != orig: - os.chdir(f"{orig}") - - -@pytest.fixture(scope="session", autouse=True) -def config(): - with ape.config.isolate_data_folder(): - yield ape.config - - -def contract_test_cases(passing: bool) -> list[str]: - """ - Returns test-case names for outputting nicely with pytest. - """ - suffix = "passing_contracts" if passing else "failing_contracts" - return [p.name for p in (BASE_CONTRACTS_PATH / suffix).glob("*.vy") if p.is_file()] - - -PASSING_CONTRACT_NAMES = contract_test_cases(True) -FAILING_CONTRACT_NAMES = contract_test_cases(False) -TEMPLATES = [p.stem for p in TEMPLATES_PATH.glob("*.template") if p.is_file()] - - -# Needed for integration testing -pytest_plugins = ["pytester"] - - -@contextmanager -def _tmp_vvm_path(monkeypatch): - with create_tempdir() as path: - monkeypatch.setenv( - vvm.install.VVM_BINARY_PATH_VARIABLE, - f"{path}", - ) - yield path - - -@pytest.fixture( - scope="session", - autouse=os.environ.get("APE_VYPER_USE_SYSTEM_VYPER") is None, -) -def setup_session_vvm_path(request): - """ - Creates a new, temporary installation path for vvm when the test suite is - run. - - This ensures the Vyper installations do not conflict with the user's - installed versions and that the installations from the tests are cleaned up - after the suite is finished. - """ - from _pytest.monkeypatch import MonkeyPatch - - patch = MonkeyPatch() - request.addfinalizer(patch.undo) - - with _tmp_vvm_path(patch) as path: - yield path - - -@pytest.fixture(scope="session", autouse=True) -def generate_contracts(): - """ - Generate contracts from templates. This is used in - multi-version testing. - """ - for file in TEMPLATES_PATH.iterdir(): - if not file.is_file() or file.suffix != ".template": - continue - - versions = CONTRACT_VERSION_GEN_MAP.get(file.stem, CONTRACT_VERSION_GEN_MAP[""]) - for version in versions: - new_file = PASSING_BASE / f"{file.stem}_{version.replace('.', '')}.vy" - new_file.unlink(missing_ok=True) - new_file.write_text( - file.read_text(encoding="utf8").replace("{{VYPER_VERSION}}", version) - ) - - -@pytest.fixture -def temp_vvm_path(monkeypatch): - """ - Creates a new, temporary installation path for vvm for a given test. - """ - with _tmp_vvm_path(monkeypatch) as path: - yield path - - -@pytest.fixture -def compiler_manager(): - return ape.compilers - - -@pytest.fixture -def compiler(compiler_manager): - return compiler_manager.vyper - - -@pytest.fixture(scope="session", autouse=True) -def project(config): - project_source_dir = Path(__file__).parent - - # Delete build / .cache that may exist pre-copy - cache = project_source_dir / ".build" - shutil.rmtree(cache, ignore_errors=True) - - root_project = ape.Project(project_source_dir) - with root_project.isolate_in_tempdir() as tmp_project: - yield tmp_project - - -@pytest.fixture -def geth_provider(): - if not ape.networks.active_provider or ape.networks.provider.name != "node": - with ape.networks.ethereum.local.use_provider( - "node", provider_settings={"uri": "http://127.0.0.1:5550"} - ) as provider: - yield provider - else: - yield ape.networks.provider - - -@pytest.fixture -def projects_path(): - return Path(__file__).parent / "projects" - - -@pytest.fixture -def account(): - return ape.accounts.test_accounts[0] - - -@pytest.fixture(params=("037", "039", "0310")) -def traceback_contract(request, account, project, geth_provider): - return _get_tb_contract(request.param, project, account) - - -@pytest.fixture -def traceback_contract_037(account, project, geth_provider): - return _get_tb_contract("037", project, account) - - -@pytest.fixture -def traceback_contract_039(account, project, geth_provider): - return _get_tb_contract("039", project, account) - - -@pytest.fixture -def all_versions(): - return ALL_VERSIONS - - -@pytest.fixture -def cli_runner(): - return CliRunner() - - -def _get_tb_contract(version: str, project, account): - project.load_contracts() - - registry_type = project.get_contract(f"registry_{version}") - assert isinstance(registry_type, ContractContainer), "Setup failed - couldn't get container" - registry = account.deploy(registry_type) - contract = project.get_contract(f"traceback_contract_{version}") - assert isinstance(contract, ContractContainer), "Setup failed - couldn't get container" - return account.deploy(contract, registry) diff --git a/tests/contracts/failing_contracts/contract_undeclared_variable.vy b/tests/contracts/failing_contracts/contract_undeclared_variable.vy deleted file mode 100644 index 051f7ae0..00000000 --- a/tests/contracts/failing_contracts/contract_undeclared_variable.vy +++ /dev/null @@ -1,6 +0,0 @@ -# @version 0.2.16 - -@external -def foo1() -> bool: - hello = world - return True diff --git a/tests/contracts/failing_contracts/contract_unknown_pragma.vy b/tests/contracts/failing_contracts/contract_unknown_pragma.vy deleted file mode 100644 index 80c85cf5..00000000 --- a/tests/contracts/failing_contracts/contract_unknown_pragma.vy +++ /dev/null @@ -1,5 +0,0 @@ -# @version 14021.2222.8 - -@external -def foo1() -> bool: - return True diff --git a/tests/contracts/passing_contracts/DirectoryWithExtension.vy/README.md b/tests/contracts/passing_contracts/DirectoryWithExtension.vy/README.md deleted file mode 100644 index 114f45ef..00000000 --- a/tests/contracts/passing_contracts/DirectoryWithExtension.vy/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Directory with Misleading Extension Test - -The existence of this directory is to test things still work when a directory with `.vy` in its name is present. diff --git a/tests/contracts/passing_contracts/contract_no_pragma.vy b/tests/contracts/passing_contracts/contract_no_pragma.vy deleted file mode 100644 index 1ed39dcb..00000000 --- a/tests/contracts/passing_contracts/contract_no_pragma.vy +++ /dev/null @@ -1,3 +0,0 @@ -@external -def foo1() -> bool: - return True diff --git a/tests/contracts/passing_contracts/contract_with_dev_messages.vy b/tests/contracts/passing_contracts/contract_with_dev_messages.vy deleted file mode 100644 index 9655de45..00000000 --- a/tests/contracts/passing_contracts/contract_with_dev_messages.vy +++ /dev/null @@ -1,23 +0,0 @@ -# @version 0.3.10 - -# Test dev messages in various code placements -@external -def foo() -> bool: - return True # dev: foo - - -# dev: bar -@external -def bar() -> bool: - return True - - -@external -def baz() -> bool: # dev: baz - return True - -# Test non-ascii character matching -# dev: 你好,猿 - -# Test that empty dev comments are ignored -# dev: diff --git a/tests/contracts/passing_contracts/empty.vy b/tests/contracts/passing_contracts/empty.vy deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/contracts/passing_contracts/erc20.vy b/tests/contracts/passing_contracts/erc20.vy deleted file mode 100644 index 3d9a208b..00000000 --- a/tests/contracts/passing_contracts/erc20.vy +++ /dev/null @@ -1,153 +0,0 @@ -# @version ^0.3.8 -# @dev Implementation of ERC-20 token standard. -# @author Takayuki Jimba (@yudetamago) -# https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md - -from vyper.interfaces import ERC20 -from vyper.interfaces import ERC20Detailed - -implements: ERC20 -implements: ERC20Detailed - -event Transfer: - sender: indexed(address) - receiver: indexed(address) - value: uint256 - -event Approval: - owner: indexed(address) - spender: indexed(address) - value: uint256 - -name: public(String[32]) -symbol: public(String[32]) -decimals: public(uint8) - -# NOTE: By declaring `balanceOf` as public, vyper automatically generates a 'balanceOf()' getter -# method to allow access to account balances. -# The _KeyType will become a required parameter for the getter and it will return _ValueType. -# See: https://vyper.readthedocs.io/en/v0.1.0-beta.8/types.html?highlight=getter#mappings -balanceOf: public(HashMap[address, uint256]) -# By declaring `allowance` as public, vyper automatically generates the `allowance()` getter -allowance: public(HashMap[address, HashMap[address, uint256]]) -# By declaring `totalSupply` as public, we automatically create the `totalSupply()` getter -totalSupply: public(uint256) -minter: address - - -@external -def __init__(_name: String[32], _symbol: String[32], _decimals: uint8, _supply: uint256): - init_supply: uint256 = _supply * 10 ** convert(_decimals, uint256) - self.name = _name - self.symbol = _symbol - self.decimals = _decimals - self.balanceOf[msg.sender] = init_supply - self.totalSupply = init_supply - self.minter = msg.sender - log Transfer(ZERO_ADDRESS, msg.sender, init_supply) - - - -@external -def transfer(_to : address, _value : uint256) -> bool: - """ - @dev Transfer token for a specified address - @param _to The address to transfer to. - @param _value The amount to be transferred. - """ - # NOTE: vyper does not allow underflows - # so the following subtraction would revert on insufficient balance - self.balanceOf[msg.sender] -= _value - self.balanceOf[_to] += _value - log Transfer(msg.sender, _to, _value) - return True - - -@external -def transferFrom(_from : address, _to : address, _value : uint256) -> bool: - """ - @dev Transfer tokens from one address to another. - @param _from address The address which you want to send tokens from - @param _to address The address which you want to transfer to - @param _value uint256 the amount of tokens to be transferred - """ - # NOTE: vyper does not allow underflows - # so the following subtraction would revert on insufficient balance - self.balanceOf[_from] -= _value - self.balanceOf[_to] += _value - # NOTE: vyper does not allow underflows - # so the following subtraction would revert on insufficient allowance - self.allowance[_from][msg.sender] -= _value - log Transfer(_from, _to, _value) - return True - - -@external -def approve(_spender : address, _value : uint256) -> bool: - """ - @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender. - Beware that changing an allowance with this method brings the risk that someone may use both the old - and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this - race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: - https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - @param _spender The address which will spend the funds. - @param _value The amount of tokens to be spent. - """ - self.allowance[msg.sender][_spender] = _value - log Approval(msg.sender, _spender, _value) - return True - - -@external -def mint(_to: address, _value: uint256): - """ - @dev Mint an amount of the token and assigns it to an account. - This encapsulates the modification of balances such that the - proper events are emitted. - @param _to The account that will receive the created tokens. - @param _value The amount that will be created. - """ - assert msg.sender == self.minter - assert _to != ZERO_ADDRESS - self.totalSupply += _value - self.balanceOf[_to] += _value - log Transfer(ZERO_ADDRESS, _to, _value) - - -@internal -def _burn(_to: address, _value: uint256): - """ - @dev Internal function that burns an amount of the token of a given - account. - @param _to The account whose tokens will be burned. - @param _value The amount that will be burned. - """ - assert _to != ZERO_ADDRESS - self.totalSupply -= _value - self.balanceOf[_to] -= _value - log Transfer(_to, ZERO_ADDRESS, _value) - - -@external -def burn(_value: uint256): - """ - @dev Burn an amount of the token of msg.sender. - @param _value The amount that will be burned. - """ - self._burn(msg.sender, _value) - - -@external -def burnFrom(_to: address, _value: uint256): - """ - @dev Burn an amount of the token from a given account. - @param _to The account whose tokens will be burned. - @param _value The amount that will be burned. - """ - self.allowance[_to][msg.sender] -= _value - self._burn(_to, _value) - - -# TODO: -# TransferAndCall -# And all ERC-677 functions diff --git a/tests/contracts/passing_contracts/evm_pragma.vy b/tests/contracts/passing_contracts/evm_pragma.vy deleted file mode 100644 index ae1bfd63..00000000 --- a/tests/contracts/passing_contracts/evm_pragma.vy +++ /dev/null @@ -1,8 +0,0 @@ -#pragma version 0.3.10 -#pragma evm-version paris - -x: uint256 - -@external -def __init__(): - self.x = 0 diff --git a/tests/contracts/passing_contracts/flatten_me.vy b/tests/contracts/passing_contracts/flatten_me.vy deleted file mode 100644 index ccf0f377..00000000 --- a/tests/contracts/passing_contracts/flatten_me.vy +++ /dev/null @@ -1,34 +0,0 @@ -# pragma version 0.3.10 - -from vyper.interfaces import ERC20 - -from .interfaces import IFace2 as IFaceTwo -from .interfaces import IFace as IFace -import exampledependency.Dependency as Dep - - -@external -@view -def read_contract(some_address: address) -> uint256: - myContract: IFace = IFace(some_address) - return myContract.read_stuff() - - -@external -@view -def read_another_contract(some_address: address) -> uint256: - two: IFaceTwo = IFaceTwo(some_address) - return two.read_stuff_3() - - -@external -@view -def read_from_dep(some_address: address) -> uint256: - dep: Dep = Dep(some_address) - return dep.read_stuff_2() - - -@external -def send_me(token_address: address, amount: uint256) -> bool: - token: ERC20 = ERC20(token_address) - return token.transferFrom(msg.sender, self, amount, default_return_value=True) diff --git a/tests/contracts/passing_contracts/interfaces/IFace.vy b/tests/contracts/passing_contracts/interfaces/IFace.vy deleted file mode 100644 index c5044b3a..00000000 --- a/tests/contracts/passing_contracts/interfaces/IFace.vy +++ /dev/null @@ -1,4 +0,0 @@ -@view -@external -def read_stuff() -> uint256: - pass diff --git a/tests/contracts/passing_contracts/interfaces/IFace2.vy b/tests/contracts/passing_contracts/interfaces/IFace2.vy deleted file mode 100644 index 4912ff58..00000000 --- a/tests/contracts/passing_contracts/interfaces/IFace2.vy +++ /dev/null @@ -1,4 +0,0 @@ -@view -@external -def read_stuff_3() -> uint256: - pass diff --git a/tests/contracts/passing_contracts/interfaces/IFaceZeroFour.vyi b/tests/contracts/passing_contracts/interfaces/IFaceZeroFour.vyi deleted file mode 100644 index cb314c87..00000000 --- a/tests/contracts/passing_contracts/interfaces/IFaceZeroFour.vyi +++ /dev/null @@ -1,6 +0,0 @@ -# pragma version ~=0.4.0 - -@external -@view -def implementThisPlease(role: bytes32) -> bool: - ... diff --git a/tests/contracts/passing_contracts/interfaces/IRegistry.vy b/tests/contracts/passing_contracts/interfaces/IRegistry.vy deleted file mode 100644 index 949d02ba..00000000 --- a/tests/contracts/passing_contracts/interfaces/IRegistry.vy +++ /dev/null @@ -1,7 +0,0 @@ -@external -def register(addr: address): - pass - -@external -def register_f(addr: address): - pass diff --git a/tests/contracts/passing_contracts/interfaces/ISubReverts.vy b/tests/contracts/passing_contracts/interfaces/ISubReverts.vy deleted file mode 100644 index 01f5a3e8..00000000 --- a/tests/contracts/passing_contracts/interfaces/ISubReverts.vy +++ /dev/null @@ -1,3 +0,0 @@ -@external -def revertStrings(a: uint256) -> bool: - pass diff --git a/tests/contracts/passing_contracts/interfaces/nested/IFaceNested.vy b/tests/contracts/passing_contracts/interfaces/nested/IFaceNested.vy deleted file mode 100644 index daea8ea9..00000000 --- a/tests/contracts/passing_contracts/interfaces/nested/IFaceNested.vy +++ /dev/null @@ -1,4 +0,0 @@ -@view -@external -def read_stuff_nested() -> uint256: - pass diff --git a/tests/contracts/passing_contracts/non_payable_default.vy b/tests/contracts/passing_contracts/non_payable_default.vy deleted file mode 100644 index 988d0252..00000000 --- a/tests/contracts/passing_contracts/non_payable_default.vy +++ /dev/null @@ -1,8 +0,0 @@ -# @version 0.3.7 - -event NotPayment: - sender: indexed(address) - -@external -def __default__(): - log NotPayment(msg.sender) diff --git a/tests/contracts/passing_contracts/older_version.vy b/tests/contracts/passing_contracts/older_version.vy deleted file mode 100644 index 9a9b108a..00000000 --- a/tests/contracts/passing_contracts/older_version.vy +++ /dev/null @@ -1,5 +0,0 @@ -# @version 0.2.16 - -@external -def foo1() -> bool: - return True diff --git a/tests/contracts/passing_contracts/optimize_codesize.vy b/tests/contracts/passing_contracts/optimize_codesize.vy deleted file mode 100644 index 754f0ff0..00000000 --- a/tests/contracts/passing_contracts/optimize_codesize.vy +++ /dev/null @@ -1,8 +0,0 @@ -#pragma version 0.3.10 -#pragma optimize codesize - -x: uint256 - -@external -def __init__(): - self.x = 0 diff --git a/tests/contracts/passing_contracts/payable_default.vy b/tests/contracts/passing_contracts/payable_default.vy deleted file mode 100644 index 93b4cd58..00000000 --- a/tests/contracts/passing_contracts/payable_default.vy +++ /dev/null @@ -1,10 +0,0 @@ -# @version 0.3.7 - -event Payment: - amount: uint256 - sender: indexed(address) - -@external -@payable -def __default__(): - log Payment(msg.value, msg.sender) diff --git a/tests/contracts/passing_contracts/pragma_with_space.vy b/tests/contracts/passing_contracts/pragma_with_space.vy deleted file mode 100644 index 7b69ecf8..00000000 --- a/tests/contracts/passing_contracts/pragma_with_space.vy +++ /dev/null @@ -1,7 +0,0 @@ -# pragma version 0.3.10 - -x: uint256 - -@external -def __init__(): - self.x = 0 diff --git a/tests/contracts/passing_contracts/subdir/zero_four_in_subdir.vy b/tests/contracts/passing_contracts/subdir/zero_four_in_subdir.vy deleted file mode 100644 index b3091c95..00000000 --- a/tests/contracts/passing_contracts/subdir/zero_four_in_subdir.vy +++ /dev/null @@ -1,6 +0,0 @@ -# Show we can import from the root of the project w/o needing relative imports -from contracts.passing_contracts import zero_four_module as zero_four_module - -@external -def callModuleFunctionFromSubdir(role: bytes32) -> bool: - return zero_four_module.moduleMethod() diff --git a/tests/contracts/passing_contracts/use_iface.vy b/tests/contracts/passing_contracts/use_iface.vy deleted file mode 100644 index b29c6fff..00000000 --- a/tests/contracts/passing_contracts/use_iface.vy +++ /dev/null @@ -1,25 +0,0 @@ -# @version ^0.3.3 - -# Import a local interface. -implements: IFaceNested -from .interfaces import IFace as IFace - -# Import from input JSON (ape-config.yaml). -import exampledependency.Dependency as Dep - -from .interfaces import IFace2 as IFace2 - -# Also use IFaceNested to show we can use nested interfaces. -from contracts.passing_contracts.interfaces.nested import IFaceNested as IFaceNested - - -@external -@view -def read_contract(some_address: address) -> uint256: - myContract: IFace = IFace(some_address) - return myContract.read_stuff() - -@view -@external -def read_stuff_nested() -> uint256: - return 1 diff --git a/tests/contracts/passing_contracts/use_iface2.vy b/tests/contracts/passing_contracts/use_iface2.vy deleted file mode 100644 index 4b888ace..00000000 --- a/tests/contracts/passing_contracts/use_iface2.vy +++ /dev/null @@ -1,10 +0,0 @@ -# @version ^0.3.3 - -from .interfaces import IFace as IFace - - -@external -@view -def read_contract(some_address: address) -> uint256: - myContract: IFace = IFace(some_address) - return myContract.read_stuff() diff --git a/tests/contracts/passing_contracts/zero_four.vy b/tests/contracts/passing_contracts/zero_four.vy deleted file mode 100644 index b8931bae..00000000 --- a/tests/contracts/passing_contracts/zero_four.vy +++ /dev/null @@ -1,31 +0,0 @@ -# pragma version ~=0.4.0 - -from .interfaces import IFaceZeroFour as IFaceZeroFour -implements: IFaceZeroFour - -from . import zero_four_module as zero_four_module - -from snekmate.auth import ownable - -# Also show we can import from ethereum namespace. -# (new in Vyper 0.4). -from ethereum.ercs import IERC20 - -# `zero_four_module.vy` also imports this next line. -# We are testing that the flattener can handle that. -from . import zero_four_module_2 as zero_four_module_2 - -@external -@view -def implementThisPlease(role: bytes32) -> bool: - return True - - -@external -def callModuleFunction(role: bytes32) -> bool: - return zero_four_module.moduleMethod() - - -@external -def callModule2Function(role: bytes32) -> bool: - return zero_four_module_2.moduleMethod2() diff --git a/tests/contracts/passing_contracts/zero_four_module.vy b/tests/contracts/passing_contracts/zero_four_module.vy deleted file mode 100644 index 025a3d8b..00000000 --- a/tests/contracts/passing_contracts/zero_four_module.vy +++ /dev/null @@ -1,14 +0,0 @@ -# pragma version ~=0.4.0 - -# This source is also imported from `zero_four.py` to test -# multiple imports across sources during flattening. -from . import zero_four_module_2 as zero_four_module_2 - -@internal -def moduleMethod() -> bool: - return True - - -@external -def callModule2FunctionFromAnotherSource(role: bytes32) -> bool: - return zero_four_module_2.moduleMethod2() diff --git a/tests/contracts/passing_contracts/zero_four_module_2.vy b/tests/contracts/passing_contracts/zero_four_module_2.vy deleted file mode 100644 index 44fb0fca..00000000 --- a/tests/contracts/passing_contracts/zero_four_module_2.vy +++ /dev/null @@ -1,9 +0,0 @@ -# pragma version ~=0.4.0 - -# Showing importing interface from module. -interface Ballot: - def delegated(addr: address) -> bool: view - -@internal -def moduleMethod2() -> bool: - return True diff --git a/tests/contracts/templates/contract.template b/tests/contracts/templates/contract.template deleted file mode 100644 index 59ec9f05..00000000 --- a/tests/contracts/templates/contract.template +++ /dev/null @@ -1,120 +0,0 @@ -# @version {{VYPER_VERSION}} - -from vyper.interfaces import ERC20 - -interface ERC20Ext: - def decimals() -> uint8: view - -# Public storage (PCMap testing) -dynArray: public(DynArray[uint256, 1024]) -token: public(address) -start_token: public(immutable(address)) - -# Constants (PCMap testing) -MASK: constant(uint256) = 2**96 - 1 -FIVE: constant(uint256) = 5 -POS_FIVE: constant(int128) = 5 -FIVES: constant(uint256) = 555 - -# Internal storage (PCMap testing) -array_test: uint256[FIVE] - - -# NOTE: Keep event as test for proving it doesn't fudge up PCMap. -event Swap: - account: indexed(address) - receiver: indexed(address) - asset_in: uint256 - asset_out: uint256 - amount_in: uint256 - amount_out: uint256 - - -# Testing empty events in how it affects PCMap generation. -event Hollow: pass - - -@external -def __init__(_token: address): - """ - @notice Constructor - @param _token Include docs to prove it doesn't fudge with PCMap. - """ - self.token = _token - start_token = _token - - # Part of testing how internal arrays behave in PCMap locations. - for asset in range(FIVE): - self.array_test[asset] = asset * 7 - - -# NOTE: `@nonreentrant` just to test that it doesn't affect PCMap generation. -@external -@nonreentrant('lock') -def setNumber(num: uint256) -> uint256: - # NOTE: This `and` statement `assert` purposely tests something - # we had an issue where this causes the PCMap calculation to get thrown off. - assert num != FIVE and num != FIVES # dev: 7 8 9 - - # Show that PCMap can handle log statements. - log Swap(msg.sender, msg.sender, 1, 2, 3, 4) - - # Test that we can access state variables and PCMap still works. - ERC20Ext(self.token).decimals() - - # WARN: This part is really important. - # Specifically, the call to the immutable member start_token tests something. - # This is because immutable variables are code offsets and not storage slots. - ERC20Ext(start_token).decimals() - - res: uint256 = self.helper(num) * self.array_test[1] - log Hollow() - return res - - -@external -def num_add(i: int128) -> int128: - return (2**127-1) + i - - -@external -def neg_num_add(i: int128) -> int128: - return i - (2**127-1) - - -@external -def div_zero(i: int128) -> int128: - return 4 / i - - -@external -def mod_zero(i: int128) -> int128: - return 4 % i - - -@external -def gimme(idx: uint256) -> uint256: - return self.dynArray[idx] - - -@view -@external -def a_view_method(a: address) -> (uint256, uint256, uint256): - assert a != msg.sender # dev: msg sender check - assert a != start_token # dev: immut. token check - assert a != self.token # dev: mut. token check - return (FIVE, FIVES, MASK) - - -@pure -@internal -def helper(a: uint256) -> uint256: - assert a + 1 != FIVES or a - 1 != FIVES - res: uint256 = unsafe_mul(a & MASK, FIVE) | FIVE | shift(a, POS_FIVE) - if res * FIVE < FIVES: - return res - - # NOTE: Empty raise statement in Vyper are different than Python. - # This should be the same as an assert with no message. - # This is intentionally here for testing PCMap generation. - raise # dev: empty raise stmts diff --git a/tests/contracts/templates/registry.template b/tests/contracts/templates/registry.template deleted file mode 100644 index e95f920d..00000000 --- a/tests/contracts/templates/registry.template +++ /dev/null @@ -1,13 +0,0 @@ -# @version {{VYPER_VERSION}} - -addr: public(address) - -@external -def register(addr: address): - self.addr = addr - - -@external -def register_f(addr: address): - assert self.addr != addr, "doubling." - self.addr = addr diff --git a/tests/contracts/templates/reverts.template b/tests/contracts/templates/reverts.template deleted file mode 100644 index b40ff6f6..00000000 --- a/tests/contracts/templates/reverts.template +++ /dev/null @@ -1,64 +0,0 @@ -# @version {{VYPER_VERSION}} - -from .interfaces import ISubReverts as ISubReverts - -sub_reverts: public(ISubReverts) -MAX_NUM: constant(uint256) = 32 - -@external -def __init__(sub_reverts: ISubReverts): - self.sub_reverts = sub_reverts - -@external -@nonreentrant('lock') -def revertStrings(a: uint256) -> bool: - assert a != 0, "zero" - assert a != 1 # dev: one - assert a != 2, "two" # dev: error - assert a != 3 # error - - # Put random stuff in middle of function for testing purposes. - i2: uint256 = 0 - for i in [1, 2, 3, 4, 5]: - i2 = self.noop(i) - if a != i2: - continue - - assert a != 4 # dev: such modifiable, wow - x: uint256 = 125348 / a - assert x < 21 # dev: foobarbaz - if a != 31337: - return True - raise "awesome show" # dev: great job - -@external -def subRevertStrings(a: uint256) -> bool: - return self.sub_reverts.revertStrings(a) - -@external -def revertStrings2(a: uint256) -> bool: - assert a != 0, "zero" - assert a != 1 # dev: one - assert a != 2, "two" # dev: error - assert a != 3 # error - assert a != 4 # dev: such modifiable, wow - - for i in range(MAX_NUM): - assert i != a # dev: loop test - - if a != 31337: - return True - raise "awesome show" # dev: great job - -@pure -@external -def revertStringsCall(a: uint256) -> bool: - assert a != 0 - assert a != 1, "TEST" # dev: one - return True - - -@pure -@internal -def noop(a: uint256) -> uint256: - return a diff --git a/tests/contracts/templates/sub_reverts.template b/tests/contracts/templates/sub_reverts.template deleted file mode 100644 index 5d9c86a8..00000000 --- a/tests/contracts/templates/sub_reverts.template +++ /dev/null @@ -1,6 +0,0 @@ -# @version {{VYPER_VERSION}} - -@external -def revertStrings(a: uint256) -> bool: - assert a != 0 # dev: sub-zero - return True diff --git a/tests/contracts/templates/traceback_contract.template b/tests/contracts/templates/traceback_contract.template deleted file mode 100644 index 807721ec..00000000 --- a/tests/contracts/templates/traceback_contract.template +++ /dev/null @@ -1,64 +0,0 @@ -# @version {{VYPER_VERSION}} - -from .interfaces import IRegistry as IRegistry - -_balance: public(uint256) -registry: public(IRegistry) - - -@external -def __init__(registry: IRegistry): - self.registry = registry - - -@external -def addBalance( - num: uint256 = 123, - num2: uint256 = 321, -) -> uint256: - assert num != self._balance - assert num != num2 - self.registry.register(msg.sender) - self._balance = self._balance + self.addInterest(num) - - # Run some loops. - for i in [1, 2, 3, 4, 5]: - if i == num: - break - - # Comments in the middle (is a test) - - for i in [1, 2, 3, 4, 5]: - if i != num: - continue - - return self._balance - - -@external -def addBalance_f( - num: uint256 -) -> uint256: - assert num != self._balance - self.registry.register(msg.sender) - self._balance = self._balance + self.addInterest(num) - - # Run some loops. - for i in [1, 2, 3, 4, 5]: - if i == num: - break - - # Fail in the middle (is test) - # Fails because was already set above. - self.registry.register_f(msg.sender) - - for i in [1, 2, 3, 4, 5]: - if i != num: - continue - - return self._balance - - -@internal -def addInterest(num: uint256) -> uint256: - return 123 + num diff --git a/tests/projects/coverage_project/README.md b/tests/projects/coverage_project/README.md deleted file mode 100644 index df2b03e9..00000000 --- a/tests/projects/coverage_project/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# ape-vyper Coverage Project - -This test project exists to help test coverage related features in the Ape framework. -The project is used in the `tests/test_coverage.py` test module. diff --git a/tests/projects/coverage_project/ape-config.yaml b/tests/projects/coverage_project/ape-config.yaml deleted file mode 100644 index 679a1df8..00000000 --- a/tests/projects/coverage_project/ape-config.yaml +++ /dev/null @@ -1,26 +0,0 @@ -ethereum: - local: - default_provider: node - -node: - ethereum: - local: - # Connect to node running from other tests. - uri: "http://127.0.0.1:5550" - -test: - coverage: - exclude: - # Exclude any method starting with DEBUG_ - - method_name: "DEBUG_*" - # Exclude the entire contract source `exclude_whole_contract.vy`. - - contract_name: "exclude_whole_*" - # Exclude a single method from `exclude_part_of_contract.vy`. - - contract_name: "exclude_part_*" - method_name: "exclude_*" - - reports: - terminal: - verbose: True - html: True - xml: True diff --git a/tests/projects/coverage_project/contracts/coverage_test.vy b/tests/projects/coverage_project/contracts/coverage_test.vy deleted file mode 100644 index 220c5211..00000000 --- a/tests/projects/coverage_project/contracts/coverage_test.vy +++ /dev/null @@ -1,24 +0,0 @@ -# @version 0.3.7 - -_number: public(uint256) -_immutable_number: public(immutable(uint256)) - -@external -def __init__(_number: uint256): - _immutable_number = _number - - -@external -def foo_method(a: uint256 = 3, b: uint256 = 1) -> bool: - assert a != 0 # dev: sub-zero - self._number = a + b - return True - -@view -@external -def view_method() -> bool: - return True - -@external -def DEBUG_ignore_me() -> bool: - return True diff --git a/tests/projects/coverage_project/contracts/exclude_part_of_contract.vy b/tests/projects/coverage_project/contracts/exclude_part_of_contract.vy deleted file mode 100644 index 8e778a3d..00000000 --- a/tests/projects/coverage_project/contracts/exclude_part_of_contract.vy +++ /dev/null @@ -1,9 +0,0 @@ -# @version 0.3.7 - -@external -def exclude_me() -> bool: - return True - -@external -def include_me() -> bool: - return True diff --git a/tests/projects/coverage_project/contracts/exclude_whole_contract.vy b/tests/projects/coverage_project/contracts/exclude_whole_contract.vy deleted file mode 100644 index cdce80c9..00000000 --- a/tests/projects/coverage_project/contracts/exclude_whole_contract.vy +++ /dev/null @@ -1,5 +0,0 @@ -# @version 0.3.7 - -@external -def exclude_me() -> bool: - return True diff --git a/tests/projects/coverage_project/tests/conftest.py b/tests/projects/coverage_project/tests/conftest.py deleted file mode 100644 index 784072b4..00000000 --- a/tests/projects/coverage_project/tests/conftest.py +++ /dev/null @@ -1,16 +0,0 @@ -import pytest - - -@pytest.fixture -def START_NUM(): - return 1234567 - - -@pytest.fixture -def account(accounts): - return accounts[0] - - -@pytest.fixture -def contract(account, project, START_NUM): - return account.deploy(project.coverage_test, START_NUM) diff --git a/tests/projects/coverage_project/tests/test_coverage.py b/tests/projects/coverage_project/tests/test_coverage.py deleted file mode 100644 index 511eafb7..00000000 --- a/tests/projects/coverage_project/tests/test_coverage.py +++ /dev/null @@ -1,75 +0,0 @@ -import ape - -from ape_vyper.exceptions import FallbackNotDefinedError, NonPayableError - - -def test_immutable_number(contract, account, START_NUM): - """ - Ensure that immutable members work in coverage. - This is needed for full function coverage. - """ - assert contract._immutable_number() == START_NUM - - -def test_happy_path(contract, account, chain): - """ - Covers some implicit statements as well two source statements. - """ - num1 = 5 - num2 = 6 - receipt = contract.foo_method(num1, num2, sender=account) - - # In order for full coverage, we need to also call `_number()`. - assert contract._number() == num1 + num2 - - if chain.provider.supports_tracing: - assert receipt.return_value is True - - -def test_sad_path(contract, account, chain): - """ - Covers some implicit statements as well as one source statement. - """ - kwargs = {"dev_message": "dev: sub-zero"} if chain.provider.supports_tracing else {} - with ape.reverts(**kwargs): - contract.foo_method(0, 1, sender=account) - - -def test_non_payable(contract, account): - """ - Coverage (at least) the implicit statement for non-payable check. - """ - with ape.reverts(NonPayableError): - contract.foo_method(5, 1, sender=account, value=1) - - -def test_no_default_method(contract, account): - """ - Covers the implicit check for fallback not defined. - """ - with ape.reverts(FallbackNotDefinedError): - contract(sender=account) - - -def test_foo_method_no_args(contract, account): - """ - Covers the statement from the autogenerated method. - """ - receipt = contract.foo_method(sender=account) - assert not receipt.failed - - -def test_foo_method_one_arg(contract, account): - """ - Covers the statement from the autogenerated method. - """ - receipt = contract.foo_method(1, sender=account) - assert not receipt.failed - - -def test_view_method(contract, account): - """ - Prove that view methods work in coverage. - Without this, it would not be 100%. - """ - assert contract.view_method() is True diff --git a/tests/projects/version_in_config/ape-config.yaml b/tests/projects/version_in_config/ape-config.yaml deleted file mode 100644 index 5eb0b078..00000000 --- a/tests/projects/version_in_config/ape-config.yaml +++ /dev/null @@ -1,2 +0,0 @@ -vyper: - version: 0.3.7 diff --git a/tests/projects/version_in_config/contracts/v_contract.vy b/tests/projects/version_in_config/contracts/v_contract.vy deleted file mode 100644 index 38602d92..00000000 --- a/tests/projects/version_in_config/contracts/v_contract.vy +++ /dev/null @@ -1,5 +0,0 @@ -# @version 0.3.10 - -@external -def foo(a: uint256) -> bool: - return True diff --git a/tests/test_ape_reverts.py b/tests/test_ape_reverts.py deleted file mode 100644 index 45fe1b21..00000000 --- a/tests/test_ape_reverts.py +++ /dev/null @@ -1,132 +0,0 @@ -import re -import shutil - -import pytest -from ape import chain -from ape.pytest.contextmanagers import RevertsContextManager as reverts - - -@pytest.fixture(autouse=True) -def clear_db(geth_provider): - yield - # Helps prevent replacement tx errors. - # TODO: Move this into Ape's isolation handling for geth. - blobpool = chain.provider._process._data_dir / "geth" / "blobpool" - shutil.rmtree(blobpool, ignore_errors=True) - - -@pytest.fixture(params=("021", "022", "023", "0215", "0216", "034")) -def older_reverts_contract(account, project, geth_provider, request): - container = project.get_contract(f"sub_reverts_{request.param}") - return container.deploy(sender=account) - - -@pytest.fixture(params=("037", "039", "0310")) -def reverts_contract_instance(account, project, geth_provider, request): - sub_reverts_container = project.get_contract(f"sub_reverts_{request.param}") - sub_reverts = sub_reverts_container.deploy(sender=account) - contract = project.get_contract(f"reverts_{request.param}") - return contract.deploy(sub_reverts, sender=account) - - -def test_dev_revert(account, reverts_contract_instance, geth_provider): - """ - Test matching a contract dev revert message with a supplied dev message. - """ - with reverts(dev_message="dev: error"): - reverts_contract_instance.revertStrings(2, sender=account) - - # Show a method further down in the contract also works. - with reverts(dev_message="dev: error"): - reverts_contract_instance.revertStrings2(2, sender=account) - - -def test_dev_revert_pattern(account, reverts_contract_instance, geth_provider): - """ - Test matching a contract dev revert message with a supplied dev message pattern. - """ - with reverts(dev_message=re.compile(r"dev: err\w+")): - reverts_contract_instance.revertStrings(2, sender=account) - - with reverts(dev_message=re.compile(r"dev: err\w+")): - reverts_contract_instance.revertStrings2(2, sender=account) - - -def test_dev_revert_from_sub_contract(account, reverts_contract_instance, geth_provider, project): - """ - Test to ensure we can assert on dev messages from inner-contracts. - """ - with reverts(dev_message="dev: sub-zero"): - reverts_contract_instance.subRevertStrings(0, sender=account) - - -def test_dev_revert_deep_in_method(account, reverts_contract_instance, geth_provider): - """ - Test to ensure we can assert on a dev message that is in the middle of a - complicated function implementation. - """ - with reverts(dev_message="dev: foobarbaz"): - reverts_contract_instance.revertStrings(13, sender=account) - - with reverts(dev_message="dev: such modifiable, wow"): - reverts_contract_instance.revertStrings(4, sender=account) - - with reverts(dev_message="dev: great job"): - reverts_contract_instance.revertStrings(31337, sender=account) - - -def test_dev_revert_in_loop(account, reverts_contract_instance, geth_provider): - with reverts(dev_message="dev: loop test"): - reverts_contract_instance.revertStrings2(12, sender=account) - - -def test_dev_revert_fails(account, reverts_contract_instance, geth_provider): - """ - Test that ``AssertionError`` is raised if the supplied dev message and the contract dev message - do not match. - """ - with pytest.raises(AssertionError): - with reverts(dev_message="dev: foo"): - reverts_contract_instance.revertStrings(2, sender=account) - - -def test_dev_revert_partial_fails(account, reverts_contract_instance, geth_provider): - """ - Test that ``AssertionError`` is raised if the supplied dev message and the contract dev message - do not match exactly. - """ - with pytest.raises(AssertionError): - with reverts(dev_message="dev: foo"): - reverts_contract_instance.revertStrings(2, sender=account) - - -def test_dev_revert_pattern_fails(account, reverts_contract_instance, geth_provider): - """ - Test that ``AssertionError`` is raised if the contract dev message does not match the supplied - dev revert pattern. - """ - with pytest.raises(AssertionError): - with reverts(dev_message=re.compile(r"dev: [^ero]+")): - reverts_contract_instance.revertStrings(2, sender=account) - - -def test_dev_revert_on_call(account, reverts_contract_instance, geth_provider): - """ - Shows that dev strings are detectable even on pure / view methods. - """ - with reverts(dev_message="dev: one"): - reverts_contract_instance.revertStringsCall(1) - - -def test_both_message_and_dev_str(account, reverts_contract_instance, geth_provider): - """ - Test matching a revert message with a supplied message as well as a contract dev revert message - with a supplied dev message. - """ - with reverts(expected_message="two", dev_message="dev: error"): - reverts_contract_instance.revertStrings(2, sender=account) - - -def test_dev_message_older_versions(account, older_reverts_contract): - with reverts(dev_message="dev: sub-zero"): - older_reverts_contract.revertStrings(0, sender=account) diff --git a/tests/test_cli.py b/tests/test_cli.py deleted file mode 100644 index 12975b4b..00000000 --- a/tests/test_cli.py +++ /dev/null @@ -1,49 +0,0 @@ -import subprocess - -import pytest -from ape.utils import create_tempdir - -from ape_vyper._cli import cli - - -@pytest.mark.parametrize( - "contract_name,expected", - [ - # This first one has most known edge cases - ( - "flatten_me.vy", - [ - "from vyper.interfaces import ERC20", - "interface Dep:", - "interface IFace:", - "interface IFaceTwo:", - ], - ), - ], -) -def test_flatten(project, contract_name, expected, cli_runner): - path = project.contracts_folder / contract_name - arguments = ["flatten", str(path)] - end = ("--project", str(project.path)) - with create_tempdir() as tmpdir: - file = tmpdir / "flatten.vy" - arguments.extend([str(file), *end]) - result = cli_runner.invoke(cli, arguments, catch_exceptions=False) - assert result.exit_code == 0, result.stderr_bytes - output = file.read_text(encoding="utf8") - for expect in expected: - assert expect in output - - -def test_compile(): - """ - Integration: Testing the CLI using an actual subprocess because - it is the only way to test compiling the project such that it - isn't treated as a tempdir project. - """ - # Use a couple contracts - cmd_ls = ("ape", "compile", "subdir", "--force") - completed_process = subprocess.run(cmd_ls, capture_output=True) - output = completed_process.stdout.decode(encoding="utf8") - assert "SUCCESS" in output - assert "zero_four_in_subdir.vy" in output diff --git a/tests/test_compiler.py b/tests/test_compiler.py deleted file mode 100644 index 177c3554..00000000 --- a/tests/test_compiler.py +++ /dev/null @@ -1,736 +0,0 @@ -import re -from pathlib import Path - -import ape -import pytest -import vvm # type: ignore -from ape.exceptions import CompilerError, ContractLogicError -from ape.utils import get_full_extension -from ethpm_types import ContractType -from packaging.version import Version -from vvm.exceptions import VyperError # type: ignore - -from ape_vyper.compiler import RuntimeErrorType -from ape_vyper.exceptions import ( - FallbackNotDefinedError, - IntegerOverflowError, - InvalidCalldataOrValueError, - NonPayableError, - VyperCompileError, - VyperInstallError, -) - -# Currently, this is the only version specified from a pragma spec -from .conftest import FAILING_BASE, FAILING_CONTRACT_NAMES, PASSING_CONTRACT_NAMES, TEMPLATES - -OLDER_VERSION_FROM_PRAGMA = Version("0.2.16") -VERSION_37 = Version("0.3.7") -VERSION_FROM_PRAGMA = Version("0.3.10") -VERSION_04 = Version("0.4.0") - - -@pytest.fixture -def dev_revert_source(project): - return project.contracts_folder / "contract_with_dev_messages.vy" - - -EXPECTED_FAIL_PATTERNS = { - "contract_undeclared_variable": re.compile( - ( - r"\w*\.vy\s*UndeclaredDefinition:'\w*' " - r'has not been declared\s*contract "\w*.vy"' - # NOTE: Following bit proves we have line numbers (see all the \d's). - r', function "\w*",.*\w*\d:\d\s*\d def.*\s*.*\d\s*\w* = \w*\s*-*\^\s*\d\s*.*' - ), - ), - "contract_unknown_pragma": "", -} -ZERO_FOUR_CONTRACT_FLAT = """ -# pragma version ~=0.4.0 - - -interface IFaceZeroFour: - def implementThisPlease(role: bytes32) -> bool: view - - -# @dev Returns the address of the current owner. -# @notice If you declare a variable as `public`, -# Vyper automatically generates an `external` -# getter function for the variable. -owner: public(address) - - -# @dev Emitted when the ownership is transferred -# from `previous_owner` to `new_owner`. -event OwnershipTransferred: - previous_owner: indexed(address) - new_owner: indexed(address) - - -@deploy -@payable -def __init__(): - \"\"\" - @dev To omit the opcodes for checking the `msg.value` - in the creation-time EVM bytecode, the constructor - is declared as `payable`. - @notice The `owner` role will be assigned to - the `msg.sender`. - \"\"\" - self._transfer_ownership(msg.sender) - - -@external -def transfer_ownership(new_owner: address): - \"\"\" - @dev Transfers the ownership of the contract - to a new account `new_owner`. - @notice Note that this function can only be - called by the current `owner`. Also, - the `new_owner` cannot be the zero address. - @param new_owner The 20-byte address of the new owner. - \"\"\" - self._check_owner() - assert new_owner != empty(address), "ownable: new owner is the zero address" - self._transfer_ownership(new_owner) - - -@external -def renounce_ownership(): - \"\"\" - @dev Leaves the contract without an owner. - @notice Renouncing ownership will leave the - contract without an owner, thereby - removing any functionality that is - only available to the owner. - \"\"\" - self._check_owner() - self._transfer_ownership(empty(address)) - - -@internal -def _check_owner(): - \"\"\" - @dev Throws if the sender is not the owner. - \"\"\" - assert msg.sender == self.owner, "ownable: caller is not the owner" - - -@internal -def _transfer_ownership(new_owner: address): - \"\"\" - @dev Transfers the ownership of the contract - to a new account `new_owner`. - @notice This is an `internal` function without - access restriction. - @param new_owner The 20-byte address of the new owner. - \"\"\" - old_owner: address = self.owner - self.owner = new_owner - log OwnershipTransferred(old_owner, new_owner) - - -# This source is also imported from `zero_four.py` to test -# multiple imports across sources during flattening. - -@internal -def moduleMethod() -> bool: - return True - - -@external -def callModule2FunctionFromAnotherSource(role: bytes32) -> bool: - return self.moduleMethod2() - - -# Showing importing interface from module. -interface Ballot: - def delegated(addr: address) -> bool: view - -@internal -def moduleMethod2() -> bool: - return True - - -implements: IFaceZeroFour - - -# Also show we can import from ethereum namespace. -# (new in Vyper 0.4). - -# `self.vy` also imports this next line. -# We are testing that the flattener can handle that. - -@external -@view -def implementThisPlease(role: bytes32) -> bool: - return True - - -@external -def callModuleFunction(role: bytes32) -> bool: - return self.moduleMethod() - - -@external -def callModule2Function(role: bytes32) -> bool: - return self.moduleMethod2() -""".lstrip() - - -def test_compile_project(project): - actual = sorted(list(project.load_contracts().keys())) - - # NOTE: Ignore interfaces for this test. - expected = sorted( - [ - p.stem - for p in project.contracts_folder.rglob("*.vy") - if p.is_file() and not p.name.startswith("I") - ] - ) - if missing := [e for e in expected if e not in actual]: - missing_str = ", ".join(missing) - pytest.xfail(f"Missing the following expected sources: {missing_str}") - if extra := [a for a in actual if a not in expected]: - extra_str = ", ".join(extra) - pytest.xfail(f"Received the following extra sources: {extra_str}") - - assert "contract_039" in actual - assert "contract_no_pragma" in actual - assert "older_version" in actual - - -@pytest.mark.parametrize("contract_name", PASSING_CONTRACT_NAMES) -def test_compile_individual_contracts(project, contract_name, compiler): - path = project.contracts_folder / contract_name - assert list(compiler.compile((path,), project=project)) - - -@pytest.mark.parametrize( - "contract_name", [n for n in FAILING_CONTRACT_NAMES if n != "contract_unknown_pragma.vy"] -) -def test_compile_failures(contract_name, compiler): - failing_project = ape.Project(FAILING_BASE) - path = FAILING_BASE / contract_name - with pytest.raises(VyperCompileError, match=EXPECTED_FAIL_PATTERNS[path.stem]) as err: - list(compiler.compile((path,), project=failing_project)) - - assert isinstance(err.value.base_err, VyperError) - - -def test_compile_zero_four(compiler, project): - """ - An easy way to test only Vyper 0.4 changes. - """ - paths = ( - project.contracts_folder / "subdir" / "zero_four_in_subdir.vy", - project.contracts_folder / "zero_four.vy", - ) - result = [x.name for x in compiler.compile(paths, project=project)] - assert "zero_four" in result - assert "zero_four_in_subdir" in result - - -def test_install_failure(compiler): - failing_project = ape.Project(FAILING_BASE) - path = FAILING_BASE / "contract_unknown_pragma.vy" - with pytest.raises(VyperInstallError, match="No available version to install."): - list(compiler.compile((path,), project=failing_project)) - - -def test_get_version_map(project, compiler, all_versions): - vyper_files = [ - x - for x in project.contracts_folder.iterdir() - if x.is_file() and get_full_extension(x) == ".vy" - ] - actual = compiler.get_version_map(vyper_files, project=project) - expected_versions = [Version(v) for v in all_versions] - - for version, sources in actual.items(): - if version in expected_versions: - continue - - sources = ", ".join([p.name for p in actual[version]]) - fail_message = f"Unexpected version '{version}' with sources: {sources}" - pytest.fail(fail_message) - - assert len(actual[OLDER_VERSION_FROM_PRAGMA]) >= 1 - assert len(actual[VERSION_FROM_PRAGMA]) >= 1 - assert project.contracts_folder / "older_version.vy" in actual[OLDER_VERSION_FROM_PRAGMA] - - expected = [ - "contract_with_dev_messages.vy", - "erc20.vy", - "use_iface.vy", - "optimize_codesize.vy", - "evm_pragma.vy", - "use_iface2.vy", - "pragma_with_space.vy", - "flatten_me.vy", - ] - - # Add the 0.3.10 contracts. - for template in TEMPLATES: - expected.append(f"{template}_0310.vy") - - names = [x.name for x in actual[VERSION_FROM_PRAGMA]] - failures = [] - missing = [] - for ex in expected: - if ex not in names: - missing.append(ex) - - if missing: - failures.append(f"Missing contracts: {','.join(missing)}") - - extra = [] - for ac in actual[VERSION_FROM_PRAGMA]: - if ac.name not in expected: - extra.append(ac.name) - - if extra: - failures.append(f"Extra contracts: {', '.join(extra)}") - - assert not failures, "\n".join(failures) - - # Vyper 0.4.0 assertions. - actual4 = {x.name for x in actual[VERSION_04]} - expected4 = { - "contract_no_pragma.vy", - "empty.vy", - "zero_four.vy", - "zero_four_module.vy", - "zero_four_module_2.vy", - } - assert actual4 == expected4 - - -def test_compiler_data_in_manifest(project): - def run_test(manifest): - assert len(manifest.compilers) >= 3, manifest.compilers - - all_latest_03 = [ - c for c in manifest.compilers if str(c.version) == str(VERSION_FROM_PRAGMA) - ] - evm_opt = [c for c in all_latest_03 if c.settings.get("evmVersion") == "paris"][0] - gas_opt = [c for c in all_latest_03 if c.settings["optimize"] == "gas"][0] - true_opt = [ - c - for c in manifest.compilers - if c.settings["optimize"] is True and "non_payable_default" in c.contractTypes - ][0] - codesize_opt = [ - c - for c in all_latest_03 - if c.settings["optimize"] == "codesize" and c.settings.get("evmVersion") != "paris" - ][0] - vyper_028 = [ - c for c in manifest.compilers if str(c.version) == str(OLDER_VERSION_FROM_PRAGMA) - ][0] - - for compiler in (vyper_028, codesize_opt): - assert compiler.name == "vyper" - - assert vyper_028.settings["evmVersion"] == "berlin" - assert codesize_opt.settings["evmVersion"] == "shanghai" - - # There is only one contract with evm-version pragma. - assert evm_opt.contractTypes == ["evm_pragma"] - assert evm_opt.settings.get("evmVersion") == "paris" - - assert "optimize_codesize" in codesize_opt.contractTypes - assert "older_version" in vyper_028.contractTypes - assert len(gas_opt.contractTypes) >= 1 - assert "non_payable_default" in true_opt.contractTypes - - project.update_manifest(compilers=[]) - project.load_contracts(use_cache=False) - run_test(project.manifest) - man = project.extract_manifest() - run_test(man) - - -def test_compile_parse_dev_messages(compiler, dev_revert_source, project): - """ - Test parsing of dev messages in a contract. These follow the form of "#dev: ...". - - The compiler will output a map that maps dev messages to line numbers. - See contract_with_dev_messages.vy for more information. - """ - result = list(compiler.compile((dev_revert_source,), project=project)) - - assert len(result) == 1 - - contract = result[0] - - assert contract.dev_messages is not None - assert len(contract.dev_messages) == 4 - assert contract.dev_messages[6] == "dev: foo" - assert contract.dev_messages[9] == "dev: bar" - assert contract.dev_messages[16] == "dev: baz" - assert contract.dev_messages[20] == "dev: 你好,猿" - assert 23 not in contract.dev_messages - - -def test_get_imports(compiler, project): - vyper_files = [ - x for x in project.contracts_folder.iterdir() if x.is_file() and x.suffix == ".vy" - ] - actual = compiler.get_imports(vyper_files, project=project) - prefix = "contracts/passing_contracts" - builtin_import = "vyper/interfaces/ERC20.json" - local_import = "IFace.vy" - local_from_import = "IFace2.vy" - local_nested_import = "IFaceNested.vy" - dependency_import = "Dependency.vy" - - # The source IDs end up as absolute paths because they are in tempdir - # (not direct local project) and because of Vyper 0.4 reasons, we need - # this to be the case. And we don't know the version map yet at this point. - contract_37_key = [k for k in actual if f"{prefix}/contract_037.vy" in k][0] - use_iface_key = [k for k in actual if f"{prefix}/use_iface.vy" in k][0] - use_iface2_key = [k for k in actual if f"{prefix}/use_iface2.vy" in k][0] - - assert set(actual[contract_37_key]) == {builtin_import} - - actual_iface_use = actual[use_iface_key] - for expected in (local_import, local_from_import, dependency_import, local_nested_import): - assert any(k for k in actual_iface_use if expected in k) - - assert actual[use_iface2_key][0].endswith(local_import) - - -@pytest.mark.parametrize("src,vers", [("contract_039", "0.3.9"), ("contract_037", "0.3.7")]) -def test_pc_map(compiler, project, src, vers): - """ - Ensure we de-compress the source map correctly by comparing to the results - from `compile_src()` which includes the uncompressed source map data. - """ - - path = project.sources.lookup(src) - result = list(compiler.compile((path,), project=project))[0] - actual = result.pcmap.root - code = path.read_text(encoding="utf8") - vvm.install_vyper(vers) - cfg = compiler.get_config(project=project) - evm_version = cfg.evm_version - compile_result = vvm.compile_source(code, vyper_version=vers, evm_version=evm_version) - std_result = compile_result[""] - src_map = std_result["source_map"] - lines = code.splitlines() - - # Use the old-fashioned way of gathering PCMap to ensure our creative way works - expected = {pc: {"location": ln} for pc, ln in src_map["pc_pos_map"].items()} - missing_pcs = [] - empty_locs = [] - wrong_locs = [] - for expected_pc, item_dict in expected.items(): - expected_loc = item_dict["location"] - - # Collect matching locations. - matching_locs = [] - for mpc, loc in actual.items(): - if loc["location"] == expected_loc: - matching_locs.append(mpc) - - if expected_pc not in actual: - missing_pcs.append((expected_pc, expected_loc, matching_locs)) - continue - - if actual[expected_pc]["location"] is None: - empty_locs.append((expected_pc, expected_loc, matching_locs)) - continue - - if actual[expected_pc]["location"] != expected_loc: - wrong_locs.append((expected_pc, expected_loc, matching_locs)) - - limit = 10 # Only show first ten failures of each category. - - def make_failure(title, ls): - fail_format = "PC={pc}, Expected={ex} (actual matches={match})" - suffix = ", ".join([fail_format.format(pc=m, ex=e, match=mat) for m, e, mat in ls[:limit]]) - return f"{title}: {suffix}" - - failures = [] - if len(missing_pcs) != 0: - failures.append((missing_pcs[0][0], make_failure("Missing PCs", missing_pcs))) - if len(empty_locs) != 0: - failures.append((empty_locs[0][0], make_failure("Empty locations", empty_locs))) - if len(wrong_locs) != 0: - failures.append((wrong_locs[0][0], make_failure("Wrong locations", wrong_locs))) - - # Show first failures to occur first. - failures.sort(key=lambda x: x[0]) - - assert len(failures) == 0, "\n".join([x[1] for x in failures]) - - # Test helper methods. - def _all(check): - return [x for x in actual.values() if x.get("dev") == f"dev: {check.value}"] - - def line(cont: str) -> int: - # A helper for getting expected line numbers - return [i + 1 for i, x in enumerate(lines) if cont in x][0] - - # Verify non-payable checks. - nonpayable_checks = _all(RuntimeErrorType.NONPAYABLE_CHECK) - if nonpayable_checks: - assert len(nonpayable_checks) >= 1 - else: - # NOTE: Vyper 0.3.10 doesn't have these anymore. - # But they do have a new error type instead. - checks = _all(RuntimeErrorType.INVALID_CALLDATA_OR_VALUE) - assert len(checks) >= 1 - - # Verify integer overflow checks - overflows = _all(RuntimeErrorType.INTEGER_OVERFLOW) - overflow_no = line("return (2**127-1) + i") - expected_overflow_loc = [overflow_no, 12, overflow_no, 20] - assert len(overflows) >= 2 - - if vers == "0.3.7": - assert expected_overflow_loc in [o["location"] for o in overflows if o["location"]] - # else: 0.3.9 registers as IntegerBoundsCheck - - # Verify integer underflow checks - underflows = _all(RuntimeErrorType.INTEGER_UNDERFLOW) - underflow_no = line("return i - (2**127-1)") - expected_underflow_loc = [underflow_no, 11, underflow_no, 25] - assert len(underflows) >= 2 - - if vers == "0.3.7": - assert expected_underflow_loc in [u["location"] for u in underflows if u["location"]] - # else: 0.3.9 registers as IntegerBoundsCheck - - # Verify division by zero checks - div_zeros = _all(RuntimeErrorType.DIVISION_BY_ZERO) - div_no = line("return 4 / i") - expected_div_0 = [div_no, 11, div_no, 16] - - if vers == "0.3.7": - assert len(div_zeros) >= 1 - assert expected_div_0 in [d["location"] for d in div_zeros if d["location"]] - # TODO: figure out how to detect these on 0.3.9 - - # Verify modulo by zero checks - mod_zeros = _all(RuntimeErrorType.MODULO_BY_ZERO) - mod_no = line("return 4 % i") - expected_mod_0_loc = [mod_no, 11, mod_no, 16] - assert len(mod_zeros) >= 1 - assert expected_mod_0_loc in [m["location"] for m in mod_zeros if m["location"]] - - # Verify index out of range checks - range_checks = _all(RuntimeErrorType.INDEX_OUT_OF_RANGE) - range_no = line("return self.dynArray[idx]") - expected_range_check = [range_no, 11, range_no, 24] - if vers == "0.3.7": - assert len(range_checks) >= 1 - assert expected_range_check in [r["location"] for r in range_checks] - # TODO: figure out how to detect these on 0.3.9 - - -def test_enrich_error_int_overflow(geth_provider, traceback_contract, account): - int_max = 2**256 - 1 - with pytest.raises(IntegerOverflowError): - traceback_contract.addBalance(int_max, sender=account) - - -def test_enrich_error_non_payable_check(geth_provider, traceback_contract, account): - if traceback_contract.contract_type.name.endswith("0310"): - # NOTE: Nonpayable error is combined with calldata check now. - with pytest.raises(InvalidCalldataOrValueError): - traceback_contract.addBalance(123, sender=account, value=1) - - else: - with pytest.raises(NonPayableError): - traceback_contract.addBalance(123, sender=account, value=1) - - -def test_enrich_error_fallback(geth_provider, traceback_contract, account): - """ - Show that when attempting to call a contract's fallback method when there is - no fallback defined results in a custom contract logic error. - """ - with pytest.raises(FallbackNotDefinedError): - traceback_contract(sender=account) - - -def test_enrich_error_handle_when_name(compiler, geth_provider, mocker): - """ - Sometimes, a provider may use the name of the enum instead of the value, - which we are still able to enrich. - """ - - tb = mocker.MagicMock() - tb.revert_type = "NONPAYABLE_CHECK" - error = ContractLogicError("", source_traceback=tb) - new_error = compiler.enrich_error(error) - assert isinstance(new_error, NonPayableError) - - -@pytest.mark.parametrize("arguments", [(), (123,), (123, 321)]) -def test_trace_source(account, geth_provider, project, traceback_contract, arguments): - receipt = traceback_contract.addBalance(*arguments, sender=account) - actual = receipt.source_traceback - base_folder = Path(__file__).parent / "contracts" / "passing_contracts" - contract_name = traceback_contract.contract_type.name - expected = rf""" -Traceback (most recent call last) - File {base_folder}/{contract_name}.vy, in addBalance - 32 if i != num: - 33 continue - 34 - --> 35 return self._balance -""".strip() - assert str(actual) == expected - - -def test_trace_source_content_from_kwarg_default_parametrization( - account, geth_provider, project, traceback_contract -): - """ - This test is for verifying stuff around Vyper auto-generated methods from kwarg defaults. - Mostly, need to make sure the correct content is discoverable in the source traceback - so that coverage works properly. - """ - no_args_tx = traceback_contract.addBalance(sender=account) - no_args_tb = no_args_tx.source_traceback - - def check(name: str, tb): - items = [x.closure.full_name for x in tb if x.closure.full_name == name] - assert len(items) >= 1 - - check("addBalance()", no_args_tb) - - single_arg_tx = traceback_contract.addBalance(442, sender=account) - single_arg_tb = single_arg_tx.source_traceback - check("addBalance(uint256)", single_arg_tb) - - both_args_tx = traceback_contract.addBalance(4, 5, sender=account) - both_args_tb = both_args_tx.source_traceback - check("addBalance(uint256,uint256)", both_args_tb) - - -def test_trace_err_source(account, geth_provider, project, traceback_contract): - txn = traceback_contract.addBalance_f.as_transaction(123) - try: - account.call(txn) - except ContractLogicError: - pass - - receipt = geth_provider.get_receipt(txn.txn_hash.hex()) - actual = receipt.source_traceback - base_folder = Path(__file__).parent / "contracts" / "passing_contracts" - contract_name = traceback_contract.contract_type.name - version_key = contract_name.split("traceback_contract_")[-1] - expected = rf""" -Traceback (most recent call last) - File {base_folder}/{contract_name}.vy, in addBalance_f - 48 if i == num: - 49 break - 50 - 51 # Fail in the middle (is test) - 52 # Fails because was already set above. - --> 53 self.registry.register_f(msg.sender) - 54 - 55 for i in [1, 2, 3, 4, 5]: - 56 if i != num: - 57 continue - - File {base_folder}/registry_{version_key}.vy, in register_f - 11 def register_f(addr: address): - --> 12 assert self.addr != addr, "doubling." - 13 self.addr = addr - """.strip() - assert str(actual) == expected - - -def test_trace_source_default_method(geth_provider, account, project): - """ - This test proves you get a working source-traceback from __default__ calls. - """ - contract = project.non_payable_default.deploy(sender=account) - receipt = contract(sender=account) - src_tb = receipt.source_traceback - actual = str(src_tb[-1][-1]).lstrip() # Last line in traceback (without indent). - expected = "8 log NotPayment(msg.sender)" - assert actual == expected - - -def test_compile_with_version_set_in_config(config, projects_path, compiler, mocker): - path = projects_path / "version_in_config" - version_from_config = "0.3.7" - spy = mocker.patch("ape_vyper.compiler.vvm_compile_standard") - project = ape.Project(path) - - contract = project.contracts_folder / "v_contract.vy" - settings = compiler.get_compiler_settings((contract,), project=project) - assert str(list(settings.keys())[0]) == version_from_config - - # Show it uses this version in the compiler. - project.load_contracts(use_cache=False) - assert str(spy.call_args[1]["vyper_version"]) == version_from_config - - -def test_compile_code(project, compiler, dev_revert_source): - code = dev_revert_source.read_text(encoding="utf8") - actual = compiler.compile_code(code, project=project, contractName="MyContract") - assert isinstance(actual, ContractType) - assert actual.name == "MyContract" - assert len(actual.abi) > 1 - assert len(actual.deployment_bytecode.bytecode) > 1 - assert len(actual.runtime_bytecode.bytecode) > 1 - - -def test_compile_with_version_set_in_settings_dict(config, compiler_manager, projects_path): - path = projects_path / "version_in_config" - contract = path / "contracts" / "v_contract.vy" - project = ape.Project(path) - expected = '.*Version specification "0.3.10" is not compatible with compiler version "0.3.3"' - iterator = compiler_manager.compile( - (contract,), project=project, settings={"vyper": {"version": "0.3.3"}} - ) - with pytest.raises(CompilerError, match=expected): - _ = list(iterator) - - -@pytest.mark.parametrize( - "contract_name", - [ - # This first one has most known edge cases - "flatten_me.vy", - # Test on the below for general compatibility. - "contract_with_dev_messages.vy", - "erc20.vy", - "use_iface.vy", - "optimize_codesize.vy", - "evm_pragma.vy", - "use_iface2.vy", - "contract_no_pragma.vy", # no pragma should compile with latest version - "empty.vy", # empty file still compiles with latest version - "pragma_with_space.vy", - ], -) -def test_flatten_contract(all_versions, project, contract_name, compiler): - path = project.contracts_folder / contract_name - source = compiler.flatten_contract(path, project=project) - - # Ensure it also compiles. - source_code = str(source) - version = compiler._source_vyper_version(source_code) - vvm.install_vyper(str(version)) - vvm.compile_source(source_code, base_path=project.path, vyper_version=version) - - -def test_flatten_contract_04(project, compiler): - path = project.contracts_folder / "zero_four.vy" - source = compiler.flatten_contract(path, project=project) - source_code = str(source) - assert source_code == ZERO_FOUR_CONTRACT_FLAT - - # Ensure it also compiles. - version = compiler._source_vyper_version(source_code) - vvm.install_vyper(str(version)) - vvm.compile_source(source_code, base_path=project.path, vyper_version=version) diff --git a/tests/test_coverage.py b/tests/test_coverage.py deleted file mode 100644 index 64229ed6..00000000 --- a/tests/test_coverage.py +++ /dev/null @@ -1,216 +0,0 @@ -import re -import shutil -import xml.etree.ElementTree as ET -from pathlib import Path -from typing import Optional - -import pytest - -LINES_VALID = 8 -MISSES = 0 -LINE_COV = "100.0".replace(".", r"\.") -FUNC_COV = "100.0".replace(".", r"\.") - -EXPECTED_COVERAGE_REPORT = r""" -\s*=+\s*Coverage Profile\s*=+\s* -\s*\s*coverage_test Coverage\s*\s* -\s* -\s*Func\s+Stmts\s+Miss\s+Cover\s* -\s*─+\s* -\s*__cannot_send_ether_to_nonpayable_function__\s+1\s+0\s+100\.0%\s* -\s*__fallback_not_defined__\s+1\s+0\s+100\.0%\s* -\s*_immutable_number\s+0\s+0\s+100\.0%\s* -\s*_number\s+0\s+0\s+100\.0%\s* -\s*foo_method\(\)\s+1\s+0\s+100\.0%\s* -\s*foo_method\(uint256\)\s+1\s+0\s+100\.0%\s* -\s*foo_method\(uint256,uint256\)\s+3\s+0\s+100\.0%\s* -\s*view_method\s+1\s+0\s+100\.0%\s* -\s* -\s*line=100\.0%, func=100\.0%\s* -\s* -\s*exclude_part_of_contract Coverage\s* -\s* -\s*Func\s+Stmts\s+Miss\s+Cover\s* -\s*─+\s* -\s*__fallback_not_defined__\s+1\s+1\s+0\.0%\s* -\s*include_me\s+1\s+1\s+0\.0%\s* -\s* -\s*line=0\.0%, func=0\.0%\s* -""".lstrip() -COVERAGE_START_PATTERN = re.compile(r"=+ Coverage Profile =+") - - -@pytest.fixture -def coverage_project_path(projects_path): - return projects_path / "coverage_project" - - -@pytest.fixture -def coverage_project(config, coverage_project_path): - build_dir = coverage_project_path / ".build" - shutil.rmtree(build_dir, ignore_errors=True) - - with config.Project.create_temporary_project() as tmp_project: - shutil.copytree(coverage_project_path, tmp_project.path, dirs_exist_ok=True) - yield tmp_project - - shutil.rmtree(build_dir, ignore_errors=True) - - -@pytest.fixture -def setup_pytester(pytester, coverage_project): - tests_path = coverage_project.tests_folder - - # Make other files - def _make_all_files(base: Path, prefix: Optional[Path] = None): - if not base.is_dir(): - return - - for file in base.iterdir(): - if file.is_dir() and not file.name == "tests": - _make_all_files(file, prefix=Path(file.name)) - elif file.is_file(): - name = (prefix / file.name).as_posix() if prefix else file.name - - if name == "ape-config.yaml": - # Hack in in-memory overrides for testing purposes. - text = str(coverage_project.config) - else: - text = file.read_text(encoding="utf8") - - src = {name: text.splitlines()} - pytester.makefile(file.suffix, **src) - - # Assume all tests should pass - num_passes = 0 - num_failed = 0 - test_files = {} - for file_path in tests_path.iterdir(): - if file_path.name.startswith("test_") and file_path.suffix == ".py": - content = file_path.read_text(encoding="utf8") - test_files[file_path.name] = content - num_passes += len( - [ - x - for x in content.split("\n") - if x.startswith("def test_") and not x.startswith("def test_fail_") - ] - ) - num_failed += len([x for x in content.split("\n") if x.startswith("def test_fail_")]) - - pytester.makepyfile(**test_files) - _make_all_files(coverage_project.path) - - # Check for a conftest.py - conftest = tests_path / "conftest.py" - if conftest.is_file(): - pytester.makeconftest(conftest.read_text(encoding="utf8")) - - # Returns expected number of passing tests. - return num_passes, num_failed - - -def test_coverage(geth_provider, setup_pytester, coverage_project, pytester): - passed, failed = setup_pytester - result = pytester.runpytest_subprocess("--coverage") - try: - result.assert_outcomes(passed=passed, failed=failed) - except ValueError: - pytest.fail(str(result.stderr)) - - actual = _get_coverage_report(result.outlines) - expected = [x.strip() for x in EXPECTED_COVERAGE_REPORT.split("\n")] - _assert_coverage(actual, expected) - - # Ensure XML was created. - base_dir = pytester.path / ".build" - xml_path = base_dir / "coverage.xml" - _assert_xml(xml_path) - html_path = base_dir / "htmlcov" - assert html_path.is_dir() - index = html_path / "index.html" - assert index.is_file() - _assert_html(index) - - -def _get_coverage_report(lines: list[str]) -> list[str]: - ret = [] - started = False - for line in lines: - if not started: - if COVERAGE_START_PATTERN.match(line): - # Started. - started = True - ret.append(line.strip()) - else: - # Wait for start. - continue - - elif started and re.match(r"=+ .* =+", line): - # Ended. - ret.append(line.strip()) - return ret - - else: - # Line in between start and end. - ret.append(line.strip()) - - return ret - - -def _assert_coverage(actual: list[str], expected: list[str]): - for idx, (a_line, e_line) in enumerate(zip(actual, expected)): - message = f"Failed at index {idx}. Expected={e_line}, Actual={a_line}" - assert re.match(e_line, a_line), message - - -def _assert_xml(xml_path: Path): - assert xml_path.is_file() - xml = xml_path.read_text(encoding="utf8") - assert '' in xml - - # Show is valid XML. - tree = ET.parse(str(xml_path)) - - # Assert there are sources. - sources = tree.find("sources") - assert sources is not None - source = sources.find("source") - assert source is not None - assert source.text is not None - assert "contracts" in source.text - - # Assert there are statements. - packages = tree.find("packages") - assert packages is not None - package = packages.find("package") - assert package is not None - classes = package.find("classes") - assert classes is not None - _class = classes.find("class") - assert _class is not None - lines = _class.find("lines") - assert lines is not None - line = lines.find("line") - assert line is not None - assert "hits" in line.keys() - assert "number" in line.keys() - - -def _assert_html(index_html: Path): - html = index_html.read_text(encoding="utf8") - assert html.startswith("") - assert "Generated by Ape Framework" in html - expected_columns = ( - "Source", - "Statements", - "Missing", - "Statement Coverage", - "Function Coverage", - ) - for idx, column in enumerate(expected_columns): - col_no = idx + 1 - expected_col_tag = f'{column}' - assert expected_col_tag in html - - assert "100.0%" in html