diff --git a/.flake8 b/.flake8 deleted file mode 100644 index 8dcf28a7..00000000 --- a/.flake8 +++ /dev/null @@ -1,12 +0,0 @@ -[flake8] -# See https://pycodestyle.pycqa.org/en/latest/intro.html#error-codes -ignore = - # E203: whitespace before ‘,’, ‘;’, or ‘:’ - E203, - # E266: too many leading ‘#’ for block comment - E266, - # E501: line too long - E501, - # W503: line break before binary operator - W503 -exclude = .git,docs,__init__.py diff --git a/.github/workflows/formatting.yml b/.github/workflows/formatting.yml new file mode 100644 index 00000000..5cac6697 --- /dev/null +++ b/.github/workflows/formatting.yml @@ -0,0 +1,19 @@ +name: dimelo-formatting +on: [ pull_request ] +jobs: + ruff-check: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: chartboost/ruff-action@v1 + with: + version: 0.6.8 + # TODO: Is it really necessary for these to be separate jobs? This seems redundant. + ruff-format-check: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: chartboost/ruff-action@v1 + with: + version: 0.6.8 + args: 'format --check' diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index a10d46a5..5c62aa79 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -1,65 +1,42 @@ -name: dimelo +name: dimelo-test -on: [push] +on: + workflow_dispatch: # Allows manual trigger of the workflow + pull_request: # Trigger by default on PR opened, reopened, or synchronized (commits pushed to PR) jobs: - build-conda: - runs-on: ubuntu-latest + platform_matrix: # Run the tests on each supported platform strategy: matrix: - python-version: ["3.7"] - + platform: # Define the platform tag and the file name of the appropriate miniconda install script + - os: ubuntu-latest + miniconda: Miniconda3-latest-Linux-x86_64.sh + - os: macos-latest + miniconda: Miniconda3-latest-MacOSX-x86_64.sh + runs-on: ${{ matrix.platform.os }} steps: - - uses: actions/checkout@v3 - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v3 - with: - python-version: ${{ matrix.python-version }} - # TODO: If we change the name of the dimelo subdirectory, conda install as written here should break. - # Installing format dependencies with pip for full compatibility - - name: Install dependencies - run: | - $CONDA/bin/conda env update --file environment_linux.yml --name base - pip install flake8 black isort - $CONDA/bin/conda install pytest - - name: Lint with flake8 - run: | - flake8 - - name: Check format with black - run: | - black --config pyproject.toml --diff --check . - - name: Clean up and sort imports - run: | - isort --check-only . - - name: Test with pytest - run: | - $CONDA/bin/pytest - - build-pip: - runs-on: ubuntu-latest - strategy: - matrix: - python-version: ["3.7"] - steps: - - uses: actions/checkout@v3 - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v3 - with: - python-version: ${{ matrix.python-version }} - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install flake8 black isort pytest + - uses: actions/checkout@v4 + - name: Setup conda and run pytest + run: | + # Install Miniconda if not available on the runner + wget https://repo.anaconda.com/miniconda/${{ matrix.platform.miniconda }} -O miniconda.sh + bash miniconda.sh -b -p $HOME/miniconda + source $HOME/miniconda/etc/profile.d/conda.sh + + # Create conda environment from environment.yml + conda env create -f environment.yml + + # Activate the environment + conda activate $(head -n 1 environment.yml | cut -d' ' -f2) + + # Install pip dependencies and the package itself pip install . - - name: Lint with flake8 - run: | - flake8 - - name: Check format with black - run: | - black --diff --check . - - name: Clean up and sort imports - run: | - isort --check-only . - - name: Test with pytest - run: | + + # Additional testing dependencies not covered in environment.yml + conda install pytest + + # Make sure everything is installed correctly + conda list + + # Run pytest pytest diff --git a/.gitignore b/.gitignore index c8b25e67..f6236edc 100644 --- a/.gitignore +++ b/.gitignore @@ -53,4 +53,12 @@ coverage.xml .pytest_cache/ # Sphinx documentation -docs/_build/ \ No newline at end of file +docs/_build/ + + +# Ignore tutorial output files +dimelo/test/output + +# Checkpoint files +.ipynb_checkpoints/ + diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f4837ea6..5194a15d 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,15 +1,16 @@ repos: - - repo: https://github.com/psf/black - rev: 22.3.0 - hooks: - - id: black - - repo: https://gitlab.com/pycqa/flake8 - rev: 3.9.2 - hooks: - - id: flake8 - - repo: https://github.com/pycqa/isort - rev: 5.9.3 - hooks: - - id: isort - name: isort (python) - additional_dependencies: [toml] +- repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.6.8 + hooks: + # Run the linter. + - id: ruff + # Run the formatter. + - id: ruff-format +# - repo: https://github.com/pre-commit/mirrors-mypy +# rev: v1.9.0 +# hooks: +# - id: mypy + # These are things I'm considering including in the ignore list, but should think about... + # Ignore missing import errors caused by pre-commit being run in an isolated environment + # Allow conflicting assignment to existing variables in reasonable circumstances; mainly for coersion of path strings + # args: [--ignore-missing-imports, --allow-redefinition] diff --git a/LICENSE b/LICENSE deleted file mode 100644 index c29515a8..00000000 --- a/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2021 amaslan - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/Makefile b/Makefile deleted file mode 100644 index c322dbee..00000000 --- a/Makefile +++ /dev/null @@ -1,57 +0,0 @@ -define help - -Supported targets: prepare, develop, sdist, clean, test, and pypi. - -The 'prepare' target installs this project's build requirements into the current virtualenv. - -The 'develop' target creates an editable install of this project and its runtime requirements in the -current virtualenv. The install is called 'editable' because changes to the source code -immediately affect the virtualenv. - -The 'clean' target undoes the effect of 'develop'. - -The 'test' target runs unit tests. Set the 'tests' variable to run a particular test, e.g. - - make test tests=PlotMAPQtest/countMAPQ_test.py - -The 'pypi' target publishes the current commit of this project to PyPI after enforcing that the working -copy and the index are clean, and tagging it as an unstable .dev build. - -endef -export help -help: - @printf "$$help" - -SHELL=bash -python=python -pip=pip -tests=. -version:=$(shell $(python) version.py) -sdist_name:=dimelo-$(version).tar.gz - -develop: - $(pip) install -e . - -clean_develop: - - $(pip) uninstall -y dimelo - - rm -rf *.egg-info - -clean_sdist: - - rm -rf dist - -clean: clean_develop clean_pypi - -check_build_reqs: - @$(python) -c 'import pytest' \ - || ( printf "$(redpip)Build requirements are missing. Run 'make prepare' to install them.$(normal)" ; false ) - -test: check_build_reqs - $(python) -m pytest -vv $(tests) - -pypi: clean clean_sdist - set -x \ - && $(python) setup.py sdist bdist_wheel \ - && twine check dist/* \ - && twine upload --repository-url https://test.pypi.org/legacy/ dist/* -clean_pypi: - - rm -rf build/ \ No newline at end of file diff --git a/README.md b/README.md index 0b188e90..a5746096 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,371 @@ -[![Build Status](https://github.com/streetslab/dimelo/actions/workflows/test.yml/badge.svg)](https://github.com/streetslab/dimelo/actions) -[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) +# dimelo +## Introduction -# DEPRECATION NOTICE: -This version of the package is currently unmaintained. Aside from a number of performance issues, it is becoming increasingly difficult to install across many platforms. We are actively working on a completely overhauled version. If you are interested in using our new software, please reach out to us! We would love to work with you to facilitate your DiMeLo-seq analysis. +The `dimelo` package provides an integrated pipeline for the analysis of multimodal single molecule epigenetic measurements. It is designed with long-read sequencing measurements in mind, but is compatible with any sequencing processing pipeline that generates specification-compliant modbam files. -# dimelo -dimelo is a python package and command-line tool for analysis of DiMeLo-seq & nanopore modified base data. +v0.2.0 is a major overhaul compared to v0.1.0. It supports the same core pileup and single read extraction operations as the original `dimelo v0.1.0` package, but focuses on a number of new objectives: + +
    +
  1. Support multicolor data / any base modification context (GpC, CpC, etc)
  2. +
  3. Vector extraction for all data types
  4. +
  5. Enhanced speed and reliability, enabling e.g. whole genome processing
  6. +
  7. Maintainability -> using a small number of standard dependencies, outsourcing as much as possible to well-maintained third-party packages (e.g. modkit, pysam, h5py, and a few others)
  8. +
  9. Modularity in both architecture and operation
  10. +
  11. Ease of use, especially for multiplatform installation
  12. +
  13. More powerful plotting e.g. bam files from different basecallers, single read sorting, rapid iteration
  14. +
+ +This README document contains installation instructions and documentation for various use cases. There is a [tutorial](#basic-use) jupyter notebook that will take you through the core functionality of the package step-by-step. For Google Colab, the notebook already contains the necessary code to set up and run `dimelo`, whereas for local operation you will first need to follow the [local install instructions](#local-install-via-conda). Be sure to check that your system meets our [specifications](#system-requirements). The software is still in early release, and as such, user feedback and requests are greatly appreciated. + +## Contents +[1.0 Install Instructions](#Install-instructions) + +-[1.1 Local Install via Conda](#Local-Install-via-Conda) + +-[1.2 Google Colab Installation](#Google-Colab-Installation) + +-[1.3 Alternative Installations](#Alternative-Installations) + +-[1.4 Developer Installation](#Developer-Installation) + +[2.0 Basic Use](#Basic-Use) + +-[2.1 Parameters and what they mean](#Parameters-and-what-they-mean) + +-[2.2 Parsing and processing](#Parsing-and-processing) + +-[2.3 Plotting](#Plotting) + +-[2.4 Load values from processed files](#load-values-from-processed-files) + +[3.0 Known Issues](#known-issues) + +-[3.1 No progress bars](#no-progress-bars) + +# Install Instructions +## Local Install via Conda + +### System Requirements + +**System Specs:** You will need at least 10GB of disk space and 10GB of RAM for the tutorial (largely due to the reference genome). More disk space may be required if processing large datasets. Additionally, if you want to run on many cores, you should have at least 4GB of RAM per core. If you have less per-core memory than this, consider specifying a subset of cores when calling parsing methods. See the [parameters](#parameters-and-what-they-mean) section for more information. `cores=1` will use the least memory and thus is the least likely to be terminated by your OS. + +**Platforms:** Mac and Linux operating systems, ARM (e.g. M1/M2 mac) and x86 (e.g. Intel mac) architectures. The package has been tested on HPC clusters, but there may be additional complexities depending on how these systems are set up. + +*For Windows, we recommend using [Google Colab](https://colab.research.google.com/). We have not tested on [Windows Linux Subsystem](https://learn.microsoft.com/en-us/windows/wsl/install) but in principle that should work too. Windows support is possible in future, but blocked by [conda availability for modkit executables](https://anaconda.org/nanoporetech/modkit) and the [current implementation](dimelo/run_modkit.py) of live error/progress tracking during modkit execution, which relies on a unix-only library as of Python 3.11. The urgency of a Windows implementation will depend on user need, so please let us know if this is important for you.* + +**Conda and Python:** The default installation requires conda, or alternatives like mamba. See [here](https://www.anaconda.com/download) for conda installation. The installation instructions below will install Python 3.11 for you within a conda virtual environment, but depending on your system configuration you may need to ensure that you are not also loading a different version of Python on your path. If you encounter unexpected errors when importing `dimelo`, e.g. complaining about syntax, consider checking your Python version. + +### Load source code from the modkit_parsing_beta branch + +Open your terminal or command line and navigate to wherever you want to keep the `dimelo` source code (e.g. your Documents folder, `cd Documents`) and clone the repo + +``` +git clone https://github.com/streetslab/dimelo +``` + +### Set up virtual environment + +Navigate into the dimelo directory + +``` +cd dimelo +``` + +Create a conda environment using environment.yml. This will make a new conda environment with the name `dimelo`. + +``` +conda env create -f environment.yml +``` + +*If you want to handle environment creation yourself, see [the alternative installation instructions](#alternative-installations).* + +### Install pip dependencies and core dimelo package + +Activate your conda environment, which should now contain python 3.11 and a modkit executable on the path and executable on your system. + +``` +conda activate dimelo +``` + +Ensure that you are still in the top-level dimelo directory. Install the dimelo package and its dependencies from source. + +``` +pip install . +``` + +## Google Colab Installation + +Run the following code in the first cell of your notebook to grab `modkit v0.2.4` from conda and install the `dimelo modkit_parsing_beta` branch. This will have to be run whenever you make a new Colab instance, unless you have a better way of managing this, in which case please reach out. The tutorial notebook runs equivalent code blocks to set up your environment, so if you are trying to run the tutorial you can skip to [Basic Use](#basic-use). + +``` +from google.colab import drive +drive.mount('/content/drive') +!pip install -q condacolab +import condacolab +condacolab.install() +!conda install nanoporetech::modkit==0.2.4 +!git clone https://github.com/streetslab/dimelo +!cd dimelo && pip install ipywidgets==7.7.1 . +import dimelo +``` + +## Alternative Installations + +Alternatively, you can install modkit into any conda environment you like. If you want to, you can install modkit some other way, and then add it to the path of your notebook or script. *NOTE: if you are creating the environment yourself, be sure to use python 3.10 or greater. Some dimelo package features require relatively new python releases.* + +``` +conda install nanoporetech::modkit==0.2.4 +``` +OR +``` +# install modkit some other way +# add to path in python before importing dimelo +import sys +sys.path.append('path_to_modkit_executable_directory') +``` + +## Developer Installation +If you are planning on developing for the `dimelo` package, change the `pip install` command to install the package in "editable" mode, so that your code changes are reflected in your environment: +``` +pip install . -e +``` + +Additionally, be aware that this package uses [ruff](https://docs.astral.sh/ruff/) to enforce code standards. To make it easy to check that your changes meet standards, we provide [pre-commit](https://pre-commit.com/) hooks that run the checks automatically when you commit. + +After installing [pre-commit](https://pre-commit.com/) on your system, run the following from the top level of the repository to set up the hooks: +``` +pre-commit install +``` + +If you need to manually trigger a formatting check, the following command will forcibly run all checks on the entire repository: +``` +pre-commit run --all-files +``` + +To run functionality tests on your machine, ensure that `pytest` is installed in your conda environment: +``` +conda install pytest +``` + +The tests can be run from the top level of the repository using the following command: +``` +pytest +``` + +# Basic Use + +See the [tutorial](tutorial.ipynb) as a starting point. + +For local operation on Mac or Linux, you will already have cloned the repo to disk in the installation step. Activate your conda environment, make sure you have jupyter installed, and then launch a jupyter notebook server and navigate to `tutorial.ipynb`. You can also use other tools to open the jupyter notebook or you can simply reference it as an example. + +``` +conda activate dimelo +jupyter notebook +``` + +If you want to run the tutorial on Google Colab, you can download [tutorial.ipynb](tutorial.ipynb), upload it to [Google Colab](https://colab.research.google.com/), and follow the instructions in the cells. + +## Parsing and processing + +The general workflow of this package is as follows: +``` +Parsing: aligned modbam file (latest .bam spec) --> processed file +Loading: processed file --> python objects +Plotting: python objects --> visualizations +``` + +Both pileup and extract are typically run with a .bed file of regions, which can then be also passed to the plotting functions. All regions are processed into a file called `regions.processed.bed` which follows the format required by `modkit`: +``` +chr14 44123158 44123308 + . . +``` + +`parse_bam.pileup` creates a bedmethyl genome-position-wise pileup for profiles and enrichment plotting between regions/modifications or for pulling out a genomic track at one or more regions. + +``` +def pileup( + input_file: str | Path, + output_name: str, + ref_genome: str | Path, + output_directory: str | Path = None, + regions: str | Path | list[str | Path] = None, + motifs: list = ['A,0','CG,0'], + thresh: float = None, + window_size: int = None, + cores: int = None, + log: bool = False, + cleanup: bool = True, + quiet: bool = False, + override_checks: bool = False,) -> Path, Path: +``` + +`parse_bam.extract` creates an hdf5 file with datasets for different aspects of single read data, which can then be passed to plot single reads. +``` +def extract( + input_file: str | Path, + output_name: str, + ref_genome: str | Path, + output_directory: str | Path = None, + regions: str | Path | list[str | Path] = None, + motifs: list = ['A,0','CG,0','GCH,1'], + thresh: float = None, + window_size: int = None, + cores: int = None, + log: bool = False, + cleanup: bool = True, + quiet: bool = False, + override_checks: bool = False,) -> Path, Path: +``` + +For human-readable pileups (bedmethyl files, .bed) and extracted reads (.txt tab-separated values), run with `cleanup=False`. `cleanup=True` will clear these outputs because they can take up a lot of space. + +### Parsing outputs +You should expect to see some text outputs and a series of progress bars. Progress bars tell you an estimated time remaining (typically an overestimate by 2-3x at the beginning of contig/chromosome). If you do not see progress bars, go to the [known issues: no progress bars](#no-progress-bars) section for possible fixes. + +There should not be such issues for command line operation. See below an example of command line progress outputs: you should expect relatively fast pre-processing, 10-90 seconds, and then contig processing times depending heavily on the size of your `.bam` file and the extent of your `regions`. + +``` +(dimelo_modkit_parsing) oberondixon-luinenburg@Oberons-MacBook-Pro package_test_notebooks % python dimelo_cmd.py +modkit found with expected version 0.2.4 +No output directory provided, using input directory /Users/oberondixon-luinenburg/Documents/Ioannidis-Streets/dimelo_test_data/20230702_jm_lmnb1_acessibility_redux +No specified number of cores requested. 8 available on machine, allocating all. +Modification threshold of 0.9 will be treated as coming from range 0-1. +████████████████████| Preprocessing complete for motifs ['A,0'] in chm13.draft_v1.1.fasta: 100% | 00:30 +███████████████████| All regions complete in mod_mappings.01.retagged.ma.sorted.bam: 100% | 02:23<00:00 +████████████████| processed 218324 reads, 13323144 rows, skipped ~184465 reads, failed ~0 reads: 100% +``` + +You should see no outputs at all if `quiet=True`. + +## Plotting + +`plot_enrichment_profile` module for pileup line plot profiles across one or more region +``` +def plot_enrichment_profile(mod_file_names: list[str | Path], + regions_list: list[str | Path | list[str | Path]], + motifs: list[str], + sample_names: list[str], + window_size: int, + smooth_window: int | None = None, + **kwargs) -> Axes: +def by_modification(mod_file_name: str | Path, + regions: str | Path, + motifs: list[str], + *args, + **kwargs) -> Axes: +def by_regions(mod_file_name: str | Path, + regions_list: list[str | Path | list[str | Path]], + motif: str, + sample_names: list[str] = None, + *args, + **kwargs) -> Axes: +def by_dataset(mod_file_names: list[str | Path], + regions: str | Path | list[str | Path], + motif: str, + sample_names: list[str] = None, + *args, + **kwargs) -> Axes: +``` +`plot_enrichment` module for enrichment (e.g. mA/A) bar plot comparisons +``` + +def plot_enrichment(mod_file_names: list[str | Path], + regions_list: list[str | Path | list[str | Path]], + motifs: list[str], + sample_names: list[str], + **kwargs) -> Axes: +def by_modification(mod_file_name: str | Path, + regions: str | Path | list[str | Path], + motifs: list[str], + *args, + **kwargs) -> Axes: +def by_regions(mod_file_name: str | Path, + regions_list: list[str | Path | list[str | Path]], + motif: str, + sample_names: list[str] = None, + *args, + **kwargs) -> Axes: +def by_dataset(mod_file_names: list[str | Path], + regions: str | Path | list[str | Path], + motif: str, + sample_names: list[str] = None, + *args, + **kwargs) -> Axes: +``` +`plot_reads` module for single read plots +``` +def plot_reads(mod_file_name: str | Path, + regions: str | Path | list[str | Path], + motifs: list[str], + window_size: int = None, + sort_by: str | list[str] = 'shuffle', + thresh: float = None, + relative: bool = True, + **kwargs + ) -> Axes: +``` +## Load values from processed files + +`load_processed.pileup_counts_from_bedmethyl` for valid/modified counts from a specified region or set of regions +``` +def pileup_counts_from_bedmethyl(bedmethyl_file: Path, + motif: str, + regions: str | Path | list[str | Path] = None, + ) -> tuple[int, int]: +``` +`load_processed.pileup_vectors_from_bedmethyl` for valid over modified fraction from a specified region or set of regions +``` +def pileup_vectors_from_bedmethyl(bedmethyl_file: str | Path, + motif: str, + regions: str | Path | list[str | Path], + window_size: int = None) -> (np.ndarray,np.ndarray): +``` +`load_processed.read_vectors_from_hdf5` for read-by-basemod lists of valid and modified positions +``` +def read_vectors_from_hdf5( + file: str | Path, + motifs: list[str], + regions: str | Path | list[str | Path] = None, + window_size: int = None, + sort_by: str | list[str] = ['chromosome','region_start','read_start'], + calculate_mod_fractions: bool = True, +) -> (list[tuple],list[str],dict): +``` + +## Parameters and what they mean + +Many of the parsing, loading, and plotting functions share parameters. The common ones and their meanings/defaults are listed below: + +`input_file` for parsing functions is a mandatory parameter providing the path to an aligned .bam file with modification calls, a .bam.bai index, and tags following the latest .bam specifications. parse_bam will check whether this .bam file meets the specifications and tell you what to do if it doesn't. + +`output_name` for parsing functions is a mandatory string parameter that will be given to the new folder containing the processed outputs. + +`ref_genome` for parsing functions is a mandatory parameter providing the path to the reference genome .fasta file to which the `input_file` .bam is aligned. + +`output_directory` for parsing functions is an optional parameter specifying a parent directory for your outputs. By default, this will simply be the directory in which you `input_file` resides. + +`mod_file_name` and `mod_file_names` for plotting functions are mandatory parameters providing a path to processed/parsed files that are ready for plotting. These paths are returns by the parsing functions but can also be provided manually by the user as a string or Path object. If providing manually, the path should point to a .bed.gz file with an accompanying .bed.gz.tbi index for profile and enrichment plots and to an .h5 file for read plots. `mod_file_name` points to a single file whereas `mod_files_names` is a list of files. + +`regions` and `regions_list` are used for specifying subsets of the genome to parse, load, or plot. A `region` is defined as a range of genomic coordinates, and `regions` can refer to any number of `region` specifications. Thus for the `regions` parameter one can pass a single region specified as a string, `chrX:XXX-XXX`, many regions defined in a .bed tab-separated-value file with each line containing at miniimum chromosome, start, and end coordinates (plus optionally a strand, + or -), or a list of strings specifiers or bed files. The entire list will be rolled into a single `regions` set to be passed down for subsequent processing. In the case of regions-wise comparisons in plotting functions, `regions_list` is a *list of regions objects*, where each element of the list is a string, Path, or list of strings or Paths. + +`motif` and `motifs` are used to specify what base modifications you are interested in and what their sequence context is for parse, load, and plot functions. A single `motif` is a string containing several canonical bases (using the [IUPAC nucleic acid notation](https://en.wikipedia.org/wiki/Nucleic_acid_notation), e.g. **H** refers to "not a G"), followed by a comma, and then an integer specifying which coordinate in the string is your modified base. For example, 6mA is denoted "A,0" and CpG is denoted "CG,0" whereas GpC *excluding CpGs* is denoted "GCH,1". `motifs` is a list of such strings for functions that can work on multiple base modifications at once. + +`thresh` for parsing and some loading/plotting functions refers to a base modification probability threshold, used to transform the the output of most basecalling pipelines into a binary call for any given read position. For parsing pileup calls, this defaults to `None` which allows `modkit` to pick its own threshold based on the data. For other calls, the parameter is mandatory. The normal use is specifying between 0 and 1, but 1-255 is also supported to make the inputs more backwards compatible with old `dimelo` package versions and with examination of the raw .bam file contents. A value between and 255 will simply be converted into a 0-1 probability before being handed down to subsequent processing. + +`window_size` for parsing and most loading and plotting functions is a *modification to your regions* that will redefine them to be all the same size, i.e. 2 x window_size, centered around the centers of your original regions. This is important for the parsing and plotting applications that show many genomic regions at once, but should be left blank if you don't want your regions modified. The default is `None` for functions where the parameter is optional. + +`cores`, `log`, `cleanup`, `quiet`, and `override_checks` can be ignored for most parsing applications. `cores` allows you to specify that `modkit` uses only a fraction of all the compute resources of your machine, rather than all; `log` will save the modkit logs for troubleshooting, and `cleanup` will keep the (often large) human-readable outputs that are inefficient for plotting and vector extraction but may be helpful for other use cases. `quiet` suppressed progress bars and other outputs and `override_checks` lets you run modkit even if the bam format checking and reference alignment checking are anomalous. + +`relative` is a boolean input that specifies whether loading and plotting operations adjust coordinates to be relative to some center point or simple plot in absolute genomic coordinates. + +`sort_by` for plot_reads will sort reads by any of `region_start`, `region_end`, `read_name`, `read_start`, `read_end`, `chromosome`, `strand`, and `MOTIF_mod_fraction` for any extracted motif. New sorting options are planned in the future. The default is `shuffle`, which will put the reads in a random order. `sort_by` can be passed as one string or as a list of strings. If a list is passed, the reads will be sorted hierarchically i.e. first by the first list element, then the second, and so on. The exception is that if any of the list elements are `shuffle`, the reads will *first* be shuffled and then sorted by the rest of the elements in order of priority. + +`**kwargs` for all plotting functions get passed down to the underlying matplotlib / seaborn plotting functions. See matplotlib and seaborn documentation for more details. + +# Known Issues +## No progress bars +The most common culprit for progress bar issues in notebooks (Jupyter or Colab) is an incompatibility between your notebooks interfaces and your `ipywidgets` version. The latest jupyter notebooks or jupyter lab install and the latest ipywidgets should work together, but on Google Colab, VS Code, Open On Demand, and other jupyter interfaces this may not be the case. [setup.py](setup.py) contains details on which versions you can try downgrading to for different platforms. The following code run in your activated conda environment will downgrade `ipywidgets` to your specified version. **Our Colab instructions in the [Colab Installation](#google-colab-installation) section and the [tutorial](tutorial.ipynb) already handle this for you.** + +``` +pip install ipywidgets==X.XX.X +``` -Documentation: https://streetslab.github.io/dimelo/ diff --git a/bin/dimelo-parse-bam b/bin/dimelo-parse-bam deleted file mode 100644 index db4d8fd1..00000000 --- a/bin/dimelo-parse-bam +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env python - -from dimelo.parse_bam import main - -# call main(), which takes in command line arguments. -main() diff --git a/bin/dimelo-plot-browser b/bin/dimelo-plot-browser deleted file mode 100644 index ee47afba..00000000 --- a/bin/dimelo-plot-browser +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env python - -from dimelo.plot_browser import main - -# call main(), which takes in command line arguments. -main() diff --git a/bin/dimelo-plot-enrichment b/bin/dimelo-plot-enrichment deleted file mode 100644 index 1ce07c13..00000000 --- a/bin/dimelo-plot-enrichment +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env python - -from dimelo.plot_enrichment import main - -# call main(), which takes in command line arguments. -main() diff --git a/bin/dimelo-plot-enrichment-profile b/bin/dimelo-plot-enrichment-profile deleted file mode 100644 index 64c7d651..00000000 --- a/bin/dimelo-plot-enrichment-profile +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env python - -from dimelo.plot_enrichment_profile import main - -# call main(), which takes in command line arguments. -main() diff --git a/bin/dimelo-qc-report b/bin/dimelo-qc-report deleted file mode 100644 index b7340e00..00000000 --- a/bin/dimelo-qc-report +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env python - -from dimelo.qc import main - -# call main(), which takes in command line arguments. -main() diff --git a/dimelo/__init__.py b/dimelo/__init__.py index 79dd5ea9..4906a851 100644 --- a/dimelo/__init__.py +++ b/dimelo/__init__.py @@ -1,20 +1,23 @@ -r""" -=============== -dimelo module -=============== -.. currentmodule:: dimelo +from . import ( + export, + load_processed, + parse_bam, + plot_depth_histogram, + plot_depth_profile, + plot_enrichment, + plot_enrichment_profile, + plot_read_browser, + plot_reads, +) -dimelo allows you to perform quality control and plot modified bases from bam files. - -.. automodule:: parse_bam -.. automodule:: plot_browser -.. automodule:: plot_enrichment -.. automodule:: plot_enrichment_profile -.. automodule:: qc_report - -""" -from .parse_bam import parse_bam -from .plot_browser import plot_browser -from .plot_enrichment import plot_enrichment -from .plot_enrichment_profile import plot_enrichment_profile -from .qc import qc_report +__all__ = [ + "export", + "load_processed", + "parse_bam", + "plot_depth_histogram", + "plot_depth_profile", + "plot_enrichment", + "plot_enrichment_profile", + "plot_read_browser", + "plot_reads", +] diff --git a/dimelo/export.py b/dimelo/export.py new file mode 100644 index 00000000..e2c973c9 --- /dev/null +++ b/dimelo/export.py @@ -0,0 +1,167 @@ +import os +from collections import deque +from pathlib import Path + +import pyBigWig +import pysam +from tqdm.auto import tqdm + +from . import load_processed, utils + +""" +This module contains code to export indexed and compressed parse output files to other formats that may be helpful for downstream analysis. +""" + + +def tail(n, iterable): + """ + Return an iterator over the last n items. + Copied from https://docs.python.org/3/library/itertools.html#itertools-recipes + """ + + # tail(3, 'ABCDEFG') → E F G + return iter(deque(iterable, maxlen=n)) + + +def pileup_to_bigwig( + bedmethyl_file: str | Path, + motif: str, + bigwig_file: str | Path | None = None, + ref_genome: str | Path | None = None, + strand: str = ".", + chunk_size: int = 1000, +): + """ + Extract a single motif from a pileup and write its mod fractions by position to a bigwig file. + + This function will take the entire contents of the pileup bedmethyl file and create a bigwig header with all of the same contigs, with + contig lengths in the bigwig header set to the highest motif coordinate for each contig. If strand is specified as + or -, only that + strand will be written to the output bigwig - this can allow for strand bias analysis in a genome browser. If strand is specified as ., + as is the default, both strands will be included. + + The operation can be quite slow for large pileups. The current design is that if you want to create a bigwig for a subset of the genome, + you can specify the regions at parsing time, rather than re-implementing the subset handling logic here. + + Args: + bedmethyl_file: Path to the input tabix-indexed gzipped bedmethyl file + motif: type of modification to extract data for + bigwig_file: Path to the output bigwig destination. If unspecified, a pileup.bw file will be created in the bedmethyl file's directory + ref_genome: a reference genome to use for constructing the bigwig header, i.e. contig lengths. If None, the bedmethyl file will be used + to estimate contig lengths, which can take some time. + strand: the DNA strand to extra, + or - for forward or reverse and . for both + chunk_size: size for bigwig write chunks, in bedmethyl lines + """ + bedmethyl_file, bigwig_file, ref_genome = utils.sanitize_path_args( + bedmethyl_file, bigwig_file, ref_genome + ) + + # Set up output directories if they don't exist; load up objects for bedmethyl tabix file and motif specifier + output_file_path = ( + bigwig_file + if bigwig_file is not None + else bedmethyl_file.parent / "pileup.fractions.bigwig" + ) + os.makedirs(output_file_path.parent, exist_ok=True) + tabix = pysam.TabixFile(str(bedmethyl_file)) + parsed_motif = utils.ParsedMotif(motif) + + # Because we need to set up the bigwig header before we start writing data to it, we need to pre-calculate the length of each contig + # The header essentially needs to contain a list of the contigs/chromosomes to which the data is aligned, and their sizes. + # There may be a way to adjust this as we write a bigwig file, but my testing with pyBigWig suggests that you must set it upfront + + contig_lengths_tuples = [] + lines_by_contig = {} + + # If we only have a bedmethyl file, we need to go through it to get contig lengths + if ref_genome is None: + for contig in tqdm( + tabix.contigs, + desc=f"Step 1: Indexing contigs in {bedmethyl_file.name} to set up bigwig header for {output_file_path.name}", + ): + # count up the number of rows, for progress tracking, and pull out the last row so as to grab the length of the chromosome + # note: the tqdm progress bar slows things down by about 33%, which was deemed better at the time of writing this than + # 90 seconds without any status updates + rows_count, last_row = list( + tail( + n=1, + iterable=enumerate( + tqdm( + tabix.fetch(contig), + mininterval=1.0, + desc=f"Indexing {contig}.", + leave=False, + ) + ), + ) + )[0] + fields = last_row.split("\t") + max_coord = int(fields[2]) + contig_lengths_tuples.append((contig, max_coord)) + lines_by_contig[contig] = rows_count + # If we have a fasta file we can just reference that for contig lengths + else: + # Open the reference genome fasta file using pysam + with pysam.FastaFile(ref_genome) as fasta: + for contig in tqdm( + tabix.contigs, # if these are in the wrong order, e.g. the order from the fasta, it is an issue for pyBigWig somehow + desc=f"Step 1: Indexing contigs in {ref_genome.name} to set up bigwig header for {output_file_path.name}", + ): + # Get the length of the contig + try: + contig_length = fasta.get_reference_length(contig) + except Exception as err: + raise ValueError( + f"Error loading {contig} length from {ref_genome.name}. Are you certain that {bedmethyl_file.name} is aligned to this reference?" + ) from err + contig_lengths_tuples.append((contig, contig_length)) + # if we used a fasta to calculate contig lengths we actually don't know the lines per contig + lines_by_contig[contig] = None + + with pyBigWig.open(str(output_file_path), "w") as bw: + bw.addHeader(contig_lengths_tuples) + for contig in tqdm( + tabix.contigs, + desc=f"Step 2: Writing {bedmethyl_file.name} contents to {output_file_path.name}", + ): + contig_list = [] + start_list = [] + end_list = [] + values_list = [] + + for row in tqdm( + tabix.fetch(contig), + desc=f"Writing {contig}.", + total=lines_by_contig[contig], + leave=False, + ): + keep_basemod, genomic_coord, modified_in_row, valid_in_row = ( + load_processed.process_pileup_row( + row=row, + parsed_motif=parsed_motif, + region_strand=strand, + single_strand=(strand != "."), + ) + ) + if keep_basemod and valid_in_row > 0: + contig_list.append(contig) + start_list.append(genomic_coord) + end_list.append(genomic_coord + 1) + values_list.append(modified_in_row / valid_in_row) + + if len(values_list) > chunk_size: + bw.addEntries( + contig_list, # Contig names + start_list, # Start positions + ends=end_list, # End positions + values=values_list, # Corresponding values + ) + contig_list = [] + start_list = [] + end_list = [] + values_list = [] + bw.addEntries( + contig_list, # Contig names + start_list, # Start positions + ends=end_list, # End positions + values=values_list, # Corresponding values + ) diff --git a/dimelo/load_processed.py b/dimelo/load_processed.py new file mode 100644 index 00000000..62a4556f --- /dev/null +++ b/dimelo/load_processed.py @@ -0,0 +1,1165 @@ +import concurrent.futures +import gzip +import multiprocessing +from collections import defaultdict +from functools import partial +from multiprocessing import shared_memory +from pathlib import Path + +import h5py +import numpy as np +import pysam +from tqdm.auto import tqdm + +from . import test_data, utils + +# the default chunk size is the number of bp to include per processing chunk in parallelization for loaders. +# 1e6 was empirically determined to be a good default: smaller than 1e5 we see slowdowns due to increased +# parallelization overhead, larger than 1e7 we see slowdowns due to worker utilization decreasing because even +# for whole chromosome processing there aren't always enough chunks to go around. In the 1e5-1e7 range, speed +# on 32 cores is fairly similar, but sitting in the middle of the range should support 10x more cores (beyond +# the reasonable upper bound) and 10x fewer cores (which is about the reasonable lower bound). +DEFAULT_CHUNK_SIZE = 1_000_000 + +################################################################################################################ +#### Loader wrappers #### +################################################################################################################ + + +def regions_to_list( + function_handle, + regions, + window_size: int | None = None, + quiet: bool = True, + cores: int | None = None, + split_large_regions: bool = False, + **kwargs, +): + """ + User-facing function. + + Run any standard load_processed pileup or extract loader loading each region from the region + specifier into a new element of a list. + + Args: + function_handle: the loader function you want to run. + regions: the region specifier. Typically we expect to get many regions for this function, in the form of a list + of strings or bed file paths. regions_to_list will run across all of these one-by-one returning a separate + function return for each independent region. + window_size: window around centers of regions, defaults to None + quiet: disables progress bars + cores: CPU cores across which to parallelize processing. Default to None, which means all available. + split_large_regions: if True, regions will be run sequentially in parallelized chunks. If False, + each individual region's chunks will be run sequentially but there will be parallelization across + regions, i.e. each core will be assigned one region at a time by the executor. Set to True if you + are running a small number of very large regions (e.g. one or two chromosomes), otherwise to to False (default). + **kwargs: all necessary keyword arguments to pass down to the loader + + Returns: + List(function_handle return objects per region) + """ + regions_dict = utils.regions_dict_from_input( + regions, + window_size, + ) + + # Flatten regions into a list of (chromosome, start, end, strand) + region_strings = [ + f"{chromosome}:{start}-{end},{strand}" + for chromosome, region_list in regions_dict.items() + for start, end, strand in region_list + ] + + cores_to_run = utils.cores_to_run(cores) + # quiet and cores logic below is driven by the following: + # If the parallelization is within regions: + # (1) progress bars should happen within regions if at all, because we assume regions are + # large if they make sense to parallelize + # (2) the cores_to_run will be allocated to within-region parallelization, and the top-level + # jobs sequence is run sequentially + with concurrent.futures.ProcessPoolExecutor( + max_workers=1 if split_large_regions else cores_to_run + ) as executor: + # Use functools.partial to pre-fill arguments + process_partial = partial( + apply_loader_function_to_region, + function_handle=function_handle, + quiet=quiet or not split_large_regions, + cores=cores_to_run + if split_large_regions + else 1, # if parallelization is within region + **kwargs, + ) + results = list( + tqdm( + executor.map(process_partial, region_strings), + total=len(region_strings), + desc="Loading data", + disable=quiet or split_large_regions, + leave=False, + ) + ) + + return results + + +def apply_loader_function_to_region(region_string, function_handle, **kwargs): + """ + apply_loader_function_to_region simply exists to convert position arguments into keyword arguments to make executor.map work + + Args: + region_string: passed down with regions keyword + function_handle: function to call with regions and other kwargs + **kwargs: all keyword arguments passed to regions_to_list. These must be sufficient for whichever load_processed function + if being referenced by function_handle + Returns: + function_handle return value + """ + return function_handle(regions=region_string, **kwargs) + + +################################################################################################################ +#### Pileup loaders #### +################################################################################################################ + + +def pileup_counts_from_bedmethyl( + bedmethyl_file: str | Path, + motif: str, + regions: str | Path | list[str | Path], + window_size: int | None = None, + single_strand: bool = False, + quiet: bool = False, + cores: int | None = None, + chunk_size: int = DEFAULT_CHUNK_SIZE, +) -> tuple[int, int]: + """ + User-facing function. + + Extract number of modified bases and total number of bases from the given bedmethyl file. + Called by plotters or by the user. + + This function loops through all the provided regions and pulls those regions up in the input + sorted and indexed bedmethyl file. For rows within those regions, checks that the motif + is correct (i.e. sequence context, modified base, mod code, and optionally strand). All + correct locations are included in the sum counts that get returned. + + If no regions are specified, returns the sum total for the motif of interest across the + entire bedmethyl file. + + TODO: Consider renaming this method, e.g. counts_from_pileup + + Args: + bedmethyl_file: Path to bedmethyl file + regions: Path to bed file specifying regions + motif: type of modification to extract data for + window_size: (currently disabled) window around center of region, +-window_size + single_strand: True means we only grab counts from reads from the same strand as + the region of interest, False means we always grab both strands within the regions + quiet: disables progress bars + cores: CPU cores across which to parallelize processing. Default to None, which means all available. + chunk_size: size of genomic subregions to assign out to each process + + Returns: + tuple containing counts of (modified_bases, total_bases) + """ + + parsed_motif = utils.ParsedMotif(motif) + + regions_dict = utils.regions_dict_from_input(regions, window_size) + chunks_list = utils.process_chunks_from_regions_dict( + regions_dict, chunk_size=chunk_size + ) + + cores_to_run = utils.cores_to_run(cores) + + # Initialize shared memory as length-one numpy arrays to make it easy to map to buffer in subprocesses + shm_valid = shared_memory.SharedMemory( + create=True, size=np.dtype(np.int32).itemsize + ) + shm_modified = shared_memory.SharedMemory( + create=True, size=np.dtype(np.int32).itemsize + ) + + manager = multiprocessing.Manager() + lock = manager.Lock() + + with concurrent.futures.ProcessPoolExecutor(max_workers=cores_to_run) as executor: + futures = [ + executor.submit( + pileup_counts_process_chunk, + bedmethyl_file, + parsed_motif, + chunk, + shm_modified.name, + shm_valid.name, + lock, + single_strand, + ) + for chunk in chunks_list + ] + for future in tqdm( + concurrent.futures.as_completed(futures), + total=len(futures), + disable=quiet, + desc="Loading data", + leave=False, + ): + try: + future.result() + except Exception as err: + raise RuntimeError("pileup_counts_process_chunk failed.") from err + + # Directly convert shared memory buffers to integers + modified_base_count = int.from_bytes( + shm_modified.buf[:4], byteorder="little", signed=True + ) + valid_base_count = int.from_bytes( + shm_valid.buf[:4], byteorder="little", signed=True + ) + # Close and unlink shared memory - not fully handled by garbage collection otherwise + shm_modified.close() + shm_modified.unlink() + shm_valid.close() + shm_valid.unlink() + + return modified_base_count, valid_base_count + + +def pileup_vectors_from_bedmethyl( + bedmethyl_file: str | Path, + motif: str, + regions: str | Path | list[str | Path], + window_size: int | None = None, + single_strand: bool = False, + regions_5to3prime: bool = False, + quiet: bool = False, + cores: int | None = None, + chunk_size: int = DEFAULT_CHUNK_SIZE, +) -> tuple[np.ndarray, np.ndarray]: + """ + User-facing function. + + Extract per-position pileup counts at valid motifs across one or more superimposed regions. + Called by profile plotters, can also be used by a user directly. + + Returns two vectors: + * Total number of times a modified base in the motif was found at each position + * Total number of times the motif was found at each position + + This function loops through all the provided regions and fetches those regions from the + bedmethyl file. For rows within those regions, it checks that the motif + is correct (i.e. sequence context, modified base, mod code, and optionally strand). It then adds + to two vectors (mod and valid). By default all regions are assumed to + be the same size (the size of the first region). + + If regions_5to3prime is set to True, then negative strand regions are flipped to that all regions + are superimposed along the 5 prime to 3 prime direction, which can be helpful if there is + directionality to the signal (e.g. upstream v downstream relative to TSSs, TF binding sites, and so on). + A region must be provided because otherwise there is no way to know what vector to return. + However, a region can be a whole chromosome if desired. + + TODO: Consider renaming this method, e.g. vectors_from_pileup + + Args: + bedmethyl_file: Path to bedmethyl file + regions: Path to bed file specifying centered equal-length regions + motif: type of modification to extract data for + window_size: the extent in either direction for windows around the center of regions. + single_strand: True means we only grab counts from reads from the same strand as + the region of interest, False means we always grab both strands within the regions + regions_5to3prime: True means negative strand regions get flipped, False means no flipping + quiet: disables progress bars + cores: CPU cores across which to parallelize processing. Default to None, which means all available. + chunk_size: size of genomic subregions to assign out to each process + + Returns: + tuple containing (modified_base_counts, valid_base_counts) + """ + + parsed_motif = utils.ParsedMotif(motif) + + regions_dict = utils.regions_dict_from_input(regions, window_size) + chunks_list = utils.process_chunks_from_regions_dict( + regions_dict, chunk_size=chunk_size + ) + + cores_to_run = utils.cores_to_run(cores) + + # Peek at a region to figure out what size the vectors should be + first_key = next(iter(regions_dict)) + first_tuple = regions_dict[first_key][0] + region_len = first_tuple[1] - first_tuple[0] + + # Initialize shared memory as numpy arrays to make it easy to map to buffer in subprocesses + shm_valid = shared_memory.SharedMemory( + create=True, size=(region_len) * np.dtype(np.int32).itemsize + ) + shm_modified = shared_memory.SharedMemory( + create=True, size=(region_len) * np.dtype(np.int32).itemsize + ) + + manager = multiprocessing.Manager() + lock = manager.Lock() + + with concurrent.futures.ProcessPoolExecutor(max_workers=cores_to_run) as executor: + futures = [ + executor.submit( + pileup_vectors_process_chunk, + bedmethyl_file, + parsed_motif, + chunk, + region_len, + shm_modified.name, + shm_valid.name, + lock, + single_strand, + regions_5to3prime, + ) + for chunk in chunks_list + ] + for future in tqdm( + concurrent.futures.as_completed(futures), + total=len(futures), + disable=quiet, + desc="Loading data", + leave=False, + ): + try: + future.result() + except Exception as err: + raise RuntimeError("pileup_vectors_process_chunk failed.") from err + + # We need to convert these shared memory buffers to numpy arrays which + # we then copy, so that they no longer reference the shared memory which + # will soon be de-allocated + modified_base_counts = np.copy( + np.ndarray((region_len,), dtype=np.int32, buffer=shm_modified.buf) + ) + valid_base_counts = np.copy( + np.ndarray((region_len,), dtype=np.int32, buffer=shm_valid.buf) + ) + # Close and unlink shared memory - not fully handled by garbage collection otherwise + shm_modified.close() + shm_modified.unlink() + shm_valid.close() + shm_valid.unlink() + + return modified_base_counts, valid_base_counts + + +def counts_from_fake(*args, **kwargs) -> tuple[int, int]: + """ + Test helper function. + + Generates a fake set of enrichment counts. Ignores all arguments. + + Returns: + tuple containing counts of (modified_bases, total_bases) + """ + window_halfsize = 500 + return test_data.fake_peak_enrichment(halfsize=window_halfsize, peak_height=0.15) + + +def vector_from_fake(window_size: int, *args, **kwargs) -> np.ndarray: + """ + Test helper function. + + Generates a fake peak trace. Ignores all arguments except window_size. + + Args: + window_size: halfsize of the window; how far the window stretches on either side of the center point + + Returns: + vector of fraction modified bases calculated for each position; float values between 0 and 1 + """ + return test_data.fake_peak_enrichment_profile( + halfsize=window_size, peak_height=0.15 + ) + + +def pileup_vectors_process_chunk( + bedmethyl_file, + parsed_motif, + chunk, + region_len, + shm_name_modified, + shm_name_valid, + lock, + single_strand, + regions_5to3prime, +) -> None: + """ + Helper function to allow pileup_vectors_from_bedmethyl to operate in a parallized fashion. + + Sum up modified and valid counts for a subregion chunk in a bedmethyl file. + + Args: + bedmethyl_file: Path to bedmethyl file + parsed_motif: ParsedMotif object + chunk: a dict containing subregion chunk information + shm_name_modified: the name string for the shared memory location containing the modified counts array + shm_name_valid: the name string for the shared memory location containing the valid counts array + lock: a manager.Lock object to allow synchronization in accessing shared memory + single_strand: True if only single-strand mods are desired + regions_5to3prime: True means negative strand regions get flipped, False means no flipping + + Returns: + None. Counts are added to arrays in-place to shared memory. + """ + source_tabix = pysam.TabixFile(str(bedmethyl_file)) + existing_valid = shared_memory.SharedMemory(name=shm_name_valid) + existing_modified = shared_memory.SharedMemory(name=shm_name_modified) + valid_base_counts = np.ndarray( + (region_len,), dtype=np.int32, buffer=existing_valid.buf + ) + modified_base_counts = np.ndarray( + (region_len,), dtype=np.int32, buffer=existing_modified.buf + ) + + chromosome = chunk["chromosome"] + region_start = chunk["region_start"] + region_end = chunk["region_end"] + subregion_start = chunk["subregion_start"] + subregion_end = chunk["subregion_end"] + strand = chunk["strand"] + + flip_coords = regions_5to3prime and strand == "-" + + if flip_coords: + subregion_offset = region_end - subregion_end + else: + subregion_offset = subregion_start - region_start + + if region_end - region_start > region_len: + print( + f"WARNING: You have specified a region at {chromosome}:{region_start}-{region_end} that is longer than the first region; the end of the region will be skipped. To make a profile plot with differently-sized region, consider using the window_size parameter to make a profile across centered windows." + ) + + valid_base_subregion = np.zeros(subregion_end - subregion_start, dtype=int) + modified_base_subregion = np.zeros(subregion_end - subregion_start, dtype=int) + + # tabix throws and error if the contig is not present + # by the current design, this should be silent + if chromosome in source_tabix.contigs: + for row in source_tabix.fetch( + chromosome, max(subregion_start, 0), subregion_end + ): + ( + keep_basemod, + genomic_coord, + modified_in_row, + valid_in_row, + ) = process_pileup_row( + row=row, + parsed_motif=parsed_motif, + region_strand=strand, + single_strand=single_strand, + ) + if keep_basemod: + if flip_coords: + # We want to flip the coordinates for this region so that it is recorded along the 5 prime to 3 prime direction + # This will enable analyses where the orientation of protein binding / transcriptional dynamics / etc is relevant for our pileup signal + pileup_coord_in_subregion = subregion_end - genomic_coord - 1 + else: + # Normal coordinates are the default. This will be used both for the '+' case and the '.' (no strand specified) case + pileup_coord_in_subregion = genomic_coord - subregion_start + if pileup_coord_in_subregion < (subregion_end - subregion_start): + valid_base_subregion[pileup_coord_in_subregion] += valid_in_row + modified_base_subregion[pileup_coord_in_subregion] += ( + modified_in_row + ) + + with lock: + valid_base_counts[ + subregion_offset : subregion_offset + abs(subregion_end - subregion_start) + ] += valid_base_subregion + modified_base_counts[ + subregion_offset : subregion_offset + abs(subregion_end - subregion_start) + ] += modified_base_subregion + # Close the file descriptor/handle to the shared memory + existing_modified.close() + existing_valid.close() + + +def pileup_counts_process_chunk( + bedmethyl_file, + parsed_motif, + chunk, + shm_name_modified, + shm_name_valid, + lock, + single_strand, +) -> None: + """ + Helper function to allow pileup_counts_from_bedmethyl to operate in a parallized fashion. + + Sum up modified and valid counts for a subregion chunk in a bedmethyl file. + + Args: + bedmethyl_file: Path to bedmethyl file + parsed_motif: ParsedMotif object + chunk: a dict containing subregion chunk information + shm_name_modified: the name string for the shared memory location containing the modified counts sum + shm_name_valid: the name string for the shared memory location containing the valid counts sum + lock: a manager.Lock object to allow synchronization in accessing shared memory + single_strand: True if only single-strand mods are desired + + Returns: + None. Counts are added in-place to shared memory. + """ + source_tabix = pysam.TabixFile(str(bedmethyl_file)) + existing_valid = shared_memory.SharedMemory(name=shm_name_valid) + existing_modified = shared_memory.SharedMemory(name=shm_name_modified) + valid_base_counts = np.ndarray((1,), dtype=np.int32, buffer=existing_valid.buf) + modified_base_counts = np.ndarray( + (1,), dtype=np.int32, buffer=existing_modified.buf + ) + + chromosome = chunk["chromosome"] + subregion_start = chunk["subregion_start"] + subregion_end = chunk["subregion_end"] + strand = chunk["strand"] + + valid_base_subregion_counts = 0 + modified_base_subregion_counts = 0 + + # tabix throws and error if the contig is not present + # by the current design, this should be silent + if chromosome in source_tabix.contigs: + for row in source_tabix.fetch( + chromosome, max(subregion_start, 0), subregion_end + ): + ( + keep_basemod, + _, + modified_in_row, + valid_in_row, + ) = process_pileup_row( + row=row, + parsed_motif=parsed_motif, + region_strand=strand, + single_strand=single_strand, + ) + if keep_basemod: + valid_base_subregion_counts += valid_in_row + modified_base_subregion_counts += modified_in_row + + with lock: + valid_base_counts[0] += valid_base_subregion_counts + modified_base_counts[0] += modified_base_subregion_counts + + # Close the file descriptor/handle to the shared memory + existing_valid.close() + existing_modified.close() + + +def process_pileup_row( + row: str, + parsed_motif: utils.ParsedMotif, + region_strand: str, + single_strand: bool = False, +) -> tuple[bool, int, int, int]: + """ + Helper function designed for pileup_counts_from_bedmethyl via pileup_counts_process_chunk, pileup_vectors_from_bedmethyl + via pileup_vectors_process_chunk, and export.pileup_to_bigwig; changes to logic here may impact some or all of + these. + + Process a row from a pileup, determining whether the basemod is relevant and passing back its coordinate, + modification count, and valid read count. + + Args: + row: a string row from a bedmethyl file + parsed_motif: a ParsedMotif object + region_strand: the strand from the query region + single_strand: True if only mods on the region_strand are to be kept + + Returns: keep_basemod, genomic_coord, modified_in_row, valid_in_row. Values are provided even if keep_basemod is False. + """ + tabix_fields = row.split("\t") + pileup_basemod = tabix_fields[3] + pileup_strand = tabix_fields[5] + + if single_strand and pileup_strand.strip() != region_strand: + # We are on the wrong strand, can't keep this position + keep_basemod = False + elif len(pileup_basemod.split(",")) == 3: + pileup_modname, pileup_motif, pileup_mod_coord = pileup_basemod.split(",") + if ( + pileup_motif == parsed_motif.motif_seq + and int(pileup_mod_coord) == parsed_motif.modified_pos + and pileup_modname in parsed_motif.mod_codes + ): + keep_basemod = True + else: + keep_basemod = False + elif len(pileup_basemod.split(",")) == 1: + keep_basemod = pileup_basemod in parsed_motif.mod_codes + else: + raise ValueError( + f"Unexpected format in bedmethyl file: {row} contains {pileup_basemod} which cannot be parsed." + ) + + pileup_info = tabix_fields[9].split(" ") + genomic_coord = int(tabix_fields[1]) + valid_in_row = int(pileup_info[0]) + modified_in_row = int(pileup_info[2]) + + return ( + keep_basemod, + genomic_coord, + modified_in_row, + valid_in_row, + ) + + +################################################################################################################ +#### Single read loaders #### +################################################################################################################ + + +def read_vectors_from_hdf5( + file: str | Path, + motifs: list[str], + regions: str | Path | list[str | Path] | None = None, + window_size: int | None = None, + single_strand: bool = False, + sort_by: str | list[str] = ["chromosome", "region_start", "read_start"], + calculate_mod_fractions: bool = True, + quiet: bool = True, # currently unused; change to default False when pbars are implemented + cores: int | None = None, # currently unused + subset_parameters: dict | None = None, +) -> tuple[list[tuple], list[str], dict | None]: + """ + User-facing function. + + Pulls a list of read data out of an .h5 file containing processed read vectors, formatted + for read-by-read vector processing downstream use cases. + + The flow of operation here is we load up the h5 file then loop through our regions and pick + out reads corresponding to our criteria. Criteria include chromosome, read starts and ends + (compared to region starts and ends), motif, and strand (if single_strand is True). The indices + for the desired reads are identified region-by-region, then all the reads for the region (or + the whole h5, if no region is passed) are loaded using the process_data function and put into + a list. The bytes are then decoded for the array entries, which are manually compressed because + h5py wasn't behaving. + + There's some adjustment for the raw probability (no thresh) to match modkit extract outputs. + Specifically, the 0-255 8bit int has 0.5 added before dividing by 256, giving mod qualities + between 0.001953 and 0.99805 for bases in valid motifs. (Invalid positions have zeros.) + + After this processing, we calculate modification fractions, sort, and return. + + TODO: Implement progress bars and parallelization as with pileup loaders + + Args: + file: Path to an hdf5 (.h5) file containing modification data for single reads, + stored in datasets read_name, chromosome, read_start, + read_end, base modification motif, mod_vector, and val_vector. + regions: Single or list of Path objects or strings. Path objects must point to .bed + files, strings can be .bed paths or region string in the format chrX:XXX-XXX. + All should all be regions for which your original .bam file had reads extracted, + although by design this method will not raise an error if any region contains + zero reads, as this may simply be a matter of low read depth. + If no regions are specified, the entire .h5 file will be returned. This may cause + memory issues. + motifs: types of modification to extract data for. Motifs are specified as + {DNA_sequence},{position_of_modification}. For example, a methylated adenine is specified + as 'A,0' and CpG methylation is specified as 'CG,0'. + single_strand: True means we only grab counts from reads from the same strand as + the region of interest, False means we always grab both strands within the regions + window_size: An optional parameter for creating centered windows for the provided regions. + If provided, all regions will be adjusted to be the same size and centered. If not provided, + all regions should already be the same size, or there should be only one. + sort_by: Read properties by which to sort, either one string or a list of strings. Options + include chromosome, region_start, region_end, read_start, read_end, and motif. More to + be added in future. + quiet: silences progress bars (currently unused) + cores: cores across which to parallelize processes (currently unused) + subset_parameters: Parameters to pass to the utils.random_sample() method, to subset the + reads to be returned. If not None, at least one of n or frac must be provided. The array + parameter should not be provided here. + + Returns: + a list of tuples, each tuple containing all datasets corresponding to an individual read that + was within the specified regions. + a list of strings, naming the datasets returned. + a regions_dict, containing lists of (region_start,region_end) coordinates by chromosome/contig. + + TODO: The way the subsetting is implemented is confusing, in that you need to pass all but one of + the available parameters. + """ + with h5py.File(file, "r") as h5: + datasets: list[str] = [ + name for name, obj in h5.items() if isinstance(obj, h5py.Dataset) + ] + if "threshold" in h5: + # we are looking at an .h5 file with the new, much better compressed format that does + # not know the data type intrinsically for mod and val vectors, so we must check + readwise_datasets = [ + dataset for dataset in datasets if dataset not in ["threshold"] + ] + compressed_binary_datasets = ["mod_vector", "val_vector"] + threshold_applied_to_h5 = h5["threshold"][()] + binarized = not np.isnan(threshold_applied_to_h5) + else: + # backwards compatible with the old h5 file structure + # If we remove backwards compatibility, beta test (Feb 2024) h5 extractions will not run + readwise_datasets = datasets + compressed_binary_datasets = [] + binarized = True # in this case all this will do is make it so we don't apply a +1/512 correction to the mod_vector + + # Pre-load metadata so we can identify reads to pull from file + read_chromosomes = np.array(h5["chromosome"], dtype=str) + read_starts = np.array(h5["read_start"]) + read_ends = np.array(h5["read_end"]) + read_motifs = np.array(h5["motif"], dtype=str) + ref_strands = np.array(h5["strand"], dtype=str) + + # Identify reads to load, then load them + if regions is not None: + regions_dict = utils.regions_dict_from_input( + regions=regions, + window_size=window_size, + ) + read_tuples_raw = [] + for chrom, region_list in regions_dict.items(): + for region_start, region_end, region_strand in region_list: + # Find the read indices that we want to load + # TODO: consider building this up and then loading all at the end, chunked + # TODO: consolidate logic into clear variables + relevant_read_indices = np.flatnonzero( + (read_ends > region_start) + & (read_starts < region_end) + & np.isin(read_motifs, motifs) + & (read_chromosomes == chrom) + & ( + (not single_strand) + | (region_strand not in ["+", "-"]) + | (ref_strands == region_strand) + ) + ) + if subset_parameters is not None: + relevant_read_indices = np.sort( + utils.random_sample( + relevant_read_indices, **subset_parameters + ) + ) + read_tuples_raw += list( + zip( + *( + retrieve_h5_data( + h5=h5, + dataset=dataset, + indices=relevant_read_indices, + compressed=dataset in compressed_binary_datasets, + dtype=np.uint8, + decompressor=gzip.decompress, + binarized=binarized, + ) + for dataset in readwise_datasets + ), + [region_start for _ in relevant_read_indices], + [region_end for _ in relevant_read_indices], + [region_strand for _ in relevant_read_indices], + ) + ) + else: + regions_dict = None + relevant_read_indices = np.flatnonzero(np.isin(read_motifs, motifs)) + if subset_parameters is not None: + relevant_read_indices = np.sort( + utils.random_sample(relevant_read_indices, **subset_parameters) + ) + read_tuples_raw = list( + zip( + *( + retrieve_h5_data( + h5=h5, + dataset=dataset, + indices=relevant_read_indices, + compressed=dataset in compressed_binary_datasets, + dtype=np.uint8, + decompressor=gzip.decompress, + binarized=binarized, + ) + for dataset in readwise_datasets + ), + [-1 for _ in relevant_read_indices], + [-1 for _ in relevant_read_indices], + ["." for _ in relevant_read_indices], + ) + ) + # We add region information (start, end, and strand; chromosome is already present!) + # so that it is possible to sort by and process based on these + readwise_datasets += ["region_start", "region_end", "region_strand"] + + # This is sanitizing the dataset entries and adjusting prob values if needed + if binarized: + read_tuples_processed = [ + convert_bytes_to_strings(tup) for tup in read_tuples_raw + ] + else: + read_tuples_processed = [ + adjust_mod_probs_in_tuples( + convert_bytes_to_strings(tup), + readwise_datasets.index("mod_vector"), + readwise_datasets.index("val_vector"), + ) + for tup in read_tuples_raw + ] + + if calculate_mod_fractions: + # Add the MOTIF_mod_fraction entries to the readwise_datasets list for future reference in sorting + readwise_datasets += [f"{motif}_mod_fraction" for motif in motifs] + # dict[read_name][motif]=modified fraction of motif in read, float + mod_fractions_by_read_name_by_motif: defaultdict[ + str, defaultdict[str, float] + ] = defaultdict(lambda: defaultdict(lambda: 0.0)) + for motif in motifs: + for read_tuple in read_tuples_processed: + if read_tuple[readwise_datasets.index("motif")] == motif: + mod_sum = np.sum(read_tuple[readwise_datasets.index("mod_vector")]) + val_sum = np.sum(read_tuple[readwise_datasets.index("val_vector")]) + mod_fraction = mod_sum / val_sum if val_sum > 0 else 0 + mod_fractions_by_read_name_by_motif[ + read_tuple[readwise_datasets.index("read_name")] + ][motif] = mod_fraction + + read_tuples_all = [] + for read_tuple in read_tuples_processed: + read_tuples_all.append( + tuple(val for val in read_tuple) + + tuple( + mod_frac + for mod_frac in mod_fractions_by_read_name_by_motif[ + read_tuple[readwise_datasets.index("read_name")] + ].values() + ) + ) + else: + read_tuples_all = read_tuples_processed + + ## Sort the reads + + # Enforce that sort_by is a list + if not isinstance(sort_by, list): + sort_by = [sort_by] + + # If 'shuffle' appears anywhere in sort_by, we first shuffle the list + if "shuffle" in sort_by: + utils.rng.shuffle(read_tuples_all) + + try: + sort_by_indices = [ + readwise_datasets.index(sort_item) + for sort_item in sort_by + if sort_item != "shuffle" + ] + except ValueError as e: + raise ValueError( + f"Sorting error. {e}. Datasets include {readwise_datasets}. If you need mod fraction sorting make sure you are not setting calculate_read_fraction to False." + ) from e + + if len(sort_by_indices) > 0: + sorted_read_tuples = sorted( + read_tuples_all, key=lambda x: tuple(x[index] for index in sort_by_indices) + ) + else: + sorted_read_tuples = read_tuples_all + + return sorted_read_tuples, readwise_datasets, regions_dict + + +def readwise_binary_modification_arrays( + file: str | Path, + motifs: list[str], + regions: str | Path | list[str | Path], + window_size: int | None = None, + regions_5to3prime: bool = False, + single_strand: bool = False, + sort_by: str | list[str] = ["chromosome", "region_start", "read_start"], + thresh: float | None = None, + relative: bool = True, + quiet: bool = True, # currently unused; change to default False when pbars are implemented + cores: int | None = None, # currently unused + subset_parameters: dict | None = None, +) -> tuple[list[np.ndarray], np.ndarray[int], np.ndarray[str], dict | None]: + """ + Primarily designed as a helper function for single-read plotting, but can be used by a user. + + Pulls a list of read data out of a file containing processed read vectors, formatted with + seaborn plotting in mind. Currently we only support .h5 files. + + After running read_vectors_from_hdf5, this function takes the baton to convert the names of + the sorted reads into integer indices, then goes through the reads and strips down the mod + vectors to simply a list of modified positions (applying a threshold if one has not already + been applied). Mod positions are by default expressed relative to the region from which + the read was identified, allowing for nice plotting, but can also be expressed in absolute + coordinates. If positions are relative, regions_5to3prime can be used to show all regions + as upstream-to-downstream along their respective strands. + + TODO: Implement progress bars and parallelization as with pileup loaders + + Args: + file: Path to an hdf5 (.h5) file containing modification data for single reads, + stored in datasets read_name, chromosome, read_start, + read_end, base modification motif, mod_vector, and val_vector. + regions: Single or list of Path objects or strings. Path objects must point to .bed + files, strings can be .bed paths or region string in the format chrX:XXX-XXX. + All should all be regions for which your original .bam file had reads extracted, + although by design this method will not raise an error if any region contains + zero reads, as this may simply be a matter of low read depth. + motifs: types of modification to extract data for. Motifs are specified as + {DNA_sequence},{position_of_modification}. For example, a methylated adenine is specified + as 'A,0' and CpG methylation is specified as 'CG,0'. + window_size: An optional parameter for creating centered windows for the provided regions. + If provided, all regions will be adjusted to be the same size and centered. If not provided, + all regions should already be the same size, or there should be only one. + single_strand: True means we only grab counts from reads from the same strand as + the region of interest, False means we always grab both strands within the regions + regions_5to3prime: True means negative strand regions get flipped, False means no flipping + sort_by: Read properties by which to sort, either one string or a list of strings. Options + include chromosome, region_start, region_end, read_start, read_end, and motif. More to + be added in future. + thresh: A modification calling threshold. If the .h5 is already modification-called, this does + nothing. If the .h5 files is not modification-called, i.e. its modification data is saved + as floating point array, thresh must be provided to have valid binary outputs. + relative: If True, modification coordinates are specified relative to their respective regions + in the genomes, centered at the center of the region. If False, absolute coordinates are provided. + There is not currently a check for all reads being on the same chromosome if relative=False, but + this could create unexpected behaviour for a the standard visualizations. + quiet: silences progress bars (currently unused) + cores: cores across which to parallelize processes (currently unused) + subset_parameters: Parameters to pass to the utils.random_sample() method, to subset the + reads to be returned. If not None, at least one of n or frac must be provided. The array + parameter should not be provided here. + + Returns: + Returns a tuple of three arrays, of length (N_READS * len(mod_names)), and a dict of regions. + The arrays contain the following: + * positions at which the specified modification was found in a read, after a binary call + * unique integer ID for the read for each modification position. These integers are ordered + based on the specified sorting. + * modification represented by the positions, in the motif format + The regions_dict contains the following: + * keys: chromosomes/contigs + * values: lists of tuples in the format (region_start,region_end) + For example, if called on a dataset with a single read and two modification types, each array would have two entries. The unique IDs would be the same, as both entries would represent the same single read. The mods and positions would be different, as they would extact different mods. + """ + file = Path(file) + if file.suffix == ".h5" or file.suffix == ".hdf5": + sorted_read_data_converted, datasets, regions_dict = read_vectors_from_hdf5( + file=file, + motifs=motifs, + regions=regions, + window_size=window_size, + single_strand=single_strand, + sort_by=sort_by, + ) + read_name_index = datasets.index("read_name") + mod_vector_index = datasets.index("mod_vector") + motif_index = datasets.index("motif") + region_start_index = datasets.index("region_start") + region_end_index = datasets.index("region_end") + read_start_index = datasets.index("read_start") + region_strand_index = datasets.index("region_strand") + + # Check this .h5 file was created with a threshold, i.e. that the mod calls are binarized + if thresh is None: + if not (sorted_read_data_converted[0][mod_vector_index].dtype == np.bool_): + raise ValueError( + "No threshold has been applied to this .h5 single read data. You must provide a threshold using the thresh parameter in order to extract binarized modification arrays." + ) + else: + thresh = utils.adjust_threshold(thresh) + + read_ints_list = [] + mod_coords_list = [] + motifs_list = [] + + read_names = np.array( + [read_data[read_name_index] for read_data in sorted_read_data_converted] + ) + # TODO: handle the case where a read shows up in more than one different region + _, unique_first_indices = np.unique(read_names, return_index=True) + unique_in_order = read_names[np.sort(unique_first_indices)] + string_to_int = { + read_name: index for index, read_name in enumerate(unique_in_order) + } + read_ints = np.array([string_to_int[read_name] for read_name in read_names]) + + for read_int, read_data in zip(read_ints, sorted_read_data_converted): + if thresh is None: + mod_pos_in_read = np.flatnonzero(read_data[mod_vector_index]) + else: + mod_pos_in_read = np.flatnonzero(read_data[mod_vector_index] > thresh) + + if relative: + if regions_5to3prime and read_data[region_strand_index] == "-": + # Here we want to show the regions each along their 5 prime to 3 prime direction + # This means that negative strand regions need to be flipped + mod_pos_record = -( + mod_pos_in_read + + read_data[read_start_index] + - (read_data[region_start_index] + read_data[region_end_index]) + // 2 + ) + else: + # This is the default case: just make the coordinates relative using + # the reference genome coordinate system. Normal, easy, chill, nice. + mod_pos_record = ( + mod_pos_in_read + + read_data[read_start_index] + - (read_data[region_start_index] + read_data[region_end_index]) + // 2 + ) + else: + # If we aren't using relative coordinates, then I think the 5prime to 3prime argument + # can just be ignored, and I think it's nicer if that's silent - less clutter in the output + # Basically if you are keeping different regions separate using other metadata (such as + # just keeping their actual real genomic coordinates) it is superfluous to do the 5to3 flip. + mod_pos_record = mod_pos_in_read + read_data[read_start_index] + + mod_coords_list += list(mod_pos_record) + read_ints_list += [read_int] * len(mod_pos_record) + motifs_list += [read_data[motif_index]] * len(mod_pos_record) + + return ( + np.array(mod_coords_list), + np.array(read_ints_list), + np.array(motifs_list), + regions_dict, + ) + + else: + raise ValueError( + f"File {file} does not have a recognized extension for single read data." + ) + + +""" TEMPORARY STUB VARS """ +STUB_HALFSIZE = 500 +STUB_N_READS = 500 + + +def reads_from_fake( + file: Path, regions: Path, motifs: list[str] +) -> tuple[list[np.ndarray], np.ndarray[int], np.ndarray[str], dict]: + """ + Helper function to support testing. + + TODO: What does the bed file represent in this method? This one is breaking my brain a bit. + TODO: Variable names in this method stink. + TODO: Currently assumes mod calling (thresholding probabilities) was already performed elsewhere + + Args: + file: Path to file containing modification data for single reads + bed_file: Path to bed file specifying regions (WHAT DO THESE REPRESENT???) + mod_names: types of modification to extract data for + + Returns: + Returns three parallel arrays, of length (N_READS * len(mod_names)), containing the following for each index: + * array of positions at which the specified modification was found in a read + * unique integer ID for the read + * modification represented by the positions + For example, if called on a dataset with a single read and two modification types, each array would have two entries. The unique IDs would be the same, as both entries would represent the same single read. The mods and positions would be different, as they would extact different mods. + """ + reads = [] + read_names = [] + mods = [] + for mod_name in motifs: + match mod_name: + case "A,0": + mod_reads = [ + test_data.fake_read_mod_positions(STUB_HALFSIZE, "peak", 0.7) + for _ in range(STUB_N_READS) + ] + case "CG,0": + mod_reads = [ + test_data.fake_read_mod_positions( + STUB_HALFSIZE, "inverse_peak", 0.4 + ) + for _ in range(STUB_N_READS) + ] + case _: + raise ValueError(f"No stub settings for requested mod {mod_name}") + reads += mod_reads + read_names.append(np.arange(len(mod_reads))) + mods.append([mod_name] * len(mod_reads)) + + read_names = np.concatenate(read_names) + mods = np.concatenate(mods) + return reads, read_names, mods, {} + + +# def convert_bytes(item): +# """Convert bytes to string if item is bytes, otherwise return as is.""" +# if isinstance(item, bytes): +# return item.decode() +# return item + + +def convert_bytes_to_strings(tup): + """ + Helper function for single read loading. + Convert all bytes elements in a tuple to strings. + """ + return tuple(item.decode() if isinstance(item, bytes) else item for item in tup) + # tuple(convert_bytes(item) for item in tup) + + +def adjust_mod_probs_in_arrays(mod_array, val_array): + """ + Helper function to correct for an idiosyncracy in modkit single-read parsing wherein 0-255 + "mod quality" values are parsed as floating-point values from 1/512 to 511/512. + """ + mod_array[np.flatnonzero(val_array)] += 1 / 512 + return mod_array + + +def adjust_mod_probs_in_tuples(tup, mod_idx, val_idx): + """ + Helper function to apply mod prob adjustments + """ + return tuple( + item if index != mod_idx else adjust_mod_probs_in_arrays(item, tup[val_idx]) + for index, item in enumerate(tup) + ) + + +def binary_to_np_array(compressed_bytes, dtype, decompressor, binarized, int8tofloat): + """ + Helper function to decompress binary data to boolean or floating point arrays + """ + if binarized: + return np.frombuffer(decompressor(compressed_bytes), dtype=dtype).astype(bool) + elif int8tofloat: + return ( + (np.frombuffer(decompressor(compressed_bytes), dtype=dtype).astype(float)) + / 256 + ).astype(np.float16) + else: + return np.frombuffer(decompressor(compressed_bytes), dtype=dtype).astype(int) + + +def retrieve_h5_data(h5, dataset, indices, compressed, dtype, decompressor, binarized): + """ + Load the requested dataset from the h5 file at the relevant indices. + + For compressed vector data, decompress each dataset element to numpy array. + """ + if compressed: + # Determine if int8tofloat should be applied + int8tofloat = "mod_vector" in dataset + # Logic for compressed data + loaded_uint8_list = h5[dataset][list(indices)] + return [ + binary_to_np_array( + loaded_uint8.tobytes(), dtype, decompressor, binarized, int8tofloat + ) + for loaded_uint8 in loaded_uint8_list + ] + else: + # Logic for non-compressed data + return h5[dataset][list(indices)] diff --git a/dimelo/parse_bam.py b/dimelo/parse_bam.py index a2f0b897..88a5310f 100644 --- a/dimelo/parse_bam.py +++ b/dimelo/parse_bam.py @@ -1,907 +1,1162 @@ -r""" -================= -parse_bam module -================= -.. currentmodule:: dimelo.parse_bam -.. autosummary:: - parse_bam +import gzip +import multiprocessing +import os +import subprocess +from collections import defaultdict +from pathlib import Path -parse_bam allows you to summarize modification calls in a sql database +import h5py +import numpy as np +import pysam +from tqdm.auto import tqdm +from . import run_modkit, utils + +""" +This module contains code to convert .bam files into both human-readable and +indexed random-access pileup and read-wise processed outputs. """ +""" +Global variables +""" -import argparse -import multiprocessing -import os -import sqlite3 -from typing import List, Tuple, Union +# Specifies how many reads to check for the base modifications of interest. +NUM_READS_TO_CHECK = 100 -import numpy as np -import pandas as pd -import pysam -from joblib import Parallel, delayed -from tqdm import tqdm - -from dimelo.utils import clear_db, create_sql_table, execute_sql_command - -DEFAULT_BASEMOD = "A+CG" -DEFAULT_THRESH_A = 129 -DEFAULT_THRESH_C = 129 -DEFAULT_WINDOW_SIZE = 1000 - - -class Region(object): - def __init__(self, region: Union[str, pd.Series]): - """Represents a region of genetic data. - Attributes: - - chromosome: string name of the chromosome to which the region applies - - begin: integer start position of region - - end: integer end position of region - - size: length of region - - string: string representation of region - - strand: string specifying forward or reverse strand; either "+" or "-" (default +) - """ - self.chromosome = None - self.begin = None - self.end = None - self.size = None - self.string = None - self.strand = "+" - - if isinstance(region, str): # ":" in region: - # String of format "{CHROMOSOME}:{START}-{END}" - try: - self.chromosome, interval = region.replace(",", "").split(":") - try: - # see if just integer chromosomes are used - self.chromosome = int(self.chromosome) - except ValueError: - pass - self.begin, self.end = [int(i) for i in interval.split("-")] - except ValueError: - raise TypeError( - "Invalid region string. Example of accepted format: 'chr5:150200605-150423790'" - ) - self.size = self.end - self.begin - self.string = f"{self.chromosome}_{self.begin}_{self.end}" - elif isinstance(region, pd.Series): - # Ordered sequence containing [CHROMOSOME, START, END] and optionally [STRAND], where STRAND can be either "+" or "-" - self.chromosome = region[0] - self.begin = region[1] - self.end = region[2] - self.size = self.end - self.begin - self.string = f"{self.chromosome}_{self.begin}_{self.end}" - # strand of motif to orient single molecules - # if not passed just keep as all + - if len(region) >= 4: - if (region[3] == "+") or (region[3] == "-"): - self.strand = region[3] - # handle case of bed file with additional field that isn't strand +/- - else: - self.strand = "+" - else: - self.strand = "+" - else: - raise TypeError( - "Unknown datatype passed for Region initialization" - ) +""" +User-facing parse operations: pileup and extract +""" -def make_db( - fileName: str, - sampleName: str, - outDir: str, - testMode: bool = False, - qc: bool = False, -) -> Tuple[str, List[str]]: - """Sets up the necessary database tables. +def pileup( + input_file: str | Path, + output_name: str, + ref_genome: str | Path, + output_directory: str | Path | None = None, + regions: str | Path | list[str | Path] | None = None, + motifs: list = ["A,0", "CG,0"], + thresh: float | None = None, + window_size: int | None = None, + cores: int | None = None, + log: bool = False, + cleanup: bool = True, + quiet: bool = False, + override_checks: bool = False, +) -> tuple[Path, Path]: + """ + Takes a bam file containing long read sequencing data aligned + to a reference genome with modification calls for one or more base/context + and creates a pileup. A pileup contains genome-position-wise sums of both reads with + bases that could have the modification in question and of reads that are in + fact modified. + + The current implementation of this method uses modkit, a tool built by + Nanopore Technologies, along with htslib tools compress and index the output + bedmethyl file. The modkit command for this function is `modkit pileup`. + + https://github.com/nanoporetech/modkit/ + + The intermediate output file is a standard bedmethyl file containing all + specified motifs and mod codes. The compressed and indexed output file is + a .bed.gz file with an accompanying .bed.gz.tbi index. Args: - :param fileName: name of bam file with Mm and Ml tags - :param sampleName: name of sample for output SQL table name labelling - :param outDir: directory where SQL database is stored - :param testMode: turns on test mode; note that this will clear the database if it exists - :param qc: turns on qc mode + output_file: a string or Path object pointing to the location of a .bam file. + The file should follow at least v1.6 of the .bam file specifications, + found here: https://samtools.github.io/hts-specs/ + https://samtools.github.io/hts-specs/SAMv1.pdf + + The file needs to have modifications stored in the standard format, + with MM and ML tags (NOT mm and ml) and mod names m for 5mC and a + for 6mA. + + Furthermore, the file must have a .bam.bai index file with the same name. + You can create an index if needed using samtools index. + output_name: a string that will be used to create an output folder + containing the intermediate and final outputs, along with any logs. + ref_genome: a string of Path objecting pointing to the .fasta file + for the reference genome to which the .bam file is aligned. + output_directory: optional str or Path pointing to an output directory. + If left as None, outputs will be stored in a new folder within the input + directory. + regions: TODO + motifs: a list of strings specifying which base modifications to look for. + The basemods are each specified as {sequence_motif},{position_of_modification}. + For example, a methylated adenine is specified as 'A,0' and CpG methylation + is specified as 'CG,0'. + thresh: float point number specifying the base modification probability threshold + used to delineate modificaton calls as True or False. When set to None, modkit + will select its own threshold automatically based on the data. + window_size: an integer specifying a window around the center of each bed_file + region. If set to None, the bed_file is used unmodified. If set to a non-zero + positive integer, the bed_file regions are replaced by new regions with that + window size in either direction of the center of the original bed_file regions. + This is used for e.g. extracting information from around known motifs or peaks. + cores: an integer specifying how many parallel cores modkit gets to use. + By default modkit will use all of the available cores on the machine. + log: a boolean specifying whether to output logs into the output folder. + cleanup: a boolean specifying whether to clean up to keep intermediate + outputs. The final processed files are not human-readable, whereas the intermediate + outputs are. However, intermediate outputs can also be quite large. + override_checks: convert errors from input checking into warnings if True Returns: - - path to the new database - - list of newly-created table names + Path object pointing to the compressed and indexed .bed.gz bedmethyl file, ready + for plotting functions. + Path object pointing to 'regions.processed.bed', the `--include-bed` file used for `modkit pileup` + + """ + """ + TODO: There are a lot of issues that are all related here: + dimelo/parse_bam.py:150: error: Incompatible types in assignment (expression has type "Path | None", variable has type "str | Path") [assignment] + dimelo/parse_bam.py:169: error: Argument "input_file" to "prep_outputs" has incompatible type "str | Path"; expected "Path" [arg-type] + dimelo/parse_bam.py:256: error: Argument "input_file" to "run_with_progress_bars" has incompatible type "str | Path"; expected "Path" [arg-type] + dimelo/parse_bam.py:257: error: Argument "ref_genome" to "run_with_progress_bars" has incompatible type "str | Path"; expected "Path" [arg-type] + + I'm not sure of the most elegant way to fix it. Come back and address. """ - if not os.path.exists(outDir): - os.mkdir(outDir) - DATABASE_NAME = ( - outDir + "/" + fileName.split("/")[-1].replace(".bam", "") + ".db" - ) + ## Verify and prepare inputs and outputs - if testMode: - clear_db(DATABASE_NAME) - - tables = [] - # for qc report - if qc: - table_name = "reads_" + sampleName - cols = [ - "name", - "chr", - "start", - "end", - "length", - "strand", - "mapq", - "ave_baseq", - "ave_alignq", - ] - dtypes = [ - "TEXT", - "TEXT", - "INT", - "INT", - "INT", - "TEXT", - "INT", - "INT", - "INT", - ] - create_sql_table(DATABASE_NAME, table_name, cols, dtypes) - tables.append(table_name) - # for browser and enrichment plots - else: - table_name = "methylationByBase_" + sampleName - cols = ["id", "read_name", "chr", "pos", "prob", "mod"] - dtypes = ["TEXT", "TEXT", "TEXT", "INT", "INT", "TEXT"] - create_sql_table(DATABASE_NAME, table_name, cols, dtypes) - tables.append(table_name) - - table_name = "methylationAggregate_" + sampleName - cols = ["id", "pos", "mod", "methylated_bases", "total_bases"] - dtypes = ["TEXT", "INT", "TEXT", "INT", "INT"] - create_sql_table(DATABASE_NAME, table_name, cols, dtypes) - tables.append(table_name) - - return DATABASE_NAME, tables - - -def parse_bam( - fileName: str, - sampleName: str, - outDir: str, - bedFile: str = None, - basemod: str = DEFAULT_BASEMOD, - center: bool = False, - windowSize: int = DEFAULT_WINDOW_SIZE, - region: str = None, - threshA: int = DEFAULT_THRESH_A, - threshC: int = DEFAULT_THRESH_C, - extractAllBases: bool = False, - cores: int = None, -) -> None: - """ - fileName - name of bam file with Mm and Ml tags - sampleName - name of sample for output SQL table name labelling. Valid names contain [``a-zA-Z0-9_``]. - outDir - directory where SQL database is stored - bedFile - name of bed file that defines regions of interest over which to extract mod calls. The bed file either defines regions over which to extract mod calls OR defines regions (likely motifs) over which to center positions for mod calls and then parse_bam extracts mod calls over a window flanking that region defined in by ``windowSize``. Optional 4th column in bed file to specify strand of region of interest as ``+`` or ``-``. Default is to consider regions as all ``+``. NB. The ``bedFile`` and ``region`` parameters are mutually exclusive; specify one or the other. - basemod - One of the following: - - * ``'A'`` - extract mA only - * ``'CG'`` - extract mCpG only - * ``'A+CG'`` - extract mA and mCpG - center - One of the following: - - * ``'True'`` - report positions with respect to center of motif window (+/- windowSize); only valid with bed file input - * ``'False'`` - report positions in original reference space - windowSize - window size around center point of feature of interest to plot (+/-); only mods within this window are stored; only used if center=True; still, only reads that span the regions defined in the bed file will be included; default is 1,000 bp - region - single region over which to extract base mods, rather than specifying many windows in bedFile; format is chr:start-end. NB. The ``bedFile`` and ``region`` parameters are mutually exclusive; specify one or the other. - threshA - threshold above which to call an A base methylated; default is 129 - threshC - threshold above which to call a C base methylated; default is 129 - extractAllBases - One of the following: - - * ``'True'`` - Store all base mod calls, regardles of methylation probability threshold. Bases stored are those that can have a modification call (A, CG, or both depending on ``basemod`` parameter) and are sequenced bases, not all bases in the reference. - * ``'False'`` - Only modifications above specified threshold are stored - cores - number of cores over which to parallelize; default is all available - - Valid argument combinations for ``bedFile``, ``center``, and ``windowSize`` are below. Regions of interest generally fall into two categories: small motifs at which to center analysis (use ``center`` = True) or full windows of interest (do not specify ``center`` or ``windowSize``). - - * ``bedFile`` --> extract all modified bases in regions defined in bed file - * ``bedfile`` + ``center`` --> extract all modified bases in regions defined in bed file, report positions relative to region centers and extract base modificiations within default windowSize of 1kb - * ``bedfile`` + ``center`` + ``windowSize`` --> extract all modified bases in regions defined in bed file, report positions relative to region centers and extract base modifications within flanking +/- windowSize - * ``region`` --> extract all modified bases in single region - - **Example** - - For regions defined by ``bedFile``: - - >>> dm.parse_bam("dimelo/test/data/mod_mappings_subset.bam", "test", "dimelo/dimelo_test", bedFile="dimelo/test/data/test.bed", basemod="A+CG", center=True, windowSize=500, threshA=190, threshC=190, extractAllBases=False, cores=8) - - For single region defined with ``region``: - - >>> dm.parse_bam("dimelo/test/data/mod_mappings_subset.bam", "test", "dimelo/dimelo_test", region="chr1:2907273-2909473", basemod="A+CG", threshA=190, threshC=190, cores=8) - - **Return** - - Returns a SQL database in the specified output directory. Database can be converted into pandas dataframe with: - - >>> fileName = "dimelo/test/data/mod_mappings_subset.bam" - >>> sampleName = "test" - >>> outDir = "dimelo/dimelo_test" - >>> all_data = pd.read_sql("SELECT * from methylationByBase_" + sampleName, sqlite3.connect(outDir + "/" + fileName.split("/")[-1].replace(".bam", "") + ".db")) - >>> aggregate_counts = pd.read_sql("SELECT * from methylationAggregate_" + sampleName, sqlite3.connect(outDir + "/" + fileName.split("/")[-1].replace(".bam", "") + ".db")) - - Each database contains these two tables with columns listed below: - - 1. methylationByBase_sampleName - * id(read_name:pos) - * read_name - * chr - * pos - * prob - * mod - 2. methylationAggregate_sampleName - * id(pos:mod) - * pos - * mod - * methylated_bases - * total_bases - - When running parse_bam with a region defined, a summary bed file is also produced to support visualizing aggregate data with any genome browser tool. The columns of this bed file are chr, start, end, methylated_bases, total_bases. - - For example, to take a summary output bed and create a file with fraction of modified bases with a window size of 100 bp for visualization with the WashU browser, you could run the below commands in terminal: - - * ``bedtools makewindows -g ref_genome.chromsizes.txt -w 100 > ref_genome_windows.100.bp.bed`` - * ``bedtools map -a ref_genome_windows.100.bp.bed -b outDir/fileName_sampleName_chr_start_end_A.bed -c 4,5 -o sum,sum -null 0 | awk -v "OFS=\\t" '{if($5>0){print $1,$2,$3,$4/$5}else{print $1,$2,$3,$5}}' > outDir/fileName_sampleName_chr_start_end_A.100.bed`` - * ``bgzip outDir/fileName_sampleName_chr_start_end_A.100.bed`` - * ``tabix -f -p bed outDir/fileName_sampleName_chr_start_end_A.100.bed.gz`` + input_file, ref_genome, output_directory = utils.sanitize_path_args( + input_file, ref_genome, output_directory + ) - """ - # Ensure exactly one of bedFile and region are specified - if sum([arg is None for arg in (bedFile, region)]) != 1: - raise RuntimeError( - "Exactly one of the mutually exclusive arguments 'bedFile' or 'region' must be specified." + try: + verify_inputs(input_file, motifs, ref_genome) + except Exception as e: + if override_checks: + if not quiet: + print(f"WARNING: {e}") + else: + raise Exception( + f'{e}\nIf you are confident that your inputs are ok, pass "override_checks=True" to convert to warning and proceed with processing.' + ) from e + + output_path, (output_bedmethyl, output_bedmethyl_sorted, output_pileup_path, _) = ( + prep_output_directory( + output_directory=output_directory, + output_name=output_name, + input_file=input_file, + output_file_names=[ + "pileup.bed", + "pileup.sorted.bed", + "pileup.sorted.bed.gz", + "pileup.sorted.bed.gz.tbi", + ], ) - # The argument center is incompatible with region - if region is not None: - if center: - raise RuntimeError( - "Argument 'center' cannot be given alongside 'region'." - ) - - if not os.path.isdir(outDir): - os.makedirs(outDir) + ) - make_db(fileName, sampleName, outDir) + ## Build up the command list to be sent to modkit, then run modkit - if bedFile is not None: - # make a region object for each row of bedFile - bed = pd.read_csv(bedFile, sep="\t", header=None) - windows = [] - for _, row in bed.iterrows(): - windows.append(Region(row)) + # TODO: This is mildly confusing. I get what it's doing, but it's hard to follow / names are bad. Also, why is it used in cleanup here, but not in extract? + region_command_list, processed_regions_path = create_region_command_list( + output_path, + regions, + window_size, + ) - if region is not None: - windows = [Region(region)] + motif_command_list = [] + if len(motifs) > 0: + for motif in motifs: + parsed_motif = utils.ParsedMotif(motif) + motif_command_present = False + for a, b in zip(motif_command_list, motif_command_list[1:]): + if a == parsed_motif.motif_seq and b == str(parsed_motif.modified_pos): + # This motif is already going to be processed; we want to skip adding it a second + # time because modkit does not like duplicate motifs. + # It's actually ok if it's a different mod code in the two cases because the pileup + # operation, under the hood, keeps all mod codes. Filtering is only done when loading. + motif_command_present = True + break + if not motif_command_present: + motif_command_list.append("--motif") + motif_command_list.append(parsed_motif.motif_seq) + motif_command_list.append(str(parsed_motif.modified_pos)) + else: + raise ValueError("Error: no motifs specified. Nothing to process.") - # Configure progress reporting - if len(windows) == 1: - show_read_progress = True + if log: + if not quiet: + print("Logging to ", Path(output_path) / "pileup-log") + log_command_list = ["--log-filepath", Path(output_path) / "pileup-log"] else: - show_read_progress = False - # Enable top-level progress bar for multi-window processing - windows = tqdm(windows, desc="Parsing windows", unit="windows") + log_command_list = [] - # default number of cores is max available + # TODO: This should be a method, like create_region_specifier, or just combined into a prep method for the start... cores_avail = multiprocessing.cpu_count() if cores is None: - num_cores = cores_avail - else: - # if more than available cores is specified, process with available cores - if cores > cores_avail: - num_cores = cores_avail - else: - num_cores = cores - - batchSize = 100 - - Parallel(n_jobs=num_cores)( - delayed(parse_reads_window)( - fileName, - sampleName, - basemod, - windowSize, - window, - center, - threshA, - threshC, - batchSize, - outDir, - extractAllBases, - showReadProgress=show_read_progress, - ) - for window in windows - ) - - # create summary bed files - if region is not None: - if "A" in basemod: - make_bed_file_output(fileName, sampleName, outDir, region, "A") - if "C" in basemod: - make_bed_file_output(fileName, sampleName, outDir, region, "C") - - # output all files created to std out - f = fileName.split("/")[-1].replace(".bam", "") - out_path = f"{outDir}/{f}.db" - if region is None: - str_out = f"Outputs\n_______\nDB file: {out_path}" + if not quiet: + print( + f"No specified number of cores requested. {cores_avail} available on machine, allocating all." + ) + cores_command_list = ["--threads", str(cores_avail)] + elif cores > cores_avail: + if not quiet: + print( + f"Warning: {cores} cores request, {cores_avail} available. Allocating {cores_avail}" + ) + cores_command_list = ["--threads", str(cores_avail)] else: - bed_paths = [] - if "A" in basemod: - bed_path = ( - f"{outDir}/{f}_{sampleName}_{Region(region).string}_A.bed" + if not quiet: + print(f"Allocating requested {cores} cores.") + cores_command_list = ["--threads", str(cores)] + + # TODO: This is SO SO SO similar to extract; just the ValueError vs. printing. I think this can be resolved + mod_thresh_command_list: list[str] = [] + if thresh is None: + if not quiet: + print( + "No base modification threshold provided. Using adaptive threshold selection via modkit." ) - bed_paths.append(bed_path) - if "C" in basemod: - bed_path = ( - f"{outDir}/{f}_{sampleName}_{Region(region).string}_CG.bed" + else: + adjusted_threshold = utils.adjust_threshold(thresh, quiet=quiet) + if adjusted_threshold < 0.5 and not quiet: + print( + f"WARNING: thresh {thresh} is very low and may lead to unexpected behavior. Typical thresholds are at least 0.5 or 128." ) - bed_paths.append(bed_path) - str_out = ( - f"Outputs\n_______\nDB file: {out_path}\nBED file: {bed_paths}" + for motif in motifs: + parsed_motif = utils.ParsedMotif(motif) + for mod_code in parsed_motif.mod_codes: + mod_thresh_command_list = mod_thresh_command_list + [ + "--mod-thresholds", + f"{mod_code}:{adjusted_threshold}", + ] + + ref_genome_command_list = ["--ref", ref_genome] + filter_command_list = ["--filter-threshold", "0"] + + pileup_command_list = ( + ["modkit", "pileup", input_file, output_bedmethyl] + + region_command_list + + motif_command_list + + ref_genome_command_list + + filter_command_list + + mod_thresh_command_list + + cores_command_list + + log_command_list + ) + + # TODO: Do we need to store and use the output from this method? Previously was being printed immediately afterward. + _ = run_modkit.run_with_progress_bars( + command_list=pileup_command_list, + input_file=input_file, + ref_genome=ref_genome, + motifs=motifs, + load_fasta_regex=r"\s+\[.*?\]\s+(\d+)\s+Reading", + find_motifs_regex=r"\s+(\d+)/(\d+)\s+finding\s+([A-Za-z0-9,]+)\s+motifs", + contigs_progress_regex=r"\s+(\d+)/(\d+)\s+contigs", + single_contig_regex=r"\s+(\d+)/(\d+)\s+processing\s+([\w]+)[^\w]", + buffer_size=50, + progress_granularity=25, + done_str="Done", + err_str="Error", + expect_done=True, + quiet=quiet, + ) + # print(done_string) + + ## Sort, compress, and index the output bedmethyl file + + with open(output_bedmethyl_sorted, "w") as sorted_file: + subprocess.run( + ["sort", "-k1,1", "-k2,2n", output_bedmethyl], stdout=sorted_file ) - print(str_out) + pysam.tabix_compress(output_bedmethyl_sorted, output_pileup_path, force=True) + pysam.tabix_index(str(output_pileup_path), preset="bed", force=True) + + # TODO: Can cleanup be consolidated? + if cleanup: + if output_bedmethyl.exists(): + output_bedmethyl.unlink() + if output_bedmethyl_sorted.exists(): + output_bedmethyl_sorted.unlink() + + return output_pileup_path, processed_regions_path + + +def extract( + input_file: str | Path, + output_name: str, + ref_genome: str | Path, + output_directory: str | Path | None = None, + regions: str | Path | list[str | Path] | None = None, + motifs: list = ["A,0", "CG,0", "GCH,1"], + thresh: float | None = None, + window_size: int | None = None, + cores: int | None = None, + log: bool = False, + cleanup: bool = True, + quiet: bool = False, + override_checks: bool = False, +) -> tuple[Path, Path]: + """ + Takes a bam file containing long read sequencing data aligned + to a reference genome with modification calls for one or more bases/contexts + and pulls out data from each individual read. + + The current implementation of this method uses modkit, a tool built by + Nanopore Technologies, along with h5py to build the final output file. The + modkit command in this function is `modkit extract`. + https://github.com/nanoporetech/modkit/ + + The intermediate outputs are plain text files containing a list of all base modifications, + with a file for each motif. The compressed and indexed output contains vectors of valid + and modified positions within each read. + + Args: + output_file: a string or Path object pointing to the location of a .bam file. + The file should follow at least v1.6 of the .bam file specifications, + found here: https://samtools.github.io/hts-specs/ + https://samtools.github.io/hts-specs/SAMv1.pdf + + The file needs to have modifications stored in the standard format, + with MM and ML tags (NOT mm and ml) and mod names m for 5mC and a + for 6mA. + + Furthermore, the file must have a .bam.bai index file with the same name. + You can create an index if needed using samtools index. + output_name: a string that will be used to create an output folder + containing the intermediate and final outputs, along with any logs. + ref_genome: a string of Path objecting pointing to the .fasta file + for the reference genome to which the .bam file is aligned. + output_directory: optional str or Path pointing to an output directory. + If left as None, outputs will be stored in a new folder within the input + directory. + regions: TODO + motifs: a list of strings specifying which base modifications to look for. + The basemods are each specified as {sequence_motif},{position_of_modification}. + For example, a methylated adenine is specified as 'A,0' and CpG methylation + is specified as 'CG,0'. + thresh: float point number specifying the base modification probability threshold + used to delineate modificaton calls as True or False. When set to None, modkit + will select its own threshold automatically based on the data. + window_size: an integer specifying a window around the center of each bed_file + region. If set to None, the bed_file is used unmodified. If set to a non-zero + positive integer, the bed_file regions are replaced by new regions with that + window size in either direction of the center of the original bed_file regions. + This is used for e.g. extracting information from around known motifs or peaks. + cores: an integer specifying how many parallel cores modkit gets to use. + By default modkit will use all of the available cores on the machine. + log: a boolean specifying whether to output logs into the output folder. + cleanup: a boolean specifying whether to clean up to keep intermediate + outputs. The final processed files are not human-readable, whereas the intermediate + outputs are. However, intermediate outputs can also be quite large. + override_checks: convert errors from input checking into warnings if True -def make_bed_file_output(fileName, sampleName, outDir, region, mod): + Returns: + Path object pointing to the compressed and indexed output .h5 file, ready for + plotting functions. + Path object pointing to 'regions.processed.bed', the `--include-bed` file used for `modkit extract` + + """ """ - Make output bed file that can be used to visualize aggregate with other genome browsers + TODO: There are a lot of issues that are all related here: + dimelo/parse_bam.py:374: error: Incompatible types in assignment (expression has type "Path | None", variable has type "str | Path") [assignment] + dimelo/parse_bam.py:393: error: Argument "input_file" to "prep_outputs" has incompatible type "str | Path"; expected "Path" [arg-type] + dimelo/parse_bam.py:480: error: Argument "input_file" to "run_with_progress_bars" has incompatible type "str | Path"; expected "Path" [arg-type] + dimelo/parse_bam.py:481: error: Argument "ref_genome" to "run_with_progress_bars" has incompatible type "str | Path"; expected "Path" [arg-type] + + I'm not sure of the most elegant way to fix it. Come back and address. """ - r = Region(region) - f = fileName.split("/")[-1].replace(".bam", "") - out_path = f"{outDir}/{f}.db" - aggregate_counts_all = pd.read_sql( - "SELECT * from methylationAggregate_" + sampleName, - sqlite3.connect(out_path), + + ## Verify and prepare inputs and outputs + + input_file, ref_genome, output_directory = utils.sanitize_path_args( + input_file, ref_genome, output_directory ) - aggregate_counts_mod = aggregate_counts_all[ - aggregate_counts_all["mod"].str.contains(mod) - ].copy() - aggregate_counts_mod["chr"] = r.chromosome - aggregate_counts_mod["end"] = aggregate_counts_mod["pos"] + 1 - # columns are: id(pos:mod), pos, mod, methylated_bases, total_bases - dictionary_agg = { - "chr": aggregate_counts_mod["chr"], - "start": aggregate_counts_mod["pos"], - "end": aggregate_counts_mod["end"], - "methylated": aggregate_counts_mod["methylated_bases"], - "total": aggregate_counts_mod["total_bases"], - } - bed_agg = pd.DataFrame(dictionary_agg) - bed_agg.sort_values(by="start", ascending=True, inplace=True) - if "A" in mod: - mod_name = "A" - if "C" in mod: - mod_name = "CG" - bed_agg.to_csv( - f"{outDir}/{f}_{sampleName}_{r.string}_{mod_name}.bed", - sep="\t", - header=False, - index=False, + + try: + verify_inputs(input_file, motifs, ref_genome) + except Exception as e: + if override_checks: + if not quiet: + print(f"WARNING: {e}") + else: + raise Exception( + f'{e}\nIf you are confident that your inputs are ok, pass "override_checks=True" to convert to warning and proceed with processing.' + ) from e + + # TODO: Add intermediate mod-specific .txt files? + output_path, (output_reads_path,) = prep_output_directory( + output_directory=output_directory, + output_name=output_name, + input_file=input_file, + output_file_names=["reads.combined_basemods.h5"], ) + ## Build up the command lists shared across motifs to be sent to modkit -def parse_reads_window( - fileName: str, - sampleName: str, - basemod: str, - windowSize: int, - window: Region, - center: bool, - threshA: int, - threshC: int, - batchSize: int, - outDir: str, - extractAllBases: bool, - showReadProgress: bool = False, -) -> None: - """Parse all reads in window and put data into methylationByBase table. + region_command_list, processed_regions_path = create_region_command_list( + output_path, + regions, + window_size, + ) - Args: - :param bam: read in bam file with Mm and Ml tags - :param fileName: name of bam file - :param sampleName: name of sample for output file name labelling - :param basemod: which basemods, currently supported options are 'A', 'CG', 'A+CG' - :param windowSize: window size around center point of feature of interest to plot (+/-); only mods within this window are stored; only applicable for center=True - :param window: single window - :param center: report positions with respect to reference center (+/- window size) if True or in original reference space if False - :param threshA: threshold above which to call an A base methylated - :param threshC: threshold above which to call a C base methylated - :param showReadProgress: when true, display progress for read processing - """ - bam = pysam.AlignmentFile(fileName, "rb") - data = [] - if showReadProgress: - total_reads = bam.count( - reference=window.chromosome, start=window.begin, end=window.end + cores_avail = multiprocessing.cpu_count() + if cores is None: + if not quiet: + print( + f"No specified number of cores requested. {cores_avail} available on machine, allocating all." + ) + cores_command_list = ["--threads", str(cores_avail)] + elif cores > cores_avail: + if not quiet: + print( + f"Warning: {cores} cores request, {cores_avail} available. Allocating {cores_avail}" + ) + cores_command_list = ["--threads", str(cores_avail)] + else: + if not quiet: + print(f"Allocating requested {cores} cores.") + cores_command_list = ["--threads", str(cores)] + + mod_thresh_command_list: list[str] = [] + if thresh is None: + if not quiet: + print( + "No valid base modification threshold provided. Raw probs will be saved." + ) + adjusted_threshold = None + else: + adjusted_threshold = utils.adjust_threshold(thresh, quiet=quiet) + if adjusted_threshold < 0.5 and not quiet: + print( + f"WARNING: thresh {thresh} is very low and may lead to unexpected behavior. Typical thresholds are at least 0.5 or 128." + ) + for motif in motifs: + parsed_motif = utils.ParsedMotif(motif) + for mod_code in parsed_motif.mod_codes: + mod_thresh_command_list = mod_thresh_command_list + [ + "--mod-thresholds", + f"{mod_code}:{adjusted_threshold}", + ] + + if log: + if not quiet: + print("logging to ", Path(output_path) / "extract-log") + log_command_list = ["--log-filepath", Path(output_path) / "extract-log"] + else: + log_command_list = [] + + ref_genome_command_list = ["--ref", ref_genome] + filter_command_list = ["--filter-threshold", "0"] + + # Run modkit once for each motif, because the output .txt can be ambiguous otherwise + # There is no column currently to specify the motif (e.g. CG,0 vs GCH,1), only canonical + # base (e.g. C) and mod code (e.g. m) + # There is a 5mer context so we could technically manually motif check if we want to. + # Our current design paradigm is to leave all such operations to modkit, hence the loop below. + for motif in motifs: + # Here we prepare the motif-specific commands and delete any old .txt file because + # modkit will crash otherwise + motif_command_list = [] + parsed_motif = utils.ParsedMotif(motif) + motif_command_list.append("--motif") + motif_command_list.append(parsed_motif.motif_seq) + motif_command_list.append(str(parsed_motif.modified_pos)) + + output_txt = Path(output_path) / (f"reads.{motif}.txt") + + if os.path.exists(output_txt): + os.remove(output_txt) + + extract_command_list = ( + ["modkit", "extract", input_file, output_txt] + + region_command_list + + motif_command_list + + cores_command_list + + log_command_list + + ref_genome_command_list + + filter_command_list ) - bam.reset() - reads = bam.fetch( - reference=window.chromosome, start=window.begin, end=window.end - ) - if showReadProgress: - reads = tqdm( - reads, desc="Processing reads", unit="reads", total=total_reads + + # TODO: Do we need to store and use the output from this method? Previously was being printed immediately afterward. + # This is something the user might want to see - it's the end-of-process message for modkit, says e.g. how many reads were processed and stuff + _ = run_modkit.run_with_progress_bars( + command_list=extract_command_list, + input_file=input_file, + ref_genome=ref_genome, + motifs=[motif], + load_fasta_regex=r"\s+\[.*?\]\s+(\d+)\s+parsing FASTA", + find_motifs_regex=r"\s+(\d+)/(\d+)\s+([\w]+)\s+searched", + contigs_progress_regex=r"\s+(\d+)/(\d+)\s+contigs\s+[^s]", + single_contig_regex=r"\s+(\d+)/(\d+)\s+processing\s+([\w]+)[^\w]", + buffer_size=100, + progress_granularity=50, + done_str="Done", + err_str="Error", + expect_done=False, + quiet=quiet, ) - for read in reads: - [ - (mod, positions, probs), - (mod2, positions2, probs2), - ] = get_modified_reference_positions( - read, - basemod, - window, - center, - threshA, - threshC, - windowSize, - fileName, - sampleName, - outDir, - extractAllBases, + # print(done_string) + + # Create the compressed and indexed output + read_by_base_txt_to_hdf5( + output_txt, + output_reads_path, + motif, + adjusted_threshold, + quiet=quiet, ) - # Generate rows for methylationByBase database update - for pos, prob in zip(positions, probs): - if pos is not None: - if (center is True and abs(pos) <= windowSize) or ( - center is False and pos > window.begin and pos < window.end - ): # to decrease memory, only store bases within the window - d = ( - read.query_name + ":" + str(pos), - read.query_name, - window.chromosome, - int(pos), - int(prob), - mod, - ) - data.append(d) - for pos, prob in zip(positions2, probs2): - if pos is not None: - if (center is True and abs(pos) <= windowSize) or ( - center is False and pos > window.begin and pos < window.end - ): # to decrease memory, only store bases within the window - d = ( - read.query_name + ":" + str(pos), - read.query_name, - window.chromosome, - int(pos), - int(prob), - mod2, - ) - data.append(d) - if data: - # data is list of tuples associated with given read - # or ignore because a read may overlap multiple windows - DATABASE_NAME = ( - outDir + "/" + fileName.split("/")[-1].replace(".bam", "") + ".db" + # Delete intermediate file + if cleanup: + os.remove(output_txt) + + return output_reads_path, processed_regions_path + + +""" +Helper functions to facilitate bam parse operations +""" + + +def verify_inputs( + input_file, + motifs, + ref_genome, +): + """ + Checks .bam format and alignment quality (to verify that you are using the right reference genome) + + The correct-bases-called fraction, if under 35%, means the user almost definitely passed the wrong reference genome. + """ + check_bam_format(input_file, motifs) + correct_bases, total_bases = get_alignment_quality(input_file, ref_genome) + if total_bases == 0: + raise ValueError( + f"First {NUM_READS_TO_CHECK} reads are empty. Please verify your {input_file.name} contents." ) - table_name = "methylationByBase_" + sampleName - command = ( - """INSERT OR IGNORE INTO """ - + table_name - + """ VALUES(?,?,?,?,?,?);""" + elif correct_bases / total_bases < 0.35: + raise ValueError( + f"First {NUM_READS_TO_CHECK} reads have anomalously low alignment quality: only {100 * correct_bases / total_bases}% of bases align.\nPlease verify that {input_file.name} is actually aligned to {ref_genome.name}." ) - connection = sqlite3.connect(DATABASE_NAME, timeout=60.0) - execute_sql_command(command, DATABASE_NAME, data, connection) - connection.close() - - -def get_modified_reference_positions( - read: pysam.AlignedSegment, - basemod: str, - window: Region, - center: bool, - threshA: int, - threshC: int, - windowSize: int, - fileName: str, - sampleName: str, - outDir: str, - extractAllBases: bool, + return + + +def check_bam_format( + bam_file: str | Path, + motifs: list = ["A,0", "CG,0"], ): - """Extract mA and mC pos & prob information for the read - Args: - :param read: single read from bam file - :param basemod: which basemods, currently supported options are 'A', 'CG', 'A+CG' - :param window: window from bed file - :param center: report positions with respect to reference center (+/- window size) if True or in original reference space if False - :param threshA: threshold above which to call an A base methylated - :param threshC: threshold above which to call a C base methylated - :param windowSize: window size around center point of feature of interest to plot (+/-); only mods within this window are stored; only applicable for center=True - Return: - For each mod, you get the positions where those mods are and the probabilities for those mods (parallel vectors) """ - if (read.has_tag("Mm")) & (";" in read.get_tag("Mm")): - mod1 = read.get_tag("Mm").split(";")[0].split(",", 1)[0] - mod2 = read.get_tag("Mm").split(";")[1].split(",", 1)[0] - base = basemod[0] # this will be A, C, or A - if basemod == "A+CG": - base2 = basemod[2] # this will be C for A+CG case - else: # in the case of a single mod will just be checking that single base - base2 = base - if base in mod1 or base2 in mod1: - mod1_return = get_mod_reference_positions_by_mod( - read, - mod1, - 0, - window, - center, - threshA, - threshC, - windowSize, - fileName, - sampleName, - outDir, - extractAllBases, - ) - else: - mod1_return = (None, [None], [None]) - if base in mod2 or base2 in mod2: - mod2_return = get_mod_reference_positions_by_mod( - read, - mod2, - 1, - window, - center, - threshA, - threshC, - windowSize, - fileName, - sampleName, - outDir, - extractAllBases, - ) - return (mod1_return, mod2_return) - else: - return (mod1_return, (None, [None], [None])) - else: - return ((None, [None], [None]), (None, [None], [None])) - - -def get_mod_reference_positions_by_mod( - read: pysam.AlignedSegment, - basemod: str, - index: int, - window: Region, - center: bool, - threshA: int, - threshC: int, - windowSize: int, - fileName: str, - sampleName: str, - outDir: str, - extractAllBases: bool, -): - """Get positions and probabilities of modified bases for a single read + Check whether a .bam file is formatted appropriately for modkit. + * bam file has a .bai index + * modification tags named MM/ML (NOT Mm/Ml) + * tags contain ambiguity specification (? vs.) + * bam file contains the expected modifications (motif, mod code) + Args: - :param read: one read in bam file - :param mod: which basemod, reported as base+x/y/m - :param window: window from bed file - :param center: report positions with respect to reference center (+/- window size) if True or in original reference space if False - :param threshA: threshold above which to call an A base methylated - :param threshC: threshold above which to call a C base methylated - :param windowSize: window size around center point of feature of interest to plot (+/-); only mods within this window are stored; only applicable for center=True - :param index: 0 or 1 + bam_file: a formatted .bam file with a .bai index + motifs: a list of base modification motifs + + Returns: + None. If the function returns, you are ok. + """ - modsPresent = True - base, mod = basemod.split("+") - num_base = len(read.get_tag("Mm").split(";")[index].split(",")) - 1 - # get base_index - base_index = np.array( - [ - i - for i, letter in enumerate(read.get_forward_sequence()) - if letter == base - ] - ) - # get reference positons - refpos = np.array(read.get_reference_positions(full_length=True)) - if read.is_reverse: - refpos = np.flipud(refpos) - modified_bases = [] - if num_base == 0: - modsPresent = False - if modsPresent: - deltas = [ - int(i) for i in read.get_tag("Mm").split(";")[index].split(",")[1:] - ] - Ml = read.get_tag("Ml") - if index == 0: - probabilities = np.array(Ml[0:num_base], dtype=int) - if index == 1: - probabilities = np.array(Ml[0 - num_base :], dtype=int) - # determine locations of the modified bases, where index_adj is the adjustment of the base_index - # based on the cumulative sum of the deltas - locations = np.cumsum(deltas) - # loop through locations and increment index_adj by the difference between the next location and current one + 1 - # if the difference is zero, therefore, the index adjustment just gets incremented by one because no base should be skipped - index_adj = [] - index_adj.append(locations[0]) - i = 0 - for i in range(len(locations) - 1): - diff = locations[i + 1] - locations[i] - index_adj.append(index_adj[i] + diff + 1) - # get the indices of the modified bases - modified_bases = base_index[index_adj] - - # extract CpG sites only rather than all mC - keep = [] - prob_keep = [] - all_bases_index = [] - probs = [] - i = 0 - seq = read.get_forward_sequence() - # deal with None for refpos from soft clipped / unaligned bases - if "C" in basemod: - for b in base_index: - if ( - b < len(seq) - 1 - ): # if modified C is not the last base in the read - if (refpos[b] is not None) & (refpos[b + 1] is not None): - if seq[b + 1] == "G": + basemods_found_dict = {} + mod_codes_dict = {} + mod_codes_found_dict = defaultdict(set) + for motif in motifs: + parsed_motif = utils.ParsedMotif(motif) + mod_codes_dict[parsed_motif.modified_base] = parsed_motif.mod_codes + basemods_found_dict[parsed_motif.modified_base] = False + + input_bam = pysam.AlignmentFile(bam_file) + + try: + for counter, read in enumerate(input_bam.fetch()): + read_dict = read.to_dict() + for tag_string in read_dict["tags"]: + tag = tag_string.split(",")[0].split(":")[0] + if tag == "Mm" or tag == "Ml": + raise ValueError( + f'Base modification tags are out of spec (Mm and Ml instead of MM and ML). \n\nConsider using "modkit update-tags {str(bam_file)} new_file.bam" in the command line with your conda environment active and then trying with the new file. For megalodon basecalling/modcalling, you may also need to pass "--mode ambiguous.\nBe sure to index the resulting .bam file."' + ) + elif tag == "MM": + for tag_substring in tag_string.split(";"): + tag_fields = tag_substring.split(",")[0].split(":") + if len(tag_fields) >= 3: + tag_value = tag_fields[2] + else: + tag_value = tag_fields[0] if ( - abs(refpos[b + 1] - refpos[b]) == 1 - ): # ensure there isn't a gap - all_bases_index.append( - b - ) # add to all_bases_index whether or not modified - if b in modified_bases: - if probabilities[i] >= threshC: - keep.append(b) - prob_keep.append(i) - if extractAllBases: - if b in modified_bases: - probs.append(probabilities[i]) + len(tag_value) > 0 + and tag_value[-1] != "?" + and tag_value[-1] != "." + ): + raise ValueError( + f'Base modification tags are out of spec. Need ? or . in TAG:TYPE:VALUE for MM tag, else modified probability is considered to be implicit. \n\nConsider using "modkit update-tags {str(bam_file)} new_file.bam --mode ambiguous" in the command line with your conda environment active and then trying with the new file.' + ) + else: + if ( + len(tag_value) > 0 + and tag_value[0] in basemods_found_dict + ): + correct_mod_codes = mod_codes_dict[tag_value[0]] + # valid_mod_codes = mod_codes_dict[tag_value[0]].union( + # utils.BASEMOD_NAMES_DICT[tag_value[0]] + # ) + if tag_value[2] in correct_mod_codes: + basemods_found_dict[tag_value[0]] = True else: - probs.append(0) - # increment for each instance of modified base - if b in modified_bases: - i = i + 1 - else: # for m6A no need to look at neighboring base; do need to remove refpos that are None - for b in base_index: - if refpos[b] is not None: - all_bases_index.append( - b - ) # add to all_bases_index whether or not modified - if b in modified_bases: - if probabilities[i] >= threshA: - keep.append(b) - prob_keep.append(i) - if extractAllBases: - if b in modified_bases: - probs.append(probabilities[i]) - else: - probs.append(0) - # increment for each instance of modified base - if b in modified_bases: - i = i + 1 - # adjust position to be centered at 0 at the center of the motif; round in case is at 0.5 - # add returning base_index for plotting mod/base_abundance - if center is True: - if window.strand == "+": - refpos_mod_adjusted = np.array(refpos[keep]) - round( - ((window.end - window.begin) / 2 + window.begin) - ) - refpos_total_adjusted = np.array(refpos[all_bases_index]) - round( - ((window.end - window.begin) / 2 + window.begin) - ) - if window.strand == "-": - refpos_mod_adjusted = -1 * ( - np.array(refpos[keep]) - - round(((window.end - window.begin) / 2 + window.begin)) - ) - refpos_total_adjusted = -1 * ( - np.array(refpos[all_bases_index]) - - round(((window.end - window.begin) / 2 + window.begin)) - ) - update_methylation_aggregate_db( - refpos_mod_adjusted, - refpos_total_adjusted, - basemod, - center, - windowSize, - window, - fileName, - sampleName, - outDir, - ) - if extractAllBases: - return (basemod, refpos_total_adjusted, probs) - elif not modsPresent: - return (None, [None], [None]) + mod_codes_found_dict[tag_value[0]].add(tag_value[2]) + # With the mode-code-aware motifs, it no longer makes sense to throw this error + # This is because the warning the user gets if their mod code isn't found, or (if none is specified) + # the default mod codes aren't found, can tell them what mod codes *were* found and they can add them + # to their motif or use adjust_mods according to what makes sense. Thus, unexpected codes are not a + # problem (in part this is because parse_bam will now set thresholds for the motif-specified OR default mod codes) + # elif tag_value[2] not in valid_mod_codes: + # raise ValueError( + # f'Base modification name unexpected: {tag_value[2]} to modify {tag_value[0]}, should be in set {valid_mod_codes}. \n\nIf you know what your mod names correspond to in terms of the latest .bam standard, consider using "modkit adjust-mods {str(bam_file)} new_file.bam --convert 5mC_name m --convert N6mA_name a --convert other_basemod_name correct_label" and then trying with the new file. Note: currently supported mod names are {utils.BASEMOD_NAMES_DICT}' + # ) + if all(basemods_found_dict.values()): + return + if counter >= NUM_READS_TO_CHECK: + missing_bases = [] + for base, found in basemods_found_dict.items(): + if not found: + missing_bases.append(base) + print( + f""" +WARNING: no modified appropriately-coded values found for {missing_bases} in the first {counter} reads. +Do you expect this file to contain these modifications? parse_bam is looking for {motifs} but for {missing_bases} found only found {[f"{base}+{mod_codes}" for base, mod_codes in mod_codes_found_dict.items()]}. + +Consider passing only the motifs and mod codes (e.g. m,h,a) that you expect to be present in your file. +You can use modkit adjust-mods --convert [OPTIONS] to update or consolidate mod codes. +See https://github.com/nanoporetech/modkit/blob/master/book/src/advanced_usage.md + """ + ) + return + except ValueError as e: + if "fetch called on bamfile without index" in str(e): + raise ValueError( + f'{e}. Consider using "samtools index {str(bam_file)}" to create an index if your .bam is already sorted.' + ) from e else: - return (basemod, refpos_mod_adjusted, probabilities[prob_keep]) - else: - update_methylation_aggregate_db( - refpos[keep], - refpos[all_bases_index], - basemod, - center, - windowSize, - window, - fileName, - sampleName, - outDir, + raise + except: + raise + + +def get_alignment_quality( + bam_file, + ref_genome, +) -> tuple[int, int]: + """ + Determine fraction of read bases that line up with reference genome in first NUM_READS_TO_CHECK reads in bam file + """ + ref_genome_index = ref_genome.parent / (ref_genome.name + ".fai") + if not ref_genome_index.exists(): + print(f"Indexing {ref_genome.name}. This only needs to be done once.") + pysam.faidx(str(ref_genome)) + input_bam = pysam.AlignmentFile(bam_file, "rb") + genome_fasta = pysam.FastaFile(str(ref_genome)) + total_bases = 0 + correct_bases = 0 + # For NUM_READS_TO_CHECK=100 this is <1s on most machines + for index, read in enumerate(input_bam.fetch()): + if index >= NUM_READS_TO_CHECK: + return correct_bases, total_bases + + # The query sequence is the entire sequence as stored in the .bam file + # So it is reverse complemented if it was a reverse read + # Meaning we can compare it directly against the reference genome + read_sequence = read.query_sequence + + # print(read.mapping_quality) + + # get_aligned_pairs returns a list of (read_coord,ref_coord) pairs with None values when not aligned + # So if we just skip Nones and compare the remainder it'll tell us the accuracy + # (in Dorado-basecalled r10 files, as of July 2024, we observe some fraction of reads + # with empty read_sequence, despite having intact tags and alignment info. the reason + # for this isn't currentyl known, but with this None check we avoid errors in this alignment + # checking stage.) + + if read_sequence is not None: + for pos_in_read, pos_in_ref in read.get_aligned_pairs(): + if pos_in_read is not None and pos_in_ref is not None: + total_bases += 1 + if read_sequence[pos_in_read] == str( + genome_fasta.fetch( + read.reference_name, pos_in_ref, pos_in_ref + 1 + ) + ): + correct_bases += 1 + + return correct_bases, total_bases + + +def create_region_command_list( + output_path, + regions, + window_size, +): + """ + Creates commands to pass to modkit for specifying genomic regions. + + TODO: Split into two function? Convert to bed, then construct commands + """ + + if regions is not None: + bed_filepath_processed = output_path / "regions.processed.bed" + regions_dict = utils.regions_dict_from_input( + regions, + window_size, ) - if extractAllBases: - return (basemod, np.array(refpos[all_bases_index]), probs) - elif not modsPresent: - return (None, [None], [None]) - else: - return (basemod, np.array(refpos[keep]), probabilities[prob_keep]) - - -def update_methylation_aggregate_db( - refpos_mod: np.ndarray, - refpos_total: np.ndarray, - basemod: str, - center: bool, - windowSize: int, - window: Region, - fileName: str, - sampleName: str, - outDir: str, + utils.bed_from_regions_dict(regions_dict, bed_filepath_processed) + region_specifier = ["--include-bed", str(bed_filepath_processed)] + + else: + bed_filepath_processed = None + region_specifier = [] + + return region_specifier, bed_filepath_processed + + +def read_by_base_txt_to_hdf5( + input_txt: str | Path, + output_h5: str | Path, + motif: str, + thresh: float | None = None, + quiet: bool = False, + compress_level: int = 1, + chunk_size: int = 1000, ) -> None: - """Updates the aggregate methylation table with all of the methylation information from a single read. + """ + Takes in a txt file generated by modkit extract and appends + all the data from a specified motif into an hdf5 file. If a thresh is specified, it + also binarizes the mod calls. + + If the h5 file does not exist it will be created and datasets will be added for read_name, + chromosome, read_start, read_end, strand, motif, mod_vector, and val_vector. + + All the datasets (exception threshold) are parallel arrays of length num_reads + + Each read's position data is defined in genomic reference coordinates on the positive strand + (i.e. the read_start is the leftmost aligned position, read_end is the rightmost, vectors + are left to right along genomic coordinates) + + TODO: Make a nice key:value map of the h5 file structure, make sure start and end are documented + as reconstructions NOT original cigarstring alignment info. mention pysam + Args: - :param refpos_mod: list of modified reference positions - :param refpos_total: list of all reference positions for the base in question - df with columns pos:modification, pos, mod, methylated_bases, total_bases + input_txt: a string or Path pointing to a modkit extracted base-by-base modifications + file. This file is assumed to have been created by modkit v0.2.4, other versions may + have a different format and may not function normally. + output_h5: a string or Path pointing to a valid place to save an .h5 file. If this + file already exists, it will not be cleared and will simply be appended to. + motif: a string specifying a single base modification. Basemods are specified as + {sequence_motif},{position_of_modification},{optional mod_code}. For example, + a methylated adenine is specified as 'A,0' or 'A,0,a' and CpG methylation is + specified as 'CG,0' or 'CG,0,m'. + thresh: a floating point threshold for base modification calling, between zero and one. + If specified as None, raw probabilities will be saved in the .h5 output. + quiet: if True, this suppresses outputs + compress_level: gzip compression level for datasets, specifically for vectors for now + chunk_size: size of write chunks in reads + + Returns: + None + """ - # store list of entries for a given read - data = [] - for pos in refpos_total: - # only store positions within window - if (center is True and abs(pos) <= windowSize) or ( - center is False and pos > window.begin and pos < window.end - ): - # key is pos:mod - id = str(pos) + ":" + basemod - if pos in refpos_mod: - data.append((id, int(pos), basemod, 1, 1)) + """ + TODO: There are some issues that are all related here: + dimelo/parse_bam.py:718: error: Incompatible types in assignment (expression has type "Path | None", variable has type "str | Path") [assignment] + dimelo/parse_bam.py:725: error: Item "str" of "str | Path" has no attribute "open" [union-attr] + dimelo/parse_bam.py:890: error: Item "str" of "str | Path" has no attribute "name" [union-attr] + + I'm not sure of the most elegant way to fix it. Come back and address. + """ + input_txt, output_h5 = utils.sanitize_path_args(input_txt, output_h5) + + parsed_motif = utils.ParsedMotif(motif) + + read_name = "" + num_reads = 0 + # TODO: I think the function calls can be consolidated; lots of repetition + # TODO: Consider opening both files at once + with input_txt.open() as txt: + # Check file length + for line_index, line in enumerate(txt): + fields = line.split("\t") + if line_index > 0 and read_name != fields[0]: + read_name = fields[0] + num_reads += 1 + num_lines = line_index + txt.seek(0) + + with h5py.File(output_h5, "a") as h5: + ## Define hdf5 dataset types for later + dt_str = h5py.string_dtype(encoding="utf-8") + # mod and val vectors -> uint8 allows us to just write whatever bytes we want + # h5py does not appear to otherwise support vlen binary + dt_vlen = h5py.vlen_dtype(np.dtype("uint8")) + + ## Format threshold value and create dataset to store whether this data is thresholded (binary) or raw (float16) + # TODO: should this method thresholding without binarization + # None becomes NaN + threshold_to_store = np.nan if thresh is None else thresh + if "threshold" in h5: + threshold_from_existing = h5["threshold"][()] + if threshold_from_existing != threshold_to_store and not ( + np.isnan(threshold_from_existing) and np.isnan(threshold_to_store) + ): + raise ValueError( + "existing threshold in output_h5 does not match provided threshold for read_by_base_txt_to_hdf5." + ) else: - data.append((id, int(pos), basemod, 0, 1)) + h5.create_dataset("threshold", data=threshold_to_store) - if data: # if data to append is not empty - DATABASE_NAME = ( - outDir + "/" + fileName.split("/")[-1].replace(".bam", "") + ".db" - ) - # set variables for sqlite entry - table_name = "methylationAggregate_" + sampleName - - # create or ignore if key already exists - # need to add 0 filler here so later is not incremented during update command - command = ( - """INSERT OR IGNORE INTO """ - + table_name - + """ VALUES(?,?,?,?,?);""" - ) + ## Create read metadata datasets + # TODO: loop through dict instead? + if "read_name" in h5: + old_size = h5["read_name"].shape[0] + h5["read_name"].resize((old_size + num_reads,)) + else: + old_size = 0 + h5.create_dataset( + "read_name", + (num_reads,), + maxshape=(None,), + dtype=dt_str, + compression="gzip", + compression_opts=9, + ) + if "chromosome" in h5: + if old_size != h5["chromosome"].shape[0]: + print("size mismatch: read_name:chromosome") + else: + h5["chromosome"].resize((old_size + num_reads,)) + else: + h5.create_dataset( + "chromosome", + (num_reads,), + maxshape=(None,), + dtype=dt_str, + compression="gzip", + compression_opts=9, + ) + if "read_start" in h5: + if old_size != h5["read_start"].shape[0]: + print("size mismatch", "read_name", "read_start") + else: + h5["read_start"].resize((old_size + num_reads,)) + else: + h5.create_dataset( + "read_start", + (num_reads,), + maxshape=(None,), + dtype="i", + compression="gzip", + compression_opts=9, + ) + if "read_end" in h5: + if old_size != h5["read_end"].shape[0]: + print("size mismatch", "read_name", "read_end") + else: + h5["read_end"].resize((old_size + num_reads,)) + else: + h5.create_dataset( + "read_end", + (num_reads,), + maxshape=(None,), + dtype="i", + compression="gzip", + compression_opts=9, + ) + if "strand" in h5: + if old_size != h5["strand"].shape[0]: + print("size mismatch", "read_name", "strand") + else: + h5["strand"].resize((old_size + num_reads,)) + else: + h5.create_dataset( + "strand", + (num_reads,), + maxshape=(None,), + dtype=dt_str, + compression="gzip", + compression_opts=9, + ) + if "motif" in h5: + if old_size != h5["motif"].shape[0]: + print("size mismatch", "read_name", "motif") + else: + h5["motif"].resize((old_size + num_reads,)) + else: + h5.create_dataset( + "motif", + (num_reads,), + maxshape=(None,), + dtype=dt_str, + compression="gzip", + compression_opts=9, + ) - data_fill = [(x[0], x[1], x[2], 0, 0) for x in data] - connection = sqlite3.connect(DATABASE_NAME, timeout=60.0) - execute_sql_command(command, DATABASE_NAME, data_fill, connection) - connection.close() - - # update table for all entries - # values: methylated_bases, total_bases, id - # these are entries 3, 4, 0 in list of tuples - values_subset = [(x[3], x[4], x[0]) for x in data] - command = ( - """UPDATE """ - + table_name - + """ SET methylated_bases = methylated_bases + ?, total_bases = total_bases + ? WHERE id = ?""" - ) - connection = sqlite3.connect(DATABASE_NAME, timeout=60.0) - execute_sql_command(command, DATABASE_NAME, values_subset, connection) - connection.close() + ## Create the vector datasets. These will contain raw bytes formatted into a uint8 array + # TODO: loop through dict instead + if "mod_vector" in h5: + if old_size != h5["mod_vector"].shape[0]: + print("size mismatch read_name:mod_vector") + else: + h5["mod_vector"].resize((old_size + num_reads,)) + else: + h5.create_dataset( + "mod_vector", + (num_reads,), + maxshape=(None,), + dtype=dt_vlen, + # compression='gzip', # we are handling compression ourselves because hdf5 is bad at it + # compression_opts=9, + ) + if "val_vector" in h5: + if old_size != h5["val_vector"].shape[0]: + print("size mismatch read_name:val_vector") + else: + h5["val_vector"].resize((old_size + num_reads,)) + else: + h5.create_dataset( + "val_vector", + (num_reads,), + maxshape=(None,), + dtype=dt_vlen, + # compression='gzip', # we are handling compression ourselves because hdf5 is bad at it + # compression_opts=9, + ) + ## Add data to datasets from txt file + # Initialize loop vars - these will go into datasets + # TODO: initialize read name to actual first read so we can get rid of the logic in the loop + read_name = "" + read_chrom = "" + read_len = 0 + ref_strand = "" + read_start = 0 + read_end = 0 + valid_coordinates_list: list[int] = [] + mod_values_list: list[float] = [] + + # Count reads for batched write + read_counter = 0 + # Keys (strings): dataset names, values: lists of dataset values by read; string or ints or arrays + # Contents reset at the end of each chunk, after writing to h5 + chunk_datasets_contents: defaultdict[str, list[str | int | np.ndarray]] = ( + defaultdict(list) + ) + # TODO: replace in loop with read_counter%chunk_size as appropriate + reads_in_chunk = 0 + + # Setting up progress bars if not in quiet mode + # Skip header + iterator = enumerate(txt) + next(iterator) + if not quiet: + iterator = tqdm( + iterator, + total=num_lines, + desc=f"Transferring {num_reads} from {input_txt.name} into {output_h5.name}, new size {old_size + num_reads}", + bar_format="{bar}| {desc} {percentage:3.0f}% | {elapsed}<{remaining}", + ) -def main(): - parser = argparse.ArgumentParser( - description="Parse a bam file into DiMeLo database tables" - ) + # Loop through txt file + for line_index, line in iterator: + # TODO: use csv module + fields = line.split("\t") + pos_in_genome = int(fields[2]) + canonical_base = fields[15] + prob = float(fields[10]) + mod_code = fields[11] + + if read_name != fields[0]: + # Record the previous read details unless this is the first line + if line_index > 1: + # TODO: Replace this with read_end-read_start; this will pad vectors and require + # regenerating test reference data + if len(valid_coordinates_list) > 0: + read_len_along_ref = max(valid_coordinates_list) + 1 + else: + read_len_along_ref = read_len + + # Populate mod vector array appropriately based on thresh settings + mod_vector = np.zeros(read_len_along_ref, dtype=np.uint8) + if thresh is None: + # We subtract 0.25 because in modkit they add 0.5, but our elements are zero when the + # base motif isn't present, so to get things to round to the right integers to match the + # original .bam file, subtracting 0.25 is good. Anything from 0.001 to 0.4999 would work I think + mod_vector[valid_coordinates_list] = np.rint( + np.array(mod_values_list) * 256 - 0.25 + ).astype(np.uint8) + else: + mod_vector[valid_coordinates_list] = np.array( + mod_values_list + ).astype(np.uint8) + # TODO: consolidate compression into a function shared across + mod_vector_compressed = np.frombuffer( + gzip.compress( + mod_vector.tobytes(), compresslevel=compress_level + ), + dtype=np.uint8, + ) + + # Populate valid vector array + valid_vector = np.zeros(read_len_along_ref, dtype=np.uint8) + valid_vector[valid_coordinates_list] = 1 + valid_vector_compressed = np.frombuffer( + gzip.compress( + valid_vector.tobytes(), compresslevel=compress_level + ), + dtype=np.uint8, + ) + + chunk_datasets_contents["read_name"].append(read_name) + chunk_datasets_contents["chromosome"].append(read_chrom) + chunk_datasets_contents["read_start"].append(read_start) + chunk_datasets_contents["read_end"].append(read_end) + chunk_datasets_contents["strand"].append(ref_strand) + chunk_datasets_contents["motif"].append(motif) + chunk_datasets_contents["mod_vector"].append( + mod_vector_compressed + ) + chunk_datasets_contents["val_vector"].append( + valid_vector_compressed + ) + + # Write chunk if enough reads have built up + reads_in_chunk += 1 + if reads_in_chunk >= chunk_size: + for dataset, entry in chunk_datasets_contents.items(): + start_index = ( + old_size + (read_counter // chunk_size) * chunk_size + ) + end_index = old_size + read_counter + 1 + h5[dataset][start_index:end_index] = entry + chunk_datasets_contents = defaultdict(list) + reads_in_chunk = 0 + read_counter += 1 + + ## Set up for next read + read_name = fields[0] + read_chrom = fields[3] + read_len = int(fields[9]) + ref_strand = fields[5] + # TODO: verify that read position is in the right (ref) coordinate system + if ref_strand == "+": + pos_in_read_ref = int(fields[1]) + elif ref_strand == "-": + pos_in_read_ref = read_len - int(fields[1]) - 1 + # Calculate read info + read_start = pos_in_genome - pos_in_read_ref + read_end = read_start + read_len + # Instantiate lists + mod_values_list = [] + valid_coordinates_list = [] + + # Regardless of whether its a new read or not, + # add modification to vector if motif type is correct + # for the motif in question + if ( + canonical_base == parsed_motif.modified_base + and mod_code in parsed_motif.mod_codes + ): + valid_coordinates_list.append(pos_in_genome - read_start) + if thresh is None: + mod_values_list.append(prob) + elif prob >= thresh: + mod_values_list.append(1) + else: + mod_values_list.append(0) + + # Save the last read + # TODO: try to consolidate + if len(read_name) > 0: + # Build the vectors + if len(valid_coordinates_list) > 0: + read_len_along_ref = max(valid_coordinates_list) + 1 + else: + read_len_along_ref = read_len + + # Populate mod vector array appropriately based on thresh settings + mod_vector = np.zeros(read_len_along_ref, dtype=np.uint8) + if thresh is None: + # We subtract 0.25 because in modkit they add 0.5, but our elements are zero when the + # base motif isn't present, so to get things to round to the right integers to match the + # original .bam file, subtracting 0.25 is good. Anything from 0.001 to 0.4999 would work I think + mod_vector[valid_coordinates_list] = np.rint( + np.array(mod_values_list) * 256 - 0.25 + ).astype(np.uint8) + else: + mod_vector[valid_coordinates_list] = np.array( + mod_values_list + ).astype(np.uint8) + # TODO: consolidate compression into a function shared across + mod_vector_compressed = np.frombuffer( + gzip.compress(mod_vector.tobytes(), compresslevel=compress_level), + dtype=np.uint8, + ) - # Required arguments - required_args = parser.add_argument_group("required arguments") - required_args.add_argument( - "-f", - "--fileName", - required=True, - help="name of bam file with Mm and Ml tags", - ) - required_args.add_argument( - "-s", - "--sampleName", - required=True, - help="name of sample for output SQL table name labelling", - ) - required_args.add_argument( - "-o", - "--outDir", - required=True, - help="directory where SQL database is stored", - ) + # Populate valid vector array + valid_vector = np.zeros(read_len_along_ref, dtype=np.uint8) + valid_vector[valid_coordinates_list] = 1 + valid_vector_compressed = np.frombuffer( + gzip.compress(valid_vector.tobytes(), compresslevel=compress_level), + dtype=np.uint8, + ) - # Required, mutually exclusive arguments - window_group = parser.add_mutually_exclusive_group(required=True) - window_group.add_argument( - "-b", - "--bedFile", - help="name of bed file that defines regions of interest over which to extract mod calls", - ) - window_group.add_argument( - "-r", - "--region", - help='single region over which to extract base mods, e.g. "chr1:1-100000"', - ) + chunk_datasets_contents["read_name"].append(read_name) + chunk_datasets_contents["chromosome"].append(read_chrom) + chunk_datasets_contents["read_start"].append(read_start) + chunk_datasets_contents["read_end"].append(read_end) + chunk_datasets_contents["strand"].append(ref_strand) + chunk_datasets_contents["motif"].append(motif) + chunk_datasets_contents["mod_vector"].append(mod_vector_compressed) + chunk_datasets_contents["val_vector"].append(valid_vector_compressed) + + for dataset, entry in chunk_datasets_contents.items(): + start_index = old_size + (read_counter // chunk_size) * chunk_size + end_index = old_size + read_counter + 1 + h5[dataset][start_index:end_index] = entry + read_counter += 1 + return + + +def prep_output_directory( + output_directory: Path | None, + output_name: str, + input_file: Path, + output_file_names: list[str], +) -> tuple[Path, list[Path]]: + """ + As a side effect, if files exist that match the requested outputs, they are deleted. - # Optional arguments - parser.add_argument( - "-m", - "--basemod", - type=str, - default=DEFAULT_BASEMOD, - choices=["A", "CG", "A+CG"], - help="which base modifications to extract", - ) - parser.add_argument( - "-A", - "--threshA", - type=int, - default=DEFAULT_THRESH_A, - help="threshold above which to call an A base methylated", - ) - parser.add_argument( - "-C", - "--threshC", - type=int, - default=DEFAULT_THRESH_C, - help="threshold above which to call a C base methylated", - ) - parser.add_argument( - "-e", - "--extractAllBases", - action="store_true", - help="store all base mod calls, regardless of methylation probability threshold", - ) - parser.add_argument( - "-p", - "--cores", - type=int, - help="number of cores over which to parallelize", - ) - parser.add_argument( - "-c", - "--center", - action="store_true", - help="report positions with respect to center of motif window; only valid with bed file input", - ) - parser.add_argument( - "-w", - "--windowSize", - type=int, - default=DEFAULT_WINDOW_SIZE, - help=f"window size around center point of feature of interest to plot (+/-); only mods within this window are stored (default: {DEFAULT_WINDOW_SIZE} bp)", - ) + TODO: Is it kind of silly that this takes in input_file? Maybe should take in some generic default parameter, or this default should be set outside this method? + + Args: + output_directory: Path pointing to an output directory. + If left as None, outputs will be stored in a new folder within the input + directory. + output_name: a string that will be used to create an output folder + containing the intermediate and final outputs, along with any logs. + input_file: Path to input file; used to define default output directory + output_file_names: list of names of desired output files + + Returns: + * Path to top-level output directory + * List of Paths to requested output files + """ + if output_directory is None: + output_directory = input_file.parent + print(f"No output directory provided, using input directory {output_directory}") + + output_path = output_directory / output_name + + output_files = [output_path / file_name for file_name in output_file_names] + + # Ensure output path exists, and that any of the specified output files do not already exist (necessary for some outputs) + # Delete the files that do already exist + output_path.mkdir(parents=True, exist_ok=True) + for output_file in output_files: + output_file.unlink(missing_ok=True) - args = parser.parse_args() - parse_bam(**vars(args)) + return output_path, output_files diff --git a/dimelo/plot_browser.py b/dimelo/plot_browser.py deleted file mode 100644 index 974e2dc3..00000000 --- a/dimelo/plot_browser.py +++ /dev/null @@ -1,847 +0,0 @@ -r""" -================= -plot_browser module -================= -.. currentmodule:: dimelo.plot_browser -.. autosummary:: - plot_browser - -plot_browser plots single molecules with colored base modifications in region of interest - - -Portions of code adapted from methplotlib: -Copyright (c) 2018 Wouter De Coster -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -""" - -# code adapted from methplotlib -# https://doi.org/10.1093/bioinformatics/btaa093 - -import argparse -import multiprocessing -import os -import sqlite3 -import sys - -import matplotlib.pyplot as plt -import pandas as pd -import plotly -import plotly.graph_objs as go -import pyranges as pr -import seaborn as sns - -from dimelo.parse_bam import parse_bam - -# import plotly.io as pio - -COLOR_A = "#053C5E" -COLOR_C = "#BB4430" -DEFAULT_THRESH_A = 129 -DEFAULT_THRESH_C = 129 -DEFAULT_SMOOTH = 1000 -DEFAULT_MIN_PERIODS = 100 -DEFAULT_DOTSIZE = 4 - - -class DataTraces(object): - def __init__(self, traces, names): - self.traces = traces - self.names = names - self.index = 0 - - def __iter__(self): - return self - - def __next__(self): - if self.index == len(self.traces): - raise StopIteration - else: - self.index += 1 - return self.traces[self.index - 1] - - -class Region(object): - def __init__(self, region, fasta=None): - if ":" in region: - try: - self.chromosome, interval = region.replace(",", "").split(":") - self.begin, self.end = [int(i) for i in interval.split("-")] - except ValueError: - sys.exit( - "\n\nERROR: Region (-w/--region) inproperly formatted, " - "examples of accepted formats are:\n" - "'chr5:150200605-150423790'\n\n" - ) - self.size = self.end - self.begin - self.string = f"{self.chromosome}_{self.begin}_{self.end}" - - -def plot_browser( - fileNames, - sampleNames, - region, - basemod, - outDir, - threshA=DEFAULT_THRESH_A, - threshC=DEFAULT_THRESH_C, - bedFileFeatures=None, - smooth=DEFAULT_SMOOTH, - min_periods=DEFAULT_MIN_PERIODS, - colorA=COLOR_A, - colorC=COLOR_C, - dotsize=DEFAULT_DOTSIZE, - static=False, - cores=None, -): - """ - fileNames - list of names of bam files with Mm and Ml tags; indexed; or single file name as string - sampleNames - list of names of samples for output plot name labelling; or single sample name as string; valid names contain [``a-zA-Z0-9_``]. - region - formatted as for example: "chr1:1-100000" - basemod - One of the following: - - * ``'A'`` - extract mA only - * ``'CG'`` - extract mCpG only - * ``'A+CG'`` - extract mA and mCpG - outDir - directory to output plot - threshA - threshold for calling mA; default 129 - threshC - threshold for calling mCG; default 129 - bedFileFeatures - bedFile specifying regions to display in browser (optional); default None - smooth - window over which to smooth aggregate curve; default of 1000 bp - min_periods - minimum number of bases to consider for smoothing: default of 100 bp - colorA - color in hex for mA; default #053C5E - colorC - color in hex for mCG; default #BB4430 - dotsize - size of points; default 4 - static - One of the following: - - * ``'True'`` - pdf output - * ``'False'`` - interactive html output; default is False - cores - number of cores over which to parallelize; default is all available - - **Example** - - >>> dm.plot_browser("dimelo/test/data/mod_mappings_subset.bam", "test", "chr1:2907273-2909473", "A+CG", "dimelo/dimelo_test", static=False) - >>> dm.plot_browser(["dimelo/test/data/mod_mappings_subset.bam", "dimelo/test/data/mod_mappings_subset.bam"], ["test1", "test2"], "chr1:2907273-2909473", "A+CG", "dimelo/dimelo_test", static=False) - - **Return** - - * PDF or HTML file with single molecules displayed over region of interest. Modified bases are colored according to colorA and colorC. - * PDFs of aggregate coverage and fraction of bases modified over region of interest. - * A summary bed file is also produced to support visualizing aggregate data with any genome browser tool. The columns of this bed file are chr, start, end, methylated_bases, total_bases. For example, to take a summary output bed and create a file with fraction of modified bases with a window size of 100 bp for visualization with the WashU browser, you could run the below commands in terminal: - - * ``bedtools makewindows -g ref_genome.chromsizes.txt -w 100 > ref_genome_windows.100.bp.bed`` - * ``bedtools map -a ref_genome_windows.100.bp.bed -b outDir/fileName_sampleName_chr_start_end_A.bed -c 4,5 -o sum,sum -null 0 | awk -v "OFS=\\t" '{if($5>0){print $1,$2,$3,$4/$5}else{print $1,$2,$3,$5}}' > outDir/fileName_sampleName_chr_start_end_A.100.bed`` - * ``bgzip outDir/fileName_sampleName_chr_start_end_A.100.bed`` - * ``tabix -f -p bed outDir/fileName_sampleName_chr_start_end_A.100.bed.gz`` - - **Example Plots** - - :ref:`sphx_glr_auto_examples_browser_example.py` - """ - - if not os.path.isdir(outDir): - os.makedirs(outDir) - - cores_avail = multiprocessing.cpu_count() - if cores is None: - num_cores = cores_avail - else: - # if more than available cores is specified, process with available cores - if cores > cores_avail: - num_cores = cores_avail - else: - num_cores = cores - - # if single bam file rather than list is entered, convert to list - if type(fileNames) != list: - fileNames = [fileNames] - # if single sample name rather than list is entered, convert to list - if type(sampleNames) != list: - sampleNames = [sampleNames] - - all_data = [] - aggregate_counts = [] - for f, n in zip(fileNames, sampleNames): - # extract all bases and both mods to get full extent of read in terms of any mod bases - parse_bam( - f, - n, - outDir, - basemod="A+CG", - region=region, # pass string representation - threshA=threshA, - threshC=threshC, - extractAllBases=True, - cores=num_cores, - ) - d = pd.read_sql( - "SELECT * from methylationByBase_" + n, - sqlite3.connect( - outDir + "/" + f.split("/")[-1].replace(".bam", "") + ".db" - ), - ) - all_data.append(d) - aggregate_counts.append( - pd.read_sql( - "SELECT * from methylationAggregate_" + n, - sqlite3.connect( - outDir + "/" + f.split("/")[-1].replace(".bam", "") + ".db" - ), - ) - ) - - # print number of reads for each sample - print( - "processing " - + str(len(d["read_name"].unique())) - + " reads for " - + n - + " for bam: " - + f - ) - - meth_browser( - all_data=all_data, - aggregate_counts=aggregate_counts, - basemod=basemod, - region=Region(region), - sampleNames=sampleNames, - outDir=outDir, - bed=bedFileFeatures, - smooth=smooth, - min_periods=min_periods, - dotsize=dotsize, - static=static, - threshA=threshA, - threshC=threshC, - colorA=colorA, - colorC=colorC, - ) - - # print output files to std out - if static is False: - ext = "html" - else: - ext = "pdf" - - db_paths = [] - f_paths = [] - t_paths = [] - b_paths = [] - - for f, s in zip(fileNames, sampleNames): - db = outDir + "/" + f.split("/")[-1].replace(".bam", "") + ".db" - db_paths.append(db) - f_base = f.split("/")[-1].replace(".bam", "") - if "A" in basemod: - f_path = ( - outDir + "/" + s + "_" + "A" + "_sm_rolling_avg_fraction.pdf" - ) - t_path = outDir + "/" + s + "_" + "A" + "_sm_rolling_avg_total.pdf" - b_path = f"{outDir}/{f_base}_{s}_{Region(region).string}_A.bed" - f_paths.append(f_path) - t_paths.append(t_path) - b_paths.append(b_path) - if "C" in basemod: - f_path = ( - outDir + "/" + s + "_" + "CG" + "_sm_rolling_avg_fraction.pdf" - ) - t_path = ( - outDir + "/" + s + "_" + "CG" + "_sm_rolling_avg_total.pdf" - ) - b_path = f"{outDir}/{f_base}_{s}_{Region(region).string}_CG.bed" - f_paths.append(f_path) - t_paths.append(t_path) - b_paths.append(b_path) - - w = Region(region) - - browser_path = f"{outDir}/methylation_browser_{w.string}.{ext}" - str_out = f"Outputs\n_______\nDB file: {db_paths}\nbrowser plot: {browser_path}\nrolling average fraction bases methylated plot: {f_paths}\nrolling average total bases plot: {t_paths}\nsummary bed file: {b_paths}" - print(str_out) - - -def create_subplots(num_methrows, names=None, annotation=True): - """ - Prepare the panels (rows * 1 column) for the subplots. - One row for each dataset, taking 90%/len(datasets) for heights - if annotation is True (bed) then add a row with height 10% - """ - return plotly.subplots.make_subplots( - rows=num_methrows + annotation, - cols=1, - shared_xaxes=True, - specs=[[{}] for i in range(num_methrows + annotation)], - print_grid=False, - subplot_titles=names, - vertical_spacing=0.1 if num_methrows < 10 else 0.01, - row_heights=[0.9 / num_methrows] * num_methrows + [0.1] * annotation, - ) - - -def create_output(fig, outfile, region, static, outDir): - """ - write output pdf or html - """ - if static: - outfile = outDir + "/" + f"methylation_browser_{region.string}.pdf" - fig.write_image(outfile, width=1000, height=400) - if not static: - outfile = outDir + "/" + f"methylation_browser_{region.string}.html" - with open(outfile, "w+") as output: - output.write( - plotly.offline.plot( - fig, - output_type="div", - show_link=False, - include_plotlyjs="cdn", - ) - ) - - -def methylation( - all_data, - sampleNames, - basemod, - colorA=COLOR_A, - colorC=COLOR_C, - dotsize=4, - threshA=DEFAULT_THRESH_A, - threshC=DEFAULT_THRESH_C, -): - """ - Plot methylation traces - """ - traces = [] - names = [] - for m, n in zip(all_data, sampleNames): - traces.append( - make_per_read_meth_traces_phred( - all_data=all_data, - table=m, - basemod=basemod, - colorA=colorA, - colorC=colorC, - dotsize=dotsize, - threshA=threshA, - threshC=threshC, - ) - ) - names.append(n) - return DataTraces(traces=traces, names=names) - - -def make_per_read_meth_traces_phred( - all_data, - table, - basemod, - colorA, - colorC, - max_cov=1000, - dotsize=4, - threshA=DEFAULT_THRESH_A, - threshC=DEFAULT_THRESH_C, -): - """Make traces for each read""" - minmax_table = find_min_and_max_pos_per_read(table) - df_heights = assign_y_height_per_read(minmax_table, max_coverage=max_cov) - table = pd.merge(table, df_heights, left_on="read_name", right_on="read") - traces = [] - hidden = 0 - for read in table["read_name"].unique(): - try: - traces.append( - make_per_read_line_trace( - read_range=minmax_table.loc[read], - y_pos=df_heights.loc[read, "height"], - ) - ) - except KeyError: - hidden += 1 - continue - if hidden: - sys.stderr.write( - f"Warning: hiding {hidden} reads because coverage above {max_cov}x.\n" - ) - read_table_mC = table[table["mod"].str.contains("C")] - read_table_mA = table[table["mod"].str.contains("A")] - cmapA = ["white", colorA] - cmapC = ["white", colorC] - if "C" in basemod: - traces.append( - make_per_position_phred_scatter( - all_data=all_data, - read_table=read_table_mC[read_table_mC["prob"] >= threshC], - mod="mC", - thresh=threshC, - dotsize=dotsize, - colorscale=cmapC, - offset=0.05, - ) - ) - if "A" in basemod: - traces.append( - make_per_position_phred_scatter( - all_data=all_data, - read_table=read_table_mA[read_table_mA["prob"] >= threshA], - mod="mA", - thresh=threshA, - dotsize=dotsize, - colorscale=cmapA, - offset=0.15, - ) - ) - return traces - - -def make_per_position_phred_scatter( - all_data, read_table, mod, thresh, dotsize=4, colorscale="Reds", offset=0 -): - """Make scatter plot per modified base per read""" - # get min and max probabilities across all for legend and color consistency for comparisons - if "C" in mod: - m = "C" - if "A" in mod: - m = "A" - min_overall = 255 - max_overall = 0 - for d in all_data: - min_temp = d[(d["mod"].str.contains(m)) & (d["prob"] >= thresh)][ - "prob" - ].min() - max_temp = d[(d["mod"].str.contains(m)) & (d["prob"] >= thresh)][ - "prob" - ].max() - if min_temp < min_overall: - min_overall = min_temp - if max_temp > max_overall: - max_overall = max_temp - return go.Scatter( - x=read_table["pos"], - y=read_table["height"], - mode="markers", - showlegend=False, - text=round(read_table["prob"] / 255, 2), - hoverinfo="text", - marker=dict( - size=dotsize, - color=read_table["prob"], - colorscale=colorscale, - colorbar=dict( - title=mod + " probability", - titleside="right", - tickmode="array", - tickvals=[min_overall, max_overall], - ticktext=[ - str(round(min_overall / 255, 2)), - str(round(max_overall / 255, 2)), - ], - ticks="outside", - thickness=15, - x=offset + 1, - ), - ), - ) - - -def find_min_and_max_pos_per_read(table): - """Return a table with for every read the minimum and maximum position""" - mm_table = ( - table.loc[:, ["read_name", "pos"]] - .groupby("read_name") - .min() - .join( - table.loc[:, ["read_name", "pos"]].groupby("read_name").max(), - lsuffix="min", - rsuffix="max", - ) - ) - return mm_table - - -def assign_y_height_per_read(df, max_coverage=1000): - """Assign height of the read in the per read traces - Gets a dataframe of read_name, posmin and posmax. - Sorting by position. - Determines optimal height (y coordinate) for this read - Returns a dictionary mapping read_name to y_coord - """ - dfs = df.sort_values(by=["posmin", "posmax"], ascending=[True, False]) - heights = [[] for i in range(max_coverage)] - y_pos = dict() - for read in dfs.itertuples(): - for y, layer in enumerate(heights, start=1): - if len(layer) == 0: - layer.append(read.posmax) - y_pos[read.Index] = y - break - if read.posmin > layer[-1]: - layer.append(read.posmax) - y_pos[read.Index] = y - break - return pd.DataFrame( - {"read": list(y_pos.keys()), "height": list(y_pos.values())} - ).set_index("read") - - -def make_per_read_line_trace(read_range, y_pos): - """ - Make a grey line trace for a single read - """ - return go.Scatter( - x=[read_range["posmin"], read_range["posmax"]], - y=[y_pos, y_pos], - mode="lines", - line=dict(width=1, color="lightgrey"), - showlegend=False, - ) - - -def meth_browser( - all_data, - aggregate_counts, - basemod, - region, - sampleNames, - outDir, - smooth, - min_periods, - bed=False, - outfile=None, - dotsize=4, - static=False, - threshA=DEFAULT_THRESH_A, - threshC=DEFAULT_THRESH_C, - colorA=COLOR_A, - colorC=COLOR_C, -): - """ - meth_data is a list of methylationByBase tables as dataframes - all_dict is a list of methylationAggregate tables as dataframes - annotation is optional and is a bed file - then show one line per sample and one for the annotation, with methrows = number of datasets - the trace to be used for annotation is thus always num_methrows + 1 - """ - meth_traces = methylation( - all_data, - sampleNames, - basemod, - colorA=colorA, - colorC=colorC, - dotsize=dotsize, - threshA=threshA, - threshC=threshC, - ) - - num_methrows = len(all_data) - annot_row = num_methrows + 1 - annot_axis = f"yaxis{annot_row}" - fig = create_subplots( - num_methrows, names=meth_traces.names, annotation=bool(bed) - ) - for y, sample_traces in enumerate(meth_traces, start=1): - for meth_trace in sample_traces: - fig.add_trace(trace=meth_trace, row=y, col=1) - fig["layout"][f"yaxis{y}"].update(title="Reads") - if bed: - for annot_trace in bed_annotation(bed, region): - fig.add_trace(trace=annot_trace, row=annot_row, col=1) - y_max = -2 - if bed: - fig["layout"][annot_axis].update( - range=[-2, y_max + 1], - showgrid=False, - zeroline=False, - showline=False, - ticks="", - showticklabels=False, - ) - fig["layout"]["xaxis"].update( - tickformat="g", - separatethousands=True, - range=[region.begin, region.end], - ) - fig["layout"].update( - barmode="overlay", - title=region.chromosome, - hovermode="closest", - plot_bgcolor="rgba(0,0,0,0)", - ) - if num_methrows > 10: - for i in fig["layout"]["annotations"]: - i["font"]["size"] = 10 - create_output(fig, outfile, region, static, outDir) - - i = 0 - for d in aggregate_counts: - plot_aggregate( - sampleNames[i], - d, - smooth, - min_periods, - region, - basemod, - outDir, - colorA, - colorC, - ) - i = i + 1 - - -def bed_annotation(bed, region): - return [ - go.Scatter( - x=[begin, end], - y=[-2, -2], - mode="lines", - line=dict(width=16, color="grey"), - text=name, - hoverinfo="text", - showlegend=False, - ) - for (begin, end, name) in parse_bed(bed, region) - ] - - -def parse_bed(bed, region): - gr = pr.read_bed(bed)[region.chromosome, region.begin : region.end] - df = gr.unstrand().df - df = df.drop(columns=["Chromosome", "Score", "Strand"], errors="ignore") - if "Name" not in df.columns: - df["Name"] = "noname" - df_short = df[df.columns[0:3]] - return df_short.itertuples(index=False, name=None) - - -def plot_aggregate( - sampleName, - aggregate_counts, - smooth, - min_periods, - region, - basemod, - outDir, - colorA, - colorC, -): - """ - plot rolling aggregate of frac methylated - plot rolling aggregate of total bases - """ - - aggregate_counts["frac"] = ( - aggregate_counts["methylated_bases"] / aggregate_counts["total_bases"] - ) - - # plot aggregate of fraction and of total count coverage - if "A" in basemod: - aggregate_A = aggregate_counts[ - aggregate_counts["mod"].str.contains("A") - ].copy() - # need to sort first! - aggregate_A.sort_values(["pos"], inplace=True) - aggregate_A_rolling = aggregate_A.rolling( - window=smooth, min_periods=min_periods, center=True, on="pos" - ).mean() - plot_aggregate_frac( - aggregate_A_rolling, sampleName, "A", colorA, outDir - ) - plot_aggregate_total( - aggregate_A_rolling, sampleName, "A", colorA, outDir - ) - if "C" in basemod: - aggregate_C = aggregate_counts[ - aggregate_counts["mod"].str.contains("C") - ].copy() - # need to sort first! - aggregate_C.sort_values(["pos"], inplace=True) - aggregate_C_rolling = aggregate_C.rolling( - window=smooth, min_periods=min_periods, center=True, on="pos" - ).mean() - plot_aggregate_frac( - aggregate_C_rolling, sampleName, "C", colorC, outDir - ) - plot_aggregate_total( - aggregate_C_rolling, sampleName, "C", colorC, outDir - ) - - -def plot_aggregate_frac(aggregate_rolling, sampleName, mod, color, outDir): - fig = plt.figure() - sns.lineplot( - x=aggregate_rolling["pos"], - y=aggregate_rolling["frac"], - color=color, - ) - if "A" in mod: - mod_name = "A" - if "C" in mod: - mod_name = "CG" - - plt.title(mod_name) - plt.ylabel("m" + mod_name + "/" + mod_name) - fig.savefig( - outDir - + "/" - + sampleName - + "_" - + mod_name - + "_sm_rolling_avg_fraction.pdf" - ) - plt.close() - - -def plot_aggregate_total(aggregate_rolling, sampleName, mod, color, outDir): - fig = plt.figure() - sns.lineplot( - x=aggregate_rolling["pos"], - y=aggregate_rolling["total_bases"], - color=color, - ) - if "A" in mod: - mod_name = "A" - if "C" in mod: - mod_name = "CG" - - plt.title(mod_name) - plt.ylabel("total " + mod_name) - fig.savefig( - outDir - + "/" - + sampleName - + "_" - + mod_name - + "_sm_rolling_avg_total.pdf" - ) - plt.close() - - -def main(): - parser = argparse.ArgumentParser(description="DiMeLo plot browser") - - # Required arguments - required_args = parser.add_argument_group("required arguments") - required_args.add_argument( - "-f", "--fileNames", required=True, nargs="+", help="bam file name(s)" - ) - required_args.add_argument( - "-s", - "--sampleNames", - required=True, - nargs="+", - help="sample name(s) for output file labelling", - ) - required_args.add_argument( - "-r", - "--region", - required=True, - type=str, - help='single region over which to extract base mods, e.g. "chr1:1-100000"', - ) - required_args.add_argument( - "-m", - "--basemod", - required=True, - type=str, - choices=["A", "CG", "A+CG"], - help="which base modification to extract", - ) - required_args.add_argument( - "-o", "--outDir", required=True, help="directory to output plot" - ) - - # Smoothing options - smoothing_args = parser.add_argument_group("smoothing options") - smoothing_args.add_argument( - "-t", - "--smooth", - type=int, - default=DEFAULT_SMOOTH, - help="window over which to smooth aggregate curve", - ) - smoothing_args.add_argument( - "-n", - "--min_periods", - type=int, - default=DEFAULT_MIN_PERIODS, - help="minimum number of bases to consider for smoothing", - ) - - # Plotting arguments - plotting_args = parser.add_argument_group("plotting options") - plotting_args.add_argument( - "--colorA", - type=str, - default=COLOR_A, - help='color in hex (e.g. "#BB4430") for mA', - ) - plotting_args.add_argument( - "--colorC", - type=str, - default=COLOR_C, - help='color in hex (e.g. "#BB4430") for mCG', - ) - plotting_args.add_argument( - "-d", - "--dotsize", - type=float, - default=DEFAULT_DOTSIZE, - help="size of points", - ) - - # Optional arguments - parser.add_argument( - "-A", - "--threshA", - type=int, - default=DEFAULT_THRESH_A, - help="threshold above which to call an A base methylated", - ) - parser.add_argument( - "-C", - "--threshC", - type=int, - default=DEFAULT_THRESH_C, - help="threshold above which to call a C base methylated", - ) - parser.add_argument( - "-b", - "--bedFileFeatures", - help="bed file specifying annotation to display in browser", - ) - parser.add_argument( - "--static", - action="store_true", - help="output as PDF instead of interactive HTML", - ) - parser.add_argument( - "-p", - "--cores", - type=int, - help="number of cores over which to parallelize", - ) - - args = parser.parse_args() - plot_browser(**vars(args)) diff --git a/dimelo/plot_depth_histogram.py b/dimelo/plot_depth_histogram.py new file mode 100644 index 00000000..95b1f099 --- /dev/null +++ b/dimelo/plot_depth_histogram.py @@ -0,0 +1,271 @@ +from pathlib import Path + +import numpy as np +from matplotlib.axes import Axes + +from . import load_processed, utils + + +def plot_depth_histogram( + mod_file_names: list[str | Path], + regions_list: list[str | Path | list[str | Path]], + motifs: list[str], + sample_names: list[str], + window_size: int | None = None, + single_strand: bool = False, + one_depth_per_region: bool = False, + quiet: bool = False, + cores: int | None = None, + split_large_regions: bool = False, + **kwargs, +) -> Axes: + """ + Plot depth histograms, overlaying the results on top of each other. + + Each input list is expected to be parallel and the same length. Each index represents one analysis condition across the lists. + Using the same file for multiple conditions requires adding the same file multiple times, in the appropriate indices. + + This is the most flexible method for depth histogram plotting. For most use cases, consider + using one of the plot_depth_histogram.by_* methods. + + Args: + mod_file_names: list of paths to modified base data files + bed_file_names: list of paths to bed files specifying centered equal-length regions + mod_names: list of modifications to extract; expected to match mods available in the relevant mod_files + sample_names: list of names to use for labeling traces in the output; legend entries + window_size: half-size of the desired window to plot; how far the window stretches on either side of the center point + single_strand: True means we only grab counts from reads from the same strand as + the region of interest, False means we always grab both strands within the regions + one_depth_per_region: if True, each region will only report a single depth value, averaging across all non-zero depths. If False + depths will be reported separately for all nonzero count positions in each region for a more granular view of depth distribution. + quiet: disables progress bars + cores: CPU cores across which to parallelize processing. Default to None, which means all available. + split_large_regions: if True, regions will be run sequentially in parallelized chunks. If False, + each individual region's chunks will be run sequentially but there will be parallelization across + regions, i.e. each core will be assigned one region at a time by the executor. Set to True if you + are running a small number of very large regions (e.g. one or two chromosomes), otherwise to to False (default). + kwargs: other keyword parameters passed through to utils.line_plot + + Returns: + Axes object containing the plot + """ + if not utils.check_len_equal(mod_file_names, regions_list, motifs, sample_names): + raise ValueError("Unequal number of inputs") + + depth_vectors = get_depth_counts( + mod_file_names=mod_file_names, + regions_list=regions_list, + motifs=motifs, + window_size=window_size, + single_strand=single_strand, + one_depth_per_region=one_depth_per_region, + quiet=quiet, + cores=cores, + ) + + axes = make_depth_histogram_plot( + depth_vectors=depth_vectors, + sample_names=sample_names, + one_depth_per_region=one_depth_per_region, + y_label="regions count" if one_depth_per_region else "positions count", + **kwargs, + ) + return axes + + +def by_modification( + mod_file_name: str | Path, + regions: str | Path, + motifs: list[str], + **kwargs, +) -> Axes: + """ + Plot depth histogram, holding modification file and regions constant, varying modification types + + See plot_depth_histogram for details. + """ + n_mods = len(motifs) + return plot_depth_histogram( + mod_file_names=[mod_file_name] * n_mods, + regions_list=[regions] * n_mods, + motifs=motifs, + sample_names=[f"{motif} depth" for motif in motifs], + **kwargs, + ) + + +def by_regions( + mod_file_name: str | Path, + regions_list: list[str | Path | list[str | Path]], + motif: str, + sample_names: list[str] | None = None, + **kwargs, +) -> Axes: + """ + Plot depth histogram, holding modification file and modification types constant, varying regions + + Note: Sample names default to the names of the bed files. + + See plot_depth_histogram for details. + """ + if sample_names is None: + sample_names = regions_list + n_beds = len(regions_list) + return plot_depth_histogram( + mod_file_names=[mod_file_name] * n_beds, + regions_list=regions_list, + motifs=[motif] * n_beds, + sample_names=[f"{sample_name} depth" for sample_name in sample_names], + **kwargs, + ) + + +def by_dataset( + mod_file_names: list[str | Path], + regions: str | Path | list[str | Path], + motif: str, + sample_names: list[str] | None = None, + **kwargs, +) -> Axes: + """ + Plot depth histogram, holding modification types and regions constant, varying modification files + + Note: Sample names default to the names of the modification files. + + See plot_depth_histogram for details. + """ + if sample_names is None: + sample_names = mod_file_names + n_mod_files = len(mod_file_names) + return plot_depth_histogram( + mod_file_names=mod_file_names, + regions_list=[regions] * n_mod_files, + motifs=[motif] * n_mod_files, + sample_names=[f"{sample_name} depth" for sample_name in sample_names], + **kwargs, + ) + + +def get_depth_counts( + mod_file_names: list[str | Path], + regions_list: list[str | Path | list[str | Path]], + motifs: list[str], + window_size: int | None, + single_strand: bool = False, + one_depth_per_region: bool = False, + quiet: bool = False, + cores: int | None = 1, +) -> list[np.ndarray]: + """ + Get the depth counts, ready for plotting. + + This helper function can be useful during plot prototyping, when repeatedly building plots from the same data. + Its outputs can be passed as the first argument to make_depth_histogram_plot(). + + Args: + mod_file_names: list of paths to modified base data files + bed_file_names: list of paths to bed files specifying centered equal-length regions + mod_names: list of modifications to extract; expected to match mods available in the relevant mod_files + window_size: half-size of the desired window to plot; how far the window stretches on either side of the center point + single_strand: True means we only grab counts from reads from the same strand as + the region of interest, False means we always grab both strands within the regions + one_depth_per_region: if True, each region will only report a single depth value, averaging across all non-zero depths. If False + depths will be reported separately for all nonzero count positions in each region for a more granular view of depth distribution. + regions_5to3prime: True means negative strand regions get flipped, False means no flipping + smooth_window: size of the moving window to use for smoothing. If set to None, no smoothing is performed + quiet: disables progress bars + cores: CPU cores across which to parallelize processing + + Returns: + List of depth vectors for histogram + """ + if not utils.check_len_equal(mod_file_names, regions_list, motifs): + raise ValueError("Unequal number of inputs") + # TODO: redefinition error; still need to figure out how to do this elegantly in a way mypy likes + # dimelo/plot_depth_histogram.py:53: error: Item "str" of "str | Path" has no attribute "suffix" [union-attr] + mod_file_names = [Path(fn) for fn in mod_file_names] + + depth_vectors = [] + for mod_file, regions, motif in zip(mod_file_names, regions_list, motifs): + match mod_file.suffix: + case ".gz": + pileup_vectors_list = load_processed.regions_to_list( + function_handle=load_processed.pileup_vectors_from_bedmethyl, + bedmethyl_file=mod_file, + regions=regions, + motif=motif, + window_size=window_size, + single_strand=single_strand, + quiet=quiet, + cores=cores, + ) + # places where read depth is zero are assumed to not have the motif present - this may not always be true, + # but with the available information in a pileup file it's the best we can do + read_depth_vectors_list = [ + valid_base_counts[valid_base_counts > 0] + for _, valid_base_counts in pileup_vectors_list + ] + if one_depth_per_region: + # each region's read depth vector gets collapsed to a single mean value + read_depths = np.array( + [ + np.mean(read_depth_vector) + for read_depth_vector in read_depth_vectors_list + ] + ) + else: + # each region's read depth vector gets added to one extending read depths list without aggregating + read_depths = np.concatenate(read_depth_vectors_list) + + case ".fake": + read_depths = load_processed.vector_from_fake( + mod_file=mod_file, + bed_file=regions, + motif=motif, + window_size=window_size, + ) + case _: + raise ValueError(f"Unsupported file type for {mod_file}") + depth_vectors.append(read_depths) + return depth_vectors + + +def make_depth_histogram_plot( + depth_vectors: list[np.ndarray], + sample_names: list[str], + y_label: str = "count", + one_depth_per_region: bool = False, + **kwargs, +) -> Axes: + """ + Plot the given depth histogram traces. + + This helper function can be useful during plot prototyping, when repeatedly building plots from the same data. + The first argument should be the output of get_depth_histograms(). + + Args: + depth_vectors: list of depth histogram counts + sample_names: list of names to use for labeling traces in the output; legend entries + one_depth_per_region: if True, each region will only report a single depth value, averaging across all non-zero depths. If False + depths will be reported separately for all nonzero count positions in each region for a more granular view of depth distribution. + kwargs: other keyword parameters passed through to utils.line_plot + + Returns: + Axes object containing the plot + """ + if not utils.check_len_equal(depth_vectors, sample_names): + raise ValueError("Unequal number of inputs") + x_label = ( + "per strand read\ndepth in region" + if one_depth_per_region + else "per strand read\ndepth per position" + ) + axes = utils.hist_plot( + value_vectors=depth_vectors, + value_names=sample_names, + x_label=x_label, + y_label=y_label, + integer_values=not one_depth_per_region, + **kwargs, + ) + return axes diff --git a/dimelo/plot_depth_profile.py b/dimelo/plot_depth_profile.py new file mode 100644 index 00000000..f13962fa --- /dev/null +++ b/dimelo/plot_depth_profile.py @@ -0,0 +1,243 @@ +from pathlib import Path + +import numpy as np +from matplotlib.axes import Axes + +from . import load_processed, utils + + +def plot_depth_profile( + mod_file_names: list[str | Path], + regions_list: list[str | Path | list[str | Path]], + motifs: list[str], + sample_names: list[str], + window_size: int | None = None, + single_strand: bool = False, + regions_5to3prime: bool = False, + smooth_window: int | None = None, + quiet: bool = False, + cores: int | None = None, + **kwargs, +) -> Axes: + """ + Plot depth profiles, overlaying the resulting traces on top of each other. + + Each input list is expected to be parallel and the same length. Each index represents one analysis condition across the lists. + Using the same file for multiple conditions requires adding the same file multiple times, in the appropriate indices. + + This is the most flexible method for depth profile plotting. For most use cases, consider + using one of the plot_depth_profile.by_* methods. + + Args: + mod_file_names: list of paths to modified base data files + bed_file_names: list of paths to bed files specifying centered equal-length regions + mod_names: list of modifications to extract; expected to match mods available in the relevant mod_files + sample_names: list of names to use for labeling traces in the output; legend entries + window_size: half-size of the desired window to plot; how far the window stretches on either side of the center point + single_strand: True means we only grab counts from reads from the same strand as + the region of interest, False means we always grab both strands within the regions + regions_5to3prime: True means negative strand regions get flipped, False means no flipping + smooth_window: size of the moving window to use for smoothing. If set to None, no smoothing is performed + quiet: disables progress bars + cores: CPU cores across which to parallelize processing. Default to None, which means all available. + kwargs: other keyword parameters passed through to utils.line_plot + + Returns: + Axes object containing the plot + """ + if not utils.check_len_equal(mod_file_names, regions_list, motifs, sample_names): + raise ValueError("Unequal number of inputs") + + trace_vectors = get_depth_profiles( + mod_file_names=mod_file_names, + regions_list=regions_list, + motifs=motifs, + window_size=window_size, + single_strand=single_strand, + regions_5to3prime=regions_5to3prime, + smooth_window=smooth_window, + quiet=quiet, + cores=cores, + ) + + axes = make_depth_profile_plot( + trace_vectors=trace_vectors, sample_names=sample_names, **kwargs + ) + return axes + + +def by_modification( + mod_file_name: str | Path, + regions: str | Path, + motifs: list[str], + **kwargs, +) -> Axes: + """ + Plot depth profile, holding modification file and regions constant, varying modification types + + See plot_depth_profile for details. + """ + n_mods = len(motifs) + return plot_depth_profile( + mod_file_names=[mod_file_name] * n_mods, + regions_list=[regions] * n_mods, + motifs=motifs, + sample_names=[f"{motif} depth" for motif in motifs], + **kwargs, + ) + + +def by_regions( + mod_file_name: str | Path, + regions_list: list[str | Path | list[str | Path]], + motif: str, + sample_names: list[str] | None = None, + **kwargs, +) -> Axes: + """ + Plot depth profile, holding modification file and modification types constant, varying regions + + Note: Sample names default to the names of the bed files. + + See plot_depth_profile for details. + """ + if sample_names is None: + sample_names = regions_list + n_beds = len(regions_list) + return plot_depth_profile( + mod_file_names=[mod_file_name] * n_beds, + regions_list=regions_list, + motifs=[motif] * n_beds, + sample_names=[f"{sample_name} depth" for sample_name in sample_names], + **kwargs, + ) + + +def by_dataset( + mod_file_names: list[str | Path], + regions: str | Path | list[str | Path], + motif: str, + sample_names: list[str] | None = None, + **kwargs, +) -> Axes: + """ + Plot depth profile, holding modification types and regions constant, varying modification files + + Note: Sample names default to the names of the modification files. + + See plot_depth_profile for details. + """ + if sample_names is None: + sample_names = mod_file_names + n_mod_files = len(mod_file_names) + return plot_depth_profile( + mod_file_names=mod_file_names, + regions_list=[regions] * n_mod_files, + motifs=[motif] * n_mod_files, + sample_names=[f"{sample_name} depth" for sample_name in sample_names], + **kwargs, + ) + + +def get_depth_profiles( + mod_file_names: list[str | Path], + regions_list: list[str | Path | list[str | Path]], + motifs: list[str], + window_size: int, + single_strand: bool = False, + regions_5to3prime: bool = False, + smooth_window: int | None = None, + quiet: bool = False, + cores: int | None = None, +) -> list[np.ndarray]: + """ + Get the depth profile traces, ready for plotting. + + This helper function can be useful during plot prototyping, when repeatedly building plots from the same data. + Its outputs can be passed as the first argument to make_depth_profile_plot(). + + Args: + mod_file_names: list of paths to modified base data files + bed_file_names: list of paths to bed files specifying centered equal-length regions + mod_names: list of modifications to extract; expected to match mods available in the relevant mod_files + window_size: half-size of the desired window to plot; how far the window stretches on either side of the center point + single_strand: True means we only grab counts from reads from the same strand as + the region of interest, False means we always grab both strands within the regions + regions_5to3prime: True means negative strand regions get flipped, False means no flipping + smooth_window: size of the moving window to use for smoothing. If set to None, no smoothing is performed + quiet: disables progress bars + cores: CPU cores across which to parallelize processing + + Returns: + List of depth profile traces + """ + if not utils.check_len_equal(mod_file_names, regions_list, motifs): + raise ValueError("Unequal number of inputs") + # TODO: redefinition error; still need to figure out how to do this elegantly in a way mypy likes + # dimelo/plot_depth_profile.py:53: error: Item "str" of "str | Path" has no attribute "suffix" [union-attr] + mod_file_names = [Path(fn) for fn in mod_file_names] + + trace_vectors = [] + for mod_file, regions, motif in zip(mod_file_names, regions_list, motifs): + match mod_file.suffix: + case ".gz": + _, valid_base_counts = load_processed.pileup_vectors_from_bedmethyl( + bedmethyl_file=mod_file, + regions=regions, + motif=motif, + window_size=window_size, + single_strand=single_strand, + regions_5to3prime=regions_5to3prime, + quiet=quiet, + cores=cores, + ) + trace = valid_base_counts.astype(float) + trace[trace == 0] = np.nan + case ".fake": + trace = load_processed.vector_from_fake( + mod_file=mod_file, + bed_file=regions, + motif=motif, + window_size=window_size, + ) + case _: + raise ValueError(f"Unsupported file type for {mod_file}") + if smooth_window is not None: + trace = utils.smooth_rolling_mean(trace, window=smooth_window) + trace_vectors.append(trace) + return trace_vectors + + +def make_depth_profile_plot( + trace_vectors: list[np.ndarray], + sample_names: list[str], + **kwargs, +) -> Axes: + """ + Plot the given depth profile traces. + + This helper function can be useful during plot prototyping, when repeatedly building plots from the same data. + The first argument should be the output of get_depth_profiles(). + + Args: + trace_vectors: list of depth profile traces + sample_names: list of names to use for labeling traces in the output; legend entries + kwargs: other keyword parameters passed through to utils.line_plot + + Returns: + Axes object containing the plot + """ + if not utils.check_len_equal(trace_vectors, sample_names): + raise ValueError("Unequal number of inputs") + axes = utils.line_plot( + indep_vector=np.arange( + -len(trace_vectors[0]) // 2, + len(trace_vectors[0]) // 2 + len(trace_vectors[0]) % 2, + ), + indep_name="pos", + dep_vectors=trace_vectors, + dep_names=sample_names, + y_label="per strand reads\nwith motif and mod info", + **kwargs, + ) + return axes diff --git a/dimelo/plot_enrichment.py b/dimelo/plot_enrichment.py index 163faab5..d747b913 100644 --- a/dimelo/plot_enrichment.py +++ b/dimelo/plot_enrichment.py @@ -1,320 +1,239 @@ -r""" -======================= -plot_enrichment module -======================= -.. currentmodule:: dimelo.plot_enrichment -.. autosummary:: - plot_enrichment +from pathlib import Path -plot_enrichment plots fraction of bases modified within regions of interest defined by bed file +from matplotlib.axes import Axes -""" - -import argparse -import multiprocessing -import os -import sqlite3 +from . import load_processed, utils -import matplotlib.pyplot as plt -import pandas as pd -import seaborn as sns -from dimelo.parse_bam import parse_bam +def plot_enrichment( + mod_file_names: list[str | Path], + regions_list: list[str | Path | list[str | Path]], + motifs: list[str], + sample_names: list[str], + window_size: int | None = None, + single_strand: bool = False, + quiet: bool = False, + cores: int | None = None, + **kwargs, +) -> Axes: + """ + Plot enrichment comparison barplots using the given list of pre-processed input files. + + Each input list is expected to be parallel and the same length. Each index represents one analysis condition across the lists. + Using the same file for multiple conditions requires adding the same file multiple times, in the appropriate indices. + + This is the most flexible method for enrichment plotting. For most use cases, consider + using one of the plot_enrichment.by_* methods. + + Args: + mod_file_names: list of paths to modified base pileup data files + bed_file_names: list of paths to bed files specifying regions to extract + mod_names: list of modifications to extract; expected to match mods available in the relevant mod_files + sample_names: list of names to use for labeling bars in the output; x-axis labels + window_size: (currently disabled) window around center of region, +-window_size//2 + single_strand: True means we only grab counts from reads from the same strand as + the region of interest, False means we always grab both strands within the regions + quiet: disables progress bars + cores: CPU cores across which to parallelize processing. Default to None, which means all available. + kwargs: other keyword parameters passed through to utils.bar_plot + + Returns: + Axes object containing the plot + """ + if not utils.check_len_equal(mod_file_names, regions_list, motifs, sample_names): + raise ValueError("Unequal number of inputs") + + mod_fractions = get_enrichments( + mod_file_names=mod_file_names, + regions_list=regions_list, + motifs=motifs, + window_size=window_size, + single_strand=single_strand, + quiet=quiet, + cores=cores, + ) -DEFAULT_THRESH_A = 129 -DEFAULT_THRESH_C = 129 -DEFAULT_COLOR_LIST = ["#2D1E2F", "#A9E5BB", "#610345", "#559CAD", "#5E747F"] + axes = make_enrichment_plot( + mod_fractions=mod_fractions, + sample_names=sample_names, + **kwargs, + ) + return axes -def plot_enrichment( - fileNames, - sampleNames, - bedFiles, - basemod, - outDir, - threshA=DEFAULT_THRESH_A, - threshC=DEFAULT_THRESH_C, - colors=DEFAULT_COLOR_LIST, - cores=None, -): +def by_modification( + mod_file_name: str | Path, + regions: str | Path | list[str | Path], + motifs: list[str], + **kwargs, +) -> Axes: """ - fileNames - name(s) of bam file with Mm and Ml tags - sampleNames - name(s) of sample for output file name labelling; valid names contain [``a-zA-Z0-9_``]. - bedFiles - specified windows for region(s) of interest - basemod - One of the following (only valid to look at one type of mod): - - * ``'A'`` - extract mA only - * ``'CG'`` - extract mCpG only - outDir - directory to output plot - threshA - threshold for calling mA; default 129 - threshC - threshold for calling mCG; default 129 - colors - color list in hex for overlay; default is ["#2D1E2F", "#A9E5BB", "#610345", "#559CAD", "#5E747F"] - cores - number of cores over which to parallelize; default is all available - - **Example** - - >>> dm.plot_enrichment(["dimelo/test/data/mod_mappings_subset.bam", "dimelo/test/data/mod_mappings_subset.bam"], ["test1", "test2"], "dimelo/test/data/test.bed", "CG", "dimelo/dimelo_test", threshC=129) - >>> dm.plot_enrichment("dimelo/test/data/mod_mappings_subset.bam", ["test1", "test2"], ["dimelo/test/data/test.bed", "dimelo/test/data/test.bed"], "CG", "dimelo/dimelo_test", threshC=129) - - **Return** - - Barplot with overall fraction of bases modified within regions of interest specified by bedFile(s) - - **Example Plots** - - * :ref:`sphx_glr_auto_examples_enrichment_multi_bam_example.py` - * :ref:`sphx_glr_auto_examples_enrichment_multi_bed_example.py` + Plot enrichment bar plots, holding modification file and regions constant, varying modification types + See plot_enrichment for details. """ - if not os.path.isdir(outDir): - os.makedirs(outDir) - - # default number of cores is max available - cores_avail = multiprocessing.cpu_count() - if cores is None: - num_cores = cores_avail - else: - # if more than available cores is specified, process with available cores - if cores > cores_avail: - num_cores = cores_avail - else: - num_cores = cores - - # A+CG is not valid; only valid to look at one type of mod - if (basemod != "A") and (basemod != "CG"): - raise RuntimeError("valid basemods are A or CG") - - # if single bam file rather than list is entered, convert to list - if type(fileNames) != list: - fileNames = [fileNames] - # if single sample name rather than list is entered, convert to list - if type(sampleNames) != list: - sampleNames = [sampleNames] - # if single bed file rather than list is entered, convert to list - if type(bedFiles) != list: - bedFiles = [bedFiles] - - # extract counts and create barplots - # get average across all bases for regions defined in the bed file - columns = ["fileName", "bedFile", "sampleName", "fractionMethylated"] - data = [] - if len(fileNames) > 1 or len(bedFiles) > 1: - if len(fileNames) > 1: - if len(bedFiles) > 1: - raise RuntimeError( - "only a single region file can be used when analyzing multiple bam files" - ) - for f, n in zip(fileNames, sampleNames): - values = get_counts( - f, - n, - bedFiles[0], - basemod, - outDir, - threshA, - threshC, - num_cores, - ) - zipped = zip(columns, values) - a_dictionary = dict(zipped) - data.append(a_dictionary) - if len(bedFiles) > 1: - if len(fileNames) > 1: - raise RuntimeError( - "only a single bam file can be used when analyzing multiple bed file regions" - ) - for b, n in zip(bedFiles, sampleNames): - values = get_counts( - fileNames[0], - n, - b, - basemod, - outDir, - threshA, - threshC, - num_cores, - ) - zipped = zip(columns, values) - a_dictionary = dict(zipped) - data.append(a_dictionary) - - # allow for barplot for single file and region - if (len(fileNames) == 1) and (len(bedFiles) == 1): - values = get_counts( - fileNames[0], - sampleNames[0], - bedFiles[0], - basemod, - outDir, - threshA, - threshC, - num_cores, - ) - zipped = zip(columns, values) - a_dictionary = dict(zipped) - data.append(a_dictionary) - - df = pd.DataFrame(data) - # draw from aggregate to calculate modified/total in region of interest - if len(fileNames) == 1: - title = "sample_" + fileNames[0].split("/")[-1].replace(".bam", "") - if len(bedFiles) == 1: - title = "region_" + bedFiles[0].split("/")[-1].replace(".bed", "") - if (len(fileNames) == 1) and (len(bedFiles) == 1): - title = ( - "sample_" - + fileNames[0].split("/")[-1].replace(".bam", "") - + "_region_" - + bedFiles[0].split("/")[-1].replace(".bed", "") - ) - plot_barchart(df, basemod, outDir, colors, title) - - db_paths = [] - for f in fileNames: - db = outDir + "/" + f.split("/")[-1].replace(".bam", "") + ".db" - db_paths.append(db) - - plot_path = f"{outDir}/{title}_{basemod}_enrichment_barplot.pdf" - str_out = f"Outputs\n_______\nDB file: {db_paths}\nenrichment barplot: {plot_path}" - print(str_out) - - -def get_counts( - fileName, - sampleName, - bedFile, - basemod, - outDir, - threshA, - threshC, - num_cores, -): - # parse_bam for files / regions - parse_bam( - fileName, - sampleName, - outDir, - bedFile, - basemod, - threshA=threshA, - threshC=threshC, - cores=num_cores, + n_mods = len(motifs) + return plot_enrichment( + mod_file_names=[mod_file_name] * n_mods, + regions_list=[regions] * n_mods, + motifs=motifs, + sample_names=motifs, + **kwargs, ) - # get aggregate counts - aggregate_counts = pd.read_sql( - "SELECT * from methylationAggregate_" + sampleName, - sqlite3.connect( - outDir + "/" + fileName.split("/")[-1].replace(".bam", "") + ".db" - ), - ) - methylated_bases = aggregate_counts["methylated_bases"].sum() - total_bases = aggregate_counts["total_bases"].sum() - if total_bases == 0: - fractionMethylated = 0 - else: - fractionMethylated = methylated_bases / total_bases - return [fileName, bedFile, sampleName, fractionMethylated] +""" +TODO: Re-assignment issue: +dimelo/plot_enrichment.py:115: error: Incompatible types in assignment (expression has type "list[str | Path | list[str | Path]]", variable has type "list[str] | None") [assignment] +dimelo/plot_enrichment.py:121: error: Argument "sample_names" to "plot_enrichment" has incompatible type "list[str] | None"; expected "list[str]" [arg-type] +dimelo/plot_enrichment.py:141: error: Incompatible types in assignment (expression has type "list[str | Path]", variable has type "list[str] | None") [assignment] +dimelo/plot_enrichment.py:147: error: Argument "sample_names" to "plot_enrichment" has incompatible type "list[str] | None"; expected "list[str]" [arg-type] +""" -def plot_barchart(data, basemod, outDir, colors, title): +def by_regions( + mod_file_name: str | Path, + regions_list: list[str | Path | list[str | Path]], + motif: str, + sample_names: list[str] | None = None, + **kwargs, +) -> Axes: """ - x-axis: sample or region - y-axis: fraction methylated bases + Plot enrichment bar plots, holding modification file and modification types constant, varying regions + + Note: Sample names default to the names of the bed files. + + See plot_enrichment for details. """ - fig, ax1 = plt.subplots() - plt.bar("sampleName", "fractionMethylated", data=data, color=colors) - print("\nData for barplot") - print("________________\n") - print(f"{data.sampleName}") - print(f"{data.fractionMethylated}") - print("\n") - sns.despine(fig) - plt.ylabel("fraction methylated bases") - plt.xlabel("") - plt.savefig( - outDir + "/" + title + "_" + basemod + "_enrichment_barplot.pdf", + if sample_names is None: + sample_names = regions_list + n_beds = len(regions_list) + return plot_enrichment( + mod_file_names=[mod_file_name] * n_beds, + regions_list=regions_list, + motifs=[motif] * n_beds, + sample_names=sample_names, + **kwargs, ) - plt.close() -def main(): - parser = argparse.ArgumentParser( - description="Plot DiMeLo methylation enrichment" - ) +def by_dataset( + mod_file_names: list[str | Path], + regions: str | Path | list[str | Path], + motif: str, + sample_names: list[str] | None = None, + **kwargs, +) -> Axes: + """ + Plot enrichment bar plots, holding modification types and regions constant, varying modification files - # Required arguments - required_args = parser.add_argument_group("required arguments") - required_args.add_argument( - "-f", "--fileNames", required=True, nargs="+", help="bam file name(s)" - ) - required_args.add_argument( - "-s", - "--sampleNames", - required=True, - nargs="+", - help="sample name(s) for output file labelling", - ) - required_args.add_argument( - "-b", - "--bedFiles", - required=True, - nargs="+", - help="name of bed file(s) defining region(s) of interest", - ) - required_args.add_argument( - "-m", - "--basemod", - required=True, - type=str, - choices=["A", "CG"], - help="which base modification to extract", - ) - required_args.add_argument( - "-o", "--outDir", required=True, help="directory to output plot" - ) + Note: Sample names default to the names of the modification files. - # Plotting arguments - plotting_args = parser.add_argument_group("plotting options") - plotting_args.add_argument( - "--colors", - type=str, - nargs="+", - default=DEFAULT_COLOR_LIST, - help='color list in hex (e.g. "#BB4430") for overlay plots', + See plot_enrichment for details. + """ + if sample_names is None: + sample_names = mod_file_names + n_mod_files = len(mod_file_names) + return plot_enrichment( + mod_file_names=mod_file_names, + regions_list=[regions] * n_mod_files, + motifs=[motif] * n_mod_files, + sample_names=sample_names, + **kwargs, ) - # Optional arguments - parser.add_argument( - "-A", - "--threshA", - type=int, - default=DEFAULT_THRESH_A, - help="threshold above which to call an A base methylated", - ) - parser.add_argument( - "-C", - "--threshC", - type=int, - default=DEFAULT_THRESH_C, - help="threshold above which to call a C base methylated", - ) - parser.add_argument( - "-p", - "--cores", - type=int, - help="number of cores over which to parallelize", + +def get_enrichments( + mod_file_names: list[str | Path], + regions_list: list[str | Path | list[str | Path]], + motifs: list[str], + window_size: int | None = None, + single_strand: bool = False, + quiet: bool = False, + cores: int | None = None, +) -> list[float]: + """ + Get the enrichment values, ready for plotting. + + This helper function can be useful during plot prototyping, when repeatedly building plots from the same data. + Its outputs can be passed as the first argument to make_enrichment_plot(). + + TODO: I feel like this should be able to take in data directly as vectors/other datatypes, not just read from files. + TODO: Style-wise, is it cleaner to have it be a match statement or calling a method from a global dict? Cleaner here with a dict, cleaner overall with the match statements? + + Args: + mod_file_names: list of paths to modified base pileup data files + regions_list: list of paths to bed files specifying regions to extract + motifs: list of modifications to extract; expected to match mods available in the relevant mod_files + window_size: (currently disabled) window around center of region, +-window_size//2 + single_strand: True means we only grab counts from reads from the same strand as + the region of interest, False means we always grab both strands within the regions + quiet: disables progress bars + cores: CPU cores across which to parallelize processing + + Returns: + List of modified fraction values. + """ + if not utils.check_len_equal(mod_file_names, regions_list, motifs): + raise ValueError("Unequal number of inputs") + # TODO: redefinition error; still need to figure out how to do this elegantly in a way mypy likes + # dimelo/plot_enrichment.py:45: error: Item "str" of "str | Path" has no attribute "suffix" [union-attr] + mod_file_names = [Path(fn) for fn in mod_file_names] + + mod_fractions = [] + for mod_file, regions, motif in zip(mod_file_names, regions_list, motifs): + match mod_file.suffix: + case ".gz": + n_mod, n_total = load_processed.pileup_counts_from_bedmethyl( + bedmethyl_file=mod_file, + regions=regions, + motif=motif, + window_size=window_size, + single_strand=single_strand, + quiet=quiet, + cores=cores, + ) + case ".fake": + n_mod, n_total = load_processed.counts_from_fake( + mod_file=mod_file, regions=regions, motif=motif + ) + case _: + raise ValueError(f"Unsupported file type for {mod_file}") + try: + mod_fractions.append(n_mod / n_total) + except ZeroDivisionError: + mod_fractions.append(0) + + return mod_fractions + + +def make_enrichment_plot( + mod_fractions: list[float], + sample_names: list[str], + **kwargs, +) -> Axes: + """ + Plot the given enrichment values. + + This helper function can be useful during plot prototyping, when repeatedly building plots from the same data. + The first argument should be the output of get_enrichments(). + + Args: + mod_fractions: list of modified fraction values. + sample_names: list of names to use for labeling bars in the output; x-axis labels + kwargs: other keyword parameters passed through to utils.bar_plot + + Returns: + Axes object containing the plot + """ + if not utils.check_len_equal(mod_fractions, sample_names): + raise ValueError("Unequal number of inputs") + + axes = utils.bar_plot( + categories=sample_names, + values=mod_fractions, + y_label="fraction modified bases", + **kwargs, ) - args = parser.parse_args() - plot_enrichment(**vars(args)) + return axes diff --git a/dimelo/plot_enrichment_profile.py b/dimelo/plot_enrichment_profile.py index 00fae97f..97ec461c 100644 --- a/dimelo/plot_enrichment_profile.py +++ b/dimelo/plot_enrichment_profile.py @@ -1,625 +1,273 @@ -r""" -================================== -plot_enrichment_profile module -================================== -.. currentmodule:: dimelo.plot_enrichment_profile -.. autosummary:: - plot_enrichment_profile +from pathlib import Path -plot_enrichment_profile plots single molecules centered at regions of interest defined in bed file and produces aggregate profile - -""" - -import argparse -import multiprocessing -import os -import sqlite3 -from itertools import cycle - -import matplotlib.pyplot as plt import numpy as np -import pandas as pd -import seaborn as sns -from matplotlib import colors -from mpl_toolkits.axes_grid1 import make_axes_locatable +from matplotlib.axes import Axes -from dimelo.parse_bam import parse_bam - -DEFAULT_THRESH_A = 129 -DEFAULT_THRESH_C = 129 -DEFAULT_WINDOW_SIZE = 1000 -COLOR_A = "#053C5E" -COLOR_C = "#BB4430" -COLOR_LIST = ["#2D1E2F", "#A9E5BB", "#610345", "#559CAD", "#5E747F"] -DEFAULT_DOTSIZE = 0.5 -DEFAULT_SMOOTH = 50 -DEFAULT_MIN_PERIODS = 10 +from . import load_processed, utils def plot_enrichment_profile( - fileNames, - sampleNames, - bedFiles, - basemod, - outDir, - threshA=DEFAULT_THRESH_A, - threshC=DEFAULT_THRESH_C, - windowSize=DEFAULT_WINDOW_SIZE, - colorA=COLOR_A, - colorC=COLOR_C, - colors=COLOR_LIST, - dotsize=DEFAULT_DOTSIZE, - smooth=DEFAULT_SMOOTH, - min_periods=DEFAULT_MIN_PERIODS, - cores=None, -): + mod_file_names: list[str | Path], + regions_list: list[str | Path | list[str | Path]], + motifs: list[str], + sample_names: list[str], + window_size: int, + single_strand: bool = False, + regions_5to3prime: bool = False, + smooth_window: int | None = None, + quiet: bool = False, + cores: int | None = None, + **kwargs, +) -> Axes: """ - fileNames - name(s) of bam file with Mm and Ml tags - sampleNames - name(s) of sample for output file name labelling; valid names contain [``a-zA-Z0-9_``]. - bedFiles - specified windows for region(s) of interest; optional 4th column in bed file to specify strand of region of interest as ``+`` or ``-``. Default is to consider regions as all ``+``. Reads will be oriented with respect to strand. Only reads overlapping regions defined in bed file will be extracted, regardless of windowSize. Plots are centered at the center of the bed file regions. - basemod - One of the following: - - * ``'A'`` - extract mA only - * ``'CG'`` - extract mCpG only - * ``'A+CG'`` - extract mA and mCpG - outDir - directory to output plot - threshA - threshold for calling mA; default 129 - threshC - threshold for calling mCG; default 129 - windowSize - window size around center point of feature of interest to plot (+/-); default 1000 bp - colorA - color in hex for mA; default #053C5E - colorC - color in hex for mCG; default #BB4430 - colors - color list in hex for overlay plots; default is ["#2D1E2F", "#A9E5BB", "#610345", "#559CAD", "#5E747F"] - dotsize - size of points; default is 0.5 - smooth - window over which to smooth aggregate curve; default of 50 bp - min_periods - minimum number of bases to consider for smoothing: default of 10 bp - cores - number of cores over which to parallelize; default is all available - - **Example** - - For single file and region: - - >>> dm.plot_enrichment_profile("dimelo/test/data/mod_mappings_subset.bam", "test", "dimelo/test/data/test.bed", "A+CG", "dimelo/dimelo_test", windowSize=500, dotsize=1) - - To overlay multiple regions of interest (can conversely also overlay multiple samples over a single region if a list of files is provided): - - >>> dm.plot_enrichment_profile("dimelo/test/data/mod_mappings_subset.bam", ["test1","test2"], ["dimelo/test/data/test.bed","dimelo/test/data/test.bed"], "A", "dimelo/dimelo_test", windowSize=500, dotsize=1) - - **Return** - - * Aggregate profile of fraction of bases modified centered at features of interest - * Single molecules centered at features of interest - * Base abundance centered at features of interest - - **Example Plots** - - * :ref:`sphx_glr_auto_examples_enrichment_profile_single_example.py` - * :ref:`sphx_glr_auto_examples_enrichment_profile_ma_mc_example.py` - * :ref:`sphx_glr_auto_examples_enrichment_profile_overlay_example.py` - + Plot enrichment profiles, overlaying the resulting traces on top of each other. + + Each input list is expected to be parallel and the same length. Each index represents one analysis condition across the lists. + Using the same file for multiple conditions requires adding the same file multiple times, in the appropriate indices. + + This is the most flexible method for enrichment profile plotting. For most use cases, consider + using one of the plot_enrichment_profile.by_* methods. + + TODO: I think it's reasonable for smoothing min_periods to be always set to 1 for this method, as it's a visualization tool, not quantitative. Is this unreasonable? + TODO: Should the more restrictive meta versions allow *args, or only **kwargs? + No, we want to be able to pass kwargs down to the line plotter, I think. Especially if we swap it out for one that takes more different standard args. + TODO: It's mildly confusing that there are required args that are only seen as *args or **kwargs in the more restrictive meta versions... But this is so much cleaner... + + Args: + mod_file_names: list of paths to modified base data files + bed_file_names: list of paths to bed files specifying centered equal-length regions + mod_names: list of modifications to extract; expected to match mods available in the relevant mod_files + sample_names: list of names to use for labeling traces in the output; legend entries + window_size: half-size of the desired window to plot; how far the window stretches on either side of the center point + single_strand: True means we only grab counts from reads from the same strand as + the region of interest, False means we always grab both strands within the regions + regions_5to3prime: True means negative strand regions get flipped, False means no flipping + smooth_window: size of the moving window to use for smoothing. If set to None, no smoothing is performed + quiet: disables progress bars + cores: CPU cores across which to parallelize processing. Default to None, which means all available. + kwargs: other keyword parameters passed through to utils.line_plot + + Returns: + Axes object containing the plot """ + if not utils.check_len_equal(mod_file_names, regions_list, motifs, sample_names): + raise ValueError("Unequal number of inputs") - if not os.path.isdir(outDir): - os.makedirs(outDir) - - # default number of cores is max available - cores_avail = multiprocessing.cpu_count() - if cores is None: - num_cores = cores_avail - else: - # if more than available cores is specified, process with available cores - if cores > cores_avail: - num_cores = cores_avail - else: - num_cores = cores - - # if single bam file rather than list is entered, convert to list - if type(fileNames) != list: - fileNames = [fileNames] - # if single sample name rather than list is entered, convert to list - if type(sampleNames) != list: - sampleNames = [sampleNames] - # if single bed file rather than list is entered, convert to list - if type(bedFiles) != list: - bedFiles = [bedFiles] - - db_paths = [] - for f in fileNames: - db = outDir + "/" + f.split("/")[-1].replace(".bam", "") + ".db" - db_paths.append(db) - - # overlay condition - if len(fileNames) > 1 or len(bedFiles) > 1: - if basemod == "A+CG": - raise RuntimeError( - "enrichment overlays can only be produced for a single base modification at a time" - ) - fig = plt.figure() - if len(fileNames) > 1: - if len(bedFiles) > 1: - raise RuntimeError( - "only a single region file can be used when overlaying multiple bam files" - ) - for f, n, c in zip(fileNames, sampleNames, cycle(colors)): - execute_overlay( - f, - n, - c, - bedFiles[0], - basemod, - outDir, - threshA, - threshC, - windowSize, - dotsize, - smooth, - min_periods, - num_cores, - ) - if len(bedFiles) > 1: - if len(fileNames) > 1: - raise RuntimeError( - "only a single bam file can be used when overlaying multiple bed file regions" - ) - for b, n, c in zip(bedFiles, sampleNames, cycle(colors)): - execute_overlay( - fileNames[0], - n, - c, - b, - basemod, - outDir, - threshA, - threshC, - windowSize, - dotsize, - smooth, - min_periods, - num_cores, - ) - if len(fileNames) == 1: - title = "sample_" + fileNames[0].split("/")[-1].replace(".bam", "") - if len(bedFiles) == 1: - title = "region_" + bedFiles[0].split("/")[-1].replace(".bed", "") - plt.title(basemod) - plt.legend(sampleNames) - fig.savefig( - outDir - + "/" - + title - + "_" - + basemod - + "_sm_rolling_avg_overlay.pdf" - ) - plt.close() - - overlay_path = f"{outDir}/{title}_{basemod}_sm_rolling_avg_overlay.pdf" - str_out = f"Outputs\n_______\nDB file: {db_paths}\noverlay plot: {overlay_path}" - print(str_out) - - # no overlay condition - if (len(fileNames) == 1) and (len(bedFiles) == 1): - execute_single_plot( - fileNames[0], - sampleNames[0], - bedFiles[0], - basemod, - outDir, - threshA, - threshC, - windowSize, - colorA, - colorC, - dotsize, - smooth, - min_periods, - num_cores, - ) - - t_paths = [] - if "A" in basemod: - t_path = ( - outDir + "/" + sampleNames[0] + "_" + "A" + "_base_count.png" - ) - t_paths.append(t_path) - if "C" in basemod: - t_path = ( - outDir + "/" + sampleNames[0] + "_" + "CG" + "_base_count.png" - ) - t_paths.append(t_path) - - enrichment_path = ( - f"{outDir}/{sampleNames[0]}_{basemod}_sm_rolling_avg.pdf" - ) - sm_path = f"{outDir}/{sampleNames[0]}_{basemod}_sm_scatter.png" - str_out = f"Outputs\n_______\nDB file: {db_paths}\nenrichment plot: {enrichment_path}\nsingle molecule plot: {sm_path}\nbase count plots: {t_paths}" - print(str_out) - - -def execute_overlay( - fileName, - sampleName, - color, - bedFile, - basemod, - outDir, - threshA, - threshC, - windowSize, - dotsize, - smooth, - min_periods, - num_cores, -): - parse_bam( - fileName, - sampleName, - outDir, - bedFile, - basemod, - center=True, - windowSize=windowSize, - threshA=threshA, - threshC=threshC, - cores=num_cores, - ) - aggregate_counts = pd.read_sql( - "SELECT * from methylationAggregate_" + sampleName, - sqlite3.connect( - outDir + "/" + fileName.split("/")[-1].replace(".bam", "") + ".db" - ), - ) - aggregate_counts["frac"] = ( - aggregate_counts["methylated_bases"] / aggregate_counts["total_bases"] - ) - if "A" in basemod: - plot_aggregate_helper( - aggregate_counts, "A", smooth, min_periods, color - ) - - if "C" in basemod: - plot_aggregate_helper( - aggregate_counts, "C", smooth, min_periods, color - ) - - -def execute_single_plot( - fileName, - sampleName, - bedFile, - basemod, - outDir, - threshA, - threshC, - windowSize, - colorA, - colorC, - dotsize, - smooth, - min_periods, - num_cores, -): - - parse_bam( - fileName, - sampleName, - outDir, - bedFile, - basemod, - center=True, - windowSize=windowSize, - threshA=threshA, - threshC=threshC, - cores=num_cores, + trace_vectors = get_enrichment_profiles( + mod_file_names=mod_file_names, + regions_list=regions_list, + motifs=motifs, + window_size=window_size, + single_strand=single_strand, + regions_5to3prime=regions_5to3prime, + smooth_window=smooth_window, + quiet=quiet, + cores=cores, ) - all_data = pd.read_sql( - "SELECT * from methylationByBase_" + sampleName, - sqlite3.connect( - outDir + "/" + fileName.split("/")[-1].replace(".bam", "") + ".db" - ), - ) - aggregate_counts = pd.read_sql( - "SELECT * from methylationAggregate_" + sampleName, - sqlite3.connect( - outDir + "/" + fileName.split("/")[-1].replace(".bam", "") + ".db" - ), - ) - - print( - "processing " - + str(len(all_data["read_name"].unique())) - + " reads with methylation above threshold for " - + sampleName - + " for bam: " - + fileName + axes = make_enrichment_profile_plot( + trace_vectors=trace_vectors, sample_names=sample_names, **kwargs ) + return axes - fig, ax = plt.subplots() - colors = {"A+Y": colorA, "A+a": colorA, "C+Z": colorC, "C+m": colorC} +def by_modification( + mod_file_name: str | Path, + regions: str | Path, + motifs: list[str], + **kwargs, +) -> Axes: + """ + Plot enrichment profile, holding modification file and regions constant, varying modification types - sns.scatterplot( - data=all_data, - x="pos", - y="read_name", - hue="mod", - palette=colors, - s=dotsize, - marker="s", - linewidth=0, - legend=None, + See plot_enrichment_profile for details. + """ + n_mods = len(motifs) + return plot_enrichment_profile( + mod_file_names=[mod_file_name] * n_mods, + regions_list=[regions] * n_mods, + motifs=motifs, + sample_names=motifs, + **kwargs, ) - ax.spines[["top", "right", "left"]].set_visible(False) - - plt.yticks([]) - plt.ylabel("") - plt.xlabel("") - plt.xlim(-windowSize, windowSize) - fig.savefig( - outDir + "/" + sampleName + "_" + basemod + "_sm_scatter.png", dpi=600 - ) - plt.close() - - plot_aggregate_me_frac( - sampleName, - aggregate_counts, - smooth, - min_periods, - windowSize, - basemod, - outDir, - colorA, - colorC, - ) +""" +TODO: Re-assignment issue: +dimelo/plot_enrichment_profile.py:142: error: Incompatible types in assignment (expression has type "list[str | Path | list[str | Path]]", variable has type "list[str] | None") [assignment] +dimelo/plot_enrichment_profile.py:148: error: Argument "sample_names" to "plot_enrichment_profile" has incompatible type "list[str] | None"; expected "list[str]" [arg-type] +dimelo/plot_enrichment_profile.py:168: error: Incompatible types in assignment (expression has type "list[str | Path]", variable has type "list[str] | None") [assignment] +dimelo/plot_enrichment_profile.py:174: error: Argument "sample_names" to "plot_enrichment_profile" has incompatible type "list[str] | None"; expected "list[str]" [arg-type] -# average profile -def plot_aggregate_me_frac( - sampleName, - aggregate_counts, - smooth, - min_periods, - windowSize, - basemod, - outDir, - colorA, - colorC, -): - aggregate_counts["frac"] = ( - aggregate_counts["methylated_bases"] / aggregate_counts["total_bases"] - ) +If sample names is None we assign it non-None values, so it's not clear what the problem is to me. We could make an intermediate dummy variable I guess? If that is the complaint? +""" - fig = plt.figure() - labels = [] - if "A" in basemod: - plot_aggregate_helper( - aggregate_counts, "A", smooth, min_periods, colorA - ) - labels.append("A") - if "C" in basemod: - plot_aggregate_helper( - aggregate_counts, "C", smooth, min_periods, colorC - ) - labels.append("CG") - plt.title(basemod) - plt.legend(labels) - fig.savefig( - outDir + "/" + sampleName + "_" + basemod + "_sm_rolling_avg.pdf" - ) - plt.close() - - if "A" in basemod: - aggregate_A = aggregate_counts[ - aggregate_counts["mod"].str.contains("A") - ].copy() - # need to sort first! - aggregate_A.sort_values(["pos"], inplace=True) - plot_base_abundance( - sampleName, - aggregate_A, - "A", - windowSize, - outDir, - ) - if "C" in basemod: - aggregate_C = aggregate_counts[ - aggregate_counts["mod"].str.contains("C") - ].copy() - # need to sort first! - aggregate_C.sort_values(["pos"], inplace=True) - plot_base_abundance( - sampleName, - aggregate_C, - "CG", - windowSize, - outDir, - ) - - -# helper function to create smoothed lineplot -def plot_aggregate_helper(aggregate_counts, mod, smooth, min_periods, color): - aggregate = aggregate_counts[ - aggregate_counts["mod"].str.contains(mod) - ].copy() - # need to sort first! - aggregate.sort_values(["pos"], inplace=True) - aggregate_rolling = aggregate.rolling( - window=smooth, min_periods=min_periods, center=True, on="pos" - ).mean() - sns.lineplot( - x=aggregate_rolling["pos"], y=aggregate_rolling["frac"], color=color - ) +def by_regions( + mod_file_name: str | Path, + regions_list: list[str | Path | list[str | Path]], + motif: str, + sample_names: list[str] | None = None, + **kwargs, +) -> Axes: + """ + Plot enrichment profile, holding modification file and modification types constant, varying regions -def plot_base_abundance( - sampleName, aggregate_counts, basemod, windowSize, outDir -): - cmapPurple = colors.LinearSegmentedColormap.from_list( - "custom purple", ["white", "#2D1E2F"], N=200 - ) - aggregate_counts = ( - aggregate_counts.set_index("pos") - .reindex( - pd.Index( - np.arange( - aggregate_counts["pos"].min(), - aggregate_counts["pos"].max(), - 1, - ), - name="pos", - ) - ) - .reset_index() - ) - aggregate_counts = aggregate_counts.fillna(0) - fig = plt.figure() - x = aggregate_counts["pos"].to_numpy() - y = aggregate_counts["total_bases"].to_numpy() # base_count - fig, (ax, ax2) = plt.subplots(nrows=2, sharex=True) - extent = [x[0] - (x[1] - x[0]) / 2.0, x[-1] + (x[1] - x[0]) / 2.0, 0, 1] - im = ax.imshow( - y[np.newaxis, :], cmap=cmapPurple, aspect="auto", extent=extent - ) - divider = make_axes_locatable(ax) - cax = divider.append_axes("top", size="5%", pad=0.25) - fig.colorbar(im, cax=cax, orientation="horizontal") - ax.set_yticks([]) - ax.set_xlim(extent[0], extent[1]) - ax2.plot(x, y, "o", ms=0.5, color="#2D1E2F") - ax2.set_xlim(extent[0], extent[1]) - plt.tight_layout() - fig.savefig( - outDir + "/" + sampleName + "_" + basemod + "_base_count.png", dpi=600 - ) - plt.close() + Note: Sample names default to the names of the bed files. + See plot_enrichment_profile for details. + """ + if sample_names is None: + sample_names = regions_list + n_beds = len(regions_list) + return plot_enrichment_profile( + mod_file_names=[mod_file_name] * n_beds, + regions_list=regions_list, + motifs=[motif] * n_beds, + sample_names=sample_names, + **kwargs, + ) + + +def by_dataset( + mod_file_names: list[str | Path], + regions: str | Path | list[str | Path], + motif: str, + sample_names: list[str] | None = None, + **kwargs, +) -> Axes: + """ + Plot enrichment profile, holding modification types and regions constant, varying modification files -def main(): - parser = argparse.ArgumentParser( - description="Plot DiMeLo enrichment profile" - ) + Note: Sample names default to the names of the modification files. - # Required arguments - required_args = parser.add_argument_group("required arguments") - required_args.add_argument( - "-f", "--fileNames", required=True, nargs="+", help="bam file name(s)" - ) - required_args.add_argument( - "-s", - "--sampleNames", - required=True, - nargs="+", - help="sample name(s) for output file labelling", - ) - required_args.add_argument( - "-b", - "--bedFiles", - required=True, - nargs="+", - help="name of bed file(s) defining region(s) of interest", - ) - required_args.add_argument( - "-m", - "--basemod", - required=True, - type=str, - choices=["A", "CG", "A+CG"], - help="which base modification to extract", - ) - required_args.add_argument( - "-o", "--outDir", required=True, help="directory to output plot" - ) + See plot_enrichment_profile for details. + """ + if sample_names is None: + sample_names = mod_file_names + n_mod_files = len(mod_file_names) + return plot_enrichment_profile( + mod_file_names=mod_file_names, + regions_list=[regions] * n_mod_files, + motifs=[motif] * n_mod_files, + sample_names=sample_names, + **kwargs, + ) + + +def get_enrichment_profiles( + mod_file_names: list[str | Path], + regions_list: list[str | Path | list[str | Path]], + motifs: list[str], + window_size: int, + single_strand: bool = False, + regions_5to3prime: bool = False, + smooth_window: int | None = None, + quiet: bool = False, + cores: int | None = None, +) -> list[np.ndarray]: + """ + Get the enrichment profile traces, ready for plotting. + + This helper function can be useful during plot prototyping, when repeatedly building plots from the same data. + Its outputs can be passed as the first argument to make_enrichment_profile_plot(). + + TODO: I feel like this should be able to take in data directly as vectors/other datatypes, not just read from files. + TODO: Style-wise, is it cleaner to have it be a match statement or calling a method from a global dict? Cleaner here with a dict, cleaner overall with the match statements? + TODO: I think it's reasonable for smoothing min_periods to be always set to 1 for this method, as it's a visualization tool, not quantitative. Is this unreasonable? + + Args: + mod_file_names: list of paths to modified base data files + bed_file_names: list of paths to bed files specifying centered equal-length regions + mod_names: list of modifications to extract; expected to match mods available in the relevant mod_files + window_size: half-size of the desired window to plot; how far the window stretches on either side of the center point + single_strand: True means we only grab counts from reads from the same strand as + the region of interest, False means we always grab both strands within the regions + regions_5to3prime: True means negative strand regions get flipped, False means no flipping + quiet: disables progress bars + cores: CPU cores across which to parallelize processing + smooth_window: size of the moving window to use for smoothing. If set to None, no smoothing is performed + + Returns: + List of enrichment profile traces + """ + if not utils.check_len_equal(mod_file_names, regions_list, motifs): + raise ValueError("Unequal number of inputs") + # TODO: redefinition error; still need to figure out how to do this elegantly in a way mypy likes + # dimelo/plot_enrichment_profile.py:53: error: Item "str" of "str | Path" has no attribute "suffix" [union-attr] + mod_file_names = [Path(fn) for fn in mod_file_names] + + trace_vectors = [] + for mod_file, regions, motif in zip(mod_file_names, regions_list, motifs): + match mod_file.suffix: + case ".gz": + modified_base_counts, valid_base_counts = ( + load_processed.pileup_vectors_from_bedmethyl( + bedmethyl_file=mod_file, + regions=regions, + motif=motif, + window_size=window_size, + single_strand=single_strand, + regions_5to3prime=regions_5to3prime, + quiet=quiet, + cores=cores, + ) + ) + # Default to nan so we can skip over unfilled values when plotting or doing a rolling average + nans_everywhere = np.full_like( + modified_base_counts, np.nan, dtype=float + ) + trace = np.divide( + modified_base_counts, + valid_base_counts, + out=nans_everywhere, + where=valid_base_counts != 0, + ) + case ".fake": + trace = load_processed.vector_from_fake( + mod_file=mod_file, + bed_file=regions, + motif=motif, + window_size=window_size, + ) + case _: + raise ValueError(f"Unsupported file type for {mod_file}") + if smooth_window is not None: + trace = utils.smooth_rolling_mean(trace, window=smooth_window) + trace_vectors.append(trace) + return trace_vectors + + +def make_enrichment_profile_plot( + trace_vectors: list[np.ndarray], + sample_names: list[str], + **kwargs, +) -> Axes: + """ + Plot the given enrichment profile traces. - # Smoothing options - smoothing_args = parser.add_argument_group("smoothing options") - smoothing_args.add_argument( - "-t", - "--smooth", - type=int, - default=DEFAULT_SMOOTH, - help="window over which to smooth aggregate curve", - ) - smoothing_args.add_argument( - "-n", - "--min_periods", - type=int, - default=DEFAULT_MIN_PERIODS, - help="minimum number of bases to consider for smoothing", - ) + This helper function can be useful during plot prototyping, when repeatedly building plots from the same data. + The first argument should be the output of get_enrichment_profiles(). - # Plotting arguments - plotting_args = parser.add_argument_group("plotting options") - plotting_args.add_argument( - "--colorA", - type=str, - default=COLOR_A, - help='color in hex (e.g. "#BB4430") for mA', - ) - plotting_args.add_argument( - "--colorC", - type=str, - default=COLOR_C, - help='color in hex (e.g. "#BB4430") for mCG', - ) - plotting_args.add_argument( - "--colors", - type=str, - nargs="+", - default=COLOR_LIST, - help='color list in hex (e.g. "#BB4430") for overlay plots', - ) - plotting_args.add_argument( - "-d", - "--dotsize", - type=float, - default=DEFAULT_DOTSIZE, - help="size of points", - ) + Args: + trace_vectors: list of enrichment profile traces + sample_names: list of names to use for labeling traces in the output; legend entries + kwargs: other keyword parameters passed through to utils.line_plot - # Optional arguments - parser.add_argument( - "-A", - "--threshA", - type=int, - default=DEFAULT_THRESH_A, - help="threshold above which to call an A base methylated", - ) - parser.add_argument( - "-C", - "--threshC", - type=int, - default=DEFAULT_THRESH_C, - help="threshold above which to call a C base methylated", - ) - parser.add_argument( - "-w", - "--windowSize", - type=int, - default=DEFAULT_WINDOW_SIZE, - help="window size around center point of feature of interest to plot (+/-)", - ) - parser.add_argument( - "-p", - "--cores", - type=int, - help="number of cores over which to parallelize", + Returns: + Axes object containing the plot + """ + if not utils.check_len_equal(trace_vectors, sample_names): + raise ValueError("Unequal number of inputs") + axes = utils.line_plot( + indep_vector=np.arange( + -len(trace_vectors[0]) // 2, + len(trace_vectors[0]) // 2 + len(trace_vectors[0]) % 2, + ), + indep_name="pos", + dep_vectors=trace_vectors, + dep_names=sample_names, + y_label="fraction modified bases", + **kwargs, ) - - args = parser.parse_args() - plot_enrichment_profile(**vars(args)) + return axes diff --git a/dimelo/plot_read_browser.py b/dimelo/plot_read_browser.py new file mode 100644 index 00000000..4ead8395 --- /dev/null +++ b/dimelo/plot_read_browser.py @@ -0,0 +1,447 @@ +from pathlib import Path + +import numpy as np +import pandas as pd +import plotly + +from . import load_processed, utils + + +def plot_read_browser( + mod_file_name: str | Path, + region: str, + motifs: list[str], + thresh: int | float | None = None, + single_strand: bool = False, + sort_by: str | list[str] = "shuffle", + hover: bool = True, + subset_parameters: dict | None = None, + **kwargs, +) -> plotly.graph_objs.Figure: + """ + Plot base modifications on single reads in a high-quality, interactive-enabled fashion. + + This method returns a plotly Figure object, which can be used in a number of ways to view and save + the figure in different formats. To view the figure interactively (in a notebook or python script), + simply call the show() method of the returned Figure object. See the helper methods below for saving + figures. + + Additional keyword arguments will be passed down to collapse_rows() if sort_by == "collapse". See that + method for details. + + Args: + mod_file_name: path to file containing modification data for single reads + region: region string specifying the region to plot + motifs: list of modifications to extract; expected to match mods available in the relevant mod_files + thresh: A modification calling threshold. While the browser always displays float probabilities, setting + this to a value will limit display to only modification events over the given threshold. Else, display + all modifications regardless of probability. + single_strand: True means we only grab counts from reads from the same strand as + the region of interest, False means we always grab both strands within the regions + sort_by: ordered list for hierarchical sort; see load_processed.read_vectors_from_hdf5() for details. + Can also pass the argument "collapse" to allow multiple reads on single rows of the browser, for a + more condensed visualization. Note that "collapse" is mutually exclusive with all other sorting options, + and is only allowed to be passed as a single string option. + hover: if False, disables display of information on mouse hover + subset_parameters: Parameters to pass to the utils.random_sample() method, to subset the + reads to be returned. If not None, at least one of n or frac must be provided. + + Returns: + plotly Figure object containing the plot + + TODO: Improve color specification? User should be able to set their own colors. + TODO: Should this let the user set arbitrary thresholds for each motif individually? + TODO: The way that "collapse" is specified is unintuitive and problematic; what if the user passes "collapse" as + an element in an array? + TODO: Is it worth having an option for meta-sorting of collapsed reads? It's here for now to enable testing. + """ + # If asked to collapse reads, set up the initial read sorting appropriately and prep for later + collapse = False + if sort_by == "collapse": + collapse = True + sort_by = "read_start" + + read_tuples, entry_labels, _ = load_processed.read_vectors_from_hdf5( + file=mod_file_name, + regions=region, + motifs=motifs, + single_strand=single_strand, + sort_by=sort_by, + calculate_mod_fractions=False, + subset_parameters=subset_parameters, + ) + + mod_vector_index = entry_labels.index("mod_vector") + + if read_tuples[0][mod_vector_index].dtype == np.bool_: + raise ValueError( + "A threshold has been applied to this .h5 single read data. plot_read_browser must be used with an .h5 file extracted using thresh=None." + ) + + read_extent_df, mod_event_df = format_browser_data( + read_tuples=read_tuples, entry_labels=entry_labels + ) + + # Apply threshold to mod_event_df + if thresh is not None: + mod_event_df = mod_event_df[mod_event_df.prob > utils.adjust_threshold(thresh)] + else: + # Still need to filter out all values that are effectively 0, or the read bars cannot be seen + # TODO: This seems like the wrong place to be handling this. + mod_event_df = mod_event_df[mod_event_df.prob > utils.adjust_threshold(2)] + + try: + chrom, (region_start, region_end, _) = utils.parse_region_string( + region=region, window_size=None + ) + except ValueError as err: + raise ValueError( + "Invalid region specification: plot_read_browser requires a single genomic locus." + ) from err + + fig = make_browser_figure( + read_extent_df=read_extent_df, + mod_event_df=mod_event_df, + collapse=collapse, + chrom=chrom, + region_start=region_start, + region_end=region_end, + hover=hover, + **kwargs, + ) + + return fig + + +def format_browser_data( + read_tuples: list[tuple], + entry_labels: list[str], +) -> tuple[pd.DataFrame, pd.DataFrame]: + """ + Take data from load_processed.read_vectors_from_hdf5() and format it for browser plotting. + + Argument descriptions taken directly from documentation of load_processed.read_vectors_from_hdf5(). + + Args: + read_tuples: a list of tuples, each tuple containing all datasets corresponding to an individual read that + was within the specified regions. + entry_labels: a list of strings, naming the datasets returned. + + Returns: + * dataframe defining the start, end, name, and desired y-index (sorting) of each read + * dataframe defining all necessary information to place each modification event on the browser + + TODO: There is an observed issue where there are duplicated reads; duplicates are currently thrown away. This only + manifests itself when subsetting reads, as different random subsets of the same requested size will show up as + different numbers of rows. + """ + # Coerce read tuples to initial dataframe, throwing away unnecessary columns + to_exclude = ["chromosome", "strand", "region_start", "region_end"] + read_df = pd.DataFrame.from_records( + read_tuples, columns=entry_labels, exclude=to_exclude + ) + + # For each row, pull out just the positions of valid bases and the probabilities at those positions + # TODO: I don't like using iterrows, but it seems silly to have two calls to apply that do basically the same thing redundantly; just looping once instead + prob_vectors = [] + pos_vectors = [] + for _, row in read_df.iterrows(): + selector = row.val_vector == 1 + all_positions = np.arange(len(row.mod_vector)) + row.read_start + prob_vectors.append(row.mod_vector[selector]) + pos_vectors.append(all_positions[selector]) + read_df["prob_vector"] = prob_vectors + read_df["pos_vector"] = pos_vectors + + # assign reads y-axis values based on their unique names, preserving the pre-set order + # TODO: I'm pretty sure that however I do this, there will possibly be an "overdrawing" problem if the same read shows up multiple times. Do I care? Will it be taken care of by dropping duplicates? + read_df["y_index"] = read_df.read_name.map( + {k: v for v, k in enumerate(read_df.read_name.unique())} + ) + + # TODO: Dropping duplicates should hide the "overdrawing" problem when reads are duplicated in the dataset. Is this a problem or the intended behavior? + # Get two separate dataframes: + # * represents the read extents, to draw the grey lines + + # Added the read_name subsetting to avoid an index mapping error in make_browser_figure + # caused by the read metadata for the same read with different motifs having slight + # start and end offsets in some cases, when using Dorado or PacBio data. These 1-5bp + # differences are caused by the assumptions made in parse_bam.extract h5 conversion + # and don't matter for much but do cause the full duplicate check to leave duplicates, + # which then cause non-unique indices for mapping in collapse mode + read_extent_df = read_df[ + ["read_start", "read_end", "y_index", "read_name"] + ].drop_duplicates(subset=["read_name"]) + # * represents the methylation events + mod_event_df = ( + read_df[["y_index", "read_name", "motif", "pos_vector", "prob_vector"]] + .explode(["pos_vector", "prob_vector"]) + .rename(columns={"pos_vector": "pos", "prob_vector": "prob"}) + ) + + return read_extent_df, mod_event_df + + +def collapse_rows( + read_extent_df: pd.DataFrame, + minimum_gap: int = 500, + meta_sort: str | None = "full_extent", +) -> pd.Series: + """ + Takes a sorted dataframe of read extents and collapses reads onto a smaller number of rows. + + The input dataframe is expected to be sorted in a sensible fashion and pre-indexed with a set of + unique index values. This method has been tailored for and verified using read_start pre-sorting. + Behavior using other starting sorts may be undefined. + + Optionally, performs a "meta-sort" of the resulting rows. Current options work as follows: + * full_extent: sort by full extent of the covered reads in the row (max end - min start); + rows covering a larger region at the bottom + * covered_bases: sort by number of bases covered by reads in the row; + rows covering more bases at the bottom + * None: no meta-sorting + + Returns a series that maps the original indices on to the final collapsed and meta-sorted indices. + This series can be applied to the original data by using the pd.Series.map() method. + + Args: + read_extent_df: read extent dataframe from format_browser_data() + minimum_gap: minimum number of bases allowed between the end of one read and the beginning of + the next for the two reads to be placed on the same row + meta_sort: type of meta sorting to do; one of ["full_extent", "covered_bases", None] + + Returns: + Series mapping original indices to meta indices + + TODO: This could be improved by checking for overlaps on both ends of the seed read for each row. + This might allow other types of pre-sorting to work more effectively. + """ + # Sentinel value for un-indexed reads is -1 + collapsed_indices = -np.ones(len(read_extent_df), dtype=int) + + # Collapse reads + curr_y_idx = 0 + for seed_read_idx in range(len(read_extent_df)): + # If seed read has been indexed already, move on + if collapsed_indices[seed_read_idx] != -1: + continue + collapsed_indices[seed_read_idx] = curr_y_idx + + # Add any other non-indexed reads that fit onto the current row + curr_row_end = read_extent_df.iloc[seed_read_idx]["read_end"] + for other_read_idx in range(seed_read_idx + 1, len(read_extent_df)): + # If other read has been indexed already, move on + if collapsed_indices[other_read_idx] != -1: + continue + # If other read fits onto the current row, index it + if ( + read_extent_df.iloc[other_read_idx]["read_start"] + > curr_row_end + minimum_gap + ): + collapsed_indices[other_read_idx] = curr_y_idx + curr_row_end = read_extent_df.iloc[other_read_idx]["read_end"] + + curr_y_idx += 1 + + # Series mapping original indices to collapsed indices + idx_map_orig2collapse = pd.Series( + collapsed_indices, index=read_extent_df["y_index"] + ) + + if meta_sort is not None: + # Perform meta-sorting + match meta_sort: + case "full_extent": + # sort by full extent of the covered reads in the row (max end - min start) + idx_map_meta2collapse = ( + read_extent_df.groupby(collapsed_indices) + .apply( + lambda row_group: row_group.read_end.max() + - row_group.read_start.min() + ) + .sort_values(ascending=False) + .reset_index()["index"] + ) + case "covered_bases": + # sort by number of bases covered by reads in the row + read_lengths = read_extent_df["read_end"] - read_extent_df["read_start"] + idx_map_meta2collapse = ( + read_lengths.groupby(collapsed_indices) + .sum() + .sort_values(ascending=False) + .reset_index()["index"] + ) + case _: + raise ValueError(f"Invalid meta sorting option: {meta_sort}") + + # Series mapping collapsed indices to meta indices + idx_map_collapse2meta = pd.Series( + idx_map_meta2collapse.index.values, index=idx_map_meta2collapse + ) + + # Return Series mapping original indices to meta indices + return idx_map_orig2collapse.map(idx_map_collapse2meta) + else: + # Return Series mapping original indices to collapsed indices + return idx_map_orig2collapse + + +def make_browser_figure( + read_extent_df: pd.DataFrame, + mod_event_df: pd.DataFrame, + collapse: bool, + chrom: str, + region_start: int, + region_end: int, + hover: bool = True, + **kwargs, +) -> plotly.graph_objs.Figure: + """ + Make a browser figure, using the provided pre-processed data + + Additional keyword arguments will be passed down to collapse_rows() if collapse == True. See that + method for details. + + Args: + read_extent_df: read extent dataframe from format_browser_data() + mod_event_df: mod event dataframe from format_browser_data() + collapse: if True, allows multiple reads on single rows of the browser for a more condensed + visualization. + chrom: chromosome of the region being browsed + region_start: start position of the region being browsed + region_end: end position of the region being browsed + hover: if False, disables display of information on mouse hover + + TODO: Think about how this interfaces with different types of initial sorting... + TODO: Make it so that this method does NOT modify the input dataframe + TODO: Should this method do the collapsing, or should this method require collapsing outside? + """ + if collapse: + index_map = collapse_rows(read_extent_df, **kwargs) + read_extent_df["y_index"] = read_extent_df["y_index"].map(index_map) + mod_event_df["y_index"] = mod_event_df["y_index"].map(index_map) + + # Build final figure + # TODO: Enable setting some relevant parameters + + # TODO: Understand all of the options here; are they all as desired? + layout = plotly.graph_objs.Layout( + barmode="overlay", + title=chrom, + hovermode="closest", + plot_bgcolor="rgba(0,0,0,0)", + xaxis=dict(range=[region_start, region_end]), + ) + # TODO: I feel like there has to be a cleaner way to do this, maybe using plotly express, but I dont know and I'm just trying to get this done first. Lots of iterrows. Sad. + fig = plotly.graph_objects.Figure(layout=layout) + for _, row in read_extent_df.iterrows(): + # TODO: How can I get the hover information for the reads to match the ones for the mod events? Not sure how to get customdata and hovertemplate working here. + fig.add_trace( + plotly.graph_objects.Scatter( + x=[row.read_start, row.read_end], + y=[row.y_index, row.y_index], + mode="lines", + line=dict(width=1, color="lightgrey"), + showlegend=False, + hoverinfo="text", + hovertext=row.read_name, + ) + ) + for motif_idx, (motif, motif_df) in enumerate(mod_event_df.groupby("motif")): + min_overall = motif_df["prob"].min() + max_overall = motif_df["prob"].max() + fig.add_trace( + plotly.graph_objs.Scatter( + x=motif_df["pos"], + y=motif_df["y_index"], + mode="markers", + showlegend=False, + customdata=motif_df[["read_name", "prob"]], + hovertemplate="
".join( + [ + "Read: %{customdata[0]}", + "Position: %{x:,}", + "Probability: %{customdata[1]:.2f}", + ] + ), + marker=dict( + size=4, + color=motif_df["prob"], + colorscale=utils.DEFAULT_COLORSCALES[motif], + colorbar=dict( + title=dict( + text=f"{motif} probability", + side="right", + ), + tickmode="array", + tickvals=[min_overall, max_overall], + ticktext=[ + str(round(min_overall, 2)), + str(round(max_overall, 2)), + ], + ticks="outside", + thickness=15, + # TODO: Is this positioning system dumb? + x=1 + (motif_idx * 0.10), + ), + ), + ) + ) + if not hover: + fig.update_layout(hovermode=False) + return fig + + +def save_static( + fig: plotly.graph_objs.Figure, + output_dir: str | Path, + output_basename: str, + format: str | list[str] = "pdf", + width: int = 1000, + height: int = 400, +) -> None: + """ + Helper function for saving static plot browser images. + + Args: + fig: plotly figure to save + output_dir: directory in which to save images + output_basename: descriptive basename of output file (before file extension) + format: one or more valid output formats for plotly; for valid options, see + https://plotly.github.io/plotly.py-docs/generated/plotly.io.write_image.html + width: width of output image in pixels + height: height of output image in pixels + """ + # sanitize and prep inputs + output_dir = Path(output_dir) + output_dir.mkdir(exist_ok=True) + + if isinstance(format, str): + format = [format] + + # write figures + for fmt in format: + fig.write_image( + output_dir / f"{output_basename}.{fmt}", width=width, height=height + ) + + +def save_interactive( + fig: plotly.graph_objs.Figure, + output_dir: str | Path, + output_basename: str, +) -> None: + """ + Helper function for saving interactive plot browsers. + + Args: + fig: plotly figure to save + output_dir: directory in which to save images + output_basename: descriptive basename of output file (before file extension) + """ + # sanitize inputs + output_dir = Path(output_dir) + output_dir.mkdir(exist_ok=True) + + # write figure + fig.write_html(output_dir / f"{output_basename}.html", include_plotlyjs="cdn") diff --git a/dimelo/plot_reads.py b/dimelo/plot_reads.py new file mode 100644 index 00000000..c6a80f20 --- /dev/null +++ b/dimelo/plot_reads.py @@ -0,0 +1,136 @@ +""" +I'm conflicted about how to handle some of this. + +There are two different ways of doing single read plotting: "rectangular" and "whole read". +"rectangular" means displaying exactly the requested region. +"whole read" means displaying the entirety of any read overlapping the requested region. +Probably need separate methods for all of this? Is there shared functionality? Do they live in the same file? Etc. + +I'm beginning to lose the thread of where we check for regions making sense. +Maybe this is an argument for an internal region class that makes checking easy? I don't know. +""" + +from pathlib import Path + +import pandas as pd +import seaborn as sns +from matplotlib.axes import Axes + +from . import load_processed, utils + + +def plot_reads( + mod_file_name: str | Path, + regions: str | Path | list[str | Path], + motifs: list[str], + window_size: int | None = None, + single_strand: bool = False, + regions_5to3prime: bool = False, + sort_by: str | list[str] = "shuffle", + thresh: float | None = None, + relative: bool = True, + **kwargs, +) -> Axes: + """ + Plots centered single reads as a scatterplot, cut off at the boundaries of the requested regions? + + TODO: I feel like this should be able to take in data directly as vectors/other datatypes, not just read from files. + TODO: Style-wise, is it cleaner to have it be a match statement or calling a method from a global dict? Cleaner here with a dict, cleaner overall with the match statements? + TODO: So far, this is the only method to do plotting without utility methods. Is this reasonable? Is it that unique? + + Args: + mod_file_name: path to file containing modification data for single reads + regions: path to bed file specifying regions to extract + motifs: list of modifications to extract; expected to match mods available in the relevant mod_files + window_size: we plot +-window_size//2 from the center of the region(s) + single_strand: True means we only grab counts from reads from the same strand as + the region of interest, False means we always grab both strands within the regions + regions_5to3prime: True means negative strand regions get flipped, False means no flipping. Only works if relative=True + sort_by: ordered list for hierarchical sort. Currently only smallest to biggest. + thresh: if no threshold has been applied already, this will threshold the mod calls for plotting (method is only boolean) + relative: if True, all regions are centered + + Returns: + Axes object containing the plot + """ + mod_file_name = Path(mod_file_name) + # bed_file_name = Path(bed_file_name) + size = kwargs.pop("s", 0.5) + + palette = kwargs.pop("palette", {}) + + merged_palette = {**utils.DEFAULT_COLORS, **palette} + + match mod_file_name.suffix: + # TODO: Fix how the fake reads options work, and make sure they have the same interface as the real ones. + # dimelo/plot_reads.py:63: error: Argument "regions" to "reads_from_fake" has incompatible type "str | Path | list[str | Path]"; expected "Path" [arg-type] + # Will also fix the following error: + # dimelo/plot_reads.py:68: error: Incompatible types in assignment (expression has type "dict[Any, Any] | None", variable has type "dict[Any, Any]") [assignment] + case ".fake": + reads, read_names, mods, regions_dict = load_processed.reads_from_fake( + file=mod_file_name, + regions=regions, + motifs=motifs, + ) + case _: + reads, read_names, mods, regions_dict = ( + load_processed.readwise_binary_modification_arrays( + file=mod_file_name, + regions=regions, + motifs=motifs, + window_size=window_size, + single_strand=single_strand, + regions_5to3prime=regions_5to3prime, + thresh=thresh, + relative=relative, + sort_by=sort_by, + ) + ) + + # Convert data frame where each row represents a read to a data frame where each row represents a single modified position in a read + df = pd.DataFrame({"read_name": read_names, "mod": mods, "pos": reads}).explode( + "pos" + ) + axes = sns.scatterplot( + data=df, + x="pos", + y="read_name", + hue="mod", + # palette=colors, + s=size, + marker="s", + linewidth=0, + palette=merged_palette, + **kwargs, + ) + # Retrieve the existing legend + legend = axes.legend_ + + # Retrieve legend handles and labels + handles, labels = axes.get_legend_handles_labels() + + # Update legend properties + # TODO: Do we need to do this now and after? + if legend is not None: + legend.set_title("Mod") + + # Update marker size for all handles + for handle in handles: + if hasattr(handle, "set_markersize"): + handle.set_markersize(10) # Set a larger marker size for legend + + # Re-apply the legend with updated handles + # TODO: Is this step necessary? + axes.legend(handles, labels, title="Mod") + + # TODO: Technically, regions_dict can be None by this point. In that scenario, it will error out when checking the length. + # It can be None according to type hints but in the actual logical flow I believe it cannot be None + # However, we can easily just check whether it is None here as well, in case we change behavior elsewhere. + # Identified with mypy through the following error: + # dimelo/plot_reads.py:101: error: Argument 1 to "len" has incompatible type "dict[Any, Any] | None"; expected "Sized" [arg-type] + if relative and regions_dict is not None and len(regions_dict) > 0: + region1_start, region1_end, _ = next(iter(regions_dict.values()))[0] + effective_window_size = (region1_end - region1_start) // 2 + axes.set_xlim([-effective_window_size, effective_window_size]) + + return axes diff --git a/dimelo/qc.py b/dimelo/qc.py deleted file mode 100644 index 61ebb3a9..00000000 --- a/dimelo/qc.py +++ /dev/null @@ -1,470 +0,0 @@ -r""" -================= -QC module -================= -.. currentmodule:: dimelo.qc_report -.. autosummary:: - qc_report - -qc_report provides a detailed summary report of many important quality control information including read length, mapping quality, etc. - -""" -import argparse -import multiprocessing -import os -import sqlite3 -import time -from math import log - -import matplotlib.pyplot as plt -import numpy as np -import pandas as pd -import pysam -from joblib import Parallel, delayed -from tqdm import tqdm - -from dimelo.parse_bam import make_db -from dimelo.utils import execute_sql_command - -DEFAULT_COLOR_LIST = [ - "#BB4430", - "#FFBC0A", - "#053C5E", - "#A9E5BB", - "#610345", - "#2D1E2F", - "#559CAD", - "#5E747F", - "#F343F4", -] - - -def batch_read_generator(file_bamIn, filename): - counter = 0 - r_list = [] - - lines = pysam.idxstats(filename).splitlines() - total_reads = sum( - [ - int(line.split("\t")[2]) - for line in lines - if not line.startswith("#") - ] - ) - batch_size = 0.1 * total_reads - - for read in file_bamIn.fetch(until_eof=True): - r = [ - read.query_name, - read.reference_name, - read.reference_start, - read.reference_end, - read.query_length, - "-" if read.is_reverse else "+", - read.mapping_quality, - ave_qual(read.query_qualities), - ave_qual(read.query_alignment_qualities), - ] - - r = tuple(r) - if counter < batch_size: - r_list.append(r) - counter += 1 - else: - yield r_list - counter = 0 - r_list = [r] - yield r_list - - -def logger(statement): - print(statement) - - -def prob_bin(bin): - # probability a base in the window (or across reads or across bases within a read) is methylated by: - # calculating probability that no base in the window (or across reads) is methylated and then taking the complement - # treat p=1 as 254/255 for prevent log(0) - probs = [ - np.log(1 - p) for p in bin if ((p < 1) and (p >= 0.5)) - ] # only consider probabilities > 0.5 and handle 1 on next line - probs1 = [np.log(1 - 254 / 255) for p in bin if p == 1] - probsAll = probs + probs1 - prob = 1 - np.exp(sum(probsAll)) - return prob - - -def errs_tab(n): - """Generate list of error rates for qualities less than equal than n.""" - return [10 ** (q / -10) for q in range(n + 1)] - - -def ave_qual(quals, qround=False, tab=errs_tab(129)): - """Calculate average basecall quality of a read. - Receive the integer quality scores of a read and return the average quality for that read - First convert Phred scores to probabilities, - calculate average error probability - convert average back to Phred scale - """ - if quals: - mq = -10 * log(sum([tab[q] for q in quals]) / len(quals), 10) - if qround: - return round(mq) - else: - return mq - else: - return None - - -def parse_bam_read(bamIn, sampleName, outDir, cores=None): - file_bamIn = pysam.AlignmentFile(bamIn, "rb") - - DB_NAME, tables = make_db(bamIn, sampleName, outDir, qc=True) - template_command = ( - """INSERT INTO """ + tables[0] + """ VALUES(?,?,?,?,?,?,?,?,?);""" - ) - connect = sqlite3.connect(DB_NAME, timeout=60.0, check_same_thread=False) - cores_avail = multiprocessing.cpu_count() - if cores is None: - num_cores = cores_avail - else: - # if more than available cores is specified, process with available cores - if cores > cores_avail: - num_cores = cores_avail - else: - num_cores = cores - - c = connect.cursor() - c.execute("BEGIN TRANSACTION") - - Parallel(n_jobs=num_cores, backend="threading")( - delayed(execute_sql_command)(template_command, DB_NAME, i, connect) - for i in tqdm( - batch_read_generator(file_bamIn, bamIn), - total=10, - desc="Processing reads", - unit=" batches", - ) - ) - - c.close() - connect.close() - return DB_NAME, tables[0] - - -def get_runtime(f, inp1, inp2, inp3): - start = time.time() - re_val = f(inp1, inp2, inp3) - time.sleep(1) - end = time.time() - return f"Runtime of the program is {end - start}", re_val - - -def qc_plot(x, sampleName, plotType, colors, num, axes): - an_array = np.array(x) - if all(v is None for v in an_array): - return [] - q1 = np.quantile(an_array, 0.25) - q3 = np.quantile(an_array, 0.75) - iq = q3 - q1 - outlier = q3 + 3 * iq - not_outlier = an_array <= outlier - no_outliers = an_array[not_outlier] - - ptype = "" - unit = "" - xlabel = "" - hasN50 = False - if plotType == "L": - ptype = " Read Length" - xlabel = "Read Length (bp)" - unit = " bp" - hasN50 = True - n50 = calculate_N50(x) - elif plotType == "M": - ptype = " Mapping Quality" - xlabel = "Mapping Quality" - elif plotType == "B": - ptype = " Basecall Quality" - xlabel = "Average Basecall Quality" - elif plotType == "A": - ptype = " Alignment Quality" - xlabel = "Average Alignment Quality" - plt.hist(no_outliers, bins=200, color=colors[6], density=True) # - plt.axvline( - x.median(), - color=colors[0], - linestyle="dashed", - linewidth=1.3, - label="median: " + str(round(x.median())) + unit, - ) - plt.axvline( - x.mean(), - color=colors[2], - linestyle="dashed", - linewidth=1.3, - label="mean: " + str(round(x.mean())) + unit, - ) - if hasN50: - plt.axvline( - n50, - color=colors[1], - linestyle="dashed", - linewidth=1, - label="N50: " + str(round(n50)) + unit, - ) - plt.title(ptype) - plt.xlabel(xlabel) - plt.ylabel("Frequency") - plt.xlim( - 0, - ) - plt.plot([], [], " ", label="max: " + str(round(max(x))) + unit) - plt.legend() - - values = [ - round(min(x)), - round(q1), - round(x.median()), - round(q3), - round(max(x)), - round(x.mean()), - ] - return values - - -def calculate_N50(x): - array_rl = np.array(x) - N = np.sum(array_rl) - array_rl[::-1].sort() - rl_cumsum = np.cumsum(array_rl) - n50 = array_rl[np.argmax(rl_cumsum > N / 2)] - return n50 - - -def qc_report( - fileNames, - sampleNames, - outDir, - colors=DEFAULT_COLOR_LIST, - cores=None, -): - - """ - fileNames - list of names of bam files; indexed; or single file name as string - sampleNames - list of names of samples for output plot name labelling; or single sample name as string; valid names contain [``a-zA-Z0-9_``]. - outDir - directory to output QC summary report - cores - number of cores over which to parallelize; default is all available - colors - color list in hex for overlay plots; default is: - ["#BB4430","#FFBC0A","#053C5E","#A9E5BB","#610345", - "#2D1E2F","#559CAD","#5E747F","#F343F4"] - - **Example** - - For single sample: - - >>> dm.qc_report("dimelo/test/data/mod_mappings_subset.bam", "test", "dimelo/dimelo_test") - - For multiple sample files: - - >>> dm.qc_report(["dimelo/test/data/mod_mappings_subset.bam", "dimelo/test/data/winnowmap_guppy_merge_subset.bam"], ["test1", "test2"], "dimelo/dimelo_test") - - **Return** - - * PDF of QC Summary Report which includes: - * read length histogram - * mapping quality histogram - * average alignment quality per read histogram (if basecaller provided information) - * average basecall quality per read histogram (if basecaller provided information) - * summary table describing spread of data - * number of reads, number of basepairs - - Returns a SQL database in the specified output directory. Database can be converted into pandas dataframe with: - - >>> fileName = "dimelo/test/data/mod_mappings_subset.bam" - >>> sampleName = "test" - >>> outDir = "dimelo/dimelo_test" - >>> all_reads = pd.read_sql("SELECT * from reads_" + sampleName, sqlite3.connect(outDir + "/" + fileName.split("/")[-1].replace(".bam", "") + ".db")) - - - After QC, each database contains this table with columns listed below: - - reads_sampleName - * name - * chr - * start - * end - * length - * strand - * mapq - * ave_baseq - * ave_alignq - - **Example Plots** - :ref:`sphx_glr_auto_examples_plot_qc_example.py` - - """ - if not os.path.isdir(outDir): - os.makedirs(outDir) - - if type(fileNames) != list: - fileNames = [fileNames] - sampleNames = [sampleNames] - - for index in range(len(fileNames)): - filebamIn = fileNames[index] - sampleName = sampleNames[index] - DB_NAME, TABLE_NAME = parse_bam_read( - filebamIn, sampleName, outDir, cores - ) - - if sampleName is None: - sampleName = DB_NAME.split("/")[-1][:-3] - - plot_feature_df = pd.read_sql( - "SELECT * from " + TABLE_NAME, con=sqlite3.connect(DB_NAME) - ) - - fig = plt.figure(figsize=(12, 10)) - grid = plt.GridSpec(3, 2, figure=fig) - - ax_5 = plt.subplot2grid(shape=(3, 2), loc=(0, 0), colspan=2) - ax_5.axis("off") - - keep_values = [0, 0, 0, 0] - valRL = [] - valMQ = [] - valBQ = [] - valAQ = [] - - # Read Length - x = plot_feature_df["length"] - ax_1 = fig.add_subplot(grid[0, 0]) - valRL = qc_plot(x, sampleName, "L", colors, 1, ax_1) - if valRL: - keep_values[0] = 1 - - # Mapping Quality - x = plot_feature_df["mapq"] - ax_2 = fig.add_subplot(grid[0, 1]) - valMQ = qc_plot(x, sampleName, "M", colors, 2, ax_2) - if valMQ: - keep_values[1] = 1 - - # Basecall Quality - x = plot_feature_df["ave_baseq"] - ax_3 = fig.add_subplot(grid[1, 0]) - valBQ = qc_plot(x, sampleName, "B", colors, 3, ax_3) - if valBQ: - keep_values[2] = 1 - - # Alignment Quality - x = plot_feature_df["ave_alignq"] - ax_4 = fig.add_subplot(grid[1, 1]) - valAQ = qc_plot(x, sampleName, "A", colors, 4, ax_4) - if valAQ: - keep_values[3] = 1 - - val_table = [valRL, valMQ, valBQ, valAQ] - val_table_new = [] - cols = [ - "Read Length", - "Mapping Quality", - "Basecall Quality", - "Alignment Quality", - ] - columns = [] - axes_stored = [ax_1, ax_2, ax_3, ax_4] - for i in range(len(keep_values)): - if keep_values[i] == 1: - val_table_new.append(val_table[i]) - columns.append(cols[i]) - else: - plt.delaxes(axes_stored[i]) - - report_table = np.array(val_table_new).T - - rows = ["Min", "25%", "Median", "75%", "Max", "Mean"] - print("mean length: ", valRL[5]) - print("num reads: ", len(x)) - print("num bases: ", round(valRL[5] * len(x))) - - if len(columns) <= 2: - ax_5 = plt.subplot2grid(shape=(3, 2), loc=(1, 0), colspan=2) - else: - ax_5 = plt.subplot2grid(shape=(3, 2), loc=(2, 0), colspan=2) - ax_5.axis("off") - ax_5.table( - cellText=report_table, - rowLabels=rows, - colLabels=columns, - loc="center", - ) - - fig.tight_layout(w_pad=2, h_pad=4) - - summary_data = "mean length: " + str(valRL[5]) + " bp" - summary_data = summary_data + "; num reads: " + str(len(x)) - summary_data = ( - summary_data + "; " + "num bases: " + str(round(valRL[5] * len(x))) - ) - fig.suptitle(sampleName + " QC Summary Report", y=1.05) - - plt.title(summary_data, y=0.8) - - # saving as PDF - final_file_name = outDir + "/" + sampleName + "_qc_report" - plt.savefig(final_file_name + ".pdf", bbox_inches="tight") - plt.close() - - print("QC report located at: " + final_file_name + ".pdf") - print("Database located at: " + DB_NAME) - - -def main(): - parser = argparse.ArgumentParser(description="Generate DiMeLo qc report") - - # Required arguments - required_args = parser.add_argument_group("required arguments") - required_args.add_argument( - "-f", "--fileNames", required=True, nargs="+", help="bam file name(s)" - ) - required_args.add_argument( - "-s", - "--sampleNames", - required=True, - nargs="+", - help="sample name(s) for output labelling", - ) - required_args.add_argument( - "-o", - "--outDir", - required=True, - help="directory to output QC summary report", - ) - - # Plotting arguments - plotting_args = parser.add_argument_group("plotting options") - plotting_args.add_argument( - "--colors", - type=str, - nargs="+", - default=DEFAULT_COLOR_LIST, - help='color list in hex (e.g. "#BB4430") for overlay plots', - ) - - # Optional arguments - parser.add_argument( - "-p", - "--cores", - type=int, - help="number of cores over which to parallelize", - ) - - args = parser.parse_args() - qc_report(**vars(args)) diff --git a/dimelo/run_modkit.py b/dimelo/run_modkit.py new file mode 100644 index 00000000..c49106c3 --- /dev/null +++ b/dimelo/run_modkit.py @@ -0,0 +1,422 @@ +import os + +# I believe that pty does not currently work on Windows, although this may change in future releases: https://bugs.python.org/issue41663 +# However, it may be that pywinpty, which is installable from pip, would work fine. That just needs to be tested with a Windows machine +# My current thinking is to wait on this until Nanopore puts Windows executables on Anaconda: https://anaconda.org/nanoporetech/modkit +import pty +import re +import select +import subprocess +import sys +from pathlib import Path +from typing import Optional, cast + +from tqdm.auto import tqdm + +# This should be updated in tandem with the environment.yml nanoporetech::modkit version +EXPECTED_MODKIT_VERSION = "0.2.4" + +""" +Import checks +""" +# Add conda env bin folder to path if it is not already present +# On some systems, the directory containing executables for the active environment isn't automatically on the path +# If this is the case, add that directory to the path so modkit can run +current_interpreter = sys.executable +env_bin_path = os.path.dirname(current_interpreter) +if env_bin_path not in os.environ["PATH"]: + print( + f"PATH does not include the conda environment /bin folder. Adding {env_bin_path}." + ) + os.environ["PATH"] = f"{env_bin_path}:{os.environ['PATH']}" + print(f"PATH is now {os.environ['PATH']}") + +# Check modkit on first import: does it run; does it have the right version +try: + result = subprocess.run(["modkit", "--version"], stdout=subprocess.PIPE, text=True) + modkit_version = result.stdout + if modkit_version.split()[1] == EXPECTED_MODKIT_VERSION: + pass + # print(f"modkit found with expected version {EXPECTED_MODKIT_VERSION}") + else: + print( + f"modkit found with unexpected version {modkit_version.split()[1]}. Versions other than {EXPECTED_MODKIT_VERSION} may exhibit unexpected behavior. It is recommended that you use v{EXPECTED_MODKIT_VERSION}" + ) +except subprocess.CalledProcessError: + print( + 'Executable not found for modkit. Install dimelo using "conda env create -f environment.yml" or install modkit manually to your conda environment using "conda install nanoporetech::modkit==0.2.4". Without modkit you cannot run parse_bam functions.' + ) + + +def run_with_progress_bars( + command_list: list[str], + input_file: Path, + ref_genome: Path, + motifs: list[str], + load_fasta_regex: str, + find_motifs_regex: str, + contigs_progress_regex: str, + single_contig_regex: str, + buffer_size: int = 50, + progress_granularity: int = 10, + done_str: str = "Done", + err_str: str = "Error", + expect_done: bool = False, + quiet: bool = False, +) -> str: + r""" + This function runs modkit with subprocess / pseudoterminal and grabs the progress outputs to populate progress bars + + Args: + command_list: a list of commands to pass to subprocess: [modkit, pileup, ...] or [modkit, extract, ...] + load_fasta_regex: a regular expression that captures the contig being loaded in the step where modkit + reads fasta sequence. Should specify all the output context + so that groups aren't captured unless there is whitespace on either end i.e. the whole output + e.g. r'\s+\[.*?\]\s+(\d+)\s+Reading' for pileup in 0.2.4 + input_file: the bam file you are processing + ref_genome: the reference genome to which your bam is aligned + motifs: the list of motifs you are looking for + find_motifs_regex: a regular expression that captures contigs-so-far and total-contigs-to-process + in the step where modkit is finding motifs throughout the genome. Should specify all the output context + so that groups aren't captured unless there is whitespace on either end i.e. the whole output + has been loaded into the buffer + e.g. r'\s+(\d+)/(\d+)\s+finding\s+([A-Za-z0-9,]+)\s+motifs' for pileup in 0.2.4 + contigs_progress_regex: a regular expression that captures currently-processing-contig and total-contigs + -to-process in the step where modkit is running through the bam file. Should specify all the output context + so that groups aren't captured unless there is whitespace on either end i.e. the whole output + e.g. r'\s+(\d+)/(\d+)\s+contigs' for pileup in 0.2.4 + single_contig_regex: a regular expression that captures reads-processed, reads-total, and contig-name for + a contig that is being processing from the bam file. Should specify all the output context + so that groups aren't captured unless there is whitespace on either end i.e. the whole output + e.g. r'\s+(\d+)/(\d+)\s+processing\s+([\w]+)[^\w]' for pileup in 0.2.4 + buffer_size: the length of the string that the modkit stderr output gets saved into. This size will not + be respected if you hit Done or Error; in that case the rest of the output will be captured and returned + or raised. + progress_granularity: this tells the function how often to check the output buffer string for the various regex. + Less frequent checking is good because it means fewer spurious updates and less overhead. However you + need this to be sufficiently less than buffer_size that you can always capture the entirety of your + relevant information. + done_str: a string telling the function what to look for to know that modkit is done processing. Everything + after this will get returned + err_str: a string telling the function what to look for to know that modkit has encountered an error. Everything + after this will be raised as a ValueError + expect_done: specifies whether the command is expected to show a clear "Done" at the end of the output + quiet: sending True will suppress all progress bars and stdout outputs. + + Returns: + The command line stderr output string after the point where we detect modkit is done parsing + """ + + # modkit 0.2.4 does not like gzipped or bgzipped fasta files + with open(ref_genome, "rb") as f: + if f.read(2) == b"\x1f\x8b": + raise ValueError( + f"{ref_genome.name} is gzipped, which will cause modkit to fail.\ngunzip {ref_genome.name} and try again." + ) + + # Set up progress bar variables to display progress updates when not in quiet mode + format_pre = "{bar}| {desc} {percentage:3.0f}% | {elapsed}" + format_contigs = "{bar}| {desc} {percentage:3.0f}% | {elapsed}<{remaining}" + format_chr = "{bar}| {desc} {percentage:3.0f}%" + pbar_pre: Optional[tqdm] = None + pbar_contigs: Optional[tqdm] = None + pbar_chr: Optional[tqdm] = None + + # TODO: Is this the correct type annotation? I think it is, based on approx. line 280 + finding_progress_dict: dict[str, tuple[int, int]] = {} + in_contig_progress = (0, 1) + total_contigs = 0 + + # Set up output buffer variables to capture modkit output + buffer_bytes = bytearray() + tail_buffer = "" + + # Set up flags for modkit error / modkit done from text outputs + err_flag = False + done_flag = False + + # Create a pseudo-terminal in which to run the modkit subprocess + master_fd, slave_fd = pty.openpty() + + # Start modkit subprocess with the slave end as stdio + process = subprocess.Popen( + command_list, + stdin=slave_fd, + stdout=slave_fd, + stderr=subprocess.STDOUT, + close_fds=True, + ) + os.close(slave_fd) + + readout_count = 0 + progress_bars_initialized = False + region_parsing_started = False + + # Grab output bytes for as long as they're coming + while True: + # Wait for the process to be ready to provide bytes + ready, _, _ = select.select([master_fd], [], [], 0.1) + if ready: + try: + # Read a single byte + data = os.read(master_fd, 1) + if not data: + break # No more data + + if quiet: + # If we are in quiet mode, nothing gets grabbed + continue + else: + # Create the progress bars when first entering this code block + if not progress_bars_initialized: + pbar_pre = tqdm( + total=100, + desc=f"Step 1: Identify motif locations in {ref_genome.name}", + bar_format=format_pre, + ) + pbar_contigs = tqdm( + total=100, + desc=f"Step 2: Parse regions in {input_file.name}", + bar_format=format_contigs, + ) + pbar_chr = tqdm( + total=100, + desc="", + bar_format=format_chr, + ) + progress_bars_initialized = True + + buffer_bytes += data # Accumulate bytes in the buffer + + try: + # Try to decode the accumulated bytes + # This will throw a UnicodeDecodeError if not complete, which is ok! Then we just continue on + text = buffer_bytes.decode("utf-8") + readout_count += 1 + buffer_bytes.clear() # Clear the buffer after successful decoding + # If we have hit an error or modkit is done, just accumulate the rest of the output and then deal with it: + # no need to check the progress tracking stuff in that case + if err_flag or done_flag: + tail_buffer += text + # If we haven't hit an error or a done state, first check for that + else: + tail_buffer = (tail_buffer + text)[-buffer_size:] + if err_str in tail_buffer: + index = tail_buffer.find(err_str) + tail_buffer = tail_buffer[index:] + err_flag = True + elif done_str in tail_buffer: + index = tail_buffer.find(done_str) + tail_buffer = tail_buffer[index - 2 :] + done_flag = True + # If the process is ongoing, then go through the possible cases and create/adjust pbars accordingly + # We only sometimes want to update progress because otherwise the constant updates slow us down + elif ( + readout_count % progress_granularity == 0 + and progress_bars_initialized + ): + region_parsing_started, in_contig_progress = ( + update_progress_bars( + pbar_pre=pbar_pre, + pbar_contigs=pbar_contigs, + pbar_chr=pbar_chr, + tail_buffer=tail_buffer, + contigs_progress_regex=contigs_progress_regex, + single_contig_regex=single_contig_regex, + find_motifs_regex=find_motifs_regex, + load_fasta_regex=load_fasta_regex, + region_parsing_started=region_parsing_started, + in_contig_progress=in_contig_progress, + finding_progress_dict=finding_progress_dict, + ref_genome=ref_genome, + input_file=input_file, + motifs=motifs, + ) + ) + + except UnicodeDecodeError: + # If decoding fails, continue accumulating bytes + continue + except Exception as e: + raise e + except OSError: + break + + # After the data stops coming, we wait until the process is done so we can grab the return code + process.wait() + return_code = process.returncode + # Modkit gives return code 0 if it terminates successfully; any other return code should be raised + # This catches system kills caused by memory and disk space + if return_code != 0 or err_flag: + if err_flag: + print(tail_buffer) + if return_code == -9: + print( + "It looks like the process was killed with SIGKILL. This is often due to the system running out of memory.", + "\nConsider setting 'cores=1' to reduce resource usage or reducing the data size being processed.", + "\nNote that pileup and extract both create large intermediate plain-text files before reducing down to a compressed and indexed format.", + "\nRunning out of disk space can indirectly cause memory issues." + "\nYou might also want to check if there are any resource limits set for your user or in the environment where the code is running.", + ) + raise subprocess.CalledProcessError( + return_code, command_list, output=tail_buffer + ) + + # If modkit gives return code 0, it can still have had an unusual state. + # If the expected done flag was seen, or if the command doesn't have a done + # string (i.e. extract), update the progress bars to reflect the final status + # If the progress bars are not initialized, then the code must have been run in + # quiet mode + elif done_flag or not expect_done: + if progress_bars_initialized: + pbar_pre = cast(tqdm, pbar_pre) + pbar_contigs = cast(tqdm, pbar_contigs) + pbar_chr = cast(tqdm, pbar_chr) + pbar_pre.close() + pbar_contigs.n = 100 + pbar_contigs.set_description( + f"Step 2 complete. {total_contigs} contigs processed from {input_file.name}" + ) + pbar_contigs.refresh() + pbar_contigs.close() + pbar_chr.n = 100 + ansi_escape_pattern = re.compile(r"(\[2K>)") + pbar_chr.set_description( + command_list[0] + + " " + + command_list[1] + + " return code " + + str(return_code) + + " | " + + ansi_escape_pattern.sub("", tail_buffer).strip() + ) + pbar_chr.refresh() + pbar_chr.close() + return tail_buffer + # Indicate unusual state + else: + if progress_bars_initialized: + pbar_pre = cast(tqdm, pbar_pre) + pbar_contigs = cast(tqdm, pbar_contigs) + pbar_chr = cast(tqdm, pbar_chr) + pbar_pre.close() + pbar_contigs.set_description("Unexpected modkit outputs") + pbar_contigs.refresh() + pbar_contigs.close() + pbar_chr.set_description( + command_list[0] + + " " + + command_list[1] + + " return code " + + str(return_code) + ) + pbar_chr.refresh() + pbar_chr.close() + print( + 'WARNING: the modkit command may not have completed normally. Consider re-running with "log=True" if you do not get the expected outputs.' + ) + return tail_buffer + + +def update_progress_bars( + pbar_pre, + pbar_contigs, + pbar_chr, + tail_buffer, + contigs_progress_regex, + single_contig_regex, + find_motifs_regex, + load_fasta_regex, + region_parsing_started, + in_contig_progress, + finding_progress_dict, + ref_genome, + input_file, + motifs, +): + # We check these in the reverse order from that in which they occur, which I guess will save a tiny + # amount of processing time because we don't check for previous steps when on later steps + # Once we are in the contig progress stage, step 1 is done by definition + if contigs_progress_matches := re.search(contigs_progress_regex, tail_buffer): + # If we get here we can be sure the pbars are initialized + pbar_pre = cast(tqdm, pbar_pre) + pbar_contigs = cast(tqdm, pbar_contigs) + if not region_parsing_started: + # These are now no longer indicating future steps, but rather counting the actual + # time for step 2 + pbar_contigs.reset() + pbar_chr.reset() + region_parsing_started = True + # Now that region parsing has started, we can close out the preprocessing pbar + pbar_pre.n = 100 + pbar_pre.set_description( + f"Step 1 complete. Located {motifs} in {ref_genome.name}" + ) + pbar_pre.refresh() + pbar_pre.close() + # This progress bar tracks how many contigs/chromosomes have been processed + current_contig = int(contigs_progress_matches.group(1)) + total_contigs = int(contigs_progress_matches.group(2)) + pbar_contigs.n = ( + ( + 100 + * ( + current_contig + + ( + in_contig_progress[0] / in_contig_progress[1] + if in_contig_progress[1] > 0 + else 0 + ) + ) + ) + / total_contigs + if total_contigs > 0 + else 0 + ) + pbar_contigs.set_description( + f"Step 2: parsing {current_contig}/{total_contigs} from {input_file.name}" + ) + pbar_contigs.refresh() + elif region_parsing_started and ( + single_contig_matches := re.search(single_contig_regex, tail_buffer) + ): + # If we get here we can be sure the pbars are initialized + pbar_chr = cast(tqdm, pbar_chr) + # This progress bar tracks reads processed within a chromosomes + chromosome = single_contig_matches.group(3) + reads_done = int(single_contig_matches.group(1)) + reads_total = int(single_contig_matches.group(2)) + pbar_chr.n = 100 * reads_done / reads_total if reads_total > 0 else 0 + in_contig_progress = (reads_done, reads_total) + pbar_chr.set_description( + f"Step 2: {chromosome} {reads_done}/{reads_total} chunks processed" + ) + pbar_chr.refresh() + + elif find_motifs_matches := re.search(find_motifs_regex, tail_buffer): + # If we get here we can be sure the pbars are initialized + pbar_pre = cast(tqdm, pbar_pre) + finding_progress_dict[find_motifs_matches.group(3)] = ( + int(find_motifs_matches.group(1)), + int(find_motifs_matches.group(2)), + ) + num_sum, denom_sum = 0, 0 + for ( + num, + denom, + ) in finding_progress_dict.values(): + num_sum += num + denom_sum += denom + if denom_sum > 0: + pbar_pre.n = 100 * num_sum / denom_sum + else: + pbar_pre.n = 0 + pbar_pre.set_description(f"Step 1b: finding motif(s) {motifs}") + pbar_pre.refresh() + elif load_fasta_match := re.search(load_fasta_regex, tail_buffer): + # If we get here we can be sure the pbars are initialized + pbar_pre = cast(tqdm, pbar_pre) + pbar_pre.n = 100 * int(load_fasta_match.group(1)) / 24 + pbar_pre.set_description(f"Step 1a: reading {ref_genome.name}") + pbar_pre.refresh() + return region_parsing_started, in_contig_progress diff --git a/dimelo/test/README.md b/dimelo/test/README.md new file mode 100644 index 00000000..c59ae214 --- /dev/null +++ b/dimelo/test/README.md @@ -0,0 +1,25 @@ +# test + +This folder contains data and code to run basic tests on the `dimelo` package. `dimelo_test.py` currently contains all test code, and `data/test_targets/test_matrix.pickle` contains a mapping of test case kwargs to target values, including paths to files living in the same directory. + +New versions of `test_matrix.pickle` and the accompanying target files to which it refers can be generated using `generate_targets.py`, which itself can +reference both existing results in `test_matrix.pickle` as well as a fresh set of test cases (i.e. kwarg combinations) defined in `cases.py`. + +## files + +`__init__.py` sets up a framework for running parsing, including downloading a reference genome and processing input files appropriately. + +`cases.py` contains a set of test cases which will be run through all tests in `dimelo_test.py`, and used to generate corresponding targets in `generate_targets.py`. The format schema contains kwargs by name in a dictionary for each test case: these are passed *directly* to the parse, load, plot, and export functions, simply filtering out un-needed ones. Formats must match the requirements of the functions that take these arguments. + +`dimelo_test.py` implements unit tests and integration tests using `pytest`. Tests are split into classes to handle temporary directories cleanly and separate different types of tests. + +`generate_targets.py` contains code to create the target outputs for the unit tests, ultimately creating a test_matrix.pkl file containing a pickled directionary of test kwargs and results. These should not be updated unless you confirm that any change in behavior is actually correct, i.e. if any test is failing make sure you know why before considering replacing the target values. *Special care should be taken for the `load_processed` outputs, which should not change with interface changes. If those outputs don't match and need to be regenerated, that is* ***reason for concern.*** However, updates to e.g. the .h5 single read format and corresponding changes to the `load_processed` methods may require making a new target .h5 file while `load_processed.binarized_read_from_hdf5` still returns the right array values and so on. Run `python generate_targets.py --help` for assistance with arguments to update only a subset of target value or test cases. + +The `data` folder contains .bam files and .bed files to use for testing. These files are also used by the tutorial. + +The `output` folder stores the reference genome and processed outputs. This folder is included in `.gitignore` so its contents should never be included in commits or merges. + +``` +# Ignore tutorial output files +test/output +``` \ No newline at end of file diff --git a/dimelo/test/__init__.py b/dimelo/test/__init__.py index 6c6fdcdd..7af71eda 100644 --- a/dimelo/test/__init__.py +++ b/dimelo/test/__init__.py @@ -1,24 +1,159 @@ +import gzip +import subprocess import tempfile -import unittest +import urllib +from inspect import signature from pathlib import Path +import pysam -class DiMeLoTestCase(unittest.TestCase): +ref_genome_url = "https://s3-us-west-2.amazonaws.com/human-pangenomics/T2T/CHM13/assemblies/chm13.draft_v1.0.fasta.gz" + +script_location = Path(__file__).resolve().parent +output_dir = script_location / "output" +ref_genome_gz = output_dir / "chm13.draft_v1.0.fasta.gz" +ref_genome_fasta = output_dir / "chm13.draft_v1.0.fasta" + +data_dir = script_location / "data" +bams_to_update = [data_dir / "ctcf_demo.sorted.bam"] + +""" +The RelativePath class is a pickle-able Path class that will play nice with parse_bam.sanitize_path_inputs (using the __fspath__ function) +and then can also be included in dicts and other objects for pickling. This way we can store input and output test files using relative +paths but execute code using e.g. pytest, which operates in a different directory, and have the paths work by converting them to absolute +paths. Clumsy maybe? Could be a better approach out there? Who knows. Not I. +""" + + +class RelativePath: + def __init__(self, path): + path = Path(path) + if path.is_absolute(): + # Convert the absolute path to a relative path + try: + self.relative_path = path.relative_to(script_location) + except ValueError as e: + raise ValueError( + "The provided path is not in the dimelo/test directory." + ) from e + else: + self.relative_path = path + self._update_absolute_path() + + def _update_absolute_path(self): + # Dynamically determine the absolute path based on relative path and the location of this file + self.base_path = Path(__file__).parent + self.absolute_path = (self.base_path / self.relative_path).resolve() + + def __fspath__(self): + # Allows the object to be used by pathlib.Path and anything that accepts path-like objects + return str(self.absolute_path) + + def __str__(self): + # Allows the object to be used by methods that want strings + return str(self.absolute_path) + + def __getstate__(self): + # Returns the state to be pickled; i.e. just the relative path + return self.relative_path + + def __setstate__(self, state): + # Restore state from the unpickled state; recreate the absolute path from the relative path + self.relative_path = state + self._update_absolute_path() + + +def filter_kwargs_for_func(func, kwargs, extra_args=[]): + func_sig = signature(func) + allowed_args = set(list(func_sig.parameters) + extra_args) + filtered_kwargs = {k: v for k, v in kwargs.items() if k in allowed_args} + return filtered_kwargs + + +def download_reference(force_redownload=False): + """ + download the reference genome to enable downstream operations + """ + if not output_dir.exists(): + output_dir.mkdir() + if ref_genome_fasta.exists() and not force_redownload: + print("Reference genome already downloaded.") + return ref_genome_fasta + else: + urllib.request.urlretrieve(ref_genome_url, ref_genome_gz) + + with ( + gzip.open(ref_genome_gz, "rb") as gzip_file, + open(ref_genome_fasta, "wb") as output_file, + ): + for chunk in gzip_file: + output_file.write(chunk) + + ref_genome_gz.unlink() + print("Reference genome downloaded and decompressed.") + return ref_genome_fasta + + +def retag_bam(bam_path, force_retag=False): + """ + use modkit to retag an input .bam file (to MM/ML vs mm/ml, with ?/. specified) + by default only retags if the .updated file doesn't already exist + """ + bam_updated_path = ( + bam_path.parent.parent + / "output" + / (Path(bam_path.stem).stem + ".updated" + bam_path.suffix) + ) + bam_updated_index_path = ( + bam_path.parent.parent + / "output" + / (Path(bam_path.stem).stem + ".updated" + bam_path.suffix + ".bai") + ) + if ( + bam_updated_path.exists() + and bam_updated_index_path.exists() + and not force_retag + ): + print("Input bam already retagged.") + return bam_updated_path + else: + subprocess.run( + [ + "modkit", + "update-tags", + str(bam_path), + str(bam_updated_path), + "--mode", + "ambiguous", + ] + ) + pysam.index(str(bam_updated_path)) + return bam_updated_path + + +class DiMeLoParsingTestCase: """ - TODO: - - Should these be setUpClass/tearDownClass or setUp/tearDown? Is it okay that only one temporary directory is created each time? + This is the base class for any DiMeLo tests that need to parse data or create output files. """ @classmethod - def setUpClass(cls): + def setup_class(cls): + # TODO: The existence of two variables with basically the same name is very confusing. Please clarify? cls._outDir = tempfile.TemporaryDirectory() cls.outDir = Path(cls._outDir.name) + cls.reference_genome = download_reference() + _ = [retag_bam(bam) for bam in bams_to_update] @classmethod - def tearDownClass(cls): + def teardown_class(cls): cls._outDir.cleanup() def assertOutputFileExists(self, file_name: Path): """Fails test if the given file name is not found in the output directory""" + """ + TODO: There are a couple of things wrong here: + * This is never called anywhere; was this a holdover from my old infrastructure? Can it be deleted? + * mypy error: dimelo/test/__init__.py:157: error: "DiMeLoParsingTestCase" has no attribute "outDir" [attr-defined] + """ file_path = self.outDir / file_name - self.assertTrue(file_path.exists(), msg=f"{file_path} does not exist") + assert file_path.exists(), f"{file_path} does not exist" diff --git a/dimelo/test/cases.py b/dimelo/test/cases.py new file mode 100644 index 00000000..402db58a --- /dev/null +++ b/dimelo/test/cases.py @@ -0,0 +1,133 @@ +from pathlib import Path + +from dimelo.test import RelativePath + +""" +This module contains the test cases that will be run through most dimelo_test submodules. To add new test cases, simple create new dict entries +in test_matrix with descriptive names. Each dict entry must contain a tuple of two dicts, the first containing kwargs and the second containing +test result targets. dimelo_test module run the applicable kwargs through different dimelo modules to test functionality, comparing results against +those stored in the results entry. The output targets can be populated by running generate_targets.py. +""" + +# Base input and output directories +test_data_dir = Path("./data") +output_dir = test_data_dir / "test_targets" + +region = "chr1:114357437-114359753" # this region is just one of the ones from the peaks bed file +# 'chr1:9167177-9169177' # nothing is really different about this one; I swapped at one point while debugging + +# Paths to input files +ctcf_bam_file = test_data_dir / "ctcf_demo.sorted.bam" +ctcf_target_regions = RelativePath(test_data_dir / "ctcf_demo_peak.bed") +ctcf_off_target_regions = RelativePath(test_data_dir / "ctcf_demo_not_peak.bed") + +ctcf_bam_file_updated = RelativePath("./output/ctcf_demo.updated.bam") +output_dir = RelativePath(output_dir) + +test_matrix = { + "megalodon_peaks_190": ( + # input kwargs + { + "input_file": ctcf_bam_file_updated, + "output_name": "megalodon_peaks_190", + "output_directory": output_dir, + "regions": [ctcf_target_regions, ctcf_off_target_regions], + "motifs": ["A,0", "CG,0"], + "thresh": 190, + "window_size": 5000, + "sort_by": ["read_start", "read_name", "motif"], + "smooth_window": 1, + "title": "megalodon_peaks_190", + "single_strand": False, + "regions_5to3prime": False, + "chunk_size": 1_000_000, + "cores": 1, + }, + # outputs dict function:values + {}, # populated by generate_targets.py + ), + "megalodon_single_190": ( + # input kwargs + { + "input_file": ctcf_bam_file_updated, + "output_name": "megalodon_single_190", + "output_directory": output_dir, + "regions": region, + "motifs": ["A,0", "CG,0"], + "thresh": 190, + "window_size": None, + "sort_by": ["read_start", "read_name", "motif"], + "smooth_window": 10, + "title": "megalodon_single_190", + "single_strand": False, + "regions_5to3prime": False, + "chunk_size": 100, + "cores": 2, + }, + # outputs dict function:values + {}, # populated by generate_targets.py + ), + "megalodon_single_and_peaks_190": ( + # input kwargs + { + "input_file": ctcf_bam_file_updated, + "output_name": "megalodon_single_and_peaks_190", + "output_directory": output_dir, + "regions": [region, ctcf_target_regions, ctcf_off_target_regions], + "motifs": ["A,0", "CG,0"], + "thresh": 190, + "window_size": 5000, + "sort_by": ["read_start", "read_name", "motif"], + "smooth_window": 100, + "title": "megalodon_single_and_peaks_190", + "single_strand": True, + "regions_5to3prime": True, + "chunk_size": 10_000, + "cores": 3, + }, + # outputs dict function:values + {}, # populated by generate_targets.py + ), + "megalodon_peaks_nothresh": ( + # input kwargs + { + "input_file": ctcf_bam_file_updated, + "output_name": "megalodon_peaks_nothresh", + "output_directory": output_dir, + "regions": [ctcf_target_regions, ctcf_off_target_regions], + "motifs": ["A,0", "CG,0"], + "thresh": None, + "window_size": 5000, + "sort_by": ["read_start", "read_name", "motif"], + "smooth_window": 100, + "title": "megalodon_peaks_nothresh", + "single_strand": True, + "regions_5to3prime": False, + "chunk_size": 1000, + "cores": 4, + }, + # outputs dict function:values + {}, # populated by generate_targets.py + ), + "megalodon_single_nothresh": ( + # input kwargs + { + "input_file": ctcf_bam_file_updated, + "output_name": "megalodon_single_nothresh", + "output_directory": output_dir, + "regions": region, + "motifs": ["A,0", "CG,0"], + "thresh": None, + "window_size": 5000, + "sort_by": ["read_start", "read_name", "motif"], + "smooth_window": 1, + "title": "megalodon_single_nothresh", + "single_strand": False, + "regions_5to3prime": True, + "chunk_size": 100, + "cores": None, + }, + # outputs dict function:values + {}, # populated by generate_targets.py + ), +} diff --git a/dimelo/test/data/README.md b/dimelo/test/data/README.md index e4a014d2..3872162f 100644 --- a/dimelo/test/data/README.md +++ b/dimelo/test/data/README.md @@ -1,7 +1,8 @@ # Test files -## Both bams are free pA-Hia5 control in GM12878 cells +## bams are free pA-Hia5 control in GM12878 cells - Example bam from megalodon: mod_mappings_subset.bam -- Example hybrid bam from winnowmap & guppy merge: winnowmap_guppy_merge_subset.bam +- *REMOVED TO REDUCE OVERHEAD Example hybrid bam from winnowmap & guppy merge: winnowmap_guppy_merge_subset.bam. * +*See old package version here to find these files: https://github.com/streetslab/dimelo/tree/7ff463273436d39ad4bf6dd0cbcc6c08cd4209cb/dimelo/test/data* ## Test files created using samtools subsample diff --git a/dimelo/test/data/ctcf_demo_not_peak.bed b/dimelo/test/data/ctcf_demo_not_peak.bed index 29d29f12..edfe6226 100644 --- a/dimelo/test/data/ctcf_demo_not_peak.bed +++ b/dimelo/test/data/ctcf_demo_not_peak.bed @@ -1,200 +1,200 @@ -chr14 44123158 44123308 + 465.63275 -chr14 44127026 44127176 + 465.63275 -chr14 44123159 44123308 - 465.63275 -chr14 44127026 44127175 - 465.63275 -chr1 114356587 114356736 - 441.00102 -chr1 114360454 114360603 - 441.00102 -chr1 114356586 114356736 + 441.00102 -chr1 114360454 114360604 + 441.00102 -chrX 9700334 9700484 - 418.31102 -chrX 9704202 9704352 - 418.31102 -chr15 54632158 54632308 + 410.28758 -chr15 54636060 54636176 + 410.28758 -chr15 54632159 54632308 - 410.28758 -chr15 54636060 54636175 - 410.28758 -chr15 54632192 54632308 - 410.28758 -chr15 54636060 54636210 - 410.28758 -chr15 54632193 54632308 + 410.28758 -chr15 54636060 54636209 + 410.28758 -chr6 53009844 53009994 + 398.10126 -chr6 53013712 53013862 + 398.10126 -chr16 4279536 4279624 + 394.95247 -chr16 4283404 4283554 + 394.95247 -chr16 4279474 4279624 + 394.95247 -chr16 4283404 4283490 + 394.95247 -chr16 4279537 4279624 - 394.95247 -chr16 4283404 4283553 - 394.95247 -chr7 152343847 152343935 - 390.20159 -chr7 152347715 152347865 - 390.20159 -chr7 152343848 152343935 + 390.20159 -chr7 152347715 152347864 + 390.20159 -chr7 152343786 152343935 + 390.20159 -chr7 152347715 152347802 + 390.20159 -chr7 152343785 152343935 - 390.20159 -chr7 152347715 152347803 - 390.20159 -chr16 63442391 63442541 - 389.524 -chr16 63446302 63446409 - 389.524 -chr16 63442392 63442541 + 389.524 -chr16 63446302 63446408 + 389.524 -chr16 63442436 63442541 - 389.524 -chr16 63446302 63446452 - 389.524 -chr6 41196658 41196741 - 388.86052 -chr6 41200525 41200674 - 388.86052 -chr6 41196657 41196741 + 388.86052 -chr6 41200525 41200675 + 388.86052 -chr6 41196592 41196741 + 388.86052 -chr6 41200525 41200608 + 388.86052 -chr6 41196591 41196741 - 388.86052 -chr6 41200525 41200609 - 388.86052 -chr20 36033923 36034073 + 384.11318 -chr20 36037791 36037941 + 384.11318 -chr20 36033924 36034073 - 384.11318 -chr20 36037791 36037940 - 384.11318 -chr12 57871837 57871987 - 380.55342 -chr12 57875753 57875855 - 380.55342 -chr12 57871885 57871987 - 380.55342 -chr12 57875753 57875903 - 380.55342 -chr8 22846344 22846494 + 372.97972 -chr8 22850296 22850362 + 372.97972 -chr8 22846345 22846494 - 372.97972 -chr8 22850296 22850361 - 372.97972 -chr8 22846428 22846494 + 372.97972 -chr8 22850296 22850446 + 372.97972 -chr17 45987626 45987736 + 370.32321 -chr17 45991494 45991644 + 370.32321 -chr17 45987627 45987736 - 370.32321 -chr17 45991494 45991643 - 370.32321 -chr17 45987587 45987736 - 370.32321 -chr17 45991494 45991603 - 370.32321 -chr17 45987586 45987736 + 370.32321 -chr17 45991494 45991604 + 370.32321 -chr3 48462689 48462778 + 367.84554 -chr3 48466556 48466705 + 367.84554 -chr3 48462688 48462778 - 367.84554 -chr3 48466556 48466706 - 367.84554 -chr3 48462628 48462778 - 367.84554 -chr3 48466556 48466646 - 367.84554 -chr20 33335286 33335348 - 367.5176 -chr20 33339154 33339304 - 367.5176 -chr20 33335198 33335348 - 367.5176 -chr20 33339154 33339216 - 367.5176 -chr20 33335199 33335348 + 367.5176 -chr20 33339154 33339215 + 367.5176 -chr1 150101535 150101649 + 365.77314 -chr1 150105402 150105551 + 365.77314 -chr1 150101534 150101649 - 365.77314 -chr1 150105402 150105552 - 365.77314 -chr1 150101499 150101649 + 365.77314 -chr1 150105402 150105517 + 365.77314 -chr17 42517551 42517701 - 359.33549 -chr17 42521481 42521569 - 359.33549 -chr17 42517613 42517701 - 359.33549 -chr17 42521481 42521631 - 359.33549 -chr17 42517552 42517701 + 359.33549 -chr17 42521481 42521568 + 359.33549 -chr6 15561986 15562057 - 358.9469 -chr6 15565853 15566002 - 358.9469 -chr6 15561907 15562057 + 358.9469 -chr6 15565853 15565925 + 358.9469 -chr6 15561908 15562057 - 358.9469 -chr6 15565853 15565924 - 358.9469 -chr6 15561985 15562057 + 358.9469 -chr6 15565853 15566003 + 358.9469 -chrX 99209453 99209603 - 358.41391 -chrX 99213321 99213471 - 358.41391 -chrX 99209454 99209603 + 358.41391 -chrX 99213321 99213470 + 358.41391 -chr2 44482827 44482977 + 357.20939 -chr2 44486695 44486845 + 357.20939 -chr19 43453207 43453357 - 355.83581 -chr19 43457120 43457225 - 355.83581 -chr19 43453253 43453357 + 355.83581 -chr19 43457120 43457269 + 355.83581 -chr19 43453252 43453357 - 355.83581 -chr19 43457120 43457270 - 355.83581 -chr17 44334564 44334713 - 354.9178 -chr17 44338431 44338580 - 354.9178 -chr17 44334563 44334713 + 354.9178 -chr17 44338431 44338581 + 354.9178 -chr5 138876711 138876861 + 352.26403 -chr5 138880579 138880729 + 352.26403 -chr17 82008681 82008700 - 351.42341 -chr17 82012549 82012699 - 351.42341 -chr17 82008550 82008700 - 351.42341 -chr17 82012549 82012568 - 351.42341 -chr17 82008682 82008700 + 351.42341 -chr17 82012549 82012698 + 351.42341 -chr15 38664851 38665000 + 350.08504 -chr15 38668760 38668867 + 350.08504 -chr15 38664850 38665000 - 350.08504 -chr15 38668760 38668868 - 350.08504 -chr15 38664892 38665000 - 350.08504 -chr15 38668760 38668910 - 350.08504 -chr15 38664893 38665000 + 350.08504 -chr15 38668760 38668909 + 350.08504 -chr1 9168135 9168218 + 349.08889 -chr1 9172003 9172153 + 349.08889 -chr1 9168136 9168218 - 349.08889 -chr1 9172003 9172152 - 349.08889 -chr1 9168068 9168218 + 349.08889 -chr1 9172003 9172086 + 349.08889 -chr9 145234697 145234810 - 348.5771 -chr9 145238565 145238715 - 348.5771 -chr9 145234661 145234810 - 348.5771 -chr9 145238565 145238677 - 348.5771 -chr9 145234660 145234810 + 348.5771 -chr9 145238565 145238678 + 348.5771 -chr6 73588200 73588289 + 345.89289 -chr6 73592068 73592218 + 345.89289 -chr6 73588139 73588289 - 345.89289 -chr6 73592068 73592157 - 345.89289 -chr19 41732348 41732498 - 345.26706 -chr19 41736216 41736366 - 345.26706 -chr19 41732349 41732498 + 345.26706 -chr19 41736216 41736365 + 345.26706 -chr20 59989038 59989135 + 345.12156 -chr20 59992905 59993054 + 345.12156 -chr20 59988985 59989135 - 345.12156 -chr20 59992905 59993003 - 345.12156 -chr20 59989037 59989135 - 345.12156 -chr20 59992905 59993055 - 345.12156 -chr21 24894312 24894462 - 344.78198 -chr21 24898180 24898330 - 344.78198 -chr21 24894313 24894462 + 344.78198 -chr21 24898180 24898329 + 344.78198 -chr14 17377274 17377423 - 341.73484 -chr14 17381209 17381290 - 341.73484 -chr14 17377273 17377423 + 341.73484 -chr14 17381209 17381291 + 341.73484 -chr14 17377341 17377423 + 341.73484 -chr14 17381209 17381359 + 341.73484 -chr19 44926037 44926186 - 341.02209 -chr19 44929904 44930053 - 341.02209 -chr19 44926036 44926186 + 341.02209 -chr19 44929904 44930054 + 341.02209 -chr5 111666908 111667058 + 339.94407 -chr5 111670776 111670926 + 339.94407 -chr20 40161013 40161163 - 339.91828 -chr20 40164881 40165031 - 339.91828 -chr20 40161014 40161163 + 339.91828 -chr20 40164881 40165030 + 339.91828 -chr16 61261359 61261509 + 338.57132 -chr16 61265306 61265377 + 338.57132 -chr16 61261360 61261509 - 338.57132 -chr16 61265306 61265376 - 338.57132 -chr16 61261438 61261509 + 338.57132 -chr16 61265306 61265456 + 338.57132 -chr16 61261439 61261509 - 338.57132 -chr16 61265306 61265455 - 338.57132 -chr6 155876025 155876076 - 336.32967 -chr6 155879892 155880041 - 336.32967 -chr6 155876024 155876076 + 336.32967 -chr6 155879892 155880042 + 336.32967 -chr6 155875926 155876076 - 336.32967 -chr6 155879892 155879942 - 336.32967 -chr1 224661531 224661681 - 334.48922 -chr1 224665451 224665547 - 334.48922 -chr1 224661583 224661681 + 334.48922 -chr1 224665451 224665601 + 334.48922 -chr1 224661584 224661681 - 334.48922 -chr1 224665451 224665600 - 334.48922 +chr14 44123158 44123308 + 465.63275 + +chr14 44127026 44127176 + 465.63275 + +chr14 44123159 44123308 - 465.63275 - +chr14 44127026 44127175 - 465.63275 - +chr1 114356587 114356736 - 441.00102 - +chr1 114360454 114360603 - 441.00102 - +chr1 114356586 114356736 + 441.00102 + +chr1 114360454 114360604 + 441.00102 + +chrX 9700334 9700484 - 418.31102 - +chrX 9704202 9704352 - 418.31102 - +chr15 54632158 54632308 + 410.28758 + +chr15 54636060 54636176 + 410.28758 + +chr15 54632159 54632308 - 410.28758 - +chr15 54636060 54636175 - 410.28758 - +chr15 54632192 54632308 - 410.28758 - +chr15 54636060 54636210 - 410.28758 - +chr15 54632193 54632308 + 410.28758 + +chr15 54636060 54636209 + 410.28758 + +chr6 53009844 53009994 + 398.10126 + +chr6 53013712 53013862 + 398.10126 + +chr16 4279536 4279624 + 394.95247 + +chr16 4283404 4283554 + 394.95247 + +chr16 4279474 4279624 + 394.95247 + +chr16 4283404 4283490 + 394.95247 + +chr16 4279537 4279624 - 394.95247 - +chr16 4283404 4283553 - 394.95247 - +chr7 152343847 152343935 - 390.20159 - +chr7 152347715 152347865 - 390.20159 - +chr7 152343848 152343935 + 390.20159 + +chr7 152347715 152347864 + 390.20159 + +chr7 152343786 152343935 + 390.20159 + +chr7 152347715 152347802 + 390.20159 + +chr7 152343785 152343935 - 390.20159 - +chr7 152347715 152347803 - 390.20159 - +chr16 63442391 63442541 - 389.524 - +chr16 63446302 63446409 - 389.524 - +chr16 63442392 63442541 + 389.524 + +chr16 63446302 63446408 + 389.524 + +chr16 63442436 63442541 - 389.524 - +chr16 63446302 63446452 - 389.524 - +chr6 41196658 41196741 - 388.86052 - +chr6 41200525 41200674 - 388.86052 - +chr6 41196657 41196741 + 388.86052 + +chr6 41200525 41200675 + 388.86052 + +chr6 41196592 41196741 + 388.86052 + +chr6 41200525 41200608 + 388.86052 + +chr6 41196591 41196741 - 388.86052 - +chr6 41200525 41200609 - 388.86052 - +chr20 36033923 36034073 + 384.11318 + +chr20 36037791 36037941 + 384.11318 + +chr20 36033924 36034073 - 384.11318 - +chr20 36037791 36037940 - 384.11318 - +chr12 57871837 57871987 - 380.55342 - +chr12 57875753 57875855 - 380.55342 - +chr12 57871885 57871987 - 380.55342 - +chr12 57875753 57875903 - 380.55342 - +chr8 22846344 22846494 + 372.97972 + +chr8 22850296 22850362 + 372.97972 + +chr8 22846345 22846494 - 372.97972 - +chr8 22850296 22850361 - 372.97972 - +chr8 22846428 22846494 + 372.97972 + +chr8 22850296 22850446 + 372.97972 + +chr17 45987626 45987736 + 370.32321 + +chr17 45991494 45991644 + 370.32321 + +chr17 45987627 45987736 - 370.32321 - +chr17 45991494 45991643 - 370.32321 - +chr17 45987587 45987736 - 370.32321 - +chr17 45991494 45991603 - 370.32321 - +chr17 45987586 45987736 + 370.32321 + +chr17 45991494 45991604 + 370.32321 + +chr3 48462689 48462778 + 367.84554 + +chr3 48466556 48466705 + 367.84554 + +chr3 48462688 48462778 - 367.84554 - +chr3 48466556 48466706 - 367.84554 - +chr3 48462628 48462778 - 367.84554 - +chr3 48466556 48466646 - 367.84554 - +chr20 33335286 33335348 - 367.5176 - +chr20 33339154 33339304 - 367.5176 - +chr20 33335198 33335348 - 367.5176 - +chr20 33339154 33339216 - 367.5176 - +chr20 33335199 33335348 + 367.5176 + +chr20 33339154 33339215 + 367.5176 + +chr1 150101535 150101649 + 365.77314 + +chr1 150105402 150105551 + 365.77314 + +chr1 150101534 150101649 - 365.77314 - +chr1 150105402 150105552 - 365.77314 - +chr1 150101499 150101649 + 365.77314 + +chr1 150105402 150105517 + 365.77314 + +chr17 42517551 42517701 - 359.33549 - +chr17 42521481 42521569 - 359.33549 - +chr17 42517613 42517701 - 359.33549 - +chr17 42521481 42521631 - 359.33549 - +chr17 42517552 42517701 + 359.33549 + +chr17 42521481 42521568 + 359.33549 + +chr6 15561986 15562057 - 358.9469 - +chr6 15565853 15566002 - 358.9469 - +chr6 15561907 15562057 + 358.9469 + +chr6 15565853 15565925 + 358.9469 + +chr6 15561908 15562057 - 358.9469 - +chr6 15565853 15565924 - 358.9469 - +chr6 15561985 15562057 + 358.9469 + +chr6 15565853 15566003 + 358.9469 + +chrX 99209453 99209603 - 358.41391 - +chrX 99213321 99213471 - 358.41391 - +chrX 99209454 99209603 + 358.41391 + +chrX 99213321 99213470 + 358.41391 + +chr2 44482827 44482977 + 357.20939 + +chr2 44486695 44486845 + 357.20939 + +chr19 43453207 43453357 - 355.83581 - +chr19 43457120 43457225 - 355.83581 - +chr19 43453253 43453357 + 355.83581 + +chr19 43457120 43457269 + 355.83581 + +chr19 43453252 43453357 - 355.83581 - +chr19 43457120 43457270 - 355.83581 - +chr17 44334564 44334713 - 354.9178 - +chr17 44338431 44338580 - 354.9178 - +chr17 44334563 44334713 + 354.9178 + +chr17 44338431 44338581 + 354.9178 + +chr5 138876711 138876861 + 352.26403 + +chr5 138880579 138880729 + 352.26403 + +chr17 82008681 82008700 - 351.42341 - +chr17 82012549 82012699 - 351.42341 - +chr17 82008550 82008700 - 351.42341 - +chr17 82012549 82012568 - 351.42341 - +chr17 82008682 82008700 + 351.42341 + +chr17 82012549 82012698 + 351.42341 + +chr15 38664851 38665000 + 350.08504 + +chr15 38668760 38668867 + 350.08504 + +chr15 38664850 38665000 - 350.08504 - +chr15 38668760 38668868 - 350.08504 - +chr15 38664892 38665000 - 350.08504 - +chr15 38668760 38668910 - 350.08504 - +chr15 38664893 38665000 + 350.08504 + +chr15 38668760 38668909 + 350.08504 + +chr1 9168135 9168218 + 349.08889 + +chr1 9172003 9172153 + 349.08889 + +chr1 9168136 9168218 - 349.08889 - +chr1 9172003 9172152 - 349.08889 - +chr1 9168068 9168218 + 349.08889 + +chr1 9172003 9172086 + 349.08889 + +chr9 145234697 145234810 - 348.5771 - +chr9 145238565 145238715 - 348.5771 - +chr9 145234661 145234810 - 348.5771 - +chr9 145238565 145238677 - 348.5771 - +chr9 145234660 145234810 + 348.5771 + +chr9 145238565 145238678 + 348.5771 + +chr6 73588200 73588289 + 345.89289 + +chr6 73592068 73592218 + 345.89289 + +chr6 73588139 73588289 - 345.89289 - +chr6 73592068 73592157 - 345.89289 - +chr19 41732348 41732498 - 345.26706 - +chr19 41736216 41736366 - 345.26706 - +chr19 41732349 41732498 + 345.26706 + +chr19 41736216 41736365 + 345.26706 + +chr20 59989038 59989135 + 345.12156 + +chr20 59992905 59993054 + 345.12156 + +chr20 59988985 59989135 - 345.12156 - +chr20 59992905 59993003 - 345.12156 - +chr20 59989037 59989135 - 345.12156 - +chr20 59992905 59993055 - 345.12156 - +chr21 24894312 24894462 - 344.78198 - +chr21 24898180 24898330 - 344.78198 - +chr21 24894313 24894462 + 344.78198 + +chr21 24898180 24898329 + 344.78198 + +chr14 17377274 17377423 - 341.73484 - +chr14 17381209 17381290 - 341.73484 - +chr14 17377273 17377423 + 341.73484 + +chr14 17381209 17381291 + 341.73484 + +chr14 17377341 17377423 + 341.73484 + +chr14 17381209 17381359 + 341.73484 + +chr19 44926037 44926186 - 341.02209 - +chr19 44929904 44930053 - 341.02209 - +chr19 44926036 44926186 + 341.02209 + +chr19 44929904 44930054 + 341.02209 + +chr5 111666908 111667058 + 339.94407 + +chr5 111670776 111670926 + 339.94407 + +chr20 40161013 40161163 - 339.91828 - +chr20 40164881 40165031 - 339.91828 - +chr20 40161014 40161163 + 339.91828 + +chr20 40164881 40165030 + 339.91828 + +chr16 61261359 61261509 + 338.57132 + +chr16 61265306 61265377 + 338.57132 + +chr16 61261360 61261509 - 338.57132 - +chr16 61265306 61265376 - 338.57132 - +chr16 61261438 61261509 + 338.57132 + +chr16 61265306 61265456 + 338.57132 + +chr16 61261439 61261509 - 338.57132 - +chr16 61265306 61265455 - 338.57132 - +chr6 155876025 155876076 - 336.32967 - +chr6 155879892 155880041 - 336.32967 - +chr6 155876024 155876076 + 336.32967 + +chr6 155879892 155880042 + 336.32967 + +chr6 155875926 155876076 - 336.32967 - +chr6 155879892 155879942 - 336.32967 - +chr1 224661531 224661681 - 334.48922 - +chr1 224665451 224665547 - 334.48922 - +chr1 224661583 224661681 + 334.48922 + +chr1 224665451 224665601 + 334.48922 + +chr1 224661584 224661681 - 334.48922 - +chr1 224665451 224665600 - 334.48922 - \ No newline at end of file diff --git a/dimelo/test/data/ctcf_demo_peak.bed b/dimelo/test/data/ctcf_demo_peak.bed index b5f1f460..279cd25f 100644 --- a/dimelo/test/data/ctcf_demo_peak.bed +++ b/dimelo/test/data/ctcf_demo_peak.bed @@ -1,100 +1,100 @@ -chr14 44125008 44125326 + 465.63275 -chr14 44125009 44125325 - 465.63275 -chr1 114358437 114358753 - 441.00102 -chr1 114358436 114358754 + 441.00102 -chrX 9702184 9702502 - 418.31102 -chr15 54634008 54634326 + 410.28758 -chr15 54634009 54634325 - 410.28758 -chr15 54634042 54634360 - 410.28758 -chr15 54634043 54634359 + 410.28758 -chr6 53011694 53012012 + 398.10126 -chr16 4281386 4281704 + 394.95247 -chr16 4281324 4281640 + 394.95247 -chr16 4281387 4281703 - 394.95247 -chr7 152345697 152346015 - 390.20159 -chr7 152345698 152346014 + 390.20159 -chr7 152345636 152345952 + 390.20159 -chr7 152345635 152345953 - 390.20159 -chr16 63444241 63444559 - 389.524 -chr16 63444242 63444558 + 389.524 -chr16 63444286 63444602 - 389.524 -chr6 41198508 41198824 - 388.86052 -chr6 41198507 41198825 + 388.86052 -chr6 41198442 41198758 + 388.86052 -chr6 41198441 41198759 - 388.86052 -chr20 36035773 36036091 + 384.11318 -chr20 36035774 36036090 - 384.11318 -chr12 57873687 57874005 - 380.55342 -chr12 57873735 57874053 - 380.55342 -chr8 22848194 22848512 + 372.97972 -chr8 22848195 22848511 - 372.97972 -chr8 22848278 22848596 + 372.97972 -chr17 45989476 45989794 + 370.32321 -chr17 45989477 45989793 - 370.32321 -chr17 45989437 45989753 - 370.32321 -chr17 45989436 45989754 + 370.32321 -chr3 48464539 48464855 + 367.84554 -chr3 48464538 48464856 - 367.84554 -chr3 48464478 48464796 - 367.84554 -chr20 33337136 33337454 - 367.5176 -chr20 33337048 33337366 - 367.5176 -chr20 33337049 33337365 + 367.5176 -chr1 150103385 150103701 + 365.77314 -chr1 150103384 150103702 - 365.77314 -chr1 150103349 150103667 + 365.77314 -chr17 42519401 42519719 - 359.33549 -chr17 42519463 42519781 - 359.33549 -chr17 42519402 42519718 + 359.33549 -chr6 15563836 15564152 - 358.9469 -chr6 15563757 15564075 + 358.9469 -chr6 15563758 15564074 - 358.9469 -chr6 15563835 15564153 + 358.9469 -chrX 99211303 99211621 - 358.41391 -chrX 99211304 99211620 + 358.41391 -chr2 44484677 44484995 + 357.20939 -chr19 43455057 43455375 - 355.83581 -chr19 43455103 43455419 + 355.83581 -chr19 43455102 43455420 - 355.83581 -chr17 44336414 44336730 - 354.9178 -chr17 44336413 44336731 + 354.9178 -chr5 138878561 138878879 + 352.26403 -chr17 82010531 82010849 - 351.42341 -chr17 82010400 82010718 - 351.42341 -chr17 82010532 82010848 + 351.42341 -chr15 38666701 38667017 + 350.08504 -chr15 38666700 38667018 - 350.08504 -chr15 38666742 38667060 - 350.08504 -chr15 38666743 38667059 + 350.08504 -chr1 9169985 9170303 + 349.08889 -chr1 9169986 9170302 - 349.08889 -chr1 9169918 9170236 + 349.08889 -chr9 145236547 145236865 - 348.5771 -chr9 145236511 145236827 - 348.5771 -chr9 145236510 145236828 + 348.5771 -chr6 73590050 73590368 + 345.89289 -chr6 73589989 73590307 - 345.89289 -chr19 41734198 41734516 - 345.26706 -chr19 41734199 41734515 + 345.26706 -chr20 59990888 59991204 + 345.12156 -chr20 59990835 59991153 - 345.12156 -chr20 59990887 59991205 - 345.12156 -chr21 24896162 24896480 - 344.78198 -chr21 24896163 24896479 + 344.78198 -chr14 17379124 17379440 - 341.73484 -chr14 17379123 17379441 + 341.73484 -chr14 17379191 17379509 + 341.73484 -chr19 44927887 44928203 - 341.02209 -chr19 44927886 44928204 + 341.02209 -chr5 111668758 111669076 + 339.94407 -chr20 40162863 40163181 - 339.91828 -chr20 40162864 40163180 + 339.91828 -chr16 61263209 61263527 + 338.57132 -chr16 61263210 61263526 - 338.57132 -chr16 61263288 61263606 + 338.57132 -chr16 61263289 61263605 - 338.57132 -chr6 155877875 155878191 - 336.32967 -chr6 155877874 155878192 + 336.32967 -chr6 155877776 155878092 - 336.32967 -chr1 224663381 224663697 - 334.48922 -chr1 224663433 224663751 + 334.48922 -chr1 224663434 224663750 - 334.48922 +chr14 44125008 44125326 + 465.63275 + +chr14 44125009 44125325 - 465.63275 - +chr1 114358437 114358753 - 441.00102 - +chr1 114358436 114358754 + 441.00102 + +chrX 9702184 9702502 - 418.31102 - +chr15 54634008 54634326 + 410.28758 + +chr15 54634009 54634325 - 410.28758 - +chr15 54634042 54634360 - 410.28758 - +chr15 54634043 54634359 + 410.28758 + +chr6 53011694 53012012 + 398.10126 + +chr16 4281386 4281704 + 394.95247 + +chr16 4281324 4281640 + 394.95247 + +chr16 4281387 4281703 - 394.95247 - +chr7 152345697 152346015 - 390.20159 - +chr7 152345698 152346014 + 390.20159 + +chr7 152345636 152345952 + 390.20159 + +chr7 152345635 152345953 - 390.20159 - +chr16 63444241 63444559 - 389.524 - +chr16 63444242 63444558 + 389.524 + +chr16 63444286 63444602 - 389.524 - +chr6 41198508 41198824 - 388.86052 - +chr6 41198507 41198825 + 388.86052 + +chr6 41198442 41198758 + 388.86052 + +chr6 41198441 41198759 - 388.86052 - +chr20 36035773 36036091 + 384.11318 + +chr20 36035774 36036090 - 384.11318 - +chr12 57873687 57874005 - 380.55342 - +chr12 57873735 57874053 - 380.55342 - +chr8 22848194 22848512 + 372.97972 + +chr8 22848195 22848511 - 372.97972 - +chr8 22848278 22848596 + 372.97972 + +chr17 45989476 45989794 + 370.32321 + +chr17 45989477 45989793 - 370.32321 - +chr17 45989437 45989753 - 370.32321 - +chr17 45989436 45989754 + 370.32321 + +chr3 48464539 48464855 + 367.84554 + +chr3 48464538 48464856 - 367.84554 - +chr3 48464478 48464796 - 367.84554 - +chr20 33337136 33337454 - 367.5176 - +chr20 33337048 33337366 - 367.5176 - +chr20 33337049 33337365 + 367.5176 + +chr1 150103385 150103701 + 365.77314 + +chr1 150103384 150103702 - 365.77314 - +chr1 150103349 150103667 + 365.77314 + +chr17 42519401 42519719 - 359.33549 - +chr17 42519463 42519781 - 359.33549 - +chr17 42519402 42519718 + 359.33549 + +chr6 15563836 15564152 - 358.9469 - +chr6 15563757 15564075 + 358.9469 + +chr6 15563758 15564074 - 358.9469 - +chr6 15563835 15564153 + 358.9469 + +chrX 99211303 99211621 - 358.41391 - +chrX 99211304 99211620 + 358.41391 + +chr2 44484677 44484995 + 357.20939 + +chr19 43455057 43455375 - 355.83581 - +chr19 43455103 43455419 + 355.83581 + +chr19 43455102 43455420 - 355.83581 - +chr17 44336414 44336730 - 354.9178 - +chr17 44336413 44336731 + 354.9178 + +chr5 138878561 138878879 + 352.26403 + +chr17 82010531 82010849 - 351.42341 - +chr17 82010400 82010718 - 351.42341 - +chr17 82010532 82010848 + 351.42341 + +chr15 38666701 38667017 + 350.08504 + +chr15 38666700 38667018 - 350.08504 - +chr15 38666742 38667060 - 350.08504 - +chr15 38666743 38667059 + 350.08504 + +chr1 9169985 9170303 + 349.08889 + +chr1 9169986 9170302 - 349.08889 - +chr1 9169918 9170236 + 349.08889 + +chr9 145236547 145236865 - 348.5771 - +chr9 145236511 145236827 - 348.5771 - +chr9 145236510 145236828 + 348.5771 + +chr6 73590050 73590368 + 345.89289 + +chr6 73589989 73590307 - 345.89289 - +chr19 41734198 41734516 - 345.26706 - +chr19 41734199 41734515 + 345.26706 + +chr20 59990888 59991204 + 345.12156 + +chr20 59990835 59991153 - 345.12156 - +chr20 59990887 59991205 - 345.12156 - +chr21 24896162 24896480 - 344.78198 - +chr21 24896163 24896479 + 344.78198 + +chr14 17379124 17379440 - 341.73484 - +chr14 17379123 17379441 + 341.73484 + +chr14 17379191 17379509 + 341.73484 + +chr19 44927887 44928203 - 341.02209 - +chr19 44927886 44928204 + 341.02209 + +chr5 111668758 111669076 + 339.94407 + +chr20 40162863 40163181 - 339.91828 - +chr20 40162864 40163180 + 339.91828 + +chr16 61263209 61263527 + 338.57132 + +chr16 61263210 61263526 - 338.57132 - +chr16 61263288 61263606 + 338.57132 + +chr16 61263289 61263605 - 338.57132 - +chr6 155877875 155878191 - 336.32967 - +chr6 155877874 155878192 + 336.32967 + +chr6 155877776 155878092 - 336.32967 - +chr1 224663381 224663697 - 334.48922 - +chr1 224663433 224663751 + 334.48922 + +chr1 224663434 224663750 - 334.48922 - \ No newline at end of file diff --git a/dimelo/test/data/test_targets/megalodon_peaks_190/pileup.sorted.bed.gz b/dimelo/test/data/test_targets/megalodon_peaks_190/pileup.sorted.bed.gz new file mode 100644 index 00000000..5d20e1ee Binary files /dev/null and b/dimelo/test/data/test_targets/megalodon_peaks_190/pileup.sorted.bed.gz differ diff --git a/dimelo/test/data/test_targets/megalodon_peaks_190/pileup.sorted.bed.gz.tbi b/dimelo/test/data/test_targets/megalodon_peaks_190/pileup.sorted.bed.gz.tbi new file mode 100644 index 00000000..57239118 Binary files /dev/null and b/dimelo/test/data/test_targets/megalodon_peaks_190/pileup.sorted.bed.gz.tbi differ diff --git a/dimelo/test/data/test_targets/megalodon_peaks_190/reads.combined_basemods.h5 b/dimelo/test/data/test_targets/megalodon_peaks_190/reads.combined_basemods.h5 new file mode 100644 index 00000000..919ca88e Binary files /dev/null and b/dimelo/test/data/test_targets/megalodon_peaks_190/reads.combined_basemods.h5 differ diff --git a/dimelo/test/data/test_targets/megalodon_peaks_190/regions.processed.bed b/dimelo/test/data/test_targets/megalodon_peaks_190/regions.processed.bed new file mode 100644 index 00000000..c1f808c2 --- /dev/null +++ b/dimelo/test/data/test_targets/megalodon_peaks_190/regions.processed.bed @@ -0,0 +1,300 @@ +chr14 17372348 17382348 . . . +chr14 17372348 17382348 . . . +chr14 17372382 17382382 . . . +chr14 17374282 17384282 . . . +chr14 17374282 17384282 . . . +chr14 17374350 17384350 . . . +chr14 17376249 17386249 . . . +chr14 17376250 17386250 . . . +chr14 17376284 17386284 . . . +chr14 44118233 44128233 . . . +chr14 44118233 44128233 . . . +chr14 44120167 44130167 . . . +chr14 44120167 44130167 . . . +chr14 44122100 44132100 . . . +chr14 44122101 44132101 . . . +chr1 9163143 9173143 . . . +chr1 9163176 9173176 . . . +chr1 9163177 9173177 . . . +chr1 9165077 9175077 . . . +chr1 9165144 9175144 . . . +chr1 9165144 9175144 . . . +chr1 9167044 9177044 . . . +chr1 9167077 9177077 . . . +chr1 9167078 9177078 . . . +chr1 114351661 114361661 . . . +chr1 114351661 114361661 . . . +chr1 114353595 114363595 . . . +chr1 114353595 114363595 . . . +chr1 114355528 114365528 . . . +chr1 114355529 114365529 . . . +chr1 150096574 150106574 . . . +chr1 150096591 150106591 . . . +chr1 150096592 150106592 . . . +chr1 150098508 150108508 . . . +chr1 150098543 150108543 . . . +chr1 150098543 150108543 . . . +chr1 150100459 150110459 . . . +chr1 150100476 150110476 . . . +chr1 150100477 150110477 . . . +chr1 224656606 224666606 . . . +chr1 224656632 224666632 . . . +chr1 224656632 224666632 . . . +chr1 224658539 224668539 . . . +chr1 224658592 224668592 . . . +chr1 224658592 224668592 . . . +chr1 224660499 224670499 . . . +chr1 224660525 224670525 . . . +chr1 224660526 224670526 . . . +chrX 9695409 9705409 . . . +chrX 9697343 9707343 . . . +chrX 9699277 9709277 . . . +chrX 99204528 99214528 . . . +chrX 99204528 99214528 . . . +chrX 99206462 99216462 . . . +chrX 99206462 99216462 . . . +chrX 99208395 99218395 . . . +chrX 99208396 99218396 . . . +chr15 38659925 38669925 . . . +chr15 38659925 38669925 . . . +chr15 38659946 38669946 . . . +chr15 38659946 38669946 . . . +chr15 38661859 38671859 . . . +chr15 38661859 38671859 . . . +chr15 38661901 38671901 . . . +chr15 38661901 38671901 . . . +chr15 38663813 38673813 . . . +chr15 38663814 38673814 . . . +chr15 38663834 38673834 . . . +chr15 38663835 38673835 . . . +chr15 54627233 54637233 . . . +chr15 54627233 54637233 . . . +chr15 54627250 54637250 . . . +chr15 54627250 54637250 . . . +chr15 54629167 54639167 . . . +chr15 54629167 54639167 . . . +chr15 54629201 54639201 . . . +chr15 54629201 54639201 . . . +chr15 54631117 54641117 . . . +chr15 54631118 54641118 . . . +chr15 54631134 54641134 . . . +chr15 54631135 54641135 . . . +chr6 15556982 15566982 . . . +chr6 15556982 15566982 . . . +chr6 15557021 15567021 . . . +chr6 15557021 15567021 . . . +chr6 15558916 15568916 . . . +chr6 15558916 15568916 . . . +chr6 15558994 15568994 . . . +chr6 15558994 15568994 . . . +chr6 15560888 15570888 . . . +chr6 15560889 15570889 . . . +chr6 15560927 15570927 . . . +chr6 15560928 15570928 . . . +chr6 41191666 41201666 . . . +chr6 41191666 41201666 . . . +chr6 41191699 41201699 . . . +chr6 41191699 41201699 . . . +chr6 41193600 41203600 . . . +chr6 41193600 41203600 . . . +chr6 41193666 41203666 . . . +chr6 41193666 41203666 . . . +chr6 41195566 41205566 . . . +chr6 41195567 41205567 . . . +chr6 41195599 41205599 . . . +chr6 41195600 41205600 . . . +chr6 53004919 53014919 . . . +chr6 53006853 53016853 . . . +chr6 53008787 53018787 . . . +chr6 73583214 73593214 . . . +chr6 73583244 73593244 . . . +chr6 73585148 73595148 . . . +chr6 73585209 73595209 . . . +chr6 73587112 73597112 . . . +chr6 73587143 73597143 . . . +chr6 155871001 155881001 . . . +chr6 155871050 155881050 . . . +chr6 155871050 155881050 . . . +chr6 155872934 155882934 . . . +chr6 155873033 155883033 . . . +chr6 155873033 155883033 . . . +chr6 155874917 155884917 . . . +chr6 155874966 155884966 . . . +chr6 155874967 155884967 . . . +chr16 4274549 4284549 . . . +chr16 4274580 4284580 . . . +chr16 4274580 4284580 . . . +chr16 4276482 4286482 . . . +chr16 4276545 4286545 . . . +chr16 4276545 4286545 . . . +chr16 4278447 4288447 . . . +chr16 4278478 4288478 . . . +chr16 4278479 4288479 . . . +chr16 61256434 61266434 . . . +chr16 61256434 61266434 . . . +chr16 61256473 61266473 . . . +chr16 61256474 61266474 . . . +chr16 61258368 61268368 . . . +chr16 61258368 61268368 . . . +chr16 61258447 61268447 . . . +chr16 61258447 61268447 . . . +chr16 61260341 61270341 . . . +chr16 61260341 61270341 . . . +chr16 61260380 61270380 . . . +chr16 61260381 61270381 . . . +chr16 63437466 63447466 . . . +chr16 63437466 63447466 . . . +chr16 63437488 63447488 . . . +chr16 63439400 63449400 . . . +chr16 63439400 63449400 . . . +chr16 63439444 63449444 . . . +chr16 63441355 63451355 . . . +chr16 63441355 63451355 . . . +chr16 63441377 63451377 . . . +chr7 152338860 152348860 . . . +chr7 152338860 152348860 . . . +chr7 152338891 152348891 . . . +chr7 152338891 152348891 . . . +chr7 152340794 152350794 . . . +chr7 152340794 152350794 . . . +chr7 152340856 152350856 . . . +chr7 152340856 152350856 . . . +chr7 152342758 152352758 . . . +chr7 152342759 152352759 . . . +chr7 152342789 152352789 . . . +chr7 152342790 152352790 . . . +chr20 33330273 33340273 . . . +chr20 33330273 33340273 . . . +chr20 33330317 33340317 . . . +chr20 33332207 33342207 . . . +chr20 33332207 33342207 . . . +chr20 33332295 33342295 . . . +chr20 33334184 33344184 . . . +chr20 33334185 33344185 . . . +chr20 33334229 33344229 . . . +chr20 36028998 36038998 . . . +chr20 36028998 36038998 . . . +chr20 36030932 36040932 . . . +chr20 36030932 36040932 . . . +chr20 36032865 36042865 . . . +chr20 36032866 36042866 . . . +chr20 40156088 40166088 . . . +chr20 40156088 40166088 . . . +chr20 40158022 40168022 . . . +chr20 40158022 40168022 . . . +chr20 40159955 40169955 . . . +chr20 40159956 40169956 . . . +chr20 59984060 59994060 . . . +chr20 59984086 59994086 . . . +chr20 59984086 59994086 . . . +chr20 59985994 59995994 . . . +chr20 59986046 59996046 . . . +chr20 59986046 59996046 . . . +chr20 59987954 59997954 . . . +chr20 59987979 59997979 . . . +chr20 59987980 59997980 . . . +chr12 57866912 57876912 . . . +chr12 57866936 57876936 . . . +chr12 57868846 57878846 . . . +chr12 57868894 57878894 . . . +chr12 57870804 57880804 . . . +chr12 57870828 57880828 . . . +chr8 22841419 22851419 . . . +chr8 22841419 22851419 . . . +chr8 22841461 22851461 . . . +chr8 22843353 22853353 . . . +chr8 22843353 22853353 . . . +chr8 22843437 22853437 . . . +chr8 22845328 22855328 . . . +chr8 22845329 22855329 . . . +chr8 22845371 22855371 . . . +chr17 42512626 42522626 . . . +chr17 42512626 42522626 . . . +chr17 42512657 42522657 . . . +chr17 42514560 42524560 . . . +chr17 42514560 42524560 . . . +chr17 42514622 42524622 . . . +chr17 42516524 42526524 . . . +chr17 42516525 42526525 . . . +chr17 42516556 42526556 . . . +chr17 44329638 44339638 . . . +chr17 44329638 44339638 . . . +chr17 44331572 44341572 . . . +chr17 44331572 44341572 . . . +chr17 44333505 44343505 . . . +chr17 44333506 44343506 . . . +chr17 45982661 45992661 . . . +chr17 45982661 45992661 . . . +chr17 45982681 45992681 . . . +chr17 45982681 45992681 . . . +chr17 45984595 45994595 . . . +chr17 45984595 45994595 . . . +chr17 45984635 45994635 . . . +chr17 45984635 45994635 . . . +chr17 45986548 45996548 . . . +chr17 45986549 45996549 . . . +chr17 45986568 45996568 . . . +chr17 45986569 45996569 . . . +chr17 82003625 82013625 . . . +chr17 82003690 82013690 . . . +chr17 82003691 82013691 . . . +chr17 82005559 82015559 . . . +chr17 82005690 82015690 . . . +chr17 82005690 82015690 . . . +chr17 82007558 82017558 . . . +chr17 82007623 82017623 . . . +chr17 82007624 82017624 . . . +chr3 48457703 48467703 . . . +chr3 48457733 48467733 . . . +chr3 48457733 48467733 . . . +chr3 48459637 48469637 . . . +chr3 48459697 48469697 . . . +chr3 48459697 48469697 . . . +chr3 48461601 48471601 . . . +chr3 48461630 48471630 . . . +chr3 48461631 48471631 . . . +chr2 44477902 44487902 . . . +chr2 44479836 44489836 . . . +chr2 44481770 44491770 . . . +chr19 41727423 41737423 . . . +chr19 41727423 41737423 . . . +chr19 41729357 41739357 . . . +chr19 41729357 41739357 . . . +chr19 41731290 41741290 . . . +chr19 41731291 41741291 . . . +chr19 43448282 43458282 . . . +chr19 43448304 43458304 . . . +chr19 43448305 43458305 . . . +chr19 43450216 43460216 . . . +chr19 43450261 43460261 . . . +chr19 43450261 43460261 . . . +chr19 43452172 43462172 . . . +chr19 43452194 43462194 . . . +chr19 43452195 43462195 . . . +chr19 44921111 44931111 . . . +chr19 44921111 44931111 . . . +chr19 44923045 44933045 . . . +chr19 44923045 44933045 . . . +chr19 44924978 44934978 . . . +chr19 44924979 44934979 . . . +chr5 111661983 111671983 . . . +chr5 111663917 111673917 . . . +chr5 111665851 111675851 . . . +chr5 138871786 138881786 . . . +chr5 138873720 138883720 . . . +chr5 138875654 138885654 . . . +chr9 145229735 145239735 . . . +chr9 145229735 145239735 . . . +chr9 145229753 145239753 . . . +chr9 145231669 145241669 . . . +chr9 145231669 145241669 . . . +chr9 145231706 145241706 . . . +chr9 145233621 145243621 . . . +chr9 145233621 145243621 . . . +chr9 145233640 145243640 . . . +chr21 24889387 24899387 . . . +chr21 24889387 24899387 . . . +chr21 24891321 24901321 . . . +chr21 24891321 24901321 . . . +chr21 24893254 24903254 . . . +chr21 24893255 24903255 . . . diff --git a/dimelo/test/data/test_targets/megalodon_peaks_nothresh/pileup.sorted.bed.gz b/dimelo/test/data/test_targets/megalodon_peaks_nothresh/pileup.sorted.bed.gz new file mode 100644 index 00000000..1cdb265a Binary files /dev/null and b/dimelo/test/data/test_targets/megalodon_peaks_nothresh/pileup.sorted.bed.gz differ diff --git a/dimelo/test/data/test_targets/megalodon_peaks_nothresh/pileup.sorted.bed.gz.tbi b/dimelo/test/data/test_targets/megalodon_peaks_nothresh/pileup.sorted.bed.gz.tbi new file mode 100644 index 00000000..e9d81ca3 Binary files /dev/null and b/dimelo/test/data/test_targets/megalodon_peaks_nothresh/pileup.sorted.bed.gz.tbi differ diff --git a/dimelo/test/data/test_targets/megalodon_peaks_nothresh/reads.combined_basemods.h5 b/dimelo/test/data/test_targets/megalodon_peaks_nothresh/reads.combined_basemods.h5 new file mode 100644 index 00000000..0a784b5b Binary files /dev/null and b/dimelo/test/data/test_targets/megalodon_peaks_nothresh/reads.combined_basemods.h5 differ diff --git a/dimelo/test/data/test_targets/megalodon_peaks_nothresh/regions.processed.bed b/dimelo/test/data/test_targets/megalodon_peaks_nothresh/regions.processed.bed new file mode 100644 index 00000000..c1f808c2 --- /dev/null +++ b/dimelo/test/data/test_targets/megalodon_peaks_nothresh/regions.processed.bed @@ -0,0 +1,300 @@ +chr14 17372348 17382348 . . . +chr14 17372348 17382348 . . . +chr14 17372382 17382382 . . . +chr14 17374282 17384282 . . . +chr14 17374282 17384282 . . . +chr14 17374350 17384350 . . . +chr14 17376249 17386249 . . . +chr14 17376250 17386250 . . . +chr14 17376284 17386284 . . . +chr14 44118233 44128233 . . . +chr14 44118233 44128233 . . . +chr14 44120167 44130167 . . . +chr14 44120167 44130167 . . . +chr14 44122100 44132100 . . . +chr14 44122101 44132101 . . . +chr1 9163143 9173143 . . . +chr1 9163176 9173176 . . . +chr1 9163177 9173177 . . . +chr1 9165077 9175077 . . . +chr1 9165144 9175144 . . . +chr1 9165144 9175144 . . . +chr1 9167044 9177044 . . . +chr1 9167077 9177077 . . . +chr1 9167078 9177078 . . . +chr1 114351661 114361661 . . . +chr1 114351661 114361661 . . . +chr1 114353595 114363595 . . . +chr1 114353595 114363595 . . . +chr1 114355528 114365528 . . . +chr1 114355529 114365529 . . . +chr1 150096574 150106574 . . . +chr1 150096591 150106591 . . . +chr1 150096592 150106592 . . . +chr1 150098508 150108508 . . . +chr1 150098543 150108543 . . . +chr1 150098543 150108543 . . . +chr1 150100459 150110459 . . . +chr1 150100476 150110476 . . . +chr1 150100477 150110477 . . . +chr1 224656606 224666606 . . . +chr1 224656632 224666632 . . . +chr1 224656632 224666632 . . . +chr1 224658539 224668539 . . . +chr1 224658592 224668592 . . . +chr1 224658592 224668592 . . . +chr1 224660499 224670499 . . . +chr1 224660525 224670525 . . . +chr1 224660526 224670526 . . . +chrX 9695409 9705409 . . . +chrX 9697343 9707343 . . . +chrX 9699277 9709277 . . . +chrX 99204528 99214528 . . . +chrX 99204528 99214528 . . . +chrX 99206462 99216462 . . . +chrX 99206462 99216462 . . . +chrX 99208395 99218395 . . . +chrX 99208396 99218396 . . . +chr15 38659925 38669925 . . . +chr15 38659925 38669925 . . . +chr15 38659946 38669946 . . . +chr15 38659946 38669946 . . . +chr15 38661859 38671859 . . . +chr15 38661859 38671859 . . . +chr15 38661901 38671901 . . . +chr15 38661901 38671901 . . . +chr15 38663813 38673813 . . . +chr15 38663814 38673814 . . . +chr15 38663834 38673834 . . . +chr15 38663835 38673835 . . . +chr15 54627233 54637233 . . . +chr15 54627233 54637233 . . . +chr15 54627250 54637250 . . . +chr15 54627250 54637250 . . . +chr15 54629167 54639167 . . . +chr15 54629167 54639167 . . . +chr15 54629201 54639201 . . . +chr15 54629201 54639201 . . . +chr15 54631117 54641117 . . . +chr15 54631118 54641118 . . . +chr15 54631134 54641134 . . . +chr15 54631135 54641135 . . . +chr6 15556982 15566982 . . . +chr6 15556982 15566982 . . . +chr6 15557021 15567021 . . . +chr6 15557021 15567021 . . . +chr6 15558916 15568916 . . . +chr6 15558916 15568916 . . . +chr6 15558994 15568994 . . . +chr6 15558994 15568994 . . . +chr6 15560888 15570888 . . . +chr6 15560889 15570889 . . . +chr6 15560927 15570927 . . . +chr6 15560928 15570928 . . . +chr6 41191666 41201666 . . . +chr6 41191666 41201666 . . . +chr6 41191699 41201699 . . . +chr6 41191699 41201699 . . . +chr6 41193600 41203600 . . . +chr6 41193600 41203600 . . . +chr6 41193666 41203666 . . . +chr6 41193666 41203666 . . . +chr6 41195566 41205566 . . . +chr6 41195567 41205567 . . . +chr6 41195599 41205599 . . . +chr6 41195600 41205600 . . . +chr6 53004919 53014919 . . . +chr6 53006853 53016853 . . . +chr6 53008787 53018787 . . . +chr6 73583214 73593214 . . . +chr6 73583244 73593244 . . . +chr6 73585148 73595148 . . . +chr6 73585209 73595209 . . . +chr6 73587112 73597112 . . . +chr6 73587143 73597143 . . . +chr6 155871001 155881001 . . . +chr6 155871050 155881050 . . . +chr6 155871050 155881050 . . . +chr6 155872934 155882934 . . . +chr6 155873033 155883033 . . . +chr6 155873033 155883033 . . . +chr6 155874917 155884917 . . . +chr6 155874966 155884966 . . . +chr6 155874967 155884967 . . . +chr16 4274549 4284549 . . . +chr16 4274580 4284580 . . . +chr16 4274580 4284580 . . . +chr16 4276482 4286482 . . . +chr16 4276545 4286545 . . . +chr16 4276545 4286545 . . . +chr16 4278447 4288447 . . . +chr16 4278478 4288478 . . . +chr16 4278479 4288479 . . . +chr16 61256434 61266434 . . . +chr16 61256434 61266434 . . . +chr16 61256473 61266473 . . . +chr16 61256474 61266474 . . . +chr16 61258368 61268368 . . . +chr16 61258368 61268368 . . . +chr16 61258447 61268447 . . . +chr16 61258447 61268447 . . . +chr16 61260341 61270341 . . . +chr16 61260341 61270341 . . . +chr16 61260380 61270380 . . . +chr16 61260381 61270381 . . . +chr16 63437466 63447466 . . . +chr16 63437466 63447466 . . . +chr16 63437488 63447488 . . . +chr16 63439400 63449400 . . . +chr16 63439400 63449400 . . . +chr16 63439444 63449444 . . . +chr16 63441355 63451355 . . . +chr16 63441355 63451355 . . . +chr16 63441377 63451377 . . . +chr7 152338860 152348860 . . . +chr7 152338860 152348860 . . . +chr7 152338891 152348891 . . . +chr7 152338891 152348891 . . . +chr7 152340794 152350794 . . . +chr7 152340794 152350794 . . . +chr7 152340856 152350856 . . . +chr7 152340856 152350856 . . . +chr7 152342758 152352758 . . . +chr7 152342759 152352759 . . . +chr7 152342789 152352789 . . . +chr7 152342790 152352790 . . . +chr20 33330273 33340273 . . . +chr20 33330273 33340273 . . . +chr20 33330317 33340317 . . . +chr20 33332207 33342207 . . . +chr20 33332207 33342207 . . . +chr20 33332295 33342295 . . . +chr20 33334184 33344184 . . . +chr20 33334185 33344185 . . . +chr20 33334229 33344229 . . . +chr20 36028998 36038998 . . . +chr20 36028998 36038998 . . . +chr20 36030932 36040932 . . . +chr20 36030932 36040932 . . . +chr20 36032865 36042865 . . . +chr20 36032866 36042866 . . . +chr20 40156088 40166088 . . . +chr20 40156088 40166088 . . . +chr20 40158022 40168022 . . . +chr20 40158022 40168022 . . . +chr20 40159955 40169955 . . . +chr20 40159956 40169956 . . . +chr20 59984060 59994060 . . . +chr20 59984086 59994086 . . . +chr20 59984086 59994086 . . . +chr20 59985994 59995994 . . . +chr20 59986046 59996046 . . . +chr20 59986046 59996046 . . . +chr20 59987954 59997954 . . . +chr20 59987979 59997979 . . . +chr20 59987980 59997980 . . . +chr12 57866912 57876912 . . . +chr12 57866936 57876936 . . . +chr12 57868846 57878846 . . . +chr12 57868894 57878894 . . . +chr12 57870804 57880804 . . . +chr12 57870828 57880828 . . . +chr8 22841419 22851419 . . . +chr8 22841419 22851419 . . . +chr8 22841461 22851461 . . . +chr8 22843353 22853353 . . . +chr8 22843353 22853353 . . . +chr8 22843437 22853437 . . . +chr8 22845328 22855328 . . . +chr8 22845329 22855329 . . . +chr8 22845371 22855371 . . . +chr17 42512626 42522626 . . . +chr17 42512626 42522626 . . . +chr17 42512657 42522657 . . . +chr17 42514560 42524560 . . . +chr17 42514560 42524560 . . . +chr17 42514622 42524622 . . . +chr17 42516524 42526524 . . . +chr17 42516525 42526525 . . . +chr17 42516556 42526556 . . . +chr17 44329638 44339638 . . . +chr17 44329638 44339638 . . . +chr17 44331572 44341572 . . . +chr17 44331572 44341572 . . . +chr17 44333505 44343505 . . . +chr17 44333506 44343506 . . . +chr17 45982661 45992661 . . . +chr17 45982661 45992661 . . . +chr17 45982681 45992681 . . . +chr17 45982681 45992681 . . . +chr17 45984595 45994595 . . . +chr17 45984595 45994595 . . . +chr17 45984635 45994635 . . . +chr17 45984635 45994635 . . . +chr17 45986548 45996548 . . . +chr17 45986549 45996549 . . . +chr17 45986568 45996568 . . . +chr17 45986569 45996569 . . . +chr17 82003625 82013625 . . . +chr17 82003690 82013690 . . . +chr17 82003691 82013691 . . . +chr17 82005559 82015559 . . . +chr17 82005690 82015690 . . . +chr17 82005690 82015690 . . . +chr17 82007558 82017558 . . . +chr17 82007623 82017623 . . . +chr17 82007624 82017624 . . . +chr3 48457703 48467703 . . . +chr3 48457733 48467733 . . . +chr3 48457733 48467733 . . . +chr3 48459637 48469637 . . . +chr3 48459697 48469697 . . . +chr3 48459697 48469697 . . . +chr3 48461601 48471601 . . . +chr3 48461630 48471630 . . . +chr3 48461631 48471631 . . . +chr2 44477902 44487902 . . . +chr2 44479836 44489836 . . . +chr2 44481770 44491770 . . . +chr19 41727423 41737423 . . . +chr19 41727423 41737423 . . . +chr19 41729357 41739357 . . . +chr19 41729357 41739357 . . . +chr19 41731290 41741290 . . . +chr19 41731291 41741291 . . . +chr19 43448282 43458282 . . . +chr19 43448304 43458304 . . . +chr19 43448305 43458305 . . . +chr19 43450216 43460216 . . . +chr19 43450261 43460261 . . . +chr19 43450261 43460261 . . . +chr19 43452172 43462172 . . . +chr19 43452194 43462194 . . . +chr19 43452195 43462195 . . . +chr19 44921111 44931111 . . . +chr19 44921111 44931111 . . . +chr19 44923045 44933045 . . . +chr19 44923045 44933045 . . . +chr19 44924978 44934978 . . . +chr19 44924979 44934979 . . . +chr5 111661983 111671983 . . . +chr5 111663917 111673917 . . . +chr5 111665851 111675851 . . . +chr5 138871786 138881786 . . . +chr5 138873720 138883720 . . . +chr5 138875654 138885654 . . . +chr9 145229735 145239735 . . . +chr9 145229735 145239735 . . . +chr9 145229753 145239753 . . . +chr9 145231669 145241669 . . . +chr9 145231669 145241669 . . . +chr9 145231706 145241706 . . . +chr9 145233621 145243621 . . . +chr9 145233621 145243621 . . . +chr9 145233640 145243640 . . . +chr21 24889387 24899387 . . . +chr21 24889387 24899387 . . . +chr21 24891321 24901321 . . . +chr21 24891321 24901321 . . . +chr21 24893254 24903254 . . . +chr21 24893255 24903255 . . . diff --git a/dimelo/test/data/test_targets/megalodon_single_190/pileup.sorted.bed.gz b/dimelo/test/data/test_targets/megalodon_single_190/pileup.sorted.bed.gz new file mode 100644 index 00000000..37fbc1ff Binary files /dev/null and b/dimelo/test/data/test_targets/megalodon_single_190/pileup.sorted.bed.gz differ diff --git a/dimelo/test/data/test_targets/megalodon_single_190/pileup.sorted.bed.gz.tbi b/dimelo/test/data/test_targets/megalodon_single_190/pileup.sorted.bed.gz.tbi new file mode 100644 index 00000000..6d91384a Binary files /dev/null and b/dimelo/test/data/test_targets/megalodon_single_190/pileup.sorted.bed.gz.tbi differ diff --git a/dimelo/test/data/test_targets/megalodon_single_190/reads.combined_basemods.h5 b/dimelo/test/data/test_targets/megalodon_single_190/reads.combined_basemods.h5 new file mode 100644 index 00000000..c90abc1c Binary files /dev/null and b/dimelo/test/data/test_targets/megalodon_single_190/reads.combined_basemods.h5 differ diff --git a/dimelo/test/data/test_targets/megalodon_single_190/regions.processed.bed b/dimelo/test/data/test_targets/megalodon_single_190/regions.processed.bed new file mode 100644 index 00000000..efac1073 --- /dev/null +++ b/dimelo/test/data/test_targets/megalodon_single_190/regions.processed.bed @@ -0,0 +1 @@ +chr1 114357437 114359753 . . . diff --git a/dimelo/test/data/test_targets/megalodon_single_and_peaks_190/pileup.sorted.bed.gz b/dimelo/test/data/test_targets/megalodon_single_and_peaks_190/pileup.sorted.bed.gz new file mode 100644 index 00000000..5d20e1ee Binary files /dev/null and b/dimelo/test/data/test_targets/megalodon_single_and_peaks_190/pileup.sorted.bed.gz differ diff --git a/dimelo/test/data/test_targets/megalodon_single_and_peaks_190/pileup.sorted.bed.gz.tbi b/dimelo/test/data/test_targets/megalodon_single_and_peaks_190/pileup.sorted.bed.gz.tbi new file mode 100644 index 00000000..57239118 Binary files /dev/null and b/dimelo/test/data/test_targets/megalodon_single_and_peaks_190/pileup.sorted.bed.gz.tbi differ diff --git a/dimelo/test/data/test_targets/megalodon_single_and_peaks_190/reads.combined_basemods.h5 b/dimelo/test/data/test_targets/megalodon_single_and_peaks_190/reads.combined_basemods.h5 new file mode 100644 index 00000000..0f669282 Binary files /dev/null and b/dimelo/test/data/test_targets/megalodon_single_and_peaks_190/reads.combined_basemods.h5 differ diff --git a/dimelo/test/data/test_targets/megalodon_single_and_peaks_190/regions.processed.bed b/dimelo/test/data/test_targets/megalodon_single_and_peaks_190/regions.processed.bed new file mode 100644 index 00000000..60a3c5ca --- /dev/null +++ b/dimelo/test/data/test_targets/megalodon_single_and_peaks_190/regions.processed.bed @@ -0,0 +1,301 @@ +chr1 9163143 9173143 . . . +chr1 9163176 9173176 . . . +chr1 9163177 9173177 . . . +chr1 9165077 9175077 . . . +chr1 9165144 9175144 . . . +chr1 9165144 9175144 . . . +chr1 9167044 9177044 . . . +chr1 9167077 9177077 . . . +chr1 9167078 9177078 . . . +chr1 114351661 114361661 . . . +chr1 114351661 114361661 . . . +chr1 114353595 114363595 . . . +chr1 114353595 114363595 . . . +chr1 114353595 114363595 . . . +chr1 114355528 114365528 . . . +chr1 114355529 114365529 . . . +chr1 150096574 150106574 . . . +chr1 150096591 150106591 . . . +chr1 150096592 150106592 . . . +chr1 150098508 150108508 . . . +chr1 150098543 150108543 . . . +chr1 150098543 150108543 . . . +chr1 150100459 150110459 . . . +chr1 150100476 150110476 . . . +chr1 150100477 150110477 . . . +chr1 224656606 224666606 . . . +chr1 224656632 224666632 . . . +chr1 224656632 224666632 . . . +chr1 224658539 224668539 . . . +chr1 224658592 224668592 . . . +chr1 224658592 224668592 . . . +chr1 224660499 224670499 . . . +chr1 224660525 224670525 . . . +chr1 224660526 224670526 . . . +chr14 17372348 17382348 . . . +chr14 17372348 17382348 . . . +chr14 17372382 17382382 . . . +chr14 17374282 17384282 . . . +chr14 17374282 17384282 . . . +chr14 17374350 17384350 . . . +chr14 17376249 17386249 . . . +chr14 17376250 17386250 . . . +chr14 17376284 17386284 . . . +chr14 44118233 44128233 . . . +chr14 44118233 44128233 . . . +chr14 44120167 44130167 . . . +chr14 44120167 44130167 . . . +chr14 44122100 44132100 . . . +chr14 44122101 44132101 . . . +chrX 9695409 9705409 . . . +chrX 9697343 9707343 . . . +chrX 9699277 9709277 . . . +chrX 99204528 99214528 . . . +chrX 99204528 99214528 . . . +chrX 99206462 99216462 . . . +chrX 99206462 99216462 . . . +chrX 99208395 99218395 . . . +chrX 99208396 99218396 . . . +chr15 38659925 38669925 . . . +chr15 38659925 38669925 . . . +chr15 38659946 38669946 . . . +chr15 38659946 38669946 . . . +chr15 38661859 38671859 . . . +chr15 38661859 38671859 . . . +chr15 38661901 38671901 . . . +chr15 38661901 38671901 . . . +chr15 38663813 38673813 . . . +chr15 38663814 38673814 . . . +chr15 38663834 38673834 . . . +chr15 38663835 38673835 . . . +chr15 54627233 54637233 . . . +chr15 54627233 54637233 . . . +chr15 54627250 54637250 . . . +chr15 54627250 54637250 . . . +chr15 54629167 54639167 . . . +chr15 54629167 54639167 . . . +chr15 54629201 54639201 . . . +chr15 54629201 54639201 . . . +chr15 54631117 54641117 . . . +chr15 54631118 54641118 . . . +chr15 54631134 54641134 . . . +chr15 54631135 54641135 . . . +chr6 15556982 15566982 . . . +chr6 15556982 15566982 . . . +chr6 15557021 15567021 . . . +chr6 15557021 15567021 . . . +chr6 15558916 15568916 . . . +chr6 15558916 15568916 . . . +chr6 15558994 15568994 . . . +chr6 15558994 15568994 . . . +chr6 15560888 15570888 . . . +chr6 15560889 15570889 . . . +chr6 15560927 15570927 . . . +chr6 15560928 15570928 . . . +chr6 41191666 41201666 . . . +chr6 41191666 41201666 . . . +chr6 41191699 41201699 . . . +chr6 41191699 41201699 . . . +chr6 41193600 41203600 . . . +chr6 41193600 41203600 . . . +chr6 41193666 41203666 . . . +chr6 41193666 41203666 . . . +chr6 41195566 41205566 . . . +chr6 41195567 41205567 . . . +chr6 41195599 41205599 . . . +chr6 41195600 41205600 . . . +chr6 53004919 53014919 . . . +chr6 53006853 53016853 . . . +chr6 53008787 53018787 . . . +chr6 73583214 73593214 . . . +chr6 73583244 73593244 . . . +chr6 73585148 73595148 . . . +chr6 73585209 73595209 . . . +chr6 73587112 73597112 . . . +chr6 73587143 73597143 . . . +chr6 155871001 155881001 . . . +chr6 155871050 155881050 . . . +chr6 155871050 155881050 . . . +chr6 155872934 155882934 . . . +chr6 155873033 155883033 . . . +chr6 155873033 155883033 . . . +chr6 155874917 155884917 . . . +chr6 155874966 155884966 . . . +chr6 155874967 155884967 . . . +chr16 4274549 4284549 . . . +chr16 4274580 4284580 . . . +chr16 4274580 4284580 . . . +chr16 4276482 4286482 . . . +chr16 4276545 4286545 . . . +chr16 4276545 4286545 . . . +chr16 4278447 4288447 . . . +chr16 4278478 4288478 . . . +chr16 4278479 4288479 . . . +chr16 61256434 61266434 . . . +chr16 61256434 61266434 . . . +chr16 61256473 61266473 . . . +chr16 61256474 61266474 . . . +chr16 61258368 61268368 . . . +chr16 61258368 61268368 . . . +chr16 61258447 61268447 . . . +chr16 61258447 61268447 . . . +chr16 61260341 61270341 . . . +chr16 61260341 61270341 . . . +chr16 61260380 61270380 . . . +chr16 61260381 61270381 . . . +chr16 63437466 63447466 . . . +chr16 63437466 63447466 . . . +chr16 63437488 63447488 . . . +chr16 63439400 63449400 . . . +chr16 63439400 63449400 . . . +chr16 63439444 63449444 . . . +chr16 63441355 63451355 . . . +chr16 63441355 63451355 . . . +chr16 63441377 63451377 . . . +chr7 152338860 152348860 . . . +chr7 152338860 152348860 . . . +chr7 152338891 152348891 . . . +chr7 152338891 152348891 . . . +chr7 152340794 152350794 . . . +chr7 152340794 152350794 . . . +chr7 152340856 152350856 . . . +chr7 152340856 152350856 . . . +chr7 152342758 152352758 . . . +chr7 152342759 152352759 . . . +chr7 152342789 152352789 . . . +chr7 152342790 152352790 . . . +chr20 33330273 33340273 . . . +chr20 33330273 33340273 . . . +chr20 33330317 33340317 . . . +chr20 33332207 33342207 . . . +chr20 33332207 33342207 . . . +chr20 33332295 33342295 . . . +chr20 33334184 33344184 . . . +chr20 33334185 33344185 . . . +chr20 33334229 33344229 . . . +chr20 36028998 36038998 . . . +chr20 36028998 36038998 . . . +chr20 36030932 36040932 . . . +chr20 36030932 36040932 . . . +chr20 36032865 36042865 . . . +chr20 36032866 36042866 . . . +chr20 40156088 40166088 . . . +chr20 40156088 40166088 . . . +chr20 40158022 40168022 . . . +chr20 40158022 40168022 . . . +chr20 40159955 40169955 . . . +chr20 40159956 40169956 . . . +chr20 59984060 59994060 . . . +chr20 59984086 59994086 . . . +chr20 59984086 59994086 . . . +chr20 59985994 59995994 . . . +chr20 59986046 59996046 . . . +chr20 59986046 59996046 . . . +chr20 59987954 59997954 . . . +chr20 59987979 59997979 . . . +chr20 59987980 59997980 . . . +chr12 57866912 57876912 . . . +chr12 57866936 57876936 . . . +chr12 57868846 57878846 . . . +chr12 57868894 57878894 . . . +chr12 57870804 57880804 . . . +chr12 57870828 57880828 . . . +chr8 22841419 22851419 . . . +chr8 22841419 22851419 . . . +chr8 22841461 22851461 . . . +chr8 22843353 22853353 . . . +chr8 22843353 22853353 . . . +chr8 22843437 22853437 . . . +chr8 22845328 22855328 . . . +chr8 22845329 22855329 . . . +chr8 22845371 22855371 . . . +chr17 42512626 42522626 . . . +chr17 42512626 42522626 . . . +chr17 42512657 42522657 . . . +chr17 42514560 42524560 . . . +chr17 42514560 42524560 . . . +chr17 42514622 42524622 . . . +chr17 42516524 42526524 . . . +chr17 42516525 42526525 . . . +chr17 42516556 42526556 . . . +chr17 44329638 44339638 . . . +chr17 44329638 44339638 . . . +chr17 44331572 44341572 . . . +chr17 44331572 44341572 . . . +chr17 44333505 44343505 . . . +chr17 44333506 44343506 . . . +chr17 45982661 45992661 . . . +chr17 45982661 45992661 . . . +chr17 45982681 45992681 . . . +chr17 45982681 45992681 . . . +chr17 45984595 45994595 . . . +chr17 45984595 45994595 . . . +chr17 45984635 45994635 . . . +chr17 45984635 45994635 . . . +chr17 45986548 45996548 . . . +chr17 45986549 45996549 . . . +chr17 45986568 45996568 . . . +chr17 45986569 45996569 . . . +chr17 82003625 82013625 . . . +chr17 82003690 82013690 . . . +chr17 82003691 82013691 . . . +chr17 82005559 82015559 . . . +chr17 82005690 82015690 . . . +chr17 82005690 82015690 . . . +chr17 82007558 82017558 . . . +chr17 82007623 82017623 . . . +chr17 82007624 82017624 . . . +chr3 48457703 48467703 . . . +chr3 48457733 48467733 . . . +chr3 48457733 48467733 . . . +chr3 48459637 48469637 . . . +chr3 48459697 48469697 . . . +chr3 48459697 48469697 . . . +chr3 48461601 48471601 . . . +chr3 48461630 48471630 . . . +chr3 48461631 48471631 . . . +chr2 44477902 44487902 . . . +chr2 44479836 44489836 . . . +chr2 44481770 44491770 . . . +chr19 41727423 41737423 . . . +chr19 41727423 41737423 . . . +chr19 41729357 41739357 . . . +chr19 41729357 41739357 . . . +chr19 41731290 41741290 . . . +chr19 41731291 41741291 . . . +chr19 43448282 43458282 . . . +chr19 43448304 43458304 . . . +chr19 43448305 43458305 . . . +chr19 43450216 43460216 . . . +chr19 43450261 43460261 . . . +chr19 43450261 43460261 . . . +chr19 43452172 43462172 . . . +chr19 43452194 43462194 . . . +chr19 43452195 43462195 . . . +chr19 44921111 44931111 . . . +chr19 44921111 44931111 . . . +chr19 44923045 44933045 . . . +chr19 44923045 44933045 . . . +chr19 44924978 44934978 . . . +chr19 44924979 44934979 . . . +chr5 111661983 111671983 . . . +chr5 111663917 111673917 . . . +chr5 111665851 111675851 . . . +chr5 138871786 138881786 . . . +chr5 138873720 138883720 . . . +chr5 138875654 138885654 . . . +chr9 145229735 145239735 . . . +chr9 145229735 145239735 . . . +chr9 145229753 145239753 . . . +chr9 145231669 145241669 . . . +chr9 145231669 145241669 . . . +chr9 145231706 145241706 . . . +chr9 145233621 145243621 . . . +chr9 145233621 145243621 . . . +chr9 145233640 145243640 . . . +chr21 24889387 24899387 . . . +chr21 24889387 24899387 . . . +chr21 24891321 24901321 . . . +chr21 24891321 24901321 . . . +chr21 24893254 24903254 . . . +chr21 24893255 24903255 . . . diff --git a/dimelo/test/data/test_targets/megalodon_single_nothresh/pileup.sorted.bed.gz b/dimelo/test/data/test_targets/megalodon_single_nothresh/pileup.sorted.bed.gz new file mode 100644 index 00000000..b1bc1343 Binary files /dev/null and b/dimelo/test/data/test_targets/megalodon_single_nothresh/pileup.sorted.bed.gz differ diff --git a/dimelo/test/data/test_targets/megalodon_single_nothresh/pileup.sorted.bed.gz.tbi b/dimelo/test/data/test_targets/megalodon_single_nothresh/pileup.sorted.bed.gz.tbi new file mode 100644 index 00000000..c7e5e13e Binary files /dev/null and b/dimelo/test/data/test_targets/megalodon_single_nothresh/pileup.sorted.bed.gz.tbi differ diff --git a/dimelo/test/data/test_targets/megalodon_single_nothresh/reads.combined_basemods.h5 b/dimelo/test/data/test_targets/megalodon_single_nothresh/reads.combined_basemods.h5 new file mode 100644 index 00000000..cbeef2e3 Binary files /dev/null and b/dimelo/test/data/test_targets/megalodon_single_nothresh/reads.combined_basemods.h5 differ diff --git a/dimelo/test/data/test_targets/megalodon_single_nothresh/regions.processed.bed b/dimelo/test/data/test_targets/megalodon_single_nothresh/regions.processed.bed new file mode 100644 index 00000000..4a44e5d2 --- /dev/null +++ b/dimelo/test/data/test_targets/megalodon_single_nothresh/regions.processed.bed @@ -0,0 +1 @@ +chr1 114353595 114363595 . . . diff --git a/dimelo/test/data/test_targets/test_matrix.pickle b/dimelo/test/data/test_targets/test_matrix.pickle new file mode 100644 index 00000000..26328727 Binary files /dev/null and b/dimelo/test/data/test_targets/test_matrix.pickle differ diff --git a/dimelo/test/data/winnowmap_guppy_merge_subset.bam b/dimelo/test/data/winnowmap_guppy_merge_subset.bam deleted file mode 100644 index f7e74d4d..00000000 Binary files a/dimelo/test/data/winnowmap_guppy_merge_subset.bam and /dev/null differ diff --git a/dimelo/test/data/winnowmap_guppy_merge_subset.bam.bai b/dimelo/test/data/winnowmap_guppy_merge_subset.bam.bai deleted file mode 100644 index 61f6e09e..00000000 Binary files a/dimelo/test/data/winnowmap_guppy_merge_subset.bam.bai and /dev/null differ diff --git a/dimelo/test/dimelo_test.py b/dimelo/test/dimelo_test.py index 0e64f674..f7b84b2e 100644 --- a/dimelo/test/dimelo_test.py +++ b/dimelo/test/dimelo_test.py @@ -1,451 +1,1241 @@ -import subprocess -import unittest +import filecmp +import gzip +import pickle from pathlib import Path +import h5py +import numpy as np +import plotly +import pytest +from matplotlib.axes import Axes + import dimelo as dm -from dimelo.test import DiMeLoTestCase - -""" -Inputs - -NOTE: Changing any of these paths or database contents may require recomputing the hard-coded database -hashes in the tests below. -""" -# TODO: Is this a reasonable way to specify input files? Where is this intended to be run from? -input_bams = [ - Path("dimelo/test/data/mod_mappings_subset.bam"), - Path("dimelo/test/data/winnowmap_guppy_merge_subset.bam"), -] -input_sample_names = ["test1", "test2"] -input_bed = Path("dimelo/test/data/test.bed") -input_region = "chr1:2907273-2909473" - -""" -Outputs -""" -# TODO: When implemented elsewhere, replace these explicit database paths with modular calls -output_dbs = [f.with_suffix(".db").name for f in input_bams] - - -def db_hash(db_path: Path) -> bytes: - """Computes a hash of the sqlite db at the specified path.""" - # Use the sqlite3 .sha3sum command to compute hash - sqlite_output = subprocess.run( - ["sqlite3", db_path, ".sha3sum"], capture_output=True - ) - return sqlite_output.stdout - - -class TestParseBam(DiMeLoTestCase): - def test_parse_bam_bedFile(self): - """Tests parsing a bam file into a database, specifying windows using a bed file. - - Notes: - - cores set to 1 to ensure that hashes come out the same each time - - thresholds set super low to ensure that meaningful rows are inserted for all modifications - """ - bam_idx = 0 - - # Inputs - bam_file = input_bams[bam_idx] - sample_name = input_sample_names[bam_idx] - bed_file = input_bed - - # Outputs - db_file = output_dbs[bam_idx] - - dm.parse_bam( - fileName=str(bam_file), - sampleName=sample_name, - outDir=str(self.outDir), - bedFile=str(bed_file), - basemod="A+CG", - center=True, - windowSize=500, - threshA=1, - threshC=1, - extractAllBases=False, - cores=1, - ) - database_path = self.outDir / db_file - # Check whether database contents are the same as expected - self.assertEqual( - db_hash(database_path), - b"8a8fe3984448ee6f215d1d71c01a4d8edde7691bcdb0bf28f2c01cd2\n", +from dimelo.test import DiMeLoParsingTestCase, filter_kwargs_for_func + +script_location = Path(__file__).parent + +with open( + script_location / "data" / "test_targets" / "test_matrix.pickle", "rb" +) as file: + test_matrix = pickle.load(file) + + +@pytest.mark.parametrize( + "test_case,kwargs,results", + [(case, inputs, outputs) for case, (inputs, outputs) in test_matrix.items()], +) +class TestParseToPlot(DiMeLoParsingTestCase): + """ + Tests parsing a bam file into a bed.gz pileup and an hdf5 single read file, then tests that each stage + of parse_bam -> load_processed -> plotting works correctly, including comparing where applicable. + + This test class requires the output files be bitwise identical, compared to pre-defined reference files. + This means that interface changes require replacing these files. + + For integration tests we test interfaces end-to-end. + """ + + def test_unit__pileup( + cls, + test_case, + kwargs, + results, + ): + kwargs_pileup = filter_kwargs_for_func(dm.parse_bam.pileup, kwargs) + kwargs_pileup["output_directory"] = cls.outDir + pileup_bed, regions_processed = dm.parse_bam.pileup( + **kwargs_pileup, + ref_genome=cls.reference_genome, ) - def test_parse_bam_region(self): - """Tests parsing a bam file into a database, specifying windows using a region string. - - Notes: - - cores set to 1 to ensure that hashes come out the same each time - - thresholds set super low to ensure that meaningful rows are inserted for all modifications - """ - bam_idx = 0 - - # Inputs - bam_file = input_bams[bam_idx] - sample_name = input_sample_names[bam_idx] - - # Outputs - db_file = output_dbs[bam_idx] - - dm.parse_bam( - fileName=str(bam_file), - sampleName=sample_name, - outDir=str(self.outDir), - region=input_region, - basemod="A+CG", - threshA=1, - threshC=1, + pileup_target, regions_target = results["pileup"] + + if pileup_target is not None and regions_target is not None: + # This is necessary because the gzipped files are different on mac vs linux, but the contents should be identical (and are, so far) + # Not sure why the compression ratio is better on Linux when both are using pysam.tabix_compress with pysam 0.22.0 and zlib 1.2.13 but whatcha gonna do + with ( + gzip.open(pileup_bed, "rt") as f1, + gzip.open(pileup_target, "rt") as f2, + ): + # Read and compare file contents + file1_contents = f1.read() + file2_contents = f2.read() + assert ( + file1_contents == file2_contents + ), f"{test_case}: {pileup_bed} does not match {pileup_target}." + assert filecmp.cmp( + regions_processed, regions_target, shallow=False + ), f"{test_case}: {regions_processed} does not match {regions_target}." + else: + print(f"{test_case} skipped for pileup.") + + def test_unit__extract( + cls, + test_case, + kwargs, + results, + ): + kwargs_extract = filter_kwargs_for_func(dm.parse_bam.extract, kwargs) + kwargs_extract["output_directory"] = cls.outDir + # extract can behave non-deterministically in terms of read output order + # if run on multiple cores. This is not an issue for sorted read loads, + # but means the file itself changes even though the meaningful contents don't + # given that parallelization here is purely within modkit anyway, the design + # choice was made to always single-core for extract testing + if "cores" in kwargs_extract: + del kwargs_extract["cores"] + extract_h5, regions_processed = dm.parse_bam.extract( + **kwargs_extract, + ref_genome=cls.reference_genome, cores=1, ) - database_path = self.outDir / db_file - # Check whether database contents are the same as expected - self.assertEqual( - db_hash(database_path), - b"baf72c009547e8a2e87402db04695d698e648c3856bcc9b8c0c6cf8a\n", - ) - - def test_parse_bam_bedFile_region_mutual_exclusion(self): - """Verifies that bedFile and region arguments remain mutually exclusive.""" - bam_idx = 0 - # Inputs - bam_file = input_bams[bam_idx] - sample_name = input_sample_names[bam_idx] - bed_file = input_bed - - with self.assertRaises(RuntimeError): - dm.parse_bam( - fileName=str(bam_file), - sampleName=sample_name, - outDir=str(self.outDir), - bedFile=str(bed_file), - region=input_region, + extract_target, regions_target = results["extract"] + + if extract_target is not None and regions_target is not None: + # The hdf5 files will have a few bits different due to gzip compression timestamps, but comparing the exact size should pass because + # the timestamps are not themselves compressed inside the vector gzip objects + h5_test = h5py.File(extract_h5) + h5_target = h5py.File(extract_target) + datasets = [ + name for name, obj in h5_target.items() if isinstance(obj, h5py.Dataset) + ] + for dataset in datasets: + if dataset in ["threshold"]: + assert h5_test[dataset] == h5_target[dataset] or np.isnan( + h5_test[dataset] + ) == np.isnan(h5_target[dataset]) + else: + test_dataset = list(h5_test[dataset][:]) + target_dataset = list(h5_target[dataset][:]) + if dataset in ["mod_vector", "val_vector"]: + assert [ + gzip.decompress(test_item.tobytes()) + for test_item in test_dataset + ] == [ + gzip.decompress(target_item.tobytes()) + for target_item in target_dataset + ], f"{test_case}: {dataset} does not match." + else: + assert ( + test_dataset == target_dataset + ), f"{test_case}: {dataset} does not match." + # assert os.path.getsize(extract_h5) == os.path.getsize(extract_target), f"{test_case}: {extract_h5} does not match {extract_target}." + assert filecmp.cmp( + regions_processed, regions_target, shallow=False + ), f"{test_case}: {regions_processed} does not match {regions_target}." + else: + print(f"{test_case} skipped for extract.") + + def test_integration__pileup_load_plot( + cls, + test_case, + kwargs, + results, + ): + # This stuff is commented out because if we run this integration test in the same class as the unit test + # for parsing, we can cut down total end-to-end testing overhead by about 2x by just using that output + # + # kwargs_pileup = filter_kwargs_for_func(dm.parse_bam.pileup,kwargs) + # kwargs_pileup['output_directory'] = cls.outDir + # pileup_bed,_ = dm.parse_bam.pileup( + # **kwargs_pileup, + # ref_genome = cls.reference_genome, + # ) + # We just grab the output from TestParseBam::test_pileup, wasteful to re-run an identical modkit command + pileup_bed = cls.outDir / kwargs["output_name"] / "pileup.sorted.bed.gz" + + # If we have results for this pileup, check that the load_processed values are ok out of the output file + if results["pileup"][0] is not None: + kwargs_counts_from_bedmethyl = filter_kwargs_for_func( + dm.load_processed.pileup_counts_from_bedmethyl, kwargs ) + for motif in kwargs["motifs"]: + expected = results["pileup_counts_from_bedmethyl"][motif] + actual = dm.load_processed.pileup_counts_from_bedmethyl( + bedmethyl_file=pileup_bed, + motif=motif, + **kwargs_counts_from_bedmethyl, + ) + assert ( + actual == expected + ), f"{test_case}: Counts for motif {motif} are not equal" - def test_parse_bam_region_center_incompatible(self): - """Verifies that region and center arguments are incompatible.""" - bam_idx = 0 - - # Inputs - bam_file = input_bams[bam_idx] - sample_name = input_sample_names[bam_idx] - - with self.assertRaises(RuntimeError): - dm.parse_bam( - fileName=str(bam_file), - sampleName=sample_name, - outDir=str(self.outDir), - region=input_region, - center=True, + kwargs_vectors_from_bedmethyl = filter_kwargs_for_func( + dm.load_processed.pileup_vectors_from_bedmethyl, kwargs + ) + for motif in kwargs["motifs"]: + expected_tuple = results["pileup_vectors_from_bedmethyl"][motif] + actual_tuple = dm.load_processed.pileup_vectors_from_bedmethyl( + bedmethyl_file=results["pileup"][0], + motif=motif, + **kwargs_vectors_from_bedmethyl, + ) + assert len(expected_tuple) == len( + actual_tuple + ), f"{test_case}: Unexpected number of arrays returned for {motif}" + + for expected, actual in zip(expected_tuple, actual_tuple): + # TODO: The following was the original assertion error message, but it was not written in a functional way. Find a way to make it work as intended. + # assert np.array_equal(expected, actual), f"{test_case}: Arrays for motif {motif} are not equal: expected {value} but got {actual[key]}" + assert np.array_equal( + expected, actual + ), f"{test_case}: Arrays for motif {motif} are not equal." + else: + print( + f"{test_case} loading skipped for pileup_load_plot, continuing to plotting." ) - -# TODO: More robust qc_report tests -class TestQCReport(DiMeLoTestCase): - def test_qc_report_one_sample(self): - """Tests generating a single qc report. - - Notes: - - cores set to 1 to ensure that hashes come out the same each time - """ - bam_idx = 0 - - # Inputs - bam_file = input_bams[bam_idx] - sample_name = input_sample_names[bam_idx] - - # Outputs - db_file = output_dbs[bam_idx] - qc_report_file = f"{sample_name}_qc_report.pdf" - - dm.qc_report( - fileNames=str(bam_file), - sampleNames=sample_name, - outDir=str(self.outDir), - cores=1, + kwargs_plot_enrichment_plot_enrichment = filter_kwargs_for_func( + dm.plot_enrichment.plot_enrichment, kwargs ) - - database_path = self.outDir / db_file - # Check whether database contents are the same as expected - self.assertEqual( - db_hash(database_path), - b"58ed1ba2ce0c2e0f257ead1d9f2b9239f2777b8aefbf38ea7a40e464\n", + for motif in kwargs["motifs"]: + regions_list = ( + kwargs["regions"] + if isinstance(kwargs["regions"], list) + else [kwargs["regions"]] + ) + kwargs_plot_enrichment_plot_enrichment["motifs"] = [ + motif for _ in regions_list + ] + ax = dm.plot_enrichment.plot_enrichment( + mod_file_names=[pileup_bed for _ in regions_list], + regions_list=regions_list, + sample_names=["label" for _ in regions_list], + **kwargs_plot_enrichment_plot_enrichment, + ) + assert isinstance(ax, Axes), f"{test_case}: plotting failed for {motif}." + kwargs_plot_enrichment_profile_plot_enrichment_profile = filter_kwargs_for_func( + dm.plot_enrichment_profile.plot_enrichment_profile, + kwargs, + extra_args=["window_size", "smooth_window"], ) - - self.assertOutputFileExists(qc_report_file) - - def test_qc_report_multi_sample(self): - """Tests generating multiple qc reports at once.""" - dm.qc_report( - fileNames=[str(f) for f in input_bams], - sampleNames=input_sample_names, - outDir=str(self.outDir), + for motif in kwargs["motifs"]: + regions_list = ( + kwargs["regions"] + if isinstance(kwargs["regions"], list) + else [kwargs["regions"]] + ) + kwargs_plot_enrichment_profile_plot_enrichment_profile["motifs"] = [ + motif for _ in regions_list + ] + ax = dm.plot_enrichment_profile.plot_enrichment_profile( + mod_file_names=[pileup_bed for _ in regions_list], + regions_list=regions_list, + sample_names=["label" for _ in regions_list], + **kwargs_plot_enrichment_profile_plot_enrichment_profile, + ) + assert isinstance(ax, Axes), f"{test_case}: plotting failed for {motif}." + + def test_integration__extract_load_plot( + cls, + test_case, + kwargs, + results, + ): + # This stuff is commented out because if we run this integration test in the same class as the unit test + # for parsing, we can cut down total end-to-end testing overhead by about 2x by just using that output + # + # if results['extract'][0] is None: + # return + + # kwargs_extract = filter_kwargs_for_func(dm.parse_bam.extract,kwargs) + # kwargs_extract['output_directory'] = cls.outDir + # extract_h5,_ = dm.parse_bam.extract( + # **kwargs_extract, + # ref_genome = cls.reference_genome, + # ) + # We just grab the output from TestParseBam::test_extract, wasteful to re-run an identical modkit command + extract_h5 = cls.outDir / kwargs["output_name"] / "reads.combined_basemods.h5" + + # If we have results for this extraction, check that the load_processed values are ok out of the output file + if results["extract"][0] is not None: + kwargs_read_vectors_from_hdf5 = filter_kwargs_for_func( + dm.load_processed.read_vectors_from_hdf5, kwargs + ) + read_data_list, datasets, _ = dm.load_processed.read_vectors_from_hdf5( + file=extract_h5, + **kwargs_read_vectors_from_hdf5, + ) + read_data_dict = {} + # Pull out the data from the first read + for idx, dataset in enumerate(datasets): + for read_data in read_data_list: + read_data_dict[dataset] = read_data[idx] + break + expected = results["read_vectors_from_hdf5"] + actual = read_data_dict + for key, value in expected.items(): + if isinstance(value, np.ndarray): + assert np.allclose( + actual[key], expected[key], atol=1e-5 + ), f"""{test_case}: Arrays for {key} are not equal +mismatch at {np.where(value != actual[key])} +mismatch values expected {value[np.where(value != actual[key])]} vs actual {actual[key][np.where(value != actual[key])]} +{value[np.where(value != actual[key])[0]]} vs {actual[key][np.where(value != actual[key])[0]]}. + """ + elif isinstance(value, (str, int, bool)): + assert ( + actual[key] == expected[key] + ), f"{test_case}: Values for {key} are not equal: expected {value} but got {actual[key]}." + else: + assert np.isclose( + actual[key], value, atol=1e-4 + ), f"{test_case}: Values for {key} are not equal: expected {value} but got {actual[key]}." + else: + print("{test_case} skipped for read_vectors_from_hdf5.") + kwargs_plot_reads_plot_reads = filter_kwargs_for_func( + dm.plot_reads.plot_reads, kwargs ) + if kwargs["thresh"] is not None: + ax = dm.plot_reads.plot_reads( + mod_file_name=extract_h5, + **kwargs_plot_reads_plot_reads, + ) + assert isinstance(ax, Axes), f"{test_case}: plotting failed." + else: # if the extract parameters did not have a threshold, plot_reads.plot_reads should raise an error + with pytest.raises(ValueError) as excinfo: + ax = dm.plot_reads.plot_reads( + mod_file_name=extract_h5, + **kwargs_plot_reads_plot_reads, + ) + assert "No threshold has been applied" in str( + excinfo.value + ), f"{test_case}: unexpected exception {excinfo.value}" + # providing a threshold should be enough to run plot_reads.plot_reads without an error + kwargs_plot_reads_plot_reads["thresh"] = 0.75 + ax = dm.plot_reads.plot_reads( + mod_file_name=extract_h5, + **kwargs_plot_reads_plot_reads, + ) + assert isinstance(ax, Axes), f"{test_case}: plotting failed." + + +@pytest.mark.parametrize( + "test_case,kwargs,results", + [(case, inputs, outputs) for case, (inputs, outputs) in test_matrix.items()], +) +class TestLoadProcessed: + """ + Tests loading values from bed.gz pileups and hdf5 single read files. + + This test class requires that values are identical. It loads from pre-defined reference files. + This means that interface changes require replacing these files by re-running the Generate parse_bam + outputs section of dimelo/test/generate_test_targets.ipynb. + """ + + def test_unit__regions_to_list( + self, + test_case, + kwargs, + results, + ): + """ + This test currently only tests that regions_to_list can run all relevant loaders, and assumes their + values are correct based on the subsequent tests that verify values. + """ + if results["pileup"][0] is not None: + # test pileup loading + kwargs_counts_from_bedmethyl = filter_kwargs_for_func( + dm.load_processed.pileup_counts_from_bedmethyl, kwargs + ) + kwargs_vectors_from_bedmethyl = filter_kwargs_for_func( + dm.load_processed.pileup_vectors_from_bedmethyl, kwargs + ) + for motif in kwargs["motifs"]: + dm.load_processed.regions_to_list( + function_handle=dm.load_processed.pileup_counts_from_bedmethyl, + bedmethyl_file=results["pileup"][0], + motif=motif, + **kwargs_counts_from_bedmethyl, + ) + dm.load_processed.regions_to_list( + function_handle=dm.load_processed.pileup_vectors_from_bedmethyl, + bedmethyl_file=results["pileup"][0], + motif=motif, + **kwargs_vectors_from_bedmethyl, + ) + if results["extract"][0] is not None: + kwargs_read_vectors_from_hdf5 = filter_kwargs_for_func( + dm.load_processed.read_vectors_from_hdf5, kwargs + ) + dm.load_processed.regions_to_list( + function_handle=dm.load_processed.read_vectors_from_hdf5, + file=results["extract"][0], + **kwargs_read_vectors_from_hdf5, + ) - for db_file in output_dbs: - self.assertOutputFileExists(db_file) - for sample_name in input_sample_names: - self.assertOutputFileExists(f"{sample_name}_qc_report.pdf") - + def test_unit__pileup_counts_from_bedmethyl( + self, + test_case, + kwargs, + results, + ): + if results["pileup"][0] is not None: + kwargs_counts_from_bedmethyl = filter_kwargs_for_func( + dm.load_processed.pileup_counts_from_bedmethyl, kwargs + ) + for motif in kwargs["motifs"]: + expected = results["pileup_counts_from_bedmethyl"][motif] + actual = dm.load_processed.pileup_counts_from_bedmethyl( + bedmethyl_file=results["pileup"][0], + motif=motif, + **kwargs_counts_from_bedmethyl, + ) + assert ( + actual == expected + ), f"{test_case}: Counts for motif {motif} are not equal" + else: + print(f"{test_case} skipped for pileup_counts_from_bedmethyl.") + + def test_unit__pileup_vectors_from_bedmethyl( + self, + test_case, + kwargs, + results, + ): + if results["pileup"][0] is not None: + kwargs_vectors_from_bedmethyl = filter_kwargs_for_func( + dm.load_processed.pileup_vectors_from_bedmethyl, kwargs + ) + for motif in kwargs["motifs"]: + expected_tuple = results["pileup_vectors_from_bedmethyl"][motif] + actual_tuple = dm.load_processed.pileup_vectors_from_bedmethyl( + bedmethyl_file=results["pileup"][0], + motif=motif, + **kwargs_vectors_from_bedmethyl, + ) + assert len(expected_tuple) == len( + actual_tuple + ), f"{test_case}: Unexpected number of arrays returned for {motif}" + + for expected, actual in zip(expected_tuple, actual_tuple): + assert np.array_equal( + expected, actual + ), f"{test_case}: Arrays for motif {motif} are not equal" + else: + print(f"{test_case} skipped for pileup_vectors_from_bedmethyl.") + + def test_unit__read_vectors_from_hdf5( + self, + test_case, + kwargs, + results, + ): + if results["extract"][0] is not None: + kwargs_read_vectors_from_hdf5 = filter_kwargs_for_func( + dm.load_processed.read_vectors_from_hdf5, kwargs + ) + read_data_list, datasets, _ = dm.load_processed.read_vectors_from_hdf5( + file=results["extract"][0], + **kwargs_read_vectors_from_hdf5, + ) + read_data_dict = {} + # Pull out the data from the first read + for idx, dataset in enumerate(datasets): + for read_data in read_data_list: + read_data_dict[dataset] = read_data[idx] + break + expected = results["read_vectors_from_hdf5"] + actual = read_data_dict + for key, value in expected.items(): + if isinstance(value, np.ndarray): + assert np.allclose( + actual[key], expected[key], atol=1e-5 + ), f"""{test_case}: Arrays for {key} are not equal +mismatch at {np.where(value != actual[key])} +mismatch values expected {value[np.where(value != actual[key])]} vs actual {actual[key][np.where(value != actual[key])]} +{value[np.where(value != actual[key])[0]]} vs {actual[key][np.where(value != actual[key])[0]]}. + """ + elif isinstance(value, (str, int, bool)): + assert ( + actual[key] == expected[key] + ), f"{test_case}: Values for {key} are not equal: expected {value} but got {actual[key]}." + else: + assert np.isclose( + actual[key], value, atol=1e-4 + ), f"{test_case}: Values for {key} are not equal: expected {value} but got {actual[key]}." + else: + print("{test_case} skipped for read_vectors_from_hdf5.") + + +@pytest.mark.parametrize( + "test_case,kwargs,results", + [(case, inputs, outputs) for case, (inputs, outputs) in test_matrix.items()], +) +class TestExport(DiMeLoParsingTestCase): + """ + Tests file export functionality in export module. + + This test currently simply checks that we can make the appropriate output files without raising errors. + The values stored in the files are not verified. Future work should add test coverage for values, but at + the moment there is no loading infrastructure in place for bigwig files making such implementation high-overhead. + """ + + def test_unit__pileup_to_bigwig( + cls, + test_case, + kwargs, + results, + ): + kwargs_bigwig = filter_kwargs_for_func(dm.export.pileup_to_bigwig, kwargs) + kwargs_bigwig["bedmethyl_file"] = results["pileup"][0] + kwargs_bigwig["bigwig_file"] = ( + cls.outDir / kwargs["output_name"] / "pileup.fractions.bigwig" + ) + for motif in kwargs["motifs"]: + dm.export.pileup_to_bigwig( + **kwargs_bigwig, + motif=motif, + ) -class TestPlotBrowser(DiMeLoTestCase): - def test_plot_browser_html(self): - """Tests generation of an html browser.""" - bam_idx = 0 - # Inputs - bam_file = input_bams[bam_idx] - sample_name = input_sample_names[bam_idx] +class TestPlotEnrichmentSynthetic: + """ + Tests plotting functionality in plot_enrichment. - # Outputs - db_file = output_dbs[bam_idx] + This test simply checks that we can make plots from synthetic data without raising errors. + Appearance of plots is not verified. + """ - dm.plot_browser( - fileNames=str(bam_file), - sampleNames=sample_name, - region=input_region, - basemod="A+CG", - outDir=str(self.outDir), - static=False, + def test_unit__plot_enrichment_plot_enrichment_synthetic(self): + ax = dm.plot_enrichment.plot_enrichment( + mod_file_names=["test.fake", "test.fake"], + regions_list=["test.bed", "test.bed"], + motifs=["A", "A"], + sample_names=["a", "b"], ) + assert isinstance(ax, Axes) - self.assertOutputFileExists(db_file) + def test_unit__plot_enrichment_by_modification_synthetic(self): + ax = dm.plot_enrichment.by_modification( + mod_file_name="test.fake", regions="test.bed", motifs=["A", "C"] + ) + assert isinstance(ax, Axes) - # TODO: It's difficult to get the output file name. Find a better way to do this check. - n_html_files = len(list(self.outDir.glob("*.html"))) - self.assertEqual(n_html_files, 1) + def test_unit__plot_enrichment_by_regions_synthetic(self): + ax = dm.plot_enrichment.by_regions( + mod_file_name="test.fake", + regions_list=["test1.bed", "test2.bed"], + motif="A", + ) + assert isinstance(ax, Axes) - for basemod in ["A", "CG"]: - for plot_type in ["fraction", "total"]: - rolling_avg_file = ( - f"{sample_name}_{basemod}_sm_rolling_avg_{plot_type}.pdf" + def test_unit__plot_enrichment_by_dataset_synthetic(self): + ax = dm.plot_enrichment.by_dataset( + mod_file_names=["test1.fake", "test2.fake"], regions="test.bed", motif="A" + ) + assert isinstance(ax, Axes) + + +@pytest.mark.parametrize( + "test_case,kwargs,results", + [(case, inputs, outputs) for case, (inputs, outputs) in test_matrix.items()], +) +class TestPlotEnrichment: + def test_unit__plot_enrichment_plot_enrichment( + self, + test_case, + kwargs, + results, + ): + if results["pileup"][0] is not None: + kwargs_plot_enrichment_plot_enrichment = filter_kwargs_for_func( + dm.plot_enrichment.plot_enrichment, kwargs + ) + for motif in kwargs["motifs"]: + regions_list = ( + kwargs["regions"] + if isinstance(kwargs["regions"], list) + else [kwargs["regions"]] + ) + kwargs_plot_enrichment_plot_enrichment["motifs"] = [ + motif for _ in regions_list + ] + ax = dm.plot_enrichment.plot_enrichment( + mod_file_names=[results["pileup"][0] for _ in regions_list], + regions_list=regions_list, + sample_names=["label" for _ in regions_list], + **kwargs_plot_enrichment_plot_enrichment, + ) + assert isinstance( + ax, Axes + ), f"{test_case}: plotting failed for {motif}." + else: + print(f"{test_case} skipped for plot_enrichment.plot_enrichment.") + + def test_unit__plot_enrichment_by_regions( + self, + test_case, + kwargs, + results, + ): + if results["pileup"][0] is not None: + kwargs_plot_enrichment_by_regions = filter_kwargs_for_func( + dm.plot_enrichment.by_regions, kwargs + ) + for motif in kwargs["motifs"]: + regions_list = ( + kwargs["regions"] + if isinstance(kwargs["regions"], list) + else [kwargs["regions"]] + ) + ax = dm.plot_enrichment.by_regions( + mod_file_name=results["pileup"][0], + regions_list=regions_list, + motif=motif, + sample_names=["label" for _ in regions_list], + **kwargs_plot_enrichment_by_regions, + ) + assert isinstance( + ax, Axes + ), f"{test_case}: plotting failed for {motif}." + else: + print(f"{test_case} skipped for plot_enrichment.by_regions.") + + def test_unit__plot_enrichment_by_modification( + self, + test_case, + kwargs, + results, + ): + if results["pileup"][0] is not None: + kwargs_plot_enrichment_by_modification = filter_kwargs_for_func( + dm.plot_enrichment.by_modification, kwargs + ) + ax = dm.plot_enrichment.by_modification( + mod_file_name=results["pileup"][0], + **kwargs_plot_enrichment_by_modification, + ) + assert isinstance(ax, Axes), f"{test_case}: plotting failed." + else: + print(f"{test_case} skipped for plot_enrichment.by_modification.") + + def test_unit__plot_enrichment_by_dataset( + self, + test_case, + kwargs, + results, + ): + if results["pileup"][0] is not None: + kwargs_plot_enrichment_by_dataset = filter_kwargs_for_func( + dm.plot_enrichment.by_dataset, kwargs + ) + for motif in kwargs["motifs"]: + ax = dm.plot_enrichment.by_dataset( + mod_file_names=[results["pileup"][0]], + motif=motif, + **kwargs_plot_enrichment_by_dataset, ) - self.assertOutputFileExists(rolling_avg_file) - - # TODO: It's difficult to get the output file name. Find a better way to do this check. - n_bed_files = len(list(self.outDir.glob("*.bed"))) - self.assertEqual(n_bed_files, 2) - - def test_plot_browser_pdf(self): - """Tests generation of a pdf browser.""" - bam_idx = 0 - - # Inputs - bam_file = input_bams[bam_idx] - sample_name = input_sample_names[bam_idx] - - # Outputs - db_file = output_dbs[bam_idx] - - dm.plot_browser( - fileNames=str(bam_file), - sampleNames=sample_name, - region=input_region, - basemod="A+CG", - outDir=str(self.outDir), - static=True, + assert isinstance(ax, Axes), f"{test_case}: plotting failed." + else: + print(f"{test_case} skipped for plot_enrichment.by_dataset.") + + +class TestPlotEnrichmentProfileSynthetic: + """ + Tests plotting functionality in plot_enrichment_profile. + + This test simply checks that we can make plots from synthetic data without raising errors. + Appearance of plots is not verified. + """ + + def test_unit__plot_enrichment_profile_plot_enrichment_profile_synthetic(self): + ax = dm.plot_enrichment_profile.plot_enrichment_profile( + mod_file_names=["test1.fake", "test2.fake"], + regions_list=["test1.bed", "test2.bed"], + motifs=["A", "C"], + window_size=500, + sample_names=["sample1", "sample2"], + smooth_window=50, ) - - self.assertOutputFileExists(db_file) - - # TODO: It's difficult to get the output file name. Find a better way to do this check. - n_pdf_files = len(list(self.outDir.glob("*.pdf"))) - self.assertEqual(n_pdf_files, 5) - - for basemod in ["A", "CG"]: - for plot_type in ["fraction", "total"]: - rolling_avg_file = ( - f"{sample_name}_{basemod}_sm_rolling_avg_{plot_type}.pdf" + assert isinstance(ax, Axes) + + def test_unit__plot_enrichment_profile_by_modification_synthetic(self): + ax = dm.plot_enrichment_profile.by_modification( + mod_file_name="test.fake", + regions="test.bed", + window_size=500, + motifs=["A", "C"], + smooth_window=50, + ) + assert isinstance(ax, Axes) + + def test_unit__plot_enrichment_profile_by_region_synthetic(self): + ax = dm.plot_enrichment_profile.by_regions( + mod_file_name="test.fake", + regions_list=["test1.bed", "test2.bed"], + motif="A", + window_size=500, + sample_names=["on target", "off target"], + smooth_window=50, + ) + assert isinstance(ax, Axes) + + def test_unit__plot_enrichment_profile_by_dataset_synthetic(self): + ax = dm.plot_enrichment_profile.by_dataset( + mod_file_names=["test1.fake", "test2.fake"], + regions="test.bed", + motif="A", + window_size=500, + sample_names=["experiment 1", "experiment 2"], + smooth_window=50, + ) + assert isinstance(ax, Axes) + + +@pytest.mark.parametrize( + "test_case,kwargs,results", + [(case, inputs, outputs) for case, (inputs, outputs) in test_matrix.items()], +) +class TestPlotEnrichmentProfile: + def test_unit__plot_enrichment_profile_plot_enrichment_profile( + self, + test_case, + kwargs, + results, + ): + if results["pileup"][0] is not None: + kwargs_plot_enrichment_profile_plot_enrichment_profile = ( + filter_kwargs_for_func( + dm.plot_enrichment_profile.plot_enrichment_profile, + kwargs, + extra_args=["window_size", "smooth_window"], ) - self.assertOutputFileExists(rolling_avg_file) - - # TODO: It's difficult to get the output file name. Find a better way to do this check. - n_bed_files = len(list(self.outDir.glob("*.bed"))) - self.assertEqual(n_bed_files, 2) - - -class TestPlotEnrichment(DiMeLoTestCase): - def test_plot_enrichment_2_bams(self): - """Tests enrichment comparison for the same region over two different bam files.""" - bam_idx = 0 - - # Inputs - bam_file = input_bams[bam_idx] - - # Outputs - db_file = output_dbs[bam_idx] - pdf_file = f"region_{input_bed.stem}_CG_enrichment_barplot.pdf" + ) + for motif in kwargs["motifs"]: + regions_list = ( + kwargs["regions"] + if isinstance(kwargs["regions"], list) + else [kwargs["regions"]] + ) + kwargs_plot_enrichment_profile_plot_enrichment_profile["motifs"] = [ + motif for _ in regions_list + ] + ax = dm.plot_enrichment_profile.plot_enrichment_profile( + mod_file_names=[results["pileup"][0] for _ in regions_list], + regions_list=regions_list, + sample_names=["label" for _ in regions_list], + **kwargs_plot_enrichment_profile_plot_enrichment_profile, + ) + assert isinstance( + ax, Axes + ), f"{test_case}: plotting failed for {motif}." + else: + print( + f"{test_case} skipped for plot_enrichment_profile.plot_enrichment_profile." + ) - dm.plot_enrichment( - fileNames=[str(bam_file), str(bam_file)], - sampleNames=input_sample_names, - bedFiles=str(input_bed), - basemod="CG", - outDir=str(self.outDir), - threshC=129, + def test_unit__plot_enrichment_profile_by_regions( + self, + test_case, + kwargs, + results, + ): + if results["pileup"][0] is not None: + kwargs_plot_enrichment_profile_by_regions = filter_kwargs_for_func( + dm.plot_enrichment_profile.by_regions, + kwargs, + extra_args=["window_size", "smooth_window"], + ) + for motif in kwargs["motifs"]: + regions_list = ( + kwargs["regions"] + if isinstance(kwargs["regions"], list) + else [kwargs["regions"]] + ) + ax = dm.plot_enrichment_profile.by_regions( + mod_file_name=results["pileup"][0], + regions_list=regions_list, + motif=motif, + sample_names=["label" for _ in regions_list], + **kwargs_plot_enrichment_profile_by_regions, + ) + assert isinstance( + ax, Axes + ), f"{test_case}: plotting failed for {motif}." + else: + print(f"{test_case} skipped for plot_enrichment_profile.by_regions.") + + def test_unit__plot_enrichment_profile_by_modification( + self, + test_case, + kwargs, + results, + ): + if results["pileup"][0] is not None: + kwargs_plot_enrichment_profile_by_modification = filter_kwargs_for_func( + dm.plot_enrichment_profile.by_modification, + kwargs, + extra_args=["window_size", "smooth_window"], + ) + ax = dm.plot_enrichment_profile.by_modification( + mod_file_name=results["pileup"][0], + **kwargs_plot_enrichment_profile_by_modification, + ) + assert isinstance(ax, Axes), f"{test_case}: plotting failed." + else: + print(f"{test_case} skipped for plot_enrichment_profile.by_modification.") + + def test_unit__plot_enrichment_by_dataset( + self, + test_case, + kwargs, + results, + ): + if results["pileup"][0] is not None: + kwargs_plot_enrichment_profile_by_dataset = filter_kwargs_for_func( + dm.plot_enrichment_profile.by_dataset, + kwargs, + extra_args=["window_size", "smooth_window"], + ) + for motif in kwargs["motifs"]: + ax = dm.plot_enrichment_profile.by_dataset( + mod_file_names=[results["pileup"][0]], + motif=motif, + **kwargs_plot_enrichment_profile_by_dataset, + ) + assert isinstance(ax, Axes), f"{test_case}: plotting failed." + else: + print(f"{test_case} skipped for plot_enrichment_profile.by_dataset.") + + +class TestPlotDepthProfileSynthetic: + """ + Tests plotting functionality in plot_depth_profile. + + This test simply checks that we can make plots from synthetic data without raising errors. + Appearance of plots is not verified. + """ + + def test_unit__plot_depth_profile_plot_depth_profile_synthetic(self): + ax = dm.plot_depth_profile.plot_depth_profile( + mod_file_names=["test1.fake", "test2.fake"], + regions_list=["test1.bed", "test2.bed"], + motifs=["A", "C"], + window_size=500, + sample_names=["sample1", "sample2"], + smooth_window=50, ) - - self.assertOutputFileExists(db_file) - self.assertOutputFileExists(pdf_file) - - def test_plot_enrichment_2_beds(self): - """Tests enrichment comparison for two different regions over the same bam file""" - bam_idx = 0 - - # Inputs - bam_file = input_bams[bam_idx] - - # Outputs - db_file = output_dbs[bam_idx] - pdf_file = f"sample_{bam_file.stem}_CG_enrichment_barplot.pdf" - - dm.plot_enrichment( - fileNames=str(bam_file), - sampleNames=input_sample_names, - bedFiles=[str(input_bed), str(input_bed)], - basemod="CG", - outDir=str(self.outDir), - threshC=129, + assert isinstance(ax, Axes) + + def test_unit__plot_depth_profile_by_modification_synthetic(self): + ax = dm.plot_depth_profile.by_modification( + mod_file_name="test.fake", + regions="test.bed", + window_size=500, + motifs=["A", "C"], + smooth_window=50, ) - - self.assertOutputFileExists(db_file) - self.assertOutputFileExists(pdf_file) - - def test_plot_enrichment_incompatible_bed_bam(self): - """Verifies that passing equal numbers of beds and bams remains an error.""" - bam_idx = 0 - - # Inputs - bam_file = input_bams[bam_idx] - - with self.assertRaises(RuntimeError): - dm.plot_enrichment( - fileNames=[str(bam_file), str(bam_file)], - sampleNames=input_sample_names, - bedFiles=[str(input_bed), str(input_bed)], - basemod="CG", - outDir=str(self.outDir), - ) - - def test_plot_enrichment_incompatible_basemod(self): - """Verifies that plot_enrichment remains incompatible with multi-basemod options.""" - bam_idx = 0 - - # Inputs - bam_file = input_bams[bam_idx] - - with self.assertRaises(RuntimeError): - dm.plot_enrichment( - fileNames=[str(bam_file), str(bam_file)], - sampleNames=input_sample_names, - bedFiles=str(input_bed), - basemod="A+CG", - outDir=str(self.outDir), - ) - - -class TestPlotEnrichmentProfile(DiMeLoTestCase): - def test_plot_enrichment_profile_single(self): - """Tests profile plotting for a single sample and region.""" - bam_idx = 0 - - # Inputs - bam_file = input_bams[bam_idx] - sample_name = input_sample_names[bam_idx] - - # Outputs - db_file = output_dbs[bam_idx] - enrichment_plot = f"{sample_name}_A+CG_sm_rolling_avg.pdf" - single_molecule_plot = f"{sample_name}_A+CG_sm_scatter.png" - base_count_plots = [ - f"{sample_name}_{basemod}_base_count.png" - for basemod in ["A", "CG"] - ] - - dm.plot_enrichment_profile( - fileNames=str(bam_file), - sampleNames=sample_name, - bedFiles=str(input_bed), - basemod="A+CG", - outDir=str(self.outDir), - windowSize=500, - dotsize=1, + assert isinstance(ax, Axes) + + def test_unit__plot_depth_profile_by_region_synthetic(self): + ax = dm.plot_depth_profile.by_regions( + mod_file_name="test.fake", + regions_list=["test1.bed", "test2.bed"], + motif="A", + window_size=500, + sample_names=["on target", "off target"], + smooth_window=50, ) - - self.assertOutputFileExists(db_file) - self.assertOutputFileExists(enrichment_plot) - self.assertOutputFileExists(single_molecule_plot) - for f in base_count_plots: - self.assertOutputFileExists(f) - - def test_plot_enrichment_profile_sample_overlay(self): - """Tests profile plotting for multiple regions over a single sample.""" - bam_idx = 0 - - # Inputs - bam_file = input_bams[bam_idx] - - # Outputs - db_file = output_dbs[bam_idx] - overlay_plot = f"sample_{bam_file.stem}_A_sm_rolling_avg_overlay.pdf" - - dm.plot_enrichment_profile( - fileNames=str(bam_file), - sampleNames=input_sample_names, - bedFiles=[str(input_bed), str(input_bed)], - basemod="A", - outDir=str(self.outDir), - windowSize=500, - dotsize=1, + assert isinstance(ax, Axes) + + def test_unit__plot_depth_profile_by_dataset_synthetic(self): + ax = dm.plot_depth_profile.by_dataset( + mod_file_names=["test1.fake", "test2.fake"], + regions="test.bed", + motif="A", + window_size=500, + sample_names=["experiment 1", "experiment 2"], + smooth_window=50, ) - - self.assertOutputFileExists(db_file) - self.assertOutputFileExists(overlay_plot) - - def test_plot_enrichment_profile_region_overlay(self): - """Tests profile plotting for multiple samples over a single region.""" - # Outputs - overlay_plot = f"region_{input_bed.stem}_A_sm_rolling_avg_overlay.pdf" - - dm.plot_enrichment_profile( - fileNames=[str(f) for f in input_bams], - sampleNames=input_sample_names, - bedFiles=str(input_bed), - basemod="A", - outDir=str(self.outDir), - windowSize=500, - dotsize=1, + assert isinstance(ax, Axes) + + +@pytest.mark.parametrize( + "test_case,kwargs,results", + [(case, inputs, outputs) for case, (inputs, outputs) in test_matrix.items()], +) +class TestPlotDepthProfile: + def test_unit__plot_depth_profile_plot_depth_profile( + self, + test_case, + kwargs, + results, + ): + if results["pileup"][0] is not None: + kwargs_plot_depth_profile_plot_depth_profile = filter_kwargs_for_func( + dm.plot_depth_profile.plot_depth_profile, + kwargs, + extra_args=["window_size", "smooth_window"], + ) + for motif in kwargs["motifs"]: + regions_list = ( + kwargs["regions"] + if isinstance(kwargs["regions"], list) + else [kwargs["regions"]] + ) + kwargs_plot_depth_profile_plot_depth_profile["motifs"] = [ + motif for _ in regions_list + ] + ax = dm.plot_depth_profile.plot_depth_profile( + mod_file_names=[results["pileup"][0] for _ in regions_list], + regions_list=regions_list, + sample_names=["label" for _ in regions_list], + **kwargs_plot_depth_profile_plot_depth_profile, + ) + assert isinstance( + ax, Axes + ), f"{test_case}: plotting failed for {motif}." + else: + print(f"{test_case} skipped for plot_depth_profile.plot_depth_profile.") + + def test_unit__plot_depth_profile_by_regions( + self, + test_case, + kwargs, + results, + ): + if results["pileup"][0] is not None: + kwargs_plot_depth_profile_by_regions = filter_kwargs_for_func( + dm.plot_depth_profile.by_regions, + kwargs, + extra_args=["window_size", "smooth_window"], + ) + for motif in kwargs["motifs"]: + regions_list = ( + kwargs["regions"] + if isinstance(kwargs["regions"], list) + else [kwargs["regions"]] + ) + ax = dm.plot_depth_profile.by_regions( + mod_file_name=results["pileup"][0], + regions_list=regions_list, + motif=motif, + sample_names=["label" for _ in regions_list], + **kwargs_plot_depth_profile_by_regions, + ) + assert isinstance( + ax, Axes + ), f"{test_case}: plotting failed for {motif}." + else: + print(f"{test_case} skipped for plot_depth_profile.by_regions.") + + def test_unit__plot_depth_profile_by_modification( + self, + test_case, + kwargs, + results, + ): + if results["pileup"][0] is not None: + kwargs_plot_depth_profile_by_modification = filter_kwargs_for_func( + dm.plot_depth_profile.by_modification, + kwargs, + extra_args=["window_size", "smooth_window"], + ) + ax = dm.plot_depth_profile.by_modification( + mod_file_name=results["pileup"][0], + **kwargs_plot_depth_profile_by_modification, + ) + assert isinstance(ax, Axes), f"{test_case}: plotting failed." + else: + print(f"{test_case} skipped for plot_depth_profile.by_modification.") + + def test_unit__plot_depth_by_dataset( + self, + test_case, + kwargs, + results, + ): + if results["pileup"][0] is not None: + kwargs_plot_depth_profile_by_dataset = filter_kwargs_for_func( + dm.plot_depth_profile.by_dataset, + kwargs, + extra_args=["window_size", "smooth_window"], + ) + for motif in kwargs["motifs"]: + ax = dm.plot_depth_profile.by_dataset( + mod_file_names=[results["pileup"][0]], + motif=motif, + **kwargs_plot_depth_profile_by_dataset, + ) + assert isinstance(ax, Axes), f"{test_case}: plotting failed." + else: + print(f"{test_case} skipped for plot_depth_profile.by_dataset.") + + +class TestPlotDepthHistogramSynthetic: + """ + Tests plotting functionality in plot_depth_histogram. + + This test simply checks that we can make plots from synthetic data without raising errors. + Appearance of plots is not verified. + """ + + def test_unit__plot_depth_histogram_plot_depth_histogram_synthetic(self): + ax = dm.plot_depth_histogram.plot_depth_histogram( + mod_file_names=["test1.fake", "test2.fake"], + regions_list=["test1.bed", "test2.bed"], + motifs=["A", "C"], + window_size=500, + sample_names=["sample1", "sample2"], ) - - for db_file in output_dbs: - self.assertOutputFileExists(db_file) - self.assertOutputFileExists(overlay_plot) - - def test_plot_enrichment_profile_overlay_incompatible_basemod(self): - """Verifies that plot_enrichment_profile remains incompatible with multi-basemod options.""" - with self.assertRaises(RuntimeError): - dm.plot_enrichment_profile( - fileNames=[str(f) for f in input_bams], - sampleNames=input_sample_names, - bedFiles=str(input_bed), - basemod="A+CG", - outDir=str(self.outDir), + assert isinstance(ax, Axes) + + def test_unit__plot_depth_histogram_by_modification_synthetic(self): + ax = dm.plot_depth_histogram.by_modification( + mod_file_name="test.fake", + regions="test.bed", + window_size=500, + motifs=["A", "C"], + ) + assert isinstance(ax, Axes) + + def test_unit__plot_depth_histogram_by_region_synthetic(self): + ax = dm.plot_depth_histogram.by_regions( + mod_file_name="test.fake", + regions_list=["test1.bed", "test2.bed"], + motif="A", + window_size=500, + sample_names=["on target", "off target"], + ) + assert isinstance(ax, Axes) + + def test_unit__plot_depth_histogram_by_dataset_synthetic(self): + ax = dm.plot_depth_histogram.by_dataset( + mod_file_names=["test1.fake", "test2.fake"], + regions="test.bed", + motif="A", + window_size=500, + sample_names=["experiment 1", "experiment 2"], + ) + assert isinstance(ax, Axes) + + +@pytest.mark.parametrize( + "test_case,kwargs,results", + [(case, inputs, outputs) for case, (inputs, outputs) in test_matrix.items()], +) +class TestPlotDepthHistogram: + def test_unit__plot_depth_histogram_plot_depth_histogram( + self, + test_case, + kwargs, + results, + ): + if results["pileup"][0] is not None: + kwargs_plot_depth_histogram_plot_depth_histogram = filter_kwargs_for_func( + dm.plot_depth_histogram.plot_depth_histogram, + kwargs, + extra_args=["window_size"], ) - - def test_plot_enrichment_profile_overlay_incompatible_bed_bam(self): - """Verifies that passing equal numbers of beds and bams remains an error.""" - with self.assertRaises(RuntimeError): - dm.plot_enrichment_profile( - fileNames=[str(f) for f in input_bams], - sampleNames=input_sample_names, - bedFiles=[str(input_bed), str(input_bed)], - basemod="A", - outDir=str(self.outDir), + for motif in kwargs["motifs"]: + regions_list = ( + kwargs["regions"] + if isinstance(kwargs["regions"], list) + else [kwargs["regions"]] + ) + kwargs_plot_depth_histogram_plot_depth_histogram["motifs"] = [ + motif for _ in regions_list + ] + ax = dm.plot_depth_histogram.plot_depth_histogram( + mod_file_names=[results["pileup"][0] for _ in regions_list], + regions_list=regions_list, + sample_names=["label" for _ in regions_list], + **kwargs_plot_depth_histogram_plot_depth_histogram, + ) + assert isinstance( + ax, Axes + ), f"{test_case}: plotting failed for {motif}." + else: + print(f"{test_case} skipped for plot_depth_histogram.plot_depth_histogram.") + + def test_unit__plot_depth_histogram_by_regions( + self, + test_case, + kwargs, + results, + ): + if results["pileup"][0] is not None: + kwargs_plot_depth_histogram_by_regions = filter_kwargs_for_func( + dm.plot_depth_histogram.by_regions, + kwargs, + extra_args=["window_size"], + ) + for motif in kwargs["motifs"]: + regions_list = ( + kwargs["regions"] + if isinstance(kwargs["regions"], list) + else [kwargs["regions"]] + ) + ax = dm.plot_depth_histogram.by_regions( + mod_file_name=results["pileup"][0], + regions_list=regions_list, + motif=motif, + sample_names=["label" for _ in regions_list], + **kwargs_plot_depth_histogram_by_regions, + ) + assert isinstance( + ax, Axes + ), f"{test_case}: plotting failed for {motif}." + else: + print(f"{test_case} skipped for plot_depth_histogram.by_regions.") + + def test_unit__plot_depth_histogram_by_modification( + self, + test_case, + kwargs, + results, + ): + if results["pileup"][0] is not None: + kwargs_plot_depth_histogram_by_modification = filter_kwargs_for_func( + dm.plot_depth_histogram.by_modification, + kwargs, + extra_args=["window_size"], ) + ax = dm.plot_depth_histogram.by_modification( + mod_file_name=results["pileup"][0], + **kwargs_plot_depth_histogram_by_modification, + ) + assert isinstance(ax, Axes), f"{test_case}: plotting failed." + else: + print(f"{test_case} skipped for plot_depth_histogram.by_modification.") + + def test_unit__plot_depth_by_dataset( + self, + test_case, + kwargs, + results, + ): + if results["pileup"][0] is not None: + kwargs_plot_depth_histogram_by_dataset = filter_kwargs_for_func( + dm.plot_depth_histogram.by_dataset, + kwargs, + extra_args=["window_size"], + ) + for motif in kwargs["motifs"]: + ax = dm.plot_depth_histogram.by_dataset( + mod_file_names=[results["pileup"][0]], + motif=motif, + **kwargs_plot_depth_histogram_by_dataset, + ) + assert isinstance(ax, Axes), f"{test_case}: plotting failed." + else: + print(f"{test_case} skipped for plot_depth_histogram.by_dataset.") + +class TestPlotReadsSynthetic: + """ + Tests plotting functionality in plot_reads. -if __name__ == "__main__": - unittest.main() + This test simply checks that we can make plots from synthetic data without raising errors. + Appearance of plots is not verified. + """ + + def test_unit__plot_reads_plot_reads_synthetic(self): + ax = dm.plot_reads.plot_reads( + mod_file_name="test.fake", regions="test.bed", motifs=["A,0", "CG,0"] + ) + assert isinstance(ax, Axes) + + +@pytest.mark.parametrize( + "test_case,kwargs,results", + [(case, inputs, outputs) for case, (inputs, outputs) in test_matrix.items()], +) +class TestPlotReads: + def test_unit__plot_reads_plot_reads( + self, + test_case, + kwargs, + results, + ): + if results["extract"][0] is not None: + kwargs_plot_reads_plot_reads = filter_kwargs_for_func( + dm.plot_reads.plot_reads, kwargs + ) + if kwargs["thresh"] is not None: + ax = dm.plot_reads.plot_reads( + mod_file_name=results["extract"][0], + **kwargs_plot_reads_plot_reads, + ) + assert isinstance(ax, Axes), f"{test_case}: plotting failed." + else: # if the extract parameters did not have a threshold, plot_reads.plot_reads should raise an error + with pytest.raises(ValueError) as excinfo: + ax = dm.plot_reads.plot_reads( + mod_file_name=results["extract"][0], + **kwargs_plot_reads_plot_reads, + ) + assert "No threshold has been applied" in str( + excinfo.value + ), f"{test_case}: unexpected exception {excinfo.value}" + # providing a threshold should be enough to run plot_reads.plot_reads without an error + kwargs_plot_reads_plot_reads["thresh"] = 0.75 + ax = dm.plot_reads.plot_reads( + mod_file_name=results["extract"][0], + **kwargs_plot_reads_plot_reads, + ) + assert isinstance(ax, Axes), f"{test_case}: plotting failed." + else: + print(f"{test_case} skipped for test_unit__plot_reads_plot_reads.") + + +@pytest.mark.parametrize( + "test_case,kwargs,results", + [(case, inputs, outputs) for case, (inputs, outputs) in test_matrix.items()], +) +class TestPlotReadBrowser: + def test_unit__plot_read_browser( + self, + test_case, + kwargs, + results, + ): + if results["extract"][0] is not None: + kwargs_plot_read_browser = filter_kwargs_for_func( + dm.plot_read_browser.plot_read_browser, kwargs + ) + if ( + kwargs["thresh"] is None + and kwargs["thresh"] is None + and not isinstance(kwargs["regions"], list) + and Path(kwargs["regions"]).suffix != ".bed" + ): + fig = dm.plot_read_browser.plot_read_browser( + mod_file_name=results["extract"][0], + region=kwargs["regions"], + **kwargs_plot_read_browser, + ) + assert isinstance( + fig, plotly.graph_objs.Figure + ), f"{test_case}: plotting failed." + else: + with pytest.raises(ValueError) as excinfo: + fig = dm.plot_read_browser.plot_read_browser( + mod_file_name=results["extract"][0], + region=kwargs["regions"], + **kwargs_plot_read_browser, + ) + if ( + isinstance(kwargs["regions"], list) + or Path(kwargs["regions"]).suffix == ".bed" + ) and kwargs["thresh"] is None: + assert ( + "Invalid region" in str(excinfo.value) + ), f"{test_case}: unexpected exception for no-threshold bad-region case {excinfo.value}" + elif ( + kwargs["thresh"] is not None + and not isinstance(kwargs["regions"], list) + and Path(kwargs["regions"]).suffix != ".bed" + ): + assert ( + "A threshold has been applied" in str(excinfo.value) + ), f"{test_case}: unexpected exception thresholded valid-region case {excinfo.value}" + else: + assert ( + "A threshold has been applied" in str(excinfo.value) + or "Invalid region" in str(excinfo.value) + ), f"{test_case}: unexpected exception thresholded bad-region case {excinfo.value}" + + else: + print(f"{test_case} skipped for test_unit__plot_read_browser") diff --git a/dimelo/test/generate_targets.py b/dimelo/test/generate_targets.py new file mode 100644 index 00000000..50dc1411 --- /dev/null +++ b/dimelo/test/generate_targets.py @@ -0,0 +1,205 @@ +import argparse +import pickle +from pathlib import Path + +from cases import test_matrix +from tqdm.auto import tqdm + +from dimelo import load_processed, parse_bam +from dimelo.test import DiMeLoParsingTestCase, RelativePath, filter_kwargs_for_func + +ref_genome_file = Path(RelativePath("./output/chm13.draft_v1.0.fasta")) +# Base input and output directories +test_data_dir = Path(RelativePath("./data")) +output_dir = test_data_dir / "test_targets" + +output_dir.mkdir(exist_ok=True) + + +def generate_pileup(test_matrix, case_subset): + print("Generating pileup files...") + for case in case_subset if case_subset is not None else test_matrix.keys(): + kwargs, results = test_matrix[case] + kwargs_pileup = filter_kwargs_for_func(parse_bam.pileup, kwargs) + pileup_file, pileup_regions = parse_bam.pileup( + **kwargs_pileup, + ref_genome=ref_genome_file, + ) + results["pileup"] = ( + RelativePath(pileup_file), + RelativePath(pileup_regions), + ) + + +def generate_extract(test_matrix, case_subset): + print("Generating extract files...") + for case in case_subset if case_subset is not None else test_matrix.keys(): + kwargs, results = test_matrix[case] + kwargs_extract = filter_kwargs_for_func(parse_bam.extract, kwargs) + if "cores" in kwargs_extract: + del kwargs_extract["cores"] + extract_file, extract_regions = parse_bam.extract( + **kwargs_extract, + ref_genome=ref_genome_file, + cores=1, + ) + results["extract"] = ( + RelativePath(extract_file), + RelativePath(extract_regions), + ) + + +def generate_pileup_counts_from_bedmethyl(test_matrix, case_subset): + for case in tqdm( + case_subset if case_subset is not None else test_matrix.keys(), + desc="Generating pileup counts", + ): + kwargs, results = test_matrix[case] + results["pileup_counts_from_bedmethyl"] = {} + kwargs_func = filter_kwargs_for_func( + load_processed.pileup_counts_from_bedmethyl, kwargs + ) + for motif in kwargs["motifs"]: + results["pileup_counts_from_bedmethyl"][motif] = ( + load_processed.pileup_counts_from_bedmethyl( + bedmethyl_file=results["pileup"][0], + **kwargs_func, + motif=motif, + ) + ) + + +def generate_pileup_vectors_from_bedmethyl(test_matrix, case_subset): + for case in tqdm( + case_subset if case_subset is not None else test_matrix.keys(), + desc="Generating pileup vectors", + ): + kwargs, results = test_matrix[case] + results["pileup_vectors_from_bedmethyl"] = {} + kwargs_func = filter_kwargs_for_func( + load_processed.pileup_vectors_from_bedmethyl, kwargs + ) + for motif in kwargs["motifs"]: + results["pileup_vectors_from_bedmethyl"][motif] = ( + load_processed.pileup_vectors_from_bedmethyl( + bedmethyl_file=results["pileup"][0], + **kwargs_func, + motif=motif, + ) + ) + + +def generate_read_vectors_from_hdf5(test_matrix, case_subset): + for case in tqdm( + case_subset if case_subset is not None else test_matrix.keys(), + desc="Generating read vectors", + ): + kwargs, results = test_matrix[case] + extract_file, regions_bed = results["extract"] + if extract_file is not None and regions_bed is not None: + kwargs_func = filter_kwargs_for_func( + load_processed.read_vectors_from_hdf5, kwargs + ) + read_data_list, datasets, _ = load_processed.read_vectors_from_hdf5( + file=extract_file, + **kwargs_func, + ) + read_data_dict = {} + # Pull out the data from the first read + for idx, dataset in enumerate(datasets): + for read_data in read_data_list: + read_data_dict[dataset] = read_data[idx] + break + results["read_vectors_from_hdf5"] = read_data_dict + + +def main(test_matrix): + """ + The main function runs applicable generators based on the test_matrix defined in cases.py and kwargs. + + Args: + test_matrix: the dict containing test cases. This will be modified in-place to contain existing targets + if generators won't be getting re-run, based on the command line parsed arguments described below. + """ + # Set up input files, including ref genome download + DiMeLoParsingTestCase.setup_class() + + parser = argparse.ArgumentParser( + description="Generate target data from test cases." + ) + + valid_subsets = [ + "pileup", + "extract", + "pileup_counts_from_bedmethyl", + "pileup_vectors_from_bedmethyl", + "read_vectors_from_hdf5", + ] + + parser.add_argument( + "--target-subset", + nargs="*", + help=f"""Specify one or more subsets of test targets, separated by spaces (default: all). + The following are valid options: {valid_subsets}""", + ) + + parser.add_argument( + "--case-subset", + nargs="*", + help=f"""Specify one or more subsets of cases, separated by spaces (default: all). + The following are valid options based on your current cases.py file: {test_matrix.keys()}""", + ) + + parser.add_argument( + "--initial-target-pickle", + type=str, + default=RelativePath("data/test_targets/test_matrix.pickle"), + help="A test target pickle to start with, when updating only a subset of cases.", + ) + + args = parser.parse_args() + + if args.target_subset is None: + args.target_subset = valid_subsets + print( + f"Running {'all cases' if args.case_subset is None else args.case_subset} through all target generators from scratch based on test_cases.py" + ) + else: + if Path(args.initial_target_pickle).exists(): + with open(RelativePath(args.initial_target_pickle), "rb") as file: + old_test_matrix = pickle.load(file) + # loop through the old test matrix + for key, (old_kwargs, old_results) in old_test_matrix.items(): + # if the old test case is in the new test matrix, bring over the results + # either the test targets will be regenerated, and the results replaced, or they won't be regenerated, and we'll need the old results + if key in test_matrix: + new_kwargs = test_matrix[key][0] + # if case will be covered, bring in new kwargs + if args.case_subset is None or key in args.case_subset: + test_matrix[key] = (new_kwargs, old_results) + # if case will not be covered, keep old kwargs + else: + test_matrix[key] = (old_kwargs, old_results) + print( + f"Running {'all cases' if args.case_subset is None else args.case_subset} through {args.target_subset} to supplement test targets from {args.initial_target_pickle}. Any new tests in cases.py will be added to the test matrix." + ) + else: + raise ValueError( + f"Cannot run subset {args.target_subset} without a pre-existing complete set of generated targets, {args.initial_target_pickle} does not exist. Either specify an --initial-target-pickle that does exist or run without subsetting." + ) + + print("Generating targets for the following test matrix kwargs") + for test_name, (kwargs, _) in test_matrix.items(): + print(test_name) + print(kwargs) + + for subset in args.target_subset: + function_name = f"generate_{subset}" + globals()[function_name](test_matrix, args.case_subset) + + with open(RelativePath("./data/test_targets/test_matrix.pickle"), "wb") as file: + pickle.dump(test_matrix, file) + + +if __name__ == "__main__": + main(test_matrix) diff --git a/dimelo/test/helper/test_utils.py b/dimelo/test/helper/test_utils.py deleted file mode 100644 index 69c3ebdb..00000000 --- a/dimelo/test/helper/test_utils.py +++ /dev/null @@ -1,50 +0,0 @@ -# helper functions for dimelo_test.py - -from dimelo.parse_bam import parse_bam - - -def create_methylation_objects(): - - fileNames = [ - "dimelo/test/data/mod_mappings_subset.bam", - "dimelo/test/data/winnowmap_guppy_merge_subset.bam", - ] - sampleName = "test" - bedFile = "dimelo/test/data/test.bed" - basemods = ["A", "CG", "A+CG"] - centers = [True, False] - windowSize = 1000 - - all_data_combined = [] - for fileName in fileNames: - for basemod in basemods: - for center in centers: - all_data = parse_bam( - fileName, - sampleName, - bedFile, - basemod, - center, - windowSize, - ) - all_data_combined.append(all_data) - - # returned object is a list of 12 all_data objects - # 0. mod_mappings A center=True - # 1. mod_mappings A center=False - # 2. mod_mappings CG center=True - # 3. mod_mappings CG center=False - # 4. mod_mappings A+CG center=True - # 5. mod_mappings A+CG center=False - # 6. winnow_guppy A center=True - # 7. winnow_guppy A center=False - # 8. winnow_guppy CG center=True - # 9. winnow_guppy CG center=False - # 10. winnow_guppy A+CG center=True - # 11. winnow_guppy A+CG center=False - return all_data_combined - - -def extract_methylation_data_subset(data, index, read_name): - # returns a dataframe subset for given methylation data and read name - return data[index][data[index]["read_name"] == read_name] diff --git a/dimelo/test_data.py b/dimelo/test_data.py new file mode 100644 index 00000000..3fec3fd0 --- /dev/null +++ b/dimelo/test_data.py @@ -0,0 +1,123 @@ +import numpy as np + +from . import utils + + +def expspace_prob(num: int, a: float, b: float = 1) -> np.ndarray: + """ + Return probability values spaced over the interval 0 to b along an exponential curve. + + Calculated as y = ((a^x - 1) / (a - 1)) * b, a > 1, 0 < b <= 1 + + Args: + num: total length of space to return; same as num argument to np.linspace + a: controls the depth of the curve; higher values result in a longer wait before going to 1. Must be >1. + b: controls the max value of the curve. Must be between (0, 1]. + + Returns: + Array of probability values betweeen 0 and b, spaced along an exponential curve + """ + if a <= 1: + raise ValueError("Value of a must be > 1.") + if b > 1: + raise ValueError("Value of b must be between (0, 1].") + return (np.power(a, np.linspace(start=0, stop=1, num=num)) - 1) / (a - 1) * b + + +def fake_read_mod_calls(halfsize: int, read_type: str, max_prob: float) -> np.ndarray: + """ + Generates a read of the given size with modifications; returns 0 where there is no mod, 1 where there is a mod. + + TODO: More realistic read varieties + TODO: Fewer magic numbers + + Args: + halfsize: specifies length of output trace; final length will be 2*halfsize + read_type: string name of desired read type; see match statement for available types + max_prob: maximum probability of any single position being called as modified + + Returns: + Array of 0s and 1s, patterned appropriately + """ + # Set the vector of p-vals for the bernoulli distribution pulls based on the requested read type + match read_type: + case "peak": + # higher chance of mod at center of read + p_vec = expspace_prob(num=halfsize, a=15, b=max_prob) + case "uniform": + # uniform low chance of mod across entire read + p_vec = [0.05] * halfsize + case "inverse_peak": + # higher chance of mod at edges of read + p_vec = np.flip(expspace_prob(num=halfsize, a=15, b=max_prob)) + case _: + ValueError(f"Unknown read type {read_type}") + first_half = [utils.rng.binomial(n=1, p=x) for x in p_vec] + second_half = np.flip([utils.rng.binomial(n=1, p=x) for x in p_vec]) + return np.concatenate([first_half, second_half]) + + +def fake_read_mod_positions( + halfsize: int, read_type: str, max_prob: float +) -> np.ndarray: + """ + Generates a read of the given size with modifications; returns positions where there is a modification. + Positions are relative to the center of the read. + + See fake_read_mod_calls for details. + + TODO: Should this be able to operate in a non-centered fashion? + + Returns: + Vector of positions of modified bases + """ + return ( + np.flatnonzero( + fake_read_mod_calls( + halfsize=halfsize, read_type=read_type, max_prob=max_prob + ) + ) + - halfsize + ) + + +def fake_peak_enrichment_profile( + halfsize: int, peak_height: float, n_reads: int = 100 +) -> np.ndarray: + """ + Generates a random fake peak, with measurements increasing in value up to the center point and decreasing after. + Returns enrichment values (fraction modified bases) at each position. + + Args: + halfsize: specifies length of output trace; final length will be 2*halfsize + peak_height: max height of peak. Must be (0, 1]. + n_reads: number of reads to generate + + Returns: + Array of enrichment values between 0 and 1, peaking at the middle + """ + reads = [fake_read_mod_calls(halfsize, "peak", peak_height) for _ in range(n_reads)] + modified_base_counts = np.sum(reads, axis=0) + modified_fractions = np.divide(modified_base_counts, n_reads) + return modified_fractions + + +def fake_peak_enrichment( + halfsize: int, peak_height: float, n_reads: int = 100 +) -> tuple[int, int]: + """ + Generates total modification enrichment counts for a set of fake peak reads spanning some region. + Returns enrichment values (fraction modified bases) summed across the entire region. + + Args: + halfsize: specifies length of output trace; final length will be 2*halfsize + peak_height: max height of peak. Must be (0, 1]. + n_reads: number of reads to generate + + Returns: + tuple containing counts of (modified bases, total_bases) + """ + reads = [fake_read_mod_calls(halfsize, "peak", peak_height) for _ in range(n_reads)] + modified_bases = np.sum(reads) + total_bases = np.sum(np.fromiter((len(read) for read in reads), dtype=int)) + return (modified_bases, total_bases) diff --git a/dimelo/utils.py b/dimelo/utils.py index 2ac7ab57..e4ad62ba 100644 --- a/dimelo/utils.py +++ b/dimelo/utils.py @@ -1,67 +1,491 @@ -r""" -================================================= -Functions for sqlite db -================================================= -""" +import multiprocessing +from collections import defaultdict +from pathlib import Path +import numpy as np +import pandas as pd +import seaborn as sns +from matplotlib.axes import Axes -import os -import sqlite3 +# This provides the mapping of canonical bases to sets of valid mode names +# It is a defaultdict because any bases without a default should still +# have valid entries, but they should be empty sets +BASEMOD_NAMES_DICT = defaultdict(lambda: set()) +BASEMOD_NAMES_DICT.update( + { + "A": {"a", "Y"}, + "C": {"m", "Z"}, + } +) +# Default colors for seaborn plots +DEFAULT_COLORS = defaultdict(lambda: "grey") +DEFAULT_COLORS.update( + { + "A,0": "blue", + "A,0,a": "blue", + "CG,0": "orange", + "CG,0,m": "yellow", + "CG,0,h": "red", + "GCH,1": "purple", + } +) +# Default colorscales for plotly; based off of DEFAULT_COLORS +DEFAULT_COLORSCALES = defaultdict(lambda: ["white", "grey"]) +DEFAULT_COLORSCALES.update([(k, ["white", v]) for k, v in DEFAULT_COLORS.items()]) -def clear_db(database_name): - if os.path.exists(database_name): - os.remove(database_name) - if os.path.exists(database_name + "-journal"): - os.remove(database_name + "-journal") +# Define the source of randomness for a variety of purposes throughout the package +# TODO: how best to initialize seed for random state, to allow for reproducibility? +rng = np.random.default_rng() -def create_sql_table(database_name, table_name, cols, d_types): - conn = sqlite3.connect(database_name) - c = conn.cursor() - s = "" - for i in range(len(cols)): - if i == 0: - s = s + cols[i] + " " + d_types[i] + " " + "PRIMARY KEY, " - elif i == len(cols) - 1: - s = s + cols[i] + " " + d_types[i] + +def cores_to_run(cores): + cores_avail = multiprocessing.cpu_count() + if cores is None or cores > cores_avail: + return cores_avail + else: + return cores + + +class ParsedMotif: + def __init__(self, motif_string): + """ + ParsedMotif takes in a base modification specifier motif, e.g. CG,0 or CG,0,m, + and parses it for easy use later. + + args: + -motif_string: a specifier string containing sequence_context,mod_coord(,optional mod_code) + """ + parts = motif_string.split(",") + if len(parts) == 2: + # If a mod code isn't specified, we use the default set + self.motif_seq = parts[0] + self.modified_pos = int(parts[1]) + if self.modified_pos >= len(self.motif_seq): + raise ValueError(f"Motif {motif_string} has an out-of-range mod index.") + self.modified_base = self.motif_seq[self.modified_pos] + self.mod_codes = BASEMOD_NAMES_DICT[self.modified_base] + elif len(parts) == 3: + # If a mod code is specified, that will be the only one we look for + self.motif_seq = parts[0] + self.modified_pos = int(parts[1]) + if self.modified_pos >= len(self.motif_seq): + raise ValueError(f"Motif {motif_string} has an out-of-range mod index.") + self.modified_base = self.motif_seq[self.modified_pos] + self.mod_codes = set(parts[2]) + else: + # Motifs need both a sequence and an index, separated by a comma + raise ValueError( + f"Motif {motif_string} must have 2 or 3 comma-separated elements: sequence, index, and (optionally) mod code." + ) + + +def adjust_threshold( + thresh, + quiet=True, +): + if thresh > 0: + if thresh > 1: + if not quiet: + print( + f"Modification threshold of {thresh} assumed to be for range 0-255. {thresh}/255={thresh / 255} will be sent to modkit." + ) + thresh_scaled = thresh / 255 else: - s = s + cols[i] + " " + d_types[i] + "," + " " - fs = "(" + s + ")" - c.execute("""DROP TABLE IF EXISTS """ + table_name + """;""") - c.execute("""CREATE TABLE """ + table_name + """ """ + fs + """;""") - conn.commit() - c.close() - - -def execute_sql_command( - command: str, database_name: str, values, conn=None -) -> None: - """ - Function to execute a SQL command from Python. - Parameters - ---------- - command: str - SQL command (use strings with three quotes on each side - so that it can be a multiline string - database_name: str - File name of the database (e.g, “my.db”) - Returns - ------- - No return, executes the command - """ - # will create if not present - if conn is None: - conn = sqlite3.connect(database_name, timeout=60.0) - c = conn.cursor() - # c.execute('BEGIN TRANSACTION') - if len(values) == 0: - c.execute(command) - elif type(values) == list: - c.executemany(command, values) + if not quiet: + print( + f"Modification threshold of {thresh} will be treated as coming from range 0-1." + ) + thresh_scaled = thresh + + return thresh_scaled + return thresh + + +def process_chunks_from_regions_dict( + regions_dict: dict, + chunk_size: int, +): + """ + returns: a list of chunk specifier dictionaries, which contain region and subregion information. The subregion start and end + are always within the region. This information is sufficient for a downstream process to operate on the subregion chunk while + knowing where it lies within the larger region. + """ + chunk_list = [] + for chromosome, region_list in regions_dict.items(): + for start_coord, end_coord, strand in region_list: + for subregion_start in range(start_coord, end_coord, chunk_size): + subregion_end = min(end_coord, subregion_start + chunk_size) + chunk_list.append( + { + "chromosome": chromosome, + "region_start": start_coord, + "region_end": end_coord, + "subregion_start": subregion_start, + "subregion_end": subregion_end, + "strand": strand, + } + ) + return chunk_list + + +def regions_dict_from_input( + regions: str | Path | list[str | Path] | None = None, + window_size: int | None = None, +) -> dict: + """ + Create a dictionary defining every region provided in the regions input + key: chromosome strings + value: lists of (start,end,strand) + + TODO: Maybe this dict object should be a more codified type + """ + # TODO: Why is this declared out here, and not within add_region_to_dict? To my eye, that method should just return the fully-loaded dict. + # I don't think this approach works because add_region_to_dict can be called many times; the regions parameter can be a single bed path / string OR many in a list + regions_dict: defaultdict[str, list] = defaultdict(list) + + if window_size is not None and window_size <= 0: + raise ValueError( + "Invalid window_size. To disable windowing, set window_size to None or do not pass a value (the default is None)." + ) + + if isinstance(regions, list): + for region in regions: + add_region_to_dict(region, window_size, regions_dict) else: - c.execute(command, values) - # saves the changes - conn.commit() - c.close() - # conn.close() + add_region_to_dict(regions, window_size, regions_dict) + for chrom in regions_dict: + regions_dict[chrom].sort(key=lambda x: x[0]) + + return regions_dict + + +def add_region_to_dict( + region: str | Path, + window_size: int | None, + regions_dict: dict, +): + # TODO: The flow of this is very confusing, creating mypy errors, and possibly creates actual errors. + # mypy error: dimelo/utils.py:110: error: Item "str" of "str | Path" has no attribute "name" [union-attr] + # Basically, this method is confusing because the string can be a pathlike or a region string. + # Find a different way to check whether the string is pathlike or a region string, coerce paths to Path objects, then clean up everything else. + + # Added None as a window_size option, it was already handled below so was always a valid input + + # We check whether the region is a path to a .bed file by seeing if, when coerced into a Path object, it has the suffix 'bed' + if Path(region).suffix == ".bed": + with open(region) as bed_regions: + for line_index, line in enumerate(bed_regions): + fields = line.split() + if len(fields) > 2: + # Per the bed spec, the 6th column is strand + # https://genome.ucsc.edu/FAQ/FAQformat.html + if len(fields) > 5: + chrom, start, end, strand = ( + fields[0], + int(fields[1]), + int(fields[2]), + fields[5], + ) + # If strand isn't in the bed file, we set to . (neither/both) + else: + chrom, start, end, strand = ( + fields[0], + int(fields[1]), + int(fields[2]), + ".", + ) + if window_size is None: + regions_dict[chrom].append((start, end, strand)) + else: + center_coord = (start + end) // 2 + regions_dict[chrom].append( + ( + center_coord - window_size, + center_coord + window_size, + strand, + ) + ) + else: + raise ValueError( + f"Invalid bed format line {line_index} of {Path(region).name}" + ) + # If the region is a path but *not* to a bed file, that isn't valid + elif isinstance(region, Path): + raise ValueError( + f"Path object {region} is not pointing to a .bed file. regions must be provided as paths to .bed files or as strings in the format chrX:XXX-XXX,strand." + ) + # If the region is a string and doesn't convert to a path to a bed file, then it must be a region string else it cannot be parsed + elif ( + isinstance(region, str) + and len(region.split(":")) == 2 + and 2 <= len(region.split(":")[1].split("-")) <= 3 + ): + chrom, (start, end, strand) = parse_region_string( + region=region, window_size=window_size + ) + regions_dict[chrom].append((start, end, strand)) + else: + raise ValueError( + f"Invalid regions {type(region)}: {region}. Please use the format chrX:XXX-XXX,strand." + ) + + +def parse_region_string( + region: str, + window_size: int | None, +) -> tuple[str, tuple[int, int, str]]: + """ + Parse a region specification string into its component parts. + + Args: + region: a region string of the format chrX:XXX-XXX or chrX:XXX-XXX,strand (+/-/.) + window_size: if present, returns a window of this size around the center of the given region + + Returns: + chromosome, (start_pos, end_pos, strand) + """ + try: + # region strings can be either chrX:XXX-XXX or chrX:XXX-XXX,strand (+/-/.) + region_coords = region.split(",") + # The default strand is ., which is neither strand + strand = region_coords[1] if len(region_coords) > 1 else "." + chrom, coords = region_coords[0].split(":") + start, end = map(int, coords.split("-")) + if window_size is None: + return chrom, (start, end, strand) + else: + center_coord = (start + end) // 2 + return chrom, ( + center_coord - window_size, + center_coord + window_size, + strand, + ) + except (ValueError, AttributeError) as err: + raise ValueError( + f"Invalid region string {region}. Region strings can be either chrX:XXX-XXX or chrX:XXX-XXX,strand (+/-/.)." + ) from err + + +def bed_from_regions_dict( + regions_dict: dict, + save_bed_path: Path, +): + with open(save_bed_path, "w") as processed_bed: + for chrom, regions_list in regions_dict.items(): + for start, end, _ in regions_list: + bed_line = ( + "\t".join([chrom, str(start), str(end), ".", ".", "."]) + "\n" + ) + processed_bed.write(bed_line) + + +def bedmethyl_to_bigwig(input_bedmethyl: str | Path, output_bigwig: str | Path): + return 0 + + +def sanitize_path_args(*args) -> tuple: + """ + Coerce all given arguments to Path objects, leaving Nones as Nones. + """ + return tuple(Path(f) if f is not None else f for f in args) + + +def check_len_equal(*args: list) -> bool: + """ + Checks whether all provided lists are the same length. + """ + return all(len(x) == len(args[0]) for x in args) + + +def bar_plot(categories: list[str], values: np.ndarray, y_label: str, **kwargs) -> Axes: + """ + Utility for producing bar plots. + + Args: + categories: parallel with values; bar labels + values: parallel with categories: bar heights + y_label: y-axis label + kwargs: other keyword parameters passed through to seaborn.barplot + + Returns: + Axes object containing the plot + """ + axes = sns.barplot(x=categories, y=values, hue=categories, **kwargs) + axes.set(ylabel=y_label) + return axes + + +def line_plot( + indep_vector: np.ndarray, + indep_name: str, + dep_vectors: list[np.ndarray], + dep_names: list[str], + y_label: str, + **kwargs, +) -> Axes: + """ + Utility for producing overlayed line plots for data vectors with the same x-axis values. + + Takes in one independent vector and arbitrarily many dependent vectors. Plots all dependent vectors on the same axes against the same dependent vector. + All vectors must be of equal length. + + TODO: Right now, this always generates a legend with the title "variable". I could add a parameter to specify this (by passing the var_name argument to pd.DataFrame.melt), but then that percolates upwards to other methods. How to do this cleanly? + + Args: + indep_vector: parallel with each entry in dep_vectors; independent variable values shared across each overlayed line + indep_name: name of independent variable; set as x axis label + dep_vectors: outer list parallel with dep_names; each inner vector parallel with indep_vector; dependent variable values for each overlayed line + dep_names: parallel with dep_vectors; names of each overlayed line; set as legend entries + y_label: y-axis label + kwargs: other keyword parameters passed through to seaborn.lineplot + + Returns: + Axes object containing the plot + + Raises: + ValueError: raised if any vectors are of unequal length + """ + # construct dict of {vector_name: vector}, including the x vector using dict union operations + data_dict = {indep_name: indep_vector} | dict(zip(dep_names, dep_vectors)) + # construct long-form data table for plotting + try: + data_table = pd.DataFrame(data_dict).melt( + id_vars=indep_name, value_name=y_label + ) + except ValueError as e: + raise ValueError( + "All dependent and independent vectors must be the same length" + ) from e + # plot lines + return sns.lineplot( + data=data_table, x=indep_name, y=y_label, hue="variable", **kwargs + ) + + +def hist_plot( + value_vectors: list[np.ndarray], + value_names: list[str], + x_label: str, + y_label: str, + integer_values: bool = False, + **kwargs, +) -> Axes: + """ + Utility for producing overlayed histogram plots for data vectors containing values with some distribution. + + Takes arbitrarily many counts vectors and plots on same histogram. + + Args: + value_vectors: parallel with value_names; vectors of values to plot histograms of; each vector will be a separate overlayed histogram + value_names: parallel with value_vectors; names of each overlayed histogram; set as legend entries + x_label: name of distributed values; set as x axis label + y_label: y-axis label + integer_values: True if hist bins are only at integer values, meaning bins shouldn't be auto-determined + kwargs: other keyword parameters passed through to seaborn.histplot + + Returns: + Axes object containing the plot + + Raises: + ValueError: raised if any vectors are of unequal length + """ + # Flatten the vectors and assign corresponding labels + data_dict = { + x_label: np.concatenate(value_vectors), + y_label: np.repeat(value_names, [len(vec) for vec in value_vectors]), + } + + # Create DataFrame + data_table = pd.DataFrame(data_dict) + if integer_values: + # Warn user that passed bins are being overwritten + if "bins" in kwargs: + print("Warning: bin settings overwritten by defaults") + kwargs["bins"] = np.arange( + data_table[x_label].min() - 0.5, data_table[x_label].max() + 1.5, 1 + ) + + # plot histogram + ax = sns.histplot( + data=data_table, + x=x_label, + hue=y_label, + multiple="dodge", + **kwargs, + ) + + ax.set_ylabel(y_label) + + return ax + + +def smooth_rolling_mean( + vector: np.ndarray[float], window: int, min_periods: int = 1 +) -> np.ndarray: + """ + Smooths the given vector, using rolling centered windows of the given size. + See pandas rolling documentation for details; documentation for relevant arguments copied here. + + Note: Because this operation is always centered, min_periods only has an effect if it is less than half of window size. + + TODO: Is pandas the most efficient implementation for this? + TODO: Is it reasonable for min_periods to be default 1? That makes some sense for plotting, but might make analysis misleading in the future, compared to defaulting to window size. + + Args: + vector: the vector of values to smooth + window: size of the moving window + min_periods: minimum number of observations in window to output a value; otherwise, result is np.nan + + Returns: + Vector of smoothed values + """ + return ( + pd.Series(vector) + .rolling(window=window, min_periods=min_periods, center=True) + .mean() + .values + ) + + +def random_sample( + array: np.ndarray, + n: int | None = None, + frac: float | None = None, + replace: bool = False, + # shuffle: bool = True, +): + """ + Utility method for generating a random sample of the elements in an array. Always defaults to sampling along the first axis. + This means that for 2d arrays this method will return a subsample of the rows. + + Handles n/frac specification like pandas.DataFrame.sample(): https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.sample.html. + + Args: + array: Array to sample from + n: Number of elements to return; mutually exclusive with frac + frac: Fraction of elements to return; mutually exclusive with n + replace: When True, sample with replacement + + Return: the requested random subset of the given array + + NOTE: Outputs are not guaranteed to be in the same order as the original array. If ordering is required to be preserved, re-sort after. + + TODO: enable non-uniform weights? Seems like too much to me... + TODO: shuffled outputs originally broke h5 loading, so it was turned off. However, because of the instability of the sampling order, + this doesn't actually matter. However, it is being left off to prevent confusion for the end user. + """ + size = pd.core.sample.process_sampling_size(n, frac, replace) + if size is None: + assert frac is not None + size = round(frac * len(array)) + return rng.choice( + a=array, + size=size, + replace=replace, + p=None, + axis=0, + # shuffle=shuffle + shuffle=False, + ) diff --git a/docs/.nojekyll b/docs/.nojekyll deleted file mode 100644 index e69de29b..00000000 diff --git a/docs/Makefile b/docs/Makefile deleted file mode 100644 index c271f08f..00000000 --- a/docs/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -# Minimal makefile for Sphinx documentation -# - -# You can set these variables from the command line, and also -# from the environment for the first two. -SPHINXOPTS ?= -SPHINXBUILD ?= sphinx-build -SOURCEDIR = . -BUILDDIR = . - -# Put it first so that "make" without argument is like "make help". -help: - @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) - -.PHONY: help Makefile - -# Catch-all target: route all unknown targets to Sphinx using the new -# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). -%: Makefile - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/auto_examples/auto_examples_jupyter.zip b/docs/auto_examples/auto_examples_jupyter.zip deleted file mode 100644 index d970304c..00000000 Binary files a/docs/auto_examples/auto_examples_jupyter.zip and /dev/null differ diff --git a/docs/auto_examples/auto_examples_python.zip b/docs/auto_examples/auto_examples_python.zip deleted file mode 100644 index 4c34adc1..00000000 Binary files a/docs/auto_examples/auto_examples_python.zip and /dev/null differ diff --git a/docs/auto_examples/browser_example.ipynb b/docs/auto_examples/browser_example.ipynb deleted file mode 100644 index c5f158fa..00000000 --- a/docs/auto_examples/browser_example.ipynb +++ /dev/null @@ -1,82 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n# Single-Molecule Browser Plot\n\nPlot single molecules with colored base modifications in a region of interest\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Create either an interactive single-molecule HTML browser if static=False, or create a PDF if static=True.\nBase modifications are colored by type (mA vs. mCG) and probability of modification.\nExample data for producing these plots can be downloaded from SRA: https://www.ncbi.nlm.nih.gov/bioproject/752170\nThe below Python and command line options produce the same output.\n\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 1. Python option\n\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "import dimelo as dm\n\nbam = \"deep_ctcf_mod_mappings_merge.sorted.bam\"\nsampleName = \"CTCF\"\noutDir = \"./out\"\ndm.plot_browser(\n bam,\n sampleName,\n \"chr11:2086423-2091187\",\n \"A+CG\",\n outDir,\n threshA=153,\n threshC=153,\n static=True,\n smooth=100,\n min_periods=10,\n)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 2. Command line option\n``dimelo-plot-browser -f deep_ctcf_mod_mappings_merge.sorted.bam -s CTCF -r chr11:2086423-2091187 -m A+CG -o ./out -A 153 -C 153 --static -t 100 -n 10``\n\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Output\n.. figure:: ../auto_examples/images/methylation_browser_chr11_2086423_2091187.png\n :align: center\n.. figure:: ../auto_examples/images/CTCF_A_sm_rolling_avg_fraction.png\n :align: center\n.. figure:: ../auto_examples/images/CTCF_A_sm_rolling_avg_total.png\n :align: center\n.. figure:: ../auto_examples/images/CTCF_CG_sm_rolling_avg_fraction.png\n :align: center\n.. figure:: ../auto_examples/images/CTCF_CG_sm_rolling_avg_total.png\n :align: center\n\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} \ No newline at end of file diff --git a/docs/auto_examples/browser_example.py b/docs/auto_examples/browser_example.py deleted file mode 100644 index dc4e0a06..00000000 --- a/docs/auto_examples/browser_example.py +++ /dev/null @@ -1,52 +0,0 @@ -""" -Single-Molecule Browser Plot -============================ - -Plot single molecules with colored base modifications in a region of interest - -""" -# %% -# Create either an interactive single-molecule HTML browser if static=False, or create a PDF if static=True. -# Base modifications are colored by type (mA vs. mCG) and probability of modification. -# Example data for producing these plots can be downloaded from SRA: https://www.ncbi.nlm.nih.gov/bioproject/752170 -# The below Python and command line options produce the same output. - -# %% -# 1. Python option -# ---------------- -import dimelo as dm - -bam = "deep_ctcf_mod_mappings_merge.sorted.bam" -sampleName = "CTCF" -outDir = "./out" -dm.plot_browser( - bam, - sampleName, - "chr11:2086423-2091187", - "A+CG", - outDir, - threshA=153, - threshC=153, - static=True, - smooth=100, - min_periods=10, -) - -# %% -# 2. Command line option -# ---------------------- -# ``dimelo-plot-browser -f deep_ctcf_mod_mappings_merge.sorted.bam -s CTCF -r chr11:2086423-2091187 -m A+CG -o ./out -A 153 -C 153 --static -t 100 -n 10`` - -# %% -# Output -# ---------------------- -# .. figure:: ../auto_examples/images/methylation_browser_chr11_2086423_2091187.png -# :align: center -# .. figure:: ../auto_examples/images/CTCF_A_sm_rolling_avg_fraction.png -# :align: center -# .. figure:: ../auto_examples/images/CTCF_A_sm_rolling_avg_total.png -# :align: center -# .. figure:: ../auto_examples/images/CTCF_CG_sm_rolling_avg_fraction.png -# :align: center -# .. figure:: ../auto_examples/images/CTCF_CG_sm_rolling_avg_total.png -# :align: center diff --git a/docs/auto_examples/browser_example.rst b/docs/auto_examples/browser_example.rst deleted file mode 100644 index e9e84594..00000000 --- a/docs/auto_examples/browser_example.rst +++ /dev/null @@ -1,113 +0,0 @@ - -.. DO NOT EDIT. -.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. -.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: -.. "auto_examples/browser_example.py" -.. LINE NUMBERS ARE GIVEN BELOW. - -.. only:: html - - .. note:: - :class: sphx-glr-download-link-note - - Click :ref:`here ` - to download the full example code - -.. rst-class:: sphx-glr-example-title - -.. _sphx_glr_auto_examples_browser_example.py: - - -Single-Molecule Browser Plot -============================ - -Plot single molecules with colored base modifications in a region of interest - -.. GENERATED FROM PYTHON SOURCE LINES 9-13 - -Create either an interactive single-molecule HTML browser if static=False, or create a PDF if static=True. -Base modifications are colored by type (mA vs. mCG) and probability of modification. -Example data for producing these plots can be downloaded from SRA: https://www.ncbi.nlm.nih.gov/bioproject/752170 -The below Python and command line options produce the same output. - -.. GENERATED FROM PYTHON SOURCE LINES 15-17 - -1. Python option ----------------- - -.. GENERATED FROM PYTHON SOURCE LINES 17-35 - -.. code-block:: default - - import dimelo as dm - - bam = "deep_ctcf_mod_mappings_merge.sorted.bam" - sampleName = "CTCF" - outDir = "./out" - dm.plot_browser( - bam, - sampleName, - "chr11:2086423-2091187", - "A+CG", - outDir, - threshA=153, - threshC=153, - static=True, - smooth=100, - min_periods=10, - ) - - -.. GENERATED FROM PYTHON SOURCE LINES 36-39 - -2. Command line option ----------------------- -``dimelo-plot-browser -f deep_ctcf_mod_mappings_merge.sorted.bam -s CTCF -r chr11:2086423-2091187 -m A+CG -o ./out -A 153 -C 153 --static -t 100 -n 10`` - -.. GENERATED FROM PYTHON SOURCE LINES 41-53 - -Output ----------------------- -.. figure:: ../auto_examples/images/methylation_browser_chr11_2086423_2091187.png - :align: center -.. figure:: ../auto_examples/images/CTCF_A_sm_rolling_avg_fraction.png - :align: center -.. figure:: ../auto_examples/images/CTCF_A_sm_rolling_avg_total.png - :align: center -.. figure:: ../auto_examples/images/CTCF_CG_sm_rolling_avg_fraction.png - :align: center -.. figure:: ../auto_examples/images/CTCF_CG_sm_rolling_avg_total.png - :align: center - - -.. rst-class:: sphx-glr-timing - - **Total running time of the script:** ( 0 minutes 0.000 seconds) - - -.. _sphx_glr_download_auto_examples_browser_example.py: - - -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: browser_example.py ` - - - - .. container:: sphx-glr-download sphx-glr-download-jupyter - - :download:`Download Jupyter notebook: browser_example.ipynb ` - - -.. only:: html - - .. rst-class:: sphx-glr-signature - - `Gallery generated by Sphinx-Gallery `_ diff --git a/docs/auto_examples/browser_example_codeobj.pickle b/docs/auto_examples/browser_example_codeobj.pickle deleted file mode 100644 index b0ca669e..00000000 Binary files a/docs/auto_examples/browser_example_codeobj.pickle and /dev/null differ diff --git a/docs/auto_examples/enrichment_multi_bam_example.ipynb b/docs/auto_examples/enrichment_multi_bam_example.ipynb deleted file mode 100644 index 537b4b52..00000000 --- a/docs/auto_examples/enrichment_multi_bam_example.ipynb +++ /dev/null @@ -1,82 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n# Enrichment Plot Comparison Across BAMs\n\nPlot overall fraction of methylated bases within regions of interest specified by bed file across multiple samples.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Create barplot comparing methylation levels in bed file regions of interest across samples\n\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 1. Python option\n\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "import dimelo as dm\n\nbams = [\n \"deep_ctcf_mod_mappings_merge.sorted.bam\",\n \"hia5_mod_mappings.bam\",\n \"igg_mod_mappings.bam\",\n]\nsampleNames = [\"CTCF\", \"Hia5\", \"IgG\"]\nbed = \"q10.150.slop.bed\"\noutDir = \"./out\"\ndm.plot_enrichment(bams, sampleNames, bed, \"A\", outDir, threshA=190)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 2. Command line option\n``dimelo-plot-enrichment -f deep_ctcf_mod_mappings_merge.sorted.bam hia5_mod_mappings.bam igg_mod_mappings.bam -s CTCF Hia5 IgG -b q10.150.slop.bed -m A -o ./out -A 190``\n\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Output\n.. figure:: ../auto_examples/images/region_q10.150.slop_A_enrichment_barplot.png\n\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} \ No newline at end of file diff --git a/docs/auto_examples/enrichment_multi_bam_example.py b/docs/auto_examples/enrichment_multi_bam_example.py deleted file mode 100644 index 4a65f21d..00000000 --- a/docs/auto_examples/enrichment_multi_bam_example.py +++ /dev/null @@ -1,34 +0,0 @@ -""" -Enrichment Plot Comparison Across BAMs -====================================== - -Plot overall fraction of methylated bases within regions of interest specified by bed file across multiple samples. - -""" -# %% -# Create barplot comparing methylation levels in bed file regions of interest across samples - -# %% -# 1. Python option -# ---------------- -import dimelo as dm - -bams = [ - "deep_ctcf_mod_mappings_merge.sorted.bam", - "hia5_mod_mappings.bam", - "igg_mod_mappings.bam", -] -sampleNames = ["CTCF", "Hia5", "IgG"] -bed = "q10.150.slop.bed" -outDir = "./out" -dm.plot_enrichment(bams, sampleNames, bed, "A", outDir, threshA=190) - -# %% -# 2. Command line option -# ---------------------- -# ``dimelo-plot-enrichment -f deep_ctcf_mod_mappings_merge.sorted.bam hia5_mod_mappings.bam igg_mod_mappings.bam -s CTCF Hia5 IgG -b q10.150.slop.bed -m A -o ./out -A 190`` - -# %% -# Output -# ---------------------- -# .. figure:: ../auto_examples/images/region_q10.150.slop_A_enrichment_barplot.png diff --git a/docs/auto_examples/enrichment_multi_bam_example.rst b/docs/auto_examples/enrichment_multi_bam_example.rst deleted file mode 100644 index 33de12ca..00000000 --- a/docs/auto_examples/enrichment_multi_bam_example.rst +++ /dev/null @@ -1,95 +0,0 @@ - -.. DO NOT EDIT. -.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. -.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: -.. "auto_examples/enrichment_multi_bam_example.py" -.. LINE NUMBERS ARE GIVEN BELOW. - -.. only:: html - - .. note:: - :class: sphx-glr-download-link-note - - Click :ref:`here ` - to download the full example code - -.. rst-class:: sphx-glr-example-title - -.. _sphx_glr_auto_examples_enrichment_multi_bam_example.py: - - -Enrichment Plot Comparison Across BAMs -====================================== - -Plot overall fraction of methylated bases within regions of interest specified by bed file across multiple samples. - -.. GENERATED FROM PYTHON SOURCE LINES 9-10 - -Create barplot comparing methylation levels in bed file regions of interest across samples - -.. GENERATED FROM PYTHON SOURCE LINES 12-14 - -1. Python option ----------------- - -.. GENERATED FROM PYTHON SOURCE LINES 14-26 - -.. code-block:: default - - import dimelo as dm - - bams = [ - "deep_ctcf_mod_mappings_merge.sorted.bam", - "hia5_mod_mappings.bam", - "igg_mod_mappings.bam", - ] - sampleNames = ["CTCF", "Hia5", "IgG"] - bed = "q10.150.slop.bed" - outDir = "./out" - dm.plot_enrichment(bams, sampleNames, bed, "A", outDir, threshA=190) - - -.. GENERATED FROM PYTHON SOURCE LINES 27-30 - -2. Command line option ----------------------- -``dimelo-plot-enrichment -f deep_ctcf_mod_mappings_merge.sorted.bam hia5_mod_mappings.bam igg_mod_mappings.bam -s CTCF Hia5 IgG -b q10.150.slop.bed -m A -o ./out -A 190`` - -.. GENERATED FROM PYTHON SOURCE LINES 32-35 - -Output ----------------------- -.. figure:: ../auto_examples/images/region_q10.150.slop_A_enrichment_barplot.png - - -.. rst-class:: sphx-glr-timing - - **Total running time of the script:** ( 0 minutes 0.000 seconds) - - -.. _sphx_glr_download_auto_examples_enrichment_multi_bam_example.py: - - -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: enrichment_multi_bam_example.py ` - - - - .. container:: sphx-glr-download sphx-glr-download-jupyter - - :download:`Download Jupyter notebook: enrichment_multi_bam_example.ipynb ` - - -.. only:: html - - .. rst-class:: sphx-glr-signature - - `Gallery generated by Sphinx-Gallery `_ diff --git a/docs/auto_examples/enrichment_multi_bam_example_codeobj.pickle b/docs/auto_examples/enrichment_multi_bam_example_codeobj.pickle deleted file mode 100644 index dc6b209b..00000000 Binary files a/docs/auto_examples/enrichment_multi_bam_example_codeobj.pickle and /dev/null differ diff --git a/docs/auto_examples/enrichment_multi_bed_example.ipynb b/docs/auto_examples/enrichment_multi_bed_example.ipynb deleted file mode 100644 index 6bdc04af..00000000 --- a/docs/auto_examples/enrichment_multi_bed_example.ipynb +++ /dev/null @@ -1,82 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n# Enrichment Plot Comparison Across BEDs\n\nPlot overall fraction of methylated bases within multiple sets of regions of interest specified by bed files for a single sample.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Create barplot comparing methylation levels in single sample across multiple regions of interest defined in bed files.\n\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 1. Python option\n\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "import dimelo as dm\n\nbam = \"deep_ctcf_mod_mappings_merge.sorted.bam\"\nbeds = [\"q10.150.slop.bed\", \"q10nopeak.bed\"]\nsampleNames = [\"chip_peak\", \"not_chip_peak\"]\noutDir = \"./out\"\ndm.plot_enrichment(bam, sampleNames, beds, \"A\", outDir, threshA=190)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 2. Command line option\n``dimelo-plot-enrichment -f deep_ctcf_mod_mappings_merge.sorted.bam -s chip_peak not_chip_peak -b q10.150.slop.bed q10nopeak.bed -m A -o ./out -A 190``\n\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Output\n.. figure:: ../auto_examples/images/sample_deep_ctcf_mod_mappings_merge.sorted_A_enrichment_barplot.png\n\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} \ No newline at end of file diff --git a/docs/auto_examples/enrichment_multi_bed_example.py b/docs/auto_examples/enrichment_multi_bed_example.py deleted file mode 100644 index 462b3da8..00000000 --- a/docs/auto_examples/enrichment_multi_bed_example.py +++ /dev/null @@ -1,30 +0,0 @@ -""" -Enrichment Plot Comparison Across BEDs -====================================== - -Plot overall fraction of methylated bases within multiple sets of regions of interest specified by bed files for a single sample. - -""" -# %% -# Create barplot comparing methylation levels in single sample across multiple regions of interest defined in bed files. - -# %% -# 1. Python option -# ---------------- -import dimelo as dm - -bam = "deep_ctcf_mod_mappings_merge.sorted.bam" -beds = ["q10.150.slop.bed", "q10nopeak.bed"] -sampleNames = ["chip_peak", "not_chip_peak"] -outDir = "./out" -dm.plot_enrichment(bam, sampleNames, beds, "A", outDir, threshA=190) - -# %% -# 2. Command line option -# ---------------------- -# ``dimelo-plot-enrichment -f deep_ctcf_mod_mappings_merge.sorted.bam -s chip_peak not_chip_peak -b q10.150.slop.bed q10nopeak.bed -m A -o ./out -A 190`` - -# %% -# Output -# ---------------------- -# .. figure:: ../auto_examples/images/sample_deep_ctcf_mod_mappings_merge.sorted_A_enrichment_barplot.png diff --git a/docs/auto_examples/enrichment_multi_bed_example.rst b/docs/auto_examples/enrichment_multi_bed_example.rst deleted file mode 100644 index 51da39ae..00000000 --- a/docs/auto_examples/enrichment_multi_bed_example.rst +++ /dev/null @@ -1,91 +0,0 @@ - -.. DO NOT EDIT. -.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. -.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: -.. "auto_examples/enrichment_multi_bed_example.py" -.. LINE NUMBERS ARE GIVEN BELOW. - -.. only:: html - - .. note:: - :class: sphx-glr-download-link-note - - Click :ref:`here ` - to download the full example code - -.. rst-class:: sphx-glr-example-title - -.. _sphx_glr_auto_examples_enrichment_multi_bed_example.py: - - -Enrichment Plot Comparison Across BEDs -====================================== - -Plot overall fraction of methylated bases within multiple sets of regions of interest specified by bed files for a single sample. - -.. GENERATED FROM PYTHON SOURCE LINES 9-10 - -Create barplot comparing methylation levels in single sample across multiple regions of interest defined in bed files. - -.. GENERATED FROM PYTHON SOURCE LINES 12-14 - -1. Python option ----------------- - -.. GENERATED FROM PYTHON SOURCE LINES 14-22 - -.. code-block:: default - - import dimelo as dm - - bam = "deep_ctcf_mod_mappings_merge.sorted.bam" - beds = ["q10.150.slop.bed", "q10nopeak.bed"] - sampleNames = ["chip_peak", "not_chip_peak"] - outDir = "./out" - dm.plot_enrichment(bam, sampleNames, beds, "A", outDir, threshA=190) - - -.. GENERATED FROM PYTHON SOURCE LINES 23-26 - -2. Command line option ----------------------- -``dimelo-plot-enrichment -f deep_ctcf_mod_mappings_merge.sorted.bam -s chip_peak not_chip_peak -b q10.150.slop.bed q10nopeak.bed -m A -o ./out -A 190`` - -.. GENERATED FROM PYTHON SOURCE LINES 28-31 - -Output ----------------------- -.. figure:: ../auto_examples/images/sample_deep_ctcf_mod_mappings_merge.sorted_A_enrichment_barplot.png - - -.. rst-class:: sphx-glr-timing - - **Total running time of the script:** ( 0 minutes 0.000 seconds) - - -.. _sphx_glr_download_auto_examples_enrichment_multi_bed_example.py: - - -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: enrichment_multi_bed_example.py ` - - - - .. container:: sphx-glr-download sphx-glr-download-jupyter - - :download:`Download Jupyter notebook: enrichment_multi_bed_example.ipynb ` - - -.. only:: html - - .. rst-class:: sphx-glr-signature - - `Gallery generated by Sphinx-Gallery `_ diff --git a/docs/auto_examples/enrichment_multi_bed_example_codeobj.pickle b/docs/auto_examples/enrichment_multi_bed_example_codeobj.pickle deleted file mode 100644 index dc6b209b..00000000 Binary files a/docs/auto_examples/enrichment_multi_bed_example_codeobj.pickle and /dev/null differ diff --git a/docs/auto_examples/enrichment_profile_ma_mc_example.ipynb b/docs/auto_examples/enrichment_profile_ma_mc_example.ipynb deleted file mode 100644 index 6f858ffc..00000000 --- a/docs/auto_examples/enrichment_profile_ma_mc_example.ipynb +++ /dev/null @@ -1,82 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n# Enrichment Profile mA & mCG\n\nAggregate and single molecule plots colored by modification and centered at regions of interest defined in bed file.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Create (1) aggregate profile plots for mA/A and mCG/CG, (2) single-molecule plots for mA + mCG, and (3) base abundance plots for A and CG.\n\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 1. Python option\n\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "import dimelo as dm\n\nbam = \"deep_ctcf_mod_mappings_merge.sorted.bam\"\nsampleName = \"quartile4\"\nbed = \"quart4.bed\"\noutDir = \"./out\"\ndm.plot_enrichment_profile(\n bam,\n sampleName,\n bed,\n \"A+CG\",\n outDir,\n threshA=190,\n threshC=190,\n dotsize=0.05,\n)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 2. Command line option\n``dimelo-plot-enrichment-profile -f deep_ctcf_mod_mappings_merge.sorted.bam -s quartile4 -b quart4.bed -m A+CG -o ./out -A 190 -C 190 -d 0.05``\n\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Output\n.. figure:: ../auto_examples/images/quartile4_A+CG_sm_rolling_avg.png\n :align: center\n.. figure:: ../auto_examples/images/quartile4_A+CG_sm_scatter.png\n.. figure:: ../auto_examples/images/quartile4_A_base_count.png\n.. figure:: ../auto_examples/images/quartile4_CG_base_count.png\n\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} \ No newline at end of file diff --git a/docs/auto_examples/enrichment_profile_ma_mc_example.py b/docs/auto_examples/enrichment_profile_ma_mc_example.py deleted file mode 100644 index 077d0801..00000000 --- a/docs/auto_examples/enrichment_profile_ma_mc_example.py +++ /dev/null @@ -1,44 +0,0 @@ -""" -Enrichment Profile mA & mCG -================================= - -Aggregate and single molecule plots colored by modification and centered at regions of interest defined in bed file. - -""" -# %% -# Create (1) aggregate profile plots for mA/A and mCG/CG, (2) single-molecule plots for mA + mCG, and (3) base abundance plots for A and CG. - -# %% -# 1. Python option -# ---------------- -import dimelo as dm - -bam = "deep_ctcf_mod_mappings_merge.sorted.bam" -sampleName = "quartile4" -bed = "quart4.bed" -outDir = "./out" -dm.plot_enrichment_profile( - bam, - sampleName, - bed, - "A+CG", - outDir, - threshA=190, - threshC=190, - dotsize=0.05, -) - - -# %% -# 2. Command line option -# ---------------------- -# ``dimelo-plot-enrichment-profile -f deep_ctcf_mod_mappings_merge.sorted.bam -s quartile4 -b quart4.bed -m A+CG -o ./out -A 190 -C 190 -d 0.05`` - -# %% -# Output -# ---------------------- -# .. figure:: ../auto_examples/images/quartile4_A+CG_sm_rolling_avg.png -# :align: center -# .. figure:: ../auto_examples/images/quartile4_A+CG_sm_scatter.png -# .. figure:: ../auto_examples/images/quartile4_A_base_count.png -# .. figure:: ../auto_examples/images/quartile4_CG_base_count.png diff --git a/docs/auto_examples/enrichment_profile_ma_mc_example.rst b/docs/auto_examples/enrichment_profile_ma_mc_example.rst deleted file mode 100644 index 57591f14..00000000 --- a/docs/auto_examples/enrichment_profile_ma_mc_example.rst +++ /dev/null @@ -1,105 +0,0 @@ - -.. DO NOT EDIT. -.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. -.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: -.. "auto_examples/enrichment_profile_ma_mc_example.py" -.. LINE NUMBERS ARE GIVEN BELOW. - -.. only:: html - - .. note:: - :class: sphx-glr-download-link-note - - Click :ref:`here ` - to download the full example code - -.. rst-class:: sphx-glr-example-title - -.. _sphx_glr_auto_examples_enrichment_profile_ma_mc_example.py: - - -Enrichment Profile mA & mCG -================================= - -Aggregate and single molecule plots colored by modification and centered at regions of interest defined in bed file. - -.. GENERATED FROM PYTHON SOURCE LINES 9-10 - -Create (1) aggregate profile plots for mA/A and mCG/CG, (2) single-molecule plots for mA + mCG, and (3) base abundance plots for A and CG. - -.. GENERATED FROM PYTHON SOURCE LINES 12-14 - -1. Python option ----------------- - -.. GENERATED FROM PYTHON SOURCE LINES 14-32 - -.. code-block:: default - - import dimelo as dm - - bam = "deep_ctcf_mod_mappings_merge.sorted.bam" - sampleName = "quartile4" - bed = "quart4.bed" - outDir = "./out" - dm.plot_enrichment_profile( - bam, - sampleName, - bed, - "A+CG", - outDir, - threshA=190, - threshC=190, - dotsize=0.05, - ) - - - -.. GENERATED FROM PYTHON SOURCE LINES 33-36 - -2. Command line option ----------------------- -``dimelo-plot-enrichment-profile -f deep_ctcf_mod_mappings_merge.sorted.bam -s quartile4 -b quart4.bed -m A+CG -o ./out -A 190 -C 190 -d 0.05`` - -.. GENERATED FROM PYTHON SOURCE LINES 38-45 - -Output ----------------------- -.. figure:: ../auto_examples/images/quartile4_A+CG_sm_rolling_avg.png - :align: center -.. figure:: ../auto_examples/images/quartile4_A+CG_sm_scatter.png -.. figure:: ../auto_examples/images/quartile4_A_base_count.png -.. figure:: ../auto_examples/images/quartile4_CG_base_count.png - - -.. rst-class:: sphx-glr-timing - - **Total running time of the script:** ( 0 minutes 0.000 seconds) - - -.. _sphx_glr_download_auto_examples_enrichment_profile_ma_mc_example.py: - - -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: enrichment_profile_ma_mc_example.py ` - - - - .. container:: sphx-glr-download sphx-glr-download-jupyter - - :download:`Download Jupyter notebook: enrichment_profile_ma_mc_example.ipynb ` - - -.. only:: html - - .. rst-class:: sphx-glr-signature - - `Gallery generated by Sphinx-Gallery `_ diff --git a/docs/auto_examples/enrichment_profile_ma_mc_example_codeobj.pickle b/docs/auto_examples/enrichment_profile_ma_mc_example_codeobj.pickle deleted file mode 100644 index a6965886..00000000 Binary files a/docs/auto_examples/enrichment_profile_ma_mc_example_codeobj.pickle and /dev/null differ diff --git a/docs/auto_examples/enrichment_profile_overlay_example.ipynb b/docs/auto_examples/enrichment_profile_overlay_example.ipynb deleted file mode 100644 index 58ddb532..00000000 --- a/docs/auto_examples/enrichment_profile_overlay_example.ipynb +++ /dev/null @@ -1,82 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n# Enrichment Profile Overlay\n\nAggregate fraction of methylated bases centered at regions of interest defined in bed files.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Create (1) aggregate profile plots for mA/A and mCG/CG, (2) single-molecule plots for mA + mCG, and (3) base abundance plots for A and CG.\n\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 1. Python option\n\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "import dimelo as dm\n\nbam = \"deep_ctcf_mod_mappings_merge.sorted.bam\"\nsampleNames = [\"q4\", \"q3\", \"q2\", \"q1\"]\nbeds = [\"quart4.bed\", \"quart3.bed\", \"quart2.bed\", \"quart1.bed\"]\noutDir = \"./out\"\ndm.plot_enrichment_profile(\n bam, sampleNames, beds, \"A\", outDir, threshA=190, dotsize=0.05\n)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 2. Command line option\n``dimelo-plot-enrichment-profile -f deep_ctcf_mod_mappings_merge.sorted.bam -s q4 q3 q2 q1 -b quart4.bed quart3.bed quart2.bed quart1.bed -m A -o ./out -A 190 -d 0.05``\n\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Output\n.. figure:: ../auto_examples/images/sample_deep_ctcf_mod_mappings_merge.sorted_A_sm_rolling_avg_overlay.png\n :align: center\n\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} \ No newline at end of file diff --git a/docs/auto_examples/enrichment_profile_overlay_example.py b/docs/auto_examples/enrichment_profile_overlay_example.py deleted file mode 100644 index 63f43666..00000000 --- a/docs/auto_examples/enrichment_profile_overlay_example.py +++ /dev/null @@ -1,33 +0,0 @@ -""" -Enrichment Profile Overlay -================================= - -Aggregate fraction of methylated bases centered at regions of interest defined in bed files. - -""" -# %% -# Create (1) aggregate profile plots for mA/A and mCG/CG, (2) single-molecule plots for mA + mCG, and (3) base abundance plots for A and CG. - -# %% -# 1. Python option -# ---------------- -import dimelo as dm - -bam = "deep_ctcf_mod_mappings_merge.sorted.bam" -sampleNames = ["q4", "q3", "q2", "q1"] -beds = ["quart4.bed", "quart3.bed", "quart2.bed", "quart1.bed"] -outDir = "./out" -dm.plot_enrichment_profile( - bam, sampleNames, beds, "A", outDir, threshA=190, dotsize=0.05 -) - -# %% -# 2. Command line option -# ---------------------- -# ``dimelo-plot-enrichment-profile -f deep_ctcf_mod_mappings_merge.sorted.bam -s q4 q3 q2 q1 -b quart4.bed quart3.bed quart2.bed quart1.bed -m A -o ./out -A 190 -d 0.05`` - -# %% -# Output -# ---------------------- -# .. figure:: ../auto_examples/images/sample_deep_ctcf_mod_mappings_merge.sorted_A_sm_rolling_avg_overlay.png -# :align: center diff --git a/docs/auto_examples/enrichment_profile_overlay_example.rst b/docs/auto_examples/enrichment_profile_overlay_example.rst deleted file mode 100644 index 454b1745..00000000 --- a/docs/auto_examples/enrichment_profile_overlay_example.rst +++ /dev/null @@ -1,94 +0,0 @@ - -.. DO NOT EDIT. -.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. -.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: -.. "auto_examples/enrichment_profile_overlay_example.py" -.. LINE NUMBERS ARE GIVEN BELOW. - -.. only:: html - - .. note:: - :class: sphx-glr-download-link-note - - Click :ref:`here ` - to download the full example code - -.. rst-class:: sphx-glr-example-title - -.. _sphx_glr_auto_examples_enrichment_profile_overlay_example.py: - - -Enrichment Profile Overlay -================================= - -Aggregate fraction of methylated bases centered at regions of interest defined in bed files. - -.. GENERATED FROM PYTHON SOURCE LINES 9-10 - -Create (1) aggregate profile plots for mA/A and mCG/CG, (2) single-molecule plots for mA + mCG, and (3) base abundance plots for A and CG. - -.. GENERATED FROM PYTHON SOURCE LINES 12-14 - -1. Python option ----------------- - -.. GENERATED FROM PYTHON SOURCE LINES 14-24 - -.. code-block:: default - - import dimelo as dm - - bam = "deep_ctcf_mod_mappings_merge.sorted.bam" - sampleNames = ["q4", "q3", "q2", "q1"] - beds = ["quart4.bed", "quart3.bed", "quart2.bed", "quart1.bed"] - outDir = "./out" - dm.plot_enrichment_profile( - bam, sampleNames, beds, "A", outDir, threshA=190, dotsize=0.05 - ) - - -.. GENERATED FROM PYTHON SOURCE LINES 25-28 - -2. Command line option ----------------------- -``dimelo-plot-enrichment-profile -f deep_ctcf_mod_mappings_merge.sorted.bam -s q4 q3 q2 q1 -b quart4.bed quart3.bed quart2.bed quart1.bed -m A -o ./out -A 190 -d 0.05`` - -.. GENERATED FROM PYTHON SOURCE LINES 30-34 - -Output ----------------------- -.. figure:: ../auto_examples/images/sample_deep_ctcf_mod_mappings_merge.sorted_A_sm_rolling_avg_overlay.png - :align: center - - -.. rst-class:: sphx-glr-timing - - **Total running time of the script:** ( 0 minutes 0.000 seconds) - - -.. _sphx_glr_download_auto_examples_enrichment_profile_overlay_example.py: - - -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: enrichment_profile_overlay_example.py ` - - - - .. container:: sphx-glr-download sphx-glr-download-jupyter - - :download:`Download Jupyter notebook: enrichment_profile_overlay_example.ipynb ` - - -.. only:: html - - .. rst-class:: sphx-glr-signature - - `Gallery generated by Sphinx-Gallery `_ diff --git a/docs/auto_examples/enrichment_profile_overlay_example_codeobj.pickle b/docs/auto_examples/enrichment_profile_overlay_example_codeobj.pickle deleted file mode 100644 index a6965886..00000000 Binary files a/docs/auto_examples/enrichment_profile_overlay_example_codeobj.pickle and /dev/null differ diff --git a/docs/auto_examples/enrichment_profile_single_example.ipynb b/docs/auto_examples/enrichment_profile_single_example.ipynb deleted file mode 100644 index 4e932055..00000000 --- a/docs/auto_examples/enrichment_profile_single_example.ipynb +++ /dev/null @@ -1,82 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n# Enrichment Profile mA only\n\nPlot single molecules centered at regions of interest defined in bed file and produce aggregate profile\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Create (1) aggregate profile plots for mA/A, (2) single-molecule plots for mA, and (3) base abundance plots for A.\n\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 1. Python option\n\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "import dimelo as dm\n\nbam = \"deep_ctcf_mod_mappings_merge.sorted.bam\"\nsampleName = \"quartile4\"\nbed = \"quart4.bed\"\noutDir = \"./out\"\ndm.plot_enrichment_profile(\n bam, sampleName, bed, \"A\", outDir, threshA=190, dotsize=0.05\n)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 2. Command line option\n``dimelo-plot-enrichment-profile -f deep_ctcf_mod_mappings_merge.sorted.bam -s quartile4 -b quart4.bed -m A -o ./out -A 190 -d 0.05``\n\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Output\n.. figure:: ../auto_examples/images/quartile4_A_sm_rolling_avg.png\n :align: center\n.. figure:: ../auto_examples/images/quartile4_A_sm_scatter.png\n.. figure:: ../auto_examples/images/quartile4_A_base_count.png\n\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} \ No newline at end of file diff --git a/docs/auto_examples/enrichment_profile_single_example.py b/docs/auto_examples/enrichment_profile_single_example.py deleted file mode 100644 index 7a932845..00000000 --- a/docs/auto_examples/enrichment_profile_single_example.py +++ /dev/null @@ -1,35 +0,0 @@ -""" -Enrichment Profile mA only -================================= - -Plot single molecules centered at regions of interest defined in bed file and produce aggregate profile - -""" -# %% -# Create (1) aggregate profile plots for mA/A, (2) single-molecule plots for mA, and (3) base abundance plots for A. - -# %% -# 1. Python option -# ---------------- -import dimelo as dm - -bam = "deep_ctcf_mod_mappings_merge.sorted.bam" -sampleName = "quartile4" -bed = "quart4.bed" -outDir = "./out" -dm.plot_enrichment_profile( - bam, sampleName, bed, "A", outDir, threshA=190, dotsize=0.05 -) - -# %% -# 2. Command line option -# ---------------------- -# ``dimelo-plot-enrichment-profile -f deep_ctcf_mod_mappings_merge.sorted.bam -s quartile4 -b quart4.bed -m A -o ./out -A 190 -d 0.05`` - -# %% -# Output -# ---------------------- -# .. figure:: ../auto_examples/images/quartile4_A_sm_rolling_avg.png -# :align: center -# .. figure:: ../auto_examples/images/quartile4_A_sm_scatter.png -# .. figure:: ../auto_examples/images/quartile4_A_base_count.png diff --git a/docs/auto_examples/enrichment_profile_single_example.rst b/docs/auto_examples/enrichment_profile_single_example.rst deleted file mode 100644 index 71ccb7df..00000000 --- a/docs/auto_examples/enrichment_profile_single_example.rst +++ /dev/null @@ -1,96 +0,0 @@ - -.. DO NOT EDIT. -.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. -.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: -.. "auto_examples/enrichment_profile_single_example.py" -.. LINE NUMBERS ARE GIVEN BELOW. - -.. only:: html - - .. note:: - :class: sphx-glr-download-link-note - - Click :ref:`here ` - to download the full example code - -.. rst-class:: sphx-glr-example-title - -.. _sphx_glr_auto_examples_enrichment_profile_single_example.py: - - -Enrichment Profile mA only -================================= - -Plot single molecules centered at regions of interest defined in bed file and produce aggregate profile - -.. GENERATED FROM PYTHON SOURCE LINES 9-10 - -Create (1) aggregate profile plots for mA/A, (2) single-molecule plots for mA, and (3) base abundance plots for A. - -.. GENERATED FROM PYTHON SOURCE LINES 12-14 - -1. Python option ----------------- - -.. GENERATED FROM PYTHON SOURCE LINES 14-24 - -.. code-block:: default - - import dimelo as dm - - bam = "deep_ctcf_mod_mappings_merge.sorted.bam" - sampleName = "quartile4" - bed = "quart4.bed" - outDir = "./out" - dm.plot_enrichment_profile( - bam, sampleName, bed, "A", outDir, threshA=190, dotsize=0.05 - ) - - -.. GENERATED FROM PYTHON SOURCE LINES 25-28 - -2. Command line option ----------------------- -``dimelo-plot-enrichment-profile -f deep_ctcf_mod_mappings_merge.sorted.bam -s quartile4 -b quart4.bed -m A -o ./out -A 190 -d 0.05`` - -.. GENERATED FROM PYTHON SOURCE LINES 30-36 - -Output ----------------------- -.. figure:: ../auto_examples/images/quartile4_A_sm_rolling_avg.png - :align: center -.. figure:: ../auto_examples/images/quartile4_A_sm_scatter.png -.. figure:: ../auto_examples/images/quartile4_A_base_count.png - - -.. rst-class:: sphx-glr-timing - - **Total running time of the script:** ( 0 minutes 0.000 seconds) - - -.. _sphx_glr_download_auto_examples_enrichment_profile_single_example.py: - - -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: enrichment_profile_single_example.py ` - - - - .. container:: sphx-glr-download sphx-glr-download-jupyter - - :download:`Download Jupyter notebook: enrichment_profile_single_example.ipynb ` - - -.. only:: html - - .. rst-class:: sphx-glr-signature - - `Gallery generated by Sphinx-Gallery `_ diff --git a/docs/auto_examples/enrichment_profile_single_example_codeobj.pickle b/docs/auto_examples/enrichment_profile_single_example_codeobj.pickle deleted file mode 100644 index a6965886..00000000 Binary files a/docs/auto_examples/enrichment_profile_single_example_codeobj.pickle and /dev/null differ diff --git a/docs/auto_examples/images/CTCF_A_sm_rolling_avg_fraction.png b/docs/auto_examples/images/CTCF_A_sm_rolling_avg_fraction.png deleted file mode 100644 index 3c3a6800..00000000 Binary files a/docs/auto_examples/images/CTCF_A_sm_rolling_avg_fraction.png and /dev/null differ diff --git a/docs/auto_examples/images/CTCF_A_sm_rolling_avg_total.png b/docs/auto_examples/images/CTCF_A_sm_rolling_avg_total.png deleted file mode 100644 index 0014a0ff..00000000 Binary files a/docs/auto_examples/images/CTCF_A_sm_rolling_avg_total.png and /dev/null differ diff --git a/docs/auto_examples/images/CTCF_CG_sm_rolling_avg_fraction.png b/docs/auto_examples/images/CTCF_CG_sm_rolling_avg_fraction.png deleted file mode 100644 index c90edc69..00000000 Binary files a/docs/auto_examples/images/CTCF_CG_sm_rolling_avg_fraction.png and /dev/null differ diff --git a/docs/auto_examples/images/CTCF_CG_sm_rolling_avg_total.png b/docs/auto_examples/images/CTCF_CG_sm_rolling_avg_total.png deleted file mode 100644 index 618d3fe6..00000000 Binary files a/docs/auto_examples/images/CTCF_CG_sm_rolling_avg_total.png and /dev/null differ diff --git a/docs/auto_examples/images/CTCF_qc_report.png b/docs/auto_examples/images/CTCF_qc_report.png deleted file mode 100644 index 5c266a07..00000000 Binary files a/docs/auto_examples/images/CTCF_qc_report.png and /dev/null differ diff --git a/docs/auto_examples/images/QC_Terminal_Output.png b/docs/auto_examples/images/QC_Terminal_Output.png deleted file mode 100644 index e240da00..00000000 Binary files a/docs/auto_examples/images/QC_Terminal_Output.png and /dev/null differ diff --git a/docs/auto_examples/images/methylation_browser_chr11_2086423_2091187.png b/docs/auto_examples/images/methylation_browser_chr11_2086423_2091187.png deleted file mode 100644 index c25328e9..00000000 Binary files a/docs/auto_examples/images/methylation_browser_chr11_2086423_2091187.png and /dev/null differ diff --git a/docs/auto_examples/images/quartile4_A+CG_sm_rolling_avg.png b/docs/auto_examples/images/quartile4_A+CG_sm_rolling_avg.png deleted file mode 100644 index ae0846c9..00000000 Binary files a/docs/auto_examples/images/quartile4_A+CG_sm_rolling_avg.png and /dev/null differ diff --git a/docs/auto_examples/images/quartile4_A+CG_sm_scatter.png b/docs/auto_examples/images/quartile4_A+CG_sm_scatter.png deleted file mode 100644 index d4dbf67a..00000000 Binary files a/docs/auto_examples/images/quartile4_A+CG_sm_scatter.png and /dev/null differ diff --git a/docs/auto_examples/images/quartile4_A_base_count.png b/docs/auto_examples/images/quartile4_A_base_count.png deleted file mode 100644 index 5cfa7526..00000000 Binary files a/docs/auto_examples/images/quartile4_A_base_count.png and /dev/null differ diff --git a/docs/auto_examples/images/quartile4_A_sm_rolling_avg.png b/docs/auto_examples/images/quartile4_A_sm_rolling_avg.png deleted file mode 100644 index d9c156e9..00000000 Binary files a/docs/auto_examples/images/quartile4_A_sm_rolling_avg.png and /dev/null differ diff --git a/docs/auto_examples/images/quartile4_A_sm_scatter.png b/docs/auto_examples/images/quartile4_A_sm_scatter.png deleted file mode 100644 index e109399e..00000000 Binary files a/docs/auto_examples/images/quartile4_A_sm_scatter.png and /dev/null differ diff --git a/docs/auto_examples/images/quartile4_CG_base_count.png b/docs/auto_examples/images/quartile4_CG_base_count.png deleted file mode 100644 index 106ce2d0..00000000 Binary files a/docs/auto_examples/images/quartile4_CG_base_count.png and /dev/null differ diff --git a/docs/auto_examples/images/region_q10.150.slop_A_enrichment_barplot.png b/docs/auto_examples/images/region_q10.150.slop_A_enrichment_barplot.png deleted file mode 100644 index f0e184de..00000000 Binary files a/docs/auto_examples/images/region_q10.150.slop_A_enrichment_barplot.png and /dev/null differ diff --git a/docs/auto_examples/images/sample_deep_ctcf_mod_mappings_merge.sorted_A_enrichment_barplot.png b/docs/auto_examples/images/sample_deep_ctcf_mod_mappings_merge.sorted_A_enrichment_barplot.png deleted file mode 100644 index 8b21aeaf..00000000 Binary files a/docs/auto_examples/images/sample_deep_ctcf_mod_mappings_merge.sorted_A_enrichment_barplot.png and /dev/null differ diff --git a/docs/auto_examples/images/sample_deep_ctcf_mod_mappings_merge.sorted_A_sm_rolling_avg_overlay.png b/docs/auto_examples/images/sample_deep_ctcf_mod_mappings_merge.sorted_A_sm_rolling_avg_overlay.png deleted file mode 100644 index 00bf6efa..00000000 Binary files a/docs/auto_examples/images/sample_deep_ctcf_mod_mappings_merge.sorted_A_sm_rolling_avg_overlay.png and /dev/null differ diff --git a/docs/auto_examples/images/sphx_glr_plot_qc_001.png b/docs/auto_examples/images/sphx_glr_plot_qc_001.png deleted file mode 100644 index e5cae1af..00000000 Binary files a/docs/auto_examples/images/sphx_glr_plot_qc_001.png and /dev/null differ diff --git a/docs/auto_examples/images/sphx_glr_plot_qc_example_001.png b/docs/auto_examples/images/sphx_glr_plot_qc_example_001.png deleted file mode 100644 index e8c0e2c0..00000000 Binary files a/docs/auto_examples/images/sphx_glr_plot_qc_example_001.png and /dev/null differ diff --git a/docs/auto_examples/images/thumb/sphx_glr_browser_example_thumb.png b/docs/auto_examples/images/thumb/sphx_glr_browser_example_thumb.png deleted file mode 100644 index c25328e9..00000000 Binary files a/docs/auto_examples/images/thumb/sphx_glr_browser_example_thumb.png and /dev/null differ diff --git a/docs/auto_examples/images/thumb/sphx_glr_enrichment_multi_bam_example_thumb.png b/docs/auto_examples/images/thumb/sphx_glr_enrichment_multi_bam_example_thumb.png deleted file mode 100644 index f0e184de..00000000 Binary files a/docs/auto_examples/images/thumb/sphx_glr_enrichment_multi_bam_example_thumb.png and /dev/null differ diff --git a/docs/auto_examples/images/thumb/sphx_glr_enrichment_multi_bed_example_thumb.png b/docs/auto_examples/images/thumb/sphx_glr_enrichment_multi_bed_example_thumb.png deleted file mode 100644 index 8b21aeaf..00000000 Binary files a/docs/auto_examples/images/thumb/sphx_glr_enrichment_multi_bed_example_thumb.png and /dev/null differ diff --git a/docs/auto_examples/images/thumb/sphx_glr_enrichment_profile_ma_mc_example_thumb.png b/docs/auto_examples/images/thumb/sphx_glr_enrichment_profile_ma_mc_example_thumb.png deleted file mode 100644 index ae0846c9..00000000 Binary files a/docs/auto_examples/images/thumb/sphx_glr_enrichment_profile_ma_mc_example_thumb.png and /dev/null differ diff --git a/docs/auto_examples/images/thumb/sphx_glr_enrichment_profile_overlay_example_thumb.png b/docs/auto_examples/images/thumb/sphx_glr_enrichment_profile_overlay_example_thumb.png deleted file mode 100644 index 00bf6efa..00000000 Binary files a/docs/auto_examples/images/thumb/sphx_glr_enrichment_profile_overlay_example_thumb.png and /dev/null differ diff --git a/docs/auto_examples/images/thumb/sphx_glr_enrichment_profile_single_example_thumb.png b/docs/auto_examples/images/thumb/sphx_glr_enrichment_profile_single_example_thumb.png deleted file mode 100644 index d9c156e9..00000000 Binary files a/docs/auto_examples/images/thumb/sphx_glr_enrichment_profile_single_example_thumb.png and /dev/null differ diff --git a/docs/auto_examples/images/thumb/sphx_glr_plot_qc_example_thumb.png b/docs/auto_examples/images/thumb/sphx_glr_plot_qc_example_thumb.png deleted file mode 100644 index edd36fcc..00000000 Binary files a/docs/auto_examples/images/thumb/sphx_glr_plot_qc_example_thumb.png and /dev/null differ diff --git a/docs/auto_examples/images/thumb/sphx_glr_qc_report_example_thumb.png b/docs/auto_examples/images/thumb/sphx_glr_qc_report_example_thumb.png deleted file mode 100644 index 537eb042..00000000 Binary files a/docs/auto_examples/images/thumb/sphx_glr_qc_report_example_thumb.png and /dev/null differ diff --git a/docs/auto_examples/index.rst b/docs/auto_examples/index.rst deleted file mode 100644 index 77c9162a..00000000 --- a/docs/auto_examples/index.rst +++ /dev/null @@ -1,184 +0,0 @@ -:orphan: - - - -.. _sphx_glr_auto_examples: - -Example Gallery -======================= - - -.. raw:: html - -
- -.. only:: html - - .. figure:: /auto_examples/images/thumb/sphx_glr_enrichment_profile_single_example_thumb.png - :alt: Enrichment Profile mA only - - :ref:`sphx_glr_auto_examples_enrichment_profile_single_example.py` - -.. raw:: html - -
- - -.. toctree:: - :hidden: - - /auto_examples/enrichment_profile_single_example - -.. raw:: html - -
- -.. only:: html - - .. figure:: /auto_examples/images/thumb/sphx_glr_enrichment_multi_bed_example_thumb.png - :alt: Enrichment Plot Comparison Across BEDs - - :ref:`sphx_glr_auto_examples_enrichment_multi_bed_example.py` - -.. raw:: html - -
- - -.. toctree:: - :hidden: - - /auto_examples/enrichment_multi_bed_example - -.. raw:: html - -
- -.. only:: html - - .. figure:: /auto_examples/images/thumb/sphx_glr_enrichment_profile_ma_mc_example_thumb.png - :alt: Enrichment Profile mA & mCG - - :ref:`sphx_glr_auto_examples_enrichment_profile_ma_mc_example.py` - -.. raw:: html - -
- - -.. toctree:: - :hidden: - - /auto_examples/enrichment_profile_ma_mc_example - -.. raw:: html - -
- -.. only:: html - - .. figure:: /auto_examples/images/thumb/sphx_glr_enrichment_multi_bam_example_thumb.png - :alt: Enrichment Plot Comparison Across BAMs - - :ref:`sphx_glr_auto_examples_enrichment_multi_bam_example.py` - -.. raw:: html - -
- - -.. toctree:: - :hidden: - - /auto_examples/enrichment_multi_bam_example - -.. raw:: html - -
- -.. only:: html - - .. figure:: /auto_examples/images/thumb/sphx_glr_enrichment_profile_overlay_example_thumb.png - :alt: Enrichment Profile Overlay - - :ref:`sphx_glr_auto_examples_enrichment_profile_overlay_example.py` - -.. raw:: html - -
- - -.. toctree:: - :hidden: - - /auto_examples/enrichment_profile_overlay_example - -.. raw:: html - -
- -.. only:: html - - .. figure:: /auto_examples/images/thumb/sphx_glr_browser_example_thumb.png - :alt: Single-Molecule Browser Plot - - :ref:`sphx_glr_auto_examples_browser_example.py` - -.. raw:: html - -
- - -.. toctree:: - :hidden: - - /auto_examples/browser_example - -.. raw:: html - -
- -.. only:: html - - .. figure:: /auto_examples/images/thumb/sphx_glr_qc_report_example_thumb.png - :alt: QC Report - - :ref:`sphx_glr_auto_examples_qc_report_example.py` - -.. raw:: html - -
- - -.. toctree:: - :hidden: - - /auto_examples/qc_report_example -.. raw:: html - -
- - - -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-gallery - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download all examples in Python source code: auto_examples_python.zip ` - - - - .. container:: sphx-glr-download sphx-glr-download-jupyter - - :download:`Download all examples in Jupyter notebooks: auto_examples_jupyter.zip ` - - -.. only:: html - - .. rst-class:: sphx-glr-signature - - `Gallery generated by Sphinx-Gallery `_ diff --git a/docs/auto_examples/plot_qc_example.ipynb b/docs/auto_examples/plot_qc_example.ipynb deleted file mode 100644 index 825a0b12..00000000 --- a/docs/auto_examples/plot_qc_example.ipynb +++ /dev/null @@ -1,61 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n# QC Report\n\nOutputs quality control report from given bam files.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Creating QC Report\nUsually as a first step after receiving bam files, we want to do a quality check\nand assess our data. This code generates a PDF report of important QC statistics\nfor long read methylation modification bam files\n\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "import dimelo as dm\n\n# first we specify the locations of our bam files\nin_bam = \"../../dimelo/test/data/winnowmap_guppy_merge_subset.bam\"\nsample_name = \"test\"\nout_dir = \"../../dimelo/dimelo_test\"\n\n# next we run the \"qc_report\" function\ndm.qc_report(in_bam, sample_name, out_dir)\n# now our output directory that we specified, will have a file called \"test_qc_report.pdf\"" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} \ No newline at end of file diff --git a/docs/auto_examples/plot_qc_example.py b/docs/auto_examples/plot_qc_example.py deleted file mode 100644 index 5fdc96a9..00000000 --- a/docs/auto_examples/plot_qc_example.py +++ /dev/null @@ -1,24 +0,0 @@ -""" -QC Report -=========================== - -Outputs quality control report from given bam files. - -""" -# %% -# Creating QC Report -# ------------------------ -# Usually as a first step after receiving bam files, we want to do a quality check -# and assess our data. This code generates a PDF report of important QC statistics -# for long read methylation modification bam files - -import dimelo as dm - -# first we specify the locations of our bam files -in_bam = "../../dimelo/test/data/winnowmap_guppy_merge_subset.bam" -sample_name = "test" -out_dir = "../../dimelo/dimelo_test" - -# next we run the "qc_report" function -dm.qc_report(in_bam, sample_name, out_dir) -# now our output directory that we specified, will have a file called "test_qc_report.pdf" diff --git a/docs/auto_examples/plot_qc_example.py.md5 b/docs/auto_examples/plot_qc_example.py.md5 deleted file mode 100644 index 3c003ade..00000000 --- a/docs/auto_examples/plot_qc_example.py.md5 +++ /dev/null @@ -1 +0,0 @@ -d014db7765575f293a1aeae39406e346 \ No newline at end of file diff --git a/docs/auto_examples/plot_qc_example.rst b/docs/auto_examples/plot_qc_example.rst deleted file mode 100644 index c21f5868..00000000 --- a/docs/auto_examples/plot_qc_example.rst +++ /dev/null @@ -1,100 +0,0 @@ - -.. DO NOT EDIT. -.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. -.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: -.. "auto_examples/plot_qc_example.py" -.. LINE NUMBERS ARE GIVEN BELOW. - -.. only:: html - - .. note:: - :class: sphx-glr-download-link-note - - Click :ref:`here ` - to download the full example code - -.. rst-class:: sphx-glr-example-title - -.. _sphx_glr_auto_examples_plot_qc_example.py: - - -QC Report -=========================== - -Outputs quality control report from given bam files. - -.. GENERATED FROM PYTHON SOURCE LINES 9-14 - -Creating QC Report ------------------------- -Usually as a first step after receiving bam files, we want to do a quality check -and assess our data. This code generates a PDF report of important QC statistics -for long read methylation modification bam files - -.. GENERATED FROM PYTHON SOURCE LINES 14-25 - -.. code-block:: default - - - import dimelo as dm - - # first we specify the locations of our bam files - in_bam = "../../dimelo/test/data/winnowmap_guppy_merge_subset.bam" - sample_name = "test" - out_dir = "../../dimelo/dimelo_test" - - # next we run the "qc_report" function - dm.qc_report(in_bam, sample_name, out_dir) - # now our output directory that we specified, will have a file called "test_qc_report.pdf" - - - - -.. rst-class:: sphx-glr-script-out - - Out: - - .. code-block:: none - - Processing reads: 0%| | 0/10 [00:00` - - - - .. container:: sphx-glr-download sphx-glr-download-jupyter - - :download:`Download Jupyter notebook: plot_qc_example.ipynb ` - - -.. only:: html - - .. rst-class:: sphx-glr-signature - - `Gallery generated by Sphinx-Gallery `_ diff --git a/docs/auto_examples/plot_qc_example_codeobj.pickle b/docs/auto_examples/plot_qc_example_codeobj.pickle deleted file mode 100644 index 6623050f..00000000 Binary files a/docs/auto_examples/plot_qc_example_codeobj.pickle and /dev/null differ diff --git a/docs/auto_examples/qc_report_example.ipynb b/docs/auto_examples/qc_report_example.ipynb deleted file mode 100644 index b8e32220..00000000 --- a/docs/auto_examples/qc_report_example.ipynb +++ /dev/null @@ -1,82 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n# QC Report\n\nOutputs quality control report from given bam files.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Usually as a first step after receiving bam files, we want to do a quality check\nand assess our data. This code generates a PDF report of important QC statistics\nfor modified base data from Nanopore sequencing.\n\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 1. Python option\n\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "import dimelo as dm\n\n# first we specify the locations of our bam files\nbam = \"winnowmap_guppy_merge_subset.bam\"\nsampleName = \"CTCF\"\noutdir = \"./out\"\n\n# next we run the \"qc_report\" function\ndm.qc_report(bam, sampleName, outdir)\n# now our output directory will have a file called \"CTCF_qc_report.pdf\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 2. Command line option\n``dimelo-qc-report -f winnowmap_guppy_merge_subset.bam -s CTCF -o ./out``\n\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Output\n.. figure:: ../auto_examples/images/QC_Terminal_Output.png\n.. figure:: ../auto_examples/images/CTCF_qc_report.png\n\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} \ No newline at end of file diff --git a/docs/auto_examples/qc_report_example.py b/docs/auto_examples/qc_report_example.py deleted file mode 100644 index 094a0fed..00000000 --- a/docs/auto_examples/qc_report_example.py +++ /dev/null @@ -1,38 +0,0 @@ -""" -QC Report -=========================== - -Outputs quality control report from given bam files. - -""" -# %% -# Usually as a first step after receiving bam files, we want to do a quality check -# and assess our data. This code generates a PDF report of important QC statistics -# for modified base data from Nanopore sequencing. - -# %% -# 1. Python option -# ---------------- - -import dimelo as dm - -# first we specify the locations of our bam files -bam = "winnowmap_guppy_merge_subset.bam" -sampleName = "CTCF" -outdir = "./out" - -# next we run the "qc_report" function -dm.qc_report(bam, sampleName, outdir) -# now our output directory will have a file called "CTCF_qc_report.pdf" - -# %% -# 2. Command line option -# ---------------- -# ``dimelo-qc-report -f winnowmap_guppy_merge_subset.bam -s CTCF -o ./out`` - - -# %% -# Output -# ---------------------- -# .. figure:: ../auto_examples/images/QC_Terminal_Output.png -# .. figure:: ../auto_examples/images/CTCF_qc_report.png diff --git a/docs/auto_examples/qc_report_example.rst b/docs/auto_examples/qc_report_example.rst deleted file mode 100644 index 3f05de67..00000000 --- a/docs/auto_examples/qc_report_example.rst +++ /dev/null @@ -1,98 +0,0 @@ - -.. DO NOT EDIT. -.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. -.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: -.. "auto_examples/qc_report_example.py" -.. LINE NUMBERS ARE GIVEN BELOW. - -.. only:: html - - .. note:: - :class: sphx-glr-download-link-note - - Click :ref:`here ` - to download the full example code - -.. rst-class:: sphx-glr-example-title - -.. _sphx_glr_auto_examples_qc_report_example.py: - - -QC Report -=========================== - -Outputs quality control report from given bam files. - -.. GENERATED FROM PYTHON SOURCE LINES 9-12 - -Usually as a first step after receiving bam files, we want to do a quality check -and assess our data. This code generates a PDF report of important QC statistics -for modified base data from Nanopore sequencing. - -.. GENERATED FROM PYTHON SOURCE LINES 14-16 - -1. Python option ----------------- - -.. GENERATED FROM PYTHON SOURCE LINES 16-28 - -.. code-block:: default - - - import dimelo as dm - - # first we specify the locations of our bam files - bam = "winnowmap_guppy_merge_subset.bam" - sampleName = "CTCF" - outdir = "./out" - - # next we run the "qc_report" function - dm.qc_report(bam, sampleName, outdir) - # now our output directory will have a file called "CTCF_qc_report.pdf" - - -.. GENERATED FROM PYTHON SOURCE LINES 29-32 - -2. Command line option ----------------- -``dimelo-qc-report -f winnowmap_guppy_merge_subset.bam -s CTCF -o ./out`` - -.. GENERATED FROM PYTHON SOURCE LINES 35-39 - -Output ----------------------- -.. figure:: ../auto_examples/images/QC_Terminal_Output.png -.. figure:: ../auto_examples/images/CTCF_qc_report.png - - -.. rst-class:: sphx-glr-timing - - **Total running time of the script:** ( 0 minutes 0.000 seconds) - - -.. _sphx_glr_download_auto_examples_qc_report_example.py: - - -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: qc_report_example.py ` - - - - .. container:: sphx-glr-download sphx-glr-download-jupyter - - :download:`Download Jupyter notebook: qc_report_example.ipynb ` - - -.. only:: html - - .. rst-class:: sphx-glr-signature - - `Gallery generated by Sphinx-Gallery `_ diff --git a/docs/auto_examples/qc_report_example_codeobj.pickle b/docs/auto_examples/qc_report_example_codeobj.pickle deleted file mode 100644 index c387bb94..00000000 Binary files a/docs/auto_examples/qc_report_example_codeobj.pickle and /dev/null differ diff --git a/docs/auto_examples/sg_execution_times.rst b/docs/auto_examples/sg_execution_times.rst deleted file mode 100644 index ad2f60ea..00000000 --- a/docs/auto_examples/sg_execution_times.rst +++ /dev/null @@ -1,24 +0,0 @@ - -:orphan: - -.. _sphx_glr_auto_examples_sg_execution_times: - -Computation times -================= -**00:12.341** total execution time for **auto_examples** files: - -+-----------------------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_plot_qc_example.py` (``plot_qc_example.py``) | 00:12.341 | 0.0 MB | -+-----------------------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_browser_example.py` (``browser_example.py``) | 00:00.000 | 0.0 MB | -+-----------------------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_enrichment_multi_bam_example.py` (``enrichment_multi_bam_example.py``) | 00:00.000 | 0.0 MB | -+-----------------------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_enrichment_multi_bed_example.py` (``enrichment_multi_bed_example.py``) | 00:00.000 | 0.0 MB | -+-----------------------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_enrichment_profile_ma_mc_example.py` (``enrichment_profile_ma_mc_example.py``) | 00:00.000 | 0.0 MB | -+-----------------------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_enrichment_profile_overlay_example.py` (``enrichment_profile_overlay_example.py``) | 00:00.000 | 0.0 MB | -+-----------------------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_enrichment_profile_single_example.py` (``enrichment_profile_single_example.py``) | 00:00.000 | 0.0 MB | -+-----------------------------------------------------------------------------------------------------------------+-----------+--------+ diff --git a/docs/conf.py b/docs/conf.py deleted file mode 100644 index 709c741d..00000000 --- a/docs/conf.py +++ /dev/null @@ -1,76 +0,0 @@ -# Configuration file for the Sphinx documentation builder. -# -# This file only contains a selection of the most common options. For a full -# list see the documentation: -# https://www.sphinx-doc.org/en/master/usage/configuration.html - -# -- Path setup -------------------------------------------------------------- - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -# -# import os -# import sys -# sys.path.insert(0, os.path.abspath('.')) - -# import sphinx_rtd_theme - -# -- Project information ----------------------------------------------------- - -project = "dimelo" -copyright = "2022, Annie Maslan & Reet Mishra & Jeremy Marcus" -author = "Annie Maslan & Reet Mishra & Jeremy Marcus" - - -# -- General configuration --------------------------------------------------- - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = [ - "sphinx.ext.autodoc", - "sphinx.ext.autosummary", - "sphinx.ext.autosectionlabel", - "sphinx_gallery.gen_gallery", # added this for sphinx gallery - "sphinx_rtd_theme", - "sphinx_argparse_cli", -] - - -# Include doc string for __init__ method in the documentation -autosummary_generate = True - -autoclass_content = "class" -autodoc_member_order = "bysource" - -# If true, the current module name will be prepended to all description -# unit titles (such as .. function::). -add_module_names = False - -# Add any paths that contain templates here, relative to this directory. -templates_path = ["_templates"] - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This pattern also affects html_static_path and html_extra_path. -exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] - - -# -- Options for HTML output ------------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# -html_theme = "sphinx_rtd_theme" - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ["_static"] - -# -- Sphinx Gallery Configuration ------------------------------------------- -sphinx_gallery_conf = { - "examples_dirs": "examples", # path to your example scripts - "gallery_dirs": "auto_examples", # path to where to save gallery generated output -} diff --git a/docs/content/basecalling.rst b/docs/content/basecalling.rst deleted file mode 100644 index 864e8bc1..00000000 --- a/docs/content/basecalling.rst +++ /dev/null @@ -1,28 +0,0 @@ -Basecalling & Alignment Suggestions -==================================== - -The dimelo package takes an aligned bam file with modified basecalls as input. Below, we offer some suggestions for performing the upstream basecalling and alignment. -The best basecalling and alignment methods will vary by use case, and the below suggestions are just what worked well for us. -ONT is also constantly improving basecalling, and these suggestions are likely to become outdated quickly. - -Suggestions ------------- - -1. Model we have used for m6A calling: - - * `res_dna_r941_min_modbases-all-context_v001 `__ - -2. We generally use Megalodon for both basecalling & alignment. Megalodon requires `Guppy `__. N.B. you may need to downgrade Megalodon and/or Guppy to find a compatible version combination. - - * `Megalodon `__ - -3. For exploring repetitve regions of the genome, we've found that Winnowmap performs better than the aligner Megalodon uses, `minimap2 `__. For repetitive regions, we use Guppy for basecalling and Winnowmap for alignment. - - * `Guppy `__ - * `Winnowmap `__ - -4. If using Guppy & Winnowmap, the resulting bam files must be combined to create a single bam with the modified basecalls from Guppy and the mapping information from Winnowmap. - - * `hybrid_guppy_winnnowmap_bam_creation `__ - -5. We perform basecalling separately from the sequencing run and use an EC2 instance (g4dn.metal) with multiple GPUs to speed up basecalling significantly. \ No newline at end of file diff --git a/docs/content/demo/CTCF_demo_A+CG_sm_rolling_avg.png b/docs/content/demo/CTCF_demo_A+CG_sm_rolling_avg.png deleted file mode 100644 index 401ae956..00000000 Binary files a/docs/content/demo/CTCF_demo_A+CG_sm_rolling_avg.png and /dev/null differ diff --git a/docs/content/demo/CTCF_demo_A+CG_sm_scatter.png b/docs/content/demo/CTCF_demo_A+CG_sm_scatter.png deleted file mode 100644 index 9323a384..00000000 Binary files a/docs/content/demo/CTCF_demo_A+CG_sm_scatter.png and /dev/null differ diff --git a/docs/content/demo/CTCF_demo_A_base_count.png b/docs/content/demo/CTCF_demo_A_base_count.png deleted file mode 100644 index 89fbc012..00000000 Binary files a/docs/content/demo/CTCF_demo_A_base_count.png and /dev/null differ diff --git a/docs/content/demo/CTCF_demo_A_sm_rolling_avg_fraction.png b/docs/content/demo/CTCF_demo_A_sm_rolling_avg_fraction.png deleted file mode 100644 index 3c3a6800..00000000 Binary files a/docs/content/demo/CTCF_demo_A_sm_rolling_avg_fraction.png and /dev/null differ diff --git a/docs/content/demo/CTCF_demo_A_sm_rolling_avg_total.png b/docs/content/demo/CTCF_demo_A_sm_rolling_avg_total.png deleted file mode 100644 index 22350db8..00000000 Binary files a/docs/content/demo/CTCF_demo_A_sm_rolling_avg_total.png and /dev/null differ diff --git a/docs/content/demo/CTCF_demo_CG_base_count.png b/docs/content/demo/CTCF_demo_CG_base_count.png deleted file mode 100644 index 157c9510..00000000 Binary files a/docs/content/demo/CTCF_demo_CG_base_count.png and /dev/null differ diff --git a/docs/content/demo/CTCF_demo_CG_sm_rolling_avg_fraction.png b/docs/content/demo/CTCF_demo_CG_sm_rolling_avg_fraction.png deleted file mode 100644 index c90edc69..00000000 Binary files a/docs/content/demo/CTCF_demo_CG_sm_rolling_avg_fraction.png and /dev/null differ diff --git a/docs/content/demo/CTCF_demo_CG_sm_rolling_avg_total.png b/docs/content/demo/CTCF_demo_CG_sm_rolling_avg_total.png deleted file mode 100644 index 618d3fe6..00000000 Binary files a/docs/content/demo/CTCF_demo_CG_sm_rolling_avg_total.png and /dev/null differ diff --git a/docs/content/demo/CTCF_demo_qc_report.png b/docs/content/demo/CTCF_demo_qc_report.png deleted file mode 100644 index cea75e79..00000000 Binary files a/docs/content/demo/CTCF_demo_qc_report.png and /dev/null differ diff --git a/docs/content/demo/methylation_browser_chr11_2086423_2091187.png b/docs/content/demo/methylation_browser_chr11_2086423_2091187.png deleted file mode 100644 index f1b73da7..00000000 Binary files a/docs/content/demo/methylation_browser_chr11_2086423_2091187.png and /dev/null differ diff --git a/docs/content/demo/sample_ctcf_demo.sorted_A_enrichment_barplot.png b/docs/content/demo/sample_ctcf_demo.sorted_A_enrichment_barplot.png deleted file mode 100644 index dea669c8..00000000 Binary files a/docs/content/demo/sample_ctcf_demo.sorted_A_enrichment_barplot.png and /dev/null differ diff --git a/docs/content/installation.rst b/docs/content/installation.rst deleted file mode 100644 index 53f067bf..00000000 --- a/docs/content/installation.rst +++ /dev/null @@ -1,92 +0,0 @@ -Installation -==================== - -Requirements ------------- - -* `conda `__ -* python 3.7 - -Installation from Source ------------------------- - -1. Get the code. - -.. code:: bash - - git clone https://github.com/streetslab/dimelo.git - cd dimelo - -2. Create and activate a python 3.7 conda venv. - -Recommended to avoid package dependency install issues: - -Linux: - -.. code:: bash - - conda env create -f environment_linux.yml - conda activate dimelo - -MacOS: - -.. code:: bash - - conda env create -f environment_macOS.yml - conda activate dimelo - -Other option to create venv without using provided yml: - -.. code:: bash - - conda create --name dimelo python=3.7 - conda activate dimelo - -3. Install dimelo and its requirements. - -.. code:: bash - - pip install . - -4. Now the dimelo package is available for import. For example, you may import it like this: - -.. code:: bash - - python - ->>> import dimelo as dm - -And then call functions like this: - ->>> dm.function_name(...) - -Alternatively, functions can be accessed from the command line like this: - -.. code:: bash - - dimelo-function-name ... - - -Other notes ------------------------- - -* The dependency pybedtools requires that you have bedtools. Because this is not able to be installed with pip, if you did not create your environment from environment.yml, you must run: - -.. code:: bash - - conda install bedtools - -* If you would like to make changes to the package, you can install it in developer mode: - -.. code:: bash - - pip install -e . - -* Additionally, if making contributions to the codebase, install pre-commit, which will enforce the dimelo code style (black, flake8) on each of your commits: - -.. code:: bash - - pip install pre-commit - pre-commit install - - diff --git a/docs/content/reference/parse_bam.rst b/docs/content/reference/parse_bam.rst deleted file mode 100644 index 3f79c916..00000000 --- a/docs/content/reference/parse_bam.rst +++ /dev/null @@ -1,12 +0,0 @@ -parse\_bam -================= - -.. currentmodule:: dimelo - -.. autofunction:: parse_bam - -.. sphinx_argparse_cli:: - :module: dimelo.parse_bam - :func: main - :hook: - :prog: dimelo-parse-bam diff --git a/docs/content/reference/plot_browser.rst b/docs/content/reference/plot_browser.rst deleted file mode 100644 index 14677413..00000000 --- a/docs/content/reference/plot_browser.rst +++ /dev/null @@ -1,12 +0,0 @@ -plot\_browser -==================== - -.. currentmodule:: dimelo - -.. autofunction:: plot_browser - -.. sphinx_argparse_cli:: - :module: dimelo.plot_browser - :func: main - :hook: - :prog: dimelo-plot-browser diff --git a/docs/content/reference/plot_enrichment.rst b/docs/content/reference/plot_enrichment.rst deleted file mode 100644 index 9295e798..00000000 --- a/docs/content/reference/plot_enrichment.rst +++ /dev/null @@ -1,12 +0,0 @@ -plot\_enrichment -======================= - -.. currentmodule:: dimelo - -.. autofunction:: plot_enrichment - -.. sphinx_argparse_cli:: - :module: dimelo.plot_enrichment - :func: main - :hook: - :prog: dimelo-plot-enrichment diff --git a/docs/content/reference/plot_enrichment_profile.rst b/docs/content/reference/plot_enrichment_profile.rst deleted file mode 100644 index 3ba1f125..00000000 --- a/docs/content/reference/plot_enrichment_profile.rst +++ /dev/null @@ -1,12 +0,0 @@ -plot\_enrichment\_profile -================================ - -.. currentmodule:: dimelo - -.. autofunction:: plot_enrichment_profile - -.. sphinx_argparse_cli:: - :module: dimelo.plot_enrichment_profile - :func: main - :hook: - :prog: dimelo-plot-enrichment-profile diff --git a/docs/content/reference/qc_report.rst b/docs/content/reference/qc_report.rst deleted file mode 100644 index 4f45b6d4..00000000 --- a/docs/content/reference/qc_report.rst +++ /dev/null @@ -1,12 +0,0 @@ -qc\_report -================= - -.. currentmodule:: dimelo - -.. autofunction:: qc_report - -.. sphinx_argparse_cli:: - :module: dimelo.qc - :func: main - :hook: - :prog: dimelo-qc-report diff --git a/docs/content/reference/tools.rst b/docs/content/reference/tools.rst deleted file mode 100644 index 337f3952..00000000 --- a/docs/content/reference/tools.rst +++ /dev/null @@ -1,26 +0,0 @@ -Functions --------------- -+-------------------------------------------------+-----------------------+-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------+ -| function | type | input files | main output file(s) | -+=================================================+=======================+=====================================+============================================+===================================================================================+ -|:doc:`qc_report` | QC | 1 or more BAM | summary report with figures & table for read length, mapping quality, basecall quality, etc. | -+-------------------------------------------------+-----------------------+-------------------------------------+--------------------------------------------+-----------------------------------------------------------------------------------+ -|:doc:`plot_browser` | visualization | 1 or more BAM | single-molecule browser as html or pdf; aggregate browser plots and coverage | -+-------------------------------------------------+-----------------------+-------------------------------------+--------------------------------------------+-----------------------------------------------------------------------------------+ -|:doc:`plot_enrichment` | visualization | 1 or more BAM, 1 or more BED | barplot of fraction modified bases within region(s) defined by BED(s) | -+-------------------------------------------------+-----------------------+-------------------------------------+--------------------------------------------+-----------------------------------------------------------------------------------+ -|:doc:`plot_enrichment_profile` | visualization | 1 or more BAM, 1 or more BED | profile, single molecule plots, base abundance; option to overlay if input multiple BAM/BED | -+-------------------------------------------------+-----------------------+-------------------------------------+--------------------------------------------+-----------------------------------------------------------------------------------+ -|:doc:`parse_bam` | data formatting | 1 BAM | sql database (to allow for custom visualization) | -+-------------------------------------------------+-----------------------+-------------------------------------+--------------------------------------------+-----------------------------------------------------------------------------------+ - -.. toctree:: - :maxdepth: 2 - :hidden: - - qc_report - plot_browser - plot_enrichment - plot_enrichment_profile - parse_bam - \ No newline at end of file diff --git a/docs/content/tutorial.rst b/docs/content/tutorial.rst deleted file mode 100644 index bf077207..00000000 --- a/docs/content/tutorial.rst +++ /dev/null @@ -1,74 +0,0 @@ -Tutorial -==================================== - -Follow the steps here to run the dimelo package with a test dataset. - -Files needed -------------- -Files can be found in directory: ``dimelo/test/data`` - -1. ctcf_demo.sorted.bam -2. ctcf_demo.sorted.bam.bai -3. ctcf_demo_peak.bed -4. ctcf_demo_not_peak.bed - -Steps -------------- -1. :doc:`../content/installation` -2. Run below commands and ensure your output matches the expected plots below. This tutorial walks through running functions from python, but the dimelo package can also be used from the command line (see :doc:`../auto_examples/index`). - ->>> import dimelo as dm ->>> bam = "dimelo/test/data/ctcf_demo.sorted.bam" ->>> sampleName = "CTCF_demo" ->>> outDir = "out" ->>> bedPeak = "dimelo/test/data/ctcf_demo_peak.bed" ->>> bedNotPeak = "dimelo/test/data/ctcf_demo_not_peak.bed" - ->>> dm.qc_report(bam, sampleName, outDir) - -.. image:: demo/CTCF_demo_qc_report.png - :align: center - ->>> dm.plot_enrichment(bam, ['CTCF_peak', 'CTCF_not_peak'], [bedPeak, bedNotPeak], "A", outDir, threshA=190) - -.. image:: demo/sample_ctcf_demo.sorted_A_enrichment_barplot.png - :align: center - ->>> dm.plot_enrichment_profile(bam, sampleName, bedPeak,"A+CG",outDir,threshA=190,threshC=190) - -Aggregate rolling average fraction of methylated bases - -.. image:: demo/CTCF_demo_A+CG_sm_rolling_avg.png - :align: center - -Single molecules with binary mA and mCpG colored - -.. image:: demo/CTCF_demo_A+CG_sm_scatter.png - :align: center - -A base count - -.. image:: demo/CTCF_demo_A_base_count.png - :align: center - -CG base count - -.. image:: demo/CTCF_demo_CG_base_count.png - :align: center - ->>> dm.plot_browser(bam, sampleName, "chr11:2086423-2091187", "A+CG", outDir, threshA=153, threshC=153, static=True, smooth=100, min_periods=10) - -.. image:: demo/methylation_browser_chr11_2086423_2091187.png - :align: center - -.. image:: demo/CTCF_demo_A_sm_rolling_avg_fraction.png - :align: center - -.. image:: demo/CTCF_demo_A_sm_rolling_avg_total.png - :align: center - -.. image:: demo/CTCF_demo_CG_sm_rolling_avg_fraction.png - :align: center - -.. image:: demo/CTCF_demo_CG_sm_rolling_avg_total.png - :align: center \ No newline at end of file diff --git a/docs/doctrees/auto_examples/browser_example.doctree b/docs/doctrees/auto_examples/browser_example.doctree deleted file mode 100644 index b264fd17..00000000 Binary files a/docs/doctrees/auto_examples/browser_example.doctree and /dev/null differ diff --git a/docs/doctrees/auto_examples/enrichment_multi_bam_example.doctree b/docs/doctrees/auto_examples/enrichment_multi_bam_example.doctree deleted file mode 100644 index d0590d52..00000000 Binary files a/docs/doctrees/auto_examples/enrichment_multi_bam_example.doctree and /dev/null differ diff --git a/docs/doctrees/auto_examples/enrichment_multi_bed_example.doctree b/docs/doctrees/auto_examples/enrichment_multi_bed_example.doctree deleted file mode 100644 index b2c31f31..00000000 Binary files a/docs/doctrees/auto_examples/enrichment_multi_bed_example.doctree and /dev/null differ diff --git a/docs/doctrees/auto_examples/enrichment_profile_ma_mc_example.doctree b/docs/doctrees/auto_examples/enrichment_profile_ma_mc_example.doctree deleted file mode 100644 index 06e7d5e0..00000000 Binary files a/docs/doctrees/auto_examples/enrichment_profile_ma_mc_example.doctree and /dev/null differ diff --git a/docs/doctrees/auto_examples/enrichment_profile_overlay_example.doctree b/docs/doctrees/auto_examples/enrichment_profile_overlay_example.doctree deleted file mode 100644 index 3eaacda4..00000000 Binary files a/docs/doctrees/auto_examples/enrichment_profile_overlay_example.doctree and /dev/null differ diff --git a/docs/doctrees/auto_examples/enrichment_profile_single_example.doctree b/docs/doctrees/auto_examples/enrichment_profile_single_example.doctree deleted file mode 100644 index 59df823a..00000000 Binary files a/docs/doctrees/auto_examples/enrichment_profile_single_example.doctree and /dev/null differ diff --git a/docs/doctrees/auto_examples/index.doctree b/docs/doctrees/auto_examples/index.doctree deleted file mode 100644 index 974d02ac..00000000 Binary files a/docs/doctrees/auto_examples/index.doctree and /dev/null differ diff --git a/docs/doctrees/auto_examples/plot_browser_example.doctree b/docs/doctrees/auto_examples/plot_browser_example.doctree deleted file mode 100644 index a93b2833..00000000 Binary files a/docs/doctrees/auto_examples/plot_browser_example.doctree and /dev/null differ diff --git a/docs/doctrees/auto_examples/plot_enrichment_example.doctree b/docs/doctrees/auto_examples/plot_enrichment_example.doctree deleted file mode 100644 index 97fd03ed..00000000 Binary files a/docs/doctrees/auto_examples/plot_enrichment_example.doctree and /dev/null differ diff --git a/docs/doctrees/auto_examples/plot_enrichment_profile_example.doctree b/docs/doctrees/auto_examples/plot_enrichment_profile_example.doctree deleted file mode 100644 index 6c217559..00000000 Binary files a/docs/doctrees/auto_examples/plot_enrichment_profile_example.doctree and /dev/null differ diff --git a/docs/doctrees/auto_examples/plot_example.doctree b/docs/doctrees/auto_examples/plot_example.doctree deleted file mode 100644 index d04968db..00000000 Binary files a/docs/doctrees/auto_examples/plot_example.doctree and /dev/null differ diff --git a/docs/doctrees/auto_examples/plot_qc_example.doctree b/docs/doctrees/auto_examples/plot_qc_example.doctree deleted file mode 100644 index ad9e9634..00000000 Binary files a/docs/doctrees/auto_examples/plot_qc_example.doctree and /dev/null differ diff --git a/docs/doctrees/auto_examples/qc_example.doctree b/docs/doctrees/auto_examples/qc_example.doctree deleted file mode 100644 index 9a0b00f7..00000000 Binary files a/docs/doctrees/auto_examples/qc_example.doctree and /dev/null differ diff --git a/docs/doctrees/auto_examples/qc_report_example.doctree b/docs/doctrees/auto_examples/qc_report_example.doctree deleted file mode 100644 index e25c4d68..00000000 Binary files a/docs/doctrees/auto_examples/qc_report_example.doctree and /dev/null differ diff --git a/docs/doctrees/auto_examples/sg_execution_times.doctree b/docs/doctrees/auto_examples/sg_execution_times.doctree deleted file mode 100644 index a4ca4f3a..00000000 Binary files a/docs/doctrees/auto_examples/sg_execution_times.doctree and /dev/null differ diff --git a/docs/doctrees/content/basecalling.doctree b/docs/doctrees/content/basecalling.doctree deleted file mode 100644 index 99b610fb..00000000 Binary files a/docs/doctrees/content/basecalling.doctree and /dev/null differ diff --git a/docs/doctrees/content/installation.doctree b/docs/doctrees/content/installation.doctree deleted file mode 100644 index d236cc79..00000000 Binary files a/docs/doctrees/content/installation.doctree and /dev/null differ diff --git a/docs/doctrees/content/reference/parse_bam.doctree b/docs/doctrees/content/reference/parse_bam.doctree deleted file mode 100644 index 9d4be3ce..00000000 Binary files a/docs/doctrees/content/reference/parse_bam.doctree and /dev/null differ diff --git a/docs/doctrees/content/reference/plot_browser.doctree b/docs/doctrees/content/reference/plot_browser.doctree deleted file mode 100644 index fc4192b5..00000000 Binary files a/docs/doctrees/content/reference/plot_browser.doctree and /dev/null differ diff --git a/docs/doctrees/content/reference/plot_enrichment.doctree b/docs/doctrees/content/reference/plot_enrichment.doctree deleted file mode 100644 index dbcb55f1..00000000 Binary files a/docs/doctrees/content/reference/plot_enrichment.doctree and /dev/null differ diff --git a/docs/doctrees/content/reference/plot_enrichment_profile.doctree b/docs/doctrees/content/reference/plot_enrichment_profile.doctree deleted file mode 100644 index 5a3279f3..00000000 Binary files a/docs/doctrees/content/reference/plot_enrichment_profile.doctree and /dev/null differ diff --git a/docs/doctrees/content/reference/qc_report.doctree b/docs/doctrees/content/reference/qc_report.doctree deleted file mode 100644 index 695b5f6f..00000000 Binary files a/docs/doctrees/content/reference/qc_report.doctree and /dev/null differ diff --git a/docs/doctrees/content/reference/tools.doctree b/docs/doctrees/content/reference/tools.doctree deleted file mode 100644 index 4ea6f5f2..00000000 Binary files a/docs/doctrees/content/reference/tools.doctree and /dev/null differ diff --git a/docs/doctrees/content/tutorial.doctree b/docs/doctrees/content/tutorial.doctree deleted file mode 100644 index 591e6ed6..00000000 Binary files a/docs/doctrees/content/tutorial.doctree and /dev/null differ diff --git a/docs/doctrees/environment.pickle b/docs/doctrees/environment.pickle deleted file mode 100644 index 989699c2..00000000 Binary files a/docs/doctrees/environment.pickle and /dev/null differ diff --git a/docs/doctrees/index.doctree b/docs/doctrees/index.doctree deleted file mode 100644 index 05377879..00000000 Binary files a/docs/doctrees/index.doctree and /dev/null differ diff --git a/docs/examples/README.txt b/docs/examples/README.txt deleted file mode 100644 index 1715ba06..00000000 --- a/docs/examples/README.txt +++ /dev/null @@ -1,2 +0,0 @@ -Example Gallery -======================= \ No newline at end of file diff --git a/docs/examples/browser_example.py b/docs/examples/browser_example.py deleted file mode 100644 index dc4e0a06..00000000 --- a/docs/examples/browser_example.py +++ /dev/null @@ -1,52 +0,0 @@ -""" -Single-Molecule Browser Plot -============================ - -Plot single molecules with colored base modifications in a region of interest - -""" -# %% -# Create either an interactive single-molecule HTML browser if static=False, or create a PDF if static=True. -# Base modifications are colored by type (mA vs. mCG) and probability of modification. -# Example data for producing these plots can be downloaded from SRA: https://www.ncbi.nlm.nih.gov/bioproject/752170 -# The below Python and command line options produce the same output. - -# %% -# 1. Python option -# ---------------- -import dimelo as dm - -bam = "deep_ctcf_mod_mappings_merge.sorted.bam" -sampleName = "CTCF" -outDir = "./out" -dm.plot_browser( - bam, - sampleName, - "chr11:2086423-2091187", - "A+CG", - outDir, - threshA=153, - threshC=153, - static=True, - smooth=100, - min_periods=10, -) - -# %% -# 2. Command line option -# ---------------------- -# ``dimelo-plot-browser -f deep_ctcf_mod_mappings_merge.sorted.bam -s CTCF -r chr11:2086423-2091187 -m A+CG -o ./out -A 153 -C 153 --static -t 100 -n 10`` - -# %% -# Output -# ---------------------- -# .. figure:: ../auto_examples/images/methylation_browser_chr11_2086423_2091187.png -# :align: center -# .. figure:: ../auto_examples/images/CTCF_A_sm_rolling_avg_fraction.png -# :align: center -# .. figure:: ../auto_examples/images/CTCF_A_sm_rolling_avg_total.png -# :align: center -# .. figure:: ../auto_examples/images/CTCF_CG_sm_rolling_avg_fraction.png -# :align: center -# .. figure:: ../auto_examples/images/CTCF_CG_sm_rolling_avg_total.png -# :align: center diff --git a/docs/examples/enrichment_multi_bam_example.py b/docs/examples/enrichment_multi_bam_example.py deleted file mode 100644 index 4a65f21d..00000000 --- a/docs/examples/enrichment_multi_bam_example.py +++ /dev/null @@ -1,34 +0,0 @@ -""" -Enrichment Plot Comparison Across BAMs -====================================== - -Plot overall fraction of methylated bases within regions of interest specified by bed file across multiple samples. - -""" -# %% -# Create barplot comparing methylation levels in bed file regions of interest across samples - -# %% -# 1. Python option -# ---------------- -import dimelo as dm - -bams = [ - "deep_ctcf_mod_mappings_merge.sorted.bam", - "hia5_mod_mappings.bam", - "igg_mod_mappings.bam", -] -sampleNames = ["CTCF", "Hia5", "IgG"] -bed = "q10.150.slop.bed" -outDir = "./out" -dm.plot_enrichment(bams, sampleNames, bed, "A", outDir, threshA=190) - -# %% -# 2. Command line option -# ---------------------- -# ``dimelo-plot-enrichment -f deep_ctcf_mod_mappings_merge.sorted.bam hia5_mod_mappings.bam igg_mod_mappings.bam -s CTCF Hia5 IgG -b q10.150.slop.bed -m A -o ./out -A 190`` - -# %% -# Output -# ---------------------- -# .. figure:: ../auto_examples/images/region_q10.150.slop_A_enrichment_barplot.png diff --git a/docs/examples/enrichment_multi_bed_example.py b/docs/examples/enrichment_multi_bed_example.py deleted file mode 100644 index 462b3da8..00000000 --- a/docs/examples/enrichment_multi_bed_example.py +++ /dev/null @@ -1,30 +0,0 @@ -""" -Enrichment Plot Comparison Across BEDs -====================================== - -Plot overall fraction of methylated bases within multiple sets of regions of interest specified by bed files for a single sample. - -""" -# %% -# Create barplot comparing methylation levels in single sample across multiple regions of interest defined in bed files. - -# %% -# 1. Python option -# ---------------- -import dimelo as dm - -bam = "deep_ctcf_mod_mappings_merge.sorted.bam" -beds = ["q10.150.slop.bed", "q10nopeak.bed"] -sampleNames = ["chip_peak", "not_chip_peak"] -outDir = "./out" -dm.plot_enrichment(bam, sampleNames, beds, "A", outDir, threshA=190) - -# %% -# 2. Command line option -# ---------------------- -# ``dimelo-plot-enrichment -f deep_ctcf_mod_mappings_merge.sorted.bam -s chip_peak not_chip_peak -b q10.150.slop.bed q10nopeak.bed -m A -o ./out -A 190`` - -# %% -# Output -# ---------------------- -# .. figure:: ../auto_examples/images/sample_deep_ctcf_mod_mappings_merge.sorted_A_enrichment_barplot.png diff --git a/docs/examples/enrichment_profile_ma_mc_example.py b/docs/examples/enrichment_profile_ma_mc_example.py deleted file mode 100644 index 077d0801..00000000 --- a/docs/examples/enrichment_profile_ma_mc_example.py +++ /dev/null @@ -1,44 +0,0 @@ -""" -Enrichment Profile mA & mCG -================================= - -Aggregate and single molecule plots colored by modification and centered at regions of interest defined in bed file. - -""" -# %% -# Create (1) aggregate profile plots for mA/A and mCG/CG, (2) single-molecule plots for mA + mCG, and (3) base abundance plots for A and CG. - -# %% -# 1. Python option -# ---------------- -import dimelo as dm - -bam = "deep_ctcf_mod_mappings_merge.sorted.bam" -sampleName = "quartile4" -bed = "quart4.bed" -outDir = "./out" -dm.plot_enrichment_profile( - bam, - sampleName, - bed, - "A+CG", - outDir, - threshA=190, - threshC=190, - dotsize=0.05, -) - - -# %% -# 2. Command line option -# ---------------------- -# ``dimelo-plot-enrichment-profile -f deep_ctcf_mod_mappings_merge.sorted.bam -s quartile4 -b quart4.bed -m A+CG -o ./out -A 190 -C 190 -d 0.05`` - -# %% -# Output -# ---------------------- -# .. figure:: ../auto_examples/images/quartile4_A+CG_sm_rolling_avg.png -# :align: center -# .. figure:: ../auto_examples/images/quartile4_A+CG_sm_scatter.png -# .. figure:: ../auto_examples/images/quartile4_A_base_count.png -# .. figure:: ../auto_examples/images/quartile4_CG_base_count.png diff --git a/docs/examples/enrichment_profile_overlay_example.py b/docs/examples/enrichment_profile_overlay_example.py deleted file mode 100644 index 63f43666..00000000 --- a/docs/examples/enrichment_profile_overlay_example.py +++ /dev/null @@ -1,33 +0,0 @@ -""" -Enrichment Profile Overlay -================================= - -Aggregate fraction of methylated bases centered at regions of interest defined in bed files. - -""" -# %% -# Create (1) aggregate profile plots for mA/A and mCG/CG, (2) single-molecule plots for mA + mCG, and (3) base abundance plots for A and CG. - -# %% -# 1. Python option -# ---------------- -import dimelo as dm - -bam = "deep_ctcf_mod_mappings_merge.sorted.bam" -sampleNames = ["q4", "q3", "q2", "q1"] -beds = ["quart4.bed", "quart3.bed", "quart2.bed", "quart1.bed"] -outDir = "./out" -dm.plot_enrichment_profile( - bam, sampleNames, beds, "A", outDir, threshA=190, dotsize=0.05 -) - -# %% -# 2. Command line option -# ---------------------- -# ``dimelo-plot-enrichment-profile -f deep_ctcf_mod_mappings_merge.sorted.bam -s q4 q3 q2 q1 -b quart4.bed quart3.bed quart2.bed quart1.bed -m A -o ./out -A 190 -d 0.05`` - -# %% -# Output -# ---------------------- -# .. figure:: ../auto_examples/images/sample_deep_ctcf_mod_mappings_merge.sorted_A_sm_rolling_avg_overlay.png -# :align: center diff --git a/docs/examples/enrichment_profile_single_example.py b/docs/examples/enrichment_profile_single_example.py deleted file mode 100644 index 7a932845..00000000 --- a/docs/examples/enrichment_profile_single_example.py +++ /dev/null @@ -1,35 +0,0 @@ -""" -Enrichment Profile mA only -================================= - -Plot single molecules centered at regions of interest defined in bed file and produce aggregate profile - -""" -# %% -# Create (1) aggregate profile plots for mA/A, (2) single-molecule plots for mA, and (3) base abundance plots for A. - -# %% -# 1. Python option -# ---------------- -import dimelo as dm - -bam = "deep_ctcf_mod_mappings_merge.sorted.bam" -sampleName = "quartile4" -bed = "quart4.bed" -outDir = "./out" -dm.plot_enrichment_profile( - bam, sampleName, bed, "A", outDir, threshA=190, dotsize=0.05 -) - -# %% -# 2. Command line option -# ---------------------- -# ``dimelo-plot-enrichment-profile -f deep_ctcf_mod_mappings_merge.sorted.bam -s quartile4 -b quart4.bed -m A -o ./out -A 190 -d 0.05`` - -# %% -# Output -# ---------------------- -# .. figure:: ../auto_examples/images/quartile4_A_sm_rolling_avg.png -# :align: center -# .. figure:: ../auto_examples/images/quartile4_A_sm_scatter.png -# .. figure:: ../auto_examples/images/quartile4_A_base_count.png diff --git a/docs/examples/qc_report_example.py b/docs/examples/qc_report_example.py deleted file mode 100644 index 094a0fed..00000000 --- a/docs/examples/qc_report_example.py +++ /dev/null @@ -1,38 +0,0 @@ -""" -QC Report -=========================== - -Outputs quality control report from given bam files. - -""" -# %% -# Usually as a first step after receiving bam files, we want to do a quality check -# and assess our data. This code generates a PDF report of important QC statistics -# for modified base data from Nanopore sequencing. - -# %% -# 1. Python option -# ---------------- - -import dimelo as dm - -# first we specify the locations of our bam files -bam = "winnowmap_guppy_merge_subset.bam" -sampleName = "CTCF" -outdir = "./out" - -# next we run the "qc_report" function -dm.qc_report(bam, sampleName, outdir) -# now our output directory will have a file called "CTCF_qc_report.pdf" - -# %% -# 2. Command line option -# ---------------- -# ``dimelo-qc-report -f winnowmap_guppy_merge_subset.bam -s CTCF -o ./out`` - - -# %% -# Output -# ---------------------- -# .. figure:: ../auto_examples/images/QC_Terminal_Output.png -# .. figure:: ../auto_examples/images/CTCF_qc_report.png diff --git a/docs/html/.buildinfo b/docs/html/.buildinfo deleted file mode 100644 index 911b2167..00000000 --- a/docs/html/.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: 44150bca9bd00b5a909cd74d9d2ea2f8 -tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/html/_downloads/07fcc19ba03226cd3d83d4e40ec44385/auto_examples_python.zip b/docs/html/_downloads/07fcc19ba03226cd3d83d4e40ec44385/auto_examples_python.zip deleted file mode 100644 index 4c34adc1..00000000 Binary files a/docs/html/_downloads/07fcc19ba03226cd3d83d4e40ec44385/auto_examples_python.zip and /dev/null differ diff --git a/docs/html/_downloads/161476fd4a8dbe955e866182c39d47a3/enrichment_profile_ma_mc_example.py b/docs/html/_downloads/161476fd4a8dbe955e866182c39d47a3/enrichment_profile_ma_mc_example.py deleted file mode 100644 index 077d0801..00000000 --- a/docs/html/_downloads/161476fd4a8dbe955e866182c39d47a3/enrichment_profile_ma_mc_example.py +++ /dev/null @@ -1,44 +0,0 @@ -""" -Enrichment Profile mA & mCG -================================= - -Aggregate and single molecule plots colored by modification and centered at regions of interest defined in bed file. - -""" -# %% -# Create (1) aggregate profile plots for mA/A and mCG/CG, (2) single-molecule plots for mA + mCG, and (3) base abundance plots for A and CG. - -# %% -# 1. Python option -# ---------------- -import dimelo as dm - -bam = "deep_ctcf_mod_mappings_merge.sorted.bam" -sampleName = "quartile4" -bed = "quart4.bed" -outDir = "./out" -dm.plot_enrichment_profile( - bam, - sampleName, - bed, - "A+CG", - outDir, - threshA=190, - threshC=190, - dotsize=0.05, -) - - -# %% -# 2. Command line option -# ---------------------- -# ``dimelo-plot-enrichment-profile -f deep_ctcf_mod_mappings_merge.sorted.bam -s quartile4 -b quart4.bed -m A+CG -o ./out -A 190 -C 190 -d 0.05`` - -# %% -# Output -# ---------------------- -# .. figure:: ../auto_examples/images/quartile4_A+CG_sm_rolling_avg.png -# :align: center -# .. figure:: ../auto_examples/images/quartile4_A+CG_sm_scatter.png -# .. figure:: ../auto_examples/images/quartile4_A_base_count.png -# .. figure:: ../auto_examples/images/quartile4_CG_base_count.png diff --git a/docs/html/_downloads/2788c1074bff89a30c04dbdd345ed6b0/enrichment_profile_single_example.py b/docs/html/_downloads/2788c1074bff89a30c04dbdd345ed6b0/enrichment_profile_single_example.py deleted file mode 100644 index 7a932845..00000000 --- a/docs/html/_downloads/2788c1074bff89a30c04dbdd345ed6b0/enrichment_profile_single_example.py +++ /dev/null @@ -1,35 +0,0 @@ -""" -Enrichment Profile mA only -================================= - -Plot single molecules centered at regions of interest defined in bed file and produce aggregate profile - -""" -# %% -# Create (1) aggregate profile plots for mA/A, (2) single-molecule plots for mA, and (3) base abundance plots for A. - -# %% -# 1. Python option -# ---------------- -import dimelo as dm - -bam = "deep_ctcf_mod_mappings_merge.sorted.bam" -sampleName = "quartile4" -bed = "quart4.bed" -outDir = "./out" -dm.plot_enrichment_profile( - bam, sampleName, bed, "A", outDir, threshA=190, dotsize=0.05 -) - -# %% -# 2. Command line option -# ---------------------- -# ``dimelo-plot-enrichment-profile -f deep_ctcf_mod_mappings_merge.sorted.bam -s quartile4 -b quart4.bed -m A -o ./out -A 190 -d 0.05`` - -# %% -# Output -# ---------------------- -# .. figure:: ../auto_examples/images/quartile4_A_sm_rolling_avg.png -# :align: center -# .. figure:: ../auto_examples/images/quartile4_A_sm_scatter.png -# .. figure:: ../auto_examples/images/quartile4_A_base_count.png diff --git a/docs/html/_downloads/28bf5b885c707f7863eaed624722ca82/plot_example.ipynb b/docs/html/_downloads/28bf5b885c707f7863eaed624722ca82/plot_example.ipynb deleted file mode 100644 index 879f81e2..00000000 --- a/docs/html/_downloads/28bf5b885c707f7863eaed624722ca82/plot_example.ipynb +++ /dev/null @@ -1,79 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n# \"This\" is my example-script\n\nThis example doesn't do much, it just makes a simple plot\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## This is a section header\nThis is the first section! The #%% signifies to Sphinx-Gallery that\nthis text should be rendered as rST and if using one of the above\nIDE/plugin\u2019s, also signifies the start of a \u2018code block\u2019.\n\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "import matplotlib.pyplot as plt\n\n# This line won't be rendered as rST because there's a space after the last block.\nimport numpy as np\n\nx = np.linspace(0, 2 * np.pi, 100)\ny = np.sin(x)\n\nplt.plot(x, y)\nplt.xlabel(r\"$x$\")\nplt.ylabel(r\"$\\sin(x)$\")\n# To avoid matplotlib text output\nplt.show()\n# This is the end of the 'code block' (if using an above IDE). All code within\n# this block can be easily executed all at once." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## This is another section header\n\nIn the built documentation, it will be rendered as rST after the code above!\nThis is also another code block.\n\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "print(\"here\")" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} \ No newline at end of file diff --git a/docs/html/_downloads/3840a24a4024b15012652eb7439a74af/enrichment_multi_bed_example.ipynb b/docs/html/_downloads/3840a24a4024b15012652eb7439a74af/enrichment_multi_bed_example.ipynb deleted file mode 100644 index 6bdc04af..00000000 --- a/docs/html/_downloads/3840a24a4024b15012652eb7439a74af/enrichment_multi_bed_example.ipynb +++ /dev/null @@ -1,82 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n# Enrichment Plot Comparison Across BEDs\n\nPlot overall fraction of methylated bases within multiple sets of regions of interest specified by bed files for a single sample.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Create barplot comparing methylation levels in single sample across multiple regions of interest defined in bed files.\n\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 1. Python option\n\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "import dimelo as dm\n\nbam = \"deep_ctcf_mod_mappings_merge.sorted.bam\"\nbeds = [\"q10.150.slop.bed\", \"q10nopeak.bed\"]\nsampleNames = [\"chip_peak\", \"not_chip_peak\"]\noutDir = \"./out\"\ndm.plot_enrichment(bam, sampleNames, beds, \"A\", outDir, threshA=190)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 2. Command line option\n``dimelo-plot-enrichment -f deep_ctcf_mod_mappings_merge.sorted.bam -s chip_peak not_chip_peak -b q10.150.slop.bed q10nopeak.bed -m A -o ./out -A 190``\n\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Output\n.. figure:: ../auto_examples/images/sample_deep_ctcf_mod_mappings_merge.sorted_A_enrichment_barplot.png\n\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} \ No newline at end of file diff --git a/docs/html/_downloads/3c0d8fd437a2f42854b99286cc049a30/enrichment_profile_single_example.ipynb b/docs/html/_downloads/3c0d8fd437a2f42854b99286cc049a30/enrichment_profile_single_example.ipynb deleted file mode 100644 index 4e932055..00000000 --- a/docs/html/_downloads/3c0d8fd437a2f42854b99286cc049a30/enrichment_profile_single_example.ipynb +++ /dev/null @@ -1,82 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n# Enrichment Profile mA only\n\nPlot single molecules centered at regions of interest defined in bed file and produce aggregate profile\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Create (1) aggregate profile plots for mA/A, (2) single-molecule plots for mA, and (3) base abundance plots for A.\n\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 1. Python option\n\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "import dimelo as dm\n\nbam = \"deep_ctcf_mod_mappings_merge.sorted.bam\"\nsampleName = \"quartile4\"\nbed = \"quart4.bed\"\noutDir = \"./out\"\ndm.plot_enrichment_profile(\n bam, sampleName, bed, \"A\", outDir, threshA=190, dotsize=0.05\n)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 2. Command line option\n``dimelo-plot-enrichment-profile -f deep_ctcf_mod_mappings_merge.sorted.bam -s quartile4 -b quart4.bed -m A -o ./out -A 190 -d 0.05``\n\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Output\n.. figure:: ../auto_examples/images/quartile4_A_sm_rolling_avg.png\n :align: center\n.. figure:: ../auto_examples/images/quartile4_A_sm_scatter.png\n.. figure:: ../auto_examples/images/quartile4_A_base_count.png\n\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} \ No newline at end of file diff --git a/docs/html/_downloads/3dbee5537546aa350c2b8a755b8bf8eb/plot_enrichment_example.py b/docs/html/_downloads/3dbee5537546aa350c2b8a755b8bf8eb/plot_enrichment_example.py deleted file mode 100644 index c14d506e..00000000 --- a/docs/html/_downloads/3dbee5537546aa350c2b8a755b8bf8eb/plot_enrichment_example.py +++ /dev/null @@ -1,26 +0,0 @@ -""" -Enrichment Plot Example -=========================== - -This plots the fraction of bases modified within regions of interest defined by a bed file -""" -# %% -# Plotting Enrichment -# ------------------------ -# add description here - -import dimelo as dm - -input_bams = [ - "../../dimelo/test/data/mod_mappings_subset.bam", - "../../dimelo/test/data/mod_mappings_subset.bam", -] -sample_names = ["test1", "test2"] -regions = "../../dimelo/test/data/test.bed" -outDir = "../../dimelo/dimelo_test" -dm.plot_enrichment( - input_bams, sample_names, regions, "CG", outDir, threshC=129 -) - -# This will return a barplot with overall fraction of bases -# modified within regions of interest specified by bedFile(s) diff --git a/docs/html/_downloads/43bad59daadd6e5c0a53dcddecb9e0d0/enrichment_multi_bam_example.py b/docs/html/_downloads/43bad59daadd6e5c0a53dcddecb9e0d0/enrichment_multi_bam_example.py deleted file mode 100644 index 4a65f21d..00000000 --- a/docs/html/_downloads/43bad59daadd6e5c0a53dcddecb9e0d0/enrichment_multi_bam_example.py +++ /dev/null @@ -1,34 +0,0 @@ -""" -Enrichment Plot Comparison Across BAMs -====================================== - -Plot overall fraction of methylated bases within regions of interest specified by bed file across multiple samples. - -""" -# %% -# Create barplot comparing methylation levels in bed file regions of interest across samples - -# %% -# 1. Python option -# ---------------- -import dimelo as dm - -bams = [ - "deep_ctcf_mod_mappings_merge.sorted.bam", - "hia5_mod_mappings.bam", - "igg_mod_mappings.bam", -] -sampleNames = ["CTCF", "Hia5", "IgG"] -bed = "q10.150.slop.bed" -outDir = "./out" -dm.plot_enrichment(bams, sampleNames, bed, "A", outDir, threshA=190) - -# %% -# 2. Command line option -# ---------------------- -# ``dimelo-plot-enrichment -f deep_ctcf_mod_mappings_merge.sorted.bam hia5_mod_mappings.bam igg_mod_mappings.bam -s CTCF Hia5 IgG -b q10.150.slop.bed -m A -o ./out -A 190`` - -# %% -# Output -# ---------------------- -# .. figure:: ../auto_examples/images/region_q10.150.slop_A_enrichment_barplot.png diff --git a/docs/html/_downloads/467ab9edebd55e05fa7fd4217922da8c/plot_enrichment_profile_example.py b/docs/html/_downloads/467ab9edebd55e05fa7fd4217922da8c/plot_enrichment_profile_example.py deleted file mode 100644 index 6f8af457..00000000 --- a/docs/html/_downloads/467ab9edebd55e05fa7fd4217922da8c/plot_enrichment_profile_example.py +++ /dev/null @@ -1,26 +0,0 @@ -""" -Enrichment Profile Plot Example -=========================== - -This plots single molecules centered at regions of interest defined in bed file and produces aggregate profile -""" -# %% -# Plotting Enrichment Profile -# ------------------------ -# add description here - -import dimelo as dm - -input_bam = "../../dimelo/test/data/mod_mappings_subset.bam" -sample_names = ["test1", "test2"] -regions = [ - "../../dimelo/test/data/test.bed", - "../../dimelo/test/data/test.bed", -] -outDir = "../../dimelo/dimelo_test" -dm.plot_enrichment_profile( - input_bam, sample_names, regions, "A", outDir, windowSize=500, dotsize=1 -) - -# This will return an aggregate profile of fraction of bases -# modified centered at features of interest diff --git a/docs/html/_downloads/5270b0a3ba158961e4913b2e6d3a67ae/enrichment_multi_bed_example.py b/docs/html/_downloads/5270b0a3ba158961e4913b2e6d3a67ae/enrichment_multi_bed_example.py deleted file mode 100644 index 462b3da8..00000000 --- a/docs/html/_downloads/5270b0a3ba158961e4913b2e6d3a67ae/enrichment_multi_bed_example.py +++ /dev/null @@ -1,30 +0,0 @@ -""" -Enrichment Plot Comparison Across BEDs -====================================== - -Plot overall fraction of methylated bases within multiple sets of regions of interest specified by bed files for a single sample. - -""" -# %% -# Create barplot comparing methylation levels in single sample across multiple regions of interest defined in bed files. - -# %% -# 1. Python option -# ---------------- -import dimelo as dm - -bam = "deep_ctcf_mod_mappings_merge.sorted.bam" -beds = ["q10.150.slop.bed", "q10nopeak.bed"] -sampleNames = ["chip_peak", "not_chip_peak"] -outDir = "./out" -dm.plot_enrichment(bam, sampleNames, beds, "A", outDir, threshA=190) - -# %% -# 2. Command line option -# ---------------------- -# ``dimelo-plot-enrichment -f deep_ctcf_mod_mappings_merge.sorted.bam -s chip_peak not_chip_peak -b q10.150.slop.bed q10nopeak.bed -m A -o ./out -A 190`` - -# %% -# Output -# ---------------------- -# .. figure:: ../auto_examples/images/sample_deep_ctcf_mod_mappings_merge.sorted_A_enrichment_barplot.png diff --git a/docs/html/_downloads/627f4d7a5af029ac7731f13fd2bceef4/qc_report_example.ipynb b/docs/html/_downloads/627f4d7a5af029ac7731f13fd2bceef4/qc_report_example.ipynb deleted file mode 100644 index b8e32220..00000000 --- a/docs/html/_downloads/627f4d7a5af029ac7731f13fd2bceef4/qc_report_example.ipynb +++ /dev/null @@ -1,82 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n# QC Report\n\nOutputs quality control report from given bam files.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Usually as a first step after receiving bam files, we want to do a quality check\nand assess our data. This code generates a PDF report of important QC statistics\nfor modified base data from Nanopore sequencing.\n\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 1. Python option\n\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "import dimelo as dm\n\n# first we specify the locations of our bam files\nbam = \"winnowmap_guppy_merge_subset.bam\"\nsampleName = \"CTCF\"\noutdir = \"./out\"\n\n# next we run the \"qc_report\" function\ndm.qc_report(bam, sampleName, outdir)\n# now our output directory will have a file called \"CTCF_qc_report.pdf\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 2. Command line option\n``dimelo-qc-report -f winnowmap_guppy_merge_subset.bam -s CTCF -o ./out``\n\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Output\n.. figure:: ../auto_examples/images/QC_Terminal_Output.png\n.. figure:: ../auto_examples/images/CTCF_qc_report.png\n\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} \ No newline at end of file diff --git a/docs/html/_downloads/64f26c75792738f7d3724f3dd6cd72f5/plot_qc_example.ipynb b/docs/html/_downloads/64f26c75792738f7d3724f3dd6cd72f5/plot_qc_example.ipynb deleted file mode 100644 index 825a0b12..00000000 --- a/docs/html/_downloads/64f26c75792738f7d3724f3dd6cd72f5/plot_qc_example.ipynb +++ /dev/null @@ -1,61 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n# QC Report\n\nOutputs quality control report from given bam files.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Creating QC Report\nUsually as a first step after receiving bam files, we want to do a quality check\nand assess our data. This code generates a PDF report of important QC statistics\nfor long read methylation modification bam files\n\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "import dimelo as dm\n\n# first we specify the locations of our bam files\nin_bam = \"../../dimelo/test/data/winnowmap_guppy_merge_subset.bam\"\nsample_name = \"test\"\nout_dir = \"../../dimelo/dimelo_test\"\n\n# next we run the \"qc_report\" function\ndm.qc_report(in_bam, sample_name, out_dir)\n# now our output directory that we specified, will have a file called \"test_qc_report.pdf\"" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} \ No newline at end of file diff --git a/docs/html/_downloads/6f1e7a639e0699d6164445b55e6c116d/auto_examples_jupyter.zip b/docs/html/_downloads/6f1e7a639e0699d6164445b55e6c116d/auto_examples_jupyter.zip deleted file mode 100644 index d970304c..00000000 Binary files a/docs/html/_downloads/6f1e7a639e0699d6164445b55e6c116d/auto_examples_jupyter.zip and /dev/null differ diff --git a/docs/html/_downloads/766449066751533d7d98d491e9339925/enrichment_profile_ma_mc_example.ipynb b/docs/html/_downloads/766449066751533d7d98d491e9339925/enrichment_profile_ma_mc_example.ipynb deleted file mode 100644 index 6f858ffc..00000000 --- a/docs/html/_downloads/766449066751533d7d98d491e9339925/enrichment_profile_ma_mc_example.ipynb +++ /dev/null @@ -1,82 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n# Enrichment Profile mA & mCG\n\nAggregate and single molecule plots colored by modification and centered at regions of interest defined in bed file.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Create (1) aggregate profile plots for mA/A and mCG/CG, (2) single-molecule plots for mA + mCG, and (3) base abundance plots for A and CG.\n\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 1. Python option\n\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "import dimelo as dm\n\nbam = \"deep_ctcf_mod_mappings_merge.sorted.bam\"\nsampleName = \"quartile4\"\nbed = \"quart4.bed\"\noutDir = \"./out\"\ndm.plot_enrichment_profile(\n bam,\n sampleName,\n bed,\n \"A+CG\",\n outDir,\n threshA=190,\n threshC=190,\n dotsize=0.05,\n)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 2. Command line option\n``dimelo-plot-enrichment-profile -f deep_ctcf_mod_mappings_merge.sorted.bam -s quartile4 -b quart4.bed -m A+CG -o ./out -A 190 -C 190 -d 0.05``\n\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Output\n.. figure:: ../auto_examples/images/quartile4_A+CG_sm_rolling_avg.png\n :align: center\n.. figure:: ../auto_examples/images/quartile4_A+CG_sm_scatter.png\n.. figure:: ../auto_examples/images/quartile4_A_base_count.png\n.. figure:: ../auto_examples/images/quartile4_CG_base_count.png\n\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} \ No newline at end of file diff --git a/docs/html/_downloads/7edd55a52439250dd2a454d660d32ddf/plot_example.py b/docs/html/_downloads/7edd55a52439250dd2a454d660d32ddf/plot_example.py deleted file mode 100644 index 91b3438f..00000000 --- a/docs/html/_downloads/7edd55a52439250dd2a454d660d32ddf/plot_example.py +++ /dev/null @@ -1,37 +0,0 @@ -""" -"This" is my example-script -=========================== - -This example doesn't do much, it just makes a simple plot -""" -# %% -# This is a section header -# ------------------------ -# This is the first section! The #%% signifies to Sphinx-Gallery that -# this text should be rendered as rST and if using one of the above -# IDE/plugin’s, also signifies the start of a ‘code block’. - - -import matplotlib.pyplot as plt - -# This line won't be rendered as rST because there's a space after the last block. -import numpy as np - -x = np.linspace(0, 2 * np.pi, 100) -y = np.sin(x) - -plt.plot(x, y) -plt.xlabel(r"$x$") -plt.ylabel(r"$\sin(x)$") -# To avoid matplotlib text output -plt.show() -# This is the end of the 'code block' (if using an above IDE). All code within -# this block can be easily executed all at once. - -# %% -# This is another section header -# ------------------------------ -# -# In the built documentation, it will be rendered as rST after the code above! -# This is also another code block. -print("here") diff --git a/docs/html/_downloads/85ead7d138cbb374fc97938d142dccfe/plot_browser_example.py b/docs/html/_downloads/85ead7d138cbb374fc97938d142dccfe/plot_browser_example.py deleted file mode 100644 index af0e9837..00000000 --- a/docs/html/_downloads/85ead7d138cbb374fc97938d142dccfe/plot_browser_example.py +++ /dev/null @@ -1,22 +0,0 @@ -""" -Browser Plot Example -=========================== - -This plots single molecules with colored base modifications in region of interest -""" -# %% -# Plotting Browser -# ------------------------ -# add description here - -import dimelo as dm - -input_bam = "../../dimelo/test/data/mod_mappings_subset.bam" -sample_name = "test" -region = "chr1:2907273-2909473" -outDir = "../../dimelo/dimelo_test" -dm.plot_browser(input_bam, sample_name, region, "A+CG", outDir, static=True) - -# This will return an HTML file with single molecules displayed o -# ver region of interest. Modified bases are colored according to colorA and colorC. -# To return a PDF file, set static = True diff --git a/docs/html/_downloads/99487b2e4e6af8b9093d643b8151d7ed/plot_qc_example.py b/docs/html/_downloads/99487b2e4e6af8b9093d643b8151d7ed/plot_qc_example.py deleted file mode 100644 index 5fdc96a9..00000000 --- a/docs/html/_downloads/99487b2e4e6af8b9093d643b8151d7ed/plot_qc_example.py +++ /dev/null @@ -1,24 +0,0 @@ -""" -QC Report -=========================== - -Outputs quality control report from given bam files. - -""" -# %% -# Creating QC Report -# ------------------------ -# Usually as a first step after receiving bam files, we want to do a quality check -# and assess our data. This code generates a PDF report of important QC statistics -# for long read methylation modification bam files - -import dimelo as dm - -# first we specify the locations of our bam files -in_bam = "../../dimelo/test/data/winnowmap_guppy_merge_subset.bam" -sample_name = "test" -out_dir = "../../dimelo/dimelo_test" - -# next we run the "qc_report" function -dm.qc_report(in_bam, sample_name, out_dir) -# now our output directory that we specified, will have a file called "test_qc_report.pdf" diff --git a/docs/html/_downloads/9969b2e0559bed5f04a4c3d1ea578480/plot_enrichment_example.ipynb b/docs/html/_downloads/9969b2e0559bed5f04a4c3d1ea578480/plot_enrichment_example.ipynb deleted file mode 100644 index 8b6b1214..00000000 --- a/docs/html/_downloads/9969b2e0559bed5f04a4c3d1ea578480/plot_enrichment_example.ipynb +++ /dev/null @@ -1,61 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n# Enrichment Plot Example\n\nThis plots the fraction of bases modified within regions of interest defined by a bed file\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Plotting Enrichment\nadd description here\n\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "import dimelo as dm\n\ninput_bams = [\n \"../../dimelo/test/data/mod_mappings_subset.bam\",\n \"../../dimelo/test/data/mod_mappings_subset.bam\",\n]\nsample_names = [\"test1\", \"test2\"]\nregions = \"../../dimelo/test/data/test.bed\"\noutDir = \"../../dimelo/dimelo_test\"\ndm.plot_enrichment(\n input_bams, sample_names, regions, \"CG\", outDir, threshC=129\n)\n\n# This will return a barplot with overall fraction of bases\n# modified within regions of interest specified by bedFile(s)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} \ No newline at end of file diff --git a/docs/html/_downloads/a87a5c2c13330ba6d8448ebb9c4849cc/enrichment_multi_bam_example.ipynb b/docs/html/_downloads/a87a5c2c13330ba6d8448ebb9c4849cc/enrichment_multi_bam_example.ipynb deleted file mode 100644 index 537b4b52..00000000 --- a/docs/html/_downloads/a87a5c2c13330ba6d8448ebb9c4849cc/enrichment_multi_bam_example.ipynb +++ /dev/null @@ -1,82 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n# Enrichment Plot Comparison Across BAMs\n\nPlot overall fraction of methylated bases within regions of interest specified by bed file across multiple samples.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Create barplot comparing methylation levels in bed file regions of interest across samples\n\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 1. Python option\n\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "import dimelo as dm\n\nbams = [\n \"deep_ctcf_mod_mappings_merge.sorted.bam\",\n \"hia5_mod_mappings.bam\",\n \"igg_mod_mappings.bam\",\n]\nsampleNames = [\"CTCF\", \"Hia5\", \"IgG\"]\nbed = \"q10.150.slop.bed\"\noutDir = \"./out\"\ndm.plot_enrichment(bams, sampleNames, bed, \"A\", outDir, threshA=190)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 2. Command line option\n``dimelo-plot-enrichment -f deep_ctcf_mod_mappings_merge.sorted.bam hia5_mod_mappings.bam igg_mod_mappings.bam -s CTCF Hia5 IgG -b q10.150.slop.bed -m A -o ./out -A 190``\n\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Output\n.. figure:: ../auto_examples/images/region_q10.150.slop_A_enrichment_barplot.png\n\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} \ No newline at end of file diff --git a/docs/html/_downloads/a8a76c4336d7323b2155d9cc7fbecbc6/enrichment_profile_overlay_example.ipynb b/docs/html/_downloads/a8a76c4336d7323b2155d9cc7fbecbc6/enrichment_profile_overlay_example.ipynb deleted file mode 100644 index 58ddb532..00000000 --- a/docs/html/_downloads/a8a76c4336d7323b2155d9cc7fbecbc6/enrichment_profile_overlay_example.ipynb +++ /dev/null @@ -1,82 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n# Enrichment Profile Overlay\n\nAggregate fraction of methylated bases centered at regions of interest defined in bed files.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Create (1) aggregate profile plots for mA/A and mCG/CG, (2) single-molecule plots for mA + mCG, and (3) base abundance plots for A and CG.\n\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 1. Python option\n\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "import dimelo as dm\n\nbam = \"deep_ctcf_mod_mappings_merge.sorted.bam\"\nsampleNames = [\"q4\", \"q3\", \"q2\", \"q1\"]\nbeds = [\"quart4.bed\", \"quart3.bed\", \"quart2.bed\", \"quart1.bed\"]\noutDir = \"./out\"\ndm.plot_enrichment_profile(\n bam, sampleNames, beds, \"A\", outDir, threshA=190, dotsize=0.05\n)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 2. Command line option\n``dimelo-plot-enrichment-profile -f deep_ctcf_mod_mappings_merge.sorted.bam -s q4 q3 q2 q1 -b quart4.bed quart3.bed quart2.bed quart1.bed -m A -o ./out -A 190 -d 0.05``\n\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Output\n.. figure:: ../auto_examples/images/sample_deep_ctcf_mod_mappings_merge.sorted_A_sm_rolling_avg_overlay.png\n :align: center\n\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} \ No newline at end of file diff --git a/docs/html/_downloads/d17872516f050b9c7e9bc28adf47c9eb/qc_report_example.py b/docs/html/_downloads/d17872516f050b9c7e9bc28adf47c9eb/qc_report_example.py deleted file mode 100644 index 094a0fed..00000000 --- a/docs/html/_downloads/d17872516f050b9c7e9bc28adf47c9eb/qc_report_example.py +++ /dev/null @@ -1,38 +0,0 @@ -""" -QC Report -=========================== - -Outputs quality control report from given bam files. - -""" -# %% -# Usually as a first step after receiving bam files, we want to do a quality check -# and assess our data. This code generates a PDF report of important QC statistics -# for modified base data from Nanopore sequencing. - -# %% -# 1. Python option -# ---------------- - -import dimelo as dm - -# first we specify the locations of our bam files -bam = "winnowmap_guppy_merge_subset.bam" -sampleName = "CTCF" -outdir = "./out" - -# next we run the "qc_report" function -dm.qc_report(bam, sampleName, outdir) -# now our output directory will have a file called "CTCF_qc_report.pdf" - -# %% -# 2. Command line option -# ---------------- -# ``dimelo-qc-report -f winnowmap_guppy_merge_subset.bam -s CTCF -o ./out`` - - -# %% -# Output -# ---------------------- -# .. figure:: ../auto_examples/images/QC_Terminal_Output.png -# .. figure:: ../auto_examples/images/CTCF_qc_report.png diff --git a/docs/html/_downloads/de5f961c6eb8a8e68b5aee167bef699f/plot_browser_example.ipynb b/docs/html/_downloads/de5f961c6eb8a8e68b5aee167bef699f/plot_browser_example.ipynb deleted file mode 100644 index 34dd1b09..00000000 --- a/docs/html/_downloads/de5f961c6eb8a8e68b5aee167bef699f/plot_browser_example.ipynb +++ /dev/null @@ -1,61 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n# Browser Plot Example\n\nThis plots single molecules with colored base modifications in region of interest\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Plotting Browser\nadd description here\n\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "import dimelo as dm\n\ninput_bam = \"../../dimelo/test/data/mod_mappings_subset.bam\"\nsample_name = \"test\"\nregion = \"chr1:2907273-2909473\"\noutDir = \"../../dimelo/dimelo_test\"\ndm.plot_browser(input_bam, sample_name, region, \"A+CG\", outDir, static=True)\n\n# This will return an HTML file with single molecules displayed o\n# ver region of interest. Modified bases are colored according to colorA and colorC.\n# To return a PDF file, set static = True" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} \ No newline at end of file diff --git a/docs/html/_downloads/dfec86417decb57b8f9f0a4feffcd16d/browser_example.ipynb b/docs/html/_downloads/dfec86417decb57b8f9f0a4feffcd16d/browser_example.ipynb deleted file mode 100644 index c5f158fa..00000000 --- a/docs/html/_downloads/dfec86417decb57b8f9f0a4feffcd16d/browser_example.ipynb +++ /dev/null @@ -1,82 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n# Single-Molecule Browser Plot\n\nPlot single molecules with colored base modifications in a region of interest\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Create either an interactive single-molecule HTML browser if static=False, or create a PDF if static=True.\nBase modifications are colored by type (mA vs. mCG) and probability of modification.\nExample data for producing these plots can be downloaded from SRA: https://www.ncbi.nlm.nih.gov/bioproject/752170\nThe below Python and command line options produce the same output.\n\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 1. Python option\n\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "import dimelo as dm\n\nbam = \"deep_ctcf_mod_mappings_merge.sorted.bam\"\nsampleName = \"CTCF\"\noutDir = \"./out\"\ndm.plot_browser(\n bam,\n sampleName,\n \"chr11:2086423-2091187\",\n \"A+CG\",\n outDir,\n threshA=153,\n threshC=153,\n static=True,\n smooth=100,\n min_periods=10,\n)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 2. Command line option\n``dimelo-plot-browser -f deep_ctcf_mod_mappings_merge.sorted.bam -s CTCF -r chr11:2086423-2091187 -m A+CG -o ./out -A 153 -C 153 --static -t 100 -n 10``\n\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Output\n.. figure:: ../auto_examples/images/methylation_browser_chr11_2086423_2091187.png\n :align: center\n.. figure:: ../auto_examples/images/CTCF_A_sm_rolling_avg_fraction.png\n :align: center\n.. figure:: ../auto_examples/images/CTCF_A_sm_rolling_avg_total.png\n :align: center\n.. figure:: ../auto_examples/images/CTCF_CG_sm_rolling_avg_fraction.png\n :align: center\n.. figure:: ../auto_examples/images/CTCF_CG_sm_rolling_avg_total.png\n :align: center\n\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} \ No newline at end of file diff --git a/docs/html/_downloads/ec215af8debbd03829595d651b6d4443/browser_example.py b/docs/html/_downloads/ec215af8debbd03829595d651b6d4443/browser_example.py deleted file mode 100644 index dc4e0a06..00000000 --- a/docs/html/_downloads/ec215af8debbd03829595d651b6d4443/browser_example.py +++ /dev/null @@ -1,52 +0,0 @@ -""" -Single-Molecule Browser Plot -============================ - -Plot single molecules with colored base modifications in a region of interest - -""" -# %% -# Create either an interactive single-molecule HTML browser if static=False, or create a PDF if static=True. -# Base modifications are colored by type (mA vs. mCG) and probability of modification. -# Example data for producing these plots can be downloaded from SRA: https://www.ncbi.nlm.nih.gov/bioproject/752170 -# The below Python and command line options produce the same output. - -# %% -# 1. Python option -# ---------------- -import dimelo as dm - -bam = "deep_ctcf_mod_mappings_merge.sorted.bam" -sampleName = "CTCF" -outDir = "./out" -dm.plot_browser( - bam, - sampleName, - "chr11:2086423-2091187", - "A+CG", - outDir, - threshA=153, - threshC=153, - static=True, - smooth=100, - min_periods=10, -) - -# %% -# 2. Command line option -# ---------------------- -# ``dimelo-plot-browser -f deep_ctcf_mod_mappings_merge.sorted.bam -s CTCF -r chr11:2086423-2091187 -m A+CG -o ./out -A 153 -C 153 --static -t 100 -n 10`` - -# %% -# Output -# ---------------------- -# .. figure:: ../auto_examples/images/methylation_browser_chr11_2086423_2091187.png -# :align: center -# .. figure:: ../auto_examples/images/CTCF_A_sm_rolling_avg_fraction.png -# :align: center -# .. figure:: ../auto_examples/images/CTCF_A_sm_rolling_avg_total.png -# :align: center -# .. figure:: ../auto_examples/images/CTCF_CG_sm_rolling_avg_fraction.png -# :align: center -# .. figure:: ../auto_examples/images/CTCF_CG_sm_rolling_avg_total.png -# :align: center diff --git a/docs/html/_downloads/ef61c637cbb324be885c8e473a67e709/enrichment_profile_overlay_example.py b/docs/html/_downloads/ef61c637cbb324be885c8e473a67e709/enrichment_profile_overlay_example.py deleted file mode 100644 index 63f43666..00000000 --- a/docs/html/_downloads/ef61c637cbb324be885c8e473a67e709/enrichment_profile_overlay_example.py +++ /dev/null @@ -1,33 +0,0 @@ -""" -Enrichment Profile Overlay -================================= - -Aggregate fraction of methylated bases centered at regions of interest defined in bed files. - -""" -# %% -# Create (1) aggregate profile plots for mA/A and mCG/CG, (2) single-molecule plots for mA + mCG, and (3) base abundance plots for A and CG. - -# %% -# 1. Python option -# ---------------- -import dimelo as dm - -bam = "deep_ctcf_mod_mappings_merge.sorted.bam" -sampleNames = ["q4", "q3", "q2", "q1"] -beds = ["quart4.bed", "quart3.bed", "quart2.bed", "quart1.bed"] -outDir = "./out" -dm.plot_enrichment_profile( - bam, sampleNames, beds, "A", outDir, threshA=190, dotsize=0.05 -) - -# %% -# 2. Command line option -# ---------------------- -# ``dimelo-plot-enrichment-profile -f deep_ctcf_mod_mappings_merge.sorted.bam -s q4 q3 q2 q1 -b quart4.bed quart3.bed quart2.bed quart1.bed -m A -o ./out -A 190 -d 0.05`` - -# %% -# Output -# ---------------------- -# .. figure:: ../auto_examples/images/sample_deep_ctcf_mod_mappings_merge.sorted_A_sm_rolling_avg_overlay.png -# :align: center diff --git a/docs/html/_downloads/f4467d15c6691ed185f7e5a9373f3cbf/plot_enrichment_profile_example.ipynb b/docs/html/_downloads/f4467d15c6691ed185f7e5a9373f3cbf/plot_enrichment_profile_example.ipynb deleted file mode 100644 index 094836da..00000000 --- a/docs/html/_downloads/f4467d15c6691ed185f7e5a9373f3cbf/plot_enrichment_profile_example.ipynb +++ /dev/null @@ -1,61 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n# Enrichment Profile Plot Example\n\nThis plots single molecules centered at regions of interest defined in bed file and produces aggregate profile\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Plotting Enrichment Profile\nadd description here\n\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "import dimelo as dm\n\ninput_bam = \"../../dimelo/test/data/mod_mappings_subset.bam\"\nsample_names = [\"test1\", \"test2\"]\nregions = [\n \"../../dimelo/test/data/test.bed\",\n \"../../dimelo/test/data/test.bed\",\n]\noutDir = \"../../dimelo/dimelo_test\"\ndm.plot_enrichment_profile(\n input_bam, sample_names, regions, \"A\", outDir, windowSize=500, dotsize=1\n)\n\n# This will return an aggregate profile of fraction of bases\n# modified centered at features of interest" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} \ No newline at end of file diff --git a/docs/html/_images/CTCF_A_sm_rolling_avg_fraction.pdf b/docs/html/_images/CTCF_A_sm_rolling_avg_fraction.pdf deleted file mode 100644 index 37fa207b..00000000 Binary files a/docs/html/_images/CTCF_A_sm_rolling_avg_fraction.pdf and /dev/null differ diff --git a/docs/html/_images/CTCF_A_sm_rolling_avg_fraction.png b/docs/html/_images/CTCF_A_sm_rolling_avg_fraction.png deleted file mode 100644 index 3c3a6800..00000000 Binary files a/docs/html/_images/CTCF_A_sm_rolling_avg_fraction.png and /dev/null differ diff --git a/docs/html/_images/CTCF_A_sm_rolling_avg_total.pdf b/docs/html/_images/CTCF_A_sm_rolling_avg_total.pdf deleted file mode 100644 index a9558cfb..00000000 Binary files a/docs/html/_images/CTCF_A_sm_rolling_avg_total.pdf and /dev/null differ diff --git a/docs/html/_images/CTCF_A_sm_rolling_avg_total.png b/docs/html/_images/CTCF_A_sm_rolling_avg_total.png deleted file mode 100644 index 0014a0ff..00000000 Binary files a/docs/html/_images/CTCF_A_sm_rolling_avg_total.png and /dev/null differ diff --git a/docs/html/_images/CTCF_CG_sm_rolling_avg_fraction.png b/docs/html/_images/CTCF_CG_sm_rolling_avg_fraction.png deleted file mode 100644 index c90edc69..00000000 Binary files a/docs/html/_images/CTCF_CG_sm_rolling_avg_fraction.png and /dev/null differ diff --git a/docs/html/_images/CTCF_CG_sm_rolling_avg_total.png b/docs/html/_images/CTCF_CG_sm_rolling_avg_total.png deleted file mode 100644 index 618d3fe6..00000000 Binary files a/docs/html/_images/CTCF_CG_sm_rolling_avg_total.png and /dev/null differ diff --git a/docs/html/_images/CTCF_C_sm_rolling_avg_fraction.pdf b/docs/html/_images/CTCF_C_sm_rolling_avg_fraction.pdf deleted file mode 100644 index 1af0611e..00000000 Binary files a/docs/html/_images/CTCF_C_sm_rolling_avg_fraction.pdf and /dev/null differ diff --git a/docs/html/_images/CTCF_C_sm_rolling_avg_fraction.png b/docs/html/_images/CTCF_C_sm_rolling_avg_fraction.png deleted file mode 100644 index 79a3be31..00000000 Binary files a/docs/html/_images/CTCF_C_sm_rolling_avg_fraction.png and /dev/null differ diff --git a/docs/html/_images/CTCF_C_sm_rolling_avg_total.pdf b/docs/html/_images/CTCF_C_sm_rolling_avg_total.pdf deleted file mode 100644 index 86f0d1b6..00000000 Binary files a/docs/html/_images/CTCF_C_sm_rolling_avg_total.pdf and /dev/null differ diff --git a/docs/html/_images/CTCF_C_sm_rolling_avg_total.png b/docs/html/_images/CTCF_C_sm_rolling_avg_total.png deleted file mode 100644 index 12e484ab..00000000 Binary files a/docs/html/_images/CTCF_C_sm_rolling_avg_total.png and /dev/null differ diff --git a/docs/html/_images/CTCF_demo_A+CG_sm_rolling_avg.pdf b/docs/html/_images/CTCF_demo_A+CG_sm_rolling_avg.pdf deleted file mode 100644 index c4335d77..00000000 Binary files a/docs/html/_images/CTCF_demo_A+CG_sm_rolling_avg.pdf and /dev/null differ diff --git a/docs/html/_images/CTCF_demo_A+CG_sm_rolling_avg.png b/docs/html/_images/CTCF_demo_A+CG_sm_rolling_avg.png deleted file mode 100644 index 401ae956..00000000 Binary files a/docs/html/_images/CTCF_demo_A+CG_sm_rolling_avg.png and /dev/null differ diff --git a/docs/html/_images/CTCF_demo_A+CG_sm_scatter.png b/docs/html/_images/CTCF_demo_A+CG_sm_scatter.png deleted file mode 100644 index 9323a384..00000000 Binary files a/docs/html/_images/CTCF_demo_A+CG_sm_scatter.png and /dev/null differ diff --git a/docs/html/_images/CTCF_demo_A_base_count.png b/docs/html/_images/CTCF_demo_A_base_count.png deleted file mode 100644 index 89fbc012..00000000 Binary files a/docs/html/_images/CTCF_demo_A_base_count.png and /dev/null differ diff --git a/docs/html/_images/CTCF_demo_A_sm_rolling_avg_fraction.pdf b/docs/html/_images/CTCF_demo_A_sm_rolling_avg_fraction.pdf deleted file mode 100644 index e5ba1a90..00000000 Binary files a/docs/html/_images/CTCF_demo_A_sm_rolling_avg_fraction.pdf and /dev/null differ diff --git a/docs/html/_images/CTCF_demo_A_sm_rolling_avg_fraction.png b/docs/html/_images/CTCF_demo_A_sm_rolling_avg_fraction.png deleted file mode 100644 index 3c3a6800..00000000 Binary files a/docs/html/_images/CTCF_demo_A_sm_rolling_avg_fraction.png and /dev/null differ diff --git a/docs/html/_images/CTCF_demo_A_sm_rolling_avg_total.pdf b/docs/html/_images/CTCF_demo_A_sm_rolling_avg_total.pdf deleted file mode 100644 index 714d30b9..00000000 Binary files a/docs/html/_images/CTCF_demo_A_sm_rolling_avg_total.pdf and /dev/null differ diff --git a/docs/html/_images/CTCF_demo_A_sm_rolling_avg_total.png b/docs/html/_images/CTCF_demo_A_sm_rolling_avg_total.png deleted file mode 100644 index 22350db8..00000000 Binary files a/docs/html/_images/CTCF_demo_A_sm_rolling_avg_total.png and /dev/null differ diff --git a/docs/html/_images/CTCF_demo_CG_base_count.png b/docs/html/_images/CTCF_demo_CG_base_count.png deleted file mode 100644 index 157c9510..00000000 Binary files a/docs/html/_images/CTCF_demo_CG_base_count.png and /dev/null differ diff --git a/docs/html/_images/CTCF_demo_CG_sm_rolling_avg_fraction.png b/docs/html/_images/CTCF_demo_CG_sm_rolling_avg_fraction.png deleted file mode 100644 index c90edc69..00000000 Binary files a/docs/html/_images/CTCF_demo_CG_sm_rolling_avg_fraction.png and /dev/null differ diff --git a/docs/html/_images/CTCF_demo_CG_sm_rolling_avg_total.png b/docs/html/_images/CTCF_demo_CG_sm_rolling_avg_total.png deleted file mode 100644 index 618d3fe6..00000000 Binary files a/docs/html/_images/CTCF_demo_CG_sm_rolling_avg_total.png and /dev/null differ diff --git a/docs/html/_images/CTCF_demo_C_sm_rolling_avg_fraction.pdf b/docs/html/_images/CTCF_demo_C_sm_rolling_avg_fraction.pdf deleted file mode 100644 index a8c1c993..00000000 Binary files a/docs/html/_images/CTCF_demo_C_sm_rolling_avg_fraction.pdf and /dev/null differ diff --git a/docs/html/_images/CTCF_demo_C_sm_rolling_avg_fraction.png b/docs/html/_images/CTCF_demo_C_sm_rolling_avg_fraction.png deleted file mode 100644 index 79a3be31..00000000 Binary files a/docs/html/_images/CTCF_demo_C_sm_rolling_avg_fraction.png and /dev/null differ diff --git a/docs/html/_images/CTCF_demo_C_sm_rolling_avg_total.pdf b/docs/html/_images/CTCF_demo_C_sm_rolling_avg_total.pdf deleted file mode 100644 index bc53669e..00000000 Binary files a/docs/html/_images/CTCF_demo_C_sm_rolling_avg_total.pdf and /dev/null differ diff --git a/docs/html/_images/CTCF_demo_C_sm_rolling_avg_total.png b/docs/html/_images/CTCF_demo_C_sm_rolling_avg_total.png deleted file mode 100644 index 0d51855a..00000000 Binary files a/docs/html/_images/CTCF_demo_C_sm_rolling_avg_total.png and /dev/null differ diff --git a/docs/html/_images/CTCF_demo_qc_report.pdf b/docs/html/_images/CTCF_demo_qc_report.pdf deleted file mode 100644 index 31e389d7..00000000 Binary files a/docs/html/_images/CTCF_demo_qc_report.pdf and /dev/null differ diff --git a/docs/html/_images/CTCF_demo_qc_report.png b/docs/html/_images/CTCF_demo_qc_report.png deleted file mode 100644 index cea75e79..00000000 Binary files a/docs/html/_images/CTCF_demo_qc_report.png and /dev/null differ diff --git a/docs/html/_images/CTCF_qc_report.png b/docs/html/_images/CTCF_qc_report.png deleted file mode 100644 index 5c266a07..00000000 Binary files a/docs/html/_images/CTCF_qc_report.png and /dev/null differ diff --git a/docs/html/_images/QC_Terminal_Output.png b/docs/html/_images/QC_Terminal_Output.png deleted file mode 100644 index e240da00..00000000 Binary files a/docs/html/_images/QC_Terminal_Output.png and /dev/null differ diff --git a/docs/html/_images/methylation_browser_chr11_2086423_2091187.pdf b/docs/html/_images/methylation_browser_chr11_2086423_2091187.pdf deleted file mode 100644 index 03222aa5..00000000 Binary files a/docs/html/_images/methylation_browser_chr11_2086423_2091187.pdf and /dev/null differ diff --git a/docs/html/_images/methylation_browser_chr11_2086423_2091187.png b/docs/html/_images/methylation_browser_chr11_2086423_2091187.png deleted file mode 100644 index c25328e9..00000000 Binary files a/docs/html/_images/methylation_browser_chr11_2086423_2091187.png and /dev/null differ diff --git a/docs/html/_images/methylation_browser_chr11_2086423_20911871.png b/docs/html/_images/methylation_browser_chr11_2086423_20911871.png deleted file mode 100644 index f1b73da7..00000000 Binary files a/docs/html/_images/methylation_browser_chr11_2086423_20911871.png and /dev/null differ diff --git a/docs/html/_images/quartile4_A+CG_sm_rolling_avg.pdf b/docs/html/_images/quartile4_A+CG_sm_rolling_avg.pdf deleted file mode 100644 index a443b64a..00000000 Binary files a/docs/html/_images/quartile4_A+CG_sm_rolling_avg.pdf and /dev/null differ diff --git a/docs/html/_images/quartile4_A+CG_sm_rolling_avg.png b/docs/html/_images/quartile4_A+CG_sm_rolling_avg.png deleted file mode 100644 index ae0846c9..00000000 Binary files a/docs/html/_images/quartile4_A+CG_sm_rolling_avg.png and /dev/null differ diff --git a/docs/html/_images/quartile4_A+CG_sm_scatter.png b/docs/html/_images/quartile4_A+CG_sm_scatter.png deleted file mode 100644 index d4dbf67a..00000000 Binary files a/docs/html/_images/quartile4_A+CG_sm_scatter.png and /dev/null differ diff --git a/docs/html/_images/quartile4_A_base_count.png b/docs/html/_images/quartile4_A_base_count.png deleted file mode 100644 index 5cfa7526..00000000 Binary files a/docs/html/_images/quartile4_A_base_count.png and /dev/null differ diff --git a/docs/html/_images/quartile4_A_sm_rolling_avg.pdf b/docs/html/_images/quartile4_A_sm_rolling_avg.pdf deleted file mode 100644 index 47d28171..00000000 Binary files a/docs/html/_images/quartile4_A_sm_rolling_avg.pdf and /dev/null differ diff --git a/docs/html/_images/quartile4_A_sm_rolling_avg.png b/docs/html/_images/quartile4_A_sm_rolling_avg.png deleted file mode 100644 index d9c156e9..00000000 Binary files a/docs/html/_images/quartile4_A_sm_rolling_avg.png and /dev/null differ diff --git a/docs/html/_images/quartile4_A_sm_scatter.png b/docs/html/_images/quartile4_A_sm_scatter.png deleted file mode 100644 index e109399e..00000000 Binary files a/docs/html/_images/quartile4_A_sm_scatter.png and /dev/null differ diff --git a/docs/html/_images/quartile4_CG_base_count.png b/docs/html/_images/quartile4_CG_base_count.png deleted file mode 100644 index 106ce2d0..00000000 Binary files a/docs/html/_images/quartile4_CG_base_count.png and /dev/null differ diff --git a/docs/html/_images/region_q10.150.slop_A_enrichment_barplot.png b/docs/html/_images/region_q10.150.slop_A_enrichment_barplot.png deleted file mode 100644 index f0e184de..00000000 Binary files a/docs/html/_images/region_q10.150.slop_A_enrichment_barplot.png and /dev/null differ diff --git a/docs/html/_images/sample_ctcf_demo.sorted_A_enrichment_barplot.pdf b/docs/html/_images/sample_ctcf_demo.sorted_A_enrichment_barplot.pdf deleted file mode 100644 index 6a2772d6..00000000 Binary files a/docs/html/_images/sample_ctcf_demo.sorted_A_enrichment_barplot.pdf and /dev/null differ diff --git a/docs/html/_images/sample_ctcf_demo.sorted_A_enrichment_barplot.png b/docs/html/_images/sample_ctcf_demo.sorted_A_enrichment_barplot.png deleted file mode 100644 index dea669c8..00000000 Binary files a/docs/html/_images/sample_ctcf_demo.sorted_A_enrichment_barplot.png and /dev/null differ diff --git a/docs/html/_images/sample_deep_ctcf_mod_mappings_merge.sorted_A_enrichment_barplot.png b/docs/html/_images/sample_deep_ctcf_mod_mappings_merge.sorted_A_enrichment_barplot.png deleted file mode 100644 index 8b21aeaf..00000000 Binary files a/docs/html/_images/sample_deep_ctcf_mod_mappings_merge.sorted_A_enrichment_barplot.png and /dev/null differ diff --git a/docs/html/_images/sample_deep_ctcf_mod_mappings_merge.sorted_A_sm_rolling_avg_overlay.pdf b/docs/html/_images/sample_deep_ctcf_mod_mappings_merge.sorted_A_sm_rolling_avg_overlay.pdf deleted file mode 100644 index 882dc909..00000000 Binary files a/docs/html/_images/sample_deep_ctcf_mod_mappings_merge.sorted_A_sm_rolling_avg_overlay.pdf and /dev/null differ diff --git a/docs/html/_images/sample_deep_ctcf_mod_mappings_merge.sorted_A_sm_rolling_avg_overlay.png b/docs/html/_images/sample_deep_ctcf_mod_mappings_merge.sorted_A_sm_rolling_avg_overlay.png deleted file mode 100644 index 00bf6efa..00000000 Binary files a/docs/html/_images/sample_deep_ctcf_mod_mappings_merge.sorted_A_sm_rolling_avg_overlay.png and /dev/null differ diff --git a/docs/html/_images/sample_qc_report.png b/docs/html/_images/sample_qc_report.png deleted file mode 100644 index 18ca8b2b..00000000 Binary files a/docs/html/_images/sample_qc_report.png and /dev/null differ diff --git a/docs/html/_images/sphx_glr_browser_example_thumb.png b/docs/html/_images/sphx_glr_browser_example_thumb.png deleted file mode 100644 index c25328e9..00000000 Binary files a/docs/html/_images/sphx_glr_browser_example_thumb.png and /dev/null differ diff --git a/docs/html/_images/sphx_glr_enrichment_multi_bam_example_thumb.png b/docs/html/_images/sphx_glr_enrichment_multi_bam_example_thumb.png deleted file mode 100644 index f0e184de..00000000 Binary files a/docs/html/_images/sphx_glr_enrichment_multi_bam_example_thumb.png and /dev/null differ diff --git a/docs/html/_images/sphx_glr_enrichment_multi_bed_example_thumb.png b/docs/html/_images/sphx_glr_enrichment_multi_bed_example_thumb.png deleted file mode 100644 index 8b21aeaf..00000000 Binary files a/docs/html/_images/sphx_glr_enrichment_multi_bed_example_thumb.png and /dev/null differ diff --git a/docs/html/_images/sphx_glr_enrichment_profile_ma_mc_example_thumb.png b/docs/html/_images/sphx_glr_enrichment_profile_ma_mc_example_thumb.png deleted file mode 100644 index ae0846c9..00000000 Binary files a/docs/html/_images/sphx_glr_enrichment_profile_ma_mc_example_thumb.png and /dev/null differ diff --git a/docs/html/_images/sphx_glr_enrichment_profile_overlay_example_thumb.png b/docs/html/_images/sphx_glr_enrichment_profile_overlay_example_thumb.png deleted file mode 100644 index 00bf6efa..00000000 Binary files a/docs/html/_images/sphx_glr_enrichment_profile_overlay_example_thumb.png and /dev/null differ diff --git a/docs/html/_images/sphx_glr_enrichment_profile_single_example_thumb.png b/docs/html/_images/sphx_glr_enrichment_profile_single_example_thumb.png deleted file mode 100644 index d9c156e9..00000000 Binary files a/docs/html/_images/sphx_glr_enrichment_profile_single_example_thumb.png and /dev/null differ diff --git a/docs/html/_images/sphx_glr_plot_browser_example_001.png b/docs/html/_images/sphx_glr_plot_browser_example_001.png deleted file mode 100644 index ac67b5e1..00000000 Binary files a/docs/html/_images/sphx_glr_plot_browser_example_001.png and /dev/null differ diff --git a/docs/html/_images/sphx_glr_plot_browser_example_002.png b/docs/html/_images/sphx_glr_plot_browser_example_002.png deleted file mode 100644 index 2f48b33a..00000000 Binary files a/docs/html/_images/sphx_glr_plot_browser_example_002.png and /dev/null differ diff --git a/docs/html/_images/sphx_glr_plot_browser_example_003.png b/docs/html/_images/sphx_glr_plot_browser_example_003.png deleted file mode 100644 index 717027c7..00000000 Binary files a/docs/html/_images/sphx_glr_plot_browser_example_003.png and /dev/null differ diff --git a/docs/html/_images/sphx_glr_plot_browser_example_004.png b/docs/html/_images/sphx_glr_plot_browser_example_004.png deleted file mode 100644 index 1b695f10..00000000 Binary files a/docs/html/_images/sphx_glr_plot_browser_example_004.png and /dev/null differ diff --git a/docs/html/_images/sphx_glr_plot_browser_example_thumb.png b/docs/html/_images/sphx_glr_plot_browser_example_thumb.png deleted file mode 100644 index ce9409ad..00000000 Binary files a/docs/html/_images/sphx_glr_plot_browser_example_thumb.png and /dev/null differ diff --git a/docs/html/_images/sphx_glr_plot_enrichment_example_001.png b/docs/html/_images/sphx_glr_plot_enrichment_example_001.png deleted file mode 100644 index cbcf211a..00000000 Binary files a/docs/html/_images/sphx_glr_plot_enrichment_example_001.png and /dev/null differ diff --git a/docs/html/_images/sphx_glr_plot_enrichment_example_thumb.png b/docs/html/_images/sphx_glr_plot_enrichment_example_thumb.png deleted file mode 100644 index 6240ecbd..00000000 Binary files a/docs/html/_images/sphx_glr_plot_enrichment_example_thumb.png and /dev/null differ diff --git a/docs/html/_images/sphx_glr_plot_enrichment_profile_example_001.png b/docs/html/_images/sphx_glr_plot_enrichment_profile_example_001.png deleted file mode 100644 index c105b711..00000000 Binary files a/docs/html/_images/sphx_glr_plot_enrichment_profile_example_001.png and /dev/null differ diff --git a/docs/html/_images/sphx_glr_plot_enrichment_profile_example_thumb.png b/docs/html/_images/sphx_glr_plot_enrichment_profile_example_thumb.png deleted file mode 100644 index 68883516..00000000 Binary files a/docs/html/_images/sphx_glr_plot_enrichment_profile_example_thumb.png and /dev/null differ diff --git a/docs/html/_images/sphx_glr_plot_example_001.png b/docs/html/_images/sphx_glr_plot_example_001.png deleted file mode 100644 index e5cae1af..00000000 Binary files a/docs/html/_images/sphx_glr_plot_example_001.png and /dev/null differ diff --git a/docs/html/_images/sphx_glr_plot_example_thumb.png b/docs/html/_images/sphx_glr_plot_example_thumb.png deleted file mode 100644 index 9274434f..00000000 Binary files a/docs/html/_images/sphx_glr_plot_example_thumb.png and /dev/null differ diff --git a/docs/html/_images/sphx_glr_plot_qc_example_001.png b/docs/html/_images/sphx_glr_plot_qc_example_001.png deleted file mode 100644 index e8c0e2c0..00000000 Binary files a/docs/html/_images/sphx_glr_plot_qc_example_001.png and /dev/null differ diff --git a/docs/html/_images/sphx_glr_plot_qc_example_thumb.png b/docs/html/_images/sphx_glr_plot_qc_example_thumb.png deleted file mode 100644 index edd36fcc..00000000 Binary files a/docs/html/_images/sphx_glr_plot_qc_example_thumb.png and /dev/null differ diff --git a/docs/html/_images/sphx_glr_qc_report_example_thumb.png b/docs/html/_images/sphx_glr_qc_report_example_thumb.png deleted file mode 100644 index 537eb042..00000000 Binary files a/docs/html/_images/sphx_glr_qc_report_example_thumb.png and /dev/null differ diff --git a/docs/html/_sources/auto_examples/browser_example.rst.txt b/docs/html/_sources/auto_examples/browser_example.rst.txt deleted file mode 100644 index e9e84594..00000000 --- a/docs/html/_sources/auto_examples/browser_example.rst.txt +++ /dev/null @@ -1,113 +0,0 @@ - -.. DO NOT EDIT. -.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. -.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: -.. "auto_examples/browser_example.py" -.. LINE NUMBERS ARE GIVEN BELOW. - -.. only:: html - - .. note:: - :class: sphx-glr-download-link-note - - Click :ref:`here ` - to download the full example code - -.. rst-class:: sphx-glr-example-title - -.. _sphx_glr_auto_examples_browser_example.py: - - -Single-Molecule Browser Plot -============================ - -Plot single molecules with colored base modifications in a region of interest - -.. GENERATED FROM PYTHON SOURCE LINES 9-13 - -Create either an interactive single-molecule HTML browser if static=False, or create a PDF if static=True. -Base modifications are colored by type (mA vs. mCG) and probability of modification. -Example data for producing these plots can be downloaded from SRA: https://www.ncbi.nlm.nih.gov/bioproject/752170 -The below Python and command line options produce the same output. - -.. GENERATED FROM PYTHON SOURCE LINES 15-17 - -1. Python option ----------------- - -.. GENERATED FROM PYTHON SOURCE LINES 17-35 - -.. code-block:: default - - import dimelo as dm - - bam = "deep_ctcf_mod_mappings_merge.sorted.bam" - sampleName = "CTCF" - outDir = "./out" - dm.plot_browser( - bam, - sampleName, - "chr11:2086423-2091187", - "A+CG", - outDir, - threshA=153, - threshC=153, - static=True, - smooth=100, - min_periods=10, - ) - - -.. GENERATED FROM PYTHON SOURCE LINES 36-39 - -2. Command line option ----------------------- -``dimelo-plot-browser -f deep_ctcf_mod_mappings_merge.sorted.bam -s CTCF -r chr11:2086423-2091187 -m A+CG -o ./out -A 153 -C 153 --static -t 100 -n 10`` - -.. GENERATED FROM PYTHON SOURCE LINES 41-53 - -Output ----------------------- -.. figure:: ../auto_examples/images/methylation_browser_chr11_2086423_2091187.png - :align: center -.. figure:: ../auto_examples/images/CTCF_A_sm_rolling_avg_fraction.png - :align: center -.. figure:: ../auto_examples/images/CTCF_A_sm_rolling_avg_total.png - :align: center -.. figure:: ../auto_examples/images/CTCF_CG_sm_rolling_avg_fraction.png - :align: center -.. figure:: ../auto_examples/images/CTCF_CG_sm_rolling_avg_total.png - :align: center - - -.. rst-class:: sphx-glr-timing - - **Total running time of the script:** ( 0 minutes 0.000 seconds) - - -.. _sphx_glr_download_auto_examples_browser_example.py: - - -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: browser_example.py ` - - - - .. container:: sphx-glr-download sphx-glr-download-jupyter - - :download:`Download Jupyter notebook: browser_example.ipynb ` - - -.. only:: html - - .. rst-class:: sphx-glr-signature - - `Gallery generated by Sphinx-Gallery `_ diff --git a/docs/html/_sources/auto_examples/enrichment_multi_bam_example.rst.txt b/docs/html/_sources/auto_examples/enrichment_multi_bam_example.rst.txt deleted file mode 100644 index 33de12ca..00000000 --- a/docs/html/_sources/auto_examples/enrichment_multi_bam_example.rst.txt +++ /dev/null @@ -1,95 +0,0 @@ - -.. DO NOT EDIT. -.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. -.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: -.. "auto_examples/enrichment_multi_bam_example.py" -.. LINE NUMBERS ARE GIVEN BELOW. - -.. only:: html - - .. note:: - :class: sphx-glr-download-link-note - - Click :ref:`here ` - to download the full example code - -.. rst-class:: sphx-glr-example-title - -.. _sphx_glr_auto_examples_enrichment_multi_bam_example.py: - - -Enrichment Plot Comparison Across BAMs -====================================== - -Plot overall fraction of methylated bases within regions of interest specified by bed file across multiple samples. - -.. GENERATED FROM PYTHON SOURCE LINES 9-10 - -Create barplot comparing methylation levels in bed file regions of interest across samples - -.. GENERATED FROM PYTHON SOURCE LINES 12-14 - -1. Python option ----------------- - -.. GENERATED FROM PYTHON SOURCE LINES 14-26 - -.. code-block:: default - - import dimelo as dm - - bams = [ - "deep_ctcf_mod_mappings_merge.sorted.bam", - "hia5_mod_mappings.bam", - "igg_mod_mappings.bam", - ] - sampleNames = ["CTCF", "Hia5", "IgG"] - bed = "q10.150.slop.bed" - outDir = "./out" - dm.plot_enrichment(bams, sampleNames, bed, "A", outDir, threshA=190) - - -.. GENERATED FROM PYTHON SOURCE LINES 27-30 - -2. Command line option ----------------------- -``dimelo-plot-enrichment -f deep_ctcf_mod_mappings_merge.sorted.bam hia5_mod_mappings.bam igg_mod_mappings.bam -s CTCF Hia5 IgG -b q10.150.slop.bed -m A -o ./out -A 190`` - -.. GENERATED FROM PYTHON SOURCE LINES 32-35 - -Output ----------------------- -.. figure:: ../auto_examples/images/region_q10.150.slop_A_enrichment_barplot.png - - -.. rst-class:: sphx-glr-timing - - **Total running time of the script:** ( 0 minutes 0.000 seconds) - - -.. _sphx_glr_download_auto_examples_enrichment_multi_bam_example.py: - - -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: enrichment_multi_bam_example.py ` - - - - .. container:: sphx-glr-download sphx-glr-download-jupyter - - :download:`Download Jupyter notebook: enrichment_multi_bam_example.ipynb ` - - -.. only:: html - - .. rst-class:: sphx-glr-signature - - `Gallery generated by Sphinx-Gallery `_ diff --git a/docs/html/_sources/auto_examples/enrichment_multi_bed_example.rst.txt b/docs/html/_sources/auto_examples/enrichment_multi_bed_example.rst.txt deleted file mode 100644 index 51da39ae..00000000 --- a/docs/html/_sources/auto_examples/enrichment_multi_bed_example.rst.txt +++ /dev/null @@ -1,91 +0,0 @@ - -.. DO NOT EDIT. -.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. -.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: -.. "auto_examples/enrichment_multi_bed_example.py" -.. LINE NUMBERS ARE GIVEN BELOW. - -.. only:: html - - .. note:: - :class: sphx-glr-download-link-note - - Click :ref:`here ` - to download the full example code - -.. rst-class:: sphx-glr-example-title - -.. _sphx_glr_auto_examples_enrichment_multi_bed_example.py: - - -Enrichment Plot Comparison Across BEDs -====================================== - -Plot overall fraction of methylated bases within multiple sets of regions of interest specified by bed files for a single sample. - -.. GENERATED FROM PYTHON SOURCE LINES 9-10 - -Create barplot comparing methylation levels in single sample across multiple regions of interest defined in bed files. - -.. GENERATED FROM PYTHON SOURCE LINES 12-14 - -1. Python option ----------------- - -.. GENERATED FROM PYTHON SOURCE LINES 14-22 - -.. code-block:: default - - import dimelo as dm - - bam = "deep_ctcf_mod_mappings_merge.sorted.bam" - beds = ["q10.150.slop.bed", "q10nopeak.bed"] - sampleNames = ["chip_peak", "not_chip_peak"] - outDir = "./out" - dm.plot_enrichment(bam, sampleNames, beds, "A", outDir, threshA=190) - - -.. GENERATED FROM PYTHON SOURCE LINES 23-26 - -2. Command line option ----------------------- -``dimelo-plot-enrichment -f deep_ctcf_mod_mappings_merge.sorted.bam -s chip_peak not_chip_peak -b q10.150.slop.bed q10nopeak.bed -m A -o ./out -A 190`` - -.. GENERATED FROM PYTHON SOURCE LINES 28-31 - -Output ----------------------- -.. figure:: ../auto_examples/images/sample_deep_ctcf_mod_mappings_merge.sorted_A_enrichment_barplot.png - - -.. rst-class:: sphx-glr-timing - - **Total running time of the script:** ( 0 minutes 0.000 seconds) - - -.. _sphx_glr_download_auto_examples_enrichment_multi_bed_example.py: - - -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: enrichment_multi_bed_example.py ` - - - - .. container:: sphx-glr-download sphx-glr-download-jupyter - - :download:`Download Jupyter notebook: enrichment_multi_bed_example.ipynb ` - - -.. only:: html - - .. rst-class:: sphx-glr-signature - - `Gallery generated by Sphinx-Gallery `_ diff --git a/docs/html/_sources/auto_examples/enrichment_profile_ma_mc_example.rst.txt b/docs/html/_sources/auto_examples/enrichment_profile_ma_mc_example.rst.txt deleted file mode 100644 index 57591f14..00000000 --- a/docs/html/_sources/auto_examples/enrichment_profile_ma_mc_example.rst.txt +++ /dev/null @@ -1,105 +0,0 @@ - -.. DO NOT EDIT. -.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. -.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: -.. "auto_examples/enrichment_profile_ma_mc_example.py" -.. LINE NUMBERS ARE GIVEN BELOW. - -.. only:: html - - .. note:: - :class: sphx-glr-download-link-note - - Click :ref:`here ` - to download the full example code - -.. rst-class:: sphx-glr-example-title - -.. _sphx_glr_auto_examples_enrichment_profile_ma_mc_example.py: - - -Enrichment Profile mA & mCG -================================= - -Aggregate and single molecule plots colored by modification and centered at regions of interest defined in bed file. - -.. GENERATED FROM PYTHON SOURCE LINES 9-10 - -Create (1) aggregate profile plots for mA/A and mCG/CG, (2) single-molecule plots for mA + mCG, and (3) base abundance plots for A and CG. - -.. GENERATED FROM PYTHON SOURCE LINES 12-14 - -1. Python option ----------------- - -.. GENERATED FROM PYTHON SOURCE LINES 14-32 - -.. code-block:: default - - import dimelo as dm - - bam = "deep_ctcf_mod_mappings_merge.sorted.bam" - sampleName = "quartile4" - bed = "quart4.bed" - outDir = "./out" - dm.plot_enrichment_profile( - bam, - sampleName, - bed, - "A+CG", - outDir, - threshA=190, - threshC=190, - dotsize=0.05, - ) - - - -.. GENERATED FROM PYTHON SOURCE LINES 33-36 - -2. Command line option ----------------------- -``dimelo-plot-enrichment-profile -f deep_ctcf_mod_mappings_merge.sorted.bam -s quartile4 -b quart4.bed -m A+CG -o ./out -A 190 -C 190 -d 0.05`` - -.. GENERATED FROM PYTHON SOURCE LINES 38-45 - -Output ----------------------- -.. figure:: ../auto_examples/images/quartile4_A+CG_sm_rolling_avg.png - :align: center -.. figure:: ../auto_examples/images/quartile4_A+CG_sm_scatter.png -.. figure:: ../auto_examples/images/quartile4_A_base_count.png -.. figure:: ../auto_examples/images/quartile4_CG_base_count.png - - -.. rst-class:: sphx-glr-timing - - **Total running time of the script:** ( 0 minutes 0.000 seconds) - - -.. _sphx_glr_download_auto_examples_enrichment_profile_ma_mc_example.py: - - -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: enrichment_profile_ma_mc_example.py ` - - - - .. container:: sphx-glr-download sphx-glr-download-jupyter - - :download:`Download Jupyter notebook: enrichment_profile_ma_mc_example.ipynb ` - - -.. only:: html - - .. rst-class:: sphx-glr-signature - - `Gallery generated by Sphinx-Gallery `_ diff --git a/docs/html/_sources/auto_examples/enrichment_profile_overlay_example.rst.txt b/docs/html/_sources/auto_examples/enrichment_profile_overlay_example.rst.txt deleted file mode 100644 index 454b1745..00000000 --- a/docs/html/_sources/auto_examples/enrichment_profile_overlay_example.rst.txt +++ /dev/null @@ -1,94 +0,0 @@ - -.. DO NOT EDIT. -.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. -.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: -.. "auto_examples/enrichment_profile_overlay_example.py" -.. LINE NUMBERS ARE GIVEN BELOW. - -.. only:: html - - .. note:: - :class: sphx-glr-download-link-note - - Click :ref:`here ` - to download the full example code - -.. rst-class:: sphx-glr-example-title - -.. _sphx_glr_auto_examples_enrichment_profile_overlay_example.py: - - -Enrichment Profile Overlay -================================= - -Aggregate fraction of methylated bases centered at regions of interest defined in bed files. - -.. GENERATED FROM PYTHON SOURCE LINES 9-10 - -Create (1) aggregate profile plots for mA/A and mCG/CG, (2) single-molecule plots for mA + mCG, and (3) base abundance plots for A and CG. - -.. GENERATED FROM PYTHON SOURCE LINES 12-14 - -1. Python option ----------------- - -.. GENERATED FROM PYTHON SOURCE LINES 14-24 - -.. code-block:: default - - import dimelo as dm - - bam = "deep_ctcf_mod_mappings_merge.sorted.bam" - sampleNames = ["q4", "q3", "q2", "q1"] - beds = ["quart4.bed", "quart3.bed", "quart2.bed", "quart1.bed"] - outDir = "./out" - dm.plot_enrichment_profile( - bam, sampleNames, beds, "A", outDir, threshA=190, dotsize=0.05 - ) - - -.. GENERATED FROM PYTHON SOURCE LINES 25-28 - -2. Command line option ----------------------- -``dimelo-plot-enrichment-profile -f deep_ctcf_mod_mappings_merge.sorted.bam -s q4 q3 q2 q1 -b quart4.bed quart3.bed quart2.bed quart1.bed -m A -o ./out -A 190 -d 0.05`` - -.. GENERATED FROM PYTHON SOURCE LINES 30-34 - -Output ----------------------- -.. figure:: ../auto_examples/images/sample_deep_ctcf_mod_mappings_merge.sorted_A_sm_rolling_avg_overlay.png - :align: center - - -.. rst-class:: sphx-glr-timing - - **Total running time of the script:** ( 0 minutes 0.000 seconds) - - -.. _sphx_glr_download_auto_examples_enrichment_profile_overlay_example.py: - - -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: enrichment_profile_overlay_example.py ` - - - - .. container:: sphx-glr-download sphx-glr-download-jupyter - - :download:`Download Jupyter notebook: enrichment_profile_overlay_example.ipynb ` - - -.. only:: html - - .. rst-class:: sphx-glr-signature - - `Gallery generated by Sphinx-Gallery `_ diff --git a/docs/html/_sources/auto_examples/enrichment_profile_single_example.rst.txt b/docs/html/_sources/auto_examples/enrichment_profile_single_example.rst.txt deleted file mode 100644 index 71ccb7df..00000000 --- a/docs/html/_sources/auto_examples/enrichment_profile_single_example.rst.txt +++ /dev/null @@ -1,96 +0,0 @@ - -.. DO NOT EDIT. -.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. -.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: -.. "auto_examples/enrichment_profile_single_example.py" -.. LINE NUMBERS ARE GIVEN BELOW. - -.. only:: html - - .. note:: - :class: sphx-glr-download-link-note - - Click :ref:`here ` - to download the full example code - -.. rst-class:: sphx-glr-example-title - -.. _sphx_glr_auto_examples_enrichment_profile_single_example.py: - - -Enrichment Profile mA only -================================= - -Plot single molecules centered at regions of interest defined in bed file and produce aggregate profile - -.. GENERATED FROM PYTHON SOURCE LINES 9-10 - -Create (1) aggregate profile plots for mA/A, (2) single-molecule plots for mA, and (3) base abundance plots for A. - -.. GENERATED FROM PYTHON SOURCE LINES 12-14 - -1. Python option ----------------- - -.. GENERATED FROM PYTHON SOURCE LINES 14-24 - -.. code-block:: default - - import dimelo as dm - - bam = "deep_ctcf_mod_mappings_merge.sorted.bam" - sampleName = "quartile4" - bed = "quart4.bed" - outDir = "./out" - dm.plot_enrichment_profile( - bam, sampleName, bed, "A", outDir, threshA=190, dotsize=0.05 - ) - - -.. GENERATED FROM PYTHON SOURCE LINES 25-28 - -2. Command line option ----------------------- -``dimelo-plot-enrichment-profile -f deep_ctcf_mod_mappings_merge.sorted.bam -s quartile4 -b quart4.bed -m A -o ./out -A 190 -d 0.05`` - -.. GENERATED FROM PYTHON SOURCE LINES 30-36 - -Output ----------------------- -.. figure:: ../auto_examples/images/quartile4_A_sm_rolling_avg.png - :align: center -.. figure:: ../auto_examples/images/quartile4_A_sm_scatter.png -.. figure:: ../auto_examples/images/quartile4_A_base_count.png - - -.. rst-class:: sphx-glr-timing - - **Total running time of the script:** ( 0 minutes 0.000 seconds) - - -.. _sphx_glr_download_auto_examples_enrichment_profile_single_example.py: - - -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: enrichment_profile_single_example.py ` - - - - .. container:: sphx-glr-download sphx-glr-download-jupyter - - :download:`Download Jupyter notebook: enrichment_profile_single_example.ipynb ` - - -.. only:: html - - .. rst-class:: sphx-glr-signature - - `Gallery generated by Sphinx-Gallery `_ diff --git a/docs/html/_sources/auto_examples/index.rst.txt b/docs/html/_sources/auto_examples/index.rst.txt deleted file mode 100644 index 77c9162a..00000000 --- a/docs/html/_sources/auto_examples/index.rst.txt +++ /dev/null @@ -1,184 +0,0 @@ -:orphan: - - - -.. _sphx_glr_auto_examples: - -Example Gallery -======================= - - -.. raw:: html - -
- -.. only:: html - - .. figure:: /auto_examples/images/thumb/sphx_glr_enrichment_profile_single_example_thumb.png - :alt: Enrichment Profile mA only - - :ref:`sphx_glr_auto_examples_enrichment_profile_single_example.py` - -.. raw:: html - -
- - -.. toctree:: - :hidden: - - /auto_examples/enrichment_profile_single_example - -.. raw:: html - -
- -.. only:: html - - .. figure:: /auto_examples/images/thumb/sphx_glr_enrichment_multi_bed_example_thumb.png - :alt: Enrichment Plot Comparison Across BEDs - - :ref:`sphx_glr_auto_examples_enrichment_multi_bed_example.py` - -.. raw:: html - -
- - -.. toctree:: - :hidden: - - /auto_examples/enrichment_multi_bed_example - -.. raw:: html - -
- -.. only:: html - - .. figure:: /auto_examples/images/thumb/sphx_glr_enrichment_profile_ma_mc_example_thumb.png - :alt: Enrichment Profile mA & mCG - - :ref:`sphx_glr_auto_examples_enrichment_profile_ma_mc_example.py` - -.. raw:: html - -
- - -.. toctree:: - :hidden: - - /auto_examples/enrichment_profile_ma_mc_example - -.. raw:: html - -
- -.. only:: html - - .. figure:: /auto_examples/images/thumb/sphx_glr_enrichment_multi_bam_example_thumb.png - :alt: Enrichment Plot Comparison Across BAMs - - :ref:`sphx_glr_auto_examples_enrichment_multi_bam_example.py` - -.. raw:: html - -
- - -.. toctree:: - :hidden: - - /auto_examples/enrichment_multi_bam_example - -.. raw:: html - -
- -.. only:: html - - .. figure:: /auto_examples/images/thumb/sphx_glr_enrichment_profile_overlay_example_thumb.png - :alt: Enrichment Profile Overlay - - :ref:`sphx_glr_auto_examples_enrichment_profile_overlay_example.py` - -.. raw:: html - -
- - -.. toctree:: - :hidden: - - /auto_examples/enrichment_profile_overlay_example - -.. raw:: html - -
- -.. only:: html - - .. figure:: /auto_examples/images/thumb/sphx_glr_browser_example_thumb.png - :alt: Single-Molecule Browser Plot - - :ref:`sphx_glr_auto_examples_browser_example.py` - -.. raw:: html - -
- - -.. toctree:: - :hidden: - - /auto_examples/browser_example - -.. raw:: html - -
- -.. only:: html - - .. figure:: /auto_examples/images/thumb/sphx_glr_qc_report_example_thumb.png - :alt: QC Report - - :ref:`sphx_glr_auto_examples_qc_report_example.py` - -.. raw:: html - -
- - -.. toctree:: - :hidden: - - /auto_examples/qc_report_example -.. raw:: html - -
- - - -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-gallery - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download all examples in Python source code: auto_examples_python.zip ` - - - - .. container:: sphx-glr-download sphx-glr-download-jupyter - - :download:`Download all examples in Jupyter notebooks: auto_examples_jupyter.zip ` - - -.. only:: html - - .. rst-class:: sphx-glr-signature - - `Gallery generated by Sphinx-Gallery `_ diff --git a/docs/html/_sources/auto_examples/plot_browser_example.rst.txt b/docs/html/_sources/auto_examples/plot_browser_example.rst.txt deleted file mode 100644 index 7a24066f..00000000 --- a/docs/html/_sources/auto_examples/plot_browser_example.rst.txt +++ /dev/null @@ -1,196 +0,0 @@ - -.. DO NOT EDIT. -.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. -.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: -.. "auto_examples/plot_browser_example.py" -.. LINE NUMBERS ARE GIVEN BELOW. - -.. only:: html - - .. note:: - :class: sphx-glr-download-link-note - - Click :ref:`here ` - to download the full example code - -.. rst-class:: sphx-glr-example-title - -.. _sphx_glr_auto_examples_plot_browser_example.py: - - -Browser Plot Example -=========================== - -This plots single molecules with colored base modifications in region of interest - -.. GENERATED FROM PYTHON SOURCE LINES 8-11 - -Plotting Browser ------------------------- -add description here - -.. GENERATED FROM PYTHON SOURCE LINES 11-23 - -.. code-block:: default - - - import dimelo as dm - - input_bam = "../../dimelo/test/data/mod_mappings_subset.bam" - sample_name = "test" - region = "chr1:2907273-2909473" - outDir = "../../dimelo/dimelo_test" - dm.plot_browser(input_bam, sample_name, region, "A+CG", outDir, static=True) - - # This will return an HTML file with single molecules displayed o - # ver region of interest. Modified bases are colored according to colorA and colorC. - # To return a PDF file, set static = True - - - -.. rst-class:: sphx-glr-horizontal - - - * - - .. image-sg:: /auto_examples/images/sphx_glr_plot_browser_example_001.png - :alt: A - :srcset: /auto_examples/images/sphx_glr_plot_browser_example_001.png - :class: sphx-glr-multi-img - - * - - .. image-sg:: /auto_examples/images/sphx_glr_plot_browser_example_002.png - :alt: A - :srcset: /auto_examples/images/sphx_glr_plot_browser_example_002.png - :class: sphx-glr-multi-img - - * - - .. image-sg:: /auto_examples/images/sphx_glr_plot_browser_example_003.png - :alt: C - :srcset: /auto_examples/images/sphx_glr_plot_browser_example_003.png - :class: sphx-glr-multi-img - - * - - .. image-sg:: /auto_examples/images/sphx_glr_plot_browser_example_004.png - :alt: C - :srcset: /auto_examples/images/sphx_glr_plot_browser_example_004.png - :class: sphx-glr-multi-img - - -.. rst-class:: sphx-glr-script-out - - Out: - - .. code-block:: none - - Outputs - _______ - DB file: ../../dimelo/dimelo_test/mod_mappings_subset.db - processing 1 reads for test for bam: ../../dimelo/test/data/mod_mappings_subset.bam - /Users/annie/miniconda3/envs/dimelo/lib/python3.7/site-packages/pandas/util/_decorators.py:311: SettingWithCopyWarning: - - - A value is trying to be set on a copy of a slice from a DataFrame - - See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy - - /Users/annie/miniconda3/envs/dimelo/lib/python3.7/site-packages/seaborn/cm.py:1582: UserWarning: - - Trying to register the cmap 'rocket' which already exists. - - /Users/annie/miniconda3/envs/dimelo/lib/python3.7/site-packages/seaborn/cm.py:1583: UserWarning: - - Trying to register the cmap 'rocket_r' which already exists. - - /Users/annie/miniconda3/envs/dimelo/lib/python3.7/site-packages/seaborn/cm.py:1582: UserWarning: - - Trying to register the cmap 'mako' which already exists. - - /Users/annie/miniconda3/envs/dimelo/lib/python3.7/site-packages/seaborn/cm.py:1583: UserWarning: - - Trying to register the cmap 'mako_r' which already exists. - - /Users/annie/miniconda3/envs/dimelo/lib/python3.7/site-packages/seaborn/cm.py:1582: UserWarning: - - Trying to register the cmap 'icefire' which already exists. - - /Users/annie/miniconda3/envs/dimelo/lib/python3.7/site-packages/seaborn/cm.py:1583: UserWarning: - - Trying to register the cmap 'icefire_r' which already exists. - - /Users/annie/miniconda3/envs/dimelo/lib/python3.7/site-packages/seaborn/cm.py:1582: UserWarning: - - Trying to register the cmap 'vlag' which already exists. - - /Users/annie/miniconda3/envs/dimelo/lib/python3.7/site-packages/seaborn/cm.py:1583: UserWarning: - - Trying to register the cmap 'vlag_r' which already exists. - - /Users/annie/miniconda3/envs/dimelo/lib/python3.7/site-packages/seaborn/cm.py:1582: UserWarning: - - Trying to register the cmap 'flare' which already exists. - - /Users/annie/miniconda3/envs/dimelo/lib/python3.7/site-packages/seaborn/cm.py:1583: UserWarning: - - Trying to register the cmap 'flare_r' which already exists. - - /Users/annie/miniconda3/envs/dimelo/lib/python3.7/site-packages/seaborn/cm.py:1582: UserWarning: - - Trying to register the cmap 'crest' which already exists. - - /Users/annie/miniconda3/envs/dimelo/lib/python3.7/site-packages/seaborn/cm.py:1583: UserWarning: - - Trying to register the cmap 'crest_r' which already exists. - - /Users/annie/miniconda3/envs/dimelo/lib/python3.7/site-packages/pandas/util/_decorators.py:311: SettingWithCopyWarning: - - - A value is trying to be set on a copy of a slice from a DataFrame - - See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy - - Outputs - _______ - DB file: ['../../dimelo/dimelo_test/mod_mappings_subset.db'] - browser plot: ../../dimelo/dimelo_test/methylation_browser_chr1_2907273_2909473.pdf - rolling average fraction bases methylated plot: ['../../dimelo/dimelo_test/test_A_sm_rolling_avg_fraction.pdf', '../../dimelo/dimelo_test/test_C_sm_rolling_avg_fraction.pdf'] - rolling average total bases plot: ['../../dimelo/dimelo_test/test_A_sm_rolling_avg_total.pdf', '../../dimelo/dimelo_test/test_C_sm_rolling_avg_total.pdf'] - - - - - -.. rst-class:: sphx-glr-timing - - **Total running time of the script:** ( 0 minutes 7.419 seconds) - - -.. _sphx_glr_download_auto_examples_plot_browser_example.py: - - -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: plot_browser_example.py ` - - - - .. container:: sphx-glr-download sphx-glr-download-jupyter - - :download:`Download Jupyter notebook: plot_browser_example.ipynb ` - - -.. only:: html - - .. rst-class:: sphx-glr-signature - - `Gallery generated by Sphinx-Gallery `_ diff --git a/docs/html/_sources/auto_examples/plot_enrichment_example.rst.txt b/docs/html/_sources/auto_examples/plot_enrichment_example.rst.txt deleted file mode 100644 index f135168b..00000000 --- a/docs/html/_sources/auto_examples/plot_enrichment_example.rst.txt +++ /dev/null @@ -1,124 +0,0 @@ - -.. DO NOT EDIT. -.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. -.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: -.. "auto_examples/plot_enrichment_example.py" -.. LINE NUMBERS ARE GIVEN BELOW. - -.. only:: html - - .. note:: - :class: sphx-glr-download-link-note - - Click :ref:`here ` - to download the full example code - -.. rst-class:: sphx-glr-example-title - -.. _sphx_glr_auto_examples_plot_enrichment_example.py: - - -Enrichment Plot Example -=========================== - -This plots the fraction of bases modified within regions of interest defined by a bed file - -.. GENERATED FROM PYTHON SOURCE LINES 8-11 - -Plotting Enrichment ------------------------- -add description here - -.. GENERATED FROM PYTHON SOURCE LINES 11-27 - -.. code-block:: default - - - import dimelo as dm - - input_bams = [ - "../../dimelo/test/data/mod_mappings_subset.bam", - "../../dimelo/test/data/mod_mappings_subset.bam", - ] - sample_names = ["test1", "test2"] - regions = "../../dimelo/test/data/test.bed" - outDir = "../../dimelo/dimelo_test" - dm.plot_enrichment( - input_bams, sample_names, regions, "CG", outDir, threshC=129 - ) - - # This will return a barplot with overall fraction of bases - # modified within regions of interest specified by bedFile(s) - - - -.. image-sg:: /auto_examples/images/sphx_glr_plot_enrichment_example_001.png - :alt: plot enrichment example - :srcset: /auto_examples/images/sphx_glr_plot_enrichment_example_001.png - :class: sphx-glr-single-img - - -.. rst-class:: sphx-glr-script-out - - Out: - - .. code-block:: none - - Outputs - _______ - DB file: ../../dimelo/dimelo_test/mod_mappings_subset.db - Outputs - _______ - DB file: ../../dimelo/dimelo_test/mod_mappings_subset.db - - Data for barplot - ________________ - - 0 test1 - 1 test2 - Name: sampleName, dtype: object - 0 0.142857 - 1 0.142857 - Name: fractionMethylated, dtype: float64 - - - Outputs - _______ - DB file: ['../../dimelo/dimelo_test/mod_mappings_subset.db', '../../dimelo/dimelo_test/mod_mappings_subset.db'] - enrichment barplot: ../../dimelo/dimelo_test/region_test_CG_enrichment_barplot.png - - - - - -.. rst-class:: sphx-glr-timing - - **Total running time of the script:** ( 0 minutes 0.600 seconds) - - -.. _sphx_glr_download_auto_examples_plot_enrichment_example.py: - - -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: plot_enrichment_example.py ` - - - - .. container:: sphx-glr-download sphx-glr-download-jupyter - - :download:`Download Jupyter notebook: plot_enrichment_example.ipynb ` - - -.. only:: html - - .. rst-class:: sphx-glr-signature - - `Gallery generated by Sphinx-Gallery `_ diff --git a/docs/html/_sources/auto_examples/plot_enrichment_profile_example.rst.txt b/docs/html/_sources/auto_examples/plot_enrichment_profile_example.rst.txt deleted file mode 100644 index 7155d748..00000000 --- a/docs/html/_sources/auto_examples/plot_enrichment_profile_example.rst.txt +++ /dev/null @@ -1,160 +0,0 @@ - -.. DO NOT EDIT. -.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. -.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: -.. "auto_examples/plot_enrichment_profile_example.py" -.. LINE NUMBERS ARE GIVEN BELOW. - -.. only:: html - - .. note:: - :class: sphx-glr-download-link-note - - Click :ref:`here ` - to download the full example code - -.. rst-class:: sphx-glr-example-title - -.. _sphx_glr_auto_examples_plot_enrichment_profile_example.py: - - -Enrichment Profile Plot Example -=========================== - -This plots single molecules centered at regions of interest defined in bed file and produces aggregate profile - -.. GENERATED FROM PYTHON SOURCE LINES 8-11 - -Plotting Enrichment Profile ------------------------- -add description here - -.. GENERATED FROM PYTHON SOURCE LINES 11-27 - -.. code-block:: default - - - import dimelo as dm - - input_bam = "../../dimelo/test/data/mod_mappings_subset.bam" - sample_names = ["test1", "test2"] - regions = [ - "../../dimelo/test/data/test.bed", - "../../dimelo/test/data/test.bed", - ] - outDir = "../../dimelo/dimelo_test" - dm.plot_enrichment_profile( - input_bam, sample_names, regions, "A", outDir, windowSize=500, dotsize=1 - ) - - # This will return an aggregate profile of fraction of bases - # modified centered at features of interest - - - -.. image-sg:: /auto_examples/images/sphx_glr_plot_enrichment_profile_example_001.png - :alt: A - :srcset: /auto_examples/images/sphx_glr_plot_enrichment_profile_example_001.png - :class: sphx-glr-single-img - - -.. rst-class:: sphx-glr-script-out - - Out: - - .. code-block:: none - - Outputs - _______ - DB file: ../../dimelo/dimelo_test/mod_mappings_subset.db - /Users/annie/miniconda3/envs/dimelo/lib/python3.7/site-packages/seaborn/cm.py:1582: UserWarning: - - Trying to register the cmap 'rocket' which already exists. - - /Users/annie/miniconda3/envs/dimelo/lib/python3.7/site-packages/seaborn/cm.py:1583: UserWarning: - - Trying to register the cmap 'rocket_r' which already exists. - - /Users/annie/miniconda3/envs/dimelo/lib/python3.7/site-packages/seaborn/cm.py:1582: UserWarning: - - Trying to register the cmap 'mako' which already exists. - - /Users/annie/miniconda3/envs/dimelo/lib/python3.7/site-packages/seaborn/cm.py:1583: UserWarning: - - Trying to register the cmap 'mako_r' which already exists. - - /Users/annie/miniconda3/envs/dimelo/lib/python3.7/site-packages/seaborn/cm.py:1582: UserWarning: - - Trying to register the cmap 'icefire' which already exists. - - /Users/annie/miniconda3/envs/dimelo/lib/python3.7/site-packages/seaborn/cm.py:1583: UserWarning: - - Trying to register the cmap 'icefire_r' which already exists. - - /Users/annie/miniconda3/envs/dimelo/lib/python3.7/site-packages/seaborn/cm.py:1582: UserWarning: - - Trying to register the cmap 'vlag' which already exists. - - /Users/annie/miniconda3/envs/dimelo/lib/python3.7/site-packages/seaborn/cm.py:1583: UserWarning: - - Trying to register the cmap 'vlag_r' which already exists. - - /Users/annie/miniconda3/envs/dimelo/lib/python3.7/site-packages/seaborn/cm.py:1582: UserWarning: - - Trying to register the cmap 'flare' which already exists. - - /Users/annie/miniconda3/envs/dimelo/lib/python3.7/site-packages/seaborn/cm.py:1583: UserWarning: - - Trying to register the cmap 'flare_r' which already exists. - - /Users/annie/miniconda3/envs/dimelo/lib/python3.7/site-packages/seaborn/cm.py:1582: UserWarning: - - Trying to register the cmap 'crest' which already exists. - - /Users/annie/miniconda3/envs/dimelo/lib/python3.7/site-packages/seaborn/cm.py:1583: UserWarning: - - Trying to register the cmap 'crest_r' which already exists. - - Outputs - _______ - DB file: ../../dimelo/dimelo_test/mod_mappings_subset.db - Outputs - _______ - DB file: ['../../dimelo/dimelo_test/mod_mappings_subset.db'] - overlay plot: ../../dimelo/dimelo_test/sample_mod_mappings_subset_A_sm_rolling_avg_overlay.pdf - - - - - -.. rst-class:: sphx-glr-timing - - **Total running time of the script:** ( 0 minutes 0.889 seconds) - - -.. _sphx_glr_download_auto_examples_plot_enrichment_profile_example.py: - - -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: plot_enrichment_profile_example.py ` - - - - .. container:: sphx-glr-download sphx-glr-download-jupyter - - :download:`Download Jupyter notebook: plot_enrichment_profile_example.ipynb ` - - -.. only:: html - - .. rst-class:: sphx-glr-signature - - `Gallery generated by Sphinx-Gallery `_ diff --git a/docs/html/_sources/auto_examples/plot_example.rst.txt b/docs/html/_sources/auto_examples/plot_example.rst.txt deleted file mode 100644 index d3c253f2..00000000 --- a/docs/html/_sources/auto_examples/plot_example.rst.txt +++ /dev/null @@ -1,127 +0,0 @@ - -.. DO NOT EDIT. -.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. -.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: -.. "auto_examples/plot_example.py" -.. LINE NUMBERS ARE GIVEN BELOW. - -.. only:: html - - .. note:: - :class: sphx-glr-download-link-note - - Click :ref:`here ` - to download the full example code - -.. rst-class:: sphx-glr-example-title - -.. _sphx_glr_auto_examples_plot_example.py: - - -"This" is my example-script -=========================== - -This example doesn't do much, it just makes a simple plot - -.. GENERATED FROM PYTHON SOURCE LINES 8-13 - -This is a section header ------------------------- -This is the first section! The #%% signifies to Sphinx-Gallery that -this text should be rendered as rST and if using one of the above -IDE/plugin’s, also signifies the start of a ‘code block’. - -.. GENERATED FROM PYTHON SOURCE LINES 13-31 - -.. code-block:: default - - - - import matplotlib.pyplot as plt - - # This line won't be rendered as rST because there's a space after the last block. - import numpy as np - - x = np.linspace(0, 2 * np.pi, 100) - y = np.sin(x) - - plt.plot(x, y) - plt.xlabel(r"$x$") - plt.ylabel(r"$\sin(x)$") - # To avoid matplotlib text output - plt.show() - # This is the end of the 'code block' (if using an above IDE). All code within - # this block can be easily executed all at once. - - - - -.. image-sg:: /auto_examples/images/sphx_glr_plot_example_001.png - :alt: plot example - :srcset: /auto_examples/images/sphx_glr_plot_example_001.png - :class: sphx-glr-single-img - - - - - -.. GENERATED FROM PYTHON SOURCE LINES 32-37 - -This is another section header ------------------------------- - -In the built documentation, it will be rendered as rST after the code above! -This is also another code block. - -.. GENERATED FROM PYTHON SOURCE LINES 37-38 - -.. code-block:: default - - print("here") - - - - -.. rst-class:: sphx-glr-script-out - - Out: - - .. code-block:: none - - here - - - - - -.. rst-class:: sphx-glr-timing - - **Total running time of the script:** ( 0 minutes 0.394 seconds) - - -.. _sphx_glr_download_auto_examples_plot_example.py: - - -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: plot_example.py ` - - - - .. container:: sphx-glr-download sphx-glr-download-jupyter - - :download:`Download Jupyter notebook: plot_example.ipynb ` - - -.. only:: html - - .. rst-class:: sphx-glr-signature - - `Gallery generated by Sphinx-Gallery `_ diff --git a/docs/html/_sources/auto_examples/plot_qc_example.rst.txt b/docs/html/_sources/auto_examples/plot_qc_example.rst.txt deleted file mode 100644 index c21f5868..00000000 --- a/docs/html/_sources/auto_examples/plot_qc_example.rst.txt +++ /dev/null @@ -1,100 +0,0 @@ - -.. DO NOT EDIT. -.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. -.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: -.. "auto_examples/plot_qc_example.py" -.. LINE NUMBERS ARE GIVEN BELOW. - -.. only:: html - - .. note:: - :class: sphx-glr-download-link-note - - Click :ref:`here ` - to download the full example code - -.. rst-class:: sphx-glr-example-title - -.. _sphx_glr_auto_examples_plot_qc_example.py: - - -QC Report -=========================== - -Outputs quality control report from given bam files. - -.. GENERATED FROM PYTHON SOURCE LINES 9-14 - -Creating QC Report ------------------------- -Usually as a first step after receiving bam files, we want to do a quality check -and assess our data. This code generates a PDF report of important QC statistics -for long read methylation modification bam files - -.. GENERATED FROM PYTHON SOURCE LINES 14-25 - -.. code-block:: default - - - import dimelo as dm - - # first we specify the locations of our bam files - in_bam = "../../dimelo/test/data/winnowmap_guppy_merge_subset.bam" - sample_name = "test" - out_dir = "../../dimelo/dimelo_test" - - # next we run the "qc_report" function - dm.qc_report(in_bam, sample_name, out_dir) - # now our output directory that we specified, will have a file called "test_qc_report.pdf" - - - - -.. rst-class:: sphx-glr-script-out - - Out: - - .. code-block:: none - - Processing reads: 0%| | 0/10 [00:00` - - - - .. container:: sphx-glr-download sphx-glr-download-jupyter - - :download:`Download Jupyter notebook: plot_qc_example.ipynb ` - - -.. only:: html - - .. rst-class:: sphx-glr-signature - - `Gallery generated by Sphinx-Gallery `_ diff --git a/docs/html/_sources/auto_examples/qc_example.rst.txt b/docs/html/_sources/auto_examples/qc_example.rst.txt deleted file mode 100644 index baefb18c..00000000 --- a/docs/html/_sources/auto_examples/qc_example.rst.txt +++ /dev/null @@ -1,82 +0,0 @@ - -.. DO NOT EDIT. -.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. -.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: -.. "auto_examples/qc_example.py" -.. LINE NUMBERS ARE GIVEN BELOW. - -.. only:: html - - .. note:: - :class: sphx-glr-download-link-note - - Click :ref:`here ` - to download the full example code - -.. rst-class:: sphx-glr-example-title - -.. _sphx_glr_auto_examples_qc_example.py: - - -QC Report Example -=========================== - -This creates a qc report from the test bams - -.. GENERATED FROM PYTHON SOURCE LINES 8-13 - -Creating QC Report ------------------------- -Usually as a first step after receiving bam files, we want to do a quality check -and assess our data. This code generates a PDF report of important QC statistics -for long read methylation modification bam files - -.. GENERATED FROM PYTHON SOURCE LINES 13-25 - -.. code-block:: default - - - import dimelo as dm - import os - # first we specify the locations of our bam files - in_bam = "../dimelo/test/data/winnowmap_guppy_merge_subset.bam" - sample_name = "test" - out_dir = "../dimelo/dimelo_test" - - # next we run the "qc_report" function - dm.qc_report(in_bam, sample_name, out_dir) - # now our output directory that we specified, will have a file called - # "[sample_name]_qc_report.pdf" - # All code within this block can be easily executed all at once. - -.. rst-class:: sphx-glr-timing - - **Total running time of the script:** ( 0 minutes 0.000 seconds) - - -.. _sphx_glr_download_auto_examples_qc_example.py: - - -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: qc_example.py ` - - - - .. container:: sphx-glr-download sphx-glr-download-jupyter - - :download:`Download Jupyter notebook: qc_example.ipynb ` - - -.. only:: html - - .. rst-class:: sphx-glr-signature - - `Gallery generated by Sphinx-Gallery `_ diff --git a/docs/html/_sources/auto_examples/qc_report_example.rst.txt b/docs/html/_sources/auto_examples/qc_report_example.rst.txt deleted file mode 100644 index 3f05de67..00000000 --- a/docs/html/_sources/auto_examples/qc_report_example.rst.txt +++ /dev/null @@ -1,98 +0,0 @@ - -.. DO NOT EDIT. -.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. -.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: -.. "auto_examples/qc_report_example.py" -.. LINE NUMBERS ARE GIVEN BELOW. - -.. only:: html - - .. note:: - :class: sphx-glr-download-link-note - - Click :ref:`here ` - to download the full example code - -.. rst-class:: sphx-glr-example-title - -.. _sphx_glr_auto_examples_qc_report_example.py: - - -QC Report -=========================== - -Outputs quality control report from given bam files. - -.. GENERATED FROM PYTHON SOURCE LINES 9-12 - -Usually as a first step after receiving bam files, we want to do a quality check -and assess our data. This code generates a PDF report of important QC statistics -for modified base data from Nanopore sequencing. - -.. GENERATED FROM PYTHON SOURCE LINES 14-16 - -1. Python option ----------------- - -.. GENERATED FROM PYTHON SOURCE LINES 16-28 - -.. code-block:: default - - - import dimelo as dm - - # first we specify the locations of our bam files - bam = "winnowmap_guppy_merge_subset.bam" - sampleName = "CTCF" - outdir = "./out" - - # next we run the "qc_report" function - dm.qc_report(bam, sampleName, outdir) - # now our output directory will have a file called "CTCF_qc_report.pdf" - - -.. GENERATED FROM PYTHON SOURCE LINES 29-32 - -2. Command line option ----------------- -``dimelo-qc-report -f winnowmap_guppy_merge_subset.bam -s CTCF -o ./out`` - -.. GENERATED FROM PYTHON SOURCE LINES 35-39 - -Output ----------------------- -.. figure:: ../auto_examples/images/QC_Terminal_Output.png -.. figure:: ../auto_examples/images/CTCF_qc_report.png - - -.. rst-class:: sphx-glr-timing - - **Total running time of the script:** ( 0 minutes 0.000 seconds) - - -.. _sphx_glr_download_auto_examples_qc_report_example.py: - - -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: qc_report_example.py ` - - - - .. container:: sphx-glr-download sphx-glr-download-jupyter - - :download:`Download Jupyter notebook: qc_report_example.ipynb ` - - -.. only:: html - - .. rst-class:: sphx-glr-signature - - `Gallery generated by Sphinx-Gallery `_ diff --git a/docs/html/_sources/auto_examples/sg_execution_times.rst.txt b/docs/html/_sources/auto_examples/sg_execution_times.rst.txt deleted file mode 100644 index ad2f60ea..00000000 --- a/docs/html/_sources/auto_examples/sg_execution_times.rst.txt +++ /dev/null @@ -1,24 +0,0 @@ - -:orphan: - -.. _sphx_glr_auto_examples_sg_execution_times: - -Computation times -================= -**00:12.341** total execution time for **auto_examples** files: - -+-----------------------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_plot_qc_example.py` (``plot_qc_example.py``) | 00:12.341 | 0.0 MB | -+-----------------------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_browser_example.py` (``browser_example.py``) | 00:00.000 | 0.0 MB | -+-----------------------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_enrichment_multi_bam_example.py` (``enrichment_multi_bam_example.py``) | 00:00.000 | 0.0 MB | -+-----------------------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_enrichment_multi_bed_example.py` (``enrichment_multi_bed_example.py``) | 00:00.000 | 0.0 MB | -+-----------------------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_enrichment_profile_ma_mc_example.py` (``enrichment_profile_ma_mc_example.py``) | 00:00.000 | 0.0 MB | -+-----------------------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_enrichment_profile_overlay_example.py` (``enrichment_profile_overlay_example.py``) | 00:00.000 | 0.0 MB | -+-----------------------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_enrichment_profile_single_example.py` (``enrichment_profile_single_example.py``) | 00:00.000 | 0.0 MB | -+-----------------------------------------------------------------------------------------------------------------+-----------+--------+ diff --git a/docs/html/_sources/content/basecalling.rst.txt b/docs/html/_sources/content/basecalling.rst.txt deleted file mode 100644 index 864e8bc1..00000000 --- a/docs/html/_sources/content/basecalling.rst.txt +++ /dev/null @@ -1,28 +0,0 @@ -Basecalling & Alignment Suggestions -==================================== - -The dimelo package takes an aligned bam file with modified basecalls as input. Below, we offer some suggestions for performing the upstream basecalling and alignment. -The best basecalling and alignment methods will vary by use case, and the below suggestions are just what worked well for us. -ONT is also constantly improving basecalling, and these suggestions are likely to become outdated quickly. - -Suggestions ------------- - -1. Model we have used for m6A calling: - - * `res_dna_r941_min_modbases-all-context_v001 `__ - -2. We generally use Megalodon for both basecalling & alignment. Megalodon requires `Guppy `__. N.B. you may need to downgrade Megalodon and/or Guppy to find a compatible version combination. - - * `Megalodon `__ - -3. For exploring repetitve regions of the genome, we've found that Winnowmap performs better than the aligner Megalodon uses, `minimap2 `__. For repetitive regions, we use Guppy for basecalling and Winnowmap for alignment. - - * `Guppy `__ - * `Winnowmap `__ - -4. If using Guppy & Winnowmap, the resulting bam files must be combined to create a single bam with the modified basecalls from Guppy and the mapping information from Winnowmap. - - * `hybrid_guppy_winnnowmap_bam_creation `__ - -5. We perform basecalling separately from the sequencing run and use an EC2 instance (g4dn.metal) with multiple GPUs to speed up basecalling significantly. \ No newline at end of file diff --git a/docs/html/_sources/content/installation.rst.txt b/docs/html/_sources/content/installation.rst.txt deleted file mode 100644 index 53f067bf..00000000 --- a/docs/html/_sources/content/installation.rst.txt +++ /dev/null @@ -1,92 +0,0 @@ -Installation -==================== - -Requirements ------------- - -* `conda `__ -* python 3.7 - -Installation from Source ------------------------- - -1. Get the code. - -.. code:: bash - - git clone https://github.com/streetslab/dimelo.git - cd dimelo - -2. Create and activate a python 3.7 conda venv. - -Recommended to avoid package dependency install issues: - -Linux: - -.. code:: bash - - conda env create -f environment_linux.yml - conda activate dimelo - -MacOS: - -.. code:: bash - - conda env create -f environment_macOS.yml - conda activate dimelo - -Other option to create venv without using provided yml: - -.. code:: bash - - conda create --name dimelo python=3.7 - conda activate dimelo - -3. Install dimelo and its requirements. - -.. code:: bash - - pip install . - -4. Now the dimelo package is available for import. For example, you may import it like this: - -.. code:: bash - - python - ->>> import dimelo as dm - -And then call functions like this: - ->>> dm.function_name(...) - -Alternatively, functions can be accessed from the command line like this: - -.. code:: bash - - dimelo-function-name ... - - -Other notes ------------------------- - -* The dependency pybedtools requires that you have bedtools. Because this is not able to be installed with pip, if you did not create your environment from environment.yml, you must run: - -.. code:: bash - - conda install bedtools - -* If you would like to make changes to the package, you can install it in developer mode: - -.. code:: bash - - pip install -e . - -* Additionally, if making contributions to the codebase, install pre-commit, which will enforce the dimelo code style (black, flake8) on each of your commits: - -.. code:: bash - - pip install pre-commit - pre-commit install - - diff --git a/docs/html/_sources/content/reference/parse_bam.rst.txt b/docs/html/_sources/content/reference/parse_bam.rst.txt deleted file mode 100644 index 3f79c916..00000000 --- a/docs/html/_sources/content/reference/parse_bam.rst.txt +++ /dev/null @@ -1,12 +0,0 @@ -parse\_bam -================= - -.. currentmodule:: dimelo - -.. autofunction:: parse_bam - -.. sphinx_argparse_cli:: - :module: dimelo.parse_bam - :func: main - :hook: - :prog: dimelo-parse-bam diff --git a/docs/html/_sources/content/reference/plot_browser.rst.txt b/docs/html/_sources/content/reference/plot_browser.rst.txt deleted file mode 100644 index 14677413..00000000 --- a/docs/html/_sources/content/reference/plot_browser.rst.txt +++ /dev/null @@ -1,12 +0,0 @@ -plot\_browser -==================== - -.. currentmodule:: dimelo - -.. autofunction:: plot_browser - -.. sphinx_argparse_cli:: - :module: dimelo.plot_browser - :func: main - :hook: - :prog: dimelo-plot-browser diff --git a/docs/html/_sources/content/reference/plot_enrichment.rst.txt b/docs/html/_sources/content/reference/plot_enrichment.rst.txt deleted file mode 100644 index 9295e798..00000000 --- a/docs/html/_sources/content/reference/plot_enrichment.rst.txt +++ /dev/null @@ -1,12 +0,0 @@ -plot\_enrichment -======================= - -.. currentmodule:: dimelo - -.. autofunction:: plot_enrichment - -.. sphinx_argparse_cli:: - :module: dimelo.plot_enrichment - :func: main - :hook: - :prog: dimelo-plot-enrichment diff --git a/docs/html/_sources/content/reference/plot_enrichment_profile.rst.txt b/docs/html/_sources/content/reference/plot_enrichment_profile.rst.txt deleted file mode 100644 index 3ba1f125..00000000 --- a/docs/html/_sources/content/reference/plot_enrichment_profile.rst.txt +++ /dev/null @@ -1,12 +0,0 @@ -plot\_enrichment\_profile -================================ - -.. currentmodule:: dimelo - -.. autofunction:: plot_enrichment_profile - -.. sphinx_argparse_cli:: - :module: dimelo.plot_enrichment_profile - :func: main - :hook: - :prog: dimelo-plot-enrichment-profile diff --git a/docs/html/_sources/content/reference/qc_report.rst.txt b/docs/html/_sources/content/reference/qc_report.rst.txt deleted file mode 100644 index 4f45b6d4..00000000 --- a/docs/html/_sources/content/reference/qc_report.rst.txt +++ /dev/null @@ -1,12 +0,0 @@ -qc\_report -================= - -.. currentmodule:: dimelo - -.. autofunction:: qc_report - -.. sphinx_argparse_cli:: - :module: dimelo.qc - :func: main - :hook: - :prog: dimelo-qc-report diff --git a/docs/html/_sources/content/reference/tools.rst.txt b/docs/html/_sources/content/reference/tools.rst.txt deleted file mode 100644 index 337f3952..00000000 --- a/docs/html/_sources/content/reference/tools.rst.txt +++ /dev/null @@ -1,26 +0,0 @@ -Functions --------------- -+-------------------------------------------------+-----------------------+-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------+ -| function | type | input files | main output file(s) | -+=================================================+=======================+=====================================+============================================+===================================================================================+ -|:doc:`qc_report` | QC | 1 or more BAM | summary report with figures & table for read length, mapping quality, basecall quality, etc. | -+-------------------------------------------------+-----------------------+-------------------------------------+--------------------------------------------+-----------------------------------------------------------------------------------+ -|:doc:`plot_browser` | visualization | 1 or more BAM | single-molecule browser as html or pdf; aggregate browser plots and coverage | -+-------------------------------------------------+-----------------------+-------------------------------------+--------------------------------------------+-----------------------------------------------------------------------------------+ -|:doc:`plot_enrichment` | visualization | 1 or more BAM, 1 or more BED | barplot of fraction modified bases within region(s) defined by BED(s) | -+-------------------------------------------------+-----------------------+-------------------------------------+--------------------------------------------+-----------------------------------------------------------------------------------+ -|:doc:`plot_enrichment_profile` | visualization | 1 or more BAM, 1 or more BED | profile, single molecule plots, base abundance; option to overlay if input multiple BAM/BED | -+-------------------------------------------------+-----------------------+-------------------------------------+--------------------------------------------+-----------------------------------------------------------------------------------+ -|:doc:`parse_bam` | data formatting | 1 BAM | sql database (to allow for custom visualization) | -+-------------------------------------------------+-----------------------+-------------------------------------+--------------------------------------------+-----------------------------------------------------------------------------------+ - -.. toctree:: - :maxdepth: 2 - :hidden: - - qc_report - plot_browser - plot_enrichment - plot_enrichment_profile - parse_bam - \ No newline at end of file diff --git a/docs/html/_sources/content/tutorial.rst.txt b/docs/html/_sources/content/tutorial.rst.txt deleted file mode 100644 index bf077207..00000000 --- a/docs/html/_sources/content/tutorial.rst.txt +++ /dev/null @@ -1,74 +0,0 @@ -Tutorial -==================================== - -Follow the steps here to run the dimelo package with a test dataset. - -Files needed -------------- -Files can be found in directory: ``dimelo/test/data`` - -1. ctcf_demo.sorted.bam -2. ctcf_demo.sorted.bam.bai -3. ctcf_demo_peak.bed -4. ctcf_demo_not_peak.bed - -Steps -------------- -1. :doc:`../content/installation` -2. Run below commands and ensure your output matches the expected plots below. This tutorial walks through running functions from python, but the dimelo package can also be used from the command line (see :doc:`../auto_examples/index`). - ->>> import dimelo as dm ->>> bam = "dimelo/test/data/ctcf_demo.sorted.bam" ->>> sampleName = "CTCF_demo" ->>> outDir = "out" ->>> bedPeak = "dimelo/test/data/ctcf_demo_peak.bed" ->>> bedNotPeak = "dimelo/test/data/ctcf_demo_not_peak.bed" - ->>> dm.qc_report(bam, sampleName, outDir) - -.. image:: demo/CTCF_demo_qc_report.png - :align: center - ->>> dm.plot_enrichment(bam, ['CTCF_peak', 'CTCF_not_peak'], [bedPeak, bedNotPeak], "A", outDir, threshA=190) - -.. image:: demo/sample_ctcf_demo.sorted_A_enrichment_barplot.png - :align: center - ->>> dm.plot_enrichment_profile(bam, sampleName, bedPeak,"A+CG",outDir,threshA=190,threshC=190) - -Aggregate rolling average fraction of methylated bases - -.. image:: demo/CTCF_demo_A+CG_sm_rolling_avg.png - :align: center - -Single molecules with binary mA and mCpG colored - -.. image:: demo/CTCF_demo_A+CG_sm_scatter.png - :align: center - -A base count - -.. image:: demo/CTCF_demo_A_base_count.png - :align: center - -CG base count - -.. image:: demo/CTCF_demo_CG_base_count.png - :align: center - ->>> dm.plot_browser(bam, sampleName, "chr11:2086423-2091187", "A+CG", outDir, threshA=153, threshC=153, static=True, smooth=100, min_periods=10) - -.. image:: demo/methylation_browser_chr11_2086423_2091187.png - :align: center - -.. image:: demo/CTCF_demo_A_sm_rolling_avg_fraction.png - :align: center - -.. image:: demo/CTCF_demo_A_sm_rolling_avg_total.png - :align: center - -.. image:: demo/CTCF_demo_CG_sm_rolling_avg_fraction.png - :align: center - -.. image:: demo/CTCF_demo_CG_sm_rolling_avg_total.png - :align: center \ No newline at end of file diff --git a/docs/html/_sources/index.rst.txt b/docs/html/_sources/index.rst.txt deleted file mode 100644 index 9cb598ff..00000000 --- a/docs/html/_sources/index.rst.txt +++ /dev/null @@ -1,48 +0,0 @@ -dimelo -======== - -a python package & command line tool for analyzing DiMeLo-seq data - -Functions --------------- -+-------------------------------------------------+-----------------------+-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------+ -| function | type | input files | main output file(s) | -+=================================================+=======================+=====================================+============================================+===================================================================================+ -|:doc:`content/reference/qc_report` | QC | 1 or more BAM | summary report with figures & table for read length, mapping quality, basecall quality, etc. | -+-------------------------------------------------+-----------------------+-------------------------------------+--------------------------------------------+-----------------------------------------------------------------------------------+ -|:doc:`content/reference/plot_browser` | visualization | 1 or more BAM | single-molecule browser as html or pdf; aggregate browser plots and coverage | -+-------------------------------------------------+-----------------------+-------------------------------------+--------------------------------------------+-----------------------------------------------------------------------------------+ -|:doc:`content/reference/plot_enrichment` | visualization | 1 or more BAM, 1 or more BED | barplot of fraction modified bases within region(s) defined by BED(s) | -+-------------------------------------------------+-----------------------+-------------------------------------+--------------------------------------------+-----------------------------------------------------------------------------------+ -|:doc:`content/reference/plot_enrichment_profile` | visualization | 1 or more BAM, 1 or more BED | profile, single molecule plots, base abundance; option to overlay if input multiple BAM/BED | -+-------------------------------------------------+-----------------------+-------------------------------------+--------------------------------------------+-----------------------------------------------------------------------------------+ -|:doc:`content/reference/parse_bam` | data formatting | 1 BAM | sql database (to allow for custom visualization) | -+-------------------------------------------------+-----------------------+-------------------------------------+--------------------------------------------+-----------------------------------------------------------------------------------+ - -Resources ------------------------ - -:doc:`content/installation` - -:doc:`auto_examples/index` - -:doc:`content/basecalling` - -:doc:`content/tutorial` - -`Open Source Code `__ - -`DiMeLo-seq Protocol `__ - - -.. toctree:: - :maxdepth: 2 - :hidden: - - content/installation - content/reference/tools - auto_examples/index - content/basecalling - content/tutorial - - diff --git a/docs/html/_static/basic.css b/docs/html/_static/basic.css deleted file mode 100644 index bf18350b..00000000 --- a/docs/html/_static/basic.css +++ /dev/null @@ -1,906 +0,0 @@ -/* - * basic.css - * ~~~~~~~~~ - * - * Sphinx stylesheet -- basic theme. - * - * :copyright: Copyright 2007-2022 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: 450px; - 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; -} - -a.brackets:before, -span.brackets > a:before{ - content: "["; -} - -a.brackets:after, -span.brackets > a:after { - content: "]"; -} - -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; -} - -div.admonition, div.topic, blockquote { - clear: left; -} - -/* -- topics ---------------------------------------------------------------- */ - -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, -div.topic > :last-child, -div.admonition > :last-child { - margin-bottom: 0; -} - -div.sidebar::after, -aside.sidebar::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; -} - -table.footnote td, table.footnote th { - border: 0 !important; -} - -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; -} - -dl.footnote > dt, -dl.citation > dt { - float: left; - margin-right: 0.5em; -} - -dl.footnote > dd, -dl.citation > dd { - margin-bottom: 0em; -} - -dl.footnote > dd:after, -dl.citation > dd: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 > dt:after { - content: ":"; -} - -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/docs/html/_static/binder_badge_logo.svg b/docs/html/_static/binder_badge_logo.svg deleted file mode 100644 index 327f6b63..00000000 --- a/docs/html/_static/binder_badge_logo.svg +++ /dev/null @@ -1 +0,0 @@ - launchlaunchbinderbinder \ No newline at end of file diff --git a/docs/html/_static/broken_example.png b/docs/html/_static/broken_example.png deleted file mode 100644 index 4fea24e7..00000000 Binary files a/docs/html/_static/broken_example.png and /dev/null differ diff --git a/docs/html/_static/css/badge_only.css b/docs/html/_static/css/badge_only.css deleted file mode 100644 index e380325b..00000000 --- a/docs/html/_static/css/badge_only.css +++ /dev/null @@ -1 +0,0 @@ -.fa:before{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} \ No newline at end of file diff --git a/docs/html/_static/css/fonts/Roboto-Slab-Bold.woff b/docs/html/_static/css/fonts/Roboto-Slab-Bold.woff deleted file mode 100644 index 6cb60000..00000000 Binary files a/docs/html/_static/css/fonts/Roboto-Slab-Bold.woff and /dev/null differ diff --git a/docs/html/_static/css/fonts/Roboto-Slab-Bold.woff2 b/docs/html/_static/css/fonts/Roboto-Slab-Bold.woff2 deleted file mode 100644 index 7059e231..00000000 Binary files a/docs/html/_static/css/fonts/Roboto-Slab-Bold.woff2 and /dev/null differ diff --git a/docs/html/_static/css/fonts/Roboto-Slab-Regular.woff b/docs/html/_static/css/fonts/Roboto-Slab-Regular.woff deleted file mode 100644 index f815f63f..00000000 Binary files a/docs/html/_static/css/fonts/Roboto-Slab-Regular.woff and /dev/null differ diff --git a/docs/html/_static/css/fonts/Roboto-Slab-Regular.woff2 b/docs/html/_static/css/fonts/Roboto-Slab-Regular.woff2 deleted file mode 100644 index f2c76e5b..00000000 Binary files a/docs/html/_static/css/fonts/Roboto-Slab-Regular.woff2 and /dev/null differ diff --git a/docs/html/_static/css/fonts/fontawesome-webfont.eot b/docs/html/_static/css/fonts/fontawesome-webfont.eot deleted file mode 100644 index e9f60ca9..00000000 Binary files a/docs/html/_static/css/fonts/fontawesome-webfont.eot and /dev/null differ diff --git a/docs/html/_static/css/fonts/fontawesome-webfont.svg b/docs/html/_static/css/fonts/fontawesome-webfont.svg deleted file mode 100644 index 855c845e..00000000 --- a/docs/html/_static/css/fonts/fontawesome-webfont.svg +++ /dev/null @@ -1,2671 +0,0 @@ - - - - -Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 - By ,,, -Copyright Dave Gandy 2016. All rights reserved. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/html/_static/css/fonts/fontawesome-webfont.ttf b/docs/html/_static/css/fonts/fontawesome-webfont.ttf deleted file mode 100644 index 35acda2f..00000000 Binary files a/docs/html/_static/css/fonts/fontawesome-webfont.ttf and /dev/null differ diff --git a/docs/html/_static/css/fonts/fontawesome-webfont.woff b/docs/html/_static/css/fonts/fontawesome-webfont.woff deleted file mode 100644 index 400014a4..00000000 Binary files a/docs/html/_static/css/fonts/fontawesome-webfont.woff and /dev/null differ diff --git a/docs/html/_static/css/fonts/fontawesome-webfont.woff2 b/docs/html/_static/css/fonts/fontawesome-webfont.woff2 deleted file mode 100644 index 4d13fc60..00000000 Binary files a/docs/html/_static/css/fonts/fontawesome-webfont.woff2 and /dev/null differ diff --git a/docs/html/_static/css/fonts/lato-bold-italic.woff b/docs/html/_static/css/fonts/lato-bold-italic.woff deleted file mode 100644 index 88ad05b9..00000000 Binary files a/docs/html/_static/css/fonts/lato-bold-italic.woff and /dev/null differ diff --git a/docs/html/_static/css/fonts/lato-bold-italic.woff2 b/docs/html/_static/css/fonts/lato-bold-italic.woff2 deleted file mode 100644 index c4e3d804..00000000 Binary files a/docs/html/_static/css/fonts/lato-bold-italic.woff2 and /dev/null differ diff --git a/docs/html/_static/css/fonts/lato-bold.woff b/docs/html/_static/css/fonts/lato-bold.woff deleted file mode 100644 index c6dff51f..00000000 Binary files a/docs/html/_static/css/fonts/lato-bold.woff and /dev/null differ diff --git a/docs/html/_static/css/fonts/lato-bold.woff2 b/docs/html/_static/css/fonts/lato-bold.woff2 deleted file mode 100644 index bb195043..00000000 Binary files a/docs/html/_static/css/fonts/lato-bold.woff2 and /dev/null differ diff --git a/docs/html/_static/css/fonts/lato-normal-italic.woff b/docs/html/_static/css/fonts/lato-normal-italic.woff deleted file mode 100644 index 76114bc0..00000000 Binary files a/docs/html/_static/css/fonts/lato-normal-italic.woff and /dev/null differ diff --git a/docs/html/_static/css/fonts/lato-normal-italic.woff2 b/docs/html/_static/css/fonts/lato-normal-italic.woff2 deleted file mode 100644 index 3404f37e..00000000 Binary files a/docs/html/_static/css/fonts/lato-normal-italic.woff2 and /dev/null differ diff --git a/docs/html/_static/css/fonts/lato-normal.woff b/docs/html/_static/css/fonts/lato-normal.woff deleted file mode 100644 index ae1307ff..00000000 Binary files a/docs/html/_static/css/fonts/lato-normal.woff and /dev/null differ diff --git a/docs/html/_static/css/fonts/lato-normal.woff2 b/docs/html/_static/css/fonts/lato-normal.woff2 deleted file mode 100644 index 3bf98433..00000000 Binary files a/docs/html/_static/css/fonts/lato-normal.woff2 and /dev/null differ diff --git a/docs/html/_static/css/theme.css b/docs/html/_static/css/theme.css deleted file mode 100644 index 0d9ae7e1..00000000 --- a/docs/html/_static/css/theme.css +++ /dev/null @@ -1,4 +0,0 @@ -html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,.wy-nav-top a,.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! - * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome - * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs li{display:inline-block}.wy-breadcrumbs li.wy-breadcrumbs-aside{float:right}.wy-breadcrumbs li a{display:inline-block;padding:5px}.wy-breadcrumbs li a:first-child{padding-left:0}.rst-content .wy-breadcrumbs li tt,.wy-breadcrumbs li .rst-content tt,.wy-breadcrumbs li code{padding:5px;border:none;background:none}.rst-content .wy-breadcrumbs li tt.literal,.wy-breadcrumbs li .rst-content tt.literal,.wy-breadcrumbs li code.literal{color:#404040}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.field-list>dt:after,html.writer-html5 .rst-content dl.footnote>dt:after{content:":"}html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.footnote>dt>span.brackets{margin-right:.5rem}html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{font-style:italic}html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.footnote>dd p,html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{font-size:inherit;line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.field-list)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dl:not(.field-list)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.field-list)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dl:not(.field-list)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel{border:1px solid #7fbbe3;background:#e7f2fa;font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/docs/html/_static/doctools.js b/docs/html/_static/doctools.js deleted file mode 100644 index e509e483..00000000 --- a/docs/html/_static/doctools.js +++ /dev/null @@ -1,326 +0,0 @@ -/* - * doctools.js - * ~~~~~~~~~~~ - * - * Sphinx JavaScript utilities for all documentation. - * - * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -/** - * select a different prefix for underscore - */ -$u = _.noConflict(); - -/** - * make the code below compatible with browsers without - * an installed firebug like debugger -if (!window.console || !console.firebug) { - var names = ["log", "debug", "info", "warn", "error", "assert", "dir", - "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", - "profile", "profileEnd"]; - window.console = {}; - for (var i = 0; i < names.length; ++i) - window.console[names[i]] = function() {}; -} - */ - -/** - * 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; -} - -/** - * Small JavaScript module for the documentation. - */ -var Documentation = { - - init : function() { - this.fixFirefoxAnchorBug(); - this.highlightSearchWords(); - this.initIndexTable(); - if (DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) { - this.initOnKeyListeners(); - } - }, - - /** - * i18n support - */ - TRANSLATIONS : {}, - PLURAL_EXPR : function(n) { return 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 : function(string) { - var translated = Documentation.TRANSLATIONS[string]; - if (typeof translated === 'undefined') - return string; - return (typeof translated === 'string') ? translated : translated[0]; - }, - - ngettext : function(singular, plural, n) { - var translated = Documentation.TRANSLATIONS[singular]; - if (typeof translated === 'undefined') - return (n == 1) ? singular : plural; - return translated[Documentation.PLURALEXPR(n)]; - }, - - addTranslations : function(catalog) { - for (var key in catalog.messages) - this.TRANSLATIONS[key] = catalog.messages[key]; - this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); - this.LOCALE = catalog.locale; - }, - - /** - * add context elements like header anchor links - */ - addContextElements : function() { - $('div[id] > :header:first').each(function() { - $('\u00B6'). - attr('href', '#' + this.id). - attr('title', _('Permalink to this headline')). - appendTo(this); - }); - $('dt[id]').each(function() { - $('\u00B6'). - attr('href', '#' + this.id). - attr('title', _('Permalink to this definition')). - appendTo(this); - }); - }, - - /** - * workaround a firefox stupidity - * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075 - */ - fixFirefoxAnchorBug : function() { - if (document.location.hash && $.browser.mozilla) - window.setTimeout(function() { - document.location.href += ''; - }, 10); - }, - - /** - * highlight the search words provided in the url in the text - */ - highlightSearchWords : function() { - var params = $.getQueryParameters(); - var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; - if (terms.length) { - var body = $('div.body'); - if (!body.length) { - body = $('body'); - } - window.setTimeout(function() { - $.each(terms, function() { - body.highlightText(this.toLowerCase(), 'highlighted'); - }); - }, 10); - $('') - .appendTo($('#searchbox')); - } - }, - - /** - * init the domain index toggle buttons - */ - initIndexTable : function() { - var togglers = $('img.toggler').click(function() { - var src = $(this).attr('src'); - var idnum = $(this).attr('id').substr(7); - $('tr.cg-' + idnum).toggle(); - if (src.substr(-9) === 'minus.png') - $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); - else - $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); - }).css('display', ''); - if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { - togglers.click(); - } - }, - - /** - * helper function to hide the search marks again - */ - hideSearchWords : function() { - $('#searchbox .highlight-link').fadeOut(300); - $('span.highlighted').removeClass('highlighted'); - var url = new URL(window.location); - url.searchParams.delete('highlight'); - window.history.replaceState({}, '', url); - }, - - /** - * make the url absolute - */ - makeURL : function(relativeURL) { - return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; - }, - - /** - * get the current relative url - */ - getCurrentURL : function() { - var path = document.location.pathname; - var parts = path.split(/\//); - $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { - if (this === '..') - parts.pop(); - }); - var url = parts.join('/'); - return path.substring(url.lastIndexOf('/') + 1, path.length - 1); - }, - - initOnKeyListeners: function() { - $(document).keydown(function(event) { - var activeElementType = document.activeElement.tagName; - // don't navigate when in search box, textarea, dropdown or button - if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT' - && activeElementType !== 'BUTTON' && !event.altKey && !event.ctrlKey && !event.metaKey - && !event.shiftKey) { - switch (event.keyCode) { - case 37: // left - var prevHref = $('link[rel="prev"]').prop('href'); - if (prevHref) { - window.location.href = prevHref; - return false; - } - break; - case 39: // right - var nextHref = $('link[rel="next"]').prop('href'); - if (nextHref) { - window.location.href = nextHref; - return false; - } - break; - } - } - }); - } -}; - -// quick alias for translations -_ = Documentation.gettext; - -$(document).ready(function() { - Documentation.init(); -}); diff --git a/docs/html/_static/documentation_options.js b/docs/html/_static/documentation_options.js deleted file mode 100644 index 2fa8c97f..00000000 --- a/docs/html/_static/documentation_options.js +++ /dev/null @@ -1,12 +0,0 @@ -var DOCUMENTATION_OPTIONS = { - URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), - VERSION: '', - LANGUAGE: 'None', - COLLAPSE_INDEX: false, - BUILDER: 'html', - FILE_SUFFIX: '.html', - LINK_SUFFIX: '.html', - HAS_SOURCE: true, - SOURCELINK_SUFFIX: '.txt', - NAVIGATION_WITH_KEYS: false -}; \ No newline at end of file diff --git a/docs/html/_static/file.png b/docs/html/_static/file.png deleted file mode 100644 index a858a410..00000000 Binary files a/docs/html/_static/file.png and /dev/null differ diff --git a/docs/html/_static/jquery-3.5.1.js b/docs/html/_static/jquery-3.5.1.js deleted file mode 100644 index 50937333..00000000 --- a/docs/html/_static/jquery-3.5.1.js +++ /dev/null @@ -1,10872 +0,0 @@ -/*! - * jQuery JavaScript Library v3.5.1 - * https://jquery.com/ - * - * Includes Sizzle.js - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://jquery.org/license - * - * Date: 2020-05-04T22:49Z - */ -( function( global, factory ) { - - "use strict"; - - if ( typeof module === "object" && typeof module.exports === "object" ) { - - // For CommonJS and CommonJS-like environments where a proper `window` - // is present, execute the factory and get jQuery. - // For environments that do not have a `window` with a `document` - // (such as Node.js), expose a factory as module.exports. - // This accentuates the need for the creation of a real `window`. - // e.g. var jQuery = require("jquery")(window); - // See ticket #14549 for more info. - module.exports = global.document ? - factory( global, true ) : - function( w ) { - if ( !w.document ) { - throw new Error( "jQuery requires a window with a document" ); - } - return factory( w ); - }; - } else { - factory( global ); - } - -// Pass this if window is not defined yet -} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { - -// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 -// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode -// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common -// enough that all such attempts are guarded in a try block. -"use strict"; - -var arr = []; - -var getProto = Object.getPrototypeOf; - -var slice = arr.slice; - -var flat = arr.flat ? function( array ) { - return arr.flat.call( array ); -} : function( array ) { - return arr.concat.apply( [], array ); -}; - - -var push = arr.push; - -var indexOf = arr.indexOf; - -var class2type = {}; - -var toString = class2type.toString; - -var hasOwn = class2type.hasOwnProperty; - -var fnToString = hasOwn.toString; - -var ObjectFunctionString = fnToString.call( Object ); - -var support = {}; - -var isFunction = function isFunction( obj ) { - - // Support: Chrome <=57, Firefox <=52 - // In some browsers, typeof returns "function" for HTML elements - // (i.e., `typeof document.createElement( "object" ) === "function"`). - // We don't want to classify *any* DOM node as a function. - return typeof obj === "function" && typeof obj.nodeType !== "number"; - }; - - -var isWindow = function isWindow( obj ) { - return obj != null && obj === obj.window; - }; - - -var document = window.document; - - - - var preservedScriptAttributes = { - type: true, - src: true, - nonce: true, - noModule: true - }; - - function DOMEval( code, node, doc ) { - doc = doc || document; - - var i, val, - script = doc.createElement( "script" ); - - script.text = code; - if ( node ) { - for ( i in preservedScriptAttributes ) { - - // Support: Firefox 64+, Edge 18+ - // Some browsers don't support the "nonce" property on scripts. - // On the other hand, just using `getAttribute` is not enough as - // the `nonce` attribute is reset to an empty string whenever it - // becomes browsing-context connected. - // See https://github.com/whatwg/html/issues/2369 - // See https://html.spec.whatwg.org/#nonce-attributes - // The `node.getAttribute` check was added for the sake of - // `jQuery.globalEval` so that it can fake a nonce-containing node - // via an object. - val = node[ i ] || node.getAttribute && node.getAttribute( i ); - if ( val ) { - script.setAttribute( i, val ); - } - } - } - doc.head.appendChild( script ).parentNode.removeChild( script ); - } - - -function toType( obj ) { - if ( obj == null ) { - return obj + ""; - } - - // Support: Android <=2.3 only (functionish RegExp) - return typeof obj === "object" || typeof obj === "function" ? - class2type[ toString.call( obj ) ] || "object" : - typeof obj; -} -/* global Symbol */ -// Defining this global in .eslintrc.json would create a danger of using the global -// unguarded in another place, it seems safer to define global only for this module - - - -var - version = "3.5.1", - - // Define a local copy of jQuery - jQuery = function( selector, context ) { - - // The jQuery object is actually just the init constructor 'enhanced' - // Need init if jQuery is called (just allow error to be thrown if not included) - return new jQuery.fn.init( selector, context ); - }; - -jQuery.fn = jQuery.prototype = { - - // The current version of jQuery being used - jquery: version, - - constructor: jQuery, - - // The default length of a jQuery object is 0 - length: 0, - - toArray: function() { - return slice.call( this ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - - // Return all the elements in a clean array - if ( num == null ) { - return slice.call( this ); - } - - // Return just the one element from the set - return num < 0 ? this[ num + this.length ] : this[ num ]; - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems ) { - - // Build a new jQuery matched element set - var ret = jQuery.merge( this.constructor(), elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - each: function( callback ) { - return jQuery.each( this, callback ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map( this, function( elem, i ) { - return callback.call( elem, i, elem ); - } ) ); - }, - - slice: function() { - return this.pushStack( slice.apply( this, arguments ) ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - even: function() { - return this.pushStack( jQuery.grep( this, function( _elem, i ) { - return ( i + 1 ) % 2; - } ) ); - }, - - odd: function() { - return this.pushStack( jQuery.grep( this, function( _elem, i ) { - return i % 2; - } ) ); - }, - - eq: function( i ) { - var len = this.length, - j = +i + ( i < 0 ? len : 0 ); - return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); - }, - - end: function() { - return this.prevObject || this.constructor(); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: arr.sort, - splice: arr.splice -}; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[ 0 ] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - - // Skip the boolean and the target - target = arguments[ i ] || {}; - i++; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !isFunction( target ) ) { - target = {}; - } - - // Extend jQuery itself if only one argument is passed - if ( i === length ) { - target = this; - i--; - } - - for ( ; i < length; i++ ) { - - // Only deal with non-null/undefined values - if ( ( options = arguments[ i ] ) != null ) { - - // Extend the base object - for ( name in options ) { - copy = options[ name ]; - - // Prevent Object.prototype pollution - // Prevent never-ending loop - if ( name === "__proto__" || target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject( copy ) || - ( copyIsArray = Array.isArray( copy ) ) ) ) { - src = target[ name ]; - - // Ensure proper type for the source value - if ( copyIsArray && !Array.isArray( src ) ) { - clone = []; - } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { - clone = {}; - } else { - clone = src; - } - copyIsArray = false; - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend( { - - // Unique for each copy of jQuery on the page - expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), - - // Assume jQuery is ready without the ready module - isReady: true, - - error: function( msg ) { - throw new Error( msg ); - }, - - noop: function() {}, - - isPlainObject: function( obj ) { - var proto, Ctor; - - // Detect obvious negatives - // Use toString instead of jQuery.type to catch host objects - if ( !obj || toString.call( obj ) !== "[object Object]" ) { - return false; - } - - proto = getProto( obj ); - - // Objects with no prototype (e.g., `Object.create( null )`) are plain - if ( !proto ) { - return true; - } - - // Objects with prototype are plain iff they were constructed by a global Object function - Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; - return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; - }, - - isEmptyObject: function( obj ) { - var name; - - for ( name in obj ) { - return false; - } - return true; - }, - - // Evaluates a script in a provided context; falls back to the global one - // if not specified. - globalEval: function( code, options, doc ) { - DOMEval( code, { nonce: options && options.nonce }, doc ); - }, - - each: function( obj, callback ) { - var length, i = 0; - - if ( isArrayLike( obj ) ) { - length = obj.length; - for ( ; i < length; i++ ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } else { - for ( i in obj ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } - - return obj; - }, - - // results is for internal usage only - makeArray: function( arr, results ) { - var ret = results || []; - - if ( arr != null ) { - if ( isArrayLike( Object( arr ) ) ) { - jQuery.merge( ret, - typeof arr === "string" ? - [ arr ] : arr - ); - } else { - push.call( ret, arr ); - } - } - - return ret; - }, - - inArray: function( elem, arr, i ) { - return arr == null ? -1 : indexOf.call( arr, elem, i ); - }, - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - merge: function( first, second ) { - var len = +second.length, - j = 0, - i = first.length; - - for ( ; j < len; j++ ) { - first[ i++ ] = second[ j ]; - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, invert ) { - var callbackInverse, - matches = [], - i = 0, - length = elems.length, - callbackExpect = !invert; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - callbackInverse = !callback( elems[ i ], i ); - if ( callbackInverse !== callbackExpect ) { - matches.push( elems[ i ] ); - } - } - - return matches; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var length, value, - i = 0, - ret = []; - - // Go through the array, translating each of the items to their new values - if ( isArrayLike( elems ) ) { - length = elems.length; - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - - // Go through every key on the object, - } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - } - - // Flatten any nested arrays - return flat( ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // jQuery.support is not used in Core but other projects attach their - // properties to it so it needs to exist. - support: support -} ); - -if ( typeof Symbol === "function" ) { - jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; -} - -// Populate the class2type map -jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), -function( _i, name ) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -} ); - -function isArrayLike( obj ) { - - // Support: real iOS 8.2 only (not reproducible in simulator) - // `in` check used to prevent JIT error (gh-2145) - // hasOwn isn't used here due to false negatives - // regarding Nodelist length in IE - var length = !!obj && "length" in obj && obj.length, - type = toType( obj ); - - if ( isFunction( obj ) || isWindow( obj ) ) { - return false; - } - - return type === "array" || length === 0 || - typeof length === "number" && length > 0 && ( length - 1 ) in obj; -} -var Sizzle = -/*! - * Sizzle CSS Selector Engine v2.3.5 - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://js.foundation/ - * - * Date: 2020-03-14 - */ -( function( window ) { -var i, - support, - Expr, - getText, - isXML, - tokenize, - compile, - select, - outermostContext, - sortInput, - hasDuplicate, - - // Local document vars - setDocument, - document, - docElem, - documentIsHTML, - rbuggyQSA, - rbuggyMatches, - matches, - contains, - - // Instance-specific data - expando = "sizzle" + 1 * new Date(), - preferredDoc = window.document, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - nonnativeSelectorCache = createCache(), - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - } - return 0; - }, - - // Instance methods - hasOwn = ( {} ).hasOwnProperty, - arr = [], - pop = arr.pop, - pushNative = arr.push, - push = arr.push, - slice = arr.slice, - - // Use a stripped-down indexOf as it's faster than native - // https://jsperf.com/thor-indexof-vs-for/5 - indexOf = function( list, elem ) { - var i = 0, - len = list.length; - for ( ; i < len; i++ ) { - if ( list[ i ] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + - "ismap|loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - - // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram - identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + - "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", - - // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + - - // Operator (capture 2) - "*([*^$|!~]?=)" + whitespace + - - // "Attribute values must be CSS identifiers [capture 5] - // or strings [capture 3 or capture 4]" - "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + - whitespace + "*\\]", - - pseudos = ":(" + identifier + ")(?:\\((" + - - // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: - // 1. quoted (capture 3; capture 4 or capture 5) - "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + - - // 2. simple (capture 6) - "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + - - // 3. anything else (capture 2) - ".*" + - ")\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rwhitespace = new RegExp( whitespace + "+", "g" ), - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + - whitespace + "+$", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + - "*" ), - rdescend = new RegExp( whitespace + "|>" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - "ID": new RegExp( "^#(" + identifier + ")" ), - "CLASS": new RegExp( "^\\.(" + identifier + ")" ), - "TAG": new RegExp( "^(" + identifier + "|[*])" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + - whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + - whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), - - // For use in libraries implementing .is() - // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + - "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + - "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rhtml = /HTML$/i, - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - rnative = /^[^{]+\{\s*\[native \w/, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rsibling = /[+~]/, - - // CSS escapes - // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), - funescape = function( escape, nonHex ) { - var high = "0x" + escape.slice( 1 ) - 0x10000; - - return nonHex ? - - // Strip the backslash prefix from a non-hex escape sequence - nonHex : - - // Replace a hexadecimal escape sequence with the encoded Unicode code point - // Support: IE <=11+ - // For values outside the Basic Multilingual Plane (BMP), manually construct a - // surrogate pair - high < 0 ? - String.fromCharCode( high + 0x10000 ) : - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }, - - // CSS string/identifier serialization - // https://drafts.csswg.org/cssom/#common-serializing-idioms - rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, - fcssescape = function( ch, asCodePoint ) { - if ( asCodePoint ) { - - // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER - if ( ch === "\0" ) { - return "\uFFFD"; - } - - // Control characters and (dependent upon position) numbers get escaped as code points - return ch.slice( 0, -1 ) + "\\" + - ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; - } - - // Other potentially-special ASCII characters get backslash-escaped - return "\\" + ch; - }, - - // Used for iframes - // See setDocument() - // Removing the function wrapper causes a "Permission Denied" - // error in IE - unloadHandler = function() { - setDocument(); - }, - - inDisabledFieldset = addCombinator( - function( elem ) { - return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; - }, - { dir: "parentNode", next: "legend" } - ); - -// Optimize for push.apply( _, NodeList ) -try { - push.apply( - ( arr = slice.call( preferredDoc.childNodes ) ), - preferredDoc.childNodes - ); - - // Support: Android<4.0 - // Detect silently failing push.apply - // eslint-disable-next-line no-unused-expressions - arr[ preferredDoc.childNodes.length ].nodeType; -} catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { - pushNative.apply( target, slice.call( els ) ); - } : - - // Support: IE<9 - // Otherwise append directly - function( target, els ) { - var j = target.length, - i = 0; - - // Can't trust NodeList.length - while ( ( target[ j++ ] = els[ i++ ] ) ) {} - target.length = j - 1; - } - }; -} - -function Sizzle( selector, context, results, seed ) { - var m, i, elem, nid, match, groups, newSelector, - newContext = context && context.ownerDocument, - - // nodeType defaults to 9, since context defaults to document - nodeType = context ? context.nodeType : 9; - - results = results || []; - - // Return early from calls with invalid selector or context - if ( typeof selector !== "string" || !selector || - nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { - - return results; - } - - // Try to shortcut find operations (as opposed to filters) in HTML documents - if ( !seed ) { - setDocument( context ); - context = context || document; - - if ( documentIsHTML ) { - - // If the selector is sufficiently simple, try using a "get*By*" DOM method - // (excepting DocumentFragment context, where the methods don't exist) - if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { - - // ID selector - if ( ( m = match[ 1 ] ) ) { - - // Document context - if ( nodeType === 9 ) { - if ( ( elem = context.getElementById( m ) ) ) { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( elem.id === m ) { - results.push( elem ); - return results; - } - } else { - return results; - } - - // Element context - } else { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( newContext && ( elem = newContext.getElementById( m ) ) && - contains( context, elem ) && - elem.id === m ) { - - results.push( elem ); - return results; - } - } - - // Type selector - } else if ( match[ 2 ] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Class selector - } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName && - context.getElementsByClassName ) { - - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // Take advantage of querySelectorAll - if ( support.qsa && - !nonnativeSelectorCache[ selector + " " ] && - ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && - - // Support: IE 8 only - // Exclude object elements - ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { - - newSelector = selector; - newContext = context; - - // qSA considers elements outside a scoping root when evaluating child or - // descendant combinators, which is not what we want. - // In such cases, we work around the behavior by prefixing every selector in the - // list with an ID selector referencing the scope context. - // The technique has to be used as well when a leading combinator is used - // as such selectors are not recognized by querySelectorAll. - // Thanks to Andrew Dupont for this technique. - if ( nodeType === 1 && - ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) { - - // Expand context for sibling selectors - newContext = rsibling.test( selector ) && testContext( context.parentNode ) || - context; - - // We can use :scope instead of the ID hack if the browser - // supports it & if we're not changing the context. - if ( newContext !== context || !support.scope ) { - - // Capture the context ID, setting it first if necessary - if ( ( nid = context.getAttribute( "id" ) ) ) { - nid = nid.replace( rcssescape, fcssescape ); - } else { - context.setAttribute( "id", ( nid = expando ) ); - } - } - - // Prefix every selector in the list - groups = tokenize( selector ); - i = groups.length; - while ( i-- ) { - groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + - toSelector( groups[ i ] ); - } - newSelector = groups.join( "," ); - } - - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch ( qsaError ) { - nonnativeSelectorCache( selector, true ); - } finally { - if ( nid === expando ) { - context.removeAttribute( "id" ); - } - } - } - } - } - - // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); -} - -/** - * Create key-value caches of limited size - * @returns {function(string, object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ -function createCache() { - var keys = []; - - function cache( key, value ) { - - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) - if ( keys.push( key + " " ) > Expr.cacheLength ) { - - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return ( cache[ key + " " ] = value ); - } - return cache; -} - -/** - * Mark a function for special use by Sizzle - * @param {Function} fn The function to mark - */ -function markFunction( fn ) { - fn[ expando ] = true; - return fn; -} - -/** - * Support testing using an element - * @param {Function} fn Passed the created element and returns a boolean result - */ -function assert( fn ) { - var el = document.createElement( "fieldset" ); - - try { - return !!fn( el ); - } catch ( e ) { - return false; - } finally { - - // Remove from its parent by default - if ( el.parentNode ) { - el.parentNode.removeChild( el ); - } - - // release memory in IE - el = null; - } -} - -/** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ -function addHandle( attrs, handler ) { - var arr = attrs.split( "|" ), - i = arr.length; - - while ( i-- ) { - Expr.attrHandle[ arr[ i ] ] = handler; - } -} - -/** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ -function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - a.sourceIndex - b.sourceIndex; - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( ( cur = cur.nextSibling ) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; -} - -/** - * Returns a function to use in pseudos for input types - * @param {String} type - */ -function createInputPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ -function createButtonPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return ( name === "input" || name === "button" ) && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for :enabled/:disabled - * @param {Boolean} disabled true for :disabled; false for :enabled - */ -function createDisabledPseudo( disabled ) { - - // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable - return function( elem ) { - - // Only certain elements can match :enabled or :disabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled - if ( "form" in elem ) { - - // Check for inherited disabledness on relevant non-disabled elements: - // * listed form-associated elements in a disabled fieldset - // https://html.spec.whatwg.org/multipage/forms.html#category-listed - // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled - // * option elements in a disabled optgroup - // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled - // All such elements have a "form" property. - if ( elem.parentNode && elem.disabled === false ) { - - // Option elements defer to a parent optgroup if present - if ( "label" in elem ) { - if ( "label" in elem.parentNode ) { - return elem.parentNode.disabled === disabled; - } else { - return elem.disabled === disabled; - } - } - - // Support: IE 6 - 11 - // Use the isDisabled shortcut property to check for disabled fieldset ancestors - return elem.isDisabled === disabled || - - // Where there is no isDisabled, check manually - /* jshint -W018 */ - elem.isDisabled !== !disabled && - inDisabledFieldset( elem ) === disabled; - } - - return elem.disabled === disabled; - - // Try to winnow out elements that can't be disabled before trusting the disabled property. - // Some victims get caught in our net (label, legend, menu, track), but it shouldn't - // even exist on them, let alone have a boolean value. - } else if ( "label" in elem ) { - return elem.disabled === disabled; - } - - // Remaining elements are neither :enabled nor :disabled - return false; - }; -} - -/** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */ -function createPositionalPseudo( fn ) { - return markFunction( function( argument ) { - argument = +argument; - return markFunction( function( seed, matches ) { - var j, - matchIndexes = fn( [], seed.length, argument ), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while ( i-- ) { - if ( seed[ ( j = matchIndexes[ i ] ) ] ) { - seed[ j ] = !( matches[ j ] = seed[ j ] ); - } - } - } ); - } ); -} - -/** - * Checks a node for validity as a Sizzle context - * @param {Element|Object=} context - * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value - */ -function testContext( context ) { - return context && typeof context.getElementsByTagName !== "undefined" && context; -} - -// Expose support vars for convenience -support = Sizzle.support = {}; - -/** - * Detects XML nodes - * @param {Element|Object} elem An element or a document - * @returns {Boolean} True iff elem is a non-HTML XML node - */ -isXML = Sizzle.isXML = function( elem ) { - var namespace = elem.namespaceURI, - docElem = ( elem.ownerDocument || elem ).documentElement; - - // Support: IE <=8 - // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes - // https://bugs.jquery.com/ticket/4833 - return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); -}; - -/** - * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document - * @returns {Object} Returns the current document - */ -setDocument = Sizzle.setDocument = function( node ) { - var hasCompare, subWindow, - doc = node ? node.ownerDocument || node : preferredDoc; - - // Return early if doc is invalid or already selected - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { - return document; - } - - // Update global variables - document = doc; - docElem = document.documentElement; - documentIsHTML = !isXML( document ); - - // Support: IE 9 - 11+, Edge 12 - 18+ - // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( preferredDoc != document && - ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { - - // Support: IE 11, Edge - if ( subWindow.addEventListener ) { - subWindow.addEventListener( "unload", unloadHandler, false ); - - // Support: IE 9 - 10 only - } else if ( subWindow.attachEvent ) { - subWindow.attachEvent( "onunload", unloadHandler ); - } - } - - // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, - // Safari 4 - 5 only, Opera <=11.6 - 12.x only - // IE/Edge & older browsers don't support the :scope pseudo-class. - // Support: Safari 6.0 only - // Safari 6.0 supports :scope but it's an alias of :root there. - support.scope = assert( function( el ) { - docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); - return typeof el.querySelectorAll !== "undefined" && - !el.querySelectorAll( ":scope fieldset div" ).length; - } ); - - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties - // (excepting IE8 booleans) - support.attributes = assert( function( el ) { - el.className = "i"; - return !el.getAttribute( "className" ); - } ); - - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert( function( el ) { - el.appendChild( document.createComment( "" ) ); - return !el.getElementsByTagName( "*" ).length; - } ); - - // Support: IE<9 - support.getElementsByClassName = rnative.test( document.getElementsByClassName ); - - // Support: IE<10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programmatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert( function( el ) { - docElem.appendChild( el ).id = expando; - return !document.getElementsByName || !document.getElementsByName( expando ).length; - } ); - - // ID filter and find - if ( support.getById ) { - Expr.filter[ "ID" ] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - return elem.getAttribute( "id" ) === attrId; - }; - }; - Expr.find[ "ID" ] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var elem = context.getElementById( id ); - return elem ? [ elem ] : []; - } - }; - } else { - Expr.filter[ "ID" ] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - var node = typeof elem.getAttributeNode !== "undefined" && - elem.getAttributeNode( "id" ); - return node && node.value === attrId; - }; - }; - - // Support: IE 6 - 7 only - // getElementById is not reliable as a find shortcut - Expr.find[ "ID" ] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var node, i, elems, - elem = context.getElementById( id ); - - if ( elem ) { - - // Verify the id attribute - node = elem.getAttributeNode( "id" ); - if ( node && node.value === id ) { - return [ elem ]; - } - - // Fall back on getElementsByName - elems = context.getElementsByName( id ); - i = 0; - while ( ( elem = elems[ i++ ] ) ) { - node = elem.getAttributeNode( "id" ); - if ( node && node.value === id ) { - return [ elem ]; - } - } - } - - return []; - } - }; - } - - // Tag - Expr.find[ "TAG" ] = support.getElementsByTagName ? - function( tag, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( tag ); - - // DocumentFragment nodes don't have gEBTN - } else if ( support.qsa ) { - return context.querySelectorAll( tag ); - } - } : - - function( tag, context ) { - var elem, - tmp = [], - i = 0, - - // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too - results = context.getElementsByTagName( tag ); - - // Filter out possible comments - if ( tag === "*" ) { - while ( ( elem = results[ i++ ] ) ) { - if ( elem.nodeType === 1 ) { - tmp.push( elem ); - } - } - - return tmp; - } - return results; - }; - - // Class - Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) { - if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { - return context.getElementsByClassName( className ); - } - }; - - /* QSA/matchesSelector - ---------------------------------------------------------------------- */ - - // QSA and matchesSelector support - - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See https://bugs.jquery.com/ticket/13378 - rbuggyQSA = []; - - if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { - - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert( function( el ) { - - var input; - - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // https://bugs.jquery.com/ticket/12359 - docElem.appendChild( el ).innerHTML = "" + - ""; - - // Support: IE8, Opera 11-12.16 - // Nothing should be selected when empty strings follow ^= or $= or *= - // The test attribute must be unknown in Opera but "safe" for WinRT - // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section - if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) { - rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); - } - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if ( !el.querySelectorAll( "[selected]" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ - if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { - rbuggyQSA.push( "~=" ); - } - - // Support: IE 11+, Edge 15 - 18+ - // IE 11/Edge don't find elements on a `[name='']` query in some cases. - // Adding a temporary attribute to the document before the selection works - // around the issue. - // Interestingly, IE 10 & older don't seem to have the issue. - input = document.createElement( "input" ); - input.setAttribute( "name", "" ); - el.appendChild( input ); - if ( !el.querySelectorAll( "[name='']" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + - whitespace + "*(?:''|\"\")" ); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if ( !el.querySelectorAll( ":checked" ).length ) { - rbuggyQSA.push( ":checked" ); - } - - // Support: Safari 8+, iOS 8+ - // https://bugs.webkit.org/show_bug.cgi?id=136851 - // In-page `selector#id sibling-combinator selector` fails - if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { - rbuggyQSA.push( ".#.+[+~]" ); - } - - // Support: Firefox <=3.6 - 5 only - // Old Firefox doesn't throw on a badly-escaped identifier. - el.querySelectorAll( "\\\f" ); - rbuggyQSA.push( "[\\r\\n\\f]" ); - } ); - - assert( function( el ) { - el.innerHTML = "" + - ""; - - // Support: Windows 8 Native Apps - // The type and name attributes are restricted during .innerHTML assignment - var input = document.createElement( "input" ); - input.setAttribute( "type", "hidden" ); - el.appendChild( input ).setAttribute( "name", "D" ); - - // Support: IE8 - // Enforce case-sensitivity of name attribute - if ( el.querySelectorAll( "[name=d]" ).length ) { - rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if ( el.querySelectorAll( ":enabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: IE9-11+ - // IE's :disabled selector does not pick up the children of disabled fieldsets - docElem.appendChild( el ).disabled = true; - if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: Opera 10 - 11 only - // Opera 10-11 does not throw on post-comma invalid pseudos - el.querySelectorAll( "*,:x" ); - rbuggyQSA.push( ",.*:" ); - } ); - } - - if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches || - docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector ) ) ) ) { - - assert( function( el ) { - - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( el, "*" ); - - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( el, "[s!='']:x" ); - rbuggyMatches.push( "!=", pseudos ); - } ); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); - rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) ); - - /* Contains - ---------------------------------------------------------------------- */ - hasCompare = rnative.test( docElem.compareDocumentPosition ); - - // Element contains another - // Purposefully self-exclusive - // As in, an element does not contain itself - contains = hasCompare || rnative.test( docElem.contains ) ? - function( a, b ) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && ( - adown.contains ? - adown.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - ) ); - } : - function( a, b ) { - if ( b ) { - while ( ( b = b.parentNode ) ) { - if ( b === a ) { - return true; - } - } - } - return false; - }; - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = hasCompare ? - function( a, b ) { - - // Flag for duplicate removal - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - // Sort on method existence if only one input has compareDocumentPosition - var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; - if ( compare ) { - return compare; - } - - // Calculate position if both inputs belong to the same document - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? - a.compareDocumentPosition( b ) : - - // Otherwise we know they are disconnected - 1; - - // Disconnected nodes - if ( compare & 1 || - ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { - - // Choose the first element that is related to our preferred document - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( a == document || a.ownerDocument == preferredDoc && - contains( preferredDoc, a ) ) { - return -1; - } - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( b == document || b.ownerDocument == preferredDoc && - contains( preferredDoc, b ) ) { - return 1; - } - - // Maintain original order - return sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - } - - return compare & 4 ? -1 : 1; - } : - function( a, b ) { - - // Exit early if the nodes are identical - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - var cur, - i = 0, - aup = a.parentNode, - bup = b.parentNode, - ap = [ a ], - bp = [ b ]; - - // Parentless nodes are either documents or disconnected - if ( !aup || !bup ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - /* eslint-disable eqeqeq */ - return a == document ? -1 : - b == document ? 1 : - /* eslint-enable eqeqeq */ - aup ? -1 : - bup ? 1 : - sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - - // If the nodes are siblings, we can do a quick check - } else if ( aup === bup ) { - return siblingCheck( a, b ); - } - - // Otherwise we need full lists of their ancestors for comparison - cur = a; - while ( ( cur = cur.parentNode ) ) { - ap.unshift( cur ); - } - cur = b; - while ( ( cur = cur.parentNode ) ) { - bp.unshift( cur ); - } - - // Walk down the tree looking for a discrepancy - while ( ap[ i ] === bp[ i ] ) { - i++; - } - - return i ? - - // Do a sibling check if the nodes have a common ancestor - siblingCheck( ap[ i ], bp[ i ] ) : - - // Otherwise nodes in our document sort first - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - /* eslint-disable eqeqeq */ - ap[ i ] == preferredDoc ? -1 : - bp[ i ] == preferredDoc ? 1 : - /* eslint-enable eqeqeq */ - 0; - }; - - return document; -}; - -Sizzle.matches = function( expr, elements ) { - return Sizzle( expr, null, null, elements ); -}; - -Sizzle.matchesSelector = function( elem, expr ) { - setDocument( elem ); - - if ( support.matchesSelector && documentIsHTML && - !nonnativeSelectorCache[ expr + " " ] && - ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { - - try { - var ret = matches.call( elem, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || support.disconnectedMatch || - - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { - return ret; - } - } catch ( e ) { - nonnativeSelectorCache( expr, true ); - } - } - - return Sizzle( expr, document, null, [ elem ] ).length > 0; -}; - -Sizzle.contains = function( context, elem ) { - - // Set document vars if needed - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( ( context.ownerDocument || context ) != document ) { - setDocument( context ); - } - return contains( context, elem ); -}; - -Sizzle.attr = function( elem, name ) { - - // Set document vars if needed - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( ( elem.ownerDocument || elem ) != document ) { - setDocument( elem ); - } - - var fn = Expr.attrHandle[ name.toLowerCase() ], - - // Don't get fooled by Object.prototype properties (jQuery #13807) - val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? - fn( elem, name, !documentIsHTML ) : - undefined; - - return val !== undefined ? - val : - support.attributes || !documentIsHTML ? - elem.getAttribute( name ) : - ( val = elem.getAttributeNode( name ) ) && val.specified ? - val.value : - null; -}; - -Sizzle.escape = function( sel ) { - return ( sel + "" ).replace( rcssescape, fcssescape ); -}; - -Sizzle.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -/** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ -Sizzle.uniqueSort = function( results ) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice( 0 ); - results.sort( sortOrder ); - - if ( hasDuplicate ) { - while ( ( elem = results[ i++ ] ) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - results.splice( duplicates[ j ], 1 ); - } - } - - // Clear input after sorting to release objects - // See https://github.com/jquery/sizzle/pull/225 - sortInput = null; - - return results; -}; - -/** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -getText = Sizzle.getText = function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - - // If no nodeType, this is expected to be an array - while ( ( node = elem[ i++ ] ) ) { - - // Do not traverse comment nodes - ret += getText( node ); - } - } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - - // Use textContent for elements - // innerText usage removed for consistency of new lines (jQuery #11153) - if ( typeof elem.textContent === "string" ) { - return elem.textContent; - } else { - - // Traverse its children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - - // Do not include comment or processing instruction nodes - - return ret; -}; - -Expr = Sizzle.selectors = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - attrHandle: {}, - - find: {}, - - relative: { - ">": { dir: "parentNode", first: true }, - " ": { dir: "parentNode" }, - "+": { dir: "previousSibling", first: true }, - "~": { dir: "previousSibling" } - }, - - preFilter: { - "ATTR": function( match ) { - match[ 1 ] = match[ 1 ].replace( runescape, funescape ); - - // Move the given value to match[3] whether quoted or unquoted - match[ 3 ] = ( match[ 3 ] || match[ 4 ] || - match[ 5 ] || "" ).replace( runescape, funescape ); - - if ( match[ 2 ] === "~=" ) { - match[ 3 ] = " " + match[ 3 ] + " "; - } - - return match.slice( 0, 4 ); - }, - - "CHILD": function( match ) { - - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[ 1 ] = match[ 1 ].toLowerCase(); - - if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { - - // nth-* requires argument - if ( !match[ 3 ] ) { - Sizzle.error( match[ 0 ] ); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[ 4 ] = +( match[ 4 ] ? - match[ 5 ] + ( match[ 6 ] || 1 ) : - 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) ); - match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); - - // other types prohibit arguments - } else if ( match[ 3 ] ) { - Sizzle.error( match[ 0 ] ); - } - - return match; - }, - - "PSEUDO": function( match ) { - var excess, - unquoted = !match[ 6 ] && match[ 2 ]; - - if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) { - return null; - } - - // Accept quoted arguments as-is - if ( match[ 3 ] ) { - match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; - - // Strip excess characters from unquoted arguments - } else if ( unquoted && rpseudo.test( unquoted ) && - - // Get excess from tokenize (recursively) - ( excess = tokenize( unquoted, true ) ) && - - // advance to the next closing parenthesis - ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { - - // excess is a negative index - match[ 0 ] = match[ 0 ].slice( 0, excess ); - match[ 2 ] = unquoted.slice( 0, excess ); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice( 0, 3 ); - } - }, - - filter: { - - "TAG": function( nodeNameSelector ) { - var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); - return nodeNameSelector === "*" ? - function() { - return true; - } : - function( elem ) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; - }; - }, - - "CLASS": function( className ) { - var pattern = classCache[ className + " " ]; - - return pattern || - ( pattern = new RegExp( "(^|" + whitespace + - ")" + className + "(" + whitespace + "|$)" ) ) && classCache( - className, function( elem ) { - return pattern.test( - typeof elem.className === "string" && elem.className || - typeof elem.getAttribute !== "undefined" && - elem.getAttribute( "class" ) || - "" - ); - } ); - }, - - "ATTR": function( name, operator, check ) { - return function( elem ) { - var result = Sizzle.attr( elem, name ); - - if ( result == null ) { - return operator === "!="; - } - if ( !operator ) { - return true; - } - - result += ""; - - /* eslint-disable max-len */ - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf( check ) === 0 : - operator === "*=" ? check && result.indexOf( check ) > -1 : - operator === "$=" ? check && result.slice( -check.length ) === check : - operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : - operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : - false; - /* eslint-enable max-len */ - - }; - }, - - "CHILD": function( type, what, _argument, first, last ) { - var simple = type.slice( 0, 3 ) !== "nth", - forward = type.slice( -4 ) !== "last", - ofType = what === "of-type"; - - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - function( elem ) { - return !!elem.parentNode; - } : - - function( elem, _context, xml ) { - var cache, uniqueCache, outerCache, node, nodeIndex, start, - dir = simple !== forward ? "nextSibling" : "previousSibling", - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType, - diff = false; - - if ( parent ) { - - // :(first|last|only)-(child|of-type) - if ( simple ) { - while ( dir ) { - node = elem; - while ( ( node = node[ dir ] ) ) { - if ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) { - - return false; - } - } - - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === "only" && !start && "nextSibling"; - } - return true; - } - - start = [ forward ? parent.firstChild : parent.lastChild ]; - - // non-xml :nth-child(...) stores cache data on `parent` - if ( forward && useCache ) { - - // Seek `elem` from a previously-cached index - - // ...in a gzip-friendly way - node = parent; - outerCache = node[ expando ] || ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex && cache[ 2 ]; - node = nodeIndex && parent.childNodes[ nodeIndex ]; - - while ( ( node = ++nodeIndex && node && node[ dir ] || - - // Fallback to seeking `elem` from the start - ( diff = nodeIndex = 0 ) || start.pop() ) ) { - - // When found, cache indexes on `parent` and break - if ( node.nodeType === 1 && ++diff && node === elem ) { - uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; - break; - } - } - - } else { - - // Use previously-cached element index if available - if ( useCache ) { - - // ...in a gzip-friendly way - node = elem; - outerCache = node[ expando ] || ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex; - } - - // xml :nth-child(...) - // or :nth-last-child(...) or :nth(-last)?-of-type(...) - if ( diff === false ) { - - // Use the same loop as above to seek `elem` from the start - while ( ( node = ++nodeIndex && node && node[ dir ] || - ( diff = nodeIndex = 0 ) || start.pop() ) ) { - - if ( ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) && - ++diff ) { - - // Cache the index of each encountered element - if ( useCache ) { - outerCache = node[ expando ] || - ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - uniqueCache[ type ] = [ dirruns, diff ]; - } - - if ( node === elem ) { - break; - } - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return diff === first || ( diff % first === 0 && diff / first >= 0 ); - } - }; - }, - - "PSEUDO": function( pseudo, argument ) { - - // pseudo-class names are case-insensitive - // http://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - Sizzle.error( "unsupported pseudo: " + pseudo ); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as Sizzle does - if ( fn[ expando ] ) { - return fn( argument ); - } - - // But maintain support for old signatures - if ( fn.length > 1 ) { - args = [ pseudo, pseudo, "", argument ]; - return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? - markFunction( function( seed, matches ) { - var idx, - matched = fn( seed, argument ), - i = matched.length; - while ( i-- ) { - idx = indexOf( seed, matched[ i ] ); - seed[ idx ] = !( matches[ idx ] = matched[ i ] ); - } - } ) : - function( elem ) { - return fn( elem, 0, args ); - }; - } - - return fn; - } - }, - - pseudos: { - - // Potentially complex pseudos - "not": markFunction( function( selector ) { - - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile( selector.replace( rtrim, "$1" ) ); - - return matcher[ expando ] ? - markFunction( function( seed, matches, _context, xml ) { - var elem, - unmatched = matcher( seed, null, xml, [] ), - i = seed.length; - - // Match elements unmatched by `matcher` - while ( i-- ) { - if ( ( elem = unmatched[ i ] ) ) { - seed[ i ] = !( matches[ i ] = elem ); - } - } - } ) : - function( elem, _context, xml ) { - input[ 0 ] = elem; - matcher( input, null, xml, results ); - - // Don't keep the element (issue #299) - input[ 0 ] = null; - return !results.pop(); - }; - } ), - - "has": markFunction( function( selector ) { - return function( elem ) { - return Sizzle( selector, elem ).length > 0; - }; - } ), - - "contains": markFunction( function( text ) { - text = text.replace( runescape, funescape ); - return function( elem ) { - return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; - }; - } ), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction( function( lang ) { - - // lang value must be a valid identifier - if ( !ridentifier.test( lang || "" ) ) { - Sizzle.error( "unsupported lang: " + lang ); - } - lang = lang.replace( runescape, funescape ).toLowerCase(); - return function( elem ) { - var elemLang; - do { - if ( ( elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { - - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; - } - } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); - return false; - }; - } ), - - // Miscellaneous - "target": function( elem ) { - var hash = window.location && window.location.hash; - return hash && hash.slice( 1 ) === elem.id; - }, - - "root": function( elem ) { - return elem === docElem; - }, - - "focus": function( elem ) { - return elem === document.activeElement && - ( !document.hasFocus || document.hasFocus() ) && - !!( elem.type || elem.href || ~elem.tabIndex ); - }, - - // Boolean properties - "enabled": createDisabledPseudo( false ), - "disabled": createDisabledPseudo( true ), - - "checked": function( elem ) { - - // In CSS3, :checked should return both checked and selected elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return ( nodeName === "input" && !!elem.checked ) || - ( nodeName === "option" && !!elem.selected ); - }, - - "selected": function( elem ) { - - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - // eslint-disable-next-line no-unused-expressions - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - "empty": function( elem ) { - - // http://www.w3.org/TR/selectors/#empty-pseudo - // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), - // but not by others (comment: 8; processing instruction: 7; etc.) - // nodeType < 6 works because attributes (2) do not appear as children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - if ( elem.nodeType < 6 ) { - return false; - } - } - return true; - }, - - "parent": function( elem ) { - return !Expr.pseudos[ "empty" ]( elem ); - }, - - // Element/input types - "header": function( elem ) { - return rheader.test( elem.nodeName ); - }, - - "input": function( elem ) { - return rinputs.test( elem.nodeName ); - }, - - "button": function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; - }, - - "text": function( elem ) { - var attr; - return elem.nodeName.toLowerCase() === "input" && - elem.type === "text" && - - // Support: IE<8 - // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" - ( ( attr = elem.getAttribute( "type" ) ) == null || - attr.toLowerCase() === "text" ); - }, - - // Position-in-collection - "first": createPositionalPseudo( function() { - return [ 0 ]; - } ), - - "last": createPositionalPseudo( function( _matchIndexes, length ) { - return [ length - 1 ]; - } ), - - "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) { - return [ argument < 0 ? argument + length : argument ]; - } ), - - "even": createPositionalPseudo( function( matchIndexes, length ) { - var i = 0; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "odd": createPositionalPseudo( function( matchIndexes, length ) { - var i = 1; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "lt": createPositionalPseudo( function( matchIndexes, length, argument ) { - var i = argument < 0 ? - argument + length : - argument > length ? - length : - argument; - for ( ; --i >= 0; ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "gt": createPositionalPseudo( function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; ++i < length; ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ) - } -}; - -Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ]; - -// Add button/input type pseudos -for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { - Expr.pseudos[ i ] = createInputPseudo( i ); -} -for ( i in { submit: true, reset: true } ) { - Expr.pseudos[ i ] = createButtonPseudo( i ); -} - -// Easy API for creating new setFilters -function setFilters() {} -setFilters.prototype = Expr.filters = Expr.pseudos; -Expr.setFilters = new setFilters(); - -tokenize = Sizzle.tokenize = function( selector, parseOnly ) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[ selector + " " ]; - - if ( cached ) { - return parseOnly ? 0 : cached.slice( 0 ); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while ( soFar ) { - - // Comma and first run - if ( !matched || ( match = rcomma.exec( soFar ) ) ) { - if ( match ) { - - // Don't consume trailing commas as valid - soFar = soFar.slice( match[ 0 ].length ) || soFar; - } - groups.push( ( tokens = [] ) ); - } - - matched = false; - - // Combinators - if ( ( match = rcombinators.exec( soFar ) ) ) { - matched = match.shift(); - tokens.push( { - value: matched, - - // Cast descendant combinators to space - type: match[ 0 ].replace( rtrim, " " ) - } ); - soFar = soFar.slice( matched.length ); - } - - // Filters - for ( type in Expr.filter ) { - if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || - ( match = preFilters[ type ]( match ) ) ) ) { - matched = match.shift(); - tokens.push( { - value: matched, - type: type, - matches: match - } ); - soFar = soFar.slice( matched.length ); - } - } - - if ( !matched ) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - return parseOnly ? - soFar.length : - soFar ? - Sizzle.error( selector ) : - - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); -}; - -function toSelector( tokens ) { - var i = 0, - len = tokens.length, - selector = ""; - for ( ; i < len; i++ ) { - selector += tokens[ i ].value; - } - return selector; -} - -function addCombinator( matcher, combinator, base ) { - var dir = combinator.dir, - skip = combinator.next, - key = skip || dir, - checkNonElements = base && key === "parentNode", - doneName = done++; - - return combinator.first ? - - // Check against closest ancestor/preceding element - function( elem, context, xml ) { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - return matcher( elem, context, xml ); - } - } - return false; - } : - - // Check against all ancestor/preceding elements - function( elem, context, xml ) { - var oldCache, uniqueCache, outerCache, - newCache = [ dirruns, doneName ]; - - // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching - if ( xml ) { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - if ( matcher( elem, context, xml ) ) { - return true; - } - } - } - } else { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - outerCache = elem[ expando ] || ( elem[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ elem.uniqueID ] || - ( outerCache[ elem.uniqueID ] = {} ); - - if ( skip && skip === elem.nodeName.toLowerCase() ) { - elem = elem[ dir ] || elem; - } else if ( ( oldCache = uniqueCache[ key ] ) && - oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { - - // Assign to newCache so results back-propagate to previous elements - return ( newCache[ 2 ] = oldCache[ 2 ] ); - } else { - - // Reuse newcache so results back-propagate to previous elements - uniqueCache[ key ] = newCache; - - // A match means we're done; a fail means we have to keep checking - if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { - return true; - } - } - } - } - } - return false; - }; -} - -function elementMatcher( matchers ) { - return matchers.length > 1 ? - function( elem, context, xml ) { - var i = matchers.length; - while ( i-- ) { - if ( !matchers[ i ]( elem, context, xml ) ) { - return false; - } - } - return true; - } : - matchers[ 0 ]; -} - -function multipleContexts( selector, contexts, results ) { - var i = 0, - len = contexts.length; - for ( ; i < len; i++ ) { - Sizzle( selector, contexts[ i ], results ); - } - return results; -} - -function condense( unmatched, map, filter, context, xml ) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for ( ; i < len; i++ ) { - if ( ( elem = unmatched[ i ] ) ) { - if ( !filter || filter( elem, context, xml ) ) { - newUnmatched.push( elem ); - if ( mapped ) { - map.push( i ); - } - } - } - } - - return newUnmatched; -} - -function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { - if ( postFilter && !postFilter[ expando ] ) { - postFilter = setMatcher( postFilter ); - } - if ( postFinder && !postFinder[ expando ] ) { - postFinder = setMatcher( postFinder, postSelector ); - } - return markFunction( function( seed, results, context, xml ) { - var temp, i, elem, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || multipleContexts( - selector || "*", - context.nodeType ? [ context ] : context, - [] - ), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && ( seed || !selector ) ? - condense( elems, preMap, preFilter, context, xml ) : - elems, - - matcherOut = matcher ? - - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results : - matcherIn; - - // Find primary matches - if ( matcher ) { - matcher( matcherIn, matcherOut, context, xml ); - } - - // Apply postFilter - if ( postFilter ) { - temp = condense( matcherOut, postMap ); - postFilter( temp, [], context, xml ); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while ( i-- ) { - if ( ( elem = temp[ i ] ) ) { - matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); - } - } - } - - if ( seed ) { - if ( postFinder || preFilter ) { - if ( postFinder ) { - - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while ( i-- ) { - if ( ( elem = matcherOut[ i ] ) ) { - - // Restore matcherIn since elem is not yet a final match - temp.push( ( matcherIn[ i ] = elem ) ); - } - } - postFinder( null, ( matcherOut = [] ), temp, xml ); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while ( i-- ) { - if ( ( elem = matcherOut[ i ] ) && - ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) { - - seed[ temp ] = !( results[ temp ] = elem ); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results ? - matcherOut.splice( preexisting, matcherOut.length ) : - matcherOut - ); - if ( postFinder ) { - postFinder( null, results, matcherOut, xml ); - } else { - push.apply( results, matcherOut ); - } - } - } ); -} - -function matcherFromTokens( tokens ) { - var checkContext, matcher, j, - len = tokens.length, - leadingRelative = Expr.relative[ tokens[ 0 ].type ], - implicitRelative = leadingRelative || Expr.relative[ " " ], - i = leadingRelative ? 1 : 0, - - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator( function( elem ) { - return elem === checkContext; - }, implicitRelative, true ), - matchAnyContext = addCombinator( function( elem ) { - return indexOf( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function( elem, context, xml ) { - var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( - ( checkContext = context ).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - - // Avoid hanging onto element (issue #299) - checkContext = null; - return ret; - } ]; - - for ( ; i < len; i++ ) { - if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { - matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; - } else { - matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); - - // Return special upon seeing a positional matcher - if ( matcher[ expando ] ) { - - // Find the next relative operator (if any) for proper handling - j = ++i; - for ( ; j < len; j++ ) { - if ( Expr.relative[ tokens[ j ].type ] ) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher( matchers ), - i > 1 && toSelector( - - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens - .slice( 0, i - 1 ) - .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) - ).replace( rtrim, "$1" ), - matcher, - i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), - j < len && toSelector( tokens ) - ); - } - matchers.push( matcher ); - } - } - - return elementMatcher( matchers ); -} - -function matcherFromGroupMatchers( elementMatchers, setMatchers ) { - var bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function( seed, context, xml, results, outermost ) { - var elem, j, matcher, - matchedCount = 0, - i = "0", - unmatched = seed && [], - setMatched = [], - contextBackup = outermostContext, - - // We must always have either seed elements or outermost context - elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ), - - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), - len = elems.length; - - if ( outermost ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - outermostContext = context == document || context || outermost; - } - - // Add elements passing elementMatchers directly to results - // Support: IE<9, Safari - // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id - for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { - if ( byElement && elem ) { - j = 0; - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( !context && elem.ownerDocument != document ) { - setDocument( elem ); - xml = !documentIsHTML; - } - while ( ( matcher = elementMatchers[ j++ ] ) ) { - if ( matcher( elem, context || document, xml ) ) { - results.push( elem ); - break; - } - } - if ( outermost ) { - dirruns = dirrunsUnique; - } - } - - // Track unmatched elements for set filters - if ( bySet ) { - - // They will have gone through all possible matchers - if ( ( elem = !matcher && elem ) ) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if ( seed ) { - unmatched.push( elem ); - } - } - } - - // `i` is now the count of elements visited above, and adding it to `matchedCount` - // makes the latter nonnegative. - matchedCount += i; - - // Apply set filters to unmatched elements - // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` - // equals `i`), unless we didn't visit _any_ elements in the above loop because we have - // no element matchers and no seed. - // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that - // case, which will result in a "00" `matchedCount` that differs from `i` but is also - // numerically zero. - if ( bySet && i !== matchedCount ) { - j = 0; - while ( ( matcher = setMatchers[ j++ ] ) ) { - matcher( unmatched, setMatched, context, xml ); - } - - if ( seed ) { - - // Reintegrate element matches to eliminate the need for sorting - if ( matchedCount > 0 ) { - while ( i-- ) { - if ( !( unmatched[ i ] || setMatched[ i ] ) ) { - setMatched[ i ] = pop.call( results ); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense( setMatched ); - } - - // Add matches to results - push.apply( results, setMatched ); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1 ) { - - Sizzle.uniqueSort( results ); - } - } - - // Override manipulation of globals by nested matchers - if ( outermost ) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction( superMatcher ) : - superMatcher; -} - -compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[ selector + " " ]; - - if ( !cached ) { - - // Generate a function of recursive functions that can be used to check each element - if ( !match ) { - match = tokenize( selector ); - } - i = match.length; - while ( i-- ) { - cached = matcherFromTokens( match[ i ] ); - if ( cached[ expando ] ) { - setMatchers.push( cached ); - } else { - elementMatchers.push( cached ); - } - } - - // Cache the compiled function - cached = compilerCache( - selector, - matcherFromGroupMatchers( elementMatchers, setMatchers ) - ); - - // Save selector and tokenization - cached.selector = selector; - } - return cached; -}; - -/** - * A low-level selection function that works with Sizzle's compiled - * selector functions - * @param {String|Function} selector A selector or a pre-compiled - * selector function built with Sizzle.compile - * @param {Element} context - * @param {Array} [results] - * @param {Array} [seed] A set of elements to match against - */ -select = Sizzle.select = function( selector, context, results, seed ) { - var i, tokens, token, type, find, - compiled = typeof selector === "function" && selector, - match = !seed && tokenize( ( selector = compiled.selector || selector ) ); - - results = results || []; - - // Try to minimize operations if there is only one selector in the list and no seed - // (the latter of which guarantees us context) - if ( match.length === 1 ) { - - // Reduce context if the leading compound selector is an ID - tokens = match[ 0 ] = match[ 0 ].slice( 0 ); - if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && - context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { - - context = ( Expr.find[ "ID" ]( token.matches[ 0 ] - .replace( runescape, funescape ), context ) || [] )[ 0 ]; - if ( !context ) { - return results; - - // Precompiled matchers will still verify ancestry, so step up a level - } else if ( compiled ) { - context = context.parentNode; - } - - selector = selector.slice( tokens.shift().value.length ); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length; - while ( i-- ) { - token = tokens[ i ]; - - // Abort if we hit a combinator - if ( Expr.relative[ ( type = token.type ) ] ) { - break; - } - if ( ( find = Expr.find[ type ] ) ) { - - // Search, expanding context for leading sibling combinators - if ( ( seed = find( - token.matches[ 0 ].replace( runescape, funescape ), - rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) || - context - ) ) ) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice( i, 1 ); - selector = seed.length && toSelector( tokens ); - if ( !selector ) { - push.apply( results, seed ); - return results; - } - - break; - } - } - } - } - - // Compile and execute a filtering function if one is not provided - // Provide `match` to avoid retokenization if we modified the selector above - ( compiled || compile( selector, match ) )( - seed, - context, - !documentIsHTML, - results, - !context || rsibling.test( selector ) && testContext( context.parentNode ) || context - ); - return results; -}; - -// One-time assignments - -// Sort stability -support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; - -// Support: Chrome 14-35+ -// Always assume duplicates if they aren't passed to the comparison function -support.detectDuplicates = !!hasDuplicate; - -// Initialize against the default document -setDocument(); - -// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) -// Detached nodes confoundingly follow *each other* -support.sortDetached = assert( function( el ) { - - // Should return 1, but returns 4 (following) - return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; -} ); - -// Support: IE<8 -// Prevent attribute/property "interpolation" -// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !assert( function( el ) { - el.innerHTML = ""; - return el.firstChild.getAttribute( "href" ) === "#"; -} ) ) { - addHandle( "type|href|height|width", function( elem, name, isXML ) { - if ( !isXML ) { - return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); - } - } ); -} - -// Support: IE<9 -// Use defaultValue in place of getAttribute("value") -if ( !support.attributes || !assert( function( el ) { - el.innerHTML = ""; - el.firstChild.setAttribute( "value", "" ); - return el.firstChild.getAttribute( "value" ) === ""; -} ) ) { - addHandle( "value", function( elem, _name, isXML ) { - if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { - return elem.defaultValue; - } - } ); -} - -// Support: IE<9 -// Use getAttributeNode to fetch booleans when getAttribute lies -if ( !assert( function( el ) { - return el.getAttribute( "disabled" ) == null; -} ) ) { - addHandle( booleans, function( elem, name, isXML ) { - var val; - if ( !isXML ) { - return elem[ name ] === true ? name.toLowerCase() : - ( val = elem.getAttributeNode( name ) ) && val.specified ? - val.value : - null; - } - } ); -} - -return Sizzle; - -} )( window ); - - - -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; - -// Deprecated -jQuery.expr[ ":" ] = jQuery.expr.pseudos; -jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; -jQuery.escapeSelector = Sizzle.escape; - - - - -var dir = function( elem, dir, until ) { - var matched = [], - truncate = until !== undefined; - - while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { - if ( elem.nodeType === 1 ) { - if ( truncate && jQuery( elem ).is( until ) ) { - break; - } - matched.push( elem ); - } - } - return matched; -}; - - -var siblings = function( n, elem ) { - var matched = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - matched.push( n ); - } - } - - return matched; -}; - - -var rneedsContext = jQuery.expr.match.needsContext; - - - -function nodeName( elem, name ) { - - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - -}; -var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); - - - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, not ) { - if ( isFunction( qualifier ) ) { - return jQuery.grep( elements, function( elem, i ) { - return !!qualifier.call( elem, i, elem ) !== not; - } ); - } - - // Single element - if ( qualifier.nodeType ) { - return jQuery.grep( elements, function( elem ) { - return ( elem === qualifier ) !== not; - } ); - } - - // Arraylike of elements (jQuery, arguments, Array) - if ( typeof qualifier !== "string" ) { - return jQuery.grep( elements, function( elem ) { - return ( indexOf.call( qualifier, elem ) > -1 ) !== not; - } ); - } - - // Filtered directly for both simple and complex selectors - return jQuery.filter( qualifier, elements, not ); -} - -jQuery.filter = function( expr, elems, not ) { - var elem = elems[ 0 ]; - - if ( not ) { - expr = ":not(" + expr + ")"; - } - - if ( elems.length === 1 && elem.nodeType === 1 ) { - return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; - } - - return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { - return elem.nodeType === 1; - } ) ); -}; - -jQuery.fn.extend( { - find: function( selector ) { - var i, ret, - len = this.length, - self = this; - - if ( typeof selector !== "string" ) { - return this.pushStack( jQuery( selector ).filter( function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - } ) ); - } - - ret = this.pushStack( [] ); - - for ( i = 0; i < len; i++ ) { - jQuery.find( selector, self[ i ], ret ); - } - - return len > 1 ? jQuery.uniqueSort( ret ) : ret; - }, - filter: function( selector ) { - return this.pushStack( winnow( this, selector || [], false ) ); - }, - not: function( selector ) { - return this.pushStack( winnow( this, selector || [], true ) ); - }, - is: function( selector ) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test( selector ) ? - jQuery( selector ) : - selector || [], - false - ).length; - } -} ); - - -// Initialize a jQuery object - - -// A central reference to the root jQuery(document) -var rootjQuery, - - // A simple way to check for HTML strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - // Strict HTML recognition (#11290: must start with <) - // Shortcut simple #id case for speed - rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, - - init = jQuery.fn.init = function( selector, context, root ) { - var match, elem; - - // HANDLE: $(""), $(null), $(undefined), $(false) - if ( !selector ) { - return this; - } - - // Method init() accepts an alternate rootjQuery - // so migrate can support jQuery.sub (gh-2101) - root = root || rootjQuery; - - // Handle HTML strings - if ( typeof selector === "string" ) { - if ( selector[ 0 ] === "<" && - selector[ selector.length - 1 ] === ">" && - selector.length >= 3 ) { - - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = rquickExpr.exec( selector ); - } - - // Match html or make sure no context is specified for #id - if ( match && ( match[ 1 ] || !context ) ) { - - // HANDLE: $(html) -> $(array) - if ( match[ 1 ] ) { - context = context instanceof jQuery ? context[ 0 ] : context; - - // Option to run scripts is true for back-compat - // Intentionally let the error be thrown if parseHTML is not present - jQuery.merge( this, jQuery.parseHTML( - match[ 1 ], - context && context.nodeType ? context.ownerDocument || context : document, - true - ) ); - - // HANDLE: $(html, props) - if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { - for ( match in context ) { - - // Properties of context are called as methods if possible - if ( isFunction( this[ match ] ) ) { - this[ match ]( context[ match ] ); - - // ...and otherwise set as attributes - } else { - this.attr( match, context[ match ] ); - } - } - } - - return this; - - // HANDLE: $(#id) - } else { - elem = document.getElementById( match[ 2 ] ); - - if ( elem ) { - - // Inject the element directly into the jQuery object - this[ 0 ] = elem; - this.length = 1; - } - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || root ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(DOMElement) - } else if ( selector.nodeType ) { - this[ 0 ] = selector; - this.length = 1; - return this; - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( isFunction( selector ) ) { - return root.ready !== undefined ? - root.ready( selector ) : - - // Execute immediately if ready is not present - selector( jQuery ); - } - - return jQuery.makeArray( selector, this ); - }; - -// Give the init function the jQuery prototype for later instantiation -init.prototype = jQuery.fn; - -// Initialize central reference -rootjQuery = jQuery( document ); - - -var rparentsprev = /^(?:parents|prev(?:Until|All))/, - - // Methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.fn.extend( { - has: function( target ) { - var targets = jQuery( target, this ), - l = targets.length; - - return this.filter( function() { - var i = 0; - for ( ; i < l; i++ ) { - if ( jQuery.contains( this, targets[ i ] ) ) { - return true; - } - } - } ); - }, - - closest: function( selectors, context ) { - var cur, - i = 0, - l = this.length, - matched = [], - targets = typeof selectors !== "string" && jQuery( selectors ); - - // Positional selectors never match, since there's no _selection_ context - if ( !rneedsContext.test( selectors ) ) { - for ( ; i < l; i++ ) { - for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { - - // Always skip document fragments - if ( cur.nodeType < 11 && ( targets ? - targets.index( cur ) > -1 : - - // Don't pass non-elements to Sizzle - cur.nodeType === 1 && - jQuery.find.matchesSelector( cur, selectors ) ) ) { - - matched.push( cur ); - break; - } - } - } - } - - return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); - }, - - // Determine the position of an element within the set - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; - } - - // Index in selector - if ( typeof elem === "string" ) { - return indexOf.call( jQuery( elem ), this[ 0 ] ); - } - - // Locate the position of the desired element - return indexOf.call( this, - - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[ 0 ] : elem - ); - }, - - add: function( selector, context ) { - return this.pushStack( - jQuery.uniqueSort( - jQuery.merge( this.get(), jQuery( selector, context ) ) - ) - ); - }, - - addBack: function( selector ) { - return this.add( selector == null ? - this.prevObject : this.prevObject.filter( selector ) - ); - } -} ); - -function sibling( cur, dir ) { - while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} - return cur; -} - -jQuery.each( { - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, _i, until ) { - return dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return sibling( elem, "nextSibling" ); - }, - prev: function( elem ) { - return sibling( elem, "previousSibling" ); - }, - nextAll: function( elem ) { - return dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, _i, until ) { - return dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, _i, until ) { - return dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return siblings( ( elem.parentNode || {} ).firstChild, elem ); - }, - children: function( elem ) { - return siblings( elem.firstChild ); - }, - contents: function( elem ) { - if ( elem.contentDocument != null && - - // Support: IE 11+ - // elements with no `data` attribute has an object - // `contentDocument` with a `null` prototype. - getProto( elem.contentDocument ) ) { - - return elem.contentDocument; - } - - // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only - // Treat the template element as a regular one in browsers that - // don't support it. - if ( nodeName( elem, "template" ) ) { - elem = elem.content || elem; - } - - return jQuery.merge( [], elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var matched = jQuery.map( this, fn, until ); - - if ( name.slice( -5 ) !== "Until" ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - matched = jQuery.filter( selector, matched ); - } - - if ( this.length > 1 ) { - - // Remove duplicates - if ( !guaranteedUnique[ name ] ) { - jQuery.uniqueSort( matched ); - } - - // Reverse order for parents* and prev-derivatives - if ( rparentsprev.test( name ) ) { - matched.reverse(); - } - } - - return this.pushStack( matched ); - }; -} ); -var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); - - - -// Convert String-formatted options into Object-formatted ones -function createOptions( options ) { - var object = {}; - jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { - object[ flag ] = true; - } ); - return object; -} - -/* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ -jQuery.Callbacks = function( options ) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === "string" ? - createOptions( options ) : - jQuery.extend( {}, options ); - - var // Flag to know if list is currently firing - firing, - - // Last fire value for non-forgettable lists - memory, - - // Flag to know if list was already fired - fired, - - // Flag to prevent firing - locked, - - // Actual callback list - list = [], - - // Queue of execution data for repeatable lists - queue = [], - - // Index of currently firing callback (modified by add/remove as needed) - firingIndex = -1, - - // Fire callbacks - fire = function() { - - // Enforce single-firing - locked = locked || options.once; - - // Execute callbacks for all pending executions, - // respecting firingIndex overrides and runtime changes - fired = firing = true; - for ( ; queue.length; firingIndex = -1 ) { - memory = queue.shift(); - while ( ++firingIndex < list.length ) { - - // Run callback and check for early termination - if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && - options.stopOnFalse ) { - - // Jump to end and forget the data so .add doesn't re-fire - firingIndex = list.length; - memory = false; - } - } - } - - // Forget the data if we're done with it - if ( !options.memory ) { - memory = false; - } - - firing = false; - - // Clean up if we're done firing for good - if ( locked ) { - - // Keep an empty list if we have data for future add calls - if ( memory ) { - list = []; - - // Otherwise, this object is spent - } else { - list = ""; - } - } - }, - - // Actual Callbacks object - self = { - - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - - // If we have memory from a past run, we should fire after adding - if ( memory && !firing ) { - firingIndex = list.length - 1; - queue.push( memory ); - } - - ( function add( args ) { - jQuery.each( args, function( _, arg ) { - if ( isFunction( arg ) ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && toType( arg ) !== "string" ) { - - // Inspect recursively - add( arg ); - } - } ); - } )( arguments ); - - if ( memory && !firing ) { - fire(); - } - } - return this; - }, - - // Remove a callback from the list - remove: function() { - jQuery.each( arguments, function( _, arg ) { - var index; - while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - - // Handle firing indexes - if ( index <= firingIndex ) { - firingIndex--; - } - } - } ); - return this; - }, - - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function( fn ) { - return fn ? - jQuery.inArray( fn, list ) > -1 : - list.length > 0; - }, - - // Remove all callbacks from the list - empty: function() { - if ( list ) { - list = []; - } - return this; - }, - - // Disable .fire and .add - // Abort any current/pending executions - // Clear all callbacks and values - disable: function() { - locked = queue = []; - list = memory = ""; - return this; - }, - disabled: function() { - return !list; - }, - - // Disable .fire - // Also disable .add unless we have memory (since it would have no effect) - // Abort any pending executions - lock: function() { - locked = queue = []; - if ( !memory && !firing ) { - list = memory = ""; - } - return this; - }, - locked: function() { - return !!locked; - }, - - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( !locked ) { - args = args || []; - args = [ context, args.slice ? args.slice() : args ]; - queue.push( args ); - if ( !firing ) { - fire(); - } - } - return this; - }, - - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - - // To know if the callbacks have already been called at least once - fired: function() { - return !!fired; - } - }; - - return self; -}; - - -function Identity( v ) { - return v; -} -function Thrower( ex ) { - throw ex; -} - -function adoptValue( value, resolve, reject, noValue ) { - var method; - - try { - - // Check for promise aspect first to privilege synchronous behavior - if ( value && isFunction( ( method = value.promise ) ) ) { - method.call( value ).done( resolve ).fail( reject ); - - // Other thenables - } else if ( value && isFunction( ( method = value.then ) ) ) { - method.call( value, resolve, reject ); - - // Other non-thenables - } else { - - // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: - // * false: [ value ].slice( 0 ) => resolve( value ) - // * true: [ value ].slice( 1 ) => resolve() - resolve.apply( undefined, [ value ].slice( noValue ) ); - } - - // For Promises/A+, convert exceptions into rejections - // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in - // Deferred#then to conditionally suppress rejection. - } catch ( value ) { - - // Support: Android 4.0 only - // Strict mode functions invoked without .call/.apply get global-object context - reject.apply( undefined, [ value ] ); - } -} - -jQuery.extend( { - - Deferred: function( func ) { - var tuples = [ - - // action, add listener, callbacks, - // ... .then handlers, argument index, [final state] - [ "notify", "progress", jQuery.Callbacks( "memory" ), - jQuery.Callbacks( "memory" ), 2 ], - [ "resolve", "done", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 0, "resolved" ], - [ "reject", "fail", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 1, "rejected" ] - ], - state = "pending", - promise = { - state: function() { - return state; - }, - always: function() { - deferred.done( arguments ).fail( arguments ); - return this; - }, - "catch": function( fn ) { - return promise.then( null, fn ); - }, - - // Keep pipe for back-compat - pipe: function( /* fnDone, fnFail, fnProgress */ ) { - var fns = arguments; - - return jQuery.Deferred( function( newDefer ) { - jQuery.each( tuples, function( _i, tuple ) { - - // Map tuples (progress, done, fail) to arguments (done, fail, progress) - var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; - - // deferred.progress(function() { bind to newDefer or newDefer.notify }) - // deferred.done(function() { bind to newDefer or newDefer.resolve }) - // deferred.fail(function() { bind to newDefer or newDefer.reject }) - deferred[ tuple[ 1 ] ]( function() { - var returned = fn && fn.apply( this, arguments ); - if ( returned && isFunction( returned.promise ) ) { - returned.promise() - .progress( newDefer.notify ) - .done( newDefer.resolve ) - .fail( newDefer.reject ); - } else { - newDefer[ tuple[ 0 ] + "With" ]( - this, - fn ? [ returned ] : arguments - ); - } - } ); - } ); - fns = null; - } ).promise(); - }, - then: function( onFulfilled, onRejected, onProgress ) { - var maxDepth = 0; - function resolve( depth, deferred, handler, special ) { - return function() { - var that = this, - args = arguments, - mightThrow = function() { - var returned, then; - - // Support: Promises/A+ section 2.3.3.3.3 - // https://promisesaplus.com/#point-59 - // Ignore double-resolution attempts - if ( depth < maxDepth ) { - return; - } - - returned = handler.apply( that, args ); - - // Support: Promises/A+ section 2.3.1 - // https://promisesaplus.com/#point-48 - if ( returned === deferred.promise() ) { - throw new TypeError( "Thenable self-resolution" ); - } - - // Support: Promises/A+ sections 2.3.3.1, 3.5 - // https://promisesaplus.com/#point-54 - // https://promisesaplus.com/#point-75 - // Retrieve `then` only once - then = returned && - - // Support: Promises/A+ section 2.3.4 - // https://promisesaplus.com/#point-64 - // Only check objects and functions for thenability - ( typeof returned === "object" || - typeof returned === "function" ) && - returned.then; - - // Handle a returned thenable - if ( isFunction( then ) ) { - - // Special processors (notify) just wait for resolution - if ( special ) { - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ) - ); - - // Normal processors (resolve) also hook into progress - } else { - - // ...and disregard older resolution values - maxDepth++; - - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ), - resolve( maxDepth, deferred, Identity, - deferred.notifyWith ) - ); - } - - // Handle all other returned values - } else { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Identity ) { - that = undefined; - args = [ returned ]; - } - - // Process the value(s) - // Default process is resolve - ( special || deferred.resolveWith )( that, args ); - } - }, - - // Only normal processors (resolve) catch and reject exceptions - process = special ? - mightThrow : - function() { - try { - mightThrow(); - } catch ( e ) { - - if ( jQuery.Deferred.exceptionHook ) { - jQuery.Deferred.exceptionHook( e, - process.stackTrace ); - } - - // Support: Promises/A+ section 2.3.3.3.4.1 - // https://promisesaplus.com/#point-61 - // Ignore post-resolution exceptions - if ( depth + 1 >= maxDepth ) { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Thrower ) { - that = undefined; - args = [ e ]; - } - - deferred.rejectWith( that, args ); - } - } - }; - - // Support: Promises/A+ section 2.3.3.3.1 - // https://promisesaplus.com/#point-57 - // Re-resolve promises immediately to dodge false rejection from - // subsequent errors - if ( depth ) { - process(); - } else { - - // Call an optional hook to record the stack, in case of exception - // since it's otherwise lost when execution goes async - if ( jQuery.Deferred.getStackHook ) { - process.stackTrace = jQuery.Deferred.getStackHook(); - } - window.setTimeout( process ); - } - }; - } - - return jQuery.Deferred( function( newDefer ) { - - // progress_handlers.add( ... ) - tuples[ 0 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onProgress ) ? - onProgress : - Identity, - newDefer.notifyWith - ) - ); - - // fulfilled_handlers.add( ... ) - tuples[ 1 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onFulfilled ) ? - onFulfilled : - Identity - ) - ); - - // rejected_handlers.add( ... ) - tuples[ 2 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onRejected ) ? - onRejected : - Thrower - ) - ); - } ).promise(); - }, - - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - return obj != null ? jQuery.extend( obj, promise ) : promise; - } - }, - deferred = {}; - - // Add list-specific methods - jQuery.each( tuples, function( i, tuple ) { - var list = tuple[ 2 ], - stateString = tuple[ 5 ]; - - // promise.progress = list.add - // promise.done = list.add - // promise.fail = list.add - promise[ tuple[ 1 ] ] = list.add; - - // Handle state - if ( stateString ) { - list.add( - function() { - - // state = "resolved" (i.e., fulfilled) - // state = "rejected" - state = stateString; - }, - - // rejected_callbacks.disable - // fulfilled_callbacks.disable - tuples[ 3 - i ][ 2 ].disable, - - // rejected_handlers.disable - // fulfilled_handlers.disable - tuples[ 3 - i ][ 3 ].disable, - - // progress_callbacks.lock - tuples[ 0 ][ 2 ].lock, - - // progress_handlers.lock - tuples[ 0 ][ 3 ].lock - ); - } - - // progress_handlers.fire - // fulfilled_handlers.fire - // rejected_handlers.fire - list.add( tuple[ 3 ].fire ); - - // deferred.notify = function() { deferred.notifyWith(...) } - // deferred.resolve = function() { deferred.resolveWith(...) } - // deferred.reject = function() { deferred.rejectWith(...) } - deferred[ tuple[ 0 ] ] = function() { - deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); - return this; - }; - - // deferred.notifyWith = list.fireWith - // deferred.resolveWith = list.fireWith - // deferred.rejectWith = list.fireWith - deferred[ tuple[ 0 ] + "With" ] = list.fireWith; - } ); - - // Make the deferred a promise - promise.promise( deferred ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( singleValue ) { - var - - // count of uncompleted subordinates - remaining = arguments.length, - - // count of unprocessed arguments - i = remaining, - - // subordinate fulfillment data - resolveContexts = Array( i ), - resolveValues = slice.call( arguments ), - - // the master Deferred - master = jQuery.Deferred(), - - // subordinate callback factory - updateFunc = function( i ) { - return function( value ) { - resolveContexts[ i ] = this; - resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; - if ( !( --remaining ) ) { - master.resolveWith( resolveContexts, resolveValues ); - } - }; - }; - - // Single- and empty arguments are adopted like Promise.resolve - if ( remaining <= 1 ) { - adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, - !remaining ); - - // Use .then() to unwrap secondary thenables (cf. gh-3000) - if ( master.state() === "pending" || - isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { - - return master.then(); - } - } - - // Multiple arguments are aggregated like Promise.all array elements - while ( i-- ) { - adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); - } - - return master.promise(); - } -} ); - - -// These usually indicate a programmer mistake during development, -// warn about them ASAP rather than swallowing them by default. -var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; - -jQuery.Deferred.exceptionHook = function( error, stack ) { - - // Support: IE 8 - 9 only - // Console exists when dev tools are open, which can happen at any time - if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { - window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); - } -}; - - - - -jQuery.readyException = function( error ) { - window.setTimeout( function() { - throw error; - } ); -}; - - - - -// The deferred used on DOM ready -var readyList = jQuery.Deferred(); - -jQuery.fn.ready = function( fn ) { - - readyList - .then( fn ) - - // Wrap jQuery.readyException in a function so that the lookup - // happens at the time of error handling instead of callback - // registration. - .catch( function( error ) { - jQuery.readyException( error ); - } ); - - return this; -}; - -jQuery.extend( { - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Handle when the DOM is ready - ready: function( wait ) { - - // Abort if there are pending holds or we're already ready - if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { - return; - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - } -} ); - -jQuery.ready.then = readyList.then; - -// The ready event handler and self cleanup method -function completed() { - document.removeEventListener( "DOMContentLoaded", completed ); - window.removeEventListener( "load", completed ); - jQuery.ready(); -} - -// Catch cases where $(document).ready() is called -// after the browser event has already occurred. -// Support: IE <=9 - 10 only -// Older IE sometimes signals "interactive" too soon -if ( document.readyState === "complete" || - ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { - - // Handle it asynchronously to allow scripts the opportunity to delay ready - window.setTimeout( jQuery.ready ); - -} else { - - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", completed ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", completed ); -} - - - - -// Multifunctional method to get and set values of a collection -// The value/s can optionally be executed if it's a function -var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { - var i = 0, - len = elems.length, - bulk = key == null; - - // Sets many values - if ( toType( key ) === "object" ) { - chainable = true; - for ( i in key ) { - access( elems, fn, i, key[ i ], true, emptyGet, raw ); - } - - // Sets one value - } else if ( value !== undefined ) { - chainable = true; - - if ( !isFunction( value ) ) { - raw = true; - } - - if ( bulk ) { - - // Bulk operations run against the entire set - if ( raw ) { - fn.call( elems, value ); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function( elem, _key, value ) { - return bulk.call( jQuery( elem ), value ); - }; - } - } - - if ( fn ) { - for ( ; i < len; i++ ) { - fn( - elems[ i ], key, raw ? - value : - value.call( elems[ i ], i, fn( elems[ i ], key ) ) - ); - } - } - } - - if ( chainable ) { - return elems; - } - - // Gets - if ( bulk ) { - return fn.call( elems ); - } - - return len ? fn( elems[ 0 ], key ) : emptyGet; -}; - - -// Matches dashed string for camelizing -var rmsPrefix = /^-ms-/, - rdashAlpha = /-([a-z])/g; - -// Used by camelCase as callback to replace() -function fcamelCase( _all, letter ) { - return letter.toUpperCase(); -} - -// Convert dashed to camelCase; used by the css and data modules -// Support: IE <=9 - 11, Edge 12 - 15 -// Microsoft forgot to hump their vendor prefix (#9572) -function camelCase( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); -} -var acceptData = function( owner ) { - - // Accepts only: - // - Node - // - Node.ELEMENT_NODE - // - Node.DOCUMENT_NODE - // - Object - // - Any - return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); -}; - - - - -function Data() { - this.expando = jQuery.expando + Data.uid++; -} - -Data.uid = 1; - -Data.prototype = { - - cache: function( owner ) { - - // Check if the owner object already has a cache - var value = owner[ this.expando ]; - - // If not, create one - if ( !value ) { - value = {}; - - // We can accept data for non-element nodes in modern browsers, - // but we should not, see #8335. - // Always return an empty object. - if ( acceptData( owner ) ) { - - // If it is a node unlikely to be stringify-ed or looped over - // use plain assignment - if ( owner.nodeType ) { - owner[ this.expando ] = value; - - // Otherwise secure it in a non-enumerable property - // configurable must be true to allow the property to be - // deleted when data is removed - } else { - Object.defineProperty( owner, this.expando, { - value: value, - configurable: true - } ); - } - } - } - - return value; - }, - set: function( owner, data, value ) { - var prop, - cache = this.cache( owner ); - - // Handle: [ owner, key, value ] args - // Always use camelCase key (gh-2257) - if ( typeof data === "string" ) { - cache[ camelCase( data ) ] = value; - - // Handle: [ owner, { properties } ] args - } else { - - // Copy the properties one-by-one to the cache object - for ( prop in data ) { - cache[ camelCase( prop ) ] = data[ prop ]; - } - } - return cache; - }, - get: function( owner, key ) { - return key === undefined ? - this.cache( owner ) : - - // Always use camelCase key (gh-2257) - owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; - }, - access: function( owner, key, value ) { - - // In cases where either: - // - // 1. No key was specified - // 2. A string key was specified, but no value provided - // - // Take the "read" path and allow the get method to determine - // which value to return, respectively either: - // - // 1. The entire cache object - // 2. The data stored at the key - // - if ( key === undefined || - ( ( key && typeof key === "string" ) && value === undefined ) ) { - - return this.get( owner, key ); - } - - // When the key is not a string, or both a key and value - // are specified, set or extend (existing objects) with either: - // - // 1. An object of properties - // 2. A key and value - // - this.set( owner, key, value ); - - // Since the "set" path can have two possible entry points - // return the expected data based on which path was taken[*] - return value !== undefined ? value : key; - }, - remove: function( owner, key ) { - var i, - cache = owner[ this.expando ]; - - if ( cache === undefined ) { - return; - } - - if ( key !== undefined ) { - - // Support array or space separated string of keys - if ( Array.isArray( key ) ) { - - // If key is an array of keys... - // We always set camelCase keys, so remove that. - key = key.map( camelCase ); - } else { - key = camelCase( key ); - - // If a key with the spaces exists, use it. - // Otherwise, create an array by matching non-whitespace - key = key in cache ? - [ key ] : - ( key.match( rnothtmlwhite ) || [] ); - } - - i = key.length; - - while ( i-- ) { - delete cache[ key[ i ] ]; - } - } - - // Remove the expando if there's no more data - if ( key === undefined || jQuery.isEmptyObject( cache ) ) { - - // Support: Chrome <=35 - 45 - // Webkit & Blink performance suffers when deleting properties - // from DOM nodes, so set to undefined instead - // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) - if ( owner.nodeType ) { - owner[ this.expando ] = undefined; - } else { - delete owner[ this.expando ]; - } - } - }, - hasData: function( owner ) { - var cache = owner[ this.expando ]; - return cache !== undefined && !jQuery.isEmptyObject( cache ); - } -}; -var dataPriv = new Data(); - -var dataUser = new Data(); - - - -// Implementation Summary -// -// 1. Enforce API surface and semantic compatibility with 1.9.x branch -// 2. Improve the module's maintainability by reducing the storage -// paths to a single mechanism. -// 3. Use the same single mechanism to support "private" and "user" data. -// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) -// 5. Avoid exposing implementation details on user objects (eg. expando properties) -// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 - -var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, - rmultiDash = /[A-Z]/g; - -function getData( data ) { - if ( data === "true" ) { - return true; - } - - if ( data === "false" ) { - return false; - } - - if ( data === "null" ) { - return null; - } - - // Only convert to a number if it doesn't change the string - if ( data === +data + "" ) { - return +data; - } - - if ( rbrace.test( data ) ) { - return JSON.parse( data ); - } - - return data; -} - -function dataAttr( elem, key, data ) { - var name; - - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = getData( data ); - } catch ( e ) {} - - // Make sure we set the data so it isn't changed later - dataUser.set( elem, key, data ); - } else { - data = undefined; - } - } - return data; -} - -jQuery.extend( { - hasData: function( elem ) { - return dataUser.hasData( elem ) || dataPriv.hasData( elem ); - }, - - data: function( elem, name, data ) { - return dataUser.access( elem, name, data ); - }, - - removeData: function( elem, name ) { - dataUser.remove( elem, name ); - }, - - // TODO: Now that all calls to _data and _removeData have been replaced - // with direct calls to dataPriv methods, these can be deprecated. - _data: function( elem, name, data ) { - return dataPriv.access( elem, name, data ); - }, - - _removeData: function( elem, name ) { - dataPriv.remove( elem, name ); - } -} ); - -jQuery.fn.extend( { - data: function( key, value ) { - var i, name, data, - elem = this[ 0 ], - attrs = elem && elem.attributes; - - // Gets all values - if ( key === undefined ) { - if ( this.length ) { - data = dataUser.get( elem ); - - if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { - i = attrs.length; - while ( i-- ) { - - // Support: IE 11 only - // The attrs elements can be null (#14894) - if ( attrs[ i ] ) { - name = attrs[ i ].name; - if ( name.indexOf( "data-" ) === 0 ) { - name = camelCase( name.slice( 5 ) ); - dataAttr( elem, name, data[ name ] ); - } - } - } - dataPriv.set( elem, "hasDataAttrs", true ); - } - } - - return data; - } - - // Sets multiple values - if ( typeof key === "object" ) { - return this.each( function() { - dataUser.set( this, key ); - } ); - } - - return access( this, function( value ) { - var data; - - // The calling jQuery object (element matches) is not empty - // (and therefore has an element appears at this[ 0 ]) and the - // `value` parameter was not undefined. An empty jQuery object - // will result in `undefined` for elem = this[ 0 ] which will - // throw an exception if an attempt to read a data cache is made. - if ( elem && value === undefined ) { - - // Attempt to get data from the cache - // The key will always be camelCased in Data - data = dataUser.get( elem, key ); - if ( data !== undefined ) { - return data; - } - - // Attempt to "discover" the data in - // HTML5 custom data-* attrs - data = dataAttr( elem, key ); - if ( data !== undefined ) { - return data; - } - - // We tried really hard, but the data doesn't exist. - return; - } - - // Set the data... - this.each( function() { - - // We always store the camelCased key - dataUser.set( this, key, value ); - } ); - }, null, value, arguments.length > 1, null, true ); - }, - - removeData: function( key ) { - return this.each( function() { - dataUser.remove( this, key ); - } ); - } -} ); - - -jQuery.extend( { - queue: function( elem, type, data ) { - var queue; - - if ( elem ) { - type = ( type || "fx" ) + "queue"; - queue = dataPriv.get( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !queue || Array.isArray( data ) ) { - queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); - } else { - queue.push( data ); - } - } - return queue || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks( elem, type ), - next = function() { - jQuery.dequeue( elem, type ); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - startLength--; - } - - if ( fn ) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - // Clear up the last queue stop function - delete hooks.stop; - fn.call( elem, next, hooks ); - } - - if ( !startLength && hooks ) { - hooks.empty.fire(); - } - }, - - // Not public - generate a queueHooks object, or return the current one - _queueHooks: function( elem, type ) { - var key = type + "queueHooks"; - return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { - empty: jQuery.Callbacks( "once memory" ).add( function() { - dataPriv.remove( elem, [ type + "queue", key ] ); - } ) - } ); - } -} ); - -jQuery.fn.extend( { - queue: function( type, data ) { - var setter = 2; - - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - setter--; - } - - if ( arguments.length < setter ) { - return jQuery.queue( this[ 0 ], type ); - } - - return data === undefined ? - this : - this.each( function() { - var queue = jQuery.queue( this, type, data ); - - // Ensure a hooks for this queue - jQuery._queueHooks( this, type ); - - if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - } ); - }, - dequeue: function( type ) { - return this.each( function() { - jQuery.dequeue( this, type ); - } ); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, obj ) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - }; - - if ( typeof type !== "string" ) { - obj = type; - type = undefined; - } - type = type || "fx"; - - while ( i-- ) { - tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); - if ( tmp && tmp.empty ) { - count++; - tmp.empty.add( resolve ); - } - } - resolve(); - return defer.promise( obj ); - } -} ); -var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; - -var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); - - -var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; - -var documentElement = document.documentElement; - - - - var isAttached = function( elem ) { - return jQuery.contains( elem.ownerDocument, elem ); - }, - composed = { composed: true }; - - // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only - // Check attachment across shadow DOM boundaries when possible (gh-3504) - // Support: iOS 10.0-10.2 only - // Early iOS 10 versions support `attachShadow` but not `getRootNode`, - // leading to errors. We need to check for `getRootNode`. - if ( documentElement.getRootNode ) { - isAttached = function( elem ) { - return jQuery.contains( elem.ownerDocument, elem ) || - elem.getRootNode( composed ) === elem.ownerDocument; - }; - } -var isHiddenWithinTree = function( elem, el ) { - - // isHiddenWithinTree might be called from jQuery#filter function; - // in that case, element will be second argument - elem = el || elem; - - // Inline style trumps all - return elem.style.display === "none" || - elem.style.display === "" && - - // Otherwise, check computed style - // Support: Firefox <=43 - 45 - // Disconnected elements can have computed display: none, so first confirm that elem is - // in the document. - isAttached( elem ) && - - jQuery.css( elem, "display" ) === "none"; - }; - - - -function adjustCSS( elem, prop, valueParts, tween ) { - var adjusted, scale, - maxIterations = 20, - currentValue = tween ? - function() { - return tween.cur(); - } : - function() { - return jQuery.css( elem, prop, "" ); - }, - initial = currentValue(), - unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), - - // Starting value computation is required for potential unit mismatches - initialInUnit = elem.nodeType && - ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && - rcssNum.exec( jQuery.css( elem, prop ) ); - - if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { - - // Support: Firefox <=54 - // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) - initial = initial / 2; - - // Trust units reported by jQuery.css - unit = unit || initialInUnit[ 3 ]; - - // Iteratively approximate from a nonzero starting point - initialInUnit = +initial || 1; - - while ( maxIterations-- ) { - - // Evaluate and update our best guess (doubling guesses that zero out). - // Finish if the scale equals or crosses 1 (making the old*new product non-positive). - jQuery.style( elem, prop, initialInUnit + unit ); - if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { - maxIterations = 0; - } - initialInUnit = initialInUnit / scale; - - } - - initialInUnit = initialInUnit * 2; - jQuery.style( elem, prop, initialInUnit + unit ); - - // Make sure we update the tween properties later on - valueParts = valueParts || []; - } - - if ( valueParts ) { - initialInUnit = +initialInUnit || +initial || 0; - - // Apply relative offset (+=/-=) if specified - adjusted = valueParts[ 1 ] ? - initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : - +valueParts[ 2 ]; - if ( tween ) { - tween.unit = unit; - tween.start = initialInUnit; - tween.end = adjusted; - } - } - return adjusted; -} - - -var defaultDisplayMap = {}; - -function getDefaultDisplay( elem ) { - var temp, - doc = elem.ownerDocument, - nodeName = elem.nodeName, - display = defaultDisplayMap[ nodeName ]; - - if ( display ) { - return display; - } - - temp = doc.body.appendChild( doc.createElement( nodeName ) ); - display = jQuery.css( temp, "display" ); - - temp.parentNode.removeChild( temp ); - - if ( display === "none" ) { - display = "block"; - } - defaultDisplayMap[ nodeName ] = display; - - return display; -} - -function showHide( elements, show ) { - var display, elem, - values = [], - index = 0, - length = elements.length; - - // Determine new display value for elements that need to change - for ( ; index < length; index++ ) { - elem = elements[ index ]; - if ( !elem.style ) { - continue; - } - - display = elem.style.display; - if ( show ) { - - // Since we force visibility upon cascade-hidden elements, an immediate (and slow) - // check is required in this first loop unless we have a nonempty display value (either - // inline or about-to-be-restored) - if ( display === "none" ) { - values[ index ] = dataPriv.get( elem, "display" ) || null; - if ( !values[ index ] ) { - elem.style.display = ""; - } - } - if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { - values[ index ] = getDefaultDisplay( elem ); - } - } else { - if ( display !== "none" ) { - values[ index ] = "none"; - - // Remember what we're overwriting - dataPriv.set( elem, "display", display ); - } - } - } - - // Set the display of the elements in a second loop to avoid constant reflow - for ( index = 0; index < length; index++ ) { - if ( values[ index ] != null ) { - elements[ index ].style.display = values[ index ]; - } - } - - return elements; -} - -jQuery.fn.extend( { - show: function() { - return showHide( this, true ); - }, - hide: function() { - return showHide( this ); - }, - toggle: function( state ) { - if ( typeof state === "boolean" ) { - return state ? this.show() : this.hide(); - } - - return this.each( function() { - if ( isHiddenWithinTree( this ) ) { - jQuery( this ).show(); - } else { - jQuery( this ).hide(); - } - } ); - } -} ); -var rcheckableType = ( /^(?:checkbox|radio)$/i ); - -var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); - -var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); - - - -( function() { - var fragment = document.createDocumentFragment(), - div = fragment.appendChild( document.createElement( "div" ) ), - input = document.createElement( "input" ); - - // Support: Android 4.0 - 4.3 only - // Check state lost if the name is set (#11217) - // Support: Windows Web Apps (WWA) - // `name` and `type` must use .setAttribute for WWA (#14901) - input.setAttribute( "type", "radio" ); - input.setAttribute( "checked", "checked" ); - input.setAttribute( "name", "t" ); - - div.appendChild( input ); - - // Support: Android <=4.1 only - // Older WebKit doesn't clone checked state correctly in fragments - support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Support: IE <=11 only - // Make sure textarea (and checkbox) defaultValue is properly cloned - div.innerHTML = ""; - support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; - - // Support: IE <=9 only - // IE <=9 replaces "; - support.option = !!div.lastChild; -} )(); - - -// We have to close these tags to support XHTML (#13200) -var wrapMap = { - - // XHTML parsers do not magically insert elements in the - // same way that tag soup parsers do. So we cannot shorten - // this by omitting or other required elements. - thead: [ 1, "", "
" ], - col: [ 2, "", "
" ], - tr: [ 2, "", "
" ], - td: [ 3, "", "
" ], - - _default: [ 0, "", "" ] -}; - -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - -// Support: IE <=9 only -if ( !support.option ) { - wrapMap.optgroup = wrapMap.option = [ 1, "" ]; -} - - -function getAll( context, tag ) { - - // Support: IE <=9 - 11 only - // Use typeof to avoid zero-argument method invocation on host objects (#15151) - var ret; - - if ( typeof context.getElementsByTagName !== "undefined" ) { - ret = context.getElementsByTagName( tag || "*" ); - - } else if ( typeof context.querySelectorAll !== "undefined" ) { - ret = context.querySelectorAll( tag || "*" ); - - } else { - ret = []; - } - - if ( tag === undefined || tag && nodeName( context, tag ) ) { - return jQuery.merge( [ context ], ret ); - } - - return ret; -} - - -// Mark scripts as having already been evaluated -function setGlobalEval( elems, refElements ) { - var i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - dataPriv.set( - elems[ i ], - "globalEval", - !refElements || dataPriv.get( refElements[ i ], "globalEval" ) - ); - } -} - - -var rhtml = /<|&#?\w+;/; - -function buildFragment( elems, context, scripts, selection, ignored ) { - var elem, tmp, tag, wrap, attached, j, - fragment = context.createDocumentFragment(), - nodes = [], - i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( toType( elem ) === "object" ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); - - // Deserialize a standard representation - tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; - - // Descend through wrappers to the right content - j = wrap[ 0 ]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, tmp.childNodes ); - - // Remember the top-level container - tmp = fragment.firstChild; - - // Ensure the created nodes are orphaned (#12392) - tmp.textContent = ""; - } - } - } - - // Remove wrapper from fragment - fragment.textContent = ""; - - i = 0; - while ( ( elem = nodes[ i++ ] ) ) { - - // Skip elements already in the context collection (trac-4087) - if ( selection && jQuery.inArray( elem, selection ) > -1 ) { - if ( ignored ) { - ignored.push( elem ); - } - continue; - } - - attached = isAttached( elem ); - - // Append to fragment - tmp = getAll( fragment.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( attached ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( ( elem = tmp[ j++ ] ) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - return fragment; -} - - -var - rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, - rtypenamespace = /^([^.]*)(?:\.(.+)|)/; - -function returnTrue() { - return true; -} - -function returnFalse() { - return false; -} - -// Support: IE <=9 - 11+ -// focus() and blur() are asynchronous, except when they are no-op. -// So expect focus to be synchronous when the element is already active, -// and blur to be synchronous when the element is not already active. -// (focus and blur are always synchronous in other supported browsers, -// this just defines when we can count on it). -function expectSync( elem, type ) { - return ( elem === safeActiveElement() ) === ( type === "focus" ); -} - -// Support: IE <=9 only -// Accessing document.activeElement can throw unexpectedly -// https://bugs.jquery.com/ticket/13393 -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - -function on( elem, types, selector, data, fn, one ) { - var origFn, type; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - on( elem, type, selector, data, types[ type ], one ); - } - return elem; - } - - if ( data == null && fn == null ) { - - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return elem; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return elem.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - } ); -} - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - global: {}, - - add: function( elem, types, handler, data, selector ) { - - var handleObjIn, eventHandle, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.get( elem ); - - // Only attach events to objects that accept data - if ( !acceptData( elem ) ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Ensure that invalid selectors throw exceptions at attach time - // Evaluate against documentElement in case elem is a non-element node (e.g., document) - if ( selector ) { - jQuery.find.matchesSelector( documentElement, selector ); - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if ( !( events = elemData.events ) ) { - events = elemData.events = Object.create( null ); - } - if ( !( eventHandle = elemData.handle ) ) { - eventHandle = elemData.handle = function( e ) { - - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? - jQuery.event.dispatch.apply( elem, arguments ) : undefined; - }; - } - - // Handle multiple events separated by a space - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // There *must* be a type, no attaching namespace-only handlers - if ( !type ) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend( { - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join( "." ) - }, handleObjIn ); - - // Init the event handler queue if we're the first - if ( !( handlers = events[ type ] ) ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener if the special events handler returns false - if ( !special.setup || - special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - }, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - - var j, origCount, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); - - if ( !elemData || !( events = elemData.events ) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[ type ] || []; - tmp = tmp[ 2 ] && - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); - - // Remove matching events - origCount = j = handlers.length; - while ( j-- ) { - handleObj = handlers[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || - selector === "**" && handleObj.selector ) ) { - handlers.splice( j, 1 ); - - if ( handleObj.selector ) { - handlers.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( origCount && !handlers.length ) { - if ( !special.teardown || - special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove data and the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - dataPriv.remove( elem, "handle events" ); - } - }, - - dispatch: function( nativeEvent ) { - - var i, j, ret, matched, handleObj, handlerQueue, - args = new Array( arguments.length ), - - // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix( nativeEvent ), - - handlers = ( - dataPriv.get( this, "events" ) || Object.create( null ) - )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[ 0 ] = event; - - for ( i = 1; i < arguments.length; i++ ) { - args[ i ] = arguments[ i ]; - } - - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { - event.currentTarget = matched.elem; - - j = 0; - while ( ( handleObj = matched.handlers[ j++ ] ) && - !event.isImmediatePropagationStopped() ) { - - // If the event is namespaced, then each handler is only invoked if it is - // specially universal or its namespaces are a superset of the event's. - if ( !event.rnamespace || handleObj.namespace === false || - event.rnamespace.test( handleObj.namespace ) ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || - handleObj.handler ).apply( matched.elem, args ); - - if ( ret !== undefined ) { - if ( ( event.result = ret ) === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - handlers: function( event, handlers ) { - var i, handleObj, sel, matchedHandlers, matchedSelectors, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Find delegate handlers - if ( delegateCount && - - // Support: IE <=9 - // Black-hole SVG instance trees (trac-13180) - cur.nodeType && - - // Support: Firefox <=42 - // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) - // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click - // Support: IE 11 only - // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) - !( event.type === "click" && event.button >= 1 ) ) { - - for ( ; cur !== this; cur = cur.parentNode || this ) { - - // Don't check non-elements (#13208) - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { - matchedHandlers = []; - matchedSelectors = {}; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - - // Don't conflict with Object.prototype properties (#13203) - sel = handleObj.selector + " "; - - if ( matchedSelectors[ sel ] === undefined ) { - matchedSelectors[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) > -1 : - jQuery.find( sel, this, null, [ cur ] ).length; - } - if ( matchedSelectors[ sel ] ) { - matchedHandlers.push( handleObj ); - } - } - if ( matchedHandlers.length ) { - handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); - } - } - } - } - - // Add the remaining (directly-bound) handlers - cur = this; - if ( delegateCount < handlers.length ) { - handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); - } - - return handlerQueue; - }, - - addProp: function( name, hook ) { - Object.defineProperty( jQuery.Event.prototype, name, { - enumerable: true, - configurable: true, - - get: isFunction( hook ) ? - function() { - if ( this.originalEvent ) { - return hook( this.originalEvent ); - } - } : - function() { - if ( this.originalEvent ) { - return this.originalEvent[ name ]; - } - }, - - set: function( value ) { - Object.defineProperty( this, name, { - enumerable: true, - configurable: true, - writable: true, - value: value - } ); - } - } ); - }, - - fix: function( originalEvent ) { - return originalEvent[ jQuery.expando ] ? - originalEvent : - new jQuery.Event( originalEvent ); - }, - - special: { - load: { - - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - click: { - - // Utilize native event to ensure correct state for checkable inputs - setup: function( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Claim the first handler - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - // dataPriv.set( el, "click", ... ) - leverageNative( el, "click", returnTrue ); - } - - // Return false to allow normal processing in the caller - return false; - }, - trigger: function( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Force setup before triggering a click - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - leverageNative( el, "click" ); - } - - // Return non-false to allow normal event-path propagation - return true; - }, - - // For cross-browser consistency, suppress native .click() on links - // Also prevent it if we're currently inside a leveraged native-event stack - _default: function( event ) { - var target = event.target; - return rcheckableType.test( target.type ) && - target.click && nodeName( target, "input" ) && - dataPriv.get( target, "click" ) || - nodeName( target, "a" ); - } - }, - - beforeunload: { - postDispatch: function( event ) { - - // Support: Firefox 20+ - // Firefox doesn't alert if the returnValue field is not set. - if ( event.result !== undefined && event.originalEvent ) { - event.originalEvent.returnValue = event.result; - } - } - } - } -}; - -// Ensure the presence of an event listener that handles manually-triggered -// synthetic events by interrupting progress until reinvoked in response to -// *native* events that it fires directly, ensuring that state changes have -// already occurred before other listeners are invoked. -function leverageNative( el, type, expectSync ) { - - // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add - if ( !expectSync ) { - if ( dataPriv.get( el, type ) === undefined ) { - jQuery.event.add( el, type, returnTrue ); - } - return; - } - - // Register the controller as a special universal handler for all event namespaces - dataPriv.set( el, type, false ); - jQuery.event.add( el, type, { - namespace: false, - handler: function( event ) { - var notAsync, result, - saved = dataPriv.get( this, type ); - - if ( ( event.isTrigger & 1 ) && this[ type ] ) { - - // Interrupt processing of the outer synthetic .trigger()ed event - // Saved data should be false in such cases, but might be a leftover capture object - // from an async native handler (gh-4350) - if ( !saved.length ) { - - // Store arguments for use when handling the inner native event - // There will always be at least one argument (an event object), so this array - // will not be confused with a leftover capture object. - saved = slice.call( arguments ); - dataPriv.set( this, type, saved ); - - // Trigger the native event and capture its result - // Support: IE <=9 - 11+ - // focus() and blur() are asynchronous - notAsync = expectSync( this, type ); - this[ type ](); - result = dataPriv.get( this, type ); - if ( saved !== result || notAsync ) { - dataPriv.set( this, type, false ); - } else { - result = {}; - } - if ( saved !== result ) { - - // Cancel the outer synthetic event - event.stopImmediatePropagation(); - event.preventDefault(); - return result.value; - } - - // If this is an inner synthetic event for an event with a bubbling surrogate - // (focus or blur), assume that the surrogate already propagated from triggering the - // native event and prevent that from happening again here. - // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the - // bubbling surrogate propagates *after* the non-bubbling base), but that seems - // less bad than duplication. - } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { - event.stopPropagation(); - } - - // If this is a native event triggered above, everything is now in order - // Fire an inner synthetic event with the original arguments - } else if ( saved.length ) { - - // ...and capture the result - dataPriv.set( this, type, { - value: jQuery.event.trigger( - - // Support: IE <=9 - 11+ - // Extend with the prototype to reset the above stopImmediatePropagation() - jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), - saved.slice( 1 ), - this - ) - } ); - - // Abort handling of the native event - event.stopImmediatePropagation(); - } - } - } ); -} - -jQuery.removeEvent = function( elem, type, handle ) { - - // This "if" is needed for plain objects - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle ); - } -}; - -jQuery.Event = function( src, props ) { - - // Allow instantiation without the 'new' keyword - if ( !( this instanceof jQuery.Event ) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = src.defaultPrevented || - src.defaultPrevented === undefined && - - // Support: Android <=2.3 only - src.returnValue === false ? - returnTrue : - returnFalse; - - // Create target properties - // Support: Safari <=6 - 7 only - // Target should not be a text node (#504, #13143) - this.target = ( src.target && src.target.nodeType === 3 ) ? - src.target.parentNode : - src.target; - - this.currentTarget = src.currentTarget; - this.relatedTarget = src.relatedTarget; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || Date.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - constructor: jQuery.Event, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - isSimulated: false, - - preventDefault: function() { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - - if ( e && !this.isSimulated ) { - e.preventDefault(); - } - }, - stopPropagation: function() { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopPropagation(); - } - }, - stopImmediatePropagation: function() { - var e = this.originalEvent; - - this.isImmediatePropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopImmediatePropagation(); - } - - this.stopPropagation(); - } -}; - -// Includes all common event props including KeyEvent and MouseEvent specific props -jQuery.each( { - altKey: true, - bubbles: true, - cancelable: true, - changedTouches: true, - ctrlKey: true, - detail: true, - eventPhase: true, - metaKey: true, - pageX: true, - pageY: true, - shiftKey: true, - view: true, - "char": true, - code: true, - charCode: true, - key: true, - keyCode: true, - button: true, - buttons: true, - clientX: true, - clientY: true, - offsetX: true, - offsetY: true, - pointerId: true, - pointerType: true, - screenX: true, - screenY: true, - targetTouches: true, - toElement: true, - touches: true, - - which: function( event ) { - var button = event.button; - - // Add which for key events - if ( event.which == null && rkeyEvent.test( event.type ) ) { - return event.charCode != null ? event.charCode : event.keyCode; - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { - if ( button & 1 ) { - return 1; - } - - if ( button & 2 ) { - return 3; - } - - if ( button & 4 ) { - return 2; - } - - return 0; - } - - return event.which; - } -}, jQuery.event.addProp ); - -jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { - jQuery.event.special[ type ] = { - - // Utilize native event if possible so blur/focus sequence is correct - setup: function() { - - // Claim the first handler - // dataPriv.set( this, "focus", ... ) - // dataPriv.set( this, "blur", ... ) - leverageNative( this, type, expectSync ); - - // Return false to allow normal processing in the caller - return false; - }, - trigger: function() { - - // Force setup before trigger - leverageNative( this, type ); - - // Return non-false to allow normal event-path propagation - return true; - }, - - delegateType: delegateType - }; -} ); - -// Create mouseenter/leave events using mouseover/out and event-time checks -// so that event delegation works in jQuery. -// Do the same for pointerenter/pointerleave and pointerover/pointerout -// -// Support: Safari 7 only -// Safari sends mouseenter too often; see: -// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 -// for the description of the bug (it existed in older Chrome versions as well). -jQuery.each( { - mouseenter: "mouseover", - mouseleave: "mouseout", - pointerenter: "pointerover", - pointerleave: "pointerout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mouseenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -} ); - -jQuery.fn.extend( { - - on: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn ); - }, - one: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? - handleObj.origType + "." + handleObj.namespace : - handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each( function() { - jQuery.event.remove( this, types, fn, selector ); - } ); - } -} ); - - -var - - // Support: IE <=10 - 11, Edge 12 - 13 only - // In IE/Edge using regex groups here causes severe slowdowns. - // See https://connect.microsoft.com/IE/feedback/details/1736512/ - rnoInnerhtml = /\s*$/g; - -// Prefer a tbody over its parent table for containing new rows -function manipulationTarget( elem, content ) { - if ( nodeName( elem, "table" ) && - nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { - - return jQuery( elem ).children( "tbody" )[ 0 ] || elem; - } - - return elem; -} - -// Replace/restore the type attribute of script elements for safe DOM manipulation -function disableScript( elem ) { - elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; - return elem; -} -function restoreScript( elem ) { - if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { - elem.type = elem.type.slice( 5 ); - } else { - elem.removeAttribute( "type" ); - } - - return elem; -} - -function cloneCopyEvent( src, dest ) { - var i, l, type, pdataOld, udataOld, udataCur, events; - - if ( dest.nodeType !== 1 ) { - return; - } - - // 1. Copy private data: events, handlers, etc. - if ( dataPriv.hasData( src ) ) { - pdataOld = dataPriv.get( src ); - events = pdataOld.events; - - if ( events ) { - dataPriv.remove( dest, "handle events" ); - - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); - } - } - } - } - - // 2. Copy user data - if ( dataUser.hasData( src ) ) { - udataOld = dataUser.access( src ); - udataCur = jQuery.extend( {}, udataOld ); - - dataUser.set( dest, udataCur ); - } -} - -// Fix IE bugs, see support tests -function fixInput( src, dest ) { - var nodeName = dest.nodeName.toLowerCase(); - - // Fails to persist the checked state of a cloned checkbox or radio button. - if ( nodeName === "input" && rcheckableType.test( src.type ) ) { - dest.checked = src.checked; - - // Fails to return the selected option to the default selected state when cloning options - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; - } -} - -function domManip( collection, args, callback, ignored ) { - - // Flatten any nested arrays - args = flat( args ); - - var fragment, first, scripts, hasScripts, node, doc, - i = 0, - l = collection.length, - iNoClone = l - 1, - value = args[ 0 ], - valueIsFunction = isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( valueIsFunction || - ( l > 1 && typeof value === "string" && - !support.checkClone && rchecked.test( value ) ) ) { - return collection.each( function( index ) { - var self = collection.eq( index ); - if ( valueIsFunction ) { - args[ 0 ] = value.call( this, index, self.html() ); - } - domManip( self, args, callback, ignored ); - } ); - } - - if ( l ) { - fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - // Require either new content or an interest in ignored elements to invoke the callback - if ( first || ignored ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item - // instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( collection[ i ], node, i ); - } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Reenable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !dataPriv.access( node, "globalEval" ) && - jQuery.contains( doc, node ) ) { - - if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { - - // Optional AJAX dependency, but won't run scripts if not present - if ( jQuery._evalUrl && !node.noModule ) { - jQuery._evalUrl( node.src, { - nonce: node.nonce || node.getAttribute( "nonce" ) - }, doc ); - } - } else { - DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); - } - } - } - } - } - } - - return collection; -} - -function remove( elem, selector, keepData ) { - var node, - nodes = selector ? jQuery.filter( selector, elem ) : elem, - i = 0; - - for ( ; ( node = nodes[ i ] ) != null; i++ ) { - if ( !keepData && node.nodeType === 1 ) { - jQuery.cleanData( getAll( node ) ); - } - - if ( node.parentNode ) { - if ( keepData && isAttached( node ) ) { - setGlobalEval( getAll( node, "script" ) ); - } - node.parentNode.removeChild( node ); - } - } - - return elem; -} - -jQuery.extend( { - htmlPrefilter: function( html ) { - return html; - }, - - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var i, l, srcElements, destElements, - clone = elem.cloneNode( true ), - inPage = isAttached( elem ); - - // Fix IE cloning issues - if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && - !jQuery.isXMLDoc( elem ) ) { - - // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 - destElements = getAll( clone ); - srcElements = getAll( elem ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - fixInput( srcElements[ i ], destElements[ i ] ); - } - } - - // Copy the events from the original to the clone - if ( dataAndEvents ) { - if ( deepDataAndEvents ) { - srcElements = srcElements || getAll( elem ); - destElements = destElements || getAll( clone ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - cloneCopyEvent( srcElements[ i ], destElements[ i ] ); - } - } else { - cloneCopyEvent( elem, clone ); - } - } - - // Preserve script evaluation history - destElements = getAll( clone, "script" ); - if ( destElements.length > 0 ) { - setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); - } - - // Return the cloned set - return clone; - }, - - cleanData: function( elems ) { - var data, elem, type, - special = jQuery.event.special, - i = 0; - - for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { - if ( acceptData( elem ) ) { - if ( ( data = elem[ dataPriv.expando ] ) ) { - if ( data.events ) { - for ( type in data.events ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataPriv.expando ] = undefined; - } - if ( elem[ dataUser.expando ] ) { - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataUser.expando ] = undefined; - } - } - } - } -} ); - -jQuery.fn.extend( { - detach: function( selector ) { - return remove( this, selector, true ); - }, - - remove: function( selector ) { - return remove( this, selector ); - }, - - text: function( value ) { - return access( this, function( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().each( function() { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - this.textContent = value; - } - } ); - }, null, value, arguments.length ); - }, - - append: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.appendChild( elem ); - } - } ); - }, - - prepend: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.insertBefore( elem, target.firstChild ); - } - } ); - }, - - before: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this ); - } - } ); - }, - - after: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - } - } ); - }, - - empty: function() { - var elem, - i = 0; - - for ( ; ( elem = this[ i ] ) != null; i++ ) { - if ( elem.nodeType === 1 ) { - - // Prevent memory leaks - jQuery.cleanData( getAll( elem, false ) ); - - // Remove any remaining nodes - elem.textContent = ""; - } - } - - return this; - }, - - clone: function( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map( function() { - return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - } ); - }, - - html: function( value ) { - return access( this, function( value ) { - var elem = this[ 0 ] || {}, - i = 0, - l = this.length; - - if ( value === undefined && elem.nodeType === 1 ) { - return elem.innerHTML; - } - - // See if we can take a shortcut and just use innerHTML - if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { - - value = jQuery.htmlPrefilter( value ); - - try { - for ( ; i < l; i++ ) { - elem = this[ i ] || {}; - - // Remove element nodes and prevent memory leaks - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch ( e ) {} - } - - if ( elem ) { - this.empty().append( value ); - } - }, null, value, arguments.length ); - }, - - replaceWith: function() { - var ignored = []; - - // Make the changes, replacing each non-ignored context element with the new content - return domManip( this, arguments, function( elem ) { - var parent = this.parentNode; - - if ( jQuery.inArray( this, ignored ) < 0 ) { - jQuery.cleanData( getAll( this ) ); - if ( parent ) { - parent.replaceChild( elem, this ); - } - } - - // Force callback invocation - }, ignored ); - } -} ); - -jQuery.each( { - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" -}, function( name, original ) { - jQuery.fn[ name ] = function( selector ) { - var elems, - ret = [], - insert = jQuery( selector ), - last = insert.length - 1, - i = 0; - - for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone( true ); - jQuery( insert[ i ] )[ original ]( elems ); - - // Support: Android <=4.0 only, PhantomJS 1 only - // .get() because push.apply(_, arraylike) throws on ancient WebKit - push.apply( ret, elems.get() ); - } - - return this.pushStack( ret ); - }; -} ); -var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); - -var getStyles = function( elem ) { - - // Support: IE <=11 only, Firefox <=30 (#15098, #14150) - // IE throws on elements created in popups - // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" - var view = elem.ownerDocument.defaultView; - - if ( !view || !view.opener ) { - view = window; - } - - return view.getComputedStyle( elem ); - }; - -var swap = function( elem, options, callback ) { - var ret, name, - old = {}; - - // Remember the old values, and insert the new ones - for ( name in options ) { - old[ name ] = elem.style[ name ]; - elem.style[ name ] = options[ name ]; - } - - ret = callback.call( elem ); - - // Revert the old values - for ( name in options ) { - elem.style[ name ] = old[ name ]; - } - - return ret; -}; - - -var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); - - - -( function() { - - // Executing both pixelPosition & boxSizingReliable tests require only one layout - // so they're executed at the same time to save the second computation. - function computeStyleTests() { - - // This is a singleton, we need to execute it only once - if ( !div ) { - return; - } - - container.style.cssText = "position:absolute;left:-11111px;width:60px;" + - "margin-top:1px;padding:0;border:0"; - div.style.cssText = - "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + - "margin:auto;border:1px;padding:1px;" + - "width:60%;top:1%"; - documentElement.appendChild( container ).appendChild( div ); - - var divStyle = window.getComputedStyle( div ); - pixelPositionVal = divStyle.top !== "1%"; - - // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 - reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; - - // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 - // Some styles come back with percentage values, even though they shouldn't - div.style.right = "60%"; - pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; - - // Support: IE 9 - 11 only - // Detect misreporting of content dimensions for box-sizing:border-box elements - boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; - - // Support: IE 9 only - // Detect overflow:scroll screwiness (gh-3699) - // Support: Chrome <=64 - // Don't get tricked when zoom affects offsetWidth (gh-4029) - div.style.position = "absolute"; - scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; - - documentElement.removeChild( container ); - - // Nullify the div so it wouldn't be stored in the memory and - // it will also be a sign that checks already performed - div = null; - } - - function roundPixelMeasures( measure ) { - return Math.round( parseFloat( measure ) ); - } - - var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, - reliableTrDimensionsVal, reliableMarginLeftVal, - container = document.createElement( "div" ), - div = document.createElement( "div" ); - - // Finish early in limited (non-browser) environments - if ( !div.style ) { - return; - } - - // Support: IE <=9 - 11 only - // Style of cloned element affects source element cloned (#8908) - div.style.backgroundClip = "content-box"; - div.cloneNode( true ).style.backgroundClip = ""; - support.clearCloneStyle = div.style.backgroundClip === "content-box"; - - jQuery.extend( support, { - boxSizingReliable: function() { - computeStyleTests(); - return boxSizingReliableVal; - }, - pixelBoxStyles: function() { - computeStyleTests(); - return pixelBoxStylesVal; - }, - pixelPosition: function() { - computeStyleTests(); - return pixelPositionVal; - }, - reliableMarginLeft: function() { - computeStyleTests(); - return reliableMarginLeftVal; - }, - scrollboxSize: function() { - computeStyleTests(); - return scrollboxSizeVal; - }, - - // Support: IE 9 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Behavior in IE 9 is more subtle than in newer versions & it passes - // some versions of this test; make sure not to make it pass there! - reliableTrDimensions: function() { - var table, tr, trChild, trStyle; - if ( reliableTrDimensionsVal == null ) { - table = document.createElement( "table" ); - tr = document.createElement( "tr" ); - trChild = document.createElement( "div" ); - - table.style.cssText = "position:absolute;left:-11111px"; - tr.style.height = "1px"; - trChild.style.height = "9px"; - - documentElement - .appendChild( table ) - .appendChild( tr ) - .appendChild( trChild ); - - trStyle = window.getComputedStyle( tr ); - reliableTrDimensionsVal = parseInt( trStyle.height ) > 3; - - documentElement.removeChild( table ); - } - return reliableTrDimensionsVal; - } - } ); -} )(); - - -function curCSS( elem, name, computed ) { - var width, minWidth, maxWidth, ret, - - // Support: Firefox 51+ - // Retrieving style before computed somehow - // fixes an issue with getting wrong values - // on detached elements - style = elem.style; - - computed = computed || getStyles( elem ); - - // getPropertyValue is needed for: - // .css('filter') (IE 9 only, #12537) - // .css('--customProperty) (#3144) - if ( computed ) { - ret = computed.getPropertyValue( name ) || computed[ name ]; - - if ( ret === "" && !isAttached( elem ) ) { - ret = jQuery.style( elem, name ); - } - - // A tribute to the "awesome hack by Dean Edwards" - // Android Browser returns percentage for some values, - // but width seems to be reliably pixels. - // This is against the CSSOM draft spec: - // https://drafts.csswg.org/cssom/#resolved-values - if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { - - // Remember the original values - width = style.width; - minWidth = style.minWidth; - maxWidth = style.maxWidth; - - // Put in the new values to get a computed value out - style.minWidth = style.maxWidth = style.width = ret; - ret = computed.width; - - // Revert the changed values - style.width = width; - style.minWidth = minWidth; - style.maxWidth = maxWidth; - } - } - - return ret !== undefined ? - - // Support: IE <=9 - 11 only - // IE returns zIndex value as an integer. - ret + "" : - ret; -} - - -function addGetHookIf( conditionFn, hookFn ) { - - // Define the hook, we'll check on the first run if it's really needed. - return { - get: function() { - if ( conditionFn() ) { - - // Hook not needed (or it's not possible to use it due - // to missing dependency), remove it. - delete this.get; - return; - } - - // Hook needed; redefine it so that the support test is not executed again. - return ( this.get = hookFn ).apply( this, arguments ); - } - }; -} - - -var cssPrefixes = [ "Webkit", "Moz", "ms" ], - emptyStyle = document.createElement( "div" ).style, - vendorProps = {}; - -// Return a vendor-prefixed property or undefined -function vendorPropName( name ) { - - // Check for vendor prefixed names - var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), - i = cssPrefixes.length; - - while ( i-- ) { - name = cssPrefixes[ i ] + capName; - if ( name in emptyStyle ) { - return name; - } - } -} - -// Return a potentially-mapped jQuery.cssProps or vendor prefixed property -function finalPropName( name ) { - var final = jQuery.cssProps[ name ] || vendorProps[ name ]; - - if ( final ) { - return final; - } - if ( name in emptyStyle ) { - return name; - } - return vendorProps[ name ] = vendorPropName( name ) || name; -} - - -var - - // Swappable if display is none or starts with table - // except "table", "table-cell", or "table-caption" - // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display - rdisplayswap = /^(none|table(?!-c[ea]).+)/, - rcustomProp = /^--/, - cssShow = { position: "absolute", visibility: "hidden", display: "block" }, - cssNormalTransform = { - letterSpacing: "0", - fontWeight: "400" - }; - -function setPositiveNumber( _elem, value, subtract ) { - - // Any relative (+/-) values have already been - // normalized at this point - var matches = rcssNum.exec( value ); - return matches ? - - // Guard against undefined "subtract", e.g., when used as in cssHooks - Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : - value; -} - -function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { - var i = dimension === "width" ? 1 : 0, - extra = 0, - delta = 0; - - // Adjustment may not be necessary - if ( box === ( isBorderBox ? "border" : "content" ) ) { - return 0; - } - - for ( ; i < 4; i += 2 ) { - - // Both box models exclude margin - if ( box === "margin" ) { - delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); - } - - // If we get here with a content-box, we're seeking "padding" or "border" or "margin" - if ( !isBorderBox ) { - - // Add padding - delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - - // For "border" or "margin", add border - if ( box !== "padding" ) { - delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - - // But still keep track of it otherwise - } else { - extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - - // If we get here with a border-box (content + padding + border), we're seeking "content" or - // "padding" or "margin" - } else { - - // For "content", subtract padding - if ( box === "content" ) { - delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - } - - // For "content" or "padding", subtract border - if ( box !== "margin" ) { - delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } - } - - // Account for positive content-box scroll gutter when requested by providing computedVal - if ( !isBorderBox && computedVal >= 0 ) { - - // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border - // Assuming integer scroll gutter, subtract the rest and round down - delta += Math.max( 0, Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - computedVal - - delta - - extra - - 0.5 - - // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter - // Use an explicit zero to avoid NaN (gh-3964) - ) ) || 0; - } - - return delta; -} - -function getWidthOrHeight( elem, dimension, extra ) { - - // Start with computed style - var styles = getStyles( elem ), - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). - // Fake content-box until we know it's needed to know the true value. - boxSizingNeeded = !support.boxSizingReliable() || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - valueIsBorderBox = isBorderBox, - - val = curCSS( elem, dimension, styles ), - offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); - - // Support: Firefox <=54 - // Return a confounding non-pixel value or feign ignorance, as appropriate. - if ( rnumnonpx.test( val ) ) { - if ( !extra ) { - return val; - } - val = "auto"; - } - - - // Support: IE 9 - 11 only - // Use offsetWidth/offsetHeight for when box sizing is unreliable. - // In those cases, the computed value can be trusted to be border-box. - if ( ( !support.boxSizingReliable() && isBorderBox || - - // Support: IE 10 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Interestingly, in some cases IE 9 doesn't suffer from this issue. - !support.reliableTrDimensions() && nodeName( elem, "tr" ) || - - // Fall back to offsetWidth/offsetHeight when value is "auto" - // This happens for inline elements with no explicit setting (gh-3571) - val === "auto" || - - // Support: Android <=4.1 - 4.3 only - // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) - !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && - - // Make sure the element is visible & connected - elem.getClientRects().length ) { - - isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; - - // Where available, offsetWidth/offsetHeight approximate border box dimensions. - // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the - // retrieved value as a content box dimension. - valueIsBorderBox = offsetProp in elem; - if ( valueIsBorderBox ) { - val = elem[ offsetProp ]; - } - } - - // Normalize "" and auto - val = parseFloat( val ) || 0; - - // Adjust for the element's box model - return ( val + - boxModelAdjustment( - elem, - dimension, - extra || ( isBorderBox ? "border" : "content" ), - valueIsBorderBox, - styles, - - // Provide the current computed size to request scroll gutter calculation (gh-3589) - val - ) - ) + "px"; -} - -jQuery.extend( { - - // Add in style property hooks for overriding the default - // behavior of getting and setting a style property - cssHooks: { - opacity: { - get: function( elem, computed ) { - if ( computed ) { - - // We should always get a number back from opacity - var ret = curCSS( elem, "opacity" ); - return ret === "" ? "1" : ret; - } - } - } - }, - - // Don't automatically add "px" to these possibly-unitless properties - cssNumber: { - "animationIterationCount": true, - "columnCount": true, - "fillOpacity": true, - "flexGrow": true, - "flexShrink": true, - "fontWeight": true, - "gridArea": true, - "gridColumn": true, - "gridColumnEnd": true, - "gridColumnStart": true, - "gridRow": true, - "gridRowEnd": true, - "gridRowStart": true, - "lineHeight": true, - "opacity": true, - "order": true, - "orphans": true, - "widows": true, - "zIndex": true, - "zoom": true - }, - - // Add in properties whose names you wish to fix before - // setting or getting the value - cssProps: {}, - - // Get and set the style property on a DOM Node - style: function( elem, name, value, extra ) { - - // Don't set styles on text and comment nodes - if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { - return; - } - - // Make sure that we're working with the right name - var ret, type, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ), - style = elem.style; - - // Make sure that we're working with the right name. We don't - // want to query the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Gets hook for the prefixed version, then unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // Check if we're setting a value - if ( value !== undefined ) { - type = typeof value; - - // Convert "+=" or "-=" to relative numbers (#7345) - if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { - value = adjustCSS( elem, name, ret ); - - // Fixes bug #9237 - type = "number"; - } - - // Make sure that null and NaN values aren't set (#7116) - if ( value == null || value !== value ) { - return; - } - - // If a number was passed in, add the unit (except for certain CSS properties) - // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append - // "px" to a few hardcoded values. - if ( type === "number" && !isCustomProp ) { - value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); - } - - // background-* props affect original clone's values - if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { - style[ name ] = "inherit"; - } - - // If a hook was provided, use that value, otherwise just set the specified value - if ( !hooks || !( "set" in hooks ) || - ( value = hooks.set( elem, value, extra ) ) !== undefined ) { - - if ( isCustomProp ) { - style.setProperty( name, value ); - } else { - style[ name ] = value; - } - } - - } else { - - // If a hook was provided get the non-computed value from there - if ( hooks && "get" in hooks && - ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { - - return ret; - } - - // Otherwise just get the value from the style object - return style[ name ]; - } - }, - - css: function( elem, name, extra, styles ) { - var val, num, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ); - - // Make sure that we're working with the right name. We don't - // want to modify the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Try prefixed name followed by the unprefixed name - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // If a hook was provided get the computed value from there - if ( hooks && "get" in hooks ) { - val = hooks.get( elem, true, extra ); - } - - // Otherwise, if a way to get the computed value exists, use that - if ( val === undefined ) { - val = curCSS( elem, name, styles ); - } - - // Convert "normal" to computed value - if ( val === "normal" && name in cssNormalTransform ) { - val = cssNormalTransform[ name ]; - } - - // Make numeric if forced or a qualifier was provided and val looks numeric - if ( extra === "" || extra ) { - num = parseFloat( val ); - return extra === true || isFinite( num ) ? num || 0 : val; - } - - return val; - } -} ); - -jQuery.each( [ "height", "width" ], function( _i, dimension ) { - jQuery.cssHooks[ dimension ] = { - get: function( elem, computed, extra ) { - if ( computed ) { - - // Certain elements can have dimension info if we invisibly show them - // but it must have a current display style that would benefit - return rdisplayswap.test( jQuery.css( elem, "display" ) ) && - - // Support: Safari 8+ - // Table columns in Safari have non-zero offsetWidth & zero - // getBoundingClientRect().width unless display is changed. - // Support: IE <=11 only - // Running getBoundingClientRect on a disconnected node - // in IE throws an error. - ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? - swap( elem, cssShow, function() { - return getWidthOrHeight( elem, dimension, extra ); - } ) : - getWidthOrHeight( elem, dimension, extra ); - } - }, - - set: function( elem, value, extra ) { - var matches, - styles = getStyles( elem ), - - // Only read styles.position if the test has a chance to fail - // to avoid forcing a reflow. - scrollboxSizeBuggy = !support.scrollboxSize() && - styles.position === "absolute", - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) - boxSizingNeeded = scrollboxSizeBuggy || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - subtract = extra ? - boxModelAdjustment( - elem, - dimension, - extra, - isBorderBox, - styles - ) : - 0; - - // Account for unreliable border-box dimensions by comparing offset* to computed and - // faking a content-box to get border and padding (gh-3699) - if ( isBorderBox && scrollboxSizeBuggy ) { - subtract -= Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - parseFloat( styles[ dimension ] ) - - boxModelAdjustment( elem, dimension, "border", false, styles ) - - 0.5 - ); - } - - // Convert to pixels if value adjustment is needed - if ( subtract && ( matches = rcssNum.exec( value ) ) && - ( matches[ 3 ] || "px" ) !== "px" ) { - - elem.style[ dimension ] = value; - value = jQuery.css( elem, dimension ); - } - - return setPositiveNumber( elem, value, subtract ); - } - }; -} ); - -jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, - function( elem, computed ) { - if ( computed ) { - return ( parseFloat( curCSS( elem, "marginLeft" ) ) || - elem.getBoundingClientRect().left - - swap( elem, { marginLeft: 0 }, function() { - return elem.getBoundingClientRect().left; - } ) - ) + "px"; - } - } -); - -// These hooks are used by animate to expand properties -jQuery.each( { - margin: "", - padding: "", - border: "Width" -}, function( prefix, suffix ) { - jQuery.cssHooks[ prefix + suffix ] = { - expand: function( value ) { - var i = 0, - expanded = {}, - - // Assumes a single number if not a string - parts = typeof value === "string" ? value.split( " " ) : [ value ]; - - for ( ; i < 4; i++ ) { - expanded[ prefix + cssExpand[ i ] + suffix ] = - parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; - } - - return expanded; - } - }; - - if ( prefix !== "margin" ) { - jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; - } -} ); - -jQuery.fn.extend( { - css: function( name, value ) { - return access( this, function( elem, name, value ) { - var styles, len, - map = {}, - i = 0; - - if ( Array.isArray( name ) ) { - styles = getStyles( elem ); - len = name.length; - - for ( ; i < len; i++ ) { - map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); - } - - return map; - } - - return value !== undefined ? - jQuery.style( elem, name, value ) : - jQuery.css( elem, name ); - }, name, value, arguments.length > 1 ); - } -} ); - - -function Tween( elem, options, prop, end, easing ) { - return new Tween.prototype.init( elem, options, prop, end, easing ); -} -jQuery.Tween = Tween; - -Tween.prototype = { - constructor: Tween, - init: function( elem, options, prop, end, easing, unit ) { - this.elem = elem; - this.prop = prop; - this.easing = easing || jQuery.easing._default; - this.options = options; - this.start = this.now = this.cur(); - this.end = end; - this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); - }, - cur: function() { - var hooks = Tween.propHooks[ this.prop ]; - - return hooks && hooks.get ? - hooks.get( this ) : - Tween.propHooks._default.get( this ); - }, - run: function( percent ) { - var eased, - hooks = Tween.propHooks[ this.prop ]; - - if ( this.options.duration ) { - this.pos = eased = jQuery.easing[ this.easing ]( - percent, this.options.duration * percent, 0, 1, this.options.duration - ); - } else { - this.pos = eased = percent; - } - this.now = ( this.end - this.start ) * eased + this.start; - - if ( this.options.step ) { - this.options.step.call( this.elem, this.now, this ); - } - - if ( hooks && hooks.set ) { - hooks.set( this ); - } else { - Tween.propHooks._default.set( this ); - } - return this; - } -}; - -Tween.prototype.init.prototype = Tween.prototype; - -Tween.propHooks = { - _default: { - get: function( tween ) { - var result; - - // Use a property on the element directly when it is not a DOM element, - // or when there is no matching style property that exists. - if ( tween.elem.nodeType !== 1 || - tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { - return tween.elem[ tween.prop ]; - } - - // Passing an empty string as a 3rd parameter to .css will automatically - // attempt a parseFloat and fallback to a string if the parse fails. - // Simple values such as "10px" are parsed to Float; - // complex values such as "rotate(1rad)" are returned as-is. - result = jQuery.css( tween.elem, tween.prop, "" ); - - // Empty strings, null, undefined and "auto" are converted to 0. - return !result || result === "auto" ? 0 : result; - }, - set: function( tween ) { - - // Use step hook for back compat. - // Use cssHook if its there. - // Use .style if available and use plain properties where available. - if ( jQuery.fx.step[ tween.prop ] ) { - jQuery.fx.step[ tween.prop ]( tween ); - } else if ( tween.elem.nodeType === 1 && ( - jQuery.cssHooks[ tween.prop ] || - tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { - jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); - } else { - tween.elem[ tween.prop ] = tween.now; - } - } - } -}; - -// Support: IE <=9 only -// Panic based approach to setting things on disconnected nodes -Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { - set: function( tween ) { - if ( tween.elem.nodeType && tween.elem.parentNode ) { - tween.elem[ tween.prop ] = tween.now; - } - } -}; - -jQuery.easing = { - linear: function( p ) { - return p; - }, - swing: function( p ) { - return 0.5 - Math.cos( p * Math.PI ) / 2; - }, - _default: "swing" -}; - -jQuery.fx = Tween.prototype.init; - -// Back compat <1.8 extension point -jQuery.fx.step = {}; - - - - -var - fxNow, inProgress, - rfxtypes = /^(?:toggle|show|hide)$/, - rrun = /queueHooks$/; - -function schedule() { - if ( inProgress ) { - if ( document.hidden === false && window.requestAnimationFrame ) { - window.requestAnimationFrame( schedule ); - } else { - window.setTimeout( schedule, jQuery.fx.interval ); - } - - jQuery.fx.tick(); - } -} - -// Animations created synchronously will run synchronously -function createFxNow() { - window.setTimeout( function() { - fxNow = undefined; - } ); - return ( fxNow = Date.now() ); -} - -// Generate parameters to create a standard animation -function genFx( type, includeWidth ) { - var which, - i = 0, - attrs = { height: type }; - - // If we include width, step value is 1 to do all cssExpand values, - // otherwise step value is 2 to skip over Left and Right - includeWidth = includeWidth ? 1 : 0; - for ( ; i < 4; i += 2 - includeWidth ) { - which = cssExpand[ i ]; - attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; - } - - if ( includeWidth ) { - attrs.opacity = attrs.width = type; - } - - return attrs; -} - -function createTween( value, prop, animation ) { - var tween, - collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), - index = 0, - length = collection.length; - for ( ; index < length; index++ ) { - if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { - - // We're done with this property - return tween; - } - } -} - -function defaultPrefilter( elem, props, opts ) { - var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, - isBox = "width" in props || "height" in props, - anim = this, - orig = {}, - style = elem.style, - hidden = elem.nodeType && isHiddenWithinTree( elem ), - dataShow = dataPriv.get( elem, "fxshow" ); - - // Queue-skipping animations hijack the fx hooks - if ( !opts.queue ) { - hooks = jQuery._queueHooks( elem, "fx" ); - if ( hooks.unqueued == null ) { - hooks.unqueued = 0; - oldfire = hooks.empty.fire; - hooks.empty.fire = function() { - if ( !hooks.unqueued ) { - oldfire(); - } - }; - } - hooks.unqueued++; - - anim.always( function() { - - // Ensure the complete handler is called before this completes - anim.always( function() { - hooks.unqueued--; - if ( !jQuery.queue( elem, "fx" ).length ) { - hooks.empty.fire(); - } - } ); - } ); - } - - // Detect show/hide animations - for ( prop in props ) { - value = props[ prop ]; - if ( rfxtypes.test( value ) ) { - delete props[ prop ]; - toggle = toggle || value === "toggle"; - if ( value === ( hidden ? "hide" : "show" ) ) { - - // Pretend to be hidden if this is a "show" and - // there is still data from a stopped show/hide - if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { - hidden = true; - - // Ignore all other no-op show/hide data - } else { - continue; - } - } - orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); - } - } - - // Bail out if this is a no-op like .hide().hide() - propTween = !jQuery.isEmptyObject( props ); - if ( !propTween && jQuery.isEmptyObject( orig ) ) { - return; - } - - // Restrict "overflow" and "display" styles during box animations - if ( isBox && elem.nodeType === 1 ) { - - // Support: IE <=9 - 11, Edge 12 - 15 - // Record all 3 overflow attributes because IE does not infer the shorthand - // from identically-valued overflowX and overflowY and Edge just mirrors - // the overflowX value there. - opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; - - // Identify a display type, preferring old show/hide data over the CSS cascade - restoreDisplay = dataShow && dataShow.display; - if ( restoreDisplay == null ) { - restoreDisplay = dataPriv.get( elem, "display" ); - } - display = jQuery.css( elem, "display" ); - if ( display === "none" ) { - if ( restoreDisplay ) { - display = restoreDisplay; - } else { - - // Get nonempty value(s) by temporarily forcing visibility - showHide( [ elem ], true ); - restoreDisplay = elem.style.display || restoreDisplay; - display = jQuery.css( elem, "display" ); - showHide( [ elem ] ); - } - } - - // Animate inline elements as inline-block - if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { - if ( jQuery.css( elem, "float" ) === "none" ) { - - // Restore the original display value at the end of pure show/hide animations - if ( !propTween ) { - anim.done( function() { - style.display = restoreDisplay; - } ); - if ( restoreDisplay == null ) { - display = style.display; - restoreDisplay = display === "none" ? "" : display; - } - } - style.display = "inline-block"; - } - } - } - - if ( opts.overflow ) { - style.overflow = "hidden"; - anim.always( function() { - style.overflow = opts.overflow[ 0 ]; - style.overflowX = opts.overflow[ 1 ]; - style.overflowY = opts.overflow[ 2 ]; - } ); - } - - // Implement show/hide animations - propTween = false; - for ( prop in orig ) { - - // General show/hide setup for this element animation - if ( !propTween ) { - if ( dataShow ) { - if ( "hidden" in dataShow ) { - hidden = dataShow.hidden; - } - } else { - dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); - } - - // Store hidden/visible for toggle so `.stop().toggle()` "reverses" - if ( toggle ) { - dataShow.hidden = !hidden; - } - - // Show elements before animating them - if ( hidden ) { - showHide( [ elem ], true ); - } - - /* eslint-disable no-loop-func */ - - anim.done( function() { - - /* eslint-enable no-loop-func */ - - // The final step of a "hide" animation is actually hiding the element - if ( !hidden ) { - showHide( [ elem ] ); - } - dataPriv.remove( elem, "fxshow" ); - for ( prop in orig ) { - jQuery.style( elem, prop, orig[ prop ] ); - } - } ); - } - - // Per-property setup - propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); - if ( !( prop in dataShow ) ) { - dataShow[ prop ] = propTween.start; - if ( hidden ) { - propTween.end = propTween.start; - propTween.start = 0; - } - } - } -} - -function propFilter( props, specialEasing ) { - var index, name, easing, value, hooks; - - // camelCase, specialEasing and expand cssHook pass - for ( index in props ) { - name = camelCase( index ); - easing = specialEasing[ name ]; - value = props[ index ]; - if ( Array.isArray( value ) ) { - easing = value[ 1 ]; - value = props[ index ] = value[ 0 ]; - } - - if ( index !== name ) { - props[ name ] = value; - delete props[ index ]; - } - - hooks = jQuery.cssHooks[ name ]; - if ( hooks && "expand" in hooks ) { - value = hooks.expand( value ); - delete props[ name ]; - - // Not quite $.extend, this won't overwrite existing keys. - // Reusing 'index' because we have the correct "name" - for ( index in value ) { - if ( !( index in props ) ) { - props[ index ] = value[ index ]; - specialEasing[ index ] = easing; - } - } - } else { - specialEasing[ name ] = easing; - } - } -} - -function Animation( elem, properties, options ) { - var result, - stopped, - index = 0, - length = Animation.prefilters.length, - deferred = jQuery.Deferred().always( function() { - - // Don't match elem in the :animated selector - delete tick.elem; - } ), - tick = function() { - if ( stopped ) { - return false; - } - var currentTime = fxNow || createFxNow(), - remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), - - // Support: Android 2.3 only - // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) - temp = remaining / animation.duration || 0, - percent = 1 - temp, - index = 0, - length = animation.tweens.length; - - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( percent ); - } - - deferred.notifyWith( elem, [ animation, percent, remaining ] ); - - // If there's more to do, yield - if ( percent < 1 && length ) { - return remaining; - } - - // If this was an empty animation, synthesize a final progress notification - if ( !length ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - } - - // Resolve the animation and report its conclusion - deferred.resolveWith( elem, [ animation ] ); - return false; - }, - animation = deferred.promise( { - elem: elem, - props: jQuery.extend( {}, properties ), - opts: jQuery.extend( true, { - specialEasing: {}, - easing: jQuery.easing._default - }, options ), - originalProperties: properties, - originalOptions: options, - startTime: fxNow || createFxNow(), - duration: options.duration, - tweens: [], - createTween: function( prop, end ) { - var tween = jQuery.Tween( elem, animation.opts, prop, end, - animation.opts.specialEasing[ prop ] || animation.opts.easing ); - animation.tweens.push( tween ); - return tween; - }, - stop: function( gotoEnd ) { - var index = 0, - - // If we are going to the end, we want to run all the tweens - // otherwise we skip this part - length = gotoEnd ? animation.tweens.length : 0; - if ( stopped ) { - return this; - } - stopped = true; - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( 1 ); - } - - // Resolve when we played the last frame; otherwise, reject - if ( gotoEnd ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - deferred.resolveWith( elem, [ animation, gotoEnd ] ); - } else { - deferred.rejectWith( elem, [ animation, gotoEnd ] ); - } - return this; - } - } ), - props = animation.props; - - propFilter( props, animation.opts.specialEasing ); - - for ( ; index < length; index++ ) { - result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); - if ( result ) { - if ( isFunction( result.stop ) ) { - jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = - result.stop.bind( result ); - } - return result; - } - } - - jQuery.map( props, createTween, animation ); - - if ( isFunction( animation.opts.start ) ) { - animation.opts.start.call( elem, animation ); - } - - // Attach callbacks from options - animation - .progress( animation.opts.progress ) - .done( animation.opts.done, animation.opts.complete ) - .fail( animation.opts.fail ) - .always( animation.opts.always ); - - jQuery.fx.timer( - jQuery.extend( tick, { - elem: elem, - anim: animation, - queue: animation.opts.queue - } ) - ); - - return animation; -} - -jQuery.Animation = jQuery.extend( Animation, { - - tweeners: { - "*": [ function( prop, value ) { - var tween = this.createTween( prop, value ); - adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); - return tween; - } ] - }, - - tweener: function( props, callback ) { - if ( isFunction( props ) ) { - callback = props; - props = [ "*" ]; - } else { - props = props.match( rnothtmlwhite ); - } - - var prop, - index = 0, - length = props.length; - - for ( ; index < length; index++ ) { - prop = props[ index ]; - Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; - Animation.tweeners[ prop ].unshift( callback ); - } - }, - - prefilters: [ defaultPrefilter ], - - prefilter: function( callback, prepend ) { - if ( prepend ) { - Animation.prefilters.unshift( callback ); - } else { - Animation.prefilters.push( callback ); - } - } -} ); - -jQuery.speed = function( speed, easing, fn ) { - var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { - complete: fn || !fn && easing || - isFunction( speed ) && speed, - duration: speed, - easing: fn && easing || easing && !isFunction( easing ) && easing - }; - - // Go to the end state if fx are off - if ( jQuery.fx.off ) { - opt.duration = 0; - - } else { - if ( typeof opt.duration !== "number" ) { - if ( opt.duration in jQuery.fx.speeds ) { - opt.duration = jQuery.fx.speeds[ opt.duration ]; - - } else { - opt.duration = jQuery.fx.speeds._default; - } - } - } - - // Normalize opt.queue - true/undefined/null -> "fx" - if ( opt.queue == null || opt.queue === true ) { - opt.queue = "fx"; - } - - // Queueing - opt.old = opt.complete; - - opt.complete = function() { - if ( isFunction( opt.old ) ) { - opt.old.call( this ); - } - - if ( opt.queue ) { - jQuery.dequeue( this, opt.queue ); - } - }; - - return opt; -}; - -jQuery.fn.extend( { - fadeTo: function( speed, to, easing, callback ) { - - // Show any hidden elements after setting opacity to 0 - return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() - - // Animate to the value specified - .end().animate( { opacity: to }, speed, easing, callback ); - }, - animate: function( prop, speed, easing, callback ) { - var empty = jQuery.isEmptyObject( prop ), - optall = jQuery.speed( speed, easing, callback ), - doAnimation = function() { - - // Operate on a copy of prop so per-property easing won't be lost - var anim = Animation( this, jQuery.extend( {}, prop ), optall ); - - // Empty animations, or finishing resolves immediately - if ( empty || dataPriv.get( this, "finish" ) ) { - anim.stop( true ); - } - }; - doAnimation.finish = doAnimation; - - return empty || optall.queue === false ? - this.each( doAnimation ) : - this.queue( optall.queue, doAnimation ); - }, - stop: function( type, clearQueue, gotoEnd ) { - var stopQueue = function( hooks ) { - var stop = hooks.stop; - delete hooks.stop; - stop( gotoEnd ); - }; - - if ( typeof type !== "string" ) { - gotoEnd = clearQueue; - clearQueue = type; - type = undefined; - } - if ( clearQueue ) { - this.queue( type || "fx", [] ); - } - - return this.each( function() { - var dequeue = true, - index = type != null && type + "queueHooks", - timers = jQuery.timers, - data = dataPriv.get( this ); - - if ( index ) { - if ( data[ index ] && data[ index ].stop ) { - stopQueue( data[ index ] ); - } - } else { - for ( index in data ) { - if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { - stopQueue( data[ index ] ); - } - } - } - - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && - ( type == null || timers[ index ].queue === type ) ) { - - timers[ index ].anim.stop( gotoEnd ); - dequeue = false; - timers.splice( index, 1 ); - } - } - - // Start the next in the queue if the last step wasn't forced. - // Timers currently will call their complete callbacks, which - // will dequeue but only if they were gotoEnd. - if ( dequeue || !gotoEnd ) { - jQuery.dequeue( this, type ); - } - } ); - }, - finish: function( type ) { - if ( type !== false ) { - type = type || "fx"; - } - return this.each( function() { - var index, - data = dataPriv.get( this ), - queue = data[ type + "queue" ], - hooks = data[ type + "queueHooks" ], - timers = jQuery.timers, - length = queue ? queue.length : 0; - - // Enable finishing flag on private data - data.finish = true; - - // Empty the queue first - jQuery.queue( this, type, [] ); - - if ( hooks && hooks.stop ) { - hooks.stop.call( this, true ); - } - - // Look for any active animations, and finish them - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && timers[ index ].queue === type ) { - timers[ index ].anim.stop( true ); - timers.splice( index, 1 ); - } - } - - // Look for any animations in the old queue and finish them - for ( index = 0; index < length; index++ ) { - if ( queue[ index ] && queue[ index ].finish ) { - queue[ index ].finish.call( this ); - } - } - - // Turn off finishing flag - delete data.finish; - } ); - } -} ); - -jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { - var cssFn = jQuery.fn[ name ]; - jQuery.fn[ name ] = function( speed, easing, callback ) { - return speed == null || typeof speed === "boolean" ? - cssFn.apply( this, arguments ) : - this.animate( genFx( name, true ), speed, easing, callback ); - }; -} ); - -// Generate shortcuts for custom animations -jQuery.each( { - slideDown: genFx( "show" ), - slideUp: genFx( "hide" ), - slideToggle: genFx( "toggle" ), - fadeIn: { opacity: "show" }, - fadeOut: { opacity: "hide" }, - fadeToggle: { opacity: "toggle" } -}, function( name, props ) { - jQuery.fn[ name ] = function( speed, easing, callback ) { - return this.animate( props, speed, easing, callback ); - }; -} ); - -jQuery.timers = []; -jQuery.fx.tick = function() { - var timer, - i = 0, - timers = jQuery.timers; - - fxNow = Date.now(); - - for ( ; i < timers.length; i++ ) { - timer = timers[ i ]; - - // Run the timer and safely remove it when done (allowing for external removal) - if ( !timer() && timers[ i ] === timer ) { - timers.splice( i--, 1 ); - } - } - - if ( !timers.length ) { - jQuery.fx.stop(); - } - fxNow = undefined; -}; - -jQuery.fx.timer = function( timer ) { - jQuery.timers.push( timer ); - jQuery.fx.start(); -}; - -jQuery.fx.interval = 13; -jQuery.fx.start = function() { - if ( inProgress ) { - return; - } - - inProgress = true; - schedule(); -}; - -jQuery.fx.stop = function() { - inProgress = null; -}; - -jQuery.fx.speeds = { - slow: 600, - fast: 200, - - // Default speed - _default: 400 -}; - - -// Based off of the plugin by Clint Helfers, with permission. -// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ -jQuery.fn.delay = function( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; - type = type || "fx"; - - return this.queue( type, function( next, hooks ) { - var timeout = window.setTimeout( next, time ); - hooks.stop = function() { - window.clearTimeout( timeout ); - }; - } ); -}; - - -( function() { - var input = document.createElement( "input" ), - select = document.createElement( "select" ), - opt = select.appendChild( document.createElement( "option" ) ); - - input.type = "checkbox"; - - // Support: Android <=4.3 only - // Default value for a checkbox should be "on" - support.checkOn = input.value !== ""; - - // Support: IE <=11 only - // Must access selectedIndex to make default options select - support.optSelected = opt.selected; - - // Support: IE <=11 only - // An input loses its value after becoming a radio - input = document.createElement( "input" ); - input.value = "t"; - input.type = "radio"; - support.radioValue = input.value === "t"; -} )(); - - -var boolHook, - attrHandle = jQuery.expr.attrHandle; - -jQuery.fn.extend( { - attr: function( name, value ) { - return access( this, jQuery.attr, name, value, arguments.length > 1 ); - }, - - removeAttr: function( name ) { - return this.each( function() { - jQuery.removeAttr( this, name ); - } ); - } -} ); - -jQuery.extend( { - attr: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set attributes on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - // Fallback to prop when attributes are not supported - if ( typeof elem.getAttribute === "undefined" ) { - return jQuery.prop( elem, name, value ); - } - - // Attribute hooks are determined by the lowercase version - // Grab necessary hook if one is defined - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - hooks = jQuery.attrHooks[ name.toLowerCase() ] || - ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); - } - - if ( value !== undefined ) { - if ( value === null ) { - jQuery.removeAttr( elem, name ); - return; - } - - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - elem.setAttribute( name, value + "" ); - return value; - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - ret = jQuery.find.attr( elem, name ); - - // Non-existent attributes return null, we normalize to undefined - return ret == null ? undefined : ret; - }, - - attrHooks: { - type: { - set: function( elem, value ) { - if ( !support.radioValue && value === "radio" && - nodeName( elem, "input" ) ) { - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; - } - return value; - } - } - } - }, - - removeAttr: function( elem, value ) { - var name, - i = 0, - - // Attribute names can contain non-HTML whitespace characters - // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 - attrNames = value && value.match( rnothtmlwhite ); - - if ( attrNames && elem.nodeType === 1 ) { - while ( ( name = attrNames[ i++ ] ) ) { - elem.removeAttribute( name ); - } - } - } -} ); - -// Hooks for boolean attributes -boolHook = { - set: function( elem, value, name ) { - if ( value === false ) { - - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else { - elem.setAttribute( name, name ); - } - return name; - } -}; - -jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { - var getter = attrHandle[ name ] || jQuery.find.attr; - - attrHandle[ name ] = function( elem, name, isXML ) { - var ret, handle, - lowercaseName = name.toLowerCase(); - - if ( !isXML ) { - - // Avoid an infinite loop by temporarily removing this function from the getter - handle = attrHandle[ lowercaseName ]; - attrHandle[ lowercaseName ] = ret; - ret = getter( elem, name, isXML ) != null ? - lowercaseName : - null; - attrHandle[ lowercaseName ] = handle; - } - return ret; - }; -} ); - - - - -var rfocusable = /^(?:input|select|textarea|button)$/i, - rclickable = /^(?:a|area)$/i; - -jQuery.fn.extend( { - prop: function( name, value ) { - return access( this, jQuery.prop, name, value, arguments.length > 1 ); - }, - - removeProp: function( name ) { - return this.each( function() { - delete this[ jQuery.propFix[ name ] || name ]; - } ); - } -} ); - -jQuery.extend( { - prop: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set properties on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } - - if ( value !== undefined ) { - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - return ( elem[ name ] = value ); - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - return elem[ name ]; - }, - - propHooks: { - tabIndex: { - get: function( elem ) { - - // Support: IE <=9 - 11 only - // elem.tabIndex doesn't always return the - // correct value when it hasn't been explicitly set - // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - // Use proper attribute retrieval(#12072) - var tabindex = jQuery.find.attr( elem, "tabindex" ); - - if ( tabindex ) { - return parseInt( tabindex, 10 ); - } - - if ( - rfocusable.test( elem.nodeName ) || - rclickable.test( elem.nodeName ) && - elem.href - ) { - return 0; - } - - return -1; - } - } - }, - - propFix: { - "for": "htmlFor", - "class": "className" - } -} ); - -// Support: IE <=11 only -// Accessing the selectedIndex property -// forces the browser to respect setting selected -// on the option -// The getter ensures a default option is selected -// when in an optgroup -// eslint rule "no-unused-expressions" is disabled for this code -// since it considers such accessions noop -if ( !support.optSelected ) { - jQuery.propHooks.selected = { - get: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent && parent.parentNode ) { - parent.parentNode.selectedIndex; - } - return null; - }, - set: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent ) { - parent.selectedIndex; - - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; - } - } - } - }; -} - -jQuery.each( [ - "tabIndex", - "readOnly", - "maxLength", - "cellSpacing", - "cellPadding", - "rowSpan", - "colSpan", - "useMap", - "frameBorder", - "contentEditable" -], function() { - jQuery.propFix[ this.toLowerCase() ] = this; -} ); - - - - - // Strip and collapse whitespace according to HTML spec - // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace - function stripAndCollapse( value ) { - var tokens = value.match( rnothtmlwhite ) || []; - return tokens.join( " " ); - } - - -function getClass( elem ) { - return elem.getAttribute && elem.getAttribute( "class" ) || ""; -} - -function classesToArray( value ) { - if ( Array.isArray( value ) ) { - return value; - } - if ( typeof value === "string" ) { - return value.match( rnothtmlwhite ) || []; - } - return []; -} - -jQuery.fn.extend( { - addClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - if ( cur.indexOf( " " + clazz + " " ) < 0 ) { - cur += clazz + " "; - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - removeClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - if ( !arguments.length ) { - return this.attr( "class", "" ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - - // This expression is here for better compressibility (see addClass) - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - - // Remove *all* instances - while ( cur.indexOf( " " + clazz + " " ) > -1 ) { - cur = cur.replace( " " + clazz + " ", " " ); - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - toggleClass: function( value, stateVal ) { - var type = typeof value, - isValidValue = type === "string" || Array.isArray( value ); - - if ( typeof stateVal === "boolean" && isValidValue ) { - return stateVal ? this.addClass( value ) : this.removeClass( value ); - } - - if ( isFunction( value ) ) { - return this.each( function( i ) { - jQuery( this ).toggleClass( - value.call( this, i, getClass( this ), stateVal ), - stateVal - ); - } ); - } - - return this.each( function() { - var className, i, self, classNames; - - if ( isValidValue ) { - - // Toggle individual class names - i = 0; - self = jQuery( this ); - classNames = classesToArray( value ); - - while ( ( className = classNames[ i++ ] ) ) { - - // Check each className given, space separated list - if ( self.hasClass( className ) ) { - self.removeClass( className ); - } else { - self.addClass( className ); - } - } - - // Toggle whole class name - } else if ( value === undefined || type === "boolean" ) { - className = getClass( this ); - if ( className ) { - - // Store className if set - dataPriv.set( this, "__className__", className ); - } - - // If the element has a class name or if we're passed `false`, - // then remove the whole classname (if there was one, the above saved it). - // Otherwise bring back whatever was previously saved (if anything), - // falling back to the empty string if nothing was stored. - if ( this.setAttribute ) { - this.setAttribute( "class", - className || value === false ? - "" : - dataPriv.get( this, "__className__" ) || "" - ); - } - } - } ); - }, - - hasClass: function( selector ) { - var className, elem, - i = 0; - - className = " " + selector + " "; - while ( ( elem = this[ i++ ] ) ) { - if ( elem.nodeType === 1 && - ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { - return true; - } - } - - return false; - } -} ); - - - - -var rreturn = /\r/g; - -jQuery.fn.extend( { - val: function( value ) { - var hooks, ret, valueIsFunction, - elem = this[ 0 ]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.type ] || - jQuery.valHooks[ elem.nodeName.toLowerCase() ]; - - if ( hooks && - "get" in hooks && - ( ret = hooks.get( elem, "value" ) ) !== undefined - ) { - return ret; - } - - ret = elem.value; - - // Handle most common string cases - if ( typeof ret === "string" ) { - return ret.replace( rreturn, "" ); - } - - // Handle cases where value is null/undef or number - return ret == null ? "" : ret; - } - - return; - } - - valueIsFunction = isFunction( value ); - - return this.each( function( i ) { - var val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( valueIsFunction ) { - val = value.call( this, i, jQuery( this ).val() ); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - - } else if ( typeof val === "number" ) { - val += ""; - - } else if ( Array.isArray( val ) ) { - val = jQuery.map( val, function( value ) { - return value == null ? "" : value + ""; - } ); - } - - hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; - - // If set returns undefined, fall back to normal setting - if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - } ); - } -} ); - -jQuery.extend( { - valHooks: { - option: { - get: function( elem ) { - - var val = jQuery.find.attr( elem, "value" ); - return val != null ? - val : - - // Support: IE <=10 - 11 only - // option.text throws exceptions (#14686, #14858) - // Strip and collapse whitespace - // https://html.spec.whatwg.org/#strip-and-collapse-whitespace - stripAndCollapse( jQuery.text( elem ) ); - } - }, - select: { - get: function( elem ) { - var value, option, i, - options = elem.options, - index = elem.selectedIndex, - one = elem.type === "select-one", - values = one ? null : [], - max = one ? index + 1 : options.length; - - if ( index < 0 ) { - i = max; - - } else { - i = one ? index : 0; - } - - // Loop through all the selected options - for ( ; i < max; i++ ) { - option = options[ i ]; - - // Support: IE <=9 only - // IE8-9 doesn't update selected after form reset (#2551) - if ( ( option.selected || i === index ) && - - // Don't return options that are disabled or in a disabled optgroup - !option.disabled && - ( !option.parentNode.disabled || - !nodeName( option.parentNode, "optgroup" ) ) ) { - - // Get the specific value for the option - value = jQuery( option ).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - return values; - }, - - set: function( elem, value ) { - var optionSet, option, - options = elem.options, - values = jQuery.makeArray( value ), - i = options.length; - - while ( i-- ) { - option = options[ i ]; - - /* eslint-disable no-cond-assign */ - - if ( option.selected = - jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 - ) { - optionSet = true; - } - - /* eslint-enable no-cond-assign */ - } - - // Force browsers to behave consistently when non-matching value is set - if ( !optionSet ) { - elem.selectedIndex = -1; - } - return values; - } - } - } -} ); - -// Radios and checkboxes getter/setter -jQuery.each( [ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = { - set: function( elem, value ) { - if ( Array.isArray( value ) ) { - return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); - } - } - }; - if ( !support.checkOn ) { - jQuery.valHooks[ this ].get = function( elem ) { - return elem.getAttribute( "value" ) === null ? "on" : elem.value; - }; - } -} ); - - - - -// Return jQuery for attributes-only inclusion - - -support.focusin = "onfocusin" in window; - - -var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - stopPropagationCallback = function( e ) { - e.stopPropagation(); - }; - -jQuery.extend( jQuery.event, { - - trigger: function( event, data, elem, onlyHandlers ) { - - var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, - eventPath = [ elem || document ], - type = hasOwn.call( event, "type" ) ? event.type : event, - namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; - - cur = lastElement = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf( "." ) > -1 ) { - - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split( "." ); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf( ":" ) < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[ jQuery.expando ] ? - event : - new jQuery.Event( type, typeof event === "object" && event ); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join( "." ); - event.rnamespace = event.namespace ? - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? - [ event ] : - jQuery.makeArray( data, [ event ] ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - if ( !rfocusMorph.test( bubbleType + type ) ) { - cur = cur.parentNode; - } - for ( ; cur; cur = cur.parentNode ) { - eventPath.push( cur ); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( tmp === ( elem.ownerDocument || document ) ) { - eventPath.push( tmp.defaultView || tmp.parentWindow || window ); - } - } - - // Fire handlers on the event path - i = 0; - while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { - lastElement = cur; - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( - dataPriv.get( cur, "events" ) || Object.create( null ) - )[ event.type ] && - dataPriv.get( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - - // Native handler - handle = ontype && cur[ ontype ]; - if ( handle && handle.apply && acceptData( cur ) ) { - event.result = handle.apply( cur, data ); - if ( event.result === false ) { - event.preventDefault(); - } - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( ( !special._default || - special._default.apply( eventPath.pop(), data ) === false ) && - acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name as the event. - // Don't do default actions on window, that's where global variables be (#6170) - if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ ontype ]; - - if ( tmp ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - - if ( event.isPropagationStopped() ) { - lastElement.addEventListener( type, stopPropagationCallback ); - } - - elem[ type ](); - - if ( event.isPropagationStopped() ) { - lastElement.removeEventListener( type, stopPropagationCallback ); - } - - jQuery.event.triggered = undefined; - - if ( tmp ) { - elem[ ontype ] = tmp; - } - } - } - } - - return event.result; - }, - - // Piggyback on a donor event to simulate a different one - // Used only for `focus(in | out)` events - simulate: function( type, elem, event ) { - var e = jQuery.extend( - new jQuery.Event(), - event, - { - type: type, - isSimulated: true - } - ); - - jQuery.event.trigger( e, null, elem ); - } - -} ); - -jQuery.fn.extend( { - - trigger: function( type, data ) { - return this.each( function() { - jQuery.event.trigger( type, data, this ); - } ); - }, - triggerHandler: function( type, data ) { - var elem = this[ 0 ]; - if ( elem ) { - return jQuery.event.trigger( type, data, elem, true ); - } - } -} ); - - -// Support: Firefox <=44 -// Firefox doesn't have focus(in | out) events -// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 -// -// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 -// focus(in | out) events fire after focus & blur events, -// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order -// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 -if ( !support.focusin ) { - jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler on the document while someone wants focusin/focusout - var handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - - // Handle: regular nodes (via `this.ownerDocument`), window - // (via `this.document`) & document (via `this`). - var doc = this.ownerDocument || this.document || this, - attaches = dataPriv.access( doc, fix ); - - if ( !attaches ) { - doc.addEventListener( orig, handler, true ); - } - dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); - }, - teardown: function() { - var doc = this.ownerDocument || this.document || this, - attaches = dataPriv.access( doc, fix ) - 1; - - if ( !attaches ) { - doc.removeEventListener( orig, handler, true ); - dataPriv.remove( doc, fix ); - - } else { - dataPriv.access( doc, fix, attaches ); - } - } - }; - } ); -} -var location = window.location; - -var nonce = { guid: Date.now() }; - -var rquery = ( /\?/ ); - - - -// Cross-browser xml parsing -jQuery.parseXML = function( data ) { - var xml; - if ( !data || typeof data !== "string" ) { - return null; - } - - // Support: IE 9 - 11 only - // IE throws on parseFromString with invalid input. - try { - xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); - } catch ( e ) { - xml = undefined; - } - - if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { - jQuery.error( "Invalid XML: " + data ); - } - return xml; -}; - - -var - rbracket = /\[\]$/, - rCRLF = /\r?\n/g, - rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, - rsubmittable = /^(?:input|select|textarea|keygen)/i; - -function buildParams( prefix, obj, traditional, add ) { - var name; - - if ( Array.isArray( obj ) ) { - - // Serialize array item. - jQuery.each( obj, function( i, v ) { - if ( traditional || rbracket.test( prefix ) ) { - - // Treat each array item as a scalar. - add( prefix, v ); - - } else { - - // Item is non-scalar (array or object), encode its numeric index. - buildParams( - prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", - v, - traditional, - add - ); - } - } ); - - } else if ( !traditional && toType( obj ) === "object" ) { - - // Serialize object item. - for ( name in obj ) { - buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); - } - - } else { - - // Serialize scalar item. - add( prefix, obj ); - } -} - -// Serialize an array of form elements or a set of -// key/values into a query string -jQuery.param = function( a, traditional ) { - var prefix, - s = [], - add = function( key, valueOrFunction ) { - - // If value is a function, invoke it and use its return value - var value = isFunction( valueOrFunction ) ? - valueOrFunction() : - valueOrFunction; - - s[ s.length ] = encodeURIComponent( key ) + "=" + - encodeURIComponent( value == null ? "" : value ); - }; - - if ( a == null ) { - return ""; - } - - // If an array was passed in, assume that it is an array of form elements. - if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { - - // Serialize the form elements - jQuery.each( a, function() { - add( this.name, this.value ); - } ); - - } else { - - // If traditional, encode the "old" way (the way 1.3.2 or older - // did it), otherwise encode params recursively. - for ( prefix in a ) { - buildParams( prefix, a[ prefix ], traditional, add ); - } - } - - // Return the resulting serialization - return s.join( "&" ); -}; - -jQuery.fn.extend( { - serialize: function() { - return jQuery.param( this.serializeArray() ); - }, - serializeArray: function() { - return this.map( function() { - - // Can add propHook for "elements" to filter or add form elements - var elements = jQuery.prop( this, "elements" ); - return elements ? jQuery.makeArray( elements ) : this; - } ) - .filter( function() { - var type = this.type; - - // Use .is( ":disabled" ) so that fieldset[disabled] works - return this.name && !jQuery( this ).is( ":disabled" ) && - rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && - ( this.checked || !rcheckableType.test( type ) ); - } ) - .map( function( _i, elem ) { - var val = jQuery( this ).val(); - - if ( val == null ) { - return null; - } - - if ( Array.isArray( val ) ) { - return jQuery.map( val, function( val ) { - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ); - } - - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ).get(); - } -} ); - - -var - r20 = /%20/g, - rhash = /#.*$/, - rantiCache = /([?&])_=[^&]*/, - rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, - - // #7653, #8125, #8152: local protocol detection - rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, - rnoContent = /^(?:GET|HEAD)$/, - rprotocol = /^\/\//, - - /* Prefilters - * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) - * 2) These are called: - * - BEFORE asking for a transport - * - AFTER param serialization (s.data is a string if s.processData is true) - * 3) key is the dataType - * 4) the catchall symbol "*" can be used - * 5) execution will start with transport dataType and THEN continue down to "*" if needed - */ - prefilters = {}, - - /* Transports bindings - * 1) key is the dataType - * 2) the catchall symbol "*" can be used - * 3) selection will start with transport dataType and THEN go to "*" if needed - */ - transports = {}, - - // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression - allTypes = "*/".concat( "*" ), - - // Anchor tag for parsing the document origin - originAnchor = document.createElement( "a" ); - originAnchor.href = location.href; - -// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport -function addToPrefiltersOrTransports( structure ) { - - // dataTypeExpression is optional and defaults to "*" - return function( dataTypeExpression, func ) { - - if ( typeof dataTypeExpression !== "string" ) { - func = dataTypeExpression; - dataTypeExpression = "*"; - } - - var dataType, - i = 0, - dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; - - if ( isFunction( func ) ) { - - // For each dataType in the dataTypeExpression - while ( ( dataType = dataTypes[ i++ ] ) ) { - - // Prepend if requested - if ( dataType[ 0 ] === "+" ) { - dataType = dataType.slice( 1 ) || "*"; - ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); - - // Otherwise append - } else { - ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); - } - } - } - }; -} - -// Base inspection function for prefilters and transports -function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { - - var inspected = {}, - seekingTransport = ( structure === transports ); - - function inspect( dataType ) { - var selected; - inspected[ dataType ] = true; - jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { - var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); - if ( typeof dataTypeOrTransport === "string" && - !seekingTransport && !inspected[ dataTypeOrTransport ] ) { - - options.dataTypes.unshift( dataTypeOrTransport ); - inspect( dataTypeOrTransport ); - return false; - } else if ( seekingTransport ) { - return !( selected = dataTypeOrTransport ); - } - } ); - return selected; - } - - return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); -} - -// A special extend for ajax options -// that takes "flat" options (not to be deep extended) -// Fixes #9887 -function ajaxExtend( target, src ) { - var key, deep, - flatOptions = jQuery.ajaxSettings.flatOptions || {}; - - for ( key in src ) { - if ( src[ key ] !== undefined ) { - ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; - } - } - if ( deep ) { - jQuery.extend( true, target, deep ); - } - - return target; -} - -/* Handles responses to an ajax request: - * - finds the right dataType (mediates between content-type and expected dataType) - * - returns the corresponding response - */ -function ajaxHandleResponses( s, jqXHR, responses ) { - - var ct, type, finalDataType, firstDataType, - contents = s.contents, - dataTypes = s.dataTypes; - - // Remove auto dataType and get content-type in the process - while ( dataTypes[ 0 ] === "*" ) { - dataTypes.shift(); - if ( ct === undefined ) { - ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); - } - } - - // Check if we're dealing with a known content-type - if ( ct ) { - for ( type in contents ) { - if ( contents[ type ] && contents[ type ].test( ct ) ) { - dataTypes.unshift( type ); - break; - } - } - } - - // Check to see if we have a response for the expected dataType - if ( dataTypes[ 0 ] in responses ) { - finalDataType = dataTypes[ 0 ]; - } else { - - // Try convertible dataTypes - for ( type in responses ) { - if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { - finalDataType = type; - break; - } - if ( !firstDataType ) { - firstDataType = type; - } - } - - // Or just use first one - finalDataType = finalDataType || firstDataType; - } - - // If we found a dataType - // We add the dataType to the list if needed - // and return the corresponding response - if ( finalDataType ) { - if ( finalDataType !== dataTypes[ 0 ] ) { - dataTypes.unshift( finalDataType ); - } - return responses[ finalDataType ]; - } -} - -/* Chain conversions given the request and the original response - * Also sets the responseXXX fields on the jqXHR instance - */ -function ajaxConvert( s, response, jqXHR, isSuccess ) { - var conv2, current, conv, tmp, prev, - converters = {}, - - // Work with a copy of dataTypes in case we need to modify it for conversion - dataTypes = s.dataTypes.slice(); - - // Create converters map with lowercased keys - if ( dataTypes[ 1 ] ) { - for ( conv in s.converters ) { - converters[ conv.toLowerCase() ] = s.converters[ conv ]; - } - } - - current = dataTypes.shift(); - - // Convert to each sequential dataType - while ( current ) { - - if ( s.responseFields[ current ] ) { - jqXHR[ s.responseFields[ current ] ] = response; - } - - // Apply the dataFilter if provided - if ( !prev && isSuccess && s.dataFilter ) { - response = s.dataFilter( response, s.dataType ); - } - - prev = current; - current = dataTypes.shift(); - - if ( current ) { - - // There's only work to do if current dataType is non-auto - if ( current === "*" ) { - - current = prev; - - // Convert response if prev dataType is non-auto and differs from current - } else if ( prev !== "*" && prev !== current ) { - - // Seek a direct converter - conv = converters[ prev + " " + current ] || converters[ "* " + current ]; - - // If none found, seek a pair - if ( !conv ) { - for ( conv2 in converters ) { - - // If conv2 outputs current - tmp = conv2.split( " " ); - if ( tmp[ 1 ] === current ) { - - // If prev can be converted to accepted input - conv = converters[ prev + " " + tmp[ 0 ] ] || - converters[ "* " + tmp[ 0 ] ]; - if ( conv ) { - - // Condense equivalence converters - if ( conv === true ) { - conv = converters[ conv2 ]; - - // Otherwise, insert the intermediate dataType - } else if ( converters[ conv2 ] !== true ) { - current = tmp[ 0 ]; - dataTypes.unshift( tmp[ 1 ] ); - } - break; - } - } - } - } - - // Apply converter (if not an equivalence) - if ( conv !== true ) { - - // Unless errors are allowed to bubble, catch and return them - if ( conv && s.throws ) { - response = conv( response ); - } else { - try { - response = conv( response ); - } catch ( e ) { - return { - state: "parsererror", - error: conv ? e : "No conversion from " + prev + " to " + current - }; - } - } - } - } - } - } - - return { state: "success", data: response }; -} - -jQuery.extend( { - - // Counter for holding the number of active queries - active: 0, - - // Last-Modified header cache for next request - lastModified: {}, - etag: {}, - - ajaxSettings: { - url: location.href, - type: "GET", - isLocal: rlocalProtocol.test( location.protocol ), - global: true, - processData: true, - async: true, - contentType: "application/x-www-form-urlencoded; charset=UTF-8", - - /* - timeout: 0, - data: null, - dataType: null, - username: null, - password: null, - cache: null, - throws: false, - traditional: false, - headers: {}, - */ - - accepts: { - "*": allTypes, - text: "text/plain", - html: "text/html", - xml: "application/xml, text/xml", - json: "application/json, text/javascript" - }, - - contents: { - xml: /\bxml\b/, - html: /\bhtml/, - json: /\bjson\b/ - }, - - responseFields: { - xml: "responseXML", - text: "responseText", - json: "responseJSON" - }, - - // Data converters - // Keys separate source (or catchall "*") and destination types with a single space - converters: { - - // Convert anything to text - "* text": String, - - // Text to html (true = no transformation) - "text html": true, - - // Evaluate text as a json expression - "text json": JSON.parse, - - // Parse text as xml - "text xml": jQuery.parseXML - }, - - // For options that shouldn't be deep extended: - // you can add your own custom options here if - // and when you create one that shouldn't be - // deep extended (see ajaxExtend) - flatOptions: { - url: true, - context: true - } - }, - - // Creates a full fledged settings object into target - // with both ajaxSettings and settings fields. - // If target is omitted, writes into ajaxSettings. - ajaxSetup: function( target, settings ) { - return settings ? - - // Building a settings object - ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : - - // Extending ajaxSettings - ajaxExtend( jQuery.ajaxSettings, target ); - }, - - ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), - ajaxTransport: addToPrefiltersOrTransports( transports ), - - // Main method - ajax: function( url, options ) { - - // If url is an object, simulate pre-1.5 signature - if ( typeof url === "object" ) { - options = url; - url = undefined; - } - - // Force options to be an object - options = options || {}; - - var transport, - - // URL without anti-cache param - cacheURL, - - // Response headers - responseHeadersString, - responseHeaders, - - // timeout handle - timeoutTimer, - - // Url cleanup var - urlAnchor, - - // Request state (becomes false upon send and true upon completion) - completed, - - // To know if global events are to be dispatched - fireGlobals, - - // Loop variable - i, - - // uncached part of the url - uncached, - - // Create the final options object - s = jQuery.ajaxSetup( {}, options ), - - // Callbacks context - callbackContext = s.context || s, - - // Context for global events is callbackContext if it is a DOM node or jQuery collection - globalEventContext = s.context && - ( callbackContext.nodeType || callbackContext.jquery ) ? - jQuery( callbackContext ) : - jQuery.event, - - // Deferreds - deferred = jQuery.Deferred(), - completeDeferred = jQuery.Callbacks( "once memory" ), - - // Status-dependent callbacks - statusCode = s.statusCode || {}, - - // Headers (they are sent all at once) - requestHeaders = {}, - requestHeadersNames = {}, - - // Default abort message - strAbort = "canceled", - - // Fake xhr - jqXHR = { - readyState: 0, - - // Builds headers hashtable if needed - getResponseHeader: function( key ) { - var match; - if ( completed ) { - if ( !responseHeaders ) { - responseHeaders = {}; - while ( ( match = rheaders.exec( responseHeadersString ) ) ) { - responseHeaders[ match[ 1 ].toLowerCase() + " " ] = - ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) - .concat( match[ 2 ] ); - } - } - match = responseHeaders[ key.toLowerCase() + " " ]; - } - return match == null ? null : match.join( ", " ); - }, - - // Raw string - getAllResponseHeaders: function() { - return completed ? responseHeadersString : null; - }, - - // Caches the header - setRequestHeader: function( name, value ) { - if ( completed == null ) { - name = requestHeadersNames[ name.toLowerCase() ] = - requestHeadersNames[ name.toLowerCase() ] || name; - requestHeaders[ name ] = value; - } - return this; - }, - - // Overrides response content-type header - overrideMimeType: function( type ) { - if ( completed == null ) { - s.mimeType = type; - } - return this; - }, - - // Status-dependent callbacks - statusCode: function( map ) { - var code; - if ( map ) { - if ( completed ) { - - // Execute the appropriate callbacks - jqXHR.always( map[ jqXHR.status ] ); - } else { - - // Lazy-add the new callbacks in a way that preserves old ones - for ( code in map ) { - statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; - } - } - } - return this; - }, - - // Cancel the request - abort: function( statusText ) { - var finalText = statusText || strAbort; - if ( transport ) { - transport.abort( finalText ); - } - done( 0, finalText ); - return this; - } - }; - - // Attach deferreds - deferred.promise( jqXHR ); - - // Add protocol if not provided (prefilters might expect it) - // Handle falsy url in the settings object (#10093: consistency with old signature) - // We also use the url parameter if available - s.url = ( ( url || s.url || location.href ) + "" ) - .replace( rprotocol, location.protocol + "//" ); - - // Alias method option to type as per ticket #12004 - s.type = options.method || options.type || s.method || s.type; - - // Extract dataTypes list - s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; - - // A cross-domain request is in order when the origin doesn't match the current origin. - if ( s.crossDomain == null ) { - urlAnchor = document.createElement( "a" ); - - // Support: IE <=8 - 11, Edge 12 - 15 - // IE throws exception on accessing the href property if url is malformed, - // e.g. http://example.com:80x/ - try { - urlAnchor.href = s.url; - - // Support: IE <=8 - 11 only - // Anchor's host property isn't correctly set when s.url is relative - urlAnchor.href = urlAnchor.href; - s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== - urlAnchor.protocol + "//" + urlAnchor.host; - } catch ( e ) { - - // If there is an error parsing the URL, assume it is crossDomain, - // it can be rejected by the transport if it is invalid - s.crossDomain = true; - } - } - - // Convert data if not already a string - if ( s.data && s.processData && typeof s.data !== "string" ) { - s.data = jQuery.param( s.data, s.traditional ); - } - - // Apply prefilters - inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); - - // If request was aborted inside a prefilter, stop there - if ( completed ) { - return jqXHR; - } - - // We can fire global events as of now if asked to - // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) - fireGlobals = jQuery.event && s.global; - - // Watch for a new set of requests - if ( fireGlobals && jQuery.active++ === 0 ) { - jQuery.event.trigger( "ajaxStart" ); - } - - // Uppercase the type - s.type = s.type.toUpperCase(); - - // Determine if request has content - s.hasContent = !rnoContent.test( s.type ); - - // Save the URL in case we're toying with the If-Modified-Since - // and/or If-None-Match header later on - // Remove hash to simplify url manipulation - cacheURL = s.url.replace( rhash, "" ); - - // More options handling for requests with no content - if ( !s.hasContent ) { - - // Remember the hash so we can put it back - uncached = s.url.slice( cacheURL.length ); - - // If data is available and should be processed, append data to url - if ( s.data && ( s.processData || typeof s.data === "string" ) ) { - cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; - - // #9682: remove data so that it's not used in an eventual retry - delete s.data; - } - - // Add or update anti-cache param if needed - if ( s.cache === false ) { - cacheURL = cacheURL.replace( rantiCache, "$1" ); - uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + - uncached; - } - - // Put hash and anti-cache on the URL that will be requested (gh-1732) - s.url = cacheURL + uncached; - - // Change '%20' to '+' if this is encoded form body content (gh-2658) - } else if ( s.data && s.processData && - ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { - s.data = s.data.replace( r20, "+" ); - } - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - if ( jQuery.lastModified[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); - } - if ( jQuery.etag[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); - } - } - - // Set the correct header, if data is being sent - if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { - jqXHR.setRequestHeader( "Content-Type", s.contentType ); - } - - // Set the Accepts header for the server, depending on the dataType - jqXHR.setRequestHeader( - "Accept", - s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? - s.accepts[ s.dataTypes[ 0 ] ] + - ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : - s.accepts[ "*" ] - ); - - // Check for headers option - for ( i in s.headers ) { - jqXHR.setRequestHeader( i, s.headers[ i ] ); - } - - // Allow custom headers/mimetypes and early abort - if ( s.beforeSend && - ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { - - // Abort if not done already and return - return jqXHR.abort(); - } - - // Aborting is no longer a cancellation - strAbort = "abort"; - - // Install callbacks on deferreds - completeDeferred.add( s.complete ); - jqXHR.done( s.success ); - jqXHR.fail( s.error ); - - // Get transport - transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); - - // If no transport, we auto-abort - if ( !transport ) { - done( -1, "No Transport" ); - } else { - jqXHR.readyState = 1; - - // Send global event - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); - } - - // If request was aborted inside ajaxSend, stop there - if ( completed ) { - return jqXHR; - } - - // Timeout - if ( s.async && s.timeout > 0 ) { - timeoutTimer = window.setTimeout( function() { - jqXHR.abort( "timeout" ); - }, s.timeout ); - } - - try { - completed = false; - transport.send( requestHeaders, done ); - } catch ( e ) { - - // Rethrow post-completion exceptions - if ( completed ) { - throw e; - } - - // Propagate others as results - done( -1, e ); - } - } - - // Callback for when everything is done - function done( status, nativeStatusText, responses, headers ) { - var isSuccess, success, error, response, modified, - statusText = nativeStatusText; - - // Ignore repeat invocations - if ( completed ) { - return; - } - - completed = true; - - // Clear timeout if it exists - if ( timeoutTimer ) { - window.clearTimeout( timeoutTimer ); - } - - // Dereference transport for early garbage collection - // (no matter how long the jqXHR object will be used) - transport = undefined; - - // Cache response headers - responseHeadersString = headers || ""; - - // Set readyState - jqXHR.readyState = status > 0 ? 4 : 0; - - // Determine if successful - isSuccess = status >= 200 && status < 300 || status === 304; - - // Get response data - if ( responses ) { - response = ajaxHandleResponses( s, jqXHR, responses ); - } - - // Use a noop converter for missing script - if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) { - s.converters[ "text script" ] = function() {}; - } - - // Convert no matter what (that way responseXXX fields are always set) - response = ajaxConvert( s, response, jqXHR, isSuccess ); - - // If successful, handle type chaining - if ( isSuccess ) { - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - modified = jqXHR.getResponseHeader( "Last-Modified" ); - if ( modified ) { - jQuery.lastModified[ cacheURL ] = modified; - } - modified = jqXHR.getResponseHeader( "etag" ); - if ( modified ) { - jQuery.etag[ cacheURL ] = modified; - } - } - - // if no content - if ( status === 204 || s.type === "HEAD" ) { - statusText = "nocontent"; - - // if not modified - } else if ( status === 304 ) { - statusText = "notmodified"; - - // If we have data, let's convert it - } else { - statusText = response.state; - success = response.data; - error = response.error; - isSuccess = !error; - } - } else { - - // Extract error from statusText and normalize for non-aborts - error = statusText; - if ( status || !statusText ) { - statusText = "error"; - if ( status < 0 ) { - status = 0; - } - } - } - - // Set data for the fake xhr object - jqXHR.status = status; - jqXHR.statusText = ( nativeStatusText || statusText ) + ""; - - // Success/Error - if ( isSuccess ) { - deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); - } else { - deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); - } - - // Status-dependent callbacks - jqXHR.statusCode( statusCode ); - statusCode = undefined; - - if ( fireGlobals ) { - globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", - [ jqXHR, s, isSuccess ? success : error ] ); - } - - // Complete - completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); - - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); - - // Handle the global AJAX counter - if ( !( --jQuery.active ) ) { - jQuery.event.trigger( "ajaxStop" ); - } - } - } - - return jqXHR; - }, - - getJSON: function( url, data, callback ) { - return jQuery.get( url, data, callback, "json" ); - }, - - getScript: function( url, callback ) { - return jQuery.get( url, undefined, callback, "script" ); - } -} ); - -jQuery.each( [ "get", "post" ], function( _i, method ) { - jQuery[ method ] = function( url, data, callback, type ) { - - // Shift arguments if data argument was omitted - if ( isFunction( data ) ) { - type = type || callback; - callback = data; - data = undefined; - } - - // The url can be an options object (which then must have .url) - return jQuery.ajax( jQuery.extend( { - url: url, - type: method, - dataType: type, - data: data, - success: callback - }, jQuery.isPlainObject( url ) && url ) ); - }; -} ); - -jQuery.ajaxPrefilter( function( s ) { - var i; - for ( i in s.headers ) { - if ( i.toLowerCase() === "content-type" ) { - s.contentType = s.headers[ i ] || ""; - } - } -} ); - - -jQuery._evalUrl = function( url, options, doc ) { - return jQuery.ajax( { - url: url, - - // Make this explicit, since user can override this through ajaxSetup (#11264) - type: "GET", - dataType: "script", - cache: true, - async: false, - global: false, - - // Only evaluate the response if it is successful (gh-4126) - // dataFilter is not invoked for failure responses, so using it instead - // of the default converter is kludgy but it works. - converters: { - "text script": function() {} - }, - dataFilter: function( response ) { - jQuery.globalEval( response, options, doc ); - } - } ); -}; - - -jQuery.fn.extend( { - wrapAll: function( html ) { - var wrap; - - if ( this[ 0 ] ) { - if ( isFunction( html ) ) { - html = html.call( this[ 0 ] ); - } - - // The elements to wrap the target around - wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); - - if ( this[ 0 ].parentNode ) { - wrap.insertBefore( this[ 0 ] ); - } - - wrap.map( function() { - var elem = this; - - while ( elem.firstElementChild ) { - elem = elem.firstElementChild; - } - - return elem; - } ).append( this ); - } - - return this; - }, - - wrapInner: function( html ) { - if ( isFunction( html ) ) { - return this.each( function( i ) { - jQuery( this ).wrapInner( html.call( this, i ) ); - } ); - } - - return this.each( function() { - var self = jQuery( this ), - contents = self.contents(); - - if ( contents.length ) { - contents.wrapAll( html ); - - } else { - self.append( html ); - } - } ); - }, - - wrap: function( html ) { - var htmlIsFunction = isFunction( html ); - - return this.each( function( i ) { - jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); - } ); - }, - - unwrap: function( selector ) { - this.parent( selector ).not( "body" ).each( function() { - jQuery( this ).replaceWith( this.childNodes ); - } ); - return this; - } -} ); - - -jQuery.expr.pseudos.hidden = function( elem ) { - return !jQuery.expr.pseudos.visible( elem ); -}; -jQuery.expr.pseudos.visible = function( elem ) { - return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); -}; - - - - -jQuery.ajaxSettings.xhr = function() { - try { - return new window.XMLHttpRequest(); - } catch ( e ) {} -}; - -var xhrSuccessStatus = { - - // File protocol always yields status code 0, assume 200 - 0: 200, - - // Support: IE <=9 only - // #1450: sometimes IE returns 1223 when it should be 204 - 1223: 204 - }, - xhrSupported = jQuery.ajaxSettings.xhr(); - -support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); -support.ajax = xhrSupported = !!xhrSupported; - -jQuery.ajaxTransport( function( options ) { - var callback, errorCallback; - - // Cross domain only allowed if supported through XMLHttpRequest - if ( support.cors || xhrSupported && !options.crossDomain ) { - return { - send: function( headers, complete ) { - var i, - xhr = options.xhr(); - - xhr.open( - options.type, - options.url, - options.async, - options.username, - options.password - ); - - // Apply custom fields if provided - if ( options.xhrFields ) { - for ( i in options.xhrFields ) { - xhr[ i ] = options.xhrFields[ i ]; - } - } - - // Override mime type if needed - if ( options.mimeType && xhr.overrideMimeType ) { - xhr.overrideMimeType( options.mimeType ); - } - - // X-Requested-With header - // For cross-domain requests, seeing as conditions for a preflight are - // akin to a jigsaw puzzle, we simply never set it to be sure. - // (it can always be set on a per-request basis or even using ajaxSetup) - // For same-domain requests, won't change header if already provided. - if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { - headers[ "X-Requested-With" ] = "XMLHttpRequest"; - } - - // Set headers - for ( i in headers ) { - xhr.setRequestHeader( i, headers[ i ] ); - } - - // Callback - callback = function( type ) { - return function() { - if ( callback ) { - callback = errorCallback = xhr.onload = - xhr.onerror = xhr.onabort = xhr.ontimeout = - xhr.onreadystatechange = null; - - if ( type === "abort" ) { - xhr.abort(); - } else if ( type === "error" ) { - - // Support: IE <=9 only - // On a manual native abort, IE9 throws - // errors on any property access that is not readyState - if ( typeof xhr.status !== "number" ) { - complete( 0, "error" ); - } else { - complete( - - // File: protocol always yields status 0; see #8605, #14207 - xhr.status, - xhr.statusText - ); - } - } else { - complete( - xhrSuccessStatus[ xhr.status ] || xhr.status, - xhr.statusText, - - // Support: IE <=9 only - // IE9 has no XHR2 but throws on binary (trac-11426) - // For XHR2 non-text, let the caller handle it (gh-2498) - ( xhr.responseType || "text" ) !== "text" || - typeof xhr.responseText !== "string" ? - { binary: xhr.response } : - { text: xhr.responseText }, - xhr.getAllResponseHeaders() - ); - } - } - }; - }; - - // Listen to events - xhr.onload = callback(); - errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); - - // Support: IE 9 only - // Use onreadystatechange to replace onabort - // to handle uncaught aborts - if ( xhr.onabort !== undefined ) { - xhr.onabort = errorCallback; - } else { - xhr.onreadystatechange = function() { - - // Check readyState before timeout as it changes - if ( xhr.readyState === 4 ) { - - // Allow onerror to be called first, - // but that will not handle a native abort - // Also, save errorCallback to a variable - // as xhr.onerror cannot be accessed - window.setTimeout( function() { - if ( callback ) { - errorCallback(); - } - } ); - } - }; - } - - // Create the abort callback - callback = callback( "abort" ); - - try { - - // Do send the request (this may raise an exception) - xhr.send( options.hasContent && options.data || null ); - } catch ( e ) { - - // #14683: Only rethrow if this hasn't been notified as an error yet - if ( callback ) { - throw e; - } - } - }, - - abort: function() { - if ( callback ) { - callback(); - } - } - }; - } -} ); - - - - -// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) -jQuery.ajaxPrefilter( function( s ) { - if ( s.crossDomain ) { - s.contents.script = false; - } -} ); - -// Install script dataType -jQuery.ajaxSetup( { - accepts: { - script: "text/javascript, application/javascript, " + - "application/ecmascript, application/x-ecmascript" - }, - contents: { - script: /\b(?:java|ecma)script\b/ - }, - converters: { - "text script": function( text ) { - jQuery.globalEval( text ); - return text; - } - } -} ); - -// Handle cache's special case and crossDomain -jQuery.ajaxPrefilter( "script", function( s ) { - if ( s.cache === undefined ) { - s.cache = false; - } - if ( s.crossDomain ) { - s.type = "GET"; - } -} ); - -// Bind script tag hack transport -jQuery.ajaxTransport( "script", function( s ) { - - // This transport only deals with cross domain or forced-by-attrs requests - if ( s.crossDomain || s.scriptAttrs ) { - var script, callback; - return { - send: function( _, complete ) { - script = jQuery( " - - - - - - - - - - - -
- - -
- -
-
-
- -
-
-
-
- - -
-

Single-Molecule Browser Plot

-

Plot single molecules with colored base modifications in a region of interest

-

Create either an interactive single-molecule HTML browser if static=False, or create a PDF if static=True. -Base modifications are colored by type (mA vs. mCG) and probability of modification. -Example data for producing these plots can be downloaded from SRA: https://www.ncbi.nlm.nih.gov/bioproject/752170 -The below Python and command line options produce the same output.

-
-

1. Python option

-
import dimelo as dm
-
-bam = "deep_ctcf_mod_mappings_merge.sorted.bam"
-sampleName = "CTCF"
-outDir = "./out"
-dm.plot_browser(
-    bam,
-    sampleName,
-    "chr11:2086423-2091187",
-    "A+CG",
-    outDir,
-    threshA=153,
-    threshC=153,
-    static=True,
-    smooth=100,
-    min_periods=10,
-)
-
-
-
-
-

2. Command line option

-

dimelo-plot-browser -f deep_ctcf_mod_mappings_merge.sorted.bam -s CTCF -r chr11:2086423-2091187 -m A+CG -o ./out -A 153 -C 153 --static -t 100 -n 10

-
-
-

Output

-
-../_images/methylation_browser_chr11_2086423_2091187.png -
-
-../_images/CTCF_A_sm_rolling_avg_fraction.png -
-
-../_images/CTCF_A_sm_rolling_avg_total.png -
-
-../_images/CTCF_CG_sm_rolling_avg_fraction.png -
-
-../_images/CTCF_CG_sm_rolling_avg_total.png -
-

Total running time of the script: ( 0 minutes 0.000 seconds)

- -

Gallery generated by Sphinx-Gallery

-
-
- - -
-
- -
-
-
-
- - - - \ No newline at end of file diff --git a/docs/html/auto_examples/enrichment_multi_bam_example.html b/docs/html/auto_examples/enrichment_multi_bam_example.html deleted file mode 100644 index 9003e51b..00000000 --- a/docs/html/auto_examples/enrichment_multi_bam_example.html +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - Enrichment Plot Comparison Across BAMs — dimelo documentation - - - - - - - - - - - - - - - - - - - - - -
- - -
- -
-
-
- -
-
-
-
- - -
-

Enrichment Plot Comparison Across BAMs

-

Plot overall fraction of methylated bases within regions of interest specified by bed file across multiple samples.

-

Create barplot comparing methylation levels in bed file regions of interest across samples

-
-

1. Python option

-
import dimelo as dm
-
-bams = [
-    "deep_ctcf_mod_mappings_merge.sorted.bam",
-    "hia5_mod_mappings.bam",
-    "igg_mod_mappings.bam",
-]
-sampleNames = ["CTCF", "Hia5", "IgG"]
-bed = "q10.150.slop.bed"
-outDir = "./out"
-dm.plot_enrichment(bams, sampleNames, bed, "A", outDir, threshA=190)
-
-
-
-
-

2. Command line option

-

dimelo-plot-enrichment -f deep_ctcf_mod_mappings_merge.sorted.bam hia5_mod_mappings.bam igg_mod_mappings.bam -s CTCF Hia5 IgG -b q10.150.slop.bed -m A -o ./out -A 190

-
-
-

Output

-
-../_images/region_q10.150.slop_A_enrichment_barplot.png -
-

Total running time of the script: ( 0 minutes 0.000 seconds)

- -

Gallery generated by Sphinx-Gallery

-
-
- - -
-
- -
-
-
-
- - - - \ No newline at end of file diff --git a/docs/html/auto_examples/enrichment_multi_bed_example.html b/docs/html/auto_examples/enrichment_multi_bed_example.html deleted file mode 100644 index 325313d4..00000000 --- a/docs/html/auto_examples/enrichment_multi_bed_example.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - Enrichment Plot Comparison Across BEDs — dimelo documentation - - - - - - - - - - - - - - - - - - - - - -
- - -
- -
-
-
- -
-
-
-
- - -
-

Enrichment Plot Comparison Across BEDs

-

Plot overall fraction of methylated bases within multiple sets of regions of interest specified by bed files for a single sample.

-

Create barplot comparing methylation levels in single sample across multiple regions of interest defined in bed files.

-
-

1. Python option

-
import dimelo as dm
-
-bam = "deep_ctcf_mod_mappings_merge.sorted.bam"
-beds = ["q10.150.slop.bed", "q10nopeak.bed"]
-sampleNames = ["chip_peak", "not_chip_peak"]
-outDir = "./out"
-dm.plot_enrichment(bam, sampleNames, beds, "A", outDir, threshA=190)
-
-
-
-
-

2. Command line option

-

dimelo-plot-enrichment -f deep_ctcf_mod_mappings_merge.sorted.bam -s chip_peak not_chip_peak -b q10.150.slop.bed q10nopeak.bed -m A -o ./out -A 190

-
-
-

Output

-
-../_images/sample_deep_ctcf_mod_mappings_merge.sorted_A_enrichment_barplot.png -
-

Total running time of the script: ( 0 minutes 0.000 seconds)

- -

Gallery generated by Sphinx-Gallery

-
-
- - -
-
- -
-
-
-
- - - - \ No newline at end of file diff --git a/docs/html/auto_examples/enrichment_profile_ma_mc_example.html b/docs/html/auto_examples/enrichment_profile_ma_mc_example.html deleted file mode 100644 index 86acfa66..00000000 --- a/docs/html/auto_examples/enrichment_profile_ma_mc_example.html +++ /dev/null @@ -1,184 +0,0 @@ - - - - - - - Enrichment Profile mA & mCG — dimelo documentation - - - - - - - - - - - - - - - - - - - - - -
- - -
- -
-
-
- -
-
-
-
- - -
-

Enrichment Profile mA & mCG

-

Aggregate and single molecule plots colored by modification and centered at regions of interest defined in bed file.

-

Create (1) aggregate profile plots for mA/A and mCG/CG, (2) single-molecule plots for mA + mCG, and (3) base abundance plots for A and CG.

-
-

1. Python option

-
import dimelo as dm
-
-bam = "deep_ctcf_mod_mappings_merge.sorted.bam"
-sampleName = "quartile4"
-bed = "quart4.bed"
-outDir = "./out"
-dm.plot_enrichment_profile(
-    bam,
-    sampleName,
-    bed,
-    "A+CG",
-    outDir,
-    threshA=190,
-    threshC=190,
-    dotsize=0.05,
-)
-
-
-
-
-

2. Command line option

-

dimelo-plot-enrichment-profile -f deep_ctcf_mod_mappings_merge.sorted.bam -s quartile4 -b quart4.bed -m A+CG -o ./out -A 190 -C 190 -d 0.05

-
-
-

Output

-
-../_images/quartile4_A+CG_sm_rolling_avg.png -
-
-../_images/quartile4_A+CG_sm_scatter.png -
-
-../_images/quartile4_A_base_count.png -
-
-../_images/quartile4_CG_base_count.png -
-

Total running time of the script: ( 0 minutes 0.000 seconds)

- -

Gallery generated by Sphinx-Gallery

-
-
- - -
-
- -
-
-
-
- - - - \ No newline at end of file diff --git a/docs/html/auto_examples/enrichment_profile_overlay_example.html b/docs/html/auto_examples/enrichment_profile_overlay_example.html deleted file mode 100644 index 4c87a575..00000000 --- a/docs/html/auto_examples/enrichment_profile_overlay_example.html +++ /dev/null @@ -1,168 +0,0 @@ - - - - - - - Enrichment Profile Overlay — dimelo documentation - - - - - - - - - - - - - - - - - - - - - -
- - -
- -
-
-
- -
-
-
-
- - -
-

Enrichment Profile Overlay

-

Aggregate fraction of methylated bases centered at regions of interest defined in bed files.

-

Create (1) aggregate profile plots for mA/A and mCG/CG, (2) single-molecule plots for mA + mCG, and (3) base abundance plots for A and CG.

-
-

1. Python option

-
import dimelo as dm
-
-bam = "deep_ctcf_mod_mappings_merge.sorted.bam"
-sampleNames = ["q4", "q3", "q2", "q1"]
-beds = ["quart4.bed", "quart3.bed", "quart2.bed", "quart1.bed"]
-outDir = "./out"
-dm.plot_enrichment_profile(
-    bam, sampleNames, beds, "A", outDir, threshA=190, dotsize=0.05
-)
-
-
-
-
-

2. Command line option

-

dimelo-plot-enrichment-profile -f deep_ctcf_mod_mappings_merge.sorted.bam -s q4 q3 q2 q1 -b quart4.bed quart3.bed quart2.bed quart1.bed -m A -o ./out -A 190 -d 0.05

-
-
-

Output

-
-../_images/sample_deep_ctcf_mod_mappings_merge.sorted_A_sm_rolling_avg_overlay.png -
-

Total running time of the script: ( 0 minutes 0.000 seconds)

- -

Gallery generated by Sphinx-Gallery

-
-
- - -
-
- -
-
-
-
- - - - \ No newline at end of file diff --git a/docs/html/auto_examples/enrichment_profile_single_example.html b/docs/html/auto_examples/enrichment_profile_single_example.html deleted file mode 100644 index 07820260..00000000 --- a/docs/html/auto_examples/enrichment_profile_single_example.html +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - Enrichment Profile mA only — dimelo documentation - - - - - - - - - - - - - - - - - - - - - -
- - -
- -
-
-
- -
-
-
-
- - -
-

Enrichment Profile mA only

-

Plot single molecules centered at regions of interest defined in bed file and produce aggregate profile

-

Create (1) aggregate profile plots for mA/A, (2) single-molecule plots for mA, and (3) base abundance plots for A.

-
-

1. Python option

-
import dimelo as dm
-
-bam = "deep_ctcf_mod_mappings_merge.sorted.bam"
-sampleName = "quartile4"
-bed = "quart4.bed"
-outDir = "./out"
-dm.plot_enrichment_profile(
-    bam, sampleName, bed, "A", outDir, threshA=190, dotsize=0.05
-)
-
-
-
-
-

2. Command line option

-

dimelo-plot-enrichment-profile -f deep_ctcf_mod_mappings_merge.sorted.bam -s quartile4 -b quart4.bed -m A -o ./out -A 190 -d 0.05

-
-
-

Output

-
-../_images/quartile4_A_sm_rolling_avg.png -
-
-../_images/quartile4_A_sm_scatter.png -
-
-../_images/quartile4_A_base_count.png -
-

Total running time of the script: ( 0 minutes 0.000 seconds)

- -

Gallery generated by Sphinx-Gallery

-
-
- - -
-
- -
-
-
-
- - - - \ No newline at end of file diff --git a/docs/html/auto_examples/index.html b/docs/html/auto_examples/index.html deleted file mode 100644 index 245ef2da..00000000 --- a/docs/html/auto_examples/index.html +++ /dev/null @@ -1,186 +0,0 @@ - - - - - - - Example Gallery — dimelo documentation - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/html/auto_examples/plot_browser_example.html b/docs/html/auto_examples/plot_browser_example.html deleted file mode 100644 index 06f11920..00000000 --- a/docs/html/auto_examples/plot_browser_example.html +++ /dev/null @@ -1,222 +0,0 @@ - - - - - - - Browser Plot Example — dimelo documentation - - - - - - - - - - - - - - - - - - -
- - -
- -
-
-
- -
-
-
-
- - -
-

Browser Plot Example

-

This plots single molecules with colored base modifications in region of interest

-
-

Plotting Browser

-

add description here

-
import dimelo as dm
-
-input_bam = "../../dimelo/test/data/mod_mappings_subset.bam"
-sample_name = "test"
-region = "chr1:2907273-2909473"
-outDir = "../../dimelo/dimelo_test"
-dm.plot_browser(input_bam, sample_name, region, "A+CG", outDir, static=True)
-
-# This will return an HTML file with single molecules displayed o
-# ver region of interest. Modified bases are colored according to colorA and colorC.
-# To return a PDF file, set static = True
-
-
-
    -
  • A
  • -
  • A
  • -
  • C
  • -
  • C
  • -
-

Out:

-
Outputs
-_______
-DB file: ../../dimelo/dimelo_test/mod_mappings_subset.db
-processing 1 reads for test for bam: ../../dimelo/test/data/mod_mappings_subset.bam
-/Users/annie/miniconda3/envs/dimelo/lib/python3.7/site-packages/pandas/util/_decorators.py:311: SettingWithCopyWarning:
-
-
-A value is trying to be set on a copy of a slice from a DataFrame
-
-See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
-
-/Users/annie/miniconda3/envs/dimelo/lib/python3.7/site-packages/seaborn/cm.py:1582: UserWarning:
-
-Trying to register the cmap 'rocket' which already exists.
-
-/Users/annie/miniconda3/envs/dimelo/lib/python3.7/site-packages/seaborn/cm.py:1583: UserWarning:
-
-Trying to register the cmap 'rocket_r' which already exists.
-
-/Users/annie/miniconda3/envs/dimelo/lib/python3.7/site-packages/seaborn/cm.py:1582: UserWarning:
-
-Trying to register the cmap 'mako' which already exists.
-
-/Users/annie/miniconda3/envs/dimelo/lib/python3.7/site-packages/seaborn/cm.py:1583: UserWarning:
-
-Trying to register the cmap 'mako_r' which already exists.
-
-/Users/annie/miniconda3/envs/dimelo/lib/python3.7/site-packages/seaborn/cm.py:1582: UserWarning:
-
-Trying to register the cmap 'icefire' which already exists.
-
-/Users/annie/miniconda3/envs/dimelo/lib/python3.7/site-packages/seaborn/cm.py:1583: UserWarning:
-
-Trying to register the cmap 'icefire_r' which already exists.
-
-/Users/annie/miniconda3/envs/dimelo/lib/python3.7/site-packages/seaborn/cm.py:1582: UserWarning:
-
-Trying to register the cmap 'vlag' which already exists.
-
-/Users/annie/miniconda3/envs/dimelo/lib/python3.7/site-packages/seaborn/cm.py:1583: UserWarning:
-
-Trying to register the cmap 'vlag_r' which already exists.
-
-/Users/annie/miniconda3/envs/dimelo/lib/python3.7/site-packages/seaborn/cm.py:1582: UserWarning:
-
-Trying to register the cmap 'flare' which already exists.
-
-/Users/annie/miniconda3/envs/dimelo/lib/python3.7/site-packages/seaborn/cm.py:1583: UserWarning:
-
-Trying to register the cmap 'flare_r' which already exists.
-
-/Users/annie/miniconda3/envs/dimelo/lib/python3.7/site-packages/seaborn/cm.py:1582: UserWarning:
-
-Trying to register the cmap 'crest' which already exists.
-
-/Users/annie/miniconda3/envs/dimelo/lib/python3.7/site-packages/seaborn/cm.py:1583: UserWarning:
-
-Trying to register the cmap 'crest_r' which already exists.
-
-/Users/annie/miniconda3/envs/dimelo/lib/python3.7/site-packages/pandas/util/_decorators.py:311: SettingWithCopyWarning:
-
-
-A value is trying to be set on a copy of a slice from a DataFrame
-
-See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
-
-Outputs
-_______
-DB file: ['../../dimelo/dimelo_test/mod_mappings_subset.db']
-browser plot: ../../dimelo/dimelo_test/methylation_browser_chr1_2907273_2909473.pdf
-rolling average fraction bases methylated plot: ['../../dimelo/dimelo_test/test_A_sm_rolling_avg_fraction.pdf', '../../dimelo/dimelo_test/test_C_sm_rolling_avg_fraction.pdf']
-rolling average total bases plot: ['../../dimelo/dimelo_test/test_A_sm_rolling_avg_total.pdf', '../../dimelo/dimelo_test/test_C_sm_rolling_avg_total.pdf']
-
-
-

Total running time of the script: ( 0 minutes 7.419 seconds)

- -

Gallery generated by Sphinx-Gallery

-
-
- - -
-
-
- -
- -
-

© Copyright 2022, Annie Maslan & Reet Mishra.

-
- - Built with Sphinx using a - theme - provided by Read the Docs. - - -
-
-
-
-
- - - - \ No newline at end of file diff --git a/docs/html/auto_examples/plot_enrichment_example.html b/docs/html/auto_examples/plot_enrichment_example.html deleted file mode 100644 index 07d0b381..00000000 --- a/docs/html/auto_examples/plot_enrichment_example.html +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - Enrichment Plot Example — dimelo documentation - - - - - - - - - - - - - - - - - - -
- - -
- -
-
-
- -
-
-
-
- - -
-

Enrichment Plot Example

-

This plots the fraction of bases modified within regions of interest defined by a bed file

-
-

Plotting Enrichment

-

add description here

-
import dimelo as dm
-
-input_bams = [
-    "../../dimelo/test/data/mod_mappings_subset.bam",
-    "../../dimelo/test/data/mod_mappings_subset.bam",
-]
-sample_names = ["test1", "test2"]
-regions = "../../dimelo/test/data/test.bed"
-outDir = "../../dimelo/dimelo_test"
-dm.plot_enrichment(
-    input_bams, sample_names, regions, "CG", outDir, threshC=129
-)
-
-# This will return a barplot with overall fraction of bases
-# modified within regions of interest specified by bedFile(s)
-
-
-plot enrichment example

Out:

-
Outputs
-_______
-DB file: ../../dimelo/dimelo_test/mod_mappings_subset.db
-Outputs
-_______
-DB file: ../../dimelo/dimelo_test/mod_mappings_subset.db
-
-Data for barplot
-________________
-
-0    test1
-1    test2
-Name: sampleName, dtype: object
-0    0.142857
-1    0.142857
-Name: fractionMethylated, dtype: float64
-
-
-Outputs
-_______
-DB file: ['../../dimelo/dimelo_test/mod_mappings_subset.db', '../../dimelo/dimelo_test/mod_mappings_subset.db']
-enrichment barplot: ../../dimelo/dimelo_test/region_test_CG_enrichment_barplot.png
-
-
-

Total running time of the script: ( 0 minutes 0.600 seconds)

- -

Gallery generated by Sphinx-Gallery

-
-
- - -
-
-
- -
- -
-

© Copyright 2022, Annie Maslan & Reet Mishra.

-
- - Built with Sphinx using a - theme - provided by Read the Docs. - - -
-
-
-
-
- - - - \ No newline at end of file diff --git a/docs/html/auto_examples/plot_enrichment_profile_example.html b/docs/html/auto_examples/plot_enrichment_profile_example.html deleted file mode 100644 index f3d7f088..00000000 --- a/docs/html/auto_examples/plot_enrichment_profile_example.html +++ /dev/null @@ -1,206 +0,0 @@ - - - - - - - Enrichment Profile Plot Example — dimelo documentation - - - - - - - - - - - - - - - - - - -
- - -
- -
-
-
- -
-
-
-
- - -
-

Enrichment Profile Plot Example

-

This plots single molecules centered at regions of interest defined in bed file and produces aggregate profile

-
-

Plotting Enrichment Profile

-

add description here

-
import dimelo as dm
-
-input_bam = "../../dimelo/test/data/mod_mappings_subset.bam"
-sample_names = ["test1", "test2"]
-regions = [
-    "../../dimelo/test/data/test.bed",
-    "../../dimelo/test/data/test.bed",
-]
-outDir = "../../dimelo/dimelo_test"
-dm.plot_enrichment_profile(
-    input_bam, sample_names, regions, "A", outDir, windowSize=500, dotsize=1
-)
-
-# This will return an aggregate profile of fraction of bases
-# modified centered at features of interest
-
-
-A

Out:

-
Outputs
-_______
-DB file: ../../dimelo/dimelo_test/mod_mappings_subset.db
-/Users/annie/miniconda3/envs/dimelo/lib/python3.7/site-packages/seaborn/cm.py:1582: UserWarning:
-
-Trying to register the cmap 'rocket' which already exists.
-
-/Users/annie/miniconda3/envs/dimelo/lib/python3.7/site-packages/seaborn/cm.py:1583: UserWarning:
-
-Trying to register the cmap 'rocket_r' which already exists.
-
-/Users/annie/miniconda3/envs/dimelo/lib/python3.7/site-packages/seaborn/cm.py:1582: UserWarning:
-
-Trying to register the cmap 'mako' which already exists.
-
-/Users/annie/miniconda3/envs/dimelo/lib/python3.7/site-packages/seaborn/cm.py:1583: UserWarning:
-
-Trying to register the cmap 'mako_r' which already exists.
-
-/Users/annie/miniconda3/envs/dimelo/lib/python3.7/site-packages/seaborn/cm.py:1582: UserWarning:
-
-Trying to register the cmap 'icefire' which already exists.
-
-/Users/annie/miniconda3/envs/dimelo/lib/python3.7/site-packages/seaborn/cm.py:1583: UserWarning:
-
-Trying to register the cmap 'icefire_r' which already exists.
-
-/Users/annie/miniconda3/envs/dimelo/lib/python3.7/site-packages/seaborn/cm.py:1582: UserWarning:
-
-Trying to register the cmap 'vlag' which already exists.
-
-/Users/annie/miniconda3/envs/dimelo/lib/python3.7/site-packages/seaborn/cm.py:1583: UserWarning:
-
-Trying to register the cmap 'vlag_r' which already exists.
-
-/Users/annie/miniconda3/envs/dimelo/lib/python3.7/site-packages/seaborn/cm.py:1582: UserWarning:
-
-Trying to register the cmap 'flare' which already exists.
-
-/Users/annie/miniconda3/envs/dimelo/lib/python3.7/site-packages/seaborn/cm.py:1583: UserWarning:
-
-Trying to register the cmap 'flare_r' which already exists.
-
-/Users/annie/miniconda3/envs/dimelo/lib/python3.7/site-packages/seaborn/cm.py:1582: UserWarning:
-
-Trying to register the cmap 'crest' which already exists.
-
-/Users/annie/miniconda3/envs/dimelo/lib/python3.7/site-packages/seaborn/cm.py:1583: UserWarning:
-
-Trying to register the cmap 'crest_r' which already exists.
-
-Outputs
-_______
-DB file: ../../dimelo/dimelo_test/mod_mappings_subset.db
-Outputs
-_______
-DB file: ['../../dimelo/dimelo_test/mod_mappings_subset.db']
-overlay plot: ../../dimelo/dimelo_test/sample_mod_mappings_subset_A_sm_rolling_avg_overlay.pdf
-
-
-

Total running time of the script: ( 0 minutes 0.889 seconds)

- -

Gallery generated by Sphinx-Gallery

-
-
- - -
-
-
- -
- -
-

© Copyright 2022, Annie Maslan & Reet Mishra.

-
- - Built with Sphinx using a - theme - provided by Read the Docs. - - -
-
-
-
-
- - - - \ No newline at end of file diff --git a/docs/html/auto_examples/plot_example.html b/docs/html/auto_examples/plot_example.html deleted file mode 100644 index e448b5f9..00000000 --- a/docs/html/auto_examples/plot_example.html +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - - “This” is my example-script — dimelo documentation - - - - - - - - - - - - - - - - - - -
- - -
- -
-
-
- -
-
-
-
- - -
-

“This” is my example-script

-

This example doesn’t do much, it just makes a simple plot

-
-

This is a section header

-

This is the first section! The #%% signifies to Sphinx-Gallery that -this text should be rendered as rST and if using one of the above -IDE/plugin’s, also signifies the start of a ‘code block’.

-
import matplotlib.pyplot as plt
-
-# This line won't be rendered as rST because there's a space after the last block.
-import numpy as np
-
-x = np.linspace(0, 2 * np.pi, 100)
-y = np.sin(x)
-
-plt.plot(x, y)
-plt.xlabel(r"$x$")
-plt.ylabel(r"$\sin(x)$")
-# To avoid matplotlib text output
-plt.show()
-# This is the end of the 'code block' (if using an above IDE). All code within
-# this block can be easily executed all at once.
-
-
-plot example
-
-

This is another section header

-

In the built documentation, it will be rendered as rST after the code above! -This is also another code block.

-
print("here")
-
-
-

Out:

-
here
-
-
-

Total running time of the script: ( 0 minutes 0.394 seconds)

- -

Gallery generated by Sphinx-Gallery

-
-
- - -
-
-
- -
- -
-

© Copyright 2022, Annie Maslan & Reet Mishra.

-
- - Built with Sphinx using a - theme - provided by Read the Docs. - - -
-
-
-
-
- - - - \ No newline at end of file diff --git a/docs/html/auto_examples/plot_qc_example.html b/docs/html/auto_examples/plot_qc_example.html deleted file mode 100644 index 19c8c6c1..00000000 --- a/docs/html/auto_examples/plot_qc_example.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - QC Report — dimelo documentation - - - - - - - - - - - - - - - - - - - -
- - -
- -
-
-
- -
-
-
-
- - -
-

QC Report

-

Outputs quality control report from given bam files.

-
-

Creating QC Report

-

Usually as a first step after receiving bam files, we want to do a quality check -and assess our data. This code generates a PDF report of important QC statistics -for long read methylation modification bam files

-
import dimelo as dm
-
-# first we specify the locations of our bam files
-in_bam = "../../dimelo/test/data/winnowmap_guppy_merge_subset.bam"
-sample_name = "test"
-out_dir = "../../dimelo/dimelo_test"
-
-# next we run the "qc_report" function
-dm.qc_report(in_bam, sample_name, out_dir)
-# now our output directory that we specified, will have a file called "test_qc_report.pdf"
-
-
-

Out:

-
Processing reads:   0%|          | 0/10 [00:00<?, ? batches/s]
-Processing reads:  10%|#         | 1/10 [00:00<00:05,  1.78 batches/s]
-Processing reads:  20%|##        | 2/10 [00:01<00:04,  1.92 batches/s]
-Processing reads:  30%|###       | 3/10 [00:01<00:03,  1.92 batches/s]
-Processing reads:  40%|####      | 4/10 [00:02<00:02,  2.05 batches/s]
-Processing reads:  50%|#####     | 5/10 [00:02<00:02,  2.18 batches/s]
-Processing reads:  60%|######    | 6/10 [00:02<00:01,  2.21 batches/s]
-Processing reads:  70%|#######   | 7/10 [00:03<00:01,  2.19 batches/s]
-Processing reads:  80%|########  | 8/10 [00:03<00:00,  2.05 batches/s]
-Processing reads:  90%|######### | 9/10 [00:05<00:00,  1.39 batches/s]
-Processing reads: 100%|##########| 10/10 [00:06<00:00,  1.05s/ batches]
-Processing reads: 100%|##########| 10/10 [00:06<00:00,  1.45 batches/s]
-mean length:  12202
-num reads:  3243
-num bases:  39571086
-QC report located at: ../../dimelo/dimelo_test/test_qc_report.pdf
-Database located at: ../../dimelo/dimelo_test/winnowmap_guppy_merge_subset.db
-
-
-

Total running time of the script: ( 0 minutes 12.341 seconds)

- -

Gallery generated by Sphinx-Gallery

-
-
- - -
-
-
- -
- -
-

© Copyright 2022, Annie Maslan & Reet Mishra & Jeremy Marcus.

-
- - Built with Sphinx using a - theme - provided by Read the Docs. - - -
-
-
-
-
- - - - \ No newline at end of file diff --git a/docs/html/auto_examples/qc_report_example.html b/docs/html/auto_examples/qc_report_example.html deleted file mode 100644 index 7341993c..00000000 --- a/docs/html/auto_examples/qc_report_example.html +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - QC Report — dimelo documentation - - - - - - - - - - - - - - - - - - - - - -
- - -
- -
-
-
- -
-
-
-
- - -
-

QC Report

-

Outputs quality control report from given bam files.

-

Usually as a first step after receiving bam files, we want to do a quality check -and assess our data. This code generates a PDF report of important QC statistics -for modified base data from Nanopore sequencing.

-
-

1. Python option

-
import dimelo as dm
-
-# first we specify the locations of our bam files
-bam = "winnowmap_guppy_merge_subset.bam"
-sampleName = "CTCF"
-outdir = "./out"
-
-# next we run the "qc_report" function
-dm.qc_report(bam, sampleName, outdir)
-# now our output directory will have a file called "CTCF_qc_report.pdf"
-
-
-
-
-

2. Command line option

-

dimelo-qc-report -f winnowmap_guppy_merge_subset.bam -s CTCF -o ./out

-
-
-

Output

-
-../_images/QC_Terminal_Output.png -
-
-../_images/CTCF_qc_report.png -
-

Total running time of the script: ( 0 minutes 0.000 seconds)

- -

Gallery generated by Sphinx-Gallery

-
-
- - -
-
- -
-
-
-
- - - - \ No newline at end of file diff --git a/docs/html/auto_examples/sg_execution_times.html b/docs/html/auto_examples/sg_execution_times.html deleted file mode 100644 index 42478c0b..00000000 --- a/docs/html/auto_examples/sg_execution_times.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - - Computation times — dimelo documentation - - - - - - - - - - - - - - - - - - - -
- - -
- -
-
-
- -
-
-
-
- -
-

Computation times

-

00:12.341 total execution time for auto_examples files:

- ----- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

QC Report (plot_qc_example.py)

00:12.341

0.0 MB

Single-Molecule Browser Plot (browser_example.py)

00:00.000

0.0 MB

Enrichment Plot Comparison Across BAMs (enrichment_multi_bam_example.py)

00:00.000

0.0 MB

Enrichment Plot Comparison Across BEDs (enrichment_multi_bed_example.py)

00:00.000

0.0 MB

Enrichment Profile mA & mCG (enrichment_profile_ma_mc_example.py)

00:00.000

0.0 MB

Enrichment Profile Overlay (enrichment_profile_overlay_example.py)

00:00.000

0.0 MB

Enrichment Profile mA only (enrichment_profile_single_example.py)

00:00.000

0.0 MB

-
- - -
-
-
- -
- -
-

© Copyright 2022, Annie Maslan & Reet Mishra & Jeremy Marcus.

-
- - Built with Sphinx using a - theme - provided by Read the Docs. - - -
-
-
-
-
- - - - \ No newline at end of file diff --git a/docs/html/content/basecalling.html b/docs/html/content/basecalling.html deleted file mode 100644 index 5f0d136c..00000000 --- a/docs/html/content/basecalling.html +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - - Basecalling & Alignment Suggestions — dimelo documentation - - - - - - - - - - - - - - - - - - - - - -
- - -
- -
-
-
- -
-
-
-
- -
-

Basecalling & Alignment Suggestions

-

The dimelo package takes an aligned bam file with modified basecalls as input. Below, we offer some suggestions for performing the upstream basecalling and alignment. -The best basecalling and alignment methods will vary by use case, and the below suggestions are just what worked well for us. -ONT is also constantly improving basecalling, and these suggestions are likely to become outdated quickly.

-
-

Suggestions

-
    -
  1. Model we have used for m6A calling:

    -
    -
    -
  2. -
  3. We generally use Megalodon for both basecalling & alignment. Megalodon requires Guppy. N.B. you may need to downgrade Megalodon and/or Guppy to find a compatible version combination.

    -
    -
    -
    -
  4. -
  5. For exploring repetitve regions of the genome, we’ve found that Winnowmap performs better than the aligner Megalodon uses, minimap2. For repetitive regions, we use Guppy for basecalling and Winnowmap for alignment.

    -
    -
    -
  6. -
  7. If using Guppy & Winnowmap, the resulting bam files must be combined to create a single bam with the modified basecalls from Guppy and the mapping information from Winnowmap.

    -
    -
    -
  8. -
  9. We perform basecalling separately from the sequencing run and use an EC2 instance (g4dn.metal) with multiple GPUs to speed up basecalling significantly.

  10. -
-
-
- - -
-
- -
-
-
-
- - - - \ No newline at end of file diff --git a/docs/html/content/installation.html b/docs/html/content/installation.html deleted file mode 100644 index 60fb1d9b..00000000 --- a/docs/html/content/installation.html +++ /dev/null @@ -1,198 +0,0 @@ - - - - - - - Installation — dimelo documentation - - - - - - - - - - - - - - - - - - - - - -
- - -
- -
-
-
- -
-
-
-
- -
-

Installation

-
-

Requirements

- -
-
-

Installation from Source

-
    -
  1. Get the code.

  2. -
-
git clone https://github.com/streetslab/dimelo.git
-cd dimelo
-
-
-
    -
  1. Create and activate a python 3.7 conda venv.

  2. -
-

Recommended to avoid package dependency install issues:

-

Linux:

-
conda env create -f environment_linux.yml
-conda activate dimelo
-
-
-

MacOS:

-
conda env create -f environment_macOS.yml
-conda activate dimelo
-
-
-

Other option to create venv without using provided yml:

-
conda create --name dimelo python=3.7
-conda activate dimelo
-
-
-
    -
  1. Install dimelo and its requirements.

  2. -
-
pip install .
-
-
-
    -
  1. Now the dimelo package is available for import. For example, you may import it like this:

  2. -
-
python
-
-
-
>>> import dimelo as dm
-
-
-

And then call functions like this:

-
>>> dm.function_name(...)
-
-
-

Alternatively, functions can be accessed from the command line like this:

-
dimelo-function-name ...
-
-
-
-
-

Other notes

-
    -
  • The dependency pybedtools requires that you have bedtools. Because this is not able to be installed with pip, if you did not create your environment from environment.yml, you must run:

  • -
-
conda install bedtools
-
-
-
    -
  • If you would like to make changes to the package, you can install it in developer mode:

  • -
-
pip install -e .
-
-
-
    -
  • Additionally, if making contributions to the codebase, install pre-commit, which will enforce the dimelo code style (black, flake8) on each of your commits:

  • -
-
pip install pre-commit
-pre-commit install
-
-
-
-
- - -
-
- -
-
-
-
- - - - \ No newline at end of file diff --git a/docs/html/content/reference/parse_bam.html b/docs/html/content/reference/parse_bam.html deleted file mode 100644 index 7bb03b22..00000000 --- a/docs/html/content/reference/parse_bam.html +++ /dev/null @@ -1,266 +0,0 @@ - - - - - - - parse_bam — dimelo documentation - - - - - - - - - - - - - - - - - - - - - -
- - -
- -
-
-
- -
-
-
-
- -
-

parse_bam

-
-
-parse_bam(fileName: str, sampleName: str, outDir: str, bedFile: Optional[str] = None, basemod: str = 'A+CG', center: bool = False, windowSize: int = 1000, region: Optional[str] = None, threshA: int = 129, threshC: int = 129, extractAllBases: bool = False, cores: Optional[int] = None) None
-
-
fileName

name of bam file with Mm and Ml tags

-
-
sampleName

name of sample for output SQL table name labelling. Valid names contain [a-zA-Z0-9_].

-
-
outDir

directory where SQL database is stored

-
-
bedFile

name of bed file that defines regions of interest over which to extract mod calls. The bed file either defines regions over which to extract mod calls OR defines regions (likely motifs) over which to center positions for mod calls and then parse_bam extracts mod calls over a window flanking that region defined in by windowSize. Optional 4th column in bed file to specify strand of region of interest as + or -. Default is to consider regions as all +. NB. The bedFile and region parameters are mutually exclusive; specify one or the other.

-
-
basemod

One of the following:

-
    -
  • 'A' - extract mA only

  • -
  • 'CG' - extract mCpG only

  • -
  • 'A+CG' - extract mA and mCpG

  • -
-
-
center

One of the following:

-
    -
  • 'True' - report positions with respect to center of motif window (+/- windowSize); only valid with bed file input

  • -
  • 'False' - report positions in original reference space

  • -
-
-
windowSize

window size around center point of feature of interest to plot (+/-); only mods within this window are stored; only used if center=True; still, only reads that span the regions defined in the bed file will be included; default is 1,000 bp

-
-
region

single region over which to extract base mods, rather than specifying many windows in bedFile; format is chr:start-end. NB. The bedFile and region parameters are mutually exclusive; specify one or the other.

-
-
threshA

threshold above which to call an A base methylated; default is 129

-
-
threshC

threshold above which to call a C base methylated; default is 129

-
-
extractAllBases

One of the following:

-
    -
  • 'True' - Store all base mod calls, regardles of methylation probability threshold. Bases stored are those that can have a modification call (A, CG, or both depending on basemod parameter) and are sequenced bases, not all bases in the reference.

  • -
  • 'False' - Only modifications above specified threshold are stored

  • -
-
-
cores

number of cores over which to parallelize; default is all available

-
-
-

Valid argument combinations for bedFile, center, and windowSize are below. Regions of interest generally fall into two categories: small motifs at which to center analysis (use center = True) or full windows of interest (do not specify center or windowSize).

-
-
    -
  • bedFile –> extract all modified bases in regions defined in bed file

  • -
  • bedfile + center –> extract all modified bases in regions defined in bed file, report positions relative to region centers and extract base modificiations within default windowSize of 1kb

  • -
  • bedfile + center + windowSize –> extract all modified bases in regions defined in bed file, report positions relative to region centers and extract base modifications within flanking +/- windowSize

  • -
  • region –> extract all modified bases in single region

  • -
-
-

Example

-

For regions defined by bedFile:

-
>>> dm.parse_bam("dimelo/test/data/mod_mappings_subset.bam", "test", "dimelo/dimelo_test", bedFile="dimelo/test/data/test.bed", basemod="A+CG", center=True, windowSize=500, threshA=190, threshC=190, extractAllBases=False, cores=8)
-
-
-

For single region defined with region:

-
>>> dm.parse_bam("dimelo/test/data/mod_mappings_subset.bam", "test", "dimelo/dimelo_test", region="chr1:2907273-2909473", basemod="A+CG", threshA=190, threshC=190, cores=8)
-
-
-

Return

-

Returns a SQL database in the specified output directory. Database can be converted into pandas dataframe with:

-
>>> fileName = "dimelo/test/data/mod_mappings_subset.bam"
->>> sampleName = "test"
->>> outDir = "dimelo/dimelo_test"
->>> all_data = pd.read_sql("SELECT * from methylationByBase_" + sampleName, sqlite3.connect(outDir + "/" + fileName.split("/")[-1].replace(".bam", "") + ".db"))
->>> aggregate_counts = pd.read_sql("SELECT * from methylationAggregate_" + sampleName, sqlite3.connect(outDir + "/" + fileName.split("/")[-1].replace(".bam", "") + ".db"))
-
-
-

Each database contains these two tables with columns listed below:

-
    -
  1. -
    methylationByBase_sampleName
      -
    • id(read_name:pos)

    • -
    • read_name

    • -
    • chr

    • -
    • pos

    • -
    • prob

    • -
    • mod

    • -
    -
    -
    -
  2. -
  3. -
    methylationAggregate_sampleName
      -
    • id(pos:mod)

    • -
    • pos

    • -
    • mod

    • -
    • methylated_bases

    • -
    • total_bases

    • -
    -
    -
    -
  4. -
-

When running parse_bam with a region defined, a summary bed file is also produced to support visualizing aggregate data with any genome browser tool. The columns of this bed file are chr, start, end, methylated_bases, total_bases.

-

For example, to take a summary output bed and create a file with fraction of modified bases with a window size of 100 bp for visualization with the WashU browser, you could run the below commands in terminal:

-
-
    -
  • bedtools makewindows -g ref_genome.chromsizes.txt -w 100 > ref_genome_windows.100.bp.bed

  • -
  • bedtools map -a ref_genome_windows.100.bp.bed -b outDir/fileName_sampleName_chr_start_end_A.bed -c 4,5 -o sum,sum -null 0 | awk -v "OFS=\t" '{if($5>0){print $1,$2,$3,$4/$5}else{print $1,$2,$3,$5}}' > outDir/fileName_sampleName_chr_start_end_A.100.bed

  • -
  • bgzip outDir/fileName_sampleName_chr_start_end_A.100.bed

  • -
  • tabix -f -p bed outDir/fileName_sampleName_chr_start_end_A.100.bed.gz

  • -
-
-
- -
-

dimelo-parse-bam - CLI interface

-

Parse a bam file into DiMeLo database tables

-
dimelo-parse-bam [-h] -f FILENAME -s SAMPLENAME -o OUTDIR (-b BEDFILE | -r REGION)
-                 [-m {A,CG,A+CG}] [-A THRESHA] [-C THRESHC] [-e] [-p CORES] [-c]
-                 [-w WINDOWSIZE]
-
-
-
-

dimelo-parse-bam optional arguments

-
    -
  • -h, --help - show this help message and exit

  • -
  • -b BEDFILE, --bedFile BEDFILE - name of bed file that defines regions of interest over which to extract mod calls (default: None)

  • -
  • -r REGION, --region REGION - single region over which to extract base mods, e.g. "chr1:1-100000" (default: None)

  • -
  • -m BASEMOD, --basemod BASEMOD - which base modifications to extract (default: A+CG)

  • -
  • -A THRESHA, --threshA THRESHA - threshold above which to call an A base methylated (default: 129)

  • -
  • -C THRESHC, --threshC THRESHC - threshold above which to call a C base methylated (default: 129)

  • -
  • -e, --extractAllBases - store all base mod calls, regardless of methylation probability threshold

  • -
  • -p CORES, --cores CORES - number of cores over which to parallelize (default: None)

  • -
  • -c, --center - report positions with respect to center of motif window; only valid with bed file input

  • -
  • -w WINDOWSIZE, --windowSize WINDOWSIZE - window size around center point of feature of interest to plot (+/-); only mods within this window are stored (default: 1000 bp) (default: 1000)

  • -
-
-
-

dimelo-parse-bam required arguments

-
    -
  • -f FILENAME, --fileName FILENAME - name of bam file with Mm and Ml tags (default: None)

  • -
  • -s SAMPLENAME, --sampleName SAMPLENAME - name of sample for output SQL table name labelling (default: None)

  • -
  • -o OUTDIR, --outDir OUTDIR - directory where SQL database is stored (default: None)

  • -
-
-
-
- - -
-
- -
-
-
-
- - - - \ No newline at end of file diff --git a/docs/html/content/reference/plot_browser.html b/docs/html/content/reference/plot_browser.html deleted file mode 100644 index 1cd32712..00000000 --- a/docs/html/content/reference/plot_browser.html +++ /dev/null @@ -1,245 +0,0 @@ - - - - - - - plot_browser — dimelo documentation - - - - - - - - - - - - - - - - - - - - - -
- - -
- -
-
-
- -
-
-
-
- -
-

plot_browser

-
-
-plot_browser(fileNames, sampleNames, region, basemod, outDir, threshA=129, threshC=129, bedFileFeatures=None, smooth=1000, min_periods=100, colorA='#053C5E', colorC='#BB4430', dotsize=4, static=False, cores=None)
-
-
fileNames

list of names of bam files with Mm and Ml tags; indexed; or single file name as string

-
-
sampleNames

list of names of samples for output plot name labelling; or single sample name as string; valid names contain [a-zA-Z0-9_].

-
-
region

formatted as for example: “chr1:1-100000”

-
-
basemod

One of the following:

-
    -
  • 'A' - extract mA only

  • -
  • 'CG' - extract mCpG only

  • -
  • 'A+CG' - extract mA and mCpG

  • -
-
-
outDir

directory to output plot

-
-
threshA

threshold for calling mA; default 129

-
-
threshC

threshold for calling mCG; default 129

-
-
bedFileFeatures

bedFile specifying regions to display in browser (optional); default None

-
-
smooth

window over which to smooth aggregate curve; default of 1000 bp

-
-
min_periods

minimum number of bases to consider for smoothing: default of 100 bp

-
-
colorA

color in hex for mA; default #053C5E

-
-
colorC

color in hex for mCG; default #BB4430

-
-
dotsize

size of points; default 4

-
-
static

One of the following:

-
    -
  • 'True' - pdf output

  • -
  • 'False' - interactive html output; default is False

  • -
-
-
cores

number of cores over which to parallelize; default is all available

-
-
-

Example

-
>>> dm.plot_browser("dimelo/test/data/mod_mappings_subset.bam", "test", "chr1:2907273-2909473", "A+CG", "dimelo/dimelo_test", static=False)
->>> dm.plot_browser(["dimelo/test/data/mod_mappings_subset.bam", "dimelo/test/data/mod_mappings_subset.bam"], ["test1", "test2"], "chr1:2907273-2909473", "A+CG", "dimelo/dimelo_test", static=False)
-
-
-

Return

-
-
    -
  • PDF or HTML file with single molecules displayed over region of interest. Modified bases are colored according to colorA and colorC.

  • -
  • PDFs of aggregate coverage and fraction of bases modified over region of interest.

  • -
  • A summary bed file is also produced to support visualizing aggregate data with any genome browser tool. The columns of this bed file are chr, start, end, methylated_bases, total_bases. For example, to take a summary output bed and create a file with fraction of modified bases with a window size of 100 bp for visualization with the WashU browser, you could run the below commands in terminal:

    -
    -
      -
    • bedtools makewindows -g ref_genome.chromsizes.txt -w 100 > ref_genome_windows.100.bp.bed

    • -
    • bedtools map -a ref_genome_windows.100.bp.bed -b outDir/fileName_sampleName_chr_start_end_A.bed -c 4,5 -o sum,sum -null 0 | awk -v "OFS=\t" '{if($5>0){print $1,$2,$3,$4/$5}else{print $1,$2,$3,$5}}' > outDir/fileName_sampleName_chr_start_end_A.100.bed

    • -
    • bgzip outDir/fileName_sampleName_chr_start_end_A.100.bed

    • -
    • tabix -f -p bed outDir/fileName_sampleName_chr_start_end_A.100.bed.gz

    • -
    -
    -
  • -
-
-

Example Plots

-

Single-Molecule Browser Plot

-
- -
-

dimelo-plot-browser - CLI interface

-

DiMeLo plot browser

-
dimelo-plot-browser [-h] -f FILENAMES [FILENAMES ...] -s SAMPLENAMES [SAMPLENAMES ...] -r
-                    REGION -m {A,CG,A+CG} -o OUTDIR [-t SMOOTH] [-n MIN_PERIODS]
-                    [--colorA COLORA] [--colorC COLORC] [-d DOTSIZE] [-A THRESHA]
-                    [-C THRESHC] [-b BEDFILEFEATURES] [--static] [-p CORES]
-
-
-
-

dimelo-plot-browser optional arguments

-
    -
  • -h, --help - show this help message and exit

  • -
  • -A THRESHA, --threshA THRESHA - threshold above which to call an A base methylated (default: 129)

  • -
  • -C THRESHC, --threshC THRESHC - threshold above which to call a C base methylated (default: 129)

  • -
  • -b BEDFILEFEATURES, --bedFileFeatures BEDFILEFEATURES - bed file specifying annotation to display in browser (default: None)

  • -
  • --static - output as PDF instead of interactive HTML

  • -
  • -p CORES, --cores CORES - number of cores over which to parallelize (default: None)

  • -
-
-
-

dimelo-plot-browser required arguments

-
    -
  • -f FILENAMES, --fileNames FILENAMES - bam file name(s) (default: None)

  • -
  • -s SAMPLENAMES, --sampleNames SAMPLENAMES - sample name(s) for output file labelling (default: None)

  • -
  • -r REGION, --region REGION - single region over which to extract base mods, e.g. "chr1:1-100000" (default: None)

  • -
  • -m BASEMOD, --basemod BASEMOD - which base modification to extract (default: None)

  • -
  • -o OUTDIR, --outDir OUTDIR - directory to output plot (default: None)

  • -
-
-
-

dimelo-plot-browser smoothing options

-
    -
  • -t SMOOTH, --smooth SMOOTH - window over which to smooth aggregate curve (default: 1000)

  • -
  • -n MIN_PERIODS, --min_periods MIN_PERIODS - minimum number of bases to consider for smoothing (default: 100)

  • -
-
-
-

dimelo-plot-browser plotting options

-
    -
  • --colorA COLORA - color in hex (e.g. "#BB4430") for mA (default: #053C5E)

  • -
  • --colorC COLORC - color in hex (e.g. "#BB4430") for mCG (default: #BB4430)

  • -
  • -d DOTSIZE, --dotsize DOTSIZE - size of points (default: 4)

  • -
-
-
-
- - -
-
- -
-
-
-
- - - - \ No newline at end of file diff --git a/docs/html/content/reference/plot_enrichment.html b/docs/html/content/reference/plot_enrichment.html deleted file mode 100644 index 1a94796a..00000000 --- a/docs/html/content/reference/plot_enrichment.html +++ /dev/null @@ -1,205 +0,0 @@ - - - - - - - plot_enrichment — dimelo documentation - - - - - - - - - - - - - - - - - - - - - -
- - -
- -
-
-
- -
-
-
-
- -
-

plot_enrichment

-
-
-plot_enrichment(fileNames, sampleNames, bedFiles, basemod, outDir, threshA=129, threshC=129, colors=['#2D1E2F', '#A9E5BB', '#610345', '#559CAD', '#5E747F'], cores=None)
-
-
fileNames

name(s) of bam file with Mm and Ml tags

-
-
sampleNames

name(s) of sample for output file name labelling; valid names contain [a-zA-Z0-9_].

-
-
bedFiles

specified windows for region(s) of interest

-
-
basemod

One of the following (only valid to look at one type of mod):

-
    -
  • 'A' - extract mA only

  • -
  • 'CG' - extract mCpG only

  • -
-
-
outDir

directory to output plot

-
-
threshA

threshold for calling mA; default 129

-
-
threshC

threshold for calling mCG; default 129

-
-
colors

color list in hex for overlay; default is [“#2D1E2F”, “#A9E5BB”, “#610345”, “#559CAD”, “#5E747F”]

-
-
cores

number of cores over which to parallelize; default is all available

-
-
-

Example

-
>>> dm.plot_enrichment(["dimelo/test/data/mod_mappings_subset.bam", "dimelo/test/data/mod_mappings_subset.bam"], ["test1", "test2"], "dimelo/test/data/test.bed", "CG", "dimelo/dimelo_test", threshC=129)
->>> dm.plot_enrichment("dimelo/test/data/mod_mappings_subset.bam", ["test1", "test2"], ["dimelo/test/data/test.bed", "dimelo/test/data/test.bed"], "CG", "dimelo/dimelo_test", threshC=129)
-
-
-

Return

-

Barplot with overall fraction of bases modified within regions of interest specified by bedFile(s)

-

Example Plots

-
-
-
- -
-

dimelo-plot-enrichment - CLI interface

-

Plot DiMeLo methylation enrichment

-
dimelo-plot-enrichment [-h] -f FILENAMES [FILENAMES ...] -s SAMPLENAMES [SAMPLENAMES ...] -b
-                       BEDFILES [BEDFILES ...] -m {A,CG} -o OUTDIR
-                       [--colors COLORS [COLORS ...]] [-A THRESHA] [-C THRESHC] [-p CORES]
-
-
-
-

dimelo-plot-enrichment optional arguments

-
    -
  • -h, --help - show this help message and exit

  • -
  • -A THRESHA, --threshA THRESHA - threshold above which to call an A base methylated (default: 129)

  • -
  • -C THRESHC, --threshC THRESHC - threshold above which to call a C base methylated (default: 129)

  • -
  • -p CORES, --cores CORES - number of cores over which to parallelize (default: None)

  • -
-
-
-

dimelo-plot-enrichment required arguments

-
    -
  • -f FILENAMES, --fileNames FILENAMES - bam file name(s) (default: None)

  • -
  • -s SAMPLENAMES, --sampleNames SAMPLENAMES - sample name(s) for output file labelling (default: None)

  • -
  • -b BEDFILES, --bedFiles BEDFILES - name of bed file(s) defining region(s) of interest (default: None)

  • -
  • -m BASEMOD, --basemod BASEMOD - which base modification to extract (default: None)

  • -
  • -o OUTDIR, --outDir OUTDIR - directory to output plot (default: None)

  • -
-
-
-

dimelo-plot-enrichment plotting options

-
    -
  • --colors COLORS - color list in hex (e.g. "#BB4430") for overlay plots (default: ['#2D1E2F', '#A9E5BB', '#610345', '#559CAD', '#5E747F'])

  • -
-
-
-
- - -
-
- -
-
-
-
- - - - \ No newline at end of file diff --git a/docs/html/content/reference/plot_enrichment_profile.html b/docs/html/content/reference/plot_enrichment_profile.html deleted file mode 100644 index b4a510e1..00000000 --- a/docs/html/content/reference/plot_enrichment_profile.html +++ /dev/null @@ -1,243 +0,0 @@ - - - - - - - plot_enrichment_profile — dimelo documentation - - - - - - - - - - - - - - - - - - - - - -
- - -
- -
-
-
- -
-
-
-
- -
-

plot_enrichment_profile

-
-
-plot_enrichment_profile(fileNames, sampleNames, bedFiles, basemod, outDir, threshA=129, threshC=129, windowSize=1000, colorA='#053C5E', colorC='#BB4430', colors=['#2D1E2F', '#A9E5BB', '#610345', '#559CAD', '#5E747F'], dotsize=0.5, smooth=50, min_periods=10, cores=None)
-
-
fileNames

name(s) of bam file with Mm and Ml tags

-
-
sampleNames

name(s) of sample for output file name labelling; valid names contain [a-zA-Z0-9_].

-
-
bedFiles

specified windows for region(s) of interest; optional 4th column in bed file to specify strand of region of interest as + or -. Default is to consider regions as all +. Reads will be oriented with respect to strand. Only reads overlapping regions defined in bed file will be extracted, regardless of windowSize. Plots are centered at the center of the bed file regions.

-
-
basemod

One of the following:

-
    -
  • 'A' - extract mA only

  • -
  • 'CG' - extract mCpG only

  • -
  • 'A+CG' - extract mA and mCpG

  • -
-
-
outDir

directory to output plot

-
-
threshA

threshold for calling mA; default 129

-
-
threshC

threshold for calling mCG; default 129

-
-
windowSize

window size around center point of feature of interest to plot (+/-); default 1000 bp

-
-
colorA

color in hex for mA; default #053C5E

-
-
colorC

color in hex for mCG; default #BB4430

-
-
colors

color list in hex for overlay plots; default is [“#2D1E2F”, “#A9E5BB”, “#610345”, “#559CAD”, “#5E747F”]

-
-
dotsize

size of points; default is 0.5

-
-
smooth

window over which to smooth aggregate curve; default of 50 bp

-
-
min_periods

minimum number of bases to consider for smoothing: default of 10 bp

-
-
cores

number of cores over which to parallelize; default is all available

-
-
-

Example

-

For single file and region:

-
>>> dm.plot_enrichment_profile("dimelo/test/data/mod_mappings_subset.bam", "test", "dimelo/test/data/test.bed", "A+CG", "dimelo/dimelo_test", windowSize=500, dotsize=1)
-
-
-

To overlay multiple regions of interest (can conversely also overlay multiple samples over a single region if a list of files is provided):

-
>>> dm.plot_enrichment_profile("dimelo/test/data/mod_mappings_subset.bam", ["test1","test2"], ["dimelo/test/data/test.bed","dimelo/test/data/test.bed"], "A", "dimelo/dimelo_test", windowSize=500, dotsize=1)
-
-
-

Return

-
-
    -
  • Aggregate profile of fraction of bases modified centered at features of interest

  • -
  • Single molecules centered at features of interest

  • -
  • Base abundance centered at features of interest

  • -
-
-

Example Plots

-
-
-
- -
-

dimelo-plot-enrichment-profile - CLI interface

-

Plot DiMeLo enrichment profile

-
dimelo-plot-enrichment-profile [-h] -f FILENAMES [FILENAMES ...] -s SAMPLENAMES
-                               [SAMPLENAMES ...] -b BEDFILES [BEDFILES ...] -m {A,CG,A+CG} -o
-                               OUTDIR [-t SMOOTH] [-n MIN_PERIODS] [--colorA COLORA]
-                               [--colorC COLORC] [--colors COLORS [COLORS ...]] [-d DOTSIZE]
-                               [-A THRESHA] [-C THRESHC] [-w WINDOWSIZE] [-p CORES]
-
-
-
-

dimelo-plot-enrichment-profile optional arguments

-
    -
  • -h, --help - show this help message and exit

  • -
  • -A THRESHA, --threshA THRESHA - threshold above which to call an A base methylated (default: 129)

  • -
  • -C THRESHC, --threshC THRESHC - threshold above which to call a C base methylated (default: 129)

  • -
  • -w WINDOWSIZE, --windowSize WINDOWSIZE - window size around center point of feature of interest to plot (+/-) (default: 1000)

  • -
  • -p CORES, --cores CORES - number of cores over which to parallelize (default: None)

  • -
-
-
-

dimelo-plot-enrichment-profile required arguments

-
    -
  • -f FILENAMES, --fileNames FILENAMES - bam file name(s) (default: None)

  • -
  • -s SAMPLENAMES, --sampleNames SAMPLENAMES - sample name(s) for output file labelling (default: None)

  • -
  • -b BEDFILES, --bedFiles BEDFILES - name of bed file(s) defining region(s) of interest (default: None)

  • -
  • -m BASEMOD, --basemod BASEMOD - which base modification to extract (default: None)

  • -
  • -o OUTDIR, --outDir OUTDIR - directory to output plot (default: None)

  • -
-
-
-

dimelo-plot-enrichment-profile smoothing options

-
    -
  • -t SMOOTH, --smooth SMOOTH - window over which to smooth aggregate curve (default: 50)

  • -
  • -n MIN_PERIODS, --min_periods MIN_PERIODS - minimum number of bases to consider for smoothing (default: 10)

  • -
-
-
-

dimelo-plot-enrichment-profile plotting options

-
    -
  • --colorA COLORA - color in hex (e.g. "#BB4430") for mA (default: #053C5E)

  • -
  • --colorC COLORC - color in hex (e.g. "#BB4430") for mCG (default: #BB4430)

  • -
  • --colors COLORS - color list in hex (e.g. "#BB4430") for overlay plots (default: ['#2D1E2F', '#A9E5BB', '#610345', '#559CAD', '#5E747F'])

  • -
  • -d DOTSIZE, --dotsize DOTSIZE - size of points (default: 0.5)

  • -
-
-
-
- - -
-
- -
-
-
-
- - - - \ No newline at end of file diff --git a/docs/html/content/reference/qc_report.html b/docs/html/content/reference/qc_report.html deleted file mode 100644 index 7e8d99ab..00000000 --- a/docs/html/content/reference/qc_report.html +++ /dev/null @@ -1,226 +0,0 @@ - - - - - - - qc_report — dimelo documentation - - - - - - - - - - - - - - - - - - - - - -
- - -
- -
-
-
- -
-
-
-
- -
-

qc_report

-
-
-qc_report(fileNames, sampleNames, outDir, colors=['#BB4430', '#FFBC0A', '#053C5E', '#A9E5BB', '#610345', '#2D1E2F', '#559CAD', '#5E747F', '#F343F4'], cores=None)
-
-
fileNames

list of names of bam files; indexed; or single file name as string

-
-
sampleNames

list of names of samples for output plot name labelling; or single sample name as string; valid names contain [a-zA-Z0-9_].

-
-
outDir

directory to output QC summary report

-
-
cores

number of cores over which to parallelize; default is all available

-
-
colors

color list in hex for overlay plots; default is: -[“#BB4430”,”#FFBC0A”,”#053C5E”,”#A9E5BB”,”#610345”, -“#2D1E2F”,”#559CAD”,”#5E747F”,”#F343F4”]

-
-
-

Example

-

For single sample:

-
>>> dm.qc_report("dimelo/test/data/mod_mappings_subset.bam", "test", "dimelo/dimelo_test")
-
-
-

For multiple sample files:

-
>>> dm.qc_report(["dimelo/test/data/mod_mappings_subset.bam", "dimelo/test/data/winnowmap_guppy_merge_subset.bam"], ["test1", "test2"], "dimelo/dimelo_test")
-
-
-

Return

-
-
    -
  • -
    PDF of QC Summary Report which includes:
      -
    • read length histogram

    • -
    • mapping quality histogram

    • -
    • average alignment quality per read histogram (if basecaller provided information)

    • -
    • average basecall quality per read histogram (if basecaller provided information)

    • -
    • summary table describing spread of data

    • -
    • number of reads, number of basepairs

    • -
    -
    -
    -
  • -
-
-

Returns a SQL database in the specified output directory. Database can be converted into pandas dataframe with:

-
>>> fileName = "dimelo/test/data/mod_mappings_subset.bam"
->>> sampleName = "test"
->>> outDir = "dimelo/dimelo_test"
->>> all_reads = pd.read_sql("SELECT * from reads_" + sampleName, sqlite3.connect(outDir + "/" + fileName.split("/")[-1].replace(".bam", "") + ".db"))
-
-
-

After QC, each database contains this table with columns listed below:

-
-
reads_sampleName
    -
  • name

  • -
  • chr

  • -
  • start

  • -
  • end

  • -
  • length

  • -
  • strand

  • -
  • mapq

  • -
  • ave_baseq

  • -
  • ave_alignq

  • -
-
-
-

Example Plots -QC Report

-
- -
-

dimelo-qc-report - CLI interface

-

Generate DiMeLo qc report

-
dimelo-qc-report [-h] -f FILENAMES [FILENAMES ...] -s SAMPLENAMES [SAMPLENAMES ...] -o OUTDIR
-                 [--colors COLORS [COLORS ...]] [-p CORES]
-
-
-
-

dimelo-qc-report optional arguments

-
    -
  • -h, --help - show this help message and exit

  • -
  • -p CORES, --cores CORES - number of cores over which to parallelize (default: None)

  • -
-
-
-

dimelo-qc-report required arguments

-
    -
  • -f FILENAMES, --fileNames FILENAMES - bam file name(s) (default: None)

  • -
  • -s SAMPLENAMES, --sampleNames SAMPLENAMES - sample name(s) for output labelling (default: None)

  • -
  • -o OUTDIR, --outDir OUTDIR - directory to output QC summary report (default: None)

  • -
-
-
-

dimelo-qc-report plotting options

-
    -
  • --colors COLORS - color list in hex (e.g. "#BB4430") for overlay plots (default: ['#BB4430', '#FFBC0A', '#053C5E', '#A9E5BB', '#610345', '#2D1E2F', '#559CAD', '#5E747F', '#F343F4'])

  • -
-
-
-
- - -
-
- -
-
-
-
- - - - \ No newline at end of file diff --git a/docs/html/content/reference/tools.html b/docs/html/content/reference/tools.html deleted file mode 100644 index 679d732e..00000000 --- a/docs/html/content/reference/tools.html +++ /dev/null @@ -1,164 +0,0 @@ - - - - - - - Functions — dimelo documentation - - - - - - - - - - - - - - - - - - - - - -
- - -
- -
-
-
- -
-
-
-
- -
-

Functions

- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

function

type

input files

main output file(s)

qc_report

QC

1 or more BAM

summary report with figures & table for read length, mapping quality, basecall quality, etc.

plot_browser

visualization

1 or more BAM

single-molecule browser as html or pdf; aggregate browser plots and coverage

plot_enrichment

visualization

1 or more BAM, 1 or more BED

barplot of fraction modified bases within region(s) defined by BED(s)

plot_enrichment_profile

visualization

1 or more BAM, 1 or more BED

profile, single molecule plots, base abundance; option to overlay if input multiple BAM/BED

parse_bam

data formatting

1 BAM

sql database (to allow for custom visualization)

-
-
-
- - -
-
- -
-
-
-
- - - - \ No newline at end of file diff --git a/docs/html/content/tutorial.html b/docs/html/content/tutorial.html deleted file mode 100644 index e51a71b5..00000000 --- a/docs/html/content/tutorial.html +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - - Tutorial — dimelo documentation - - - - - - - - - - - - - - - - - - - - -
- - -
- -
-
-
- -
-
-
-
- -
-

Tutorial

-

Follow the steps here to run the dimelo package with a test dataset.

-
-

Files needed

-

Files can be found in directory: dimelo/test/data

-
    -
  1. ctcf_demo.sorted.bam

  2. -
  3. ctcf_demo.sorted.bam.bai

  4. -
  5. ctcf_demo_peak.bed

  6. -
  7. ctcf_demo_not_peak.bed

  8. -
-
-
-

Steps

-
    -
  1. Installation

  2. -
  3. Run below commands and ensure your output matches the expected plots below. This tutorial walks through running functions from python, but the dimelo package can also be used from the command line (see Example Gallery).

  4. -
-
>>> import dimelo as dm
->>> bam = "dimelo/test/data/ctcf_demo.sorted.bam"
->>> sampleName = "CTCF_demo"
->>> outDir = "out"
->>> bedPeak = "dimelo/test/data/ctcf_demo_peak.bed"
->>> bedNotPeak = "dimelo/test/data/ctcf_demo_not_peak.bed"
-
-
-
>>> dm.qc_report(bam, sampleName, outDir)
-
-
-../_images/CTCF_demo_qc_report.png -
>>> dm.plot_enrichment(bam, ['CTCF_peak', 'CTCF_not_peak'], [bedPeak, bedNotPeak], "A", outDir, threshA=190)
-
-
-../_images/sample_ctcf_demo.sorted_A_enrichment_barplot.png -
>>> dm.plot_enrichment_profile(bam, sampleName, bedPeak,"A+CG",outDir,threshA=190,threshC=190)
-
-
-

Aggregate rolling average fraction of methylated bases

-../_images/CTCF_demo_A+CG_sm_rolling_avg.png -

Single molecules with binary mA and mCpG colored

-../_images/CTCF_demo_A+CG_sm_scatter.png -

A base count

-../_images/CTCF_demo_A_base_count.png -

CG base count

-../_images/CTCF_demo_CG_base_count.png -
>>> dm.plot_browser(bam, sampleName, "chr11:2086423-2091187", "A+CG", outDir, threshA=153, threshC=153, static=True, smooth=100, min_periods=10)
-
-
-../_images/methylation_browser_chr11_2086423_20911871.png -../_images/CTCF_demo_A_sm_rolling_avg_fraction.png -../_images/CTCF_demo_A_sm_rolling_avg_total.png -../_images/CTCF_demo_CG_sm_rolling_avg_fraction.png -../_images/CTCF_demo_CG_sm_rolling_avg_total.png -
-
- - -
-
- -
-
-
-
- - - - \ No newline at end of file diff --git a/docs/html/genindex.html b/docs/html/genindex.html deleted file mode 100644 index d1d2b1f7..00000000 --- a/docs/html/genindex.html +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - Index — dimelo documentation - - - - - - - - - - - - - - - - - - - -
- - -
- -
-
-
-
    -
  • »
  • -
  • Index
  • -
  • -
  • -
-
-
- -
- -
- -
-

© Copyright 2022, Annie Maslan & Reet Mishra & Jeremy Marcus.

-
- - Built with Sphinx using a - theme - provided by Read the Docs. - - -
-
-
-
-
- - - - \ No newline at end of file diff --git a/docs/html/index.html b/docs/html/index.html deleted file mode 100644 index 65e449ba..00000000 --- a/docs/html/index.html +++ /dev/null @@ -1,168 +0,0 @@ - - - - - - - dimelo — dimelo documentation - - - - - - - - - - - - - - - - - - - - -
- - -
- -
-
-
- -
-
-
-
- -
-

dimelo

-

a python package & command line tool for analyzing DiMeLo-seq data

-
-

Functions

- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

function

type

input files

main output file(s)

qc_report

QC

1 or more BAM

summary report with figures & table for read length, mapping quality, basecall quality, etc.

plot_browser

visualization

1 or more BAM

single-molecule browser as html or pdf; aggregate browser plots and coverage

plot_enrichment

visualization

1 or more BAM, 1 or more BED

barplot of fraction modified bases within region(s) defined by BED(s)

plot_enrichment_profile

visualization

1 or more BAM, 1 or more BED

profile, single molecule plots, base abundance; option to overlay if input multiple BAM/BED

parse_bam

data formatting

1 BAM

sql database (to allow for custom visualization)

-
-
-

Resources

-

Installation

-

Example Gallery

-

Basecalling & Alignment Suggestions

-

Tutorial

-

Open Source Code

-

DiMeLo-seq Protocol

-
-
-
-
- - -
-
-
- -
- -
-

© Copyright 2022, Annie Maslan & Reet Mishra & Jeremy Marcus.

-
- - Built with Sphinx using a - theme - provided by Read the Docs. - - -
-
-
-
-
- - - - \ No newline at end of file diff --git a/docs/html/objects.inv b/docs/html/objects.inv deleted file mode 100644 index 4e1a6810..00000000 Binary files a/docs/html/objects.inv and /dev/null differ diff --git a/docs/html/search.html b/docs/html/search.html deleted file mode 100644 index 365ec5aa..00000000 --- a/docs/html/search.html +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - Search — dimelo documentation - - - - - - - - - - - - - - - - - - - - - - -
- - -
- -
-
-
-
    -
  • »
  • -
  • Search
  • -
  • -
  • -
-
-
-
-
- - - - -
- -
- -
-
-
- -
- -
-

© Copyright 2022, Annie Maslan & Reet Mishra & Jeremy Marcus.

-
- - Built with Sphinx using a - theme - provided by Read the Docs. - - -
-
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/docs/html/searchindex.js b/docs/html/searchindex.js deleted file mode 100644 index 2f7a461a..00000000 --- a/docs/html/searchindex.js +++ /dev/null @@ -1 +0,0 @@ -Search.setIndex({docnames:["auto_examples/browser_example","auto_examples/enrichment_multi_bam_example","auto_examples/enrichment_multi_bed_example","auto_examples/enrichment_profile_ma_mc_example","auto_examples/enrichment_profile_overlay_example","auto_examples/enrichment_profile_single_example","auto_examples/index","auto_examples/plot_qc_example","auto_examples/qc_report_example","auto_examples/sg_execution_times","content/basecalling","content/installation","content/reference/parse_bam","content/reference/plot_browser","content/reference/plot_enrichment","content/reference/plot_enrichment_profile","content/reference/qc_report","content/reference/tools","content/tutorial","index"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":4,"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:56},filenames:["auto_examples/browser_example.rst","auto_examples/enrichment_multi_bam_example.rst","auto_examples/enrichment_multi_bed_example.rst","auto_examples/enrichment_profile_ma_mc_example.rst","auto_examples/enrichment_profile_overlay_example.rst","auto_examples/enrichment_profile_single_example.rst","auto_examples/index.rst","auto_examples/plot_qc_example.rst","auto_examples/qc_report_example.rst","auto_examples/sg_execution_times.rst","content/basecalling.rst","content/installation.rst","content/reference/parse_bam.rst","content/reference/plot_browser.rst","content/reference/plot_enrichment.rst","content/reference/plot_enrichment_profile.rst","content/reference/qc_report.rst","content/reference/tools.rst","content/tutorial.rst","index.rst"],objects:{dimelo:[[12,0,1,"","parse_bam"],[13,0,1,"","plot_browser"],[14,0,1,"","plot_enrichment"],[15,0,1,"","plot_enrichment_profile"],[16,0,1,"","qc_report"]]},objnames:{"0":["py","function","Python function"]},objtypes:{"0":"py:function"},terms:{"0":[0,1,2,3,4,5,7,8,9,12,13,15],"00":[7,9],"000":[0,1,2,3,4,5,8,9,12],"006":[],"01":7,"02":7,"03":7,"04":7,"05":[3,4,5,7],"053c5e":[13,15,16],"06":7,"085":[],"1":[7,12,13,15,16,17,19],"10":[0,7,15,18],"100":[0,7,12,13,18],"1000":[12,13,15],"100000":[12,13],"12":[7,9],"12202":7,"129":[12,13,14,15],"150":[1,2],"153":[0,18],"18":7,"19":7,"190":[1,2,3,4,5,12,18],"1kb":12,"2":[7,12,13],"20":7,"2086423":[0,18],"2091187":[0,18],"21":7,"2907273":[12,13],"2909473":[12,13],"2d1e2f":[14,15,16],"3":[3,4,5,7,11,12,13],"30":7,"3243":7,"341":[7,9],"37":[],"39":7,"39571086":7,"4":[7,12,13],"40":7,"45":7,"48":[],"4th":[12,15],"5":[7,12,13,15],"50":[7,15],"500":[12,15],"53":[],"559cad":[14,15,16],"5e747f":[14,15,16],"6":7,"60":7,"61":[],"610345":[14,15,16],"65":[],"67":[],"7":[7,11],"70":7,"71":[],"752170":0,"78":7,"8":[7,12],"80":7,"9":7,"90":7,"92":7,"95":[],"9_":[12,13,14,15,16],"case":10,"default":[12,13,14,15,16],"do":[7,8,12],"function":[7,8,11,18],"import":[0,1,2,3,4,5,7,8,11,18],"int":12,"long":7,"null":[12,13],"return":[12,13,14,15,16],"static":[0,13,18],"true":[0,12,13,18],A:[0,1,2,3,4,5,12,13,14,15,18],And:11,For:[10,11,12,13,15,16],If:[10,11],OFS:[12,13],OR:12,One:[12,13,14,15],The:[0,10,11,12,13],To:15,a9e5bb:[14,15,16],abl:11,abov:[12,13,14,15],abund:[3,4,5,15,17,19],access:11,accord:13,across:[6,9,14],activ:11,addition:11,after:[7,8,16],aggreg:[3,4,5,12,13,15,17,18,19],aggregate_count:12,align:[16,19],all:[6,10,12,13,14,15,16],all_data:12,all_read:16,allow:[17,19],also:[10,12,13,15,18],altern:11,an:[0,10,12,13,14,15],analysi:12,analyz:19,ani:[12,13],annot:13,appli:[],ar:[0,10,12,13,15],argument:[],around:[12,15],assess:[7,8],auto_exampl:9,auto_examples_jupyt:6,auto_examples_python:6,avail:[11,12,13,14,15,16],ave_alignq:16,ave_baseq:16,averag:[16,18],avoid:11,awk:[12,13],b:[1,2,3,4,5,10,12,13,14,15],bai:18,bam:[0,2,3,4,5,6,7,8,9,10,13,14,15,16,17,18,19],barplot:[1,2,14,17,19],base:[0,1,2,3,4,5,7,8,12,13,14,15,17,18,19],basecal:[16,17,19],basemod:[12,13,14,15],basepair:16,batch:7,bb4430:[13,14,15,16],becaus:11,becom:10,bed:[1,3,4,5,6,9,12,13,14,15,17,18,19],bedfil:[12,13,14,15],bedfilefeatur:13,bednotpeak:18,bedpeak:18,bedtool:[11,12,13],befor:[],below:[0,10,12,13,16,18],best:10,better:10,bgzip:[12,13],binari:18,bioproject:0,black:11,bool:12,both:[10,12],bp:[12,13,15],browser:[6,9,12,17,19],browser_exampl:[0,9],c:[0,3,12,13,14,15],call:[7,8,10,11,12,13,14,15],can:[0,11,12,15,16,18],categori:12,cd:11,center:[3,4,5,12,15],cg:[0,3,4,12,13,14,15,18],chang:11,check:[7,8],chip_peak:2,choic:[],chr11:[0,18],chr1:[12,13],chr:[12,13,16],chromsiz:[12,13],click:[0,1,2,3,4,5,7,8],clone:11,code:[0,1,2,3,4,5,6,7,8,11,19],codebas:11,color:[0,3,13,14,15,16,18],colora:[13,15],colorc:[13,15],column:[12,13,15,16],com:11,combin:[10,12],command:[11,12,13,18,19],commit:11,compar:[1,2],comparison:[6,9,14],compat:10,conda:11,connect:[12,16],consid:[12,13,15],constantli:10,contain:[12,13,14,15,16],content:[],context_v001:10,contribut:11,control:[7,8],convers:15,convert:[12,16],core:[12,13,14,15,16],could:[12,13],count:18,coverag:[13,17,19],creat:[0,1,2,3,4,5,10,11,12,13],ctcf:[0,1,8],ctcf_demo:18,ctcf_demo_not_peak:18,ctcf_demo_peak:18,ctcf_not_peak:18,ctcf_peak:18,ctcf_qc_report:8,curv:[13,15],custom:[17,19],d:[3,4,5,13,15],data:[0,7,8,12,13,14,15,16,17,18,19],databas:[7,12,16,17,19],datafram:[12,16],dataset:18,db:[7,12,16],deep_ctcf_mod_mappings_merg:[0,1,2,3,4,5],defin:[2,3,4,5,12,14,15,17,19],depend:[11,12],describ:16,develop:11,did:11,dimelo:[0,1,2,3,4,5,7,8,10,11,18],dimelo_test:[7,12,13,14,15,16],directori:[7,8,12,13,14,15,16,18],displai:13,dm:[0,1,2,3,4,5,7,8,11,12,13,14,15,16,18],dotsiz:[3,4,5,13,15],downgrad:10,download:[0,1,2,3,4,5,6,7,8],e:[11,12,13,14,15,16],each:[11,12,16],ec2:10,either:[0,12],els:[12,13],end:[12,13,16],enforc:11,enrich:[6,9],enrichment_multi_bam_exampl:[1,9],enrichment_multi_bed_exampl:[2,9],enrichment_profile_ma_mc_exampl:[3,9],enrichment_profile_overlay_exampl:[4,9],enrichment_profile_single_exampl:[5,9],ensur:18,env:11,environ:11,environment_linux:11,environment_maco:11,etc:[17,19],exampl:[0,1,2,3,4,5,7,8,11,12,13,14,15,16,18,19],exclus:12,execut:9,exit:[12,13,14,15,16],expect:18,explor:10,extract:[12,13,14,15],extractallbas:12,f343f4:16,f:[0,1,2,3,4,5,8,11,12,13,14,15,16],fall:12,fals:[0,12,13],featur:[12,15],ffbc0a:16,figur:[17,19],file:[1,2,3,4,5,7,8,9,10,12,13,14,15,16,17,19],filenam:[12,13,14,15,16],filename_samplename_chr_start_end_a:[12,13],find:10,first:[7,8],flake8:11,flank:12,follow:[12,13,14,15,18],format:[12,13,17,19],found:[10,18],fraction:[1,2,4,12,13,14,15,17,18,19],from:[0,7,8,10,12,16,18],full:[0,1,2,3,4,5,7,8,12],function_nam:11,g4dn:10,g:[12,13,14,15,16],galleri:[0,1,2,3,4,5,7,8,18,19],gener:[0,1,2,3,4,5,6,7,8,10,12,16],genom:[10,12,13],get:11,git:11,github:11,given:[7,8],gov:0,gpu:10,guppi:10,gz:[12,13],h:[12,13,14,15,16],have:[7,8,10,11,12],help:[12,13,14,15,16],here:[0,1,2,3,4,5,7,8,18],hex:[13,14,15,16],hia5:1,hia5_mod_map:1,histogram:16,html:[0,13,17,19],http:[0,11],hybrid_guppy_winnnowmap_bam_cr:10,id:12,igg:1,igg_mod_map:1,improv:10,in_bam:7,includ:[12,16],index:[13,16],inform:[10,16],input:[10,12,17,19],insert:[],instal:[18,19],instanc:10,instead:13,interact:[0,13],interest:[0,1,2,3,4,5,12,13,14,15],interfac:[],ipynb:[0,1,2,3,4,5,7,8],issu:11,its:11,jupyt:[0,1,2,3,4,5,6,7,8],just:10,label:[12,13,14,15,16],length:[7,16,17,19],level:[1,2],like:[10,11,12],line:[11,18,19],linux:11,list:[12,13,14,15,16],locat:[7,8],look:14,m6a:10,m:[0,1,2,3,4,5,12,13,14,15],ma:[0,4,6,9,12,13,14,15,18],maco:11,mai:[10,11],main:[17,19],make:11,makewindow:[12,13],mani:12,map:[10,12,13,16,17,19],mapq:16,match:18,mb:9,mcg:[0,4,6,9,13,14,15],mcpg:[12,13,14,15,18],mean:7,megalodon:10,messag:[12,13,14,15,16],metal:10,method:10,methyl:[1,2,4,7,12,13,14,15,18],methylated_bas:[12,13],methylationaggregate_:12,methylationaggregate_samplenam:12,methylationbybase_:12,methylationbybase_samplenam:12,min_period:[0,13,15,18],minimap2:10,minimum:[13,15],minut:[0,1,2,3,4,5,7,8],ml:[12,13,14,15],mm:[12,13,14,15],mod:[12,13,14],mod_mappings_subset:[12,13,14,15,16],mode:11,model:10,modif:[0,3,7,12,13,14,15],modifi:[8,10,12,13,14,15,17,19],modifici:12,molecul:[3,4,5,6,9,13,15,17,18,19],more:[17,19],motif:12,multipl:[1,2,10,15,16,17,19],must:[10,11],mutual:12,my:[],n:[0,10,13,15],name:[11,12,13,14,15,16],nanopor:8,nb:12,ncbi:0,need:10,next:[7,8],nih:0,nlm:0,none:[12,13,14,15,16],not_chip_peak:2,notebook:[0,1,2,3,4,5,6,7,8],now:[7,8,11],num:7,number:[12,13,14,15,16],o:[0,1,2,3,4,5,8,12,13,14,15,16],offer:10,one:[12,14],onli:[6,9,12,13,14,15],ont:10,open:19,option:[11,17,19],orient:15,origin:12,other:12,our:[7,8],out:[0,1,2,3,4,5,7,8,18],out_dir:7,outdat:10,outdir:[0,1,2,3,4,5,8,12,13,14,15,16,18],output:[7,12,13,14,15,16,17,18,19],over:[12,13,14,15,16],overal:[1,2,14],overlai:[6,9,14,15,16,17,19],overlap:15,p:[12,13,14,15,16],packag:[10,11,18,19],panda:[12,16],parallel:[12,13,14,15,16],paramet:12,pars:[],parse_bam:[17,19],pd:[12,16],pdf:[0,7,8,13,16,17,19],per:16,perform:10,pip:11,plot:[3,4,5,6,9,12,17,18,19],plot_brows:[0,17,18,19],plot_enrich:[1,2,17,18,19],plot_enrichment_profil:[3,4,5,17,18,19],plot_qc_exampl:[7,9],po:12,point:[12,13,15],posit:12,possibl:[],pre:11,print:[12,13],prob:12,probabl:[0,12],process:7,produc:[0,5,12,13],profil:[6,9,17,19],protocol:19,provid:[11,15,16],py:[0,1,2,3,4,5,7,8,9],pybedtool:11,python:[6,7,11,18,19],q10:[1,2],q10nopeak:2,q1:4,q2:4,q3:4,q4:4,qc:[6,9,17,19],qc_report:[7,8,17,18,19],qc_report_exampl:8,qualiti:[7,8,16,17,19],quart1:4,quart2:4,quart3:4,quart4:[3,4,5],quartile4:[3,5],quickli:10,r:[0,12,13],rather:12,read:[7,12,15,16,17,19],read_nam:12,read_sql:[12,16],reads_:16,reads_samplenam:16,receiv:[7,8],recommend:11,ref_genom:[12,13],ref_genome_window:[12,13],refer:12,regardl:12,regardless:[12,15],region:[0,1,2,3,4,5,10,12,13,14,15,17,19],rel:12,repetit:10,repetitv:10,replac:[12,16],report:[6,9,12,17,19],requir:10,res_dna_r941_min_modbas:10,respect:[12,15],result:10,right:[],roll:18,run:[0,1,2,3,4,5,7,8,10,11,12,13,18],s:[0,1,2,3,4,5,7,8,12,13,14,15,16,17,19],same:0,sampl:[1,2,12,13,14,15,16],sample_nam:7,samplenam:[0,1,2,3,4,5,8,12,13,14,15,16,18],script:[0,1,2,3,4,5,7,8],second:[0,1,2,3,4,5,7,8],see:18,select:[12,16],separ:10,seq:19,sequenc:[8,10,12],set:2,show:[12,13,14,15,16],significantli:10,singl:[2,3,4,5,6,9,10,12,13,15,16,17,18,19],size:[12,13,15],slop:[1,2],small:12,smooth:[0,18],some:10,sort:[0,1,2,3,4,5,18],sourc:[0,1,2,3,4,5,6,7,8,19],space:12,span:12,specifi:[1,2,7,8,12,13,14,15,16],speed:10,sphinx:[0,1,2,3,4,5,6,7,8],sphx_glr_auto_examples_plot_qc_exampl:[],split:[12,16],spread:16,sql:[12,16,17,19],sqlite3:[12,16],sra:0,start:[12,13,16],statist:[7,8],step:[7,8],still:12,store:12,str:12,strand:[12,15,16],streetslab:11,string:[13,16],style:11,suggest:19,sum:[12,13],summari:[12,13,16,17,19],support:[12,13],t:[0,12,13,15],tabix:[12,13],tabl:[12,16,17,19],tag:[12,13,14,15],take:[10,12,13],termin:[12,13],test1:[13,14,15,16],test2:[13,14,15,16],test:[7,12,13,14,15,16,18],test_qc_report:7,than:[10,12],thi:[7,8,11,12,13,14,15,16,18],those:12,thresha:[0,1,2,3,4,5,12,13,14,15,18],threshc:[0,3,12,13,14,15,18],threshold:[12,13,14,15],through:18,time:[0,1,2,3,4,5,7,8],tool:[12,13,19],total:[0,1,2,3,4,5,7,8,9],total_bas:[12,13],tutori:19,two:12,txt:[12,13],type:[0,14,17,19],up:10,upstream:10,us:[10,11,12,18],usag:[],usual:[7,8],v:[12,13],valid:[12,13,14,15,16],vari:10,ve:10,venv:11,version:10,visual:[12,13,17,19],vs:0,w:[12,13,15],walk:18,want:[7,8],washu:[12,13],we:[7,8,10],well:10,what:10,when:12,where:12,which:[11,12,13,14,15,16],window:[12,13,14,15],windows:[12,15],winnowmap:10,winnowmap_guppy_merge_subset:[7,8,16],within:[1,2,12,14,17,19],without:11,work:10,would:11,www:0,yml:11,you:[10,11,12,13],your:[11,18],z0:[12,13,14,15,16],za:[12,13,14,15,16],zip:6},titles:["Single-Molecule Browser Plot","Enrichment Plot Comparison Across BAMs","Enrichment Plot Comparison Across BEDs","Enrichment Profile mA & mCG","Enrichment Profile Overlay","Enrichment Profile mA only","Example Gallery","QC Report","QC Report","Computation times","Basecalling & Alignment Suggestions","Installation","parse_bam","plot_browser","plot_enrichment","plot_enrichment_profile","qc_report","Functions","Tutorial","dimelo"],titleterms:{"1":[0,1,2,3,4,5,8],"2":[0,1,2,3,4,5,8],"function":[17,19],across:[1,2],align:10,argument:[12,13,14,15,16],bam:[1,12],basecal:10,bed:2,browser:[0,13],cli:[12,13,14,15,16],command:[0,1,2,3,4,5,8],comparison:[1,2],comput:9,creat:7,dimelo:[12,13,14,15,16,19],enrich:[1,2,3,4,5,14,15],exampl:6,file:18,from:11,galleri:6,instal:11,interfac:[12,13,14,15,16],line:[0,1,2,3,4,5,8],ma:[3,5],mcg:3,molecul:0,name:[],need:18,note:11,onli:5,option:[0,1,2,3,4,5,8,12,13,14,15,16],other:11,output:[0,1,2,3,4,5,8],overlai:4,pars:12,parse_bam:12,plot:[0,1,2,13,14,15,16],plot_brows:13,plot_enrich:14,plot_enrichment_profil:15,profil:[3,4,5,15],python:[0,1,2,3,4,5,8],qc:[7,8,16],qc_report:16,report:[7,8,16],requir:[11,12,13,14,15,16],resourc:19,singl:0,smooth:[13,15],sourc:11,step:18,suggest:10,time:9,tutori:18}}) \ No newline at end of file diff --git a/docs/index.html b/docs/index.html deleted file mode 100644 index 5896b1de..00000000 --- a/docs/index.html +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/index.rst b/docs/index.rst deleted file mode 100644 index 9cb598ff..00000000 --- a/docs/index.rst +++ /dev/null @@ -1,48 +0,0 @@ -dimelo -======== - -a python package & command line tool for analyzing DiMeLo-seq data - -Functions --------------- -+-------------------------------------------------+-----------------------+-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------+ -| function | type | input files | main output file(s) | -+=================================================+=======================+=====================================+============================================+===================================================================================+ -|:doc:`content/reference/qc_report` | QC | 1 or more BAM | summary report with figures & table for read length, mapping quality, basecall quality, etc. | -+-------------------------------------------------+-----------------------+-------------------------------------+--------------------------------------------+-----------------------------------------------------------------------------------+ -|:doc:`content/reference/plot_browser` | visualization | 1 or more BAM | single-molecule browser as html or pdf; aggregate browser plots and coverage | -+-------------------------------------------------+-----------------------+-------------------------------------+--------------------------------------------+-----------------------------------------------------------------------------------+ -|:doc:`content/reference/plot_enrichment` | visualization | 1 or more BAM, 1 or more BED | barplot of fraction modified bases within region(s) defined by BED(s) | -+-------------------------------------------------+-----------------------+-------------------------------------+--------------------------------------------+-----------------------------------------------------------------------------------+ -|:doc:`content/reference/plot_enrichment_profile` | visualization | 1 or more BAM, 1 or more BED | profile, single molecule plots, base abundance; option to overlay if input multiple BAM/BED | -+-------------------------------------------------+-----------------------+-------------------------------------+--------------------------------------------+-----------------------------------------------------------------------------------+ -|:doc:`content/reference/parse_bam` | data formatting | 1 BAM | sql database (to allow for custom visualization) | -+-------------------------------------------------+-----------------------+-------------------------------------+--------------------------------------------+-----------------------------------------------------------------------------------+ - -Resources ------------------------ - -:doc:`content/installation` - -:doc:`auto_examples/index` - -:doc:`content/basecalling` - -:doc:`content/tutorial` - -`Open Source Code `__ - -`DiMeLo-seq Protocol `__ - - -.. toctree:: - :maxdepth: 2 - :hidden: - - content/installation - content/reference/tools - auto_examples/index - content/basecalling - content/tutorial - - diff --git a/docs/make.bat b/docs/make.bat deleted file mode 100644 index 91770a09..00000000 --- a/docs/make.bat +++ /dev/null @@ -1,35 +0,0 @@ -@ECHO OFF - -pushd %~dp0 - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=sphinx-build -) -set SOURCEDIR=. -set BUILDDIR=. - -if "%1" == "" goto help - -%SPHINXBUILD% >NUL 2>NUL -if errorlevel 9009 ( - echo. - echo.The 'sphinx-build' command was not found. Make sure you have Sphinx - echo.installed, then set the SPHINXBUILD environment variable to point - echo.to the full path of the 'sphinx-build' executable. Alternatively you - echo.may add the Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.https://www.sphinx-doc.org/ - exit /b 1 -) - -%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% -goto end - -:help -%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% - -:end -popd diff --git a/environment.yml b/environment.yml new file mode 100644 index 00000000..58372088 --- /dev/null +++ b/environment.yml @@ -0,0 +1,8 @@ +name: dimelo_modkit_parsing +channels: + - conda-forge + - nanoporetech + - defaults +dependencies: + - python=3.11 + - nanoporetech::modkit==0.2.4 \ No newline at end of file diff --git a/environment_linux.yml b/environment_linux.yml deleted file mode 100644 index b21a3afe..00000000 --- a/environment_linux.yml +++ /dev/null @@ -1,88 +0,0 @@ -name: dimelo -channels: - - bioconda - - defaults -dependencies: - - _libgcc_mutex=0.1 - - _openmp_mutex=4.5 - - bedtools=2.30.0 - - bzip2=1.0.8 - - ca-certificates=2021.10.26 - - certifi=2021.10.8 - - ld_impl_linux-64=2.35.1 - - libffi=3.3 - - libgcc-ng - - libgomp=9.3.0 - - libstdcxx-ng - - ncurses=6.3 - - openssl=1.1.1m - - pip=21.2.2 - - python=3.7.11 - - readline=8.1.2 - - setuptools=58.0.4 - - sqlite=3.37.2 - - tk=8.6.11 - - wheel=0.37.1 - - xz=5.2.5 - - zlib=1.2.11 - - pip: - - alabaster==0.7.12 - - attrs==21.4.0 - - babel==2.9.1 - - charset-normalizer==2.0.12 - - cycler==0.11.0 - - cython==0.29.27 - - docutils==0.17.1 - - idna==3.3 - - imagesize==1.3.0 - - importlib-metadata==4.11.1 - - iniconfig==1.1.1 - - jinja2==3.0.3 - - joblib==1.0.1 - - kaleido==0.2.1 - - kiwisolver==1.3.2 - - markupsafe==2.0.1 - - matplotlib==3.4.2 - - natsort==8.1.0 - - ncls==0.0.64 - - numpy==1.20.3 - - packaging==21.3 - - pandas==1.3.2 - - pillow==9.0.1 - - plotly==4.14.3 - - pluggy==0.13.1 - - psutil==5.8.0 - - py==1.11.0 - - pybedtools==0.8.1 - - pygments==2.11.2 - - pyparsing==3.0.7 - - pyranges==0.0.104 - - pyrle==0.0.34 - - pysam==0.18.0 - - pytest==6.2.4 - - python-dateutil==2.8.2 - - pytz==2021.3 - - requests==2.27.1 - - retrying==1.3.3 - - scipy==1.7.3 - - seaborn==0.11.2 - - six==1.16.0 - - snowballstemmer==2.2.0 - - sorted-nearest==0.0.33 - - sphinx==4.4.0 - - sphinx-argparse-cli==1.9.0 - - sphinx-gallery==0.10.1 - - sphinxcontrib-applehelp==1.0.2 - - sphinxcontrib-devhelp==1.0.2 - - sphinxcontrib-htmlhelp==2.0.0 - - sphinxcontrib-jsmath==1.0.1 - - sphinxcontrib-qthelp==1.0.3 - - sphinxcontrib-serializinghtml==1.1.5 - - sphinx-rtd-theme==1.0.0 - - tabulate==0.8.9 - - threadpoolctl==3.1.0 - - toml==0.10.2 - - tqdm==4.64.0 - - typing-extensions==4.1.1 - - urllib3==1.26.8 - - zipp==3.7.0 diff --git a/environment_macOS.yml b/environment_macOS.yml deleted file mode 100644 index db2511c5..00000000 --- a/environment_macOS.yml +++ /dev/null @@ -1,84 +0,0 @@ -name: dimelo -channels: - - bioconda - - r - - defaults -dependencies: - - bedtools=2.30.0=haa7f73a_2 - - bzip2=1.0.8=h1de35cc_0 - - ca-certificates=2021.10.26=hecd8cb5_2 - - certifi=2021.10.8=py37hecd8cb5_2 - - libcxx=12.0.0=h2f01273_0 - - libffi=3.3=hb1e8313_2 - - ncurses=6.3=hca72f7f_2 - - openssl=1.1.1m=hca72f7f_0 - - pip=21.2.2=py37hecd8cb5_0 - - python=3.7.11=h88f2d9e_0 - - readline=8.1.2=hca72f7f_1 - - setuptools=58.0.4=py37hecd8cb5_0 - - sqlite=3.37.2=h707629a_0 - - tk=8.6.11=h7bc2e8c_0 - - wheel=0.37.1=pyhd3eb1b0_0 - - xz=5.2.5=h1de35cc_0 - - zlib=1.2.11=h4dc903c_4 - - pip: - - alabaster==0.7.12 - - attrs==21.4.0 - - babel==2.9.1 - - charset-normalizer==2.0.12 - - cycler==0.11.0 - - cython==0.29.27 - - docutils==0.17.1 - - idna==3.3 - - imagesize==1.3.0 - - importlib-metadata==4.11.1 - - iniconfig==1.1.1 - - jinja2==3.0.3 - - joblib==1.0.1 - - kaleido==0.2.1 - - kiwisolver==1.3.2 - - markupsafe==2.0.1 - - matplotlib==3.4.2 - - natsort==8.1.0 - - ncls==0.0.64 - - numpy==1.20.3 - - packaging==21.3 - - pandas==1.3.2 - - pillow==9.0.1 - - plotly==4.14.3 - - pluggy==0.13.1 - - psutil==5.8.0 - - py==1.11.0 - - pybedtools==0.8.1 - - pygments==2.11.2 - - pyparsing==3.0.7 - - pyranges==0.0.104 - - pyrle==0.0.34 - - pysam==0.18.0 - - pytest==6.2.4 - - python-dateutil==2.8.2 - - pytz==2021.3 - - requests==2.27.1 - - retrying==1.3.3 - - scipy==1.7.3 - - seaborn==0.11.2 - - six==1.16.0 - - snowballstemmer==2.2.0 - - sorted-nearest==0.0.33 - - sphinx==4.4.0 - - sphinx-argparse-cli==1.9.0 - - sphinx-gallery==0.10.1 - - sphinxcontrib-applehelp==1.0.2 - - sphinxcontrib-devhelp==1.0.2 - - sphinxcontrib-htmlhelp==2.0.0 - - sphinxcontrib-jsmath==1.0.1 - - sphinxcontrib-qthelp==1.0.3 - - sphinxcontrib-serializinghtml==1.1.5 - - sphinx-rtd-theme==1.0.0 - - tabulate==0.8.9 - - threadpoolctl==3.1.0 - - toml==0.10.2 - - tqdm==4.64.0 - - typing-extensions==4.1.1 - - urllib3==1.26.8 - - zipp==3.7.0 diff --git a/pyproject.toml b/pyproject.toml deleted file mode 100644 index 12e3d778..00000000 --- a/pyproject.toml +++ /dev/null @@ -1,7 +0,0 @@ -[tool.isort] -include_trailing_comma = true -multi_line_output = 3 -profile = "black" - -[tool.black] -line-length = 79 \ No newline at end of file diff --git a/ruff.toml b/ruff.toml new file mode 100644 index 00000000..cc459dda --- /dev/null +++ b/ruff.toml @@ -0,0 +1,24 @@ +# Ruff changed to lint ipython notebooks by default; for now, revert to excluding them +extend-exclude = ["*.ipynb"] + +[lint] +select = [ + # pycodestyle + "E", + # Pyflakes + "F", + # pyupgrade + "UP", + # flake8-bugbear + "B", + # flake8-simplify + "SIM", + # isort + "I", +] +ignore = [ + # ignore line-too-long errors; code already handled by linter, comments should not matter as much + "E501", + # temporarily ignore "mutable data structures for argument defaults" errors; this needs to be fixed but is a larger issue + "B006" +] diff --git a/setup.py b/setup.py index 78f984be..05ec2f1d 100644 --- a/setup.py +++ b/setup.py @@ -1,64 +1,28 @@ -# The setup.py file is used as the build script for setuptools. Setuptools is a -# package that allows you to easily build and distribute Python distributions. +from setuptools import find_packages, setup -import os - -import setuptools - -from version import version as this_version - -# write version to dimelo directory so it can be accessed by the command line -this_directory = os.path.abspath(os.path.dirname(__file__)) -with open( - os.path.join(this_directory, "dimelo", "_version.py"), "wt" -) as fversion: - fversion.write(f'__version__ = "{this_version}"\n') - -# Define required packages. Alternatively, these could be defined in a separate -# file and read in here. -REQUIRED_PACKAGES = [ - "matplotlib==3.4.2", - "pytest==6.2.4", - "pandas==1.3.2", - "numpy==1.20.3", - "joblib==1.0.1", - "plotly==4.14.3", - "seaborn==0.11.2", - "pyranges==0.0.104", - "psutil==5.8.0", - "pybedtools==0.8.1", - "kaleido==0.2.1", - "sorted-nearest==0.0.33", # pin to 0.0.33 to avoid import error (https://github.com/pyranges/sorted_nearest/issues/5) - "sphinx==4.4.0", - "tqdm==4.64.0", -] - -# Read in the project description. We define this in the README file. -with open("README.md", "r") as fh: - long_description = fh.read() - -setuptools.setup( - name="dimelo", # name of project - install_requires=REQUIRED_PACKAGES, # all requirements used by this package - version=this_version, # project version, read from version.py - author="Annie Maslan & Reet Mishra & Jeremy Marcus", # Author, shown on PyPI - scripts=[ - "bin/dimelo-parse-bam", - "bin/dimelo-plot-browser", - "bin/dimelo-plot-enrichment", - "bin/dimelo-plot-enrichment-profile", - "bin/dimelo-qc-report", - ], # command line scripts installed - author_email="amaslan@berkeley.edu", # Author email - description="Tool for analyzing modified bases from BAM files", # Short description of project - long_description=long_description, # Long description, shown on PyPI - long_description_content_type="text/markdown", # Content type. Here, we used a markdown file. - url="https://github.com/streetslab/dimelo", # github path - packages=setuptools.find_packages(), # automatically finds packages in the current directory. You can also explictly list them. - classifiers=[ # Classifiers give pip metadata about your project. See https://pypi.org/classifiers/ for a list of available classifiers. - "Programming Language :: Python :: 3", - "License :: OSI Approved :: MIT License", - "Operating System :: OS Independent", +setup( + name="dimelo", + version="1.0.0", + packages=find_packages(), + install_requires=[ + "numpy", + "seaborn", + "pysam", + "h5py", + "pyBigWig", + "notebook", + "ipykernel", + "ipywidgets", + # ipywidgets is finicky on some platforms + # Local jupyter notebooks: this works best with ipywidgets and jupyter running the latest versions, which is what this file will do. + # Google Colab: ipywidgets 7.7.1 seems to be necessary for Google Colab needed for tqdm.auto progress bars as of Feb 11 2024. + # This says that was fixed in 2022 but it sure wasn't when I tried https://github.com/googlecolab/colabtools/issues/3023. + # You can simply downgrade after installing using pip install ., it won't break anything to our knowledge. + # VS Code: using the VS code plugin to run jupyter, 7.7.1 also works while the latest version does not. Likely that + # some intermediate versions work too. + # On the Berkeley High Performance Computing Cluster, Savio, I needed to install ipywidgets==7.6.5 for jupyter Open On-Demand. + "tqdm", + "plotly", + "kaleido", ], - python_requires=">=3.7", # python version requirement ) diff --git a/tutorial.ipynb b/tutorial.ipynb new file mode 100644 index 00000000..99f744c9 --- /dev/null +++ b/tutorial.ipynb @@ -0,0 +1,17842 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Mac and Linux setup\n", + "\n", + "Make sure to have enabled the environment set up for running `dimelo` analysis. See the readme for details. If you are running your jupyter notebook some way other than by the `jupyter notebook` command in the command line from within your activated `conda` environment, you may need to use `ipykernel` to connect this notebook appropriately to the environment with `dimelo` and `modkit` installed." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Colab setup\n", + "\n", + "If you are running in Google Colab, run the cells below. **It is expected that Colab will make you restart your runtime to enable new package versions.** " + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "You don't seem to be running on Google Colab so this cell is not going to be useful for you.\n", + "Make sure you are running you notebook in a conda environment set up as per README.md.\n", + "Once you have this notebook running in a correctly configured environment, proceed to the rest of the cells.\n", + " \n" + ] + } + ], + "source": [ + "# Lets Colab access your Google drive\n", + "try:\n", + " from google.colab import drive\n", + "except:\n", + " print(\"\"\"\n", + "You don't seem to be running on Google Colab so this cell is not going to be useful for you.\n", + "Make sure you are running you notebook in a conda environment set up as per README.md.\n", + "Once you have this notebook running in a correctly configured environment, proceed to the rest of the cells.\n", + " \"\"\")\n", + "else:\n", + " drive.mount('/content/drive')\n", + " # Install condacolab to let us get the modkit dependency\n", + " !pip install -q condacolab\n", + " import condacolab\n", + " condacolab.install()\n", + " # Install modkit\n", + " !conda install nanoporetech::modkit==0.2.4\n", + " # Clone the repo, change the active path to be inside the repo, and install the package\n", + " !rm -r dimelo_v2\n", + " !git clone https://github.com/streetslab/dimelo_v2\n", + " import os\n", + " os.chdir('dimelo_v2')\n", + " !pip install ipywidgets==7.7.1 .\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "After runtime restart in previous cell, run this cell to make sure your notebook is set up." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "try:\n", + " from google.colab import drive\n", + " drive.mount('/content/drive')\n", + " import os\n", + " os.chdir('dimelo_v2') \n", + "except:\n", + " pass" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# System and Versions Information" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Conda Environment" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Run this cell to list the packages present in your conda environment" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "# packages in environment at /global/software/rocky-8.x86_64/manual/modules/langs/anaconda3/2024.02-1:\n", + "#\n", + "# Name Version Build Channel\n", + "_anaconda_depends 2024.02 py311_mkl_1 \n", + "_libgcc_mutex 0.1 main \n", + "_openmp_mutex 5.1 1_gnu \n", + "abseil-cpp 20211102.0 hd4dd3e8_0 \n", + "aiobotocore 2.7.0 py311h06a4308_0 \n", + "aiohttp 3.9.3 py311h5eee18b_0 \n", + "aioitertools 0.7.1 pyhd3eb1b0_0 \n", + "aiosignal 1.2.0 pyhd3eb1b0_0 \n", + "alabaster 0.7.12 pyhd3eb1b0_0 \n", + "altair 5.0.1 py311h06a4308_0 \n", + "anaconda-anon-usage 0.4.3 py311hfc0e8ea_100 \n", + "anaconda-catalogs 0.2.0 py311h06a4308_0 \n", + "anaconda-client 1.12.3 py311h06a4308_0 \n", + "anaconda-cloud-auth 0.1.4 py311h06a4308_0 \n", + "anaconda-navigator 2.5.2 py311h06a4308_0 \n", + "anaconda-project 0.11.1 py311h06a4308_0 \n", + "anyio 4.2.0 py311h06a4308_0 \n", + "aom 3.6.0 h6a678d5_0 \n", + "appdirs 1.4.4 pyhd3eb1b0_0 \n", + "archspec 0.2.1 pyhd3eb1b0_0 \n", + "argon2-cffi 21.3.0 pyhd3eb1b0_0 \n", + "argon2-cffi-bindings 21.2.0 py311h5eee18b_0 \n", + "arrow 1.2.3 py311h06a4308_1 \n", + "arrow-cpp 14.0.2 h374c478_1 \n", + "astroid 2.14.2 py311h06a4308_0 \n", + "astropy 5.3.4 py311hf4808d0_0 \n", + "asttokens 2.0.5 pyhd3eb1b0_0 \n", + "async-lru 2.0.4 py311h06a4308_0 \n", + "atomicwrites 1.4.0 py_0 \n", + "attrs 23.1.0 py311h06a4308_0 \n", + "automat 20.2.0 py_0 \n", + "autopep8 1.6.0 pyhd3eb1b0_1 \n", + "aws-c-auth 0.6.19 h5eee18b_0 \n", + "aws-c-cal 0.5.20 hdbd6064_0 \n", + "aws-c-common 0.8.5 h5eee18b_0 \n", + "aws-c-compression 0.2.16 h5eee18b_0 \n", + "aws-c-event-stream 0.2.15 h6a678d5_0 \n", + "aws-c-http 0.6.25 h5eee18b_0 \n", + "aws-c-io 0.13.10 h5eee18b_0 \n", + "aws-c-mqtt 0.7.13 h5eee18b_0 \n", + "aws-c-s3 0.1.51 hdbd6064_0 \n", + "aws-c-sdkutils 0.1.6 h5eee18b_0 \n", + "aws-checksums 0.1.13 h5eee18b_0 \n", + "aws-crt-cpp 0.18.16 h6a678d5_0 \n", + "aws-sdk-cpp 1.10.55 h721c034_0 \n", + "babel 2.11.0 py311h06a4308_0 \n", + "backports 1.1 pyhd3eb1b0_0 \n", + "backports.functools_lru_cache 1.6.4 pyhd3eb1b0_0 \n", + "backports.tempfile 1.0 pyhd3eb1b0_1 \n", + "backports.weakref 1.0.post1 py_1 \n", + "bcrypt 3.2.0 py311h5eee18b_1 \n", + "beautifulsoup4 4.12.2 py311h06a4308_0 \n", + "binaryornot 0.4.4 pyhd3eb1b0_1 \n", + "black 23.11.0 py311h06a4308_0 \n", + "blas 1.0 mkl \n", + "bleach 4.1.0 pyhd3eb1b0_0 \n", + "blinker 1.6.2 py311h06a4308_0 \n", + "blosc 1.21.3 h6a678d5_0 \n", + "bokeh 3.3.4 py311h92b7b1e_0 \n", + "boltons 23.0.0 py311h06a4308_0 \n", + "boost-cpp 1.82.0 hdb19cb5_2 \n", + "botocore 1.31.64 py311h06a4308_0 \n", + "bottleneck 1.3.7 py311hf4808d0_0 \n", + "brotli 1.0.9 h5eee18b_7 \n", + "brotli-bin 1.0.9 h5eee18b_7 \n", + "brotli-python 1.0.9 py311h6a678d5_7 \n", + "brunsli 0.1 h2531618_0 \n", + "bzip2 1.0.8 h7b6447c_0 \n", + "c-ares 1.19.1 h5eee18b_0 \n", + "c-blosc2 2.12.0 h80c7b02_0 \n", + "ca-certificates 2023.12.12 h06a4308_0 \n", + "cachetools 4.2.2 pyhd3eb1b0_0 \n", + "certifi 2024.2.2 py311h06a4308_0 \n", + "cffi 1.16.0 py311h5eee18b_0 \n", + "cfitsio 3.470 h5893167_7 \n", + "chardet 4.0.0 py311h06a4308_1003 \n", + "charls 2.2.0 h2531618_0 \n", + "charset-normalizer 2.0.4 pyhd3eb1b0_0 \n", + "click 8.1.7 py311h06a4308_0 \n", + "cloudpickle 2.2.1 py311h06a4308_0 \n", + "clyent 1.2.2 py311h06a4308_1 \n", + "colorama 0.4.6 py311h06a4308_0 \n", + "colorcet 3.0.1 py311h06a4308_0 \n", + "comm 0.1.2 py311h06a4308_0 \n", + "conda 24.1.2 py311h06a4308_0 \n", + "conda-build 24.1.2 py311h06a4308_0 \n", + "conda-content-trust 0.2.0 py311h06a4308_0 \n", + "conda-index 0.4.0 pyhd3eb1b0_0 \n", + "conda-libmamba-solver 24.1.0 pyhd3eb1b0_0 \n", + "conda-pack 0.6.0 pyhd3eb1b0_0 \n", + "conda-package-handling 2.2.0 py311h06a4308_0 \n", + "conda-package-streaming 0.9.0 py311h06a4308_0 \n", + "conda-repo-cli 1.0.75 py311h06a4308_0 \n", + "conda-token 0.4.0 pyhd3eb1b0_0 \n", + "conda-verify 3.4.2 py_1 \n", + "constantly 23.10.4 py311h06a4308_0 \n", + "contourpy 1.2.0 py311hdb19cb5_0 \n", + "cookiecutter 2.5.0 py311h06a4308_0 \n", + "cryptography 42.0.2 py311hdda0065_0 \n", + "cssselect 1.2.0 py311h06a4308_0 \n", + "curl 8.5.0 hdbd6064_0 \n", + "cycler 0.11.0 pyhd3eb1b0_0 \n", + "cyrus-sasl 2.1.28 h52b45da_1 \n", + "cytoolz 0.12.2 py311h5eee18b_0 \n", + "dask 2023.11.0 py311h06a4308_0 \n", + "dask-core 2023.11.0 py311h06a4308_0 \n", + "datashader 0.16.0 py311h06a4308_0 \n", + "dav1d 1.2.1 h5eee18b_0 \n", + "dbus 1.13.18 hb2f20db_0 \n", + "debugpy 1.6.7 py311h6a678d5_0 \n", + "decorator 5.1.1 pyhd3eb1b0_0 \n", + "defusedxml 0.7.1 pyhd3eb1b0_0 \n", + "diff-match-patch 20200713 pyhd3eb1b0_0 \n", + "dill 0.3.7 py311h06a4308_0 \n", + "distributed 2023.11.0 py311h06a4308_0 \n", + "distro 1.8.0 py311h06a4308_0 \n", + "docstring-to-markdown 0.11 py311h06a4308_0 \n", + "docutils 0.18.1 py311h06a4308_3 \n", + "entrypoints 0.4 py311h06a4308_0 \n", + "et_xmlfile 1.1.0 py311h06a4308_0 \n", + "executing 0.8.3 pyhd3eb1b0_0 \n", + "expat 2.5.0 h6a678d5_0 \n", + "filelock 3.13.1 py311h06a4308_0 \n", + "flake8 6.0.0 py311h06a4308_0 \n", + "flask 2.2.5 py311h06a4308_0 \n", + "fmt 9.1.0 hdb19cb5_0 \n", + "fontconfig 2.14.1 h4c34cd2_2 \n", + "fonttools 4.25.0 pyhd3eb1b0_0 \n", + "freetype 2.12.1 h4a9f257_0 \n", + "frozenlist 1.4.0 py311h5eee18b_0 \n", + "fsspec 2023.10.0 py311h06a4308_0 \n", + "future 0.18.3 py311h06a4308_0 \n", + "gensim 4.3.0 py311hba01205_1 \n", + "gflags 2.2.2 h6a678d5_1 \n", + "giflib 5.2.1 h5eee18b_3 \n", + "gitdb 4.0.7 pyhd3eb1b0_0 \n", + "gitpython 3.1.37 py311h06a4308_0 \n", + "glib 2.78.4 h6a678d5_0 \n", + "glib-tools 2.78.4 h6a678d5_0 \n", + "glog 0.5.0 h6a678d5_1 \n", + "gmp 6.2.1 h295c915_3 \n", + "gmpy2 2.1.2 py311hc9b5ff0_0 \n", + "greenlet 3.0.1 py311h6a678d5_0 \n", + "grpc-cpp 1.48.2 he1ff14a_1 \n", + "gst-plugins-base 1.14.1 h6a678d5_1 \n", + "gstreamer 1.14.1 h5eee18b_1 \n", + "h5py 3.9.0 py311hdd6beaf_0 \n", + "hdf5 1.12.1 h2b7332f_3 \n", + "heapdict 1.0.1 pyhd3eb1b0_0 \n", + "holoviews 1.18.3 py311h06a4308_0 \n", + "hvplot 0.9.2 py311h06a4308_0 \n", + "hyperlink 21.0.0 pyhd3eb1b0_0 \n", + "icu 73.1 h6a678d5_0 \n", + "idna 3.4 py311h06a4308_0 \n", + "imagecodecs 2023.1.23 py311h8105a5c_0 \n", + "imageio 2.33.1 py311h06a4308_0 \n", + "imagesize 1.4.1 py311h06a4308_0 \n", + "imbalanced-learn 0.11.0 py311h06a4308_1 \n", + "importlib-metadata 7.0.1 py311h06a4308_0 \n", + "importlib_metadata 7.0.1 hd3eb1b0_0 \n", + "incremental 22.10.0 pyhd3eb1b0_0 \n", + "inflection 0.5.1 py311h06a4308_0 \n", + "iniconfig 1.1.1 pyhd3eb1b0_0 \n", + "intake 0.6.8 py311h06a4308_0 \n", + "intel-openmp 2023.1.0 hdb19cb5_46306 \n", + "intervaltree 3.1.0 pyhd3eb1b0_0 \n", + "ipykernel 6.28.0 py311h06a4308_0 \n", + "ipython 8.20.0 py311h06a4308_0 \n", + "ipython_genutils 0.2.0 pyhd3eb1b0_1 \n", + "ipywidgets 7.6.5 pyhd3eb1b0_2 \n", + "isort 5.9.3 pyhd3eb1b0_0 \n", + "itemadapter 0.3.0 pyhd3eb1b0_0 \n", + "itemloaders 1.1.0 py311h06a4308_0 \n", + "itsdangerous 2.0.1 pyhd3eb1b0_0 \n", + "jaraco.classes 3.2.1 pyhd3eb1b0_0 \n", + "jedi 0.18.1 py311h06a4308_1 \n", + "jeepney 0.7.1 pyhd3eb1b0_0 \n", + "jellyfish 1.0.1 py311hb02cf49_0 \n", + "jinja2 3.1.3 py311h06a4308_0 \n", + "jmespath 1.0.1 py311h06a4308_0 \n", + "joblib 1.2.0 py311h06a4308_0 \n", + "jpeg 9e h5eee18b_1 \n", + "jq 1.6 h27cfd23_1000 \n", + "json5 0.9.6 pyhd3eb1b0_0 \n", + "jsonpatch 1.32 pyhd3eb1b0_0 \n", + "jsonpointer 2.1 pyhd3eb1b0_0 \n", + "jsonschema 4.19.2 py311h06a4308_0 \n", + "jsonschema-specifications 2023.7.1 py311h06a4308_0 \n", + "jupyter 1.0.0 py311h06a4308_9 \n", + "jupyter-lsp 2.2.0 py311h06a4308_0 \n", + "jupyter_client 8.6.0 py311h06a4308_0 \n", + "jupyter_console 6.6.3 py311h06a4308_0 \n", + "jupyter_core 5.5.0 py311h06a4308_0 \n", + "jupyter_events 0.8.0 py311h06a4308_0 \n", + "jupyter_server 2.10.0 py311h06a4308_0 \n", + "jupyter_server_terminals 0.4.4 py311h06a4308_1 \n", + "jupyterlab 4.0.11 py311h06a4308_0 \n", + "jupyterlab-variableinspector 3.1.0 py311h06a4308_0 \n", + "jupyterlab_pygments 0.1.2 py_0 \n", + "jupyterlab_server 2.25.1 py311h06a4308_0 \n", + "jupyterlab_widgets 3.0.9 py311h06a4308_0 \n", + "jxrlib 1.1 h7b6447c_2 \n", + "keyring 23.13.1 py311h06a4308_0 \n", + "kiwisolver 1.4.4 py311h6a678d5_0 \n", + "krb5 1.20.1 h143b758_1 \n", + "lazy-object-proxy 1.6.0 py311h5eee18b_0 \n", + "lazy_loader 0.3 py311h06a4308_0 \n", + "lcms2 2.12 h3be6417_0 \n", + "ld_impl_linux-64 2.38 h1181459_1 \n", + "lerc 3.0 h295c915_0 \n", + "libaec 1.0.4 he6710b0_1 \n", + "libarchive 3.6.2 h6ac8c49_2 \n", + "libavif 0.11.1 h5eee18b_0 \n", + "libboost 1.82.0 h109eef0_2 \n", + "libbrotlicommon 1.0.9 h5eee18b_7 \n", + "libbrotlidec 1.0.9 h5eee18b_7 \n", + "libbrotlienc 1.0.9 h5eee18b_7 \n", + "libclang 14.0.6 default_hc6dbbc7_1 \n", + "libclang13 14.0.6 default_he11475f_1 \n", + "libcups 2.4.2 h2d74bed_1 \n", + "libcurl 8.5.0 h251f7ec_0 \n", + "libdeflate 1.17 h5eee18b_1 \n", + "libedit 3.1.20230828 h5eee18b_0 \n", + "libev 4.33 h7f8727e_1 \n", + "libevent 2.1.12 hdbd6064_1 \n", + "libffi 3.4.4 h6a678d5_0 \n", + "libgcc-ng 11.2.0 h1234567_1 \n", + "libgfortran-ng 11.2.0 h00389a5_1 \n", + "libgfortran5 11.2.0 h1234567_1 \n", + "libglib 2.78.4 hdc74915_0 \n", + "libgomp 11.2.0 h1234567_1 \n", + "libiconv 1.16 h7f8727e_2 \n", + "liblief 0.12.3 h6a678d5_0 \n", + "libllvm14 14.0.6 hdb19cb5_3 \n", + "libmamba 1.5.6 haf1ee3a_0 \n", + "libmambapy 1.5.6 py311h2dafd23_0 \n", + "libnghttp2 1.57.0 h2d74bed_0 \n", + "libpng 1.6.39 h5eee18b_0 \n", + "libpq 12.17 hdbd6064_0 \n", + "libprotobuf 3.20.3 he621ea3_0 \n", + "libsodium 1.0.18 h7b6447c_0 \n", + "libsolv 0.7.24 he621ea3_0 \n", + "libspatialindex 1.9.3 h2531618_0 \n", + "libssh2 1.10.0 hdbd6064_2 \n", + "libstdcxx-ng 11.2.0 h1234567_1 \n", + "libthrift 0.15.0 h1795dd8_2 \n", + "libtiff 4.5.1 h6a678d5_0 \n", + "libuuid 1.41.5 h5eee18b_0 \n", + "libwebp-base 1.3.2 h5eee18b_0 \n", + "libxcb 1.15 h7f8727e_0 \n", + "libxkbcommon 1.0.1 h5eee18b_1 \n", + "libxml2 2.10.4 hf1b16e4_1 \n", + "libxslt 1.1.37 h5eee18b_1 \n", + "libzopfli 1.0.3 he6710b0_0 \n", + "linkify-it-py 2.0.0 py311h06a4308_0 \n", + "llvmlite 0.42.0 py311h6a678d5_0 \n", + "locket 1.0.0 py311h06a4308_0 \n", + "lxml 4.9.3 py311hdbbb534_0 \n", + "lz4 4.3.2 py311h5eee18b_0 \n", + "lz4-c 1.9.4 h6a678d5_0 \n", + "lzo 2.10 h7b6447c_2 \n", + "markdown 3.4.1 py311h06a4308_0 \n", + "markdown-it-py 2.2.0 py311h06a4308_1 \n", + "markupsafe 2.1.3 py311h5eee18b_0 \n", + "matplotlib 3.8.0 py311h06a4308_0 \n", + "matplotlib-base 3.8.0 py311ha02d727_0 \n", + "matplotlib-inline 0.1.6 py311h06a4308_0 \n", + "mccabe 0.7.0 pyhd3eb1b0_0 \n", + "mdit-py-plugins 0.3.0 py311h06a4308_0 \n", + "mdurl 0.1.0 py311h06a4308_0 \n", + "menuinst 2.0.2 py311h06a4308_0 \n", + "mistune 2.0.4 py311h06a4308_0 \n", + "mkl 2023.1.0 h213fc3f_46344 \n", + "mkl-service 2.4.0 py311h5eee18b_1 \n", + "mkl_fft 1.3.8 py311h5eee18b_0 \n", + "mkl_random 1.2.4 py311hdb19cb5_0 \n", + "more-itertools 10.1.0 py311h06a4308_0 \n", + "mpc 1.1.0 h10f8cd9_1 \n", + "mpfr 4.0.2 hb69a4c5_1 \n", + "mpmath 1.3.0 py311h06a4308_0 \n", + "msgpack-python 1.0.3 py311hdb19cb5_0 \n", + "multidict 6.0.4 py311h5eee18b_0 \n", + "multipledispatch 0.6.0 py311h06a4308_0 \n", + "munkres 1.1.4 py_0 \n", + "mypy 1.8.0 py311h5eee18b_0 \n", + "mypy_extensions 1.0.0 py311h06a4308_0 \n", + "mysql 5.7.24 h721c034_2 \n", + "navigator-updater 0.4.0 py311h06a4308_1 \n", + "nbclient 0.8.0 py311h06a4308_0 \n", + "nbconvert 7.10.0 py311h06a4308_0 \n", + "nbformat 5.9.2 py311h06a4308_0 \n", + "ncurses 6.4 h6a678d5_0 \n", + "nest-asyncio 1.6.0 py311h06a4308_0 \n", + "networkx 3.1 py311h06a4308_0 \n", + "nltk 3.8.1 py311h06a4308_0 \n", + "notebook 7.0.8 py311h06a4308_0 \n", + "notebook-shim 0.2.3 py311h06a4308_0 \n", + "nspr 4.35 h6a678d5_0 \n", + "nss 3.89.1 h6a678d5_0 \n", + "numba 0.59.0 py311ha02d727_0 \n", + "numexpr 2.8.7 py311h65dcdc2_0 \n", + "numpy 1.26.4 py311h08b1b3b_0 \n", + "numpy-base 1.26.4 py311hf175353_0 \n", + "numpydoc 1.5.0 py311h06a4308_0 \n", + "nvidia-cublas-cu11 11.11.3.6 pypi_0 pypi\n", + "nvidia-cublas-cu12 12.4.5.8 pypi_0 pypi\n", + "nvidia-cuda-cupti-cu11 11.8.87 pypi_0 pypi\n", + "nvidia-cuda-nvrtc-cu11 11.8.89 pypi_0 pypi\n", + "nvidia-cuda-runtime-cu11 11.8.89 pypi_0 pypi\n", + "nvidia-cuda-runtime-cu12 12.4.127 pypi_0 pypi\n", + "nvidia-cudnn-cu11 8.7.0.84 pypi_0 pypi\n", + "nvidia-cudnn-cu12 9.0.0.312 pypi_0 pypi\n", + "nvidia-cufft-cu11 10.9.0.58 pypi_0 pypi\n", + "nvidia-curand-cu11 10.3.0.86 pypi_0 pypi\n", + "nvidia-cusolver-cu11 11.4.1.48 pypi_0 pypi\n", + "nvidia-cusparse-cu11 11.7.5.86 pypi_0 pypi\n", + "nvidia-nccl-cu11 2.20.5 pypi_0 pypi\n", + "nvidia-nvtx-cu11 11.8.86 pypi_0 pypi\n", + "oniguruma 6.9.7.1 h27cfd23_0 \n", + "openjpeg 2.4.0 h3ad879b_0 \n", + "openpyxl 3.0.10 py311h5eee18b_0 \n", + "openssl 3.0.13 h7f8727e_0 \n", + "orc 1.7.4 hb3bc3d3_1 \n", + "overrides 7.4.0 py311h06a4308_0 \n", + "packaging 23.1 py311h06a4308_0 \n", + "pandas 2.1.4 py311ha02d727_0 \n", + "pandocfilters 1.5.0 pyhd3eb1b0_0 \n", + "panel 1.3.8 py311h06a4308_0 \n", + "param 2.0.2 py311h06a4308_0 \n", + "parsel 1.8.1 py311h06a4308_0 \n", + "parso 0.8.3 pyhd3eb1b0_0 \n", + "partd 1.4.1 py311h06a4308_0 \n", + "patch 2.7.6 h7b6447c_1001 \n", + "patchelf 0.17.2 h6a678d5_0 \n", + "pathlib 1.0.1 pyhd3eb1b0_1 \n", + "pathspec 0.10.3 py311h06a4308_0 \n", + "patsy 0.5.3 py311h06a4308_0 \n", + "pcre2 10.42 hebb0a14_0 \n", + "pexpect 4.8.0 pyhd3eb1b0_3 \n", + "pickleshare 0.7.5 pyhd3eb1b0_1003 \n", + "pillow 10.2.0 py311h5eee18b_0 \n", + "pip 23.3.1 py311h06a4308_0 \n", + "pkce 1.0.3 py311h06a4308_0 \n", + "pkginfo 1.9.6 py311h06a4308_0 \n", + "platformdirs 3.10.0 py311h06a4308_0 \n", + "plotly 5.9.0 py311h06a4308_0 \n", + "pluggy 1.0.0 py311h06a4308_1 \n", + "ply 3.11 py311h06a4308_0 \n", + "prometheus_client 0.14.1 py311h06a4308_0 \n", + "prompt-toolkit 3.0.43 py311h06a4308_0 \n", + "prompt_toolkit 3.0.43 hd3eb1b0_0 \n", + "protego 0.1.16 py_0 \n", + "protobuf 3.20.3 py311h6a678d5_0 \n", + "psutil 5.9.0 py311h5eee18b_0 \n", + "ptyprocess 0.7.0 pyhd3eb1b0_2 \n", + "pure_eval 0.2.2 pyhd3eb1b0_0 \n", + "py-cpuinfo 9.0.0 py311h06a4308_0 \n", + "py-lief 0.12.3 py311h6a678d5_0 \n", + "pyarrow 14.0.2 py311hb6e97c4_0 \n", + "pyasn1 0.4.8 pyhd3eb1b0_0 \n", + "pyasn1-modules 0.2.8 py_0 \n", + "pybind11-abi 4 hd3eb1b0_1 \n", + "pycodestyle 2.10.0 py311h06a4308_0 \n", + "pycosat 0.6.6 py311h5eee18b_0 \n", + "pycparser 2.21 pyhd3eb1b0_0 \n", + "pyct 0.5.0 py311h06a4308_0 \n", + "pycurl 7.45.2 py311hdbd6064_1 \n", + "pydantic 1.10.12 py311h5eee18b_1 \n", + "pydeck 0.8.0 py311h06a4308_2 \n", + "pydispatcher 2.0.5 py311h06a4308_2 \n", + "pydocstyle 6.3.0 py311h06a4308_0 \n", + "pyerfa 2.0.0 py311h5eee18b_0 \n", + "pyflakes 3.0.1 py311h06a4308_0 \n", + "pygments 2.15.1 py311h06a4308_1 \n", + "pyjwt 2.4.0 py311h06a4308_0 \n", + "pylint 2.16.2 py311h06a4308_0 \n", + "pylint-venv 2.3.0 py311h06a4308_0 \n", + "pyls-spyder 0.4.0 pyhd3eb1b0_0 \n", + "pyodbc 5.0.1 py311h6a678d5_0 \n", + "pyopenssl 24.0.0 py311h06a4308_0 \n", + "pyparsing 3.0.9 py311h06a4308_0 \n", + "pyqt 5.15.10 py311h6a678d5_0 \n", + "pyqt5-sip 12.13.0 py311h5eee18b_0 \n", + "pyqtwebengine 5.15.10 py311h6a678d5_0 \n", + "pysocks 1.7.1 py311h06a4308_0 \n", + "pytables 3.9.2 py311h9d13977_0 \n", + "pytest 7.4.0 py311h06a4308_0 \n", + "python 3.11.7 h955ad1f_0 \n", + "python-dateutil 2.8.2 pyhd3eb1b0_0 \n", + "python-dotenv 0.21.0 py311h06a4308_0 \n", + "python-fastjsonschema 2.16.2 py311h06a4308_0 \n", + "python-json-logger 2.0.7 py311h06a4308_0 \n", + "python-libarchive-c 2.9 pyhd3eb1b0_1 \n", + "python-lmdb 1.4.1 py311h6a678d5_0 \n", + "python-lsp-black 1.2.1 py311h06a4308_0 \n", + "python-lsp-jsonrpc 1.0.0 pyhd3eb1b0_0 \n", + "python-lsp-server 1.7.2 py311h06a4308_0 \n", + "python-slugify 5.0.2 pyhd3eb1b0_0 \n", + "python-snappy 0.6.1 py311h6a678d5_0 \n", + "python-tzdata 2023.3 pyhd3eb1b0_0 \n", + "pytoolconfig 1.2.6 py311h06a4308_0 \n", + "pytz 2023.3.post1 py311h06a4308_0 \n", + "pyviz_comms 3.0.0 py311h06a4308_0 \n", + "pywavelets 1.5.0 py311hf4808d0_0 \n", + "pyxdg 0.27 pyhd3eb1b0_0 \n", + "pyyaml 6.0.1 py311h5eee18b_0 \n", + "pyzmq 25.1.2 py311h6a678d5_0 \n", + "qdarkstyle 3.0.2 pyhd3eb1b0_0 \n", + "qstylizer 0.2.2 py311h06a4308_0 \n", + "qt-main 5.15.2 h53bd1ea_10 \n", + "qt-webengine 5.15.9 h9ab4d14_7 \n", + "qtawesome 1.2.2 py311h06a4308_0 \n", + "qtconsole 5.4.2 py311h06a4308_0 \n", + "qtpy 2.4.1 py311h06a4308_0 \n", + "queuelib 1.6.2 py311h06a4308_0 \n", + "re2 2022.04.01 h295c915_0 \n", + "readline 8.2 h5eee18b_0 \n", + "referencing 0.30.2 py311h06a4308_0 \n", + "regex 2023.10.3 py311h5eee18b_0 \n", + "reproc 14.2.4 h295c915_1 \n", + "reproc-cpp 14.2.4 h295c915_1 \n", + "requests 2.31.0 py311h06a4308_1 \n", + "requests-file 1.5.1 pyhd3eb1b0_0 \n", + "requests-toolbelt 1.0.0 py311h06a4308_0 \n", + "rfc3339-validator 0.1.4 py311h06a4308_0 \n", + "rfc3986-validator 0.1.1 py311h06a4308_0 \n", + "rich 13.3.5 py311h06a4308_0 \n", + "rope 1.7.0 py311h06a4308_0 \n", + "rpds-py 0.10.6 py311hb02cf49_0 \n", + "rtree 1.0.1 py311h06a4308_0 \n", + "ruamel.yaml 0.17.21 py311h5eee18b_0 \n", + "ruamel_yaml 0.17.21 py311h5eee18b_0 \n", + "s2n 1.3.27 hdbd6064_0 \n", + "s3fs 2023.10.0 py311h06a4308_0 \n", + "scikit-image 0.22.0 py311ha02d727_0 \n", + "scikit-learn 1.2.2 py311h6a678d5_1 \n", + "scipy 1.11.4 py311h08b1b3b_0 \n", + "scrapy 2.8.0 py311h06a4308_0 \n", + "seaborn 0.12.2 py311h06a4308_0 \n", + "secretstorage 3.3.1 py311h06a4308_1 \n", + "semver 2.13.0 pyhd3eb1b0_0 \n", + "send2trash 1.8.2 py311h06a4308_0 \n", + "service_identity 18.1.0 pyhd3eb1b0_1 \n", + "setuptools 68.2.2 py311h06a4308_0 \n", + "sip 6.7.12 py311h6a678d5_0 \n", + "six 1.16.0 pyhd3eb1b0_1 \n", + "smart_open 5.2.1 py311h06a4308_0 \n", + "smmap 4.0.0 pyhd3eb1b0_0 \n", + "snappy 1.1.10 h6a678d5_1 \n", + "sniffio 1.3.0 py311h06a4308_0 \n", + "snowballstemmer 2.2.0 pyhd3eb1b0_0 \n", + "sortedcontainers 2.4.0 pyhd3eb1b0_0 \n", + "soupsieve 2.5 py311h06a4308_0 \n", + "sphinx 5.0.2 py311h06a4308_0 \n", + "sphinxcontrib-applehelp 1.0.2 pyhd3eb1b0_0 \n", + "sphinxcontrib-devhelp 1.0.2 pyhd3eb1b0_0 \n", + "sphinxcontrib-htmlhelp 2.0.0 pyhd3eb1b0_0 \n", + "sphinxcontrib-jsmath 1.0.1 pyhd3eb1b0_0 \n", + "sphinxcontrib-qthelp 1.0.3 pyhd3eb1b0_0 \n", + "sphinxcontrib-serializinghtml 1.1.5 pyhd3eb1b0_0 \n", + "spyder 5.4.3 py311h06a4308_1 \n", + "spyder-kernels 2.4.4 py311h06a4308_0 \n", + "sqlalchemy 2.0.25 py311h5eee18b_0 \n", + "sqlite 3.41.2 h5eee18b_0 \n", + "stack_data 0.2.0 pyhd3eb1b0_0 \n", + "statsmodels 0.14.0 py311hf4808d0_0 \n", + "streamlit 1.30.0 py311h06a4308_0 \n", + "sympy 1.12 py311h06a4308_0 \n", + "tabulate 0.9.0 py311h06a4308_0 \n", + "tbb 2021.8.0 hdb19cb5_0 \n", + "tblib 1.7.0 pyhd3eb1b0_0 \n", + "tenacity 8.2.2 py311h06a4308_0 \n", + "tensorrt-bindings 8.6.1 pypi_0 pypi\n", + "tensorrt-libs 8.6.1 pypi_0 pypi\n", + "terminado 0.17.1 py311h06a4308_0 \n", + "text-unidecode 1.3 pyhd3eb1b0_0 \n", + "textdistance 4.2.1 pyhd3eb1b0_0 \n", + "threadpoolctl 2.2.0 pyh0d69192_0 \n", + "three-merge 0.1.1 pyhd3eb1b0_0 \n", + "tifffile 2023.4.12 py311h06a4308_0 \n", + "tinycss2 1.2.1 py311h06a4308_0 \n", + "tk 8.6.12 h1ccaba5_0 \n", + "tldextract 3.2.0 pyhd3eb1b0_0 \n", + "toml 0.10.2 pyhd3eb1b0_0 \n", + "tomlkit 0.11.1 py311h06a4308_0 \n", + "toolz 0.12.0 py311h06a4308_0 \n", + "torch 2.3.1+cu118 pypi_0 pypi\n", + "torchaudio 2.3.1+cu118 pypi_0 pypi\n", + "torchvision 0.18.1+cu118 pypi_0 pypi\n", + "tornado 6.3.3 py311h5eee18b_0 \n", + "tqdm 4.65.0 py311h92b7b1e_0 \n", + "traitlets 5.7.1 py311h06a4308_0 \n", + "triton 2.3.1 pypi_0 pypi\n", + "truststore 0.8.0 py311h06a4308_0 \n", + "twisted 23.10.0 py311h06a4308_0 \n", + "typing-extensions 4.9.0 py311h06a4308_1 \n", + "typing_extensions 4.9.0 py311h06a4308_1 \n", + "tzdata 2023d h04d1e81_0 \n", + "tzlocal 2.1 py311h06a4308_1 \n", + "uc-micro-py 1.0.1 py311h06a4308_0 \n", + "ujson 5.4.0 py311h6a678d5_0 \n", + "unidecode 1.2.0 pyhd3eb1b0_0 \n", + "unixodbc 2.3.11 h5eee18b_0 \n", + "urllib3 2.0.7 py311h06a4308_0 \n", + "utf8proc 2.6.1 h5eee18b_1 \n", + "validators 0.18.2 pyhd3eb1b0_0 \n", + "w3lib 2.1.2 py311h06a4308_0 \n", + "watchdog 2.1.6 py311h06a4308_0 \n", + "wcwidth 0.2.5 pyhd3eb1b0_0 \n", + "webencodings 0.5.1 py311h06a4308_1 \n", + "websocket-client 0.58.0 py311h06a4308_4 \n", + "werkzeug 2.2.3 py311h06a4308_0 \n", + "whatthepatch 1.0.2 py311h06a4308_0 \n", + "wheel 0.41.2 py311h06a4308_0 \n", + "widgetsnbextension 3.5.2 py311h06a4308_1 \n", + "wrapt 1.14.1 py311h5eee18b_0 \n", + "wurlitzer 3.0.2 py311h06a4308_0 \n", + "xarray 2023.6.0 py311h06a4308_0 \n", + "xyzservices 2022.9.0 py311h06a4308_1 \n", + "xz 5.4.5 h5eee18b_0 \n", + "yaml 0.2.5 h7b6447c_0 \n", + "yaml-cpp 0.8.0 h6a678d5_0 \n", + "yapf 0.31.0 pyhd3eb1b0_0 \n", + "yarl 1.9.3 py311h5eee18b_0 \n", + "zeromq 4.3.5 h6a678d5_0 \n", + "zfp 1.0.0 h6a678d5_0 \n", + "zict 3.0.0 py311h06a4308_0 \n", + "zipp 3.17.0 py311h06a4308_0 \n", + "zlib 1.2.13 h5eee18b_0 \n", + "zlib-ng 2.0.7 h5eee18b_0 \n", + "zope 1.0 py311h06a4308_1 \n", + "zope.interface 5.4.0 py311h5eee18b_0 \n", + "zstandard 0.19.0 py311h5eee18b_0 \n", + "zstd 1.5.5 hc292b87_0 \n" + ] + } + ], + "source": [ + "!conda list" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## System Information" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Run this cell to list system information about your machine" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "System: Linux\n", + "Release: 4.18.0-553.5.1.el8_10.x86_64\n", + "Version: #1 SMP Thu Jun 6 09:41:19 UTC 2024\n", + "Processor: x86_64\n" + ] + } + ], + "source": [ + "import platform\n", + "print('System:',platform.system())\n", + "print('Release:',platform.release())\n", + "print('Version:',platform.version())\n", + "print('Processor:',platform.processor())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Git Repo Version" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Run this cell to capture the exact repo version you're running, in case we need to debug anything" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "9126acc9ab26256b60a4baae215e5e5b9182d257\n" + ] + } + ], + "source": [ + "!git -C . log -1 --format=%H" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Initialization" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from pathlib import Path\n", + "from matplotlib import pyplot as plt\n", + "import urllib, gzip" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "# Base input and output directories\n", + "test_data_dir = Path('./dimelo/test/data')\n", + "output_dir = Path('./dimelo/test/output')\n", + "\n", + "output_dir.mkdir(exist_ok=True)\n", + "\n", + "# Input files\n", + "ctcf_bam_file = test_data_dir / 'ctcf_demo.sorted.bam'\n", + "ctcf_guppy_bam_file = test_data_dir / 'winnowmap_guppy_merge_subset.updated.bam'\n", + "ctcf_target_regions = test_data_dir / 'ctcf_demo_peak.bed'\n", + "ctcf_off_target_regions = test_data_dir / 'ctcf_demo_not_peak.bed'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The cell below only needs to run once; if you try to run it with the reference genome already downloaded it will likely just not complete." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Reference genome already present. Set force_redownload=True to if you want to download it again.\n" + ] + } + ], + "source": [ + "ref_genome_url = 'https://s3-us-west-2.amazonaws.com/human-pangenomics/T2T/CHM13/assemblies/chm13.draft_v1.0.fasta.gz'\n", + "ref_genome_gz = output_dir / 'chm13.draft_v1.0.fasta.gz'\n", + "ref_genome_file = output_dir / 'chm13.draft_v1.0.fasta'\n", + "force_redownload = False\n", + "if ref_genome_file.exists() and not force_redownload:\n", + " print('Reference genome already present. Set force_redownload=True to if you want to download it again.')\n", + "else:\n", + " urllib.request.urlretrieve(ref_genome_url,ref_genome_gz)\n", + "\n", + " with gzip.open(ref_genome_gz,'rb') as gzip_file:\n", + " with open(ref_genome_file,'wb') as output_file:\n", + " for chunk in gzip_file:\n", + " output_file.write(chunk)\n", + "\n", + " ref_genome_gz.unlink()\n", + " print(\"Reference genome downloaded and decompressed.\")\n", + "# !curl https://s3-us-west-2.amazonaws.com/human-pangenomics/T2T/CHM13/assemblies/chm13.draft_v1.0.fasta.gz -o ./test/output/chm13.draft_v1.0.fasta.gz\n", + "# !gunzip ./test/output/chm13.draft_v1.0.fasta.gz" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Basic Use Overview" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For details on parameters and functionality breakdown, please read the README sections on **Basic Use**, especially **Parameters and what they mean**." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Parsing" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "PATH does not include the conda environment /bin folder. Adding /global/home/users/dixonluinenburg/.conda/envs/dimelo_v2/bin.\n", + "PATH is now /global/home/users/dixonluinenburg/.conda/envs/dimelo_v2/bin:/global/software/rocky-8.x86_64/manual/modules/langs/anaconda3/2024.02-1/bin:/global/home/users/dixonluinenburg/perl5/bin:/usr/share/Modules/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/global/home/groups/allhands/bin:/global/home/users/dixonluinenburg/bin\n", + "modkit found with expected version 0.2.4\n" + ] + } + ], + "source": [ + "from dimelo import parse_bam" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Pileup and Update Tags" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Attempting to parse a malformed BAM file will raise an error, thanks to input BAM format checking. Passing a bam file that doesn't meet the specifications directly to `modkit` will typically result in an empty ouput file; `modkit` will find no valid base modifications and return all-zero data.\n", + "\n", + "Megalodon and Guppy bam files are considered malformed because they do not meet the latest .bam spec. Some newer basecallers output correctly formatted files without requiring additional processing.\n", + "\n", + "However, `modkit` comes with two tools that can update bam files to meet spec." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "This is expected to fail. Read the error message below:\n", + "\n", + "\n", + "Base modification tags are out of spec (Mm and Ml instead of MM and ML). \n", + "\n", + "Consider using \"modkit update-tags dimelo/test/data/ctcf_demo.sorted.bam new_file.bam\" in the command line with your conda environment active and then trying with the new file. For megalodon basecalling/modcalling, you may also need to pass \"--mode ambiguous.\n", + "Be sure to index the resulting .bam file.\"\n", + "If you are confident that your inputs are ok, pass \"override_checks=True\" to convert to warning and proceed with processing.\n" + ] + } + ], + "source": [ + "try:\n", + " pileup_file, pileup_regions = parse_bam.pileup(\n", + " input_file=ctcf_bam_file,\n", + " output_name='ctcf_demo_pileup_on_target',\n", + " ref_genome=ref_genome_file,\n", + " output_directory=output_dir,\n", + " regions=[ctcf_target_regions,ctcf_off_target_regions],\n", + " motifs=['A,0','CG,0'],\n", + " # parsing can optionally specify mod codes. \n", + " # The default is Y or a for adenine and m or Z for cytosine, corresponding to methylation\n", + " # motifs = ['A,0,Y','CG,0,Z'], \n", + " thresh=190,\n", + " window_size=1000,\n", + " # cores = 1, # uncomment this line if your process appears to be terminating early (reduces memory usage)\n", + " # quiet = True,\n", + " # cleanup = False,\n", + " # log=True,\n", + " )\n", + " print('The code executed successfully.')\n", + "except Exception as e:\n", + " print('This is expected to fail. Read the error message below:\\n\\n')\n", + " print(e)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To fix this, follow the suggestion from the error and run `modkit update-tags`..." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[2K> done, 1024 records processed, 0 failed, 0 skipped \n" + ] + } + ], + "source": [ + "!modkit update-tags \\\n", + "dimelo/test/data/ctcf_demo.sorted.bam \\\n", + "dimelo/test/output/ctcf_demo.updated.bam \\\n", + "--mode ambiguous" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "ctcf_bam_file_updated = output_dir / 'ctcf_demo.updated.bam'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "...and reindex the resulting file." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "''" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pysam\n", + "\n", + "pysam.index(str(ctcf_bam_file_updated))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally, the updated .bam file can be parsed, both for pileup and read extraction:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "No specified number of cores requested. 64 available on machine, allocating all.\n", + "Modification threshold of 190 assumed to be for range 0-255. 190/255=0.7450980392156863 will be sent to modkit.\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e30e4713b2ea4debaf196b564c2f2093", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " | Step 1: Identify motif locations in chm13.draft_v1.0.fasta 0% | 00:00" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4295b4f3060244c18b95c56f053bc50f", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " | Step 2: Parse regions in ctcf_demo.updated.bam 0% | 00:00" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize=(4, 2)) # If you want a different sized plot, you can us matplotlib commands\n", + "plot_enrichment_profile.by_modification(\n", + " mod_file_name=pileup_file,\n", + " regions=ctcf_target_regions,\n", + " window_size=1000,\n", + " motifs=['A,0','CG,0'],\n", + " single_strand=False, # if set to True, regions that specify the strand will only pull from reads on the strand (as opposed to both strands)\n", + " regions_5to3prime=False, # if set to True, regions on the reverse (-) strand will be flipped so everything is 5 prime to 3 prime\n", + " smooth_window=50,\n", + " palette = { # you can pass down kwargs to sns barplot if you want to\n", + " 'A,0':'blue',\n", + " 'CG,0':'orange'\n", + " }\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0, 0.5, 'mA/A')" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_enrichment_profile.by_regions(\n", + " mod_file_name=pileup_file,\n", + " regions_list=[ctcf_target_regions,ctcf_off_target_regions],\n", + " window_size=1000,\n", + " motif='A,0',\n", + " single_strand=False, # if set to True, regions that specify the strand will only pull from reads on the strand (as opposed to both strands)\n", + " regions_5to3prime=False, # if set to True, regions on the reverse (-) strand will be flipped so everything is 5 prime to 3 prime\n", + " smooth_window=50,\n", + ")\n", + "plt.xlabel('position relative to center of feature')\n", + "plt.ylabel('mA/A') # You can also use matplotlib commands to rename axes and more" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Plot Enrichment" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "from dimelo import plot_enrichment" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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6cYbb9SGDRv02Wef6YEHHtAjjzyiKVOmeKrXNsNzgADv4TlAAC6Umb/fps8AzZgxQw6HQzfccIO+/vprXXfddQoICNBDDz3UKcIPAADo/EwHIB8fH/3xj39UVlaWPv74Y9XV1WnYsGHq0aOHJ/oDAABwuwt6DpD03R1Xw4YNU2RkpDZt2qQ9e/a4sy8AAACPMR2A7rzzTueToL/55huNGjVKd955p0aMGKG1a9e6vUEAAAB3Mx2A3nnnHV177bWSpNdff10Oh0MnT57UM888o/nz57u9QQAAAHczHYBqamp0ySWXSJKKiop0++2366KLLtK4ceO0f/9+tzcIAADgbqYDUFhYmEpLS1VfX6+ioiLddNNNkqQvv/xSNpvN7Q0CAAC4m+m7wO6//35NnDhRPXr00MCBA3X99ddL+u7SWFRUlLv7AwAAcDvTAej3v/+94uLiVFlZqRtvvNH5pObBgwezBggAAHQIpgOQJMXGxio2NtZlbNy4cW5pCAAAwNMuKAB9/vnnWrdunSorK9XY2Ojy2sKFC93SGAAAgKeYDkDFxcW6+eabNXjwYFVUVGj48OH69NNPZRiGrrrqKk/0CAAA4Fam7wLLzs7WQw89pI8++kg2m01r167VoUOHlJiYqDvuuMMTPQIAALiV6QC0Z88epaV9923NXbp00TfffKMePXroscce05NPPun2BgEAANzNdADq3r27c91P3759deDAAedr1dXV7usMAADAQ0yvARozZozeffddXX755frZz36mBx98UB999JFee+01jRkzxhM9AgAAuJXpALRw4ULV1dVJkubOnau6ujqtXr1aERER3AEGAAA6BNMBaPDgwc6fu3fvroKCArc2BAAA4GkX9BwgSdqxY4f27NkjSRo2bFizByMCAAC0V6YD0Oeff64JEyZo69at6tWrlyTp5MmTSkhI0KpVqzRgwAB39wgAAOBWpu8C++1vf6vTp09rz549OnHihE6cOKE9e/bI4XDot7/9rSd6BAAAcCvTZ4DefvttlZSUaOjQoc6xoUOH6tlnn9W1117r1uYAAAA8wfQZoLCwMJ0+fbrZeFNTk/r16+eWpgAAADzJdABasGCBpkyZoh07djjHduzYoWnTpunPf/6zW5sDAADwhFZdArv44ovl4+Pj/L2+vl5xcXHq0uW73b/99lt16dJFv/nNb5SSkuKR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IQABAADLIQABAADLIQABAADLIQABAADLIQABAADLIQABAADLIQABAADLIQABAADLIQABAADLIQABAADLIQABAADLIQABAADLIQABAADLIQABAADLIQABAADLIQABAADLIQABAADLIQABAADLIQABAADLIQABAADLIQABAADLaRcBKD8/X+Hh4bLZbIqLi9P27dvPWb9mzRpFRkbKZrMpKipKGzZscHndMAzNnj1bffv2Vbdu3ZSUlKT9+/d78hAAAEAH4vUAtHr1amVmZmrOnDkqLy9XdHS0kpOTdfTo0RbrS0pKNGHCBGVkZGjnzp1KSUlRSkqKdu/e7ax56qmn9Mwzz6igoEDbtm1T9+7dlZycrFOnTrXVYQEAgHbM6wFo4cKFmjx5stLT0zVs2DAVFBTooosu0rJly1qsX7RokcaOHausrCxdfvnlmjdvnq666iotXrxY0ndnf/Ly8jRr1izdcsstGjFihFasWKEvvvhChYWFbXhkAACgverizTdvbGxUWVmZsrOznWO+vr5KSkpSaWlpi/uUlpYqMzPTZSw5OdkZbg4ePCi73a6kpCTn60FBQYqLi1NpaanGjx/fbM6GhgY1NDQ4f6+pqZEk1dbWXvCxtUZTwzcenR/oiDz9uWsrX51q8nYLQLvj6c/3mfkNwzhvrVcDUHV1tZqamhQSEuIyHhISooqKihb3sdvtLdbb7Xbn62fGzlbz33JycjR37txm42FhYa07EABuE/TsPd5uAYCn5AS1ydt89dVXCgo693t5NQC1F9nZ2S5nlRwOh06cOKHevXvLx8fHi52hLdTW1iosLEyHDh1SYGCgt9sB4EZ8vq3FMAx99dVX6tev33lrvRqAgoOD5efnp6qqKpfxqqoqhYaGtrhPaGjoOevP/GdVVZX69u3rUhMTE9PinAEBAQoICHAZ69Wrl5lDQScQGBjI/0ECnRSfb+s435mfM7y6CNrf31+xsbEqLi52jjkcDhUXFys+Pr7FfeLj413qJWnjxo3O+kGDBik0NNSlpra2Vtu2bTvrnAAAwFq8fgksMzNTkyZN0siRIzV69Gjl5eWpvr5e6enpkqS0tDT1799fOTk5kqRp06YpMTFRubm5GjdunFatWqUdO3ZoyZIlkiQfHx/df//9mj9/viIiIjRo0CA98sgj6tevn1JSUrx1mAAAoB3xegBKTU3VsWPHNHv2bNntdsXExKioqMi5iLmyslK+vt+fqEpISNDKlSs1a9YszZw5UxERESosLNTw4cOdNQ8//LDq6+t199136+TJk7rmmmtUVFQkm83W5seH9i8gIEBz5sxpdhkUQMfH5xtn42O05l4xAACATsTrD0IEAABoawQgAABgOQQgAABgOQQgAIDXbd26VVFRUeratavzjt2WxgB3IQChU/v000/l4+OjDz74wNutOLXHngBvy8zMVExMjA4ePKgXXnjhrGP/LTw8XHl5eW3WZ2u0x57QHAEIaKXTp097uwWg0zpw4ID+7//+TwMGDHA+ib+lMU9pbGz06PxohwygnTh16pQxZcoU40c/+pEREBBgXH311cb27dudr2/evNmQZGzatMmIjY01unXrZsTHxxsVFRVnnVOSy5aYmGgYhmFs377dSEpKMnr37m0EBgYa1113nVFWVtZs37/85S/G//t//8+46KKLjDlz5hiGYRjz5s0zfvSjHxk9evQwMjIyjOnTpxvR0dEu+z7//PNGZGSkERAQYAwdOtTIz88/b09AZ3Wuz/bBgwebfSb+9re/tTj23xITE5vVGYZhVFdXG+PHjzf69etndOvWzRg+fLixcuXKZvv+4Q9/MKZNm2b07t3buP766w3DMIy///3vxpAhQ4yAgADj+uuvN1544QVDkvHll186992yZYtxzTXXGDabzRgwYIAxZcoUo66u7pw9of3hfxm0G1OnTjX69etnbNiwwfj3v/9tTJo0ybj44ouN48ePG4bxfQCKi4sz3nrrLePf//63ce211xoJCQlnnXP79u3O0HTkyBHnXMXFxcaLL75o7Nmzx/jPf/5jZGRkGCEhIUZtba1zX0lGnz59jGXLlhkHDhwwPvvsM+Oll14ybDabsWzZMmPv3r3G3LlzjcDAQJcA9NJLLxl9+/Y11q5da3zyySfG2rVrjUsuucR44YUXztkT0Fmd67P97bffGkeOHDECAwONvLw848iRI0ZdXV2zsa+//rrZvMePHzcGDBhgPPbYY8aRI0eMI0eOGIZhGJ9//rmxYMECY+fOncaBAweMZ555xvDz8zO2bdvm3DcxMdHo0aOHkZWVZVRUVBgVFRXGJ598YnTt2tV46KGHjIqKCuOVV14x+vfv7xKAPv74Y6N79+7G008/bezbt8/YunWrceWVVxq//vWvz9kT2h8CENqFuro6o2vXrsbLL7/sHGtsbDT69etnPPXUU4ZhuJ4BOuPNN980JBnffPNNi/Oe+dflzp07z/n+TU1NRs+ePY033njDOSbJuP/++13q4uLijD/84Q8uY1dffbVLALrsssua/Wtz3rx5Rnx8vKmegM6gNZ9twzCMoKCgZmd5Whr7bwMHDjSefvrp8/Yxbtw448EHH3T+npiYaFx55ZUuNdOnTzeGDx/uMvbHP/7RJQBlZGQYd999t0vNli1bDF9fX+f/D7W2J3gXa4DQLhw4cECnT5/W1Vdf7Rzr2rWrRo8erT179rjUjhgxwvlz3759JUlHjx419X5VVVWaPHmyIiIiFBQUpMDAQNXV1amystKlbuTIkS6/7927V6NHj3YZ++Hv9fX1OnDggDIyMtSjRw/nNn/+fB04cMBUj0BnYOaz7S5NTU2aN2+eoqKidMkll6hHjx76xz/+0ezzHRsb6/L73r17NWrUKJex//68f/jhh3rhhRdcPt/JyclyOBw6ePCgR44HnuH17wIDzOratavzZx8fH0mSw+EwNcekSZN0/PhxLVq0SAMHDlRAQIDi4+ObLYTs3r27qXnr6uokSc8//7zi4uJcXvPz8zM1F4ALs2DBAi1atEh5eXmKiopS9+7ddf/99//Pn2/pu8/47373O02dOrXZa5deeukF94y2xxkgtAuXXXaZ/P39tXXrVufY6dOn9f7772vYsGEXPK+/v7+k7/5F+ENbt27V1KlT9bOf/UxXXHGFAgICVF1dfd75hg4dqvfff99l7Ie/h4SEqF+/fvrkk080ZMgQl23QoEHn7AnojDz12T7D39+/xc/3LbfcorvuukvR0dEaPHiw9u3bd965hg4dqh07driM/ffn/aqrrtJ//vOfZp/vIUOGOD/bLfWE9ocAhHahe/fuuvfee5WVlaWioiL95z//0eTJk/X1118rIyPjguft06ePunXrpqKiIlVVVammpkaSFBERoRdffFF79uzRtm3bNHHiRHXr1u28802ZMkVLly7V8uXLtX//fs2fP1+7du1ynomSpLlz5yonJ0fPPPOM9u3bp48++kh/+9vftHDhwnP2BHRGnvpsnxEeHq533nlHhw8fdv4jJiIiQhs3blRJSYn27Nmj3/3ud6qqqjrvXL/73e9UUVGh6dOna9++fXr11Vedzx868xmfPn26SkpKdN999+mDDz7Q/v379fe//1333XffOXtCO+TtRUjAGd98840xZcoUIzg4+Jy3wf/wdtSdO3cakoyDBw+edd7nn3/eCAsLM3x9fZ23nJeXlxsjR440bDabERERYaxZs6bZwkVJxuuvv95svscee8wIDg42evToYfzmN78xpk6daowZM8al5uWXXzZiYmIMf39/4+KLLzauu+4647XXXjtnT0Bndb7PtmFc+CLo0tJSY8SIEUZAQIDzlvPjx48bt9xyi9GjRw+jT58+xqxZs4y0tDTjlltuce6XmJhoTJs2rdl8/30b/HPPPdfsRovt27cbN954o9GjRw+je/fuxogRI4zHH3/8nD2h/fExDMPwZgADOrobb7xRoaGhevHFF73dCgA3e/zxx1VQUKBDhw55uxW4GYugARO+/vprFRQUKDk5WX5+fnrllVe0adMmbdy40dutAXCDv/zlLxo1apR69+6trVu3asGCBS6Xt9B5EIAAE3x8fLRhwwY9/vjjOnXqlIYOHaq1a9cqKSnJ260BcIMza/tOnDihSy+9VA8++KCys7O93RY8gEtgAADAcrgLDAAAWA4BCAAAWA4BCAAAWA4BCAAAWA4BCAAAWA4BCAAAWA4BCAAAWA4BCAAAWA4BCAAAWM7/BxuASmH1Xu/iAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_enrichment.by_regions(\n", + " mod_file_name=pileup_file,\n", + " regions_list=[ctcf_target_regions, ctcf_off_target_regions],\n", + " motif='A,0',\n", + " single_strand=False, # if set to True, regions that specify the strand will only pull from reads on the strand (as opposed to both strands)\n", + " sample_names=['on target', 'off target'],\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0.5, 1.0, 'dimelo/test/data/ctcf_demo_peak.bed')" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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+y9fvhw9e/ZE586dYW5ujpEjRyI5ORmDBw++by0JCQmwsbERX05OTn/jyIiIiKipM/ok6Ia2fPly/PLLL9iyZQuys7ORmJiIKVOmYOfOnfddJyYmBqWlpeLr8uXLjVgxERERNTajPQnazs4OpqamKCgo0GovKCiAg4ODznUcHBwe2P/mzZuYM2cOvv76awQGBgIA+vTpgyNHjuDDDz+sc/msloWFBSwsLP7uIREREVEzYbQRIHNzc3h7eyMzM1Ns02g0yMzMhK+vr851fH19tfoDwI4dO8T+t2/fxu3bt2Fion1Ypqam0Gg0DXwERERE1FwZ9bPAoqKiEBYWhr59+6J///5ISkpCRUUFwsPDAQChoaHo1KkTEhISAADTp0+Hv78/EhMTERgYiPXr1+Pw4cNITU0FAFhbW8Pf3x/R0dGwtLSEs7Mz9uzZgzVr1mDp0qVGO04iIiJqWowagIKDg1FYWIjY2Fio1Wp4eXkhIyNDnOicn5+vNZrj5+eHdevWYe7cuZgzZw7c3NyQnp6O3r17i33Wr1+PmJgYTJo0CcXFxXB2dsa7776L119/vdGPj4iIiJomhSAIgrGLaGrKyspgY2OD0tJSWFtbG2w//DR4orr4afBEVF9Sfn8/cneBERERET0MAxARERHJDgMQERERyQ4DEBEREckOAxARERHJDgMQERERyQ4DEBEREckOAxARERHJDgMQERERyQ4DEBEREckOAxARERHJDgMQERERyQ4DEBEREckOAxARERHJDgMQERERyQ4DEBEREckOAxARERHJDgMQERERyQ4DEBEREckOAxARERHJDgMQERERyQ4DEBEREckOAxARERHJDgMQERERyQ4DEBEREckOAxARERHJDgMQERERyQ4DEBEREckOAxARERHJDgMQERERyQ4DEBEREckOAxARERHJTpMIQMnJyXBxcYFSqYSPjw8OHjz4wP5paWlwd3eHUqmEh4cHtm/frrVcoVDofC1ZssSQh0FERETNhNED0IYNGxAVFYW4uDjk5OTA09MTKpUKN27c0Nl///79CAkJQUREBHJzcxEUFISgoCCcOHFC7HP9+nWt16pVq6BQKDB27NjGOiwiIiJqwhSCIAjGLMDHxwf9+vXDihUrAAAajQZOTk6IjIzE7Nmz6/QPDg5GRUUFtm7dKrYNGDAAXl5eSElJ0bmPoKAg/PHHH8jMzNSrprKyMtjY2KC0tBTW1tb1OCr9eEevMdi2iZqr7CWhxi6BiJopKb+/jToCVFVVhezsbAQEBIhtJiYmCAgIQFZWls51srKytPoDgEqlum//goICbNu2DREREfeto7KyEmVlZVovIiIienQZNQAVFRWhpqYG9vb2Wu329vZQq9U611Gr1ZL6r169Gq1bt8aYMWPuW0dCQgJsbGzEl5OTk8QjISIioubE6HOADG3VqlWYNGkSlErlffvExMSgtLRUfF2+fLkRKyQiIqLGZmbMndvZ2cHU1BQFBQVa7QUFBXBwcNC5joODg9799+7di9OnT2PDhg0PrMPCwgIWFhYSqyciIqLmyqgjQObm5vD29taanKzRaJCZmQlfX1+d6/j6+taZzLxjxw6d/VeuXAlvb294eno2bOFERETUrBl1BAgAoqKiEBYWhr59+6J///5ISkpCRUUFwsPDAQChoaHo1KkTEhISAADTp0+Hv78/EhMTERgYiPXr1+Pw4cNITU3V2m5ZWRnS0tKQmJjY6MdERERETZvRA1BwcDAKCwsRGxsLtVoNLy8vZGRkiBOd8/PzYWLy10CVn58f1q1bh7lz52LOnDlwc3NDeno6evfurbXd9evXQxAEhISENOrxEBERUdNn9OcANUV8DhCR8fA5QERUX83mOUBERERExsAARERERLLDAERERESywwBEREREssMARERERLLDAERERESywwBEREREssMARERERLLDAERERESywwBEREREssMARERERLLDAERERESywwBEREREssMARERERLLDAERERESywwBEREREssMARERERLLDAERERESywwBEREREssMARERERLLDAERERESywwBEREREssMARERERLLDAERERESywwBEREREssMARERERLLDAERERESywwBEREREssMARERERLLDAERERESyIzkArV69Gtu2bRO/fuutt9CmTRv4+fnh0qVLDVocERERkSFIDkDvvfceLC0tAQBZWVlITk7GBx98ADs7O8yYMaPBCyQiIiJqaJID0OXLl9GtWzcAQHp6OsaOHYvJkycjISEBe/fulVxAcnIyXFxcoFQq4ePjg4MHDz6wf1paGtzd3aFUKuHh4YHt27fX6XPy5EmMHj0aNjY2sLKyQr9+/ZCfny+5NiIiIno0SQ5ArVq1wm+//QYA+OGHHzB8+HAAgFKpxM2bNyVta8OGDYiKikJcXBxycnLg6ekJlUqFGzdu6Oy/f/9+hISEICIiArm5uQgKCkJQUBBOnDgh9jl37hyeeuopuLu748cff8SxY8cwb948KJVKqYdKREREjyiFIAiClBUmTZqEU6dO4YknnsBXX32F/Px82NraYsuWLZgzZ45WGHkYHx8f9OvXDytWrAAAaDQaODk5ITIyErNnz67TPzg4GBUVFdi6davYNmDAAHh5eSElJQUAMHHiRLRo0QJffPGFlMPSUlZWBhsbG5SWlsLa2rre23kY7+g1Bts2UXOVvSTU2CUQUTMl5fe35BGg5ORk+Pr6orCwEJs2bYKtrS0AIDs7GyEhIXpvp6qqCtnZ2QgICPirGBMTBAQEICsrS+c6WVlZWv0BQKVSif01Gg22bduGxx9/HCqVCh06dICPjw/S09MfWEtlZSXKysq0XkRERPToMpO6Qps2bcQRm7vFx8dL2k5RURFqampgb2+v1W5vb49Tp07pXEetVuvsr1arAQA3btxAeXk53n//fSxatAiLFy9GRkYGxowZg927d8Pf31/ndhMSEiTXT0RERM1XvZ4DtHfvXrz44ovw8/PD1atXAQBffPEF9u3b16DFSaXRaAAAzz33HGbMmAEvLy/Mnj0bzzzzjHiJTJeYmBiUlpaKr8uXLzdWyURERGQEkgPQpk2boFKpYGlpiZycHFRWVgIASktL8d577+m9HTs7O5iamqKgoECrvaCgAA4ODjrXcXBweGB/Ozs7mJmZoWfPnlp9evTo8cC7wCwsLGBtba31IiIiokeX5AC0aNEipKSk4LPPPkOLFi3E9oEDByInJ0fv7Zibm8Pb2xuZmZlim0ajQWZmJnx9fXWu4+vrq9UfAHbs2CH2Nzc3R79+/XD69GmtPmfOnIGzs7PetREREdGjTfIcoNOnT2Pw4MF12m1sbFBSUiJpW1FRUQgLC0Pfvn3Rv39/JCUloaKiAuHh4QCA0NBQdOrUCQkJCQCA6dOnw9/fH4mJiQgMDMT69etx+PBhpKamituMjo5GcHAwBg8ejKFDhyIjIwPffvstfvzxR6mHSkRERI8oyQHIwcEBZ8+ehYuLi1b7vn370KVLF0nbCg4ORmFhIWJjY6FWq+Hl5YWMjAxxonN+fj5MTP4apPLz88O6deswd+5czJkzB25ubkhPT0fv3r3FPs8//zxSUlKQkJCAadOmoXv37ti0aROeeuopqYdKREREjyjJzwFKSEjAl19+iVWrVmH48OHYvn07Ll26hBkzZmDevHmIjIw0VK2Nhs8BIjIePgeIiOpLyu9vySNAs2fPhkajwbBhw/Dnn39i8ODBsLCwwKxZsx6J8ENERESPPskBSKFQ4J133kF0dDTOnj2L8vJy9OzZE61atTJEfUREREQNrl7PAQLu3HHVs2dPuLu7Y+fOnTh58mRD1kVERERkMJID0IQJE8QnQd+8eRP9+vXDhAkT0KdPH2zatKnBCyQiIiJqaJID0E8//YRBgwYBAL7++mtoNBqUlJTg448/xqJFixq8QCIiIqKGJjkAlZaWol27dgCAjIwMjB07Fi1btkRgYCDy8vIavEAiIiKihiY5ADk5OSErKwsVFRXIyMjAiBEjAAC///47lEplgxdIRERE1NAk3wX25ptvYtKkSWjVqhWcnZ0xZMgQAHcujXl4eDR0fUREREQNTnIAeuONN+Dj44P8/HwMHz5cfFJzly5dOAeIiIiImgXJAQgAvL294e3trdUWGBjYIAURERERGVq9AtCVK1ewZcsW5Ofno6qqSmvZ0qVLG6QwIiIiIkORHIAyMzMxevRodOnSBadOnULv3r1x8eJFCIKAJ5980hA1EhERETUoyXeBxcTEYNasWTh+/DiUSiU2bdqEy5cvw9/fH+PHjzdEjUREREQNSnIAOnnyJEJD73xas5mZGW7evIlWrVphwYIFWLx4cYMXSERERNTQJAcgKysrcd5Px44dce7cOXFZUVFRw1VGREREZCCS5wANGDAA+/btQ48ePTBq1CjMnDkTx48fx+bNmzFgwABD1EhERETUoCQHoKVLl6K8vBwAEB8fj/LycmzYsAFubm68A4yIiIiaBckBqEuXLuK/rayskJKS0qAFERERERlavZ4DBACHDx/GyZMnAQA9e/as82BEIiIioqZKcgC6cuUKQkJC8PPPP6NNmzYAgJKSEvj5+WH9+vXo3LlzQ9dIRERE1KAk3wX2yiuv4Pbt2zh58iSKi4tRXFyMkydPQqPR4JVXXjFEjUREREQNSvII0J49e7B//350795dbOvevTuWL1+OQYMGNWhxRERERIYgeQTIyckJt2/frtNeU1MDR0fHBimKiIiIyJAkB6AlS5YgMjIShw8fFtsO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CgX69u0LU1NTnX3Pnz/foAUSERERNTS9AlBqairGjBmDs2fPYtq0aXj11VfRunVrQ9dGREREZBB63wU2cuRIAEB2djamT5/OAERERETNluTb4P/73/8aog4iIiKiRiP5SdBEREREzR0DEBEREckOAxARERHJDgMQERERyQ4DEBEREckOAxARERHJDgMQERERyQ4DEBEREckOAxARERHJDgMQERERyU6TCEDJyclwcXGBUqmEj48PDh48+MD+aWlpcHd3h1KphIeHB7Zv3y4uu337Nt5++214eHjAysoKjo6OCA0NxbVr1wx9GERERNRMGD0AbdiwAVFRUYiLi0NOTg48PT2hUqlw48YNnf3379+PkJAQREREIDc3F0FBQQgKCsKJEycAAH/++SdycnIwb9485OTkYPPmzTh9+jRGjx7dmIdFRERETZhCEATBmAX4+PigX79+WLFiBQBAo9HAyckJkZGRmD17dp3+wcHBqKiowNatW8W2AQMGwMvLCykpKTr3cejQIfTv3x+XLl3CY4899tCaysrKYGNjg9LSUlhbW9fzyB7OO3qNwbZN1FxlLwk1dglE1ExJ+f1t1BGgqqoqZGdnIyAgQGwzMTFBQEAAsrKydK6TlZWl1R8AVCrVffsDQGlpKRQKBdq0aaNzeWVlJcrKyrReRERE9OgyagAqKipCTU0N7O3ttdrt7e2hVqt1rqNWqyX1v3XrFt5++22EhITcNw0mJCTAxsZGfDk5OdXjaIiIiKi5MPocIEO6ffs2JkyYAEEQ8Omnn963X0xMDEpLS8XX5cuXG7FKIiIiamxmxty5nZ0dTE1NUVBQoNVeUFAABwcHnes4ODjo1b82/Fy6dAm7du164LVACwsLWFhY1PMoiIiIqLkx6giQubk5vL29kZmZKbZpNBpkZmbC19dX5zq+vr5a/QFgx44dWv1rw09eXh527twJW1tbwxwAERERNUtGHQECgKioKISFhaFv377o378/kpKSUFFRgfDwcABAaGgoOnXqhISEBADA9OnT4e/vj8TERAQGBmL9+vU4fPgwUlNTAdwJP+PGjUNOTg62bt2KmpoacX5Qu3btYG5ubpwDJSIioibD6AEoODgYhYWFiI2NhVqthpeXFzIyMsSJzvn5+TAx+Wugys/PD+vWrcPcuXMxZ84cuLm5IT09Hb179wYAXL16FVu2bAEAeHl5ae1r9+7dGDJkSKMcFxERETVdRn8OUFPE5wARGQ+fA0RE9dVsngNEREREZAwMQERERCQ7DEBEREQkOwxAREREJDsMQERERCQ7DEBEREQkOwxAREREJDsMQERERCQ7DEBEREQkOwxAREREJDsMQERERCQ7DEBEREQkOwxAREREJDsMQERERCQ7DEBEREQkOwxAREREJDsMQERERCQ7DEBEREQkOwxAREREJDsMQERERCQ7DEBEREQkOwxAREREJDsMQERERCQ7DEBEREQkOwxAREREJDsMQERERCQ7DEBEREQkOwxAREREJDsMQERERCQ7DEBEREQkOwxAREREJDsMQERERCQ7Rg9AycnJcHFxgVKphI+PDw4ePPjA/mlpaXB3d4dSqYSHhwe2b9+utXzz5s0YMWIEbG1toVAocOTIEQNWT0RERM2RUQPQhg0bEBUVhbi4OOTk5MDT0xMqlQo3btzQ2X///v0ICQlBREQEcnNzERQUhKCgIJw4cULsU1FRgaeeegqLFy9urMMgIiKiZkYhCIJgrJ37+PigX79+WLFiBQBAo9HAyckJkZGRmD17dp3+wcHBqKiowNatW8W2AQMGwMvLCykpKVp9L168CFdXV+Tm5sLLy0tSXWVlZbCxsUFpaSmsra2lH5ievKPXGGzbRM1V9pJQY5dARM2UlN/fRhsBqqqqQnZ2NgICAv4qxsQEAQEByMrK0rlOVlaWVn8AUKlU9+2vr8rKSpSVlWm9iIiI6NFltABUVFSEmpoa2Nvba7Xb29tDrVbrXEetVkvqr6+EhATY2NiILycnp7+1PSIiImrajD4JuimIiYlBaWmp+Lp8+bKxSyIiIiIDMjPWju3s7GBqaoqCggKt9oKCAjg4OOhcx8HBQVJ/fVlYWMDCwuJvbYOIiIiaD6ONAJmbm8Pb2xuZmZlim0ajQWZmJnx9fXWu4+vrq9UfAHbs2HHf/kRERES6GG0ECACioqIQFhaGvn37on///khKSkJFRQXCw8MBAKGhoejUqRMSEhIAANOnT4e/vz8SExMRGBiI9evX4/Dhw0hNTRW3WVxcjPz8fFy7dg0AcPr0aQB3Ro/+7kgRERERPRqMGoCCg4NRWFiI2NhYqNVqeHl5ISMjQ5zonJ+fDxOTvwap/Pz8sG7dOsydOxdz5syBm5sb0tPT0bt3b7HPli1bxAAFABMnTgQAxMXFYf78+Y1zYERERNSkGfU5QE0VnwNEZDx8DhAR1VezeA4QERERkbEwABEREZHsMAARERGR7DAAERERkewwABEREZHsMAARERGR7DAAERERkewwABEREZHsMAARERGR7DAAERERkewwABEREZHsMAARERGR7DAAERERkewwABEREZHsMAARERGR7DAAERERkewwABEREZHsMAARERGR7DAAERERkewwABEREZHsMAARERGR7DAAERERkewwABEREZHsMAARERGR7DAAERERkewwABEREZHsMAARERGR7DAAERERkeyYGbsAIqJHUf4CD2OXQNTkPBZ73NgliDgCRERERLLDAERERESywwBEREREstMkAlBycjJcXFygVCrh4+ODgwcPPrB/Wloa3N3doVQq4eHhge3bt2stFwQBsbGx6NixIywtLREQEIC8vDxDHgIRERE1I0YPQBs2bEBUVBTi4uKQk5MDT09PqFQq3LhxQ2f//fv3IyQkBBEREcjNzUVQUBCCgoJw4sQJsc8HH3yAjz/+GCkpKThw4ACsrKygUqlw69atxjosIiIiasKMHoCWLl2KV199FeHh4ejZsydSUlLQsmVLrFq1Smf/ZcuWYeTIkYiOjkaPHj2wcOFCPPnkk1ixYgWAO6M/SUlJmDt3Lp577jn06dMHa9aswbVr15Cent6IR0ZERERNlVFvg6+qqkJ2djZiYmLENhMTEwQEBCArK0vnOllZWYiKitJqU6lUYri5cOEC1Go1AgICxOU2Njbw8fFBVlYWJk6cWGeblZWVqKysFL8uLS0FAJSVldX72PRRU3nToNsnao4M/b5rLH/cqjF2CURNjqHf37XbFwThoX2NGoCKiopQU1MDe3t7rXZ7e3ucOnVK5zpqtVpnf7VaLS6vbbtfn3slJCQgPj6+TruTk5N+B0JEDcZm+evGLoGIDCXBplF288cff8DG5sH74oMQAcTExGiNKmk0GhQXF8PW1hYKhcKIlVFjKCsrg5OTEy5fvgxra2tjl0NEDYjvb3kRBAF//PEHHB0dH9rXqAHIzs4OpqamKCgo0GovKCiAg4ODznUcHBwe2L/2vwUFBejYsaNWHy8vL53btLCwgIWFhVZbmzZtpBwKPQKsra35A5LoEcX3t3w8bOSnllEnQZubm8Pb2xuZmZlim0ajQWZmJnx9fXWu4+vrq9UfAHbs2CH2d3V1hYODg1afsrIyHDhw4L7bJCIiInkx+iWwqKgohIWFoW/fvujfvz+SkpJQUVGB8PBwAEBoaCg6deqEhIQEAMD06dPh7++PxMREBAYGYv369Th8+DBSU1MBAAqFAm+++SYWLVoENzc3uLq6Yt68eXB0dERQUJCxDpOIiIiaEKMHoODgYBQWFiI2NhZqtRpeXl7IyMgQJzHn5+fDxOSvgSo/Pz+sW7cOc+fOxZw5c+Dm5ob09HT07t1b7PPWW2+hoqICkydPRklJCZ566ilkZGRAqVQ2+vFR02dhYYG4uLg6l0GJqPnj+5vuRyHoc68YERER0SPE6A9CJCIiImpsDEBEREQkOwxAREREJDsMQERERCQ7DEBEREQkOwxAJAtZWVkwNTVFYGDgQ/sKgoDY2Fh07NgRlpaWCAgIQF5eXiNUSUQPolarERkZiS5dusDCwgJOTk549tlntR58m5ubi+DgYHTs2BEWFhZwdnbGM888g2+//faBH5DJ9738MACRLKxcuRKRkZH46aefcO3atQf2/eCDD/Dxxx8jJSUFBw4cgJWVFVQqFW7dutVI1RLRvS5evAhvb2/s2rULS5YswfHjx5GRkYGhQ4diypQpAIBvvvkGAwYMQHl5OVavXo2TJ08iIyMDzz//PObOnYvS0tL7bp/ve/nhc4DokVdeXo6OHTvi8OHDiIuLQ58+fTBnzhydfQVBgKOjI2bOnIlZs2YBAEpLS2Fvb4/PP/8cEydObMzSiej/GzVqFI4dO4bTp0/DyspKa1lJSQlatGgBZ2dnDB48GJs3b9a5DUEQdH7ANd/38sQRIHrkbdy4Ee7u7ujevTtefPFFrFq16r5D4RcuXIBarUZAQIDYZmNjAx8fH2RlZTVWyUR0l+LiYmRkZGDKlCl1wg9w58Orf/jhB/z2229466237rsdXeEH4PterhiA6JG3cuVKvPjiiwCAkSNHorS0FHv27NHZV61WA4D4USy17O3txWVE1LjOnj0LQRDg7u5+3z5nzpwBAHTv3l1sO3ToEFq1aiW+tm7dqnNdvu/liQGIHmmnT5/GwYMHERISAgAwMzNDcHAwVq5caeTKiEhf9Z2p0adPHxw5cgRHjhxBRUUFqqurG7gyas4YgOiRtnLlSlRXV8PR0RFmZmYwMzPDp59+ik2bNumcEOng4AAAKCgo0GovKCgQlxFR43Jzc4NCocCpU6ce2Ae480dPLQsLC3Tr1g3dunV74Pb5vpcnBiB6ZFVXV2PNmjVITEwU/wo8cuQIjh49CkdHR3z11Vd11nF1dYWDg4PWbbVlZWU4cOAAfH19G7N8Ivr/2rVrB5VKheTkZFRUVNRZXlJSghEjRqBdu3ZYvHix5O3zfS9PZsYugMhQtm7dit9//x0RERGwsbHRWjZ27FisXLkSr7/+ula7QqHAm2++iUWLFsHNzQ2urq6YN28eHB0dERQU1IjVE9HdkpOTMXDgQPTv3x8LFixAnz59UF1djR07duDTTz/FyZMn8Z///AfBwcEIDAzEtGnT4ObmhvLycmRkZAAATE1NdW6b73uZEogeUc8884wwatQoncsOHDggABCOHj0qODs7C3FxceIyjUYjzJs3T7C3txcsLCyEYcOGCadPn26kqonofq5duyZMmTJFcHZ2FszNzYVOnToJo0ePFnbv3i32OXTokDBu3DihQ4cOgpmZmWBrayuoVCph/fr1gkajEfvxfU98DhDJ2p9//glbW1t89913GDJkiLHLIaJGwPc9AZwDRDK3e/du/OMf/+APQSIZ4fueAD4JmoiIiGSII0BEREQkOwxAREREJDsMQERERCQ7DEBEREQkOwxAREREJDsMQERERCQ7DEBEREQkOwxAREREJDsMQERERCQ7/w9n902DHEIM4wAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_enrichment.by_modification(\n", + " mod_file_name=pileup_file,\n", + " regions=ctcf_target_regions,\n", + " motifs=['A,0','CG,0'],\n", + " single_strand=False, # if set to True, regions that specify the strand will only pull from reads on the strand (as opposed to both strands)\n", + " )\n", + "plt.title(ctcf_target_regions)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0.5, 1.0, 'dimelo/test/data/ctcf_demo_not_peak.bed')" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkAAAAGzCAYAAADHdKgcAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAABFg0lEQVR4nO3deVxU9f7H8fcAsoSKO7gQ4nI1E7VQEdSwIintelFT9FYaWt3KndS0Epcs2vRaanEtLcu6LmlerxmlaItJmqKp5Z65BkoKJCoIc35/+GOuI2iMzoB6Xs/Hg4fM93zPOZ8zzMib7/meMxbDMAwBAACYiFt5FwAAAFDWCEAAAMB0CEAAAMB0CEAAAMB0CEAAAMB0CEAAAMB0CEAAAMB0CEAAAMB0CEAAAMB0CEBwmQkTJshisdge169fX4888ki51NKpUyd16tSpXPZ9LSjP5748ZWRk6IEHHlD16tVlsVg0bdq0q9qexWLRhAkTnFIbytevv/4qi8Wi119/vUzXddT7778vi8WiX3/91eX7MhsCEFBKTz/9tJo1ayZJWrdunSZMmKCsrCyX7vOll17S0qVLL7ncarWqZs2aevXVV12y/6NHj2rChAnasmXLVW/r5MmT8vDw0MKFC0u9zltvvaX333//ivc5YsQIffHFFxo7dqw+/PBD3XvvvVe8LVza1f6cgPJAAEKZ2bVrl955553yLuOKffbZZ+ratauk8wFo4sSJ5R6ANmzYoMzMTFtdznb06FFNnDjRKQHoiy++kMViUefOnUu9ztX+Yl29erX+9re/aeTIkXrooYfUtGnTK94WLo0AhOsRAQhlxsvLSxUqVCjvMq7IL7/8ol27drksaFypFStWKCgoSLfeemt5l/KnVqxYofbt26tKlSplts9jx46V6f4AXD8IQHCKtWvXqk2bNvL29lbDhg31r3/9q1ifi+ehFJ3bXrt2rYYOHaqaNWuqSpUq+sc//qH8/HxlZWWpX79+qlq1qqpWrarRo0fLMAy7bVqtVk2bNk233nqrvL295e/vr3/84x86efLkn9Z87NgxDRw4UP7+/vL29lbLli01d+7cEvt+9tln8vPzU4cOHTRhwgSNGjVKkhQcHCyLxVLsHP28efMUGhoqHx8fVatWTX369NGhQ4fstrlnzx717NlTAQEB8vb2Vr169dSnTx9lZ2dLOj/fJDc3V3PnzrXt4+J5PBeOSkmSYRiaPHmy6tWrp5tuukl33nmnfvrpp2LHc+LECY0cOVIhISGqWLGiKleurPvuu08//vijrc9XX32lNm3aSJLi4uJsNRT9pf/tt9+qV69euvnmm+Xl5aXAwECNGDFCZ86cKbY/q9Wq5OTkYgFy3rx5atu2rW666SZVrVpVd9xxh7788ktJ518vP/30k77++mvbvi+cx5WVlaURI0aofv368vLyUr169dSvXz9lZmbaXluGYWjmzJm29UsrLy9PI0aMUM2aNVWpUiV169ZNhw8fLrHvkSNHNGDAAPn7+8vLy0u33nqr5syZY9fnq6++ksVi0cKFCzVx4kTVrVtXlSpV0gMPPKDs7Gzl5eVp+PDhqlWrlipWrKi4uDjl5eXZbaOgoEAvvPCCGjZsKC8vL9WvX1/PPvtssX5/pmhu3t69e/XII4+oSpUq8vPzU1xcnE6fPu3wPv/s5/RnLBaLBg8erI8++khNmjSRt7e3QkND9c033xTrW5rnOj8/XwkJCQoNDZWfn598fX3VsWNHrVmz5k9rMQxDjz/+uDw9PbVkyZJS1f/Pf/5TQUFB8vHxUWRkpLZv316sz86dO/XAAw+oWrVq8vb2VuvWrbVs2bJi/X766Sfddddd8vHxUb169TR58mRZrdZS1QHHeZR3Abj+bdu2TZ07d1bNmjU1YcIEFRQUaPz48fL39y/V+kOGDFFAQIAmTpyo77//XrNmzVKVKlW0bt063XzzzXrppZe0YsUKvfbaa2revLn69etnW/cf//iH3n//fcXFxWno0KHav3+/ZsyYoc2bN+u777675IjTmTNn1KlTJ+3du1eDBw9WcHCwFi1apEceeURZWVkaNmyYXf8VK1bonnvukYeHh3r06KHdu3fr3//+t/75z3+qRo0akqSaNWtKkl588UWNGzdOvXv31qOPPqrjx49r+vTpuuOOO7R582ZVqVJF+fn5io6OVl5enu34jxw5ouXLlysrK0t+fn768MMP9eijj6pt27Z6/PHHJUkNGza01ZSenq7Nmzdr0qRJtraEhARNnjxZXbp0UZcuXZSWlqbOnTsrPz/f7nh++eUXLV26VL169VJwcLAyMjL0r3/9S5GRkfr5559Vp04d3XLLLZo0aZISEhL0+OOPq2PHjpKkiIgISdKiRYt0+vRpPfnkk6pevbo2bNig6dOn6/Dhw1q0aJHd/n744QcdP35cXbp0sbVNnDhREyZMUEREhCZNmiRPT0+tX79eq1evVufOnTVt2jQNGTJEFStW1HPPPSdJttfUqVOn1LFjR+3YsUMDBgzQ7bffrszMTC1btkyHDx/WHXfcoQ8//FAPP/yw7rnnHrvXTGk8+uijmjdvnv7+978rIiJCq1evLnH0LyMjQ+3atbP9Eq9Zs6Y+//xzDRw4UDk5ORo+fLhd/8TERPn4+GjMmDHau3evpk+frgoVKsjNzU0nT57UhAkT9P333+v9999XcHCwEhIS7GqaO3euHnjgAT399NNav369EhMTtWPHDn366acOHZ8k9e7dW8HBwUpMTFRaWpreffdd1apVS6+88opD+7zcz6m0vv76ay1YsEBDhw6Vl5eX3nrrLd17773asGGDmjdv7tBznZOTo3fffVd9+/bVY489pj/++EOzZ89WdHS0NmzYoFatWpVYQ2FhoQYMGKAFCxbo008/LdVo7wcffKA//vhDgwYN0tmzZ/XGG2/orrvu0rZt22zPwU8//aT27durbt26GjNmjHx9fbVw4ULFxMRo8eLF6t69u6Tz7+c777xTBQUFtn6zZs2Sj4+PQ88lHGAAVykmJsbw9vY2Dhw4YGv7+eefDXd3d+PCl1hQUJDRv39/2+P33nvPkGRER0cbVqvV1h4eHm5YLBbjiSeesLUVFBQY9erVMyIjI21t3377rSHJ+Oijj+zqSU5OLtYeGRlpt+60adMMSca8efNsbfn5+UZ4eLhRsWJFIycnx9aem5treHt7G++9956t7bXXXjMkGfv377fb96+//mq4u7sbL774ol37tm3bDA8PD1v75s2bDUnGokWLjMvx9fW1e84uNHv2bMPHx8c4ffq0YRiGcezYMcPT09Po2rWr3fP57LPPGpLstnP27FmjsLDQbnv79+83vLy8jEmTJtnafvjhB0OS3bEXKdrvhRITEw2LxWL3WjAMwxg3bpwRFBRke7xnzx7Dzc3N6N69e7E6Lqz91ltvtfu5FUlISDAkGUuWLCm27ML1JRmDBg0q1udytmzZYkgynnrqKbv2v//974YkY/z48ba2gQMHGrVr1zYyMzPt+vbp08fw8/OzPUdr1qwxJBnNmzc38vPzbf369u1rWCwW47777rNbPzw83O75Kqrp0Ucftes3cuRIQ5KxevXqUh/f+PHjDUnGgAED7Nq7d+9uVK9e/Yr2eamfU2lIMiQZGzdutLUdOHDA8Pb2Nrp3725rK+1zXVBQYOTl5dn1OXnypOHv7293zPv37zckGa+99ppx7tw5IzY21vDx8TG++OKLP625aF0fHx/j8OHDtvb169cbkowRI0bY2u6++24jJCTEOHv2rK3NarUaERERRuPGjW1tw4cPNyQZ69evt7UdO3bM8PPzK/H/Glw9ToHhqhQWFuqLL75QTEyMbr75Zlv7Lbfcoujo6FJtY+DAgXanJ8LCwmQYhgYOHGhrc3d3V+vWrfXLL7/Y2hYtWiQ/Pz/dc889yszMtH2FhoaqYsWKlx3yXrFihQICAtS3b19bW4UKFTR06FCdOnVKX3/9ta199erVysvL03333fenx7JkyRJZrVb17t3brqaAgAA1btzYVpOfn5+k8xODLz7tUForVqzQnXfeafsLcdWqVcrPz9eQIUPsns+LRyGk8/Ox3NzOv/0LCwv1+++/q2LFimrSpInS0tJKtf8L/zLNzc1VZmamIiIiZBiGNm/eXKzWC/+iXrp0qaxWqxISEmx1FCnNqarFixerZcuWtr+eHV3/clasWCFJGjp0qF37xc+jYRhavHix/vrXv8owDLufd3R0tLKzs4s9l/369bMblSx6rQ8YMMCuX1hYmA4dOqSCggK7muLj4+36Pf3005LOnwp11BNPPGH3uGPHjvr999+Vk5Pjsn1eSnh4uEJDQ22Pb775Zv3tb3/TF198ocLCQoeea3d3d3l6eko6f+r1xIkTKigoUOvWrUt8befn56tXr15avny5VqxY4dAk/ZiYGNWtW9f2uG3btgoLC7M9dydOnNDq1avVu3dv/fHHH7aaf//9d0VHR2vPnj06cuSIpPPPd7t27dS2bVvb9mrWrKkHH3zQgWcSjuAUGK7K8ePHdebMGTVu3LjYsiZNmtj+I7icC4OT9L9wEBgYWKz9wrk9e/bsUXZ2tmrVqlXido8dO3bJfR44cECNGzcu9sv3lltusS0v8tlnn6l169alGtbfs2ePDMMo8fmQZPvlFxwcrPj4eE2dOlUfffSROnbsqG7duumhhx6yHf/lnDt3TitXrlRiYqLdMUkqtu+aNWuqatWqdm1Wq1VvvPGG3nrrLe3fv1+FhYW2ZdWrV//T/UvSwYMHlZCQoGXLlhWbc1U0j0k6P7SflpZmd6pu3759cnNzs91WwFH79u1Tz549r2jdP3PgwAG5ubnZnW6Uzr+eL3T8+HFlZWVp1qxZmjVrVonbuvg16Mhr3Wq1Kjs7W9WrV7fV1KhRI7t+AQEBqlKlit3rtbQurqXoNXLy5ElVrlzZJfu8lJLeL3/5y190+vRpHT9+XG5ubg4913PnztWUKVO0c+dOnTt3ztYeHBxcbL3ExESdOnVKn3/+ucP3CrtU3UW3eti7d68Mw9C4ceM0bty4S9Zdt25dHThwQGFhYcWWX/y6g/MQgFDu3N3dS91uXDAJ2mq1qlatWvroo49KXL9oTs7VWrFiheLi4krV12q1ymKx6PPPPy+x/ooVK9q+nzJlih555BH95z//0ZdffqmhQ4cqMTFR33//verVq3fZ/axdu1Y5OTl2c2oc8dJLL2ncuHEaMGCAXnjhBVWrVk1ubm4aPnx4qSZdFhYW6p577tGJEyf0zDPPqGnTpvL19dWRI0f0yCOP2G3j888/l7e3t+68884rqvVaVXSMDz30kPr3719inxYtWtg9duS1LqnYpP+rHd0q731eKUee63nz5umRRx5RTEyMRo0apVq1asnd3V2JiYnat29fsfWio6OVnJysV199VZ06dZK3t7fT6x45cuQlR8QvDpgoOwQgXJWaNWvKx8dHe/bsKbZs165dLt13w4YNtWrVKrVv397hiYJBQUHaunWrrFar3SjQzp07bcslafv27Tp48GCxCZGX+qXQsGFDGYah4OBg/eUvf/nTOkJCQhQSEqLnn39e69atU/v27ZWUlKTJkydfdj+fffaZmjVrpvr169sdk3R+FKpBgwa29uPHjxcbofnkk0905513avbs2XbtWVlZtkndl9v/tm3btHv3bs2dO9dugvHKlStLrPXCU3XS+efJarXq559/vuSk1Mvtv2HDhiVebeMMQUFBslqt2rdvn91f3xe/nouuECssLFRUVJRLarm4pj179thGKaXzE4OzsrJsP/vy2ufVhqSS/v/YvXu3brrpJtsfMqV9rj/55BM1aNBAS5Yssatr/PjxJfZv166dnnjiCd1///3q1auXPv30U3l4lO5X46XqLnpfFr0PK1So8Kd1BwUFlcv/o2bGHCBcFXd3d0VHR2vp0qU6ePCgrX3Hjh364osvXLrv3r17q7CwUC+88EKxZQUFBZe9SWGXLl2U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MTFKT09XrVq1LjuSYrFYSrxCrKwUfRr93/72N40YMUKS1KpVK61bt05JSUmXDEBjx461G1nKyclRYGCg6wsGAADlolQBqChYXPz91ahRo4bc3d2VkZFh156RkaGAgIAS1wkICLhs/xo1asjDw0PNmjWz63PLLbdo7dq1l6zFy8tLXl5eV3IYAADgOlSqq8CqVaumzMxMSdKAAQP0xx9/XPWOPT09FRoaanf3aKvVqpSUFIWHh5e4Tnh4eLG7Ta9cudLW39PTU23atNGuXbvs+uzevVtBQUFXXTMAALgxlCoA5efn2yYGz507V2fPnnXKzuPj4/XOO+9o7ty52rFjh5588knl5uYqLi5OktSvXz+7SdLDhg1TcnKypkyZop07d2rChAnauHGjBg8ebOszatQoLViwQO+884727t2rGTNm6L///a+eeuopp9QMAACuf6U6BRYeHq6YmBiFhobKMAwNHTr0kpe8z5kzp9Q7j42N1fHjx5WQkKD09HS1atVKycnJtonOBw8elJvb/zJaRESEPv74Yz3//PN69tln1bhxYy1dulTNmze39enevbuSkpKUmJiooUOHqkmTJlq8eLE6dOhQ6roAAMCNrVT3AcrIyNA///lP7du3T0uWLFF0dPQl58x8+umnTi+yrHEfIABXi/sAAcVdd/cB8vf318svvyxJCg4O1ocffqjq1atffaUAAADlwOEbIe7fv98VdQAAAJSZUgWgN998U48//ri8vb315ptvXrbv0KFDnVIYAACAq5RqDlBwcLA2btyo6tWrKzg4+NIbs1j0yy+/OLXA8sAcIABXizlAQHHX3RygC097cQoMAABc70p1HyAAAIAbSalGgC7+BPbLmTp16hUXAwAAUBZKFYA2b95s9zgtLU0FBQVq0qSJpPMfNeHu7q7Q0FDnVwgAAOBkpQpAa9assX0/depUVapUSXPnzlXVqlUlSSdPnlRcXJw6duzomioBAACcyOE5QFOmTFFiYqIt/EhS1apVNXnyZE2ZMsWpxQEAALiCwwEoJydHx48fL9Z+/Phxp3xKPAAAgKs5HIC6d++uuLg4LVmyRIcPH9bhw4e1ePFiDRw4UD169HBFjQAAAE7l8EdhJCUlaeTIkfr73/+uc+fOnd+Ih4cGDhyo1157zekFAgAAOJvDAeimm27SW2+9pddee0379u2TJDVs2FC+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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_enrichment.by_modification(\n", + " mod_file_name=pileup_file,\n", + " regions=ctcf_off_target_regions,\n", + " motifs=['A,0','CG,0'],\n", + " single_strand=False, # if set to True, regions that specify the strand will only pull from reads on the strand (as opposed to both strands)\n", + " )\n", + "plt.title(ctcf_off_target_regions)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Plot Reads" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "from dimelo import plot_reads" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0.5, 1.0, \"CTCF target data, 100 known binding locations\\nsort_by=['shuffle'] i.e. default\")" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlYAAAHcCAYAAAAUZuQ8AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAADtFUlEQVR4nOx9d7gURfb2O6QLEi6iXIIiWYKIAYzIgoqiAuYEKEHXiO7qKoafa1wjrGvaT4yLYcE157yga4BFcAEDwQBiBBTkknN/f0CP1TUVTlVX9/Rc6n2eeWam+9SpU6GrTp1zqjoXBEEADw8PDw8PDw+P2KhWbAE8PDw8PDw8PKoKvGLl4eHh4eHh4eEIXrHy8PDw8PDw8HAEr1h5eHh4eHh4eDiCV6w8PDw8PDw8PBzBK1YeHh4eHh4eHo7gFSsPDw8PDw8PD0fwipWHh4eHh4eHhyN4xcrDw8PDw8PDwxG8YuXhUYLo3bs3evfuXWwxShK5XA4XXHBBscVIBe+++y5yuRyeeeYZLe2wYcPQqlUrp/mLeOZyOVx33XVO86Hgm2++QS6XwyOPPJJ63lQk0QYe6cMrVh55fP311zjnnHPQpk0b1K5dGw0aNECPHj1w1113Yc2aNbjuuuuQy+W0H3bCf/fdd3H88cejadOmqFWrFioqKjBgwAA899xzeZpwwBN99t9/f6XMkyZNwnXXXYdly5YlVCtuUWx5V69ejeuuuw7vvvtuKvl99NFHOP/889GtWzfUrFkTuVxOSf/www+jU6dOqF27Ntq3b4977rlHSPfDDz/g5JNPRsOGDdGgQQMcc8wxmDdvXhJF8PBwih9//BHXXXcdZsyYUWxRPBJCjWIL4JENvPrqqzjppJNQVlaGIUOGoEuXLli/fj0++OADjBw5Ep9//jkuuOACtGvXLp9m5cqVOO+883Dcccfh+OOPz19v0qQJAODaa6/FDTfcgPbt2+Occ85By5YtsWTJErz22ms44YQTMG7cOAwaNCifbuDAgTjqqKMicjVu3Fgp96RJk3D99ddj2LBhaNiwoYOaSBbFlnf16tW4/vrrASAVi9drr72Ghx56CF27dkWbNm3wxRdfSGnvv/9+nHvuuTjhhBPwpz/9Ce+//z7+8Ic/YPXq1bj88svzdCtXrsTBBx+MyspK/N///R9q1qyJO+64A7169cKMGTOwww47JF6uqogHH3wQmzdvTjyfNWvWoEaNbXfq+fHHH3H99dejVatW2HPPPSP30moDj2Sx7fZujzzmz5+PU089FS1btsTEiRPRrFmz/L0RI0bgq6++wquvvoquXbuia9eu+Xu//PILzjvvPHTt2hWnnXZahOczzzyDG264ASeeeCLGjx+PmjVr5u+NHDkSb775JjZs2BBJs/feexfwKQaCIMDatWtRp06dYotS8jjvvPNw+eWXo06dOrjgggukitWaNWtw1VVXoV+/fnm31VlnnYXNmzfjL3/5C84++2xsv/32AIB7770XX375JT766CPss88+AIAjjzwSXbp0we23346bb745ncJVMbDPaJKoXbt2KvmUItJqA49k4V2BHhg1ahRWrlyJhx9+OKJUhWjXrh3++Mc/GvG8+uqr0ahRI/zjH/8QDhZ9+/ZF//79rWUGgOuuuw4jR44EALRu3TrvPvzmm28AAGPHjsUhhxyCiooKlJWVoXPnzhgzZkwBn1atWqF///5488030b17d9SpUwf3338/AGDBggU4+uijUbduXVRUVODiiy/Gm2++iVwuV+BOmzJlCo444giUl5dju+22Q69evfDhhx+S5ZXhgQceQNu2bVGnTh3su+++eP/99wto1q9fj2uuuQbdunVDeXk56tati549e+Kdd97J03zzzTd5C+D111+fzz+Md/nkk08wbNiwvCu4adOmOOOMM7BkyRKlfCo0adKEpKC+8847WLJkCc4///zI9REjRmDVqlV49dVX89eeeeYZ7LPPPnmlCgA6duyIQw89FE899ZSVnDfeeCOqVauWdz2GsUlPPfUUbrrpJuy8886oXbs2Dj30UHz11VcF6Z9++ml069YNderUwY477ojTTjsNP/zwQ/7+Sy+9hFwuh08++SR/7dlnn0Uul4tYewGgU6dOOOWUU/L/w5iwF154AV26dEFZWRl22203vPHGG+Tybdq0Cf/3f/+Hpk2bom7dujj66KPx3XffRWj4+J7QRf/Xv/413wfLysqwzz77YOrUqQV5hPLVrl0bXbp0wfPPPy+UhY+xCkMMvvrqq7wlt7y8HMOHD8fq1asjadesWYM//OEP2HHHHVG/fn0cffTR+OGHH2LFbU2cOBE9e/ZE3bp10bBhQxxzzDGYPXt2Ad0PP/yAM888E82bN0dZWRlat26N8847D+vXrwcALF26FJdeeil233131KtXDw0aNMCRRx6JmTNn5nm8++67+X47fPjw/DMYxn2JYqxWrVqFSy65BC1atEBZWRk6dOiAv/71rwiCoKBeKf1kxYoVuOiii9CqVSuUlZWhoqIChx12GP73v/9Z1Z9HIbzFygMvv/wy2rRpgwMPPNAJvy+//BJz5szBGWecgfr165PTrV69Gr/88kvkWnl5uXQVd/zxx+OLL77AE088gTvuuAM77rgjgN/ch2PGjMFuu+2Go48+GjVq1MDLL7+M888/H5s3b8aIESMivObOnYuBAwfinHPOwVlnnYUOHTpg1apVOOSQQ/DTTz/hj3/8I5o2bYrx48dHlJUQEydOxJFHHolu3brh2muvRbVq1fKK3fvvv499991XK68IDz/8MM455xwceOCBuOiiizBv3jwcffTRaNSoEVq0aJGnW758OR566CEMHDgQZ511FlasWIGHH34Yffv2xUcffYQ999wTjRs3xpgxYwrct6EV8u2338a8efMwfPhwNG3aFJ9//jkeeOABfP755/jvf/+rjY+Kg+nTpwMAunfvHrnerVs3VKtWDdOnT8dpp52GzZs345NPPsEZZ5xRwGPffffFW2+9hRUrVhj1uz//+c+4+eabcf/99+Oss86K3Lv11ltRrVo1XHrppaisrMSoUaMwePBgTJkyJU/zyCOPYPjw4dhnn31wyy23YNGiRbjrrrvw4YcfYvr06WjYsCEOOugg5HI5vPfee/n6fv/991GtWjV88MEHeV4///wz5syZUxBc/8EHH+C5557D+eefj/r16+Puu+/GCSecgG+//Zbk+rzpppuQy+Vw+eWXY/HixbjzzjvRp08fzJgxQ6v4jh8/HitWrMA555yDXC6HUaNG4fjjj8e8efPyz+Zbb72FE044AZ07d8Ytt9yCJUuWYPjw4dh55521soU4+eST0bp1a9xyyy343//+h4ceeggVFRW47bbb8jTDhg3DU089hdNPPx37778//vOf/6Bfv37kPHj8+9//xpFHHok2bdrguuuuw5o1a3DPPfegR48e+N///pdXcn788Ufsu+++WLZsGc4++2x07NgRP/zwA5555hmsXr0atWrVwrx58/DCCy/gpJNOQuvWrbFo0SLcf//96NWrF2bNmoXmzZujU6dOuOGGG3DNNdfg7LPPRs+ePQFAOvYGQYCjjz4a77zzDs4880zsueeeePPNNzFy5Ej88MMPuOOOOyL0lH5y7rnn4plnnsEFF1yAzp07Y8mSJfjggw8we/Zs7L333tZ16cEg8NimUVlZGQAIjjnmGOO0P//8cwAguPbaayPXX3zxxQBAcMcdd5D4zJ8/PwAg/LzzzjvKtKNHjw4ABPPnzy+4t3r16oJrffv2Ddq0aRO51rJlywBA8MYbb0Su33777QGA4IUXXshfW7NmTdCxY8eIbJs3bw7at28f9O3bN9i8eXMk/9atWweHHXYYSV4e69evDyoqKoI999wzWLduXf76Aw88EAAIevXqlb+2cePGCE0QBMGvv/4aNGnSJDjjjDPy12RtFsrL44knnggABO+9955WXh1GjBgRyIacESNGBNWrVxfea9y4cXDqqacGQfCb/DfccEMB3f/7f/8vABDMmTNHKQeAYMSIEUEQBMEll1wSVKtWLXjkkUciNO+8804AIOjUqVOkXu+6664AQPDpp58GQfBbG3Xp0iVYs2ZNnu6VV14JAATXXHNN/tpuu+0WnHzyyfn/e++9d3DSSScFAILZs2cHQRAEzz33XAAgmDlzZkTeWrVqBV999VX+2syZMwMAwT333KMsa1iOnXbaKVi+fHn++lNPPRUACO666678taFDhwYtW7bM/w+fyx122CFYunRp/nr4fL/88sv5a3vuuWfQrFmzYNmyZflrb731VgAgwjMsD9v/rr322gBApJ8GQRAcd9xxwQ477JD///HHHwcAgosuuihCN2zYMGmfZhGWZ+zYsRG5KyoqgiVLluSvzZw5M6hWrVowZMiQ/LUhQ4YE1apVC6ZOnVrAN3zm165dG2zatKkgz7Kyskh/nTp1aoEcIfg2eOGFFwIAwY033hihO/HEE4NcLhfpE9R+Ul5enu//HsnAuwK3cSxfvhwAjFb4SfE8++yz8fbbb0c+e+yxh7Uc7Eq8srISv/zyC3r16oV58+ahsrIyQtu6dWv07ds3cu2NN97ATjvthKOPPjp/rXbt2gVWjRkzZuDLL7/EoEGDsGTJEvzyyy/45ZdfsGrVKhx66KF47733rAJSp02bhsWLF+Pcc89FrVq18teHDRuG8vLyCG316tXzNJs3b8bSpUuxceNGdO/enWziZ+tr7dq1+OWXX/K7MpN2E6xZsyZSRha1a9fGmjVr8nQAUFZWJqRjaVQIggAXXHAB7rrrLvzzn//E0KFDhXTDhw+PyBVaGMIdiGEbnX/++ZHYoX79+qFjx44RF2bPnj3zbtwVK1Zg5syZOPvss7Hjjjvmr7///vto2LAhunTpEpGjT58+aNu2bf5/165d0aBBA/JOyCFDhkSexxNPPBHNmjXDa6+9pk17yimn5OPbRHXw008/YcaMGRg6dGikXx522GHo3LkzST5giyWFRc+ePbFkyZL8eBK6tHh38YUXXkjOg0Uo97Bhw9CoUaP89a5du+Kwww7L183mzZvxwgsvYMCAAQUWVQB5S25ZWRmqVdsypW7atAlLlixBvXr10KFDB+vn57XXXkP16tXxhz/8IXL9kksuQRAEeP311yPXKf2kYcOGmDJlCn788UcrmTz08K7AbRwNGjQAsGWgLzbP9u3bo0+fPs7k+PDDD3Httddi8uTJBbEalZWVkUmgdevWBekXLFiAtm3bFrjA2J2RwBbXJwDp5Bzmx05OFCxYsADAlnphUbNmTbRp06aA/tFHH8Xtt9+OOXPmRDYGiMomwtKlS3H99dfjX//6FxYvXlwgf5KoU6dOPlaFB7uRIPxet26dkI6lUeGxxx7DypUrMWbMGAwcOFBKt8suu0T+h23466+/AvitjTp06FCQtmPHjhE3X8+ePXHffffhq6++wtdff41cLocDDjggr3CdddZZeP/999GjR4/8BC2TI5QllEMHvg/lcjm0a9dOG98nyltWB3weAIyUClU+DRo0wIIFC1CtWrWC/sw/j1So2q5Tp0548803sWrVKqxcuRLLly8vUHZ5bN68GXfddRfuvfdezJ8/H5s2bcrfs92pumDBAjRv3rxgkdqpU6dIGUJQ+smoUaMwdOhQtGjRAt26dcNRRx2FIUOGCMcUDzt4xWobR4MGDdC8eXN89tlnznh27NgRAPDpp58642mKr7/+Goceeig6duyIv/3tb2jRogVq1aqF1157DXfccUeBBSnODsCQ1+jRowu2T4eoV6+eNX8K/vnPf2LYsGE49thjMXLkSFRUVKB69eq45ZZb8PXXX5N4nHzyyZg0aRJGjhyJPffcE/Xq1cPmzZtxxBFHJL4FvFmzZti0aRMWL16MioqK/PX169djyZIlaN68OQCgUaNGKCsrw08//VTAI7wW0qrQo0cPzJgxA3//+99x8sknRywWLKpXry68HnCBwxQcdNBBAID33nsP8+bNw957753fZHD33Xdj5cqVmD59Om666aZE5TBFWnkXs4wucPPNN+Pqq6/GGWecgb/85S9o1KgRqlWrhosuuii1IxQodXjyySejZ8+eeP755/HWW29h9OjRuO222/Dcc8/hyCOPTEXOqg6vWHmgf//+eOCBBzB58mQccMABsfntuuuu6NChA1588UXcddddiSoVsoDql19+GevWrcNLL70UWcWJAs9laNmyJWbNmoUgCCL58LvCQtN7gwYNtBY3kwDwli1bAthiETvkkEPy1zds2ID58+dH3KTPPPMM2rRpg+eeey6Sx7XXXkvK/9dff8WECRNw/fXX45prrslfD61xSSNUSKdNmxY5y2zatGnYvHlz/n61atWw++67Y9q0aQU8pkyZgjZt2pBc0O3atcOoUaPQu3dvHHHEEZgwYYKVOzxso7lz50baKLwW3ge2WBN22WUXvP/++5g3b17epfa73/0Of/rTn/D0009j06ZN+N3vfmcshw58OwZBgK+++ipyfIot2H7KY+7cubH5s/ls3rwZ8+fPj1jHRLs0qfwAsYxz5szBjjvuiLp166JOnTpo0KCBdvH5zDPP4OCDD8bDDz8cub5s2bL8RhXAfAz497//XbAhY86cOZEymKJZs2Y4//zzcf7552Px4sXYe++9cdNNN3nFyhF8jJUHLrvsMtStWxe///3vsWjRooL7X3/9Ne666y4jntdffz2WLFmC3//+99i4cWPB/bfeeguvvPKKtcwh6tatCwAFJ5mHKzd2pVZZWYmxY8eSefft2xc//PADXnrppfy1tWvX4sEHH4zQdevWDW3btsVf//pXrFy5soDPzz//rJVXhO7du6Nx48a47777Im6yRx55hFTeKVOmYPLkyRG67bbbTpi/KD0A3HnnnVo5XeCQQw5Bo0aNCo7DGDNmDLbbbrvIzq8TTzwRU6dOjShXc+fOxcSJE3HSSSeR8+zatStee+01zJ49GwMGDCDFZvHo3r07KioqcN9990Xck6+//jpmz55dsGOtZ8+emDhxIj766KO8YrXnnnuifv36uPXWW1GnTh1069bNWA4dHnvssYhr/plnnsFPP/3kZCJt1qwZ9txzTzz66KMRl/Hbb7+NWbNmxeYfIoyBvPfeeyPXZafz68DKzT4Pn332Gd566628gl+tWjUce+yxePnll4UKffjMVK9eveD5efrppyPHbgBmY8BRRx2FTZs24e9//3vk+h133IFcLmfcfps2bSpw61dUVKB58+ZC97qHHbzFygNt27bF+PHjccopp6BTp06Rk9cnTZqEp59+GsOGDTPiecopp+DTTz/FTTfdhOnTp2PgwIH5k9ffeOMNTJgwAePHj48tezgJXXXVVTj11FNRs2ZNDBgwAIcffjhq1aqFAQMG4JxzzsHKlSvx4IMPoqKiQuhGEuGcc87B3//+dwwcOBB//OMf0axZM4wbNy4fpByuPKtVq4aHHnoIRx55JHbbbTcMHz4cO+20E3744Qe88847aNCgAV5++WWlvOFgy6JmzZq48cYbcc455+CQQw7BKaecgvnz52Ps2LEF8RD9+/fHc889h+OOOw79+vXD/Pnzcd9996Fz584RZa9OnTro3LkznnzySey6665o1KgRunTpgi5duuB3v/sdRo0ahQ0bNmCnnXbCW2+9hfnz5wvrJpfLoVevXtpX4yxYsACPP/44AOQnpRtvvBHAltX26aefnpfrL3/5C0aMGIGTTjoJffv2xfvvv49//vOfuOmmmyKuuvPPPx8PPvgg+vXrh0svvRQ1a9bE3/72NzRp0gSXXHKJUh4e+++/P1588UUcddRROPHEE/HCCy8YHdJYs2ZN3HbbbRg+fDh69eqFgQMH5o9baNWqFS6++OIIfc+ePTFu3Djkcrm8a7B69eo48MAD8eabb6J3797SIP44aNSoEQ466CAMHz4cixYtwp133ol27doVbMSwxS233IJ+/frhoIMOwhlnnIGlS5finnvuwW677SZcbNigW7duOOGEE3DnnXdiyZIl+eMWwkNnbY4DGT16NI488kgccMABOPPMM/PHLZSXl0fOxbr55pvx1ltvoVevXjj77LPRqVMn/PTTT3j66afxwQcfoGHDhujfvz9uuOEGDB8+HAceeCA+/fRTjBs3ruBZbdu2LRo2bIj77rsP9evXR926dbHffvsJYyEHDBiAgw8+GFdddRW++eYb7LHHHnjrrbfw4osv4qKLLooEqlOwYsUK7LzzzjjxxBOxxx57oF69evj3v/+NqVOn4vbbbzeuPw8JirEV0SOb+OKLL4KzzjoraNWqVVCrVq2gfv36QY8ePYJ77rknWLt2bQG9aut+iAkTJgTHHHNMUFFREdSoUSNo3LhxMGDAgODFF1/M04TboEePHm0l91/+8pdgp512CqpVqxY5yuCll14KunbtGtSuXTto1apVcNtttwX/+Mc/Co47aNmyZdCvXz8h73nz5gX9+vUL6tSpEzRu3Di45JJLgmeffTYAEPz3v/+N0E6fPj04/vjjgx122CEoKysLWrZsGZx88snBhAkTSPLKcO+99watW7cOysrKgu7duwfvvfde0KtXr8hxC5s3bw5uvvnmoGXLlkFZWVmw1157Ba+88krB9u0gCIJJkyYF3bp1C2rVqhVpv++//z447rjjgoYNGwbl5eXBSSedFPz4448FbbxixYoAQP4IBBXC7f6iDyt/iAceeCDo0KFDUKtWraBt27bBHXfcETnCIsR3330XnHjiiUGDBg2CevXqBf379w++/PJLrTxBED1uIcSLL74Y1KhRIzjllFOCTZs25eV++umnI3SiLftBEARPPvlksNdeewVlZWVBo0aNgsGDBwfff/99Qd6ff/55/hgHFjfeeGMAILj66qtJ8gbBln47dOhQZVnDcjzxxBPBlVdeGVRUVAR16tQJ+vXrFyxYsCBCKztuQfRcip77Z599NujUqVNQVlYWdO7cOXjuueeE/Y9PGx638PPPP0foxo4dW/B8rFq1KhgxYkTQqFGjoF69esGxxx4bzJ07NwAQ3Hrrrcq6kLXdv//976BHjx5BnTp1ggYNGgQDBgwIZs2aVZB+wYIFwZAhQ4LGjRsHZWVlQZs2bYIRI0bkj+NYu3ZtcMkllwTNmjUL6tSpE/To0SOYPHlywbMaBFv6W+fOnYMaNWpEZBLV14oVK4KLL744aN68eVCzZs2gffv2wejRowueC0o/WbduXTBy5Mhgjz32COrXrx/UrVs32GOPPYJ7771XWXceZsgFQYlEBnp4ZAR33nknLr74Ynz//ffYaaedii1O6njttdfQv39/zJw5E7vvvnuxxfHYxjFjxgzstdde+Oc//4nBgwcXWxwPDx9j5eGhAh93s3btWtx///1o3779NqlUAVs2AJx66qleqfJIHaI4uDvvvBPVqlVLJOjfw8MGPsbKw0OB448/Hrvssgv23HNPVFZW4p///CfmzJmDcePGFVu0omH06NHFFsFjG8WoUaPw8ccf4+CDD0aNGjXw+uuv4/XXX8fZZ58decWTh0cx4V2BHh4K3HnnnXjooYfwzTffYNOmTejcuTMuu+yyyEtyPTw80sHbb7+N66+/HrNmzcLKlSuxyy674PTTT8dVV12FGjW8ncAjG/CKlYeHh4eHh4eHI/gYKw8PDw8PDw8PR/CKlYeHh4eHh4eHI3jFysOjxNGqVSv079+/2GKgd+/eyOVyyOVyTuTp3bu39sW3Nnj88cfRsWNH1KxZEw0bNsxfHz16NNq0aYPq1avnX6HTqlUr48NxZbjzzjvz9ZPL5fDLL78o6YcNG4ZWrVo5ydsFvvnmG+RyOTzyyCNW6b/88kscfvjhKC8vRy6XwwsvvOBUvhC9e/dG7969E+Ht4UGBV6w8PDKA8ePHp/b6mCTRsWNHPP7447j00ksj1+NMyC4xZ84cDBs2DG3btsWDDz6IBx54AMCWVyxddtll6NGjB8aOHYubb745dl58mY844gg8/vjjOO6442LzLkUMHTo0/zaGxx9/HN27d08l3x9//BHXXXcdZsyYkUp+Hh5+G4WHRwYwfvx4fPbZZ7jooouKLUosNGnSBKeddlqxxZDi3XffxebNm3HXXXehXbt2+esTJ05EtWrV8PDDDyfyShlgi9LZsWNHfPXVV3j++ee19A8++CA2b96ciCxpY82aNZg8eTKuuuoqXHDBBanm/eOPP+L6669Hq1at8pZID48k4S1WHh5FxKpVq4otwjaFxYsXA0DEBRher1OnTmJKlQ1q1qyJsrKyYovhBOGLyPl69/CoivCKlYeHAitWrMBFF12EVq1aoaysDBUVFTjssMPwv//9L0L39NNPo1u3bqhTpw523HFHnHbaaQVvtR82bBjq1auHr7/+GkcddRTq16+PwYMHo3fv3nj11VexYMGCfPyNTWzNW2+9hT333BO1a9dG586d8dxzz+XvzZs3D7lcDnfccUdBukmTJiGXy+GJJ54wztMW1HoFgFmzZuHggw/Gdttth5122gmjRo2K3H/kkUeQy+XwzTffRK6/++67yOVy+RdFt2rVCtdeey0AoHHjxsjlcrjuuuuQy+UwduxYrFq1Kl//KrflsmXLcNFFF6FFixYoKytDu3btcNtttzm3LpnEWL3++uvo2bMn6tati/r166Nfv374/PPPrfNetmwZhg0bhvLycjRs2BBDhw7FsmXLhLRz5szBiSeeiEaNGqF27dro3r07Xnrppfz96667Di1btgQAjBw5MtK/FyxYgPPPPx8dOnRAnTp1sMMOO+Ckk04qaMuwnXjI2j7Eu+++i3322QcAMHz4cFL7enjEhXcFengocO655+KZZ57BBRdcgM6dO2PJkiX44IMPMHv2bOy9994Atgzuw4cPxz777INbbrkFixYtwl133YUPP/wQ06dPj6zSN27ciL59++Kggw7CX//6V2y33XZo2rQpKisr8f333+cVn3r16hnJ+eWXX+KUU07Bueeei6FDh2Ls2LE46aST8MYbb+Cwww5DmzZt0KNHD4wbNw4XX3xxJO24ceNQv359HHPMMQCADRs2oLKykpRvo0aNUK2a+fqMUq8A8Ouvv+KII47A8ccfj5NPPhnPPPMMLr/8cuy+++448sgjjfK888478dhjj+H555/HmDFjUK9ePXTt2hXt2rXDAw88gI8++ggPPfQQAODAAw8U8li9ejV69eqFH374Aeeccw522WUXTJo0CVdeeSV++umnosTJPf744xg6dCj69u2L2267DatXr8aYMWNw0EEHYfr06cZKehAEOOaYY/DBBx/g3HPPRadOnfD8889j6NChBbSff/45evTogZ122glXXHEF6tati6eeegrHHnssnn32WRx33HE4/vjj0bBhQ1x88cUYOHAgjjrqqHz/njp1KiZNmoRTTz0VO++8M7755huMGTMGvXv3xqxZs7DddtvFqptOnTrhhhtuwDXXXIOzzz4bPXv2BCBvXw8PJyjiC6A9PDKP8vJy4RvjQ6xfvz6oqKgIunTpEqxZsyZ//ZVXXgkABNdcc03+2tChQwMAwRVXXFHAp1+/fgVvtaeiZcuWAYDg2WefzV+rrKwMmjVrFuy11175a/fff38AIJg9e3ZE/h133DEYOnRo/to777wTACB95s+fn0/Xq1evoFevXiSZdfUa8gMQPPbYY/lr69atC5o2bRqccMIJ+Wtjx44tkIUtxzvvvJO/du211wYAgp9//jlCO3To0KBu3boFMrRs2TJSN3/5y1+CunXrBl988UWE7oorrgiqV68efPvtt8oyqWTgMXToUG2fWLFiRdCwYcPgrLPOilxfuHBhUF5eXnCdghdeeCEAEIwaNSp/bePGjUHPnj0DAMHYsWPz1w899NBg9913D9auXZu/tnnz5uDAAw8M2rdvn782f/78AEAwevToSF6rV68uyH/y5MkF7R7WGQ9R2/P9cOrUqQVye3gkCe8K9PBQoGHDhpgyZQp+/PFH4f1p06Zh8eLFOP/881G7du389X79+qFjx4549dVXC9Kcd955zuVs3rx5ZLdZgwYNMGTIEEyfPh0LFy4EAJx88smoXbt25D2Hb775Jn755ZdIwPkee+yBt99+m/Rp2rSplby6eg1Rr169iGy1atXCvvvui3nz5lnlGxdPP/00evbsie233x6//PJL/tOnTx9s2rQJ7733XqryvP3221i2bBkGDhwYkad69erYb7/98M477xjzfO2111CjRo1IP61evTouvPDCCN3SpUsxceJEnHzyyVixYkU+7yVLlqBv37748ssvC9zhPOrUqZP/vWHDBixZsgTt2rVDw4YNhW5hD49SgHcFengoMGrUKAwdOhQtWrRAt27dcNRRR2HIkCFo06YNgC0xIgDQoUOHgrQdO3bEBx98ELlWo0YN7Lzzzs7lbNeuXUEMyq677gpgy/lDTZs2RcOGDTFgwACMHz8ef/nLXwBscQPutNNOOOSQQ/Lptt9+e/Tp08e5jCx09Rpi5513LijX9ttvj08++SRR+WT48ssv8cknn6Bx48bC+2FwfJryAIi0H4sGDRoY81ywYAGaNWtW4I7m+/hXX32FIAhw9dVX4+qrrxbyWrx4MXbaaSdpXmvWrMEtt9yCsWPH4ocffkDAvGGN6o728MgavGLl4aHAySefjJ49e+L555/HW2+9hdGjR+O2227Dc889ZxzjAwBlZWVWMUmuMGTIEDz99NOYNGkSdt99d7z00ks4//zzIzKtX78eS5cuJfFr3LgxqlevbiwHtV5lvNkJWBTUDACbNm0ylkuHzZs347DDDsNll10mvB8qs2khDJh//PHHhdbDJF9MHOZ96aWXom/fvkIa9kgLES688EKMHTsWF110EQ444ID84aGnnnpqZDNAmm3s4REXXrHy8NCgWbNmOP/883H++edj8eLF2HvvvXHTTTfhyCOPzO92mjt3boHVYO7cufn7OsgmDipC6wHL54svvgCASPDyEUccgcaNG2PcuHHYb7/9sHr1apx++ukRXpMmTcLBBx9Mynf+/PnWp4Or6tUE22+/PQAU7FoLrYku0bZtW6xcuTJxix4Vbdu2BQBUVFQ4k6lly5aYMGECVq5cGbFazZ07N0IXWhdr1qxpnfczzzyDoUOH4vbbb89fW7t2bUFbsm3MbgahtHHcZ8vDwxQ+xsrDQ4JNmzYVuCMqKirQvHlzrFu3DgDQvXt3VFRU4L777stfA7Zsf589ezb69etHyqtu3bqxXB8//vhj5NDJ5cuX47HHHsOee+4ZsWTUqFEDAwcOxFNPPYVHHnkEu+++O7p27RrhlXSMFaVeTRAqF2x806ZNm/KnqrvEySefjMmTJ+PNN98suLds2TJs3LjReZ4svv76a3z99df5/3379kWDBg1w8803Y8OGDQX04flRwBbX2pw5c7T97KijjsLGjRsxZsyY/LVNmzbhnnvuidBVVFSgd+/euP/++/HTTz8p85ahevXqEesjANxzzz0FlihRG69atQqPPvqoNo+6desCKFS8PTySgrdYeXhIsGLFCuy888448cQTsccee6BevXr497//jalTp+ZX2DVr1sRtt92G4cOHo1evXhg4cGD+uIVWrVoVHG0gQ7du3fDkk0/iT3/6E/bZZx/Uq1cPAwYMIMu666674swzz8TUqVPRpEkT/OMf/8CiRYswduzYAtohQ4bg7rvvxjvvvIPbbrut4H7SMVaUejXBbrvthv333x9XXnklli5dikaNGuFf//pXIkrOyJEj8dJLL6F///4YNmwYunXrhlWrVuHTTz/FM888g2+++QY77rij83xDHHrooQCQP7epQYMGGDNmDE4//XTsvffeOPXUU9G4cWN8++23ePXVV9GjRw/8/e9/BwA8//zzGD58OMaOHat8/+GAAQPQo0cPXHHFFfjmm2/yZ6KJFLL/9//+Hw466CDsvvvuOOuss9CmTRssWrQIkydPxvfff4+ZM2cqy9O/f388/vjjKC8vR+fOnTF58mT8+9//xg477BChO/zww7HLLrvgzDPPxMiRI1G9enX84x//yJdVhbZt26Jhw4a47777UL9+fdStWxf77bcfWrdurUzn4WGNou5J9PDIMNatWxeMHDky2GOPPYL69esHdevWDfbYY4/g3nvvLaB98skng7322isoKysLGjVqFAwePDj4/vvvIzSyLf1BEAQrV64MBg0aFDRs2DAAYHT0QsuWLYN+/foFb775ZtC1a9egrKws6NixY/D0009L0+y2225BtWrVCmSMA+pxC9R67dWrV7DbbrsVpBcdQ/D1118Hffr0CcrKyoImTZoE//d//xe8/fbbzo9bCIItRxxceeWVQbt27YJatWoFO+64Y3DggQcGf/3rX4P169dryx/nuIWWLVsK+8Y777wT9O3bNygvLw9q164dtG3bNhg2bFgwbdq0PE14NAHl2IElS5YEp59+etCgQYOgvLw8OP3004Pp06cL03/99dfBkCFDgqZNmwY1a9YMdtppp6B///7BM888k6eRHbfw66+/BsOHDw923HHHoF69ekHfvn2DOXPmCOv9448/Dvbbb7+gVq1awS677BL87W9/Ix23EARB8OKLLwadO3cOatSo4Y9e8EgcuSDg7LAeHh5VHnvttRcaNWqECRMmOOPZu3dvbNiwAS+++CJq1apltSOtKmPt2rVYuXIlRo0ahdGjR+Pnn39O1Lrl4eFRHPgYKw+PbQzTpk3DjBkzMGTIEOe8J02ahMaNG2PQoEHOeZc67rvvPjRu3BijR48utigeHh4JwlusPDwyip9//lm5nbxWrVpo1KgRmd9nn32Gjz/+GLfffjt++eUXzJs3L3KoaVx8/PHH+PXXXwFsOYZhjz32cMa7KuC7776L7Kzr1asXatasWUSJPDw8koBXrDw8MopWrVopt5P36tUr/4JhCq677jrccMMN6NChA+677z706tXLgZQeHh4eHiy8YuXhkVF8+OGHWLNmjfT+9ttvj27duqUokYeHh4eHDl6x8vDw8PDw8PBwBB+87uHh4eHh4eHhCEU9IPS9997D6NGj8fHHH+Onn37C888/j2OPPTZ/PwgCXHvttXjwwQexbNky9OjRA2PGjEH79u3zNEuXLsWFF16Il19+GdWqVcMJJ5yAu+66K/Iqhk8++QQjRozA1KlT0bhxY1x44YXSd33JsHnzZvz444+oX7++f0WCh4eHh4dHiSAIAqxYsQLNmzdP512txTk+awtee+214Kqrrgqee+65AEDw/PPPR+7feuutQXl5efDCCy8EM2fODI4++uigdevWwZo1a/I0RxxxRLDHHnsE//3vf4P3338/aNeuXTBw4MD8/crKyqBJkybB4MGDg88++yx44okngjp16gT333+/kazfffddAMB//Md//Md//Md/SvDz3XffxdJZqMhMjFUul4tYrIIgQPPmzXHJJZfg0ksvBbDlXVdNmjTBI488glNPPRWzZ89G586dMXXqVHTv3h0A8MYbb+Coo47C999/j+bNm2PMmDG46qqrsHDhQtSqVQsAcMUVV+CFF17AnDlzyPJVVlaiYcOG+O677/zBhx4eHh4e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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_reads.plot_reads(\n", + " mod_file_name=extract_file,\n", + " regions=ctcf_target_regions,\n", + " motifs=['A,0', 'CG,0'],\n", + " window_size=1000,\n", + " single_strand=False, # if set to True, regions that specify the strand will only pull from reads on the strand (as opposed to both strands)\n", + " regions_5to3prime=False, # if set to True, regions on the reverse (-) strand will be flipped so everything is 5 prime to 3 prime\n", + ")\n", + "plt.title(\"CTCF target data, 100 known binding locations\\nsort_by=['shuffle'] i.e. default\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Plot Browser" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The read browser plot lets you see modification locations and probabilities in the same visualization. While the `pileup` operation and downstream plots by definition requires a threshold, but plot browser requires raw probabilities. Read extraction can be run with *either* binary modification calls *or* raw probabilities. Run the cell below to re-extract the single reads but with raw base modification probabilities for plot browser." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "from dimelo import plot_read_browser" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "This is expected to fail. Read the error message below:\n", + "\n", + "\n", + "A threshold has been applied to this .h5 single read data. plot_read_browser must be used with an .h5 file extracted using thresh=None.\n" + ] + } + ], + "source": [ + "try:\n", + " plot_read_browser.plot_read_browser(\n", + " mod_file_name=extract_file,\n", + " region='chr1:114357437-114359753', # you can only browser a single region, not a bed file or list of regions.\n", + " # The only cap on region size is your computer's memory and your patience\n", + " motifs=['CG,0','A,0'],\n", + " thresh=0.5,\n", + " single_strand=False,\n", + " sort_by=\"collapse\",#you can sort by anything that the loading function accepts, but the special \"collapse\" option doesn't allow other sorting\n", + " hover=False, #turning off hover will remove the hoverover read names and other info \n", + " )\n", + "except Exception as e:\n", + " print('This is expected to fail. Read the error message below:\\n\\n')\n", + " print(e)" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "No specified number of cores requested. 64 available on machine, allocating all.\n", + "No valid base modification threshold provided. Raw probs will be saved.\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "98ed47f1b80049c3bec875fe453e1db8", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " | Step 1: Identify motif locations in chm13.draft_v1.0.fasta 0% | 00:00" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "6afddba49c304955a6de6124de4cb65c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " | Step 2: Parse regions in ctcf_demo.updated.bam 0% | 00:00\n", + " window.PlotlyConfig = {MathJaxConfig: 'local'};\n", + " if (window.MathJax && window.MathJax.Hub && window.MathJax.Hub.Config) {window.MathJax.Hub.Config({SVG: {font: \"STIX-Web\"}});}\n", + " if (typeof require !== 'undefined') {\n", + " require.undef(\"plotly\");\n", + " define('plotly', function(require, exports, module) {\n", + " /**\n", + "* plotly.js v2.32.0\n", + "* Copyright 2012-2024, Plotly, Inc.\n", + "* All rights reserved.\n", + "* Licensed under the MIT license\n", + "*/\n", + "/*! For license information please see plotly.min.js.LICENSE.txt */\n", + "!function(t,e){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define([],e):\"object\"==typeof exports?exports.Plotly=e():t.Plotly=e()}(self,(function(){return function(){var t={79288:function(t,e,r){\"use strict\";var n=r(3400),i={\"X,X div\":'direction:ltr;font-family:\"Open Sans\",verdana,arial,sans-serif;margin:0;padding:0;',\"X input,X button\":'font-family:\"Open Sans\",verdana,arial,sans-serif;',\"X input:focus,X button:focus\":\"outline:none;\",\"X a\":\"text-decoration:none;\",\"X a:hover\":\"text-decoration:none;\",\"X .crisp\":\"shape-rendering:crispEdges;\",\"X .user-select-none\":\"-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;\",\"X svg\":\"overflow:hidden;\",\"X svg a\":\"fill:#447adb;\",\"X svg a:hover\":\"fill:#3c6dc5;\",\"X .main-svg\":\"position:absolute;top:0;left:0;pointer-events:none;\",\"X .main-svg .draglayer\":\"pointer-events:all;\",\"X .cursor-default\":\"cursor:default;\",\"X .cursor-pointer\":\"cursor:pointer;\",\"X .cursor-crosshair\":\"cursor:crosshair;\",\"X .cursor-move\":\"cursor:move;\",\"X .cursor-col-resize\":\"cursor:col-resize;\",\"X .cursor-row-resize\":\"cursor:row-resize;\",\"X .cursor-ns-resize\":\"cursor:ns-resize;\",\"X .cursor-ew-resize\":\"cursor:ew-resize;\",\"X .cursor-sw-resize\":\"cursor:sw-resize;\",\"X .cursor-s-resize\":\"cursor:s-resize;\",\"X .cursor-se-resize\":\"cursor:se-resize;\",\"X .cursor-w-resize\":\"cursor:w-resize;\",\"X .cursor-e-resize\":\"cursor:e-resize;\",\"X .cursor-nw-resize\":\"cursor:nw-resize;\",\"X .cursor-n-resize\":\"cursor:n-resize;\",\"X .cursor-ne-resize\":\"cursor:ne-resize;\",\"X .cursor-grab\":\"cursor:-webkit-grab;cursor:grab;\",\"X .modebar\":\"position:absolute;top:2px;right:2px;\",\"X .ease-bg\":\"-webkit-transition:background-color .3s ease 0s;-moz-transition:background-color .3s ease 0s;-ms-transition:background-color .3s ease 0s;-o-transition:background-color .3s ease 0s;transition:background-color .3s ease 0s;\",\"X .modebar--hover>:not(.watermark)\":\"opacity:0;-webkit-transition:opacity .3s ease 0s;-moz-transition:opacity .3s ease 0s;-ms-transition:opacity .3s ease 0s;-o-transition:opacity .3s ease 0s;transition:opacity .3s ease 0s;\",\"X:hover .modebar--hover .modebar-group\":\"opacity:1;\",\"X .modebar-group\":\"float:left;display:inline-block;box-sizing:border-box;padding-left:8px;position:relative;vertical-align:middle;white-space:nowrap;\",\"X .modebar-btn\":\"position:relative;font-size:16px;padding:3px 4px;height:22px;cursor:pointer;line-height:normal;box-sizing:border-box;\",\"X .modebar-btn svg\":\"position:relative;top:2px;\",\"X .modebar.vertical\":\"display:flex;flex-direction:column;flex-wrap:wrap;align-content:flex-end;max-height:100%;\",\"X .modebar.vertical svg\":\"top:-1px;\",\"X .modebar.vertical .modebar-group\":\"display:block;float:none;padding-left:0px;padding-bottom:8px;\",\"X .modebar.vertical .modebar-group .modebar-btn\":\"display:block;text-align:center;\",\"X [data-title]:before,X [data-title]:after\":\"position:absolute;-webkit-transform:translate3d(0, 0, 0);-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-o-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);display:none;opacity:0;z-index:1001;pointer-events:none;top:110%;right:50%;\",\"X [data-title]:hover:before,X [data-title]:hover:after\":\"display:block;opacity:1;\",\"X [data-title]:before\":'content:\"\";position:absolute;background:rgba(0,0,0,0);border:6px solid rgba(0,0,0,0);z-index:1002;margin-top:-12px;border-bottom-color:#69738a;margin-right:-6px;',\"X [data-title]:after\":\"content:attr(data-title);background:#69738a;color:#fff;padding:8px 10px;font-size:12px;line-height:12px;white-space:nowrap;margin-right:-18px;border-radius:2px;\",\"X .vertical [data-title]:before,X .vertical [data-title]:after\":\"top:0%;right:200%;\",\"X .vertical [data-title]:before\":\"border:6px solid rgba(0,0,0,0);border-left-color:#69738a;margin-top:8px;margin-right:-30px;\",Y:'font-family:\"Open Sans\",verdana,arial,sans-serif;position:fixed;top:50px;right:20px;z-index:10000;font-size:10pt;max-width:180px;',\"Y p\":\"margin:0;\",\"Y .notifier-note\":\"min-width:180px;max-width:250px;border:1px solid #fff;z-index:3000;margin:0;background-color:#8c97af;background-color:rgba(140,151,175,.9);color:#fff;padding:10px;overflow-wrap:break-word;word-wrap:break-word;-ms-hyphens:auto;-webkit-hyphens:auto;hyphens:auto;\",\"Y .notifier-close\":\"color:#fff;opacity:.8;float:right;padding:0 5px;background:none;border:none;font-size:20px;font-weight:bold;line-height:20px;\",\"Y .notifier-close:hover\":\"color:#444;text-decoration:none;cursor:pointer;\"};for(var a in i){var o=a.replace(/^,/,\" ,\").replace(/X/g,\".js-plotly-plot .plotly\").replace(/Y/g,\".plotly-notifier\");n.addStyleRule(o,i[a])}},86712:function(t,e,r){\"use strict\";t.exports=r(84224)},37240:function(t,e,r){\"use strict\";t.exports=r(51132)},29744:function(t,e,r){\"use strict\";t.exports=r(94456)},29352:function(t,e,r){\"use strict\";t.exports=r(67244)},96144:function(t,e,r){\"use strict\";t.exports=r(97776)},53219:function(t,e,r){\"use strict\";t.exports=r(61712)},4624:function(t,e,r){\"use strict\";t.exports=r(95856)},54543:function(t,e,r){\"use strict\";t.exports=r(54272)},45e3:function(t,e,r){\"use strict\";t.exports=r(85404)},62300:function(t,e,r){\"use strict\";t.exports=r(26048)},6920:function(t,e,r){\"use strict\";t.exports=r(66240)},10264:function(t,e,r){\"use strict\";t.exports=r(40448)},32016:function(t,e,r){\"use strict\";t.exports=r(64884)},27528:function(t,e,r){\"use strict\";t.exports=r(15088)},75556:function(t,e,r){\"use strict\";t.exports=r(76744)},39204:function(t,e,r){\"use strict\";t.exports=r(94704)},73996:function(t,e,r){\"use strict\";t.exports=r(62396)},16489:function(t,e,r){\"use strict\";t.exports=r(32028)},5e3:function(t,e,r){\"use strict\";t.exports=r(81932)},77280:function(t,e,r){\"use strict\";t.exports=r(45536)},33992:function(t,e,r){\"use strict\";t.exports=r(42600)},17600:function(t,e,r){\"use strict\";t.exports=r(21536)},49116:function(t,e,r){\"use strict\";t.exports=r(65664)},46808:function(t,e,r){\"use strict\";t.exports=r(29044)},36168:function(t,e,r){\"use strict\";t.exports=r(48928)},13792:function(t,e,r){\"use strict\";var n=r(32016);n.register([r(37240),r(29352),r(5e3),r(33992),r(17600),r(49116),r(6920),r(67484),r(79440),r(39204),r(83096),r(36168),r(20260),r(63560),r(65832),r(46808),r(73996),r(48824),r(89904),r(25120),r(13752),r(4340),r(62300),r(29800),r(8363),r(54543),r(86636),r(42192),r(32140),r(77280),r(89296),r(56816),r(70192),r(45e3),r(27528),r(84764),r(3920),r(50248),r(4624),r(69967),r(10264),r(86152),r(53219),r(81604),r(63796),r(29744),r(89336),r(86712),r(75556),r(16489),r(97312),r(96144)]),t.exports=n},3920:function(t,e,r){\"use strict\";t.exports=r(43480)},25120:function(t,e,r){\"use strict\";t.exports=r(6296)},4340:function(t,e,r){\"use strict\";t.exports=r(7404)},86152:function(t,e,r){\"use strict\";t.exports=r(65456)},56816:function(t,e,r){\"use strict\";t.exports=r(22020)},89296:function(t,e,r){\"use strict\";t.exports=r(29928)},20260:function(t,e,r){\"use strict\";t.exports=r(75792)},32140:function(t,e,r){\"use strict\";t.exports=r(156)},84764:function(t,e,r){\"use strict\";t.exports=r(45499)},48824:function(t,e,r){\"use strict\";t.exports=r(3296)},69967:function(t,e,r){\"use strict\";t.exports=r(4184)},8363:function(t,e,r){\"use strict\";t.exports=r(36952)},86636:function(t,e,r){\"use strict\";t.exports=r(38983)},70192:function(t,e,r){\"use strict\";t.exports=r(11572)},81604:function(t,e,r){\"use strict\";t.exports=r(76924)},63796:function(t,e,r){\"use strict\";t.exports=r(62944)},89336:function(t,e,r){\"use strict\";t.exports=r(95443)},67484:function(t,e,r){\"use strict\";t.exports=r(34864)},97312:function(t,e,r){\"use strict\";t.exports=r(76272)},42192:function(t,e,r){\"use strict\";t.exports=r(97924)},29800:function(t,e,r){\"use strict\";t.exports=r(15436)},63560:function(t,e,r){\"use strict\";t.exports=r(5621)},89904:function(t,e,r){\"use strict\";t.exports=r(91304)},50248:function(t,e,r){\"use strict\";t.exports=r(41724)},65832:function(t,e,r){\"use strict\";t.exports=r(31991)},79440:function(t,e,r){\"use strict\";t.exports=r(22869)},13752:function(t,e,r){\"use strict\";t.exports=r(67776)},83096:function(t,e,r){\"use strict\";t.exports=r(95952)},72196:function(t){\"use strict\";t.exports=[{path:\"\",backoff:0},{path:\"M-2.4,-3V3L0.6,0Z\",backoff:.6},{path:\"M-3.7,-2.5V2.5L1.3,0Z\",backoff:1.3},{path:\"M-4.45,-3L-1.65,-0.2V0.2L-4.45,3L1.55,0Z\",backoff:1.55},{path:\"M-2.2,-2.2L-0.2,-0.2V0.2L-2.2,2.2L-1.4,3L1.6,0L-1.4,-3Z\",backoff:1.6},{path:\"M-4.4,-2.1L-0.6,-0.2V0.2L-4.4,2.1L-4,3L2,0L-4,-3Z\",backoff:2},{path:\"M2,0A2,2 0 1,1 0,-2A2,2 0 0,1 2,0Z\",backoff:0,noRotate:!0},{path:\"M2,2V-2H-2V2Z\",backoff:0,noRotate:!0}]},13916:function(t,e,r){\"use strict\";var n=r(72196),i=r(25376),a=r(33816),o=r(31780).templatedArray;r(36208),t.exports=o(\"annotation\",{visible:{valType:\"boolean\",dflt:!0,editType:\"calc+arraydraw\"},text:{valType:\"string\",editType:\"calc+arraydraw\"},textangle:{valType:\"angle\",dflt:0,editType:\"calc+arraydraw\"},font:i({editType:\"calc+arraydraw\",colorEditType:\"arraydraw\"}),width:{valType:\"number\",min:1,dflt:null,editType:\"calc+arraydraw\"},height:{valType:\"number\",min:1,dflt:null,editType:\"calc+arraydraw\"},opacity:{valType:\"number\",min:0,max:1,dflt:1,editType:\"arraydraw\"},align:{valType:\"enumerated\",values:[\"left\",\"center\",\"right\"],dflt:\"center\",editType:\"arraydraw\"},valign:{valType:\"enumerated\",values:[\"top\",\"middle\",\"bottom\"],dflt:\"middle\",editType:\"arraydraw\"},bgcolor:{valType:\"color\",dflt:\"rgba(0,0,0,0)\",editType:\"arraydraw\"},bordercolor:{valType:\"color\",dflt:\"rgba(0,0,0,0)\",editType:\"arraydraw\"},borderpad:{valType:\"number\",min:0,dflt:1,editType:\"calc+arraydraw\"},borderwidth:{valType:\"number\",min:0,dflt:1,editType:\"calc+arraydraw\"},showarrow:{valType:\"boolean\",dflt:!0,editType:\"calc+arraydraw\"},arrowcolor:{valType:\"color\",editType:\"arraydraw\"},arrowhead:{valType:\"integer\",min:0,max:n.length,dflt:1,editType:\"arraydraw\"},startarrowhead:{valType:\"integer\",min:0,max:n.length,dflt:1,editType:\"arraydraw\"},arrowside:{valType:\"flaglist\",flags:[\"end\",\"start\"],extras:[\"none\"],dflt:\"end\",editType:\"arraydraw\"},arrowsize:{valType:\"number\",min:.3,dflt:1,editType:\"calc+arraydraw\"},startarrowsize:{valType:\"number\",min:.3,dflt:1,editType:\"calc+arraydraw\"},arrowwidth:{valType:\"number\",min:.1,editType:\"calc+arraydraw\"},standoff:{valType:\"number\",min:0,dflt:0,editType:\"calc+arraydraw\"},startstandoff:{valType:\"number\",min:0,dflt:0,editType:\"calc+arraydraw\"},ax:{valType:\"any\",editType:\"calc+arraydraw\"},ay:{valType:\"any\",editType:\"calc+arraydraw\"},axref:{valType:\"enumerated\",dflt:\"pixel\",values:[\"pixel\",a.idRegex.x.toString()],editType:\"calc\"},ayref:{valType:\"enumerated\",dflt:\"pixel\",values:[\"pixel\",a.idRegex.y.toString()],editType:\"calc\"},xref:{valType:\"enumerated\",values:[\"paper\",a.idRegex.x.toString()],editType:\"calc\"},x:{valType:\"any\",editType:\"calc+arraydraw\"},xanchor:{valType:\"enumerated\",values:[\"auto\",\"left\",\"center\",\"right\"],dflt:\"auto\",editType:\"calc+arraydraw\"},xshift:{valType:\"number\",dflt:0,editType:\"calc+arraydraw\"},yref:{valType:\"enumerated\",values:[\"paper\",a.idRegex.y.toString()],editType:\"calc\"},y:{valType:\"any\",editType:\"calc+arraydraw\"},yanchor:{valType:\"enumerated\",values:[\"auto\",\"top\",\"middle\",\"bottom\"],dflt:\"auto\",editType:\"calc+arraydraw\"},yshift:{valType:\"number\",dflt:0,editType:\"calc+arraydraw\"},clicktoshow:{valType:\"enumerated\",values:[!1,\"onoff\",\"onout\"],dflt:!1,editType:\"arraydraw\"},xclick:{valType:\"any\",editType:\"arraydraw\"},yclick:{valType:\"any\",editType:\"arraydraw\"},hovertext:{valType:\"string\",editType:\"arraydraw\"},hoverlabel:{bgcolor:{valType:\"color\",editType:\"arraydraw\"},bordercolor:{valType:\"color\",editType:\"arraydraw\"},font:i({editType:\"arraydraw\"}),editType:\"arraydraw\"},captureevents:{valType:\"boolean\",editType:\"arraydraw\"},editType:\"calc\",_deprecated:{ref:{valType:\"string\",editType:\"calc\"}}})},90272:function(t,e,r){\"use strict\";var n=r(3400),i=r(54460),a=r(23816).draw;function o(t){var e=t._fullLayout;n.filterVisible(e.annotations).forEach((function(e){var r=i.getFromId(t,e.xref),n=i.getFromId(t,e.yref),a=i.getRefType(e.xref),o=i.getRefType(e.yref);e._extremes={},\"range\"===a&&s(e,r),\"range\"===o&&s(e,n)}))}function s(t,e){var r,n=e._id,a=n.charAt(0),o=t[a],s=t[\"a\"+a],l=t[a+\"ref\"],u=t[\"a\"+a+\"ref\"],c=t[\"_\"+a+\"padplus\"],f=t[\"_\"+a+\"padminus\"],h={x:1,y:-1}[a]*t[a+\"shift\"],p=3*t.arrowsize*t.arrowwidth||0,d=p+h,v=p-h,g=3*t.startarrowsize*t.arrowwidth||0,y=g+h,m=g-h;if(u===l){var x=i.findExtremes(e,[e.r2c(o)],{ppadplus:d,ppadminus:v}),b=i.findExtremes(e,[e.r2c(s)],{ppadplus:Math.max(c,y),ppadminus:Math.max(f,m)});r={min:[x.min[0],b.min[0]],max:[x.max[0],b.max[0]]}}else y=s?y+s:y,m=s?m-s:m,r=i.findExtremes(e,[e.r2c(o)],{ppadplus:Math.max(c,d,y),ppadminus:Math.max(f,v,m)});t._extremes[n]=r}t.exports=function(t){var e=t._fullLayout;if(n.filterVisible(e.annotations).length&&t._fullData.length)return n.syncOrAsync([a,o],t)}},42300:function(t,e,r){\"use strict\";var n=r(3400),i=r(24040),a=r(31780).arrayEditor;function o(t,e){var r,n,i,a,o,l,u,c=t._fullLayout.annotations,f=[],h=[],p=[],d=(e||[]).length;for(r=0;r0||r.explicitOff.length>0},onClick:function(t,e){var r,s,l=o(t,e),u=l.on,c=l.off.concat(l.explicitOff),f={},h=t._fullLayout.annotations;if(u.length||c.length){for(r=0;r2/3?\"right\":\"center\"),{center:0,middle:0,left:.5,bottom:-.5,right:-.5,top:.5}[e]}for(var Y=!1,X=[\"x\",\"y\"],Z=0;Z1)&&(nt===rt?((pt=it.r2fraction(e[\"a\"+et]))<0||pt>1)&&(Y=!0):Y=!0),K=it._offset+it.r2p(e[et]),Q=.5}else{var dt=\"domain\"===ht;\"x\"===et?($=e[et],K=dt?it._offset+it._length*$:K=T.l+T.w*$):($=1-e[et],K=dt?it._offset+it._length*$:K=T.t+T.h*$),Q=e.showarrow?.5:$}if(e.showarrow){ft.head=K;var vt=e[\"a\"+et];if(tt=ot*H(.5,e.xanchor)-st*H(.5,e.yanchor),nt===rt){var gt=l.getRefType(nt);\"domain\"===gt?(\"y\"===et&&(vt=1-vt),ft.tail=it._offset+it._length*vt):\"paper\"===gt?\"y\"===et?(vt=1-vt,ft.tail=T.t+T.h*vt):ft.tail=T.l+T.w*vt:ft.tail=it._offset+it.r2p(vt),J=tt}else ft.tail=K+vt,J=tt+vt;ft.text=ft.tail+tt;var yt=w[\"x\"===et?\"width\":\"height\"];if(\"paper\"===rt&&(ft.head=o.constrain(ft.head,1,yt-1)),\"pixel\"===nt){var mt=-Math.max(ft.tail-3,ft.text),xt=Math.min(ft.tail+3,ft.text)-yt;mt>0?(ft.tail+=mt,ft.text+=mt):xt>0&&(ft.tail-=xt,ft.text-=xt)}ft.tail+=ct,ft.head+=ct}else J=tt=lt*H(Q,ut),ft.text=K+tt;ft.text+=ct,tt+=ct,J+=ct,e[\"_\"+et+\"padplus\"]=lt/2+J,e[\"_\"+et+\"padminus\"]=lt/2-J,e[\"_\"+et+\"size\"]=lt,e[\"_\"+et+\"shift\"]=tt}if(Y)R.remove();else{var bt=0,_t=0;if(\"left\"!==e.align&&(bt=(A-b)*(\"center\"===e.align?.5:1)),\"top\"!==e.valign&&(_t=(D-_)*(\"middle\"===e.valign?.5:1)),f)n.select(\"svg\").attr({x:N+bt-1,y:N+_t}).call(c.setClipUrl,U?L:null,t);else{var wt=N+_t-v.top,Tt=N+bt-v.left;G.call(h.positionText,Tt,wt).call(c.setClipUrl,U?L:null,t)}V.select(\"rect\").call(c.setRect,N,N,A,D),j.call(c.setRect,F/2,F/2,B-F,q-F),R.call(c.setTranslate,Math.round(C.x.text-B/2),Math.round(C.y.text-q/2)),I.attr({transform:\"rotate(\"+P+\",\"+C.x.text+\",\"+C.y.text+\")\"});var kt,At=function(r,n){O.selectAll(\".annotation-arrow-g\").remove();var l=C.x.head,f=C.y.head,h=C.x.tail+r,p=C.y.tail+n,v=C.x.text+r,b=C.y.text+n,_=o.rotationXYMatrix(P,v,b),w=o.apply2DTransform(_),A=o.apply2DTransform2(_),L=+j.attr(\"width\"),z=+j.attr(\"height\"),D=v-.5*L,F=D+L,B=b-.5*z,N=B+z,U=[[D,B,D,N],[D,N,F,N],[F,N,F,B],[F,B,D,B]].map(A);if(!U.reduce((function(t,e){return t^!!o.segmentsIntersect(l,f,l+1e6,f+1e6,e[0],e[1],e[2],e[3])}),!1)){U.forEach((function(t){var e=o.segmentsIntersect(h,p,l,f,t[0],t[1],t[2],t[3]);e&&(h=e.x,p=e.y)}));var V=e.arrowwidth,q=e.arrowcolor,H=e.arrowside,G=O.append(\"g\").style({opacity:u.opacity(q)}).classed(\"annotation-arrow-g\",!0),W=G.append(\"path\").attr(\"d\",\"M\"+h+\",\"+p+\"L\"+l+\",\"+f).style(\"stroke-width\",V+\"px\").call(u.stroke,u.rgb(q));if(g(W,H,e),k.annotationPosition&&W.node().parentNode&&!a){var Y=l,X=f;if(e.standoff){var Z=Math.sqrt(Math.pow(l-h,2)+Math.pow(f-p,2));Y+=e.standoff*(h-l)/Z,X+=e.standoff*(p-f)/Z}var K,J,$=G.append(\"path\").classed(\"annotation-arrow\",!0).classed(\"anndrag\",!0).classed(\"cursor-move\",!0).attr({d:\"M3,3H-3V-3H3ZM0,0L\"+(h-Y)+\",\"+(p-X),transform:s(Y,X)}).style(\"stroke-width\",V+6+\"px\").call(u.stroke,\"rgba(0,0,0,0)\").call(u.fill,\"rgba(0,0,0,0)\");d.init({element:$.node(),gd:t,prepFn:function(){var t=c.getTranslate(R);K=t.x,J=t.y,y&&y.autorange&&M(y._name+\".autorange\",!0),x&&x.autorange&&M(x._name+\".autorange\",!0)},moveFn:function(t,r){var n=w(K,J),i=n[0]+t,a=n[1]+r;R.call(c.setTranslate,i,a),S(\"x\",m(y,t,\"x\",T,e)),S(\"y\",m(x,r,\"y\",T,e)),e.axref===e.xref&&S(\"ax\",m(y,t,\"ax\",T,e)),e.ayref===e.yref&&S(\"ay\",m(x,r,\"ay\",T,e)),G.attr(\"transform\",s(t,r)),I.attr({transform:\"rotate(\"+P+\",\"+i+\",\"+a+\")\"})},doneFn:function(){i.call(\"_guiRelayout\",t,E());var e=document.querySelector(\".js-notes-box-panel\");e&&e.redraw(e.selectedObj)}})}}};e.showarrow&&At(0,0),z&&d.init({element:R.node(),gd:t,prepFn:function(){kt=I.attr(\"transform\")},moveFn:function(t,r){var n=\"pointer\";if(e.showarrow)e.axref===e.xref?S(\"ax\",m(y,t,\"ax\",T,e)):S(\"ax\",e.ax+t),e.ayref===e.yref?S(\"ay\",m(x,r,\"ay\",T.w,e)):S(\"ay\",e.ay+r),At(t,r);else{if(a)return;var i,o;if(y)i=m(y,t,\"x\",T,e);else{var l=e._xsize/T.w,u=e.x+(e._xshift-e.xshift)/T.w-l/2;i=d.align(u+t/T.w,l,0,1,e.xanchor)}if(x)o=m(x,r,\"y\",T,e);else{var c=e._ysize/T.h,f=e.y-(e._yshift+e.yshift)/T.h-c/2;o=d.align(f-r/T.h,c,0,1,e.yanchor)}S(\"x\",i),S(\"y\",o),y&&x||(n=d.getCursor(y?.5:i,x?.5:o,e.xanchor,e.yanchor))}I.attr({transform:s(t,r)+kt}),p(R,n)},clickFn:function(r,n){e.captureevents&&t.emit(\"plotly_clickannotation\",W(n))},doneFn:function(){p(R),i.call(\"_guiRelayout\",t,E());var e=document.querySelector(\".js-notes-box-panel\");e&&e.redraw(e.selectedObj)}})}}}t.exports={draw:function(t){var e=t._fullLayout;e._infolayer.selectAll(\".annotation\").remove();for(var r=0;r=0,x=e.indexOf(\"end\")>=0,b=d.backoff*g+r.standoff,_=v.backoff*y+r.startstandoff;if(\"line\"===p.nodeName){o={x:+t.attr(\"x1\"),y:+t.attr(\"y1\")},c={x:+t.attr(\"x2\"),y:+t.attr(\"y2\")};var w=o.x-c.x,T=o.y-c.y;if(h=(f=Math.atan2(T,w))+Math.PI,b&&_&&b+_>Math.sqrt(w*w+T*T))return void z();if(b){if(b*b>w*w+T*T)return void z();var k=b*Math.cos(f),A=b*Math.sin(f);c.x+=k,c.y+=A,t.attr({x2:c.x,y2:c.y})}if(_){if(_*_>w*w+T*T)return void z();var M=_*Math.cos(f),S=_*Math.sin(f);o.x-=M,o.y-=S,t.attr({x1:o.x,y1:o.y})}}else if(\"path\"===p.nodeName){var E=p.getTotalLength(),L=\"\";if(E1){u=!0;break}}u?t.fullLayout._infolayer.select(\".annotation-\"+t.id+'[data-index=\"'+s+'\"]').remove():(l._pdata=i(t.glplot.cameraParams,[e.xaxis.r2l(l.x)*r[0],e.yaxis.r2l(l.y)*r[1],e.zaxis.r2l(l.z)*r[2]]),n(t.graphDiv,l,s,t.id,l._xa,l._ya))}}},56864:function(t,e,r){\"use strict\";var n=r(24040),i=r(3400);t.exports={moduleType:\"component\",name:\"annotations3d\",schema:{subplots:{scene:{annotations:r(45899)}}},layoutAttributes:r(45899),handleDefaults:r(52808),includeBasePlot:function(t,e){var r=n.subplotsRegistry.gl3d;if(r)for(var a=r.attrRegex,o=Object.keys(t),s=0;s=0))return t;if(3===o)n[o]>1&&(n[o]=1);else if(n[o]>=1)return t}var s=Math.round(255*n[0])+\", \"+Math.round(255*n[1])+\", \"+Math.round(255*n[2]);return a?\"rgba(\"+s+\", \"+n[3]+\")\":\"rgb(\"+s+\")\"}o.tinyRGB=function(t){var e=t.toRgb();return\"rgb(\"+Math.round(e.r)+\", \"+Math.round(e.g)+\", \"+Math.round(e.b)+\")\"},o.rgb=function(t){return o.tinyRGB(n(t))},o.opacity=function(t){return t?n(t).getAlpha():0},o.addOpacity=function(t,e){var r=n(t).toRgb();return\"rgba(\"+Math.round(r.r)+\", \"+Math.round(r.g)+\", \"+Math.round(r.b)+\", \"+e+\")\"},o.combine=function(t,e){var r=n(t).toRgb();if(1===r.a)return n(t).toRgbString();var i=n(e||u).toRgb(),a=1===i.a?i:{r:255*(1-i.a)+i.r*i.a,g:255*(1-i.a)+i.g*i.a,b:255*(1-i.a)+i.b*i.a},o={r:a.r*(1-r.a)+r.r*r.a,g:a.g*(1-r.a)+r.g*r.a,b:a.b*(1-r.a)+r.b*r.a};return n(o).toRgbString()},o.interpolate=function(t,e,r){var i=n(t).toRgb(),a=n(e).toRgb(),o={r:r*i.r+(1-r)*a.r,g:r*i.g+(1-r)*a.g,b:r*i.b+(1-r)*a.b};return n(o).toRgbString()},o.contrast=function(t,e,r){var i=n(t);return 1!==i.getAlpha()&&(i=n(o.combine(t,u))),(i.isDark()?e?i.lighten(e):u:r?i.darken(r):l).toString()},o.stroke=function(t,e){var r=n(e);t.style({stroke:o.tinyRGB(r),\"stroke-opacity\":r.getAlpha()})},o.fill=function(t,e){var r=n(e);t.style({fill:o.tinyRGB(r),\"fill-opacity\":r.getAlpha()})},o.clean=function(t){if(t&&\"object\"==typeof t){var e,r,n,i,s=Object.keys(t);for(e=0;e0?n>=l:n<=l));i++)n>c&&n0?n>=l:n<=l));i++)n>r[0]&&n1){var pt=Math.pow(10,Math.floor(Math.log(ht)/Math.LN10));ct*=pt*u.roundUp(ht/pt,[2,5,10]),(Math.abs(W.start)/W.size+1e-6)%1<2e-6&&(lt.tick0=0)}lt.dtick=ct}lt.domain=o?[ot+O/B.h,ot+Q-O/B.h]:[ot+P/B.w,ot+Q-P/B.w],lt.setScale(),t.attr(\"transform\",c(Math.round(B.l),Math.round(B.t)));var dt,vt=t.select(\".\"+A.cbtitleunshift).attr(\"transform\",c(-Math.round(B.l),-Math.round(B.t))),gt=lt.ticklabelposition,yt=lt.title.font.size,mt=t.select(\".\"+A.cbaxis),xt=0,bt=0;function _t(n,i){var a={propContainer:lt,propName:e._propPrefix+\"title\",traceIndex:e._traceIndex,_meta:e._meta,placeholder:F._dfltTitle.colorbar,containerGroup:t.select(\".\"+A.cbtitle)},o=\"h\"===n.charAt(0)?n.substr(1):\"h\"+n;t.selectAll(\".\"+o+\",.\"+o+\"-math-group\").remove(),v.draw(r,n,f(a,i||{}))}return u.syncOrAsync([a.previousPromises,function(){var t,e;(o&&ut||!o&&!ut)&&(\"top\"===V&&(t=P+B.l+tt*I,e=O+B.t+et*(1-ot-Q)+3+.75*yt),\"bottom\"===V&&(t=P+B.l+tt*I,e=O+B.t+et*(1-ot)-3-.25*yt),\"right\"===V&&(e=O+B.t+et*z+3+.75*yt,t=P+B.l+tt*ot),_t(lt._id+\"title\",{attributes:{x:t,y:e,\"text-anchor\":o?\"start\":\"middle\"}}))},function(){if(!o&&!ut||o&&ut){var a,l=t.select(\".\"+A.cbtitle),f=l.select(\"text\"),h=[-M/2,M/2],d=l.select(\".h\"+lt._id+\"title-math-group\").node(),v=15.6;if(f.node()&&(v=parseInt(f.node().style.fontSize,10)*w),d?(a=p.bBox(d),bt=a.width,(xt=a.height)>v&&(h[1]-=(xt-v)/2)):f.node()&&!f.classed(A.jsPlaceholder)&&(a=p.bBox(f.node()),bt=a.width,xt=a.height),o){if(xt){if(xt+=5,\"top\"===V)lt.domain[1]-=xt/B.h,h[1]*=-1;else{lt.domain[0]+=xt/B.h;var y=g.lineCount(f);h[1]+=(1-y)*v}l.attr(\"transform\",c(h[0],h[1])),lt.setScale()}}else bt&&(\"right\"===V&&(lt.domain[0]+=(bt+yt/2)/B.w),l.attr(\"transform\",c(h[0],h[1])),lt.setScale())}t.selectAll(\".\"+A.cbfills+\",.\"+A.cblines).attr(\"transform\",o?c(0,Math.round(B.h*(1-lt.domain[1]))):c(Math.round(B.w*lt.domain[0]),0)),mt.attr(\"transform\",o?c(0,Math.round(-B.t)):c(Math.round(-B.l),0));var m=t.select(\".\"+A.cbfills).selectAll(\"rect.\"+A.cbfill).attr(\"style\",\"\").data(X);m.enter().append(\"rect\").classed(A.cbfill,!0).attr(\"style\",\"\"),m.exit().remove();var x=q.map(lt.c2p).map(Math.round).sort((function(t,e){return t-e}));m.each((function(t,a){var s=[0===a?q[0]:(X[a]+X[a-1])/2,a===X.length-1?q[1]:(X[a]+X[a+1])/2].map(lt.c2p).map(Math.round);o&&(s[1]=u.constrain(s[1]+(s[1]>s[0])?1:-1,x[0],x[1]));var l=n.select(this).attr(o?\"x\":\"y\",rt).attr(o?\"y\":\"x\",n.min(s)).attr(o?\"width\":\"height\",Math.max(K,2)).attr(o?\"height\":\"width\",Math.max(n.max(s)-n.min(s),2));if(e._fillgradient)p.gradient(l,r,e._id,o?\"vertical\":\"horizontalreversed\",e._fillgradient,\"fill\");else{var c=G(t).replace(\"e-\",\"\");l.attr(\"fill\",i(c).toHexString())}}));var b=t.select(\".\"+A.cblines).selectAll(\"path.\"+A.cbline).data(j.color&&j.width?Z:[]);b.enter().append(\"path\").classed(A.cbline,!0),b.exit().remove(),b.each((function(t){var e=rt,r=Math.round(lt.c2p(t))+j.width/2%1;n.select(this).attr(\"d\",\"M\"+(o?e+\",\"+r:r+\",\"+e)+(o?\"h\":\"v\")+K).call(p.lineGroupStyle,j.width,H(t),j.dash)})),mt.selectAll(\"g.\"+lt._id+\"tick,path\").remove();var _=rt+K+(M||0)/2-(\"outside\"===e.ticks?1:0),T=s.calcTicks(lt),k=s.getTickSigns(lt)[2];return s.drawTicks(r,lt,{vals:\"inside\"===lt.ticks?s.clipEnds(lt,T):T,layer:mt,path:s.makeTickPath(lt,_,k),transFn:s.makeTransTickFn(lt)}),s.drawLabels(r,lt,{vals:T,layer:mt,transFn:s.makeTransTickLabelFn(lt),labelFns:s.makeLabelFns(lt,_)})},function(){if(o&&!ut||!o&&ut){var t,i,a=lt.position||0,s=lt._offset+lt._length/2;if(\"right\"===V)i=s,t=B.l+tt*a+10+yt*(lt.showticklabels?1:.5);else if(t=s,\"bottom\"===V&&(i=B.t+et*a+10+(-1===gt.indexOf(\"inside\")?lt.tickfont.size:0)+(\"intside\"!==lt.ticks&&e.ticklen||0)),\"top\"===V){var l=U.text.split(\"
\").length;i=B.t+et*a+10-K-w*yt*l}_t((o?\"h\":\"v\")+lt._id+\"title\",{avoid:{selection:n.select(r).selectAll(\"g.\"+lt._id+\"tick\"),side:V,offsetTop:o?0:B.t,offsetLeft:o?B.l:0,maxShift:o?F.width:F.height},attributes:{x:t,y:i,\"text-anchor\":\"middle\"},transform:{rotate:o?-90:0,offset:0}})}},a.previousPromises,function(){var n,s=K+M/2;-1===gt.indexOf(\"inside\")&&(n=p.bBox(mt.node()),s+=o?n.width:n.height),dt=vt.select(\"text\");var u=0,f=o&&\"top\"===V,v=!o&&\"right\"===V,g=0;if(dt.node()&&!dt.classed(A.jsPlaceholder)){var m,x=vt.select(\".h\"+lt._id+\"title-math-group\").node();x&&(o&&ut||!o&&!ut)?(u=(n=p.bBox(x)).width,m=n.height):(u=(n=p.bBox(vt.node())).right-B.l-(o?rt:st),m=n.bottom-B.t-(o?st:rt),o||\"top\"!==V||(s+=n.height,g=n.height)),v&&(dt.attr(\"transform\",c(u/2+yt/2,0)),u*=2),s=Math.max(s,o?u:m)}var b=2*(o?P:O)+s+S+M/2,w=0;!o&&U.text&&\"bottom\"===C&&z<=0&&(b+=w=b/2,g+=w),F._hColorbarMoveTitle=w,F._hColorbarMoveCBTitle=g;var N=S+M,j=(o?rt:st)-N/2-(o?P:0),q=(o?st:rt)-(o?$:O+g-w);t.select(\".\"+A.cbbg).attr(\"x\",j).attr(\"y\",q).attr(o?\"width\":\"height\",Math.max(b-w,2)).attr(o?\"height\":\"width\",Math.max($+N,2)).call(d.fill,E).call(d.stroke,e.bordercolor).style(\"stroke-width\",S);var H=v?Math.max(u-10,0):0;t.selectAll(\".\"+A.cboutline).attr(\"x\",(o?rt:st+P)+H).attr(\"y\",(o?st+O-$:rt)+(f?xt:0)).attr(o?\"width\":\"height\",Math.max(K,2)).attr(o?\"height\":\"width\",Math.max($-(o?2*O+xt:2*P+H),2)).call(d.stroke,e.outlinecolor).style({fill:\"none\",\"stroke-width\":M});var G=o?nt*b:0,W=o?0:(1-it)*b-g;if(G=R?B.l-G:-G,W=D?B.t-W:-W,t.attr(\"transform\",c(G,W)),!o&&(S||i(E).getAlpha()&&!i.equals(F.paper_bgcolor,E))){var Y=mt.selectAll(\"text\"),X=Y[0].length,Z=t.select(\".\"+A.cbbg).node(),J=p.bBox(Z),Q=p.getTranslate(t);Y.each((function(t,e){var r=X-1;if(0===e||e===r){var n,i=p.bBox(this),a=p.getTranslate(this);if(e===r){var o=i.right+a.x;(n=J.right+Q.x+st-S-2+I-o)>0&&(n=0)}else if(0===e){var s=i.left+a.x;(n=J.left+Q.x+st+S+2-s)<0&&(n=0)}n&&(X<3?this.setAttribute(\"transform\",\"translate(\"+n+\",0) \"+this.getAttribute(\"transform\")):this.setAttribute(\"visibility\",\"hidden\"))}}))}var tt={},et=T[L],at=k[L],ot=T[C],ct=k[C],ft=b-K;o?(\"pixels\"===h?(tt.y=z,tt.t=$*ot,tt.b=$*ct):(tt.t=tt.b=0,tt.yt=z+l*ot,tt.yb=z-l*ct),\"pixels\"===_?(tt.x=I,tt.l=b*et,tt.r=b*at):(tt.l=ft*et,tt.r=ft*at,tt.xl=I-y*et,tt.xr=I+y*at)):(\"pixels\"===h?(tt.x=I,tt.l=$*et,tt.r=$*at):(tt.l=tt.r=0,tt.xl=I+l*et,tt.xr=I-l*at),\"pixels\"===_?(tt.y=1-z,tt.t=b*ot,tt.b=b*ct):(tt.t=ft*ot,tt.b=ft*ct,tt.yt=z-y*ot,tt.yb=z+y*ct));var ht=e.y<.5?\"b\":\"t\",pt=e.x<.5?\"l\":\"r\";r._fullLayout._reservedMargin[e._id]={};var bt={r:F.width-j-G,l:j+tt.r,b:F.height-q-W,t:q+tt.b};R&&D?a.autoMargin(r,e._id,tt):R?r._fullLayout._reservedMargin[e._id][ht]=bt[ht]:D||o?r._fullLayout._reservedMargin[e._id][pt]=bt[pt]:r._fullLayout._reservedMargin[e._id][ht]=bt[ht]}],r)}(r,e,t);y&&y.then&&(t._promises||[]).push(y),t._context.edits.colorbarPosition&&function(t,e,r){var n,i,a,s=\"v\"===e.orientation,u=r._fullLayout._size;l.init({element:t.node(),gd:r,prepFn:function(){n=t.attr(\"transform\"),h(t)},moveFn:function(r,o){t.attr(\"transform\",n+c(r,o)),i=l.align((s?e._uFrac:e._vFrac)+r/u.w,s?e._thickFrac:e._lenFrac,0,1,e.xanchor),a=l.align((s?e._vFrac:1-e._uFrac)-o/u.h,s?e._lenFrac:e._thickFrac,0,1,e.yanchor);var f=l.getCursor(i,a,e.xanchor,e.yanchor);h(t,f)},doneFn:function(){if(h(t),void 0!==i&&void 0!==a){var n={};n[e._propPrefix+\"x\"]=i,n[e._propPrefix+\"y\"]=a,void 0!==e._traceIndex?o.call(\"_guiRestyle\",r,n,e._traceIndex):o.call(\"_guiRelayout\",r,n)}}})}(r,e,t)})),e.exit().each((function(e){a.autoMargin(t,e._id)})).remove(),e.order()}}},90553:function(t,e,r){\"use strict\";var n=r(3400);t.exports=function(t){return n.isPlainObject(t.colorbar)}},55080:function(t,e,r){\"use strict\";t.exports={moduleType:\"component\",name:\"colorbar\",attributes:r(42996),supplyDefaults:r(64013),draw:r(37848).draw,hasColorbar:r(90553)}},49084:function(t,e,r){\"use strict\";var n=r(42996),i=r(53756).counter,a=r(95376),o=r(88304).scales;function s(t){return\"`\"+t+\"`\"}a(o),t.exports=function(t,e){t=t||\"\";var r,a=(e=e||{}).cLetter||\"c\",l=(\"onlyIfNumerical\"in e?e.onlyIfNumerical:Boolean(t),\"noScale\"in e?e.noScale:\"marker.line\"===t),u=\"showScaleDflt\"in e?e.showScaleDflt:\"z\"===a,c=\"string\"==typeof e.colorscaleDflt?o[e.colorscaleDflt]:null,f=e.editTypeOverride||\"\",h=t?t+\".\":\"\";\"colorAttr\"in e?(r=e.colorAttr,e.colorAttr):s(h+(r={z:\"z\",c:\"color\"}[a]));var p=a+\"auto\",d=a+\"min\",v=a+\"max\",g=a+\"mid\",y=(s(h+p),s(h+d),s(h+v),{});y[d]=y[v]=void 0;var m={};m[p]=!1;var x={};return\"color\"===r&&(x.color={valType:\"color\",arrayOk:!0,editType:f||\"style\"},e.anim&&(x.color.anim=!0)),x[p]={valType:\"boolean\",dflt:!0,editType:\"calc\",impliedEdits:y},x[d]={valType:\"number\",dflt:null,editType:f||\"plot\",impliedEdits:m},x[v]={valType:\"number\",dflt:null,editType:f||\"plot\",impliedEdits:m},x[g]={valType:\"number\",dflt:null,editType:\"calc\",impliedEdits:y},x.colorscale={valType:\"colorscale\",editType:\"calc\",dflt:c,impliedEdits:{autocolorscale:!1}},x.autocolorscale={valType:\"boolean\",dflt:!1!==e.autoColorDflt,editType:\"calc\",impliedEdits:{colorscale:void 0}},x.reversescale={valType:\"boolean\",dflt:!1,editType:\"plot\"},l||(x.showscale={valType:\"boolean\",dflt:u,editType:\"calc\"},x.colorbar=n),e.noColorAxis||(x.coloraxis={valType:\"subplotid\",regex:i(\"coloraxis\"),dflt:null,editType:\"calc\"}),x}},47128:function(t,e,r){\"use strict\";var n=r(38248),i=r(3400),a=r(94288).extractOpts;t.exports=function(t,e,r){var o,s=t._fullLayout,l=r.vals,u=r.containerStr,c=u?i.nestedProperty(e,u).get():e,f=a(c),h=!1!==f.auto,p=f.min,d=f.max,v=f.mid,g=function(){return i.aggNums(Math.min,null,l)},y=function(){return i.aggNums(Math.max,null,l)};void 0===p?p=g():h&&(p=c._colorAx&&n(p)?Math.min(p,g()):g()),void 0===d?d=y():h&&(d=c._colorAx&&n(d)?Math.max(d,y()):y()),h&&void 0!==v&&(d-v>v-p?p=v-(d-v):d-v=0?s.colorscale.sequential:s.colorscale.sequentialminus,f._sync(\"colorscale\",o))}},95504:function(t,e,r){\"use strict\";var n=r(3400),i=r(94288).hasColorscale,a=r(94288).extractOpts;t.exports=function(t,e){function r(t,e){var r=t[\"_\"+e];void 0!==r&&(t[e]=r)}function o(t,i){var o=i.container?n.nestedProperty(t,i.container).get():t;if(o)if(o.coloraxis)o._colorAx=e[o.coloraxis];else{var s=a(o),l=s.auto;(l||void 0===s.min)&&r(o,i.min),(l||void 0===s.max)&&r(o,i.max),s.autocolorscale&&r(o,\"colorscale\")}}for(var s=0;s=0;n--,i++){var a=t[n];r[i]=[1-a[0],a[1]]}return r}function d(t,e){e=e||{};for(var r=t.domain,o=t.range,l=o.length,u=new Array(l),c=0;c4/3-s?o:s}},67416:function(t,e,r){\"use strict\";var n=r(3400),i=[[\"sw-resize\",\"s-resize\",\"se-resize\"],[\"w-resize\",\"move\",\"e-resize\"],[\"nw-resize\",\"n-resize\",\"ne-resize\"]];t.exports=function(t,e,r,a){return t=\"left\"===r?0:\"center\"===r?1:\"right\"===r?2:n.constrain(Math.floor(3*t),0,2),e=\"bottom\"===a?0:\"middle\"===a?1:\"top\"===a?2:n.constrain(Math.floor(3*e),0,2),i[e][t]}},72760:function(t,e){\"use strict\";e.selectMode=function(t){return\"lasso\"===t||\"select\"===t},e.drawMode=function(t){return\"drawclosedpath\"===t||\"drawopenpath\"===t||\"drawline\"===t||\"drawrect\"===t||\"drawcircle\"===t},e.openMode=function(t){return\"drawline\"===t||\"drawopenpath\"===t},e.rectMode=function(t){return\"select\"===t||\"drawline\"===t||\"drawrect\"===t||\"drawcircle\"===t},e.freeMode=function(t){return\"lasso\"===t||\"drawclosedpath\"===t||\"drawopenpath\"===t},e.selectingOrDrawing=function(t){return e.freeMode(t)||e.rectMode(t)}},86476:function(t,e,r){\"use strict\";var n=r(29128),i=r(52264),a=r(89184),o=r(3400).removeElement,s=r(33816),l=t.exports={};l.align=r(78316),l.getCursor=r(67416);var u=r(2616);function c(){var t=document.createElement(\"div\");t.className=\"dragcover\";var e=t.style;return e.position=\"fixed\",e.left=0,e.right=0,e.top=0,e.bottom=0,e.zIndex=999999999,e.background=\"none\",document.body.appendChild(t),t}function f(t){return n(t.changedTouches?t.changedTouches[0]:t,document.body)}l.unhover=u.wrapped,l.unhoverRaw=u.raw,l.init=function(t){var e,r,n,u,h,p,d,v,g=t.gd,y=1,m=g._context.doubleClickDelay,x=t.element;g._mouseDownTime||(g._mouseDownTime=0),x.style.pointerEvents=\"all\",x.onmousedown=_,a?(x._ontouchstart&&x.removeEventListener(\"touchstart\",x._ontouchstart),x._ontouchstart=_,x.addEventListener(\"touchstart\",_,{passive:!1})):x.ontouchstart=_;var b=t.clampFn||function(t,e,r){return Math.abs(t)m&&(y=Math.max(y-1,1)),g._dragged)t.doneFn&&t.doneFn();else if(t.clickFn&&t.clickFn(y,p),!v){var r;try{r=new MouseEvent(\"click\",e)}catch(t){var n=f(e);(r=document.createEvent(\"MouseEvents\")).initMouseEvent(\"click\",e.bubbles,e.cancelable,e.view,e.detail,e.screenX,e.screenY,n[0],n[1],e.ctrlKey,e.altKey,e.shiftKey,e.metaKey,e.button,e.relatedTarget)}d.dispatchEvent(r)}g._dragging=!1,g._dragged=!1}else g._dragged=!1}},l.coverSlip=c},2616:function(t,e,r){\"use strict\";var n=r(95924),i=r(91200),a=r(52200).getGraphDiv,o=r(92456),s=t.exports={};s.wrapped=function(t,e,r){(t=a(t))._fullLayout&&i.clear(t._fullLayout._uid+o.HOVERID),s.raw(t,e,r)},s.raw=function(t,e){var r=t._fullLayout,i=t._hoverdata;e||(e={}),e.target&&!t._dragged&&!1===n.triggerHandler(t,\"plotly_beforehover\",e)||(r._hoverlayer.selectAll(\"g\").remove(),r._hoverlayer.selectAll(\"line\").remove(),r._hoverlayer.selectAll(\"circle\").remove(),t._hoverdata=void 0,e.target&&i&&t.emit(\"plotly_unhover\",{event:e,points:i}))}},98192:function(t,e){\"use strict\";e.u={valType:\"string\",values:[\"solid\",\"dot\",\"dash\",\"longdash\",\"dashdot\",\"longdashdot\"],dflt:\"solid\",editType:\"style\"},e.c={shape:{valType:\"enumerated\",values:[\"\",\"/\",\"\\\\\",\"x\",\"-\",\"|\",\"+\",\".\"],dflt:\"\",arrayOk:!0,editType:\"style\"},fillmode:{valType:\"enumerated\",values:[\"replace\",\"overlay\"],dflt:\"replace\",editType:\"style\"},bgcolor:{valType:\"color\",arrayOk:!0,editType:\"style\"},fgcolor:{valType:\"color\",arrayOk:!0,editType:\"style\"},fgopacity:{valType:\"number\",editType:\"style\",min:0,max:1},size:{valType:\"number\",min:0,dflt:8,arrayOk:!0,editType:\"style\"},solidity:{valType:\"number\",min:0,max:1,dflt:.3,arrayOk:!0,editType:\"style\"},editType:\"style\"}},43616:function(t,e,r){\"use strict\";var n=r(33428),i=r(3400),a=i.numberFormat,o=r(38248),s=r(49760),l=r(24040),u=r(76308),c=r(8932),f=i.strTranslate,h=r(72736),p=r(9616),d=r(84284).LINE_SPACING,v=r(13448).DESELECTDIM,g=r(43028),y=r(7152),m=r(10624).appendArrayPointValue,x=t.exports={};function b(t,e,r,n){var i=e.fillpattern,a=e.fillgradient,o=i&&x.getPatternAttr(i.shape,0,\"\");if(o){var s=x.getPatternAttr(i.bgcolor,0,null),l=x.getPatternAttr(i.fgcolor,0,null),c=i.fgopacity,f=x.getPatternAttr(i.size,0,8),h=x.getPatternAttr(i.solidity,0,.3),p=e.uid;x.pattern(t,\"point\",r,p,o,f,h,void 0,i.fillmode,s,l,c)}else if(a&&\"none\"!==a.type){var d,v,g=a.type,y=\"scatterfill-\"+e.uid;n&&(y=\"legendfill-\"+e.uid),n||void 0===a.start&&void 0===a.stop?(\"horizontal\"===g&&(g+=\"reversed\"),t.call(x.gradient,r,y,g,a.colorscale,\"fill\")):(\"horizontal\"===g?(d={x:a.start,y:0},v={x:a.stop,y:0}):\"vertical\"===g&&(d={x:0,y:a.start},v={x:0,y:a.stop}),d.x=e._xA.c2p(void 0===d.x?e._extremes.x.min[0].val:d.x,!0),d.y=e._yA.c2p(void 0===d.y?e._extremes.y.min[0].val:d.y,!0),v.x=e._xA.c2p(void 0===v.x?e._extremes.x.max[0].val:v.x,!0),v.y=e._yA.c2p(void 0===v.y?e._extremes.y.max[0].val:v.y,!0),t.call(M,r,y,\"linear\",a.colorscale,\"fill\",d,v,!0,!1))}else e.fillcolor&&t.call(u.fill,e.fillcolor)}x.font=function(t,e,r,n,a,o,s){i.isPlainObject(e)&&(s=e.variant,o=e.style,a=e.weight,n=e.color,r=e.size,e=e.family),e&&t.style(\"font-family\",e),r+1&&t.style(\"font-size\",r+\"px\"),n&&t.call(u.fill,n),a&&t.style(\"font-weight\",a),o&&t.style(\"font-style\",o),s&&t.style(\"font-variant\",s)},x.setPosition=function(t,e,r){t.attr(\"x\",e).attr(\"y\",r)},x.setSize=function(t,e,r){t.attr(\"width\",e).attr(\"height\",r)},x.setRect=function(t,e,r,n,i){t.call(x.setPosition,e,r).call(x.setSize,n,i)},x.translatePoint=function(t,e,r,n){var i=r.c2p(t.x),a=n.c2p(t.y);return!!(o(i)&&o(a)&&e.node())&&(\"text\"===e.node().nodeName?e.attr(\"x\",i).attr(\"y\",a):e.attr(\"transform\",f(i,a)),!0)},x.translatePoints=function(t,e,r){t.each((function(t){var i=n.select(this);x.translatePoint(t,i,e,r)}))},x.hideOutsideRangePoint=function(t,e,r,n,i,a){e.attr(\"display\",r.isPtWithinRange(t,i)&&n.isPtWithinRange(t,a)?null:\"none\")},x.hideOutsideRangePoints=function(t,e){if(e._hasClipOnAxisFalse){var r=e.xaxis,i=e.yaxis;t.each((function(e){var a=e[0].trace,o=a.xcalendar,s=a.ycalendar,u=l.traceIs(a,\"bar-like\")?\".bartext\":\".point,.textpoint\";t.selectAll(u).each((function(t){x.hideOutsideRangePoint(t,n.select(this),r,i,o,s)}))}))}},x.crispRound=function(t,e,r){return e&&o(e)?t._context.staticPlot?e:e<1?1:Math.round(e):r||0},x.singleLineStyle=function(t,e,r,n,i){e.style(\"fill\",\"none\");var a=(((t||[])[0]||{}).trace||{}).line||{},o=r||a.width||0,s=i||a.dash||\"\";u.stroke(e,n||a.color),x.dashLine(e,s,o)},x.lineGroupStyle=function(t,e,r,i){t.style(\"fill\",\"none\").each((function(t){var a=(((t||[])[0]||{}).trace||{}).line||{},o=e||a.width||0,s=i||a.dash||\"\";n.select(this).call(u.stroke,r||a.color).call(x.dashLine,s,o)}))},x.dashLine=function(t,e,r){r=+r||0,e=x.dashStyle(e,r),t.style({\"stroke-dasharray\":e,\"stroke-width\":r+\"px\"})},x.dashStyle=function(t,e){e=+e||1;var r=Math.max(e,3);return\"solid\"===t?t=\"\":\"dot\"===t?t=r+\"px,\"+r+\"px\":\"dash\"===t?t=3*r+\"px,\"+3*r+\"px\":\"longdash\"===t?t=5*r+\"px,\"+5*r+\"px\":\"dashdot\"===t?t=3*r+\"px,\"+r+\"px,\"+r+\"px,\"+r+\"px\":\"longdashdot\"===t&&(t=5*r+\"px,\"+2*r+\"px,\"+r+\"px,\"+2*r+\"px\"),t},x.singleFillStyle=function(t,e){var r=n.select(t.node());b(t,((r.data()[0]||[])[0]||{}).trace||{},e,!1)},x.fillGroupStyle=function(t,e,r){t.style(\"stroke-width\",0).each((function(t){var i=n.select(this);t[0].trace&&b(i,t[0].trace,e,r)}))};var _=r(71984);x.symbolNames=[],x.symbolFuncs=[],x.symbolBackOffs=[],x.symbolNeedLines={},x.symbolNoDot={},x.symbolNoFill={},x.symbolList=[],Object.keys(_).forEach((function(t){var e=_[t],r=e.n;x.symbolList.push(r,String(r),t,r+100,String(r+100),t+\"-open\"),x.symbolNames[r]=t,x.symbolFuncs[r]=e.f,x.symbolBackOffs[r]=e.backoff||0,e.needLine&&(x.symbolNeedLines[r]=!0),e.noDot?x.symbolNoDot[r]=!0:x.symbolList.push(r+200,String(r+200),t+\"-dot\",r+300,String(r+300),t+\"-open-dot\"),e.noFill&&(x.symbolNoFill[r]=!0)}));var w=x.symbolNames.length;function T(t,e,r,n){var i=t%100;return x.symbolFuncs[i](e,r,n)+(t>=200?\"M0,0.5L0.5,0L0,-0.5L-0.5,0Z\":\"\")}x.symbolNumber=function(t){if(o(t))t=+t;else if(\"string\"==typeof t){var e=0;t.indexOf(\"-open\")>0&&(e=100,t=t.replace(\"-open\",\"\")),t.indexOf(\"-dot\")>0&&(e+=200,t=t.replace(\"-dot\",\"\")),(t=x.symbolNames.indexOf(t))>=0&&(t+=e)}return t%100>=w||t>=400?0:Math.floor(Math.max(t,0))};var k=a(\"~f\"),A={radial:{type:\"radial\"},radialreversed:{type:\"radial\",reversed:!0},horizontal:{type:\"linear\",start:{x:1,y:0},stop:{x:0,y:0}},horizontalreversed:{type:\"linear\",start:{x:1,y:0},stop:{x:0,y:0},reversed:!0},vertical:{type:\"linear\",start:{x:0,y:1},stop:{x:0,y:0}},verticalreversed:{type:\"linear\",start:{x:0,y:1},stop:{x:0,y:0},reversed:!0}};function M(t,e,r,a,o,l,c,f,h,p){var d,v=o.length;\"linear\"===a?d={node:\"linearGradient\",attrs:{x1:c.x,y1:c.y,x2:f.x,y2:f.y,gradientUnits:h?\"userSpaceOnUse\":\"objectBoundingBox\"},reversed:p}:\"radial\"===a&&(d={node:\"radialGradient\",reversed:p});for(var g=new Array(v),y=0;y=0&&void 0===t.i&&(t.i=o.i),e.style(\"opacity\",n.selectedOpacityFn?n.selectedOpacityFn(t):void 0===t.mo?s.opacity:t.mo),n.ms2mrc){var c;c=\"various\"===t.ms||\"various\"===s.size?3:n.ms2mrc(t.ms),t.mrc=c,n.selectedSizeFn&&(c=t.mrc=n.selectedSizeFn(t));var f=x.symbolNumber(t.mx||s.symbol)||0;t.om=f%200>=100;var h=et(t,r),p=H(t,r);e.attr(\"d\",T(f,c,h,p))}var d,v,g,y=!1;if(t.so)g=l.outlierwidth,v=l.outliercolor,d=s.outliercolor;else{var m=(l||{}).width;g=(t.mlw+1||m+1||(t.trace?(t.trace.marker.line||{}).width:0)+1)-1||0,v=\"mlc\"in t?t.mlcc=n.lineScale(t.mlc):i.isArrayOrTypedArray(l.color)?u.defaultLine:l.color,i.isArrayOrTypedArray(s.color)&&(d=u.defaultLine,y=!0),d=\"mc\"in t?t.mcc=n.markerScale(t.mc):s.color||s.colors||\"rgba(0,0,0,0)\",n.selectedColorFn&&(d=n.selectedColorFn(t))}if(t.om)e.call(u.stroke,d).style({\"stroke-width\":(g||1)+\"px\",fill:\"none\"});else{e.style(\"stroke-width\",(t.isBlank?0:g)+\"px\");var b=s.gradient,_=t.mgt;_?y=!0:_=b&&b.type,i.isArrayOrTypedArray(_)&&(_=_[0],A[_]||(_=0));var w=s.pattern,k=w&&x.getPatternAttr(w.shape,t.i,\"\");if(_&&\"none\"!==_){var M=t.mgc;M?y=!0:M=b.color;var S=r.uid;y&&(S+=\"-\"+t.i),x.gradient(e,a,S,_,[[0,M],[1,d]],\"fill\")}else if(k){var E=!1,L=w.fgcolor;!L&&o&&o.color&&(L=o.color,E=!0);var C=x.getPatternAttr(L,t.i,o&&o.color||null),P=x.getPatternAttr(w.bgcolor,t.i,null),O=w.fgopacity,I=x.getPatternAttr(w.size,t.i,8),z=x.getPatternAttr(w.solidity,t.i,.3);E=E||t.mcc||i.isArrayOrTypedArray(w.shape)||i.isArrayOrTypedArray(w.bgcolor)||i.isArrayOrTypedArray(w.fgcolor)||i.isArrayOrTypedArray(w.size)||i.isArrayOrTypedArray(w.solidity);var D=r.uid;E&&(D+=\"-\"+t.i),x.pattern(e,\"point\",a,D,k,I,z,t.mcc,w.fillmode,P,C,O)}else i.isArrayOrTypedArray(d)?u.fill(e,d[t.i]):u.fill(e,d);g&&u.stroke(e,v)}},x.makePointStyleFns=function(t){var e={},r=t.marker;return e.markerScale=x.tryColorscale(r,\"\"),e.lineScale=x.tryColorscale(r,\"line\"),l.traceIs(t,\"symbols\")&&(e.ms2mrc=g.isBubble(t)?y(t):function(){return(r.size||6)/2}),t.selectedpoints&&i.extendFlat(e,x.makeSelectedPointStyleFns(t)),e},x.makeSelectedPointStyleFns=function(t){var e={},r=t.selected||{},n=t.unselected||{},a=t.marker||{},o=r.marker||{},s=n.marker||{},u=a.opacity,c=o.opacity,f=s.opacity,h=void 0!==c,p=void 0!==f;(i.isArrayOrTypedArray(u)||h||p)&&(e.selectedOpacityFn=function(t){var e=void 0===t.mo?a.opacity:t.mo;return t.selected?h?c:e:p?f:v*e});var d=a.color,g=o.color,y=s.color;(g||y)&&(e.selectedColorFn=function(t){var e=t.mcc||d;return t.selected?g||e:y||e});var m=a.size,x=o.size,b=s.size,_=void 0!==x,w=void 0!==b;return l.traceIs(t,\"symbols\")&&(_||w)&&(e.selectedSizeFn=function(t){var e=t.mrc||m/2;return t.selected?_?x/2:e:w?b/2:e}),e},x.makeSelectedTextStyleFns=function(t){var e={},r=t.selected||{},n=t.unselected||{},i=t.textfont||{},a=r.textfont||{},o=n.textfont||{},s=i.color,l=a.color,c=o.color;return e.selectedTextColorFn=function(t){var e=t.tc||s;return t.selected?l||e:c||(l?e:u.addOpacity(e,v))},e},x.selectedPointStyle=function(t,e){if(t.size()&&e.selectedpoints){var r=x.makeSelectedPointStyleFns(e),i=e.marker||{},a=[];r.selectedOpacityFn&&a.push((function(t,e){t.style(\"opacity\",r.selectedOpacityFn(e))})),r.selectedColorFn&&a.push((function(t,e){u.fill(t,r.selectedColorFn(e))})),r.selectedSizeFn&&a.push((function(t,n){var a=n.mx||i.symbol||0,o=r.selectedSizeFn(n);t.attr(\"d\",T(x.symbolNumber(a),o,et(n,e),H(n,e))),n.mrc2=o})),a.length&&t.each((function(t){for(var e=n.select(this),r=0;r0?r:0}function O(t,e,r){return r&&(t=B(t)),e?z(t[1]):I(t[0])}function I(t){var e=n.round(t,2);return S=e,e}function z(t){var e=n.round(t,2);return E=e,e}function D(t,e,r,n){var i=t[0]-e[0],a=t[1]-e[1],o=r[0]-e[0],s=r[1]-e[1],l=Math.pow(i*i+a*a,.25),u=Math.pow(o*o+s*s,.25),c=(u*u*i-l*l*o)*n,f=(u*u*a-l*l*s)*n,h=3*u*(l+u),p=3*l*(l+u);return[[I(e[0]+(h&&c/h)),z(e[1]+(h&&f/h))],[I(e[0]-(p&&c/p)),z(e[1]-(p&&f/p))]]}x.textPointStyle=function(t,e,r){if(t.size()){var a;if(e.selectedpoints){var o=x.makeSelectedTextStyleFns(e);a=o.selectedTextColorFn}var s=e.texttemplate,l=r._fullLayout;t.each((function(t){var o=n.select(this),u=s?i.extractOption(t,e,\"txt\",\"texttemplate\"):i.extractOption(t,e,\"tx\",\"text\");if(u||0===u){if(s){var c=e._module.formatLabels,f=c?c(t,e,l):{},p={};m(p,e,t.i);var d=e._meta||{};u=i.texttemplateString(u,f,l._d3locale,p,t,d)}var v=t.tp||e.textposition,g=P(t,e),y=a?a(t):t.tc||e.textfont.color;o.call(x.font,{family:t.tf||e.textfont.family,weight:t.tw||e.textfont.weight,style:t.ty||e.textfont.style,variant:t.tv||e.textfont.variant,size:g,color:y}).text(u).call(h.convertToTspans,r).call(C,v,g,t.mrc)}else o.remove()}))}},x.selectedTextStyle=function(t,e){if(t.size()&&e.selectedpoints){var r=x.makeSelectedTextStyleFns(e);t.each((function(t){var i=n.select(this),a=r.selectedTextColorFn(t),o=t.tp||e.textposition,s=P(t,e);u.fill(i,a);var c=l.traceIs(e,\"bar-like\");C(i,o,s,t.mrc2||t.mrc,c)}))}},x.smoothopen=function(t,e){if(t.length<3)return\"M\"+t.join(\"L\");var r,n=\"M\"+t[0],i=[];for(r=1;r=u||w>=f&&w<=u)&&(T<=h&&T>=c||T>=h&&T<=c)&&(t=[w,T])}return t}x.steps=function(t){var e=R[t]||F;return function(t){for(var r=\"M\"+I(t[0][0])+\",\"+z(t[0][1]),n=t.length,i=1;i=1e4&&(x.savedBBoxes={},N=0),r&&(x.savedBBoxes[r]=g),N++,i.extendFlat({},g)},x.setClipUrl=function(t,e,r){t.attr(\"clip-path\",U(e,r))},x.getTranslate=function(t){var e=(t[t.attr?\"attr\":\"getAttribute\"](\"transform\")||\"\").replace(/.*\\btranslate\\((-?\\d*\\.?\\d*)[^-\\d]*(-?\\d*\\.?\\d*)[^\\d].*/,(function(t,e,r){return[e,r].join(\" \")})).split(\" \");return{x:+e[0]||0,y:+e[1]||0}},x.setTranslate=function(t,e,r){var n=t.attr?\"attr\":\"getAttribute\",i=t.attr?\"attr\":\"setAttribute\",a=t[n](\"transform\")||\"\";return e=e||0,r=r||0,a=a.replace(/(\\btranslate\\(.*?\\);?)/,\"\").trim(),a=(a+=f(e,r)).trim(),t[i](\"transform\",a),a},x.getScale=function(t){var e=(t[t.attr?\"attr\":\"getAttribute\"](\"transform\")||\"\").replace(/.*\\bscale\\((\\d*\\.?\\d*)[^\\d]*(\\d*\\.?\\d*)[^\\d].*/,(function(t,e,r){return[e,r].join(\" \")})).split(\" \");return{x:+e[0]||1,y:+e[1]||1}},x.setScale=function(t,e,r){var n=t.attr?\"attr\":\"getAttribute\",i=t.attr?\"attr\":\"setAttribute\",a=t[n](\"transform\")||\"\";return e=e||1,r=r||1,a=a.replace(/(\\bscale\\(.*?\\);?)/,\"\").trim(),a=(a+=\"scale(\"+e+\",\"+r+\")\").trim(),t[i](\"transform\",a),a};var V=/\\s*sc.*/;x.setPointGroupScale=function(t,e,r){if(e=e||1,r=r||1,t){var n=1===e&&1===r?\"\":\"scale(\"+e+\",\"+r+\")\";t.each((function(){var t=(this.getAttribute(\"transform\")||\"\").replace(V,\"\");t=(t+=n).trim(),this.setAttribute(\"transform\",t)}))}};var q=/translate\\([^)]*\\)\\s*$/;function H(t,e){var r;return t&&(r=t.mf),void 0===r&&(r=e.marker&&e.marker.standoff||0),e._geo||e._xA?r:-r}x.setTextPointsScale=function(t,e,r){t&&t.each((function(){var t,i=n.select(this),a=i.select(\"text\");if(a.node()){var o=parseFloat(a.attr(\"x\")||0),s=parseFloat(a.attr(\"y\")||0),l=(i.attr(\"transform\")||\"\").match(q);t=1===e&&1===r?[]:[f(o,s),\"scale(\"+e+\",\"+r+\")\",f(-o,-s)],l&&t.push(l),i.attr(\"transform\",t.join(\"\"))}}))},x.getMarkerStandoff=H;var G,W,Y,X,Z,K,J=Math.atan2,$=Math.cos,Q=Math.sin;function tt(t,e){var r=e[0],n=e[1];return[r*$(t)-n*Q(t),r*Q(t)+n*$(t)]}function et(t,e){var r,n,a=t.ma;void 0===a&&((a=e.marker.angle)&&!i.isArrayOrTypedArray(a)||(a=0));var s=e.marker.angleref;if(\"previous\"===s||\"north\"===s){if(e._geo){var l=e._geo.project(t.lonlat);r=l[0],n=l[1]}else{var u=e._xA,c=e._yA;if(!u||!c)return 90;r=u.c2p(t.x),n=c.c2p(t.y)}if(e._geo){var f,h=t.lonlat[0],p=t.lonlat[1],d=e._geo.project([h,p+1e-5]),v=e._geo.project([h+1e-5,p]),g=J(v[1]-n,v[0]-r),y=J(d[1]-n,d[0]-r);if(\"north\"===s)f=a/180*Math.PI;else if(\"previous\"===s){var m=h/180*Math.PI,x=p/180*Math.PI,b=G/180*Math.PI,_=W/180*Math.PI,w=b-m,T=$(_)*Q(w),k=Q(_)*$(x)-$(_)*Q(x)*$(w);f=-J(T,k)-Math.PI,G=h,W=p}var A=tt(g,[$(f),0]),M=tt(y,[Q(f),0]);a=J(A[1]+M[1],A[0]+M[0])/Math.PI*180,\"previous\"!==s||K===e.uid&&t.i===Z+1||(a=null)}if(\"previous\"===s&&!e._geo)if(K===e.uid&&t.i===Z+1&&o(r)&&o(n)){var S=r-Y,E=n-X,L=e.line&&e.line.shape||\"\",C=L.slice(L.length-1);\"h\"===C&&(E=0),\"v\"===C&&(S=0),a+=J(E,S)/Math.PI*180+90}else a=null}return Y=r,X=n,Z=t.i,K=e.uid,a}x.getMarkerAngle=et},71984:function(t,e,r){\"use strict\";var n,i,a,o,s=r(21984),l=r(33428).round,u=\"M0,0Z\",c=Math.sqrt(2),f=Math.sqrt(3),h=Math.PI,p=Math.cos,d=Math.sin;function v(t){return null===t}function g(t,e,r){if(!(t&&t%360!=0||e))return r;if(a===t&&o===e&&n===r)return i;function l(t,r){var n=p(t),i=d(t),a=r[0],o=r[1]+(e||0);return[a*n-o*i,a*i+o*n]}a=t,o=e,n=r;for(var u=t/180*h,c=0,f=0,v=s(r),g=\"\",y=0;y0,f=t._context.staticPlot;e.each((function(e){var h,p=e[0].trace,d=p.error_x||{},v=p.error_y||{};p.ids&&(h=function(t){return t.id});var g=o.hasMarkers(p)&&p.marker.maxdisplayed>0;v.visible||d.visible||(e=[]);var y=n.select(this).selectAll(\"g.errorbar\").data(e,h);if(y.exit().remove(),e.length){d.visible||y.selectAll(\"path.xerror\").remove(),v.visible||y.selectAll(\"path.yerror\").remove(),y.style(\"opacity\",1);var m=y.enter().append(\"g\").classed(\"errorbar\",!0);c&&m.style(\"opacity\",0).transition().duration(s.duration).style(\"opacity\",1),a.setClipUrl(y,r.layerClipId,t),y.each((function(t){var e=n.select(this),r=function(t,e,r){var n={x:e.c2p(t.x),y:r.c2p(t.y)};return void 0!==t.yh&&(n.yh=r.c2p(t.yh),n.ys=r.c2p(t.ys),i(n.ys)||(n.noYS=!0,n.ys=r.c2p(t.ys,!0))),void 0!==t.xh&&(n.xh=e.c2p(t.xh),n.xs=e.c2p(t.xs),i(n.xs)||(n.noXS=!0,n.xs=e.c2p(t.xs,!0))),n}(t,l,u);if(!g||t.vis){var a,o=e.select(\"path.yerror\");if(v.visible&&i(r.x)&&i(r.yh)&&i(r.ys)){var h=v.width;a=\"M\"+(r.x-h)+\",\"+r.yh+\"h\"+2*h+\"m-\"+h+\",0V\"+r.ys,r.noYS||(a+=\"m-\"+h+\",0h\"+2*h),o.size()?c&&(o=o.transition().duration(s.duration).ease(s.easing)):o=e.append(\"path\").style(\"vector-effect\",f?\"none\":\"non-scaling-stroke\").classed(\"yerror\",!0),o.attr(\"d\",a)}else o.remove();var p=e.select(\"path.xerror\");if(d.visible&&i(r.y)&&i(r.xh)&&i(r.xs)){var y=(d.copy_ystyle?v:d).width;a=\"M\"+r.xh+\",\"+(r.y-y)+\"v\"+2*y+\"m0,-\"+y+\"H\"+r.xs,r.noXS||(a+=\"m0,-\"+y+\"v\"+2*y),p.size()?c&&(p=p.transition().duration(s.duration).ease(s.easing)):p=e.append(\"path\").style(\"vector-effect\",f?\"none\":\"non-scaling-stroke\").classed(\"xerror\",!0),p.attr(\"d\",a)}else p.remove()}}))}}))}},92036:function(t,e,r){\"use strict\";var n=r(33428),i=r(76308);t.exports=function(t){t.each((function(t){var e=t[0].trace,r=e.error_y||{},a=e.error_x||{},o=n.select(this);o.selectAll(\"path.yerror\").style(\"stroke-width\",r.thickness+\"px\").call(i.stroke,r.color),a.copy_ystyle&&(a=r),o.selectAll(\"path.xerror\").style(\"stroke-width\",a.thickness+\"px\").call(i.stroke,a.color)}))}},55756:function(t,e,r){\"use strict\";var n=r(25376),i=r(65460).hoverlabel,a=r(92880).extendFlat;t.exports={hoverlabel:{bgcolor:a({},i.bgcolor,{arrayOk:!0}),bordercolor:a({},i.bordercolor,{arrayOk:!0}),font:n({arrayOk:!0,editType:\"none\"}),align:a({},i.align,{arrayOk:!0}),namelength:a({},i.namelength,{arrayOk:!0}),editType:\"none\"}}},55056:function(t,e,r){\"use strict\";var n=r(3400),i=r(24040);function a(t,e,r,i){i=i||n.identity,Array.isArray(t)&&(e[0][r]=i(t))}t.exports=function(t){var e=t.calcdata,r=t._fullLayout;function o(t){return function(e){return n.coerceHoverinfo({hoverinfo:e},{_module:t._module},r)}}for(var s=0;s=0&&r.indexZ[0]._length||bt<0||bt>K[0]._length)return v.unhoverRaw(t,e)}else xt=\"xpx\"in e?e.xpx:Z[0]._length/2,bt=\"ypx\"in e?e.ypx:K[0]._length/2;if(e.pointerX=xt+Z[0]._offset,e.pointerY=bt+K[0]._offset,rt=\"xval\"in e?m.flat(x,e.xval):m.p2c(Z,xt),nt=\"yval\"in e?m.flat(x,e.yval):m.p2c(K,bt),!i(rt[0])||!i(nt[0]))return o.warn(\"Fx.hover failed\",e,t),v.unhoverRaw(t,e)}var kt=1/0;function At(r,n){for(at=0;atdt&&(vt.splice(0,dt),kt=vt[0].distance),A&&0!==et&&0===vt.length){pt.distance=et,pt.index=!1;var c=st._module.hoverPoints(pt,ft,ht,\"closest\",{hoverLayer:b._hoverlayer});if(c&&(c=c.filter((function(t){return t.spikeDistance<=et}))),c&&c.length){var f,h=c.filter((function(t){return t.xa.showspikes&&\"hovered data\"!==t.xa.spikesnap}));if(h.length){var p=h[0];i(p.x0)&&i(p.y0)&&(f=St(p),(!yt.vLinePoint||yt.vLinePoint.spikeDistance>f.spikeDistance)&&(yt.vLinePoint=f))}var v=c.filter((function(t){return t.ya.showspikes&&\"hovered data\"!==t.ya.spikesnap}));if(v.length){var g=v[0];i(g.x0)&&i(g.y0)&&(f=St(g),(!yt.hLinePoint||yt.hLinePoint.spikeDistance>f.spikeDistance)&&(yt.hLinePoint=f))}}}}}function Mt(t,e,r){for(var n,i=null,a=1/0,o=0;o0&&Math.abs(t.distance)Bt-1;Nt--)qt(vt[Nt]);vt=jt,Pt()}var Ht=t._hoverdata,Gt=[],Wt=q(t),Yt=H(t);for(it=0;it1||vt.length>1)||\"closest\"===M&&mt&&vt.length>1,oe=d.combine(b.plot_bgcolor||d.background,b.paper_bgcolor),se=z(vt,{gd:t,hovermode:M,rotateLabels:ae,bgColor:oe,container:b._hoverlayer,outerContainer:b._paper.node(),commonLabelOpts:b.hoverlabel,hoverdistance:b.hoverdistance}),le=se.hoverLabels;if(m.isUnifiedHover(M)||(function(t,e,r,n){var i,a,o,s,l,u,c,f=e?\"xa\":\"ya\",h=e?\"ya\":\"xa\",p=0,d=1,v=t.size(),g=new Array(v),y=0,m=n.minX,x=n.maxX,b=n.minY,_=n.maxY,w=function(t){return t*r._invScaleX},T=function(t){return t*r._invScaleY};function A(t){var e=t[0],r=t[t.length-1];if(a=e.pmin-e.pos-e.dp+e.size,o=r.pos+r.dp+r.size-e.pmax,a>.01){for(l=t.length-1;l>=0;l--)t[l].dp+=a;i=!1}if(!(o<.01)){if(a<-.01){for(l=t.length-1;l>=0;l--)t[l].dp-=o;i=!1}if(i){var n=0;for(s=0;se.pmax&&n++;for(s=t.length-1;s>=0&&!(n<=0);s--)(u=t[s]).pos>e.pmax-1&&(u.del=!0,n--);for(s=0;s=0;l--)t[l].dp-=o;for(s=t.length-1;s>=0&&!(n<=0);s--)(u=t[s]).pos+u.dp+u.size>e.pmax&&(u.del=!0,n--)}}}for(t.each((function(t){var n=t[f],i=t[h],a=\"x\"===n._id.charAt(0),o=n.range;0===y&&o&&o[0]>o[1]!==a&&(d=-1);var s=0,l=a?r.width:r.height;if(\"x\"===r.hovermode||\"y\"===r.hovermode){var u,c,p=R(t,e),v=t.anchor,A=\"end\"===v?-1:1;if(\"middle\"===v)c=(u=t.crossPos+(a?T(p.y-t.by/2):w(t.bx/2+t.tx2width/2)))+(a?T(t.by):w(t.bx));else if(a)c=(u=t.crossPos+T(S+p.y)-T(t.by/2-S))+T(t.by);else{var M=w(A*S+p.x),E=M+w(A*t.bx);u=t.crossPos+Math.min(M,E),c=t.crossPos+Math.max(M,E)}a?void 0!==b&&void 0!==_&&Math.min(c,_)-Math.max(u,b)>1&&(\"left\"===i.side?(s=i._mainLinePosition,l=r.width):l=i._mainLinePosition):void 0!==m&&void 0!==x&&Math.min(c,x)-Math.max(u,m)>1&&(\"top\"===i.side?(s=i._mainLinePosition,l=r.height):l=i._mainLinePosition)}g[y++]=[{datum:t,traceIndex:t.trace.index,dp:0,pos:t.pos,posref:t.posref,size:t.by*(a?k:1)/2,pmin:s,pmax:l}]})),g.sort((function(t,e){return t[0].posref-e[0].posref||d*(e[0].traceIndex-t[0].traceIndex)}));!i&&p<=v;){for(p++,i=!0,s=0;s.01&&L.pmin===C.pmin&&L.pmax===C.pmax){for(l=E.length-1;l>=0;l--)E[l].dp+=a;for(M.push.apply(M,E),g.splice(s+1,1),c=0,l=M.length-1;l>=0;l--)c+=M[l].dp;for(o=c/M.length,l=M.length-1;l>=0;l--)M[l].dp-=o;i=!1}else s++}g.forEach(A)}for(s=g.length-1;s>=0;s--){var P=g[s];for(l=P.length-1;l>=0;l--){var O=P[l],I=O.datum;I.offset=O.dp,I.del=O.del}}}(le,ae,b,se.commonLabelBoundingBox),F(le,ae,b._invScaleX,b._invScaleY)),l&&l.tagName){var ue=y.getComponentMethod(\"annotations\",\"hasClickToShow\")(t,Gt);h(n.select(l),ue?\"pointer\":\"\")}l&&!a&&function(t,e,r){if(!r||r.length!==t._hoverdata.length)return!0;for(var n=r.length-1;n>=0;n--){var i=r[n],a=t._hoverdata[n];if(i.curveNumber!==a.curveNumber||String(i.pointNumber)!==String(a.pointNumber)||String(i.pointNumbers)!==String(a.pointNumbers))return!0}return!1}(t,0,Ht)&&(Ht&&t.emit(\"plotly_unhover\",{event:e,points:Ht}),t.emit(\"plotly_hover\",{event:e,points:t._hoverdata,xaxes:Z,yaxes:K,xvals:rt,yvals:nt}))}(t,e,r,a,l)}))},e.loneHover=function(t,e){var r=!0;Array.isArray(t)||(r=!1,t=[t]);var i=e.gd,a=q(i),o=H(i),s=z(t.map((function(t){var r=t._x0||t.x0||t.x||0,n=t._x1||t.x1||t.x||0,s=t._y0||t.y0||t.y||0,l=t._y1||t.y1||t.y||0,u=t.eventData;if(u){var c=Math.min(r,n),f=Math.max(r,n),h=Math.min(s,l),p=Math.max(s,l),v=t.trace;if(y.traceIs(v,\"gl3d\")){var g=i._fullLayout[v.scene]._scene.container,m=g.offsetLeft,x=g.offsetTop;c+=m,f+=m,h+=x,p+=x}u.bbox={x0:c+o,x1:f+o,y0:h+a,y1:p+a},e.inOut_bbox&&e.inOut_bbox.push(u.bbox)}else u=!1;return{color:t.color||d.defaultLine,x0:t.x0||t.x||0,x1:t.x1||t.x||0,y0:t.y0||t.y||0,y1:t.y1||t.y||0,xLabel:t.xLabel,yLabel:t.yLabel,zLabel:t.zLabel,text:t.text,name:t.name,idealAlign:t.idealAlign,borderColor:t.borderColor,fontFamily:t.fontFamily,fontSize:t.fontSize,fontColor:t.fontColor,fontWeight:t.fontWeight,fontStyle:t.fontStyle,fontVariant:t.fontVariant,nameLength:t.nameLength,textAlign:t.textAlign,trace:t.trace||{index:0,hoverinfo:\"\"},xa:{_offset:0},ya:{_offset:0},index:0,hovertemplate:t.hovertemplate||!1,hovertemplateLabels:t.hovertemplateLabels||!1,eventData:u}})),{gd:i,hovermode:\"closest\",rotateLabels:!1,bgColor:e.bgColor||d.background,container:n.select(e.container),outerContainer:e.outerContainer||e.container}).hoverLabels,l=0,u=0;return s.sort((function(t,e){return t.y0-e.y0})).each((function(t,r){var n=t.y0-t.by/2;t.offset=n-5([\\s\\S]*)<\\/extra>/;function z(t,e){var r=e.gd,i=r._fullLayout,a=e.hovermode,s=e.rotateLabels,c=e.bgColor,h=e.container,v=e.outerContainer,g=e.commonLabelOpts||{};if(0===t.length)return[[]];var T=e.fontFamily||x.HOVERFONT,k=e.fontSize||x.HOVERFONTSIZE,A=e.fontWeight||i.font.weight,M=e.fontStyle||i.font.style,L=e.fontVariant||i.font.variant,C=t[0],P=C.xa,I=C.ya,z=a.charAt(0),R=z+\"Label\",F=C[R];if(void 0===F&&\"multicategory\"===P.type)for(var B=0;Bi.width-_&&(w=i.width-_),e.attr(\"d\",\"M\"+(y-w)+\",0L\"+(y-w+S)+\",\"+b+S+\"H\"+_+\"v\"+b+(2*E+x.height)+\"H\"+-_+\"V\"+b+S+\"H\"+(y-w-S)+\"Z\"),y=w,K.minX=y-_,K.maxX=y+_,\"top\"===P.side?(K.minY=m-(2*E+x.height),K.maxY=m-E):(K.minY=m+E,K.maxY=m+(2*E+x.height))}else{var O,z,D;\"right\"===I.side?(O=\"start\",z=1,D=\"\",y=P._offset+P._length):(O=\"end\",z=-1,D=\"-\",y=P._offset),m=I._offset+(C.y0+C.y1)/2,s.attr(\"text-anchor\",O),e.attr(\"d\",\"M0,0L\"+D+S+\",\"+S+\"V\"+(E+x.height/2)+\"h\"+D+(2*E+x.width)+\"V-\"+(E+x.height/2)+\"H\"+D+S+\"V-\"+S+\"Z\"),K.minY=m-(E+x.height/2),K.maxY=m+(E+x.height/2),\"right\"===I.side?(K.minX=y+S,K.maxX=y+S+(2*E+x.width)):(K.minX=y-S-(2*E+x.width),K.maxX=y-S);var R,B=x.height/2,N=j-x.top-B,U=\"clip\"+i._uid+\"commonlabel\"+I._id;if(y=0?ft:ht+vt=0?ht:Tt+vt=0?ut:ct+gt=0?ct:kt+gt=0,\"top\"!==t.idealAlign&&X||!Z?X?(R+=N/2,t.anchor=\"start\"):t.anchor=\"middle\":(R-=N/2,t.anchor=\"end\"),t.crossPos=R;else{if(t.pos=R,X=z+B/2+K<=U,Z=z-B/2-K>=0,\"left\"!==t.idealAlign&&X||!Z)if(X)z+=B/2,t.anchor=\"start\";else{t.anchor=\"middle\";var J=K/2,$=z+J-U,Q=z-J;$>0&&(z-=$),Q<0&&(z+=-Q)}else z-=B/2,t.anchor=\"end\";t.crossPos=z}_.attr(\"text-anchor\",t.anchor),P&&C.attr(\"text-anchor\",t.anchor),e.attr(\"transform\",l(z,R)+(s?u(w):\"\"))})),{hoverLabels:At,commonLabelBoundingBox:K}}function D(t,e,r,n,i,a){var s=\"\",l=\"\";void 0!==t.nameOverride&&(t.name=t.nameOverride),t.name&&(t.trace._meta&&(t.name=o.templateString(t.name,t.trace._meta)),s=U(t.name,t.nameLength));var u=r.charAt(0),c=\"x\"===u?\"y\":\"x\";void 0!==t.zLabel?(void 0!==t.xLabel&&(l+=\"x: \"+t.xLabel+\"
\"),void 0!==t.yLabel&&(l+=\"y: \"+t.yLabel+\"
\"),\"choropleth\"!==t.trace.type&&\"choroplethmapbox\"!==t.trace.type&&(l+=(l?\"z: \":\"\")+t.zLabel)):e&&t[u+\"Label\"]===i?l=t[c+\"Label\"]||\"\":void 0===t.xLabel?void 0!==t.yLabel&&\"scattercarpet\"!==t.trace.type&&(l=t.yLabel):l=void 0===t.yLabel?t.xLabel:\"(\"+t.xLabel+\", \"+t.yLabel+\")\",!t.text&&0!==t.text||Array.isArray(t.text)||(l+=(l?\"
\":\"\")+t.text),void 0!==t.extraText&&(l+=(l?\"
\":\"\")+t.extraText),a&&\"\"===l&&!t.hovertemplate&&(\"\"===s&&a.remove(),l=s);var f=t.hovertemplate||!1;if(f){var h=t.hovertemplateLabels||t;t[u+\"Label\"]!==i&&(h[u+\"other\"]=h[u+\"Val\"],h[u+\"otherLabel\"]=h[u+\"Label\"]),l=(l=o.hovertemplateString(f,h,n._d3locale,t.eventData[0]||{},t.trace._meta)).replace(I,(function(e,r){return s=U(r,t.nameLength),\"\"}))}return[l,s]}function R(t,e){var r=0,n=t.offset;return e&&(n*=-M,r=t.offset*A),{x:r,y:n}}function F(t,e,r,i){var a=function(t){return t*r},o=function(t){return t*i};t.each((function(t){var r=n.select(this);if(t.del)return r.remove();var i,s,l,u,c=r.select(\"text.nums\"),h=t.anchor,d=\"end\"===h?-1:1,v=(u=(l=(s={start:1,end:-1,middle:0}[(i=t).anchor])*(S+E))+s*(i.txwidth+E),\"middle\"===i.anchor&&(l-=i.tx2width/2,u+=i.txwidth/2+E),{alignShift:s,textShiftX:l,text2ShiftX:u}),g=R(t,e),y=g.x,m=g.y,x=\"middle\"===h;r.select(\"path\").attr(\"d\",x?\"M-\"+a(t.bx/2+t.tx2width/2)+\",\"+o(m-t.by/2)+\"h\"+a(t.bx)+\"v\"+o(t.by)+\"h-\"+a(t.bx)+\"Z\":\"M0,0L\"+a(d*S+y)+\",\"+o(S+m)+\"v\"+o(t.by/2-S)+\"h\"+a(d*t.bx)+\"v-\"+o(t.by)+\"H\"+a(d*S+y)+\"V\"+o(m-S)+\"Z\");var b=y+v.textShiftX,_=m+t.ty0-t.by/2+E,w=t.textAlign||\"auto\";\"auto\"!==w&&(\"left\"===w&&\"start\"!==h?(c.attr(\"text-anchor\",\"start\"),b=x?-t.bx/2-t.tx2width/2+E:-t.bx-E):\"right\"===w&&\"end\"!==h&&(c.attr(\"text-anchor\",\"end\"),b=x?t.bx/2-t.tx2width/2-E:t.bx+E)),c.call(f.positionText,a(b),o(_)),t.tx2width&&(r.select(\"text.name\").call(f.positionText,a(v.text2ShiftX+v.alignShift*E+y),o(m+t.ty0-t.by/2+E)),r.select(\"rect\").call(p.setRect,a(v.text2ShiftX+(v.alignShift-1)*t.tx2width/2+y),o(m-t.by/2-1),a(t.tx2width),o(t.by+2)))}))}function B(t,e){var r=t.index,n=t.trace||{},a=t.cd[0],s=t.cd[r]||{};function l(t){return t||i(t)&&0===t}var u=Array.isArray(r)?function(t,e){var i=o.castOption(a,r,t);return l(i)?i:o.extractOption({},n,\"\",e)}:function(t,e){return o.extractOption(s,n,t,e)};function c(e,r,n){var i=u(r,n);l(i)&&(t[e]=i)}if(c(\"hoverinfo\",\"hi\",\"hoverinfo\"),c(\"bgcolor\",\"hbg\",\"hoverlabel.bgcolor\"),c(\"borderColor\",\"hbc\",\"hoverlabel.bordercolor\"),c(\"fontFamily\",\"htf\",\"hoverlabel.font.family\"),c(\"fontSize\",\"hts\",\"hoverlabel.font.size\"),c(\"fontColor\",\"htc\",\"hoverlabel.font.color\"),c(\"fontWeight\",\"htw\",\"hoverlabel.font.weight\"),c(\"fontStyle\",\"hty\",\"hoverlabel.font.style\"),c(\"fontVariant\",\"htv\",\"hoverlabel.font.variant\"),c(\"nameLength\",\"hnl\",\"hoverlabel.namelength\"),c(\"textAlign\",\"hta\",\"hoverlabel.align\"),t.posref=\"y\"===e||\"closest\"===e&&\"h\"===n.orientation?t.xa._offset+(t.x0+t.x1)/2:t.ya._offset+(t.y0+t.y1)/2,t.x0=o.constrain(t.x0,0,t.xa._length),t.x1=o.constrain(t.x1,0,t.xa._length),t.y0=o.constrain(t.y0,0,t.ya._length),t.y1=o.constrain(t.y1,0,t.ya._length),void 0!==t.xLabelVal&&(t.xLabel=\"xLabel\"in t?t.xLabel:g.hoverLabelText(t.xa,t.xLabelVal,n.xhoverformat),t.xVal=t.xa.c2d(t.xLabelVal)),void 0!==t.yLabelVal&&(t.yLabel=\"yLabel\"in t?t.yLabel:g.hoverLabelText(t.ya,t.yLabelVal,n.yhoverformat),t.yVal=t.ya.c2d(t.yLabelVal)),void 0!==t.zLabelVal&&void 0===t.zLabel&&(t.zLabel=String(t.zLabelVal)),!(isNaN(t.xerr)||\"log\"===t.xa.type&&t.xerr<=0)){var f=g.tickText(t.xa,t.xa.c2l(t.xerr),\"hover\").text;void 0!==t.xerrneg?t.xLabel+=\" +\"+f+\" / -\"+g.tickText(t.xa,t.xa.c2l(t.xerrneg),\"hover\").text:t.xLabel+=\" ± \"+f,\"x\"===e&&(t.distance+=1)}if(!(isNaN(t.yerr)||\"log\"===t.ya.type&&t.yerr<=0)){var h=g.tickText(t.ya,t.ya.c2l(t.yerr),\"hover\").text;void 0!==t.yerrneg?t.yLabel+=\" +\"+h+\" / -\"+g.tickText(t.ya,t.ya.c2l(t.yerrneg),\"hover\").text:t.yLabel+=\" ± \"+h,\"y\"===e&&(t.distance+=1)}var p=t.hoverinfo||t.trace.hoverinfo;return p&&\"all\"!==p&&(-1===(p=Array.isArray(p)?p:p.split(\"+\")).indexOf(\"x\")&&(t.xLabel=void 0),-1===p.indexOf(\"y\")&&(t.yLabel=void 0),-1===p.indexOf(\"z\")&&(t.zLabel=void 0),-1===p.indexOf(\"text\")&&(t.text=void 0),-1===p.indexOf(\"name\")&&(t.name=void 0)),t}function N(t,e,r){var n,i,o=r.container,s=r.fullLayout,l=s._size,u=r.event,c=!!e.hLinePoint,f=!!e.vLinePoint;if(o.selectAll(\".spikeline\").remove(),f||c){var h=d.combine(s.plot_bgcolor,s.paper_bgcolor);if(c){var v,y,m=e.hLinePoint;n=m&&m.xa,\"cursor\"===(i=m&&m.ya).spikesnap?(v=u.pointerX,y=u.pointerY):(v=n._offset+m.x,y=i._offset+m.y);var x,b,_=a.readability(m.color,h)<1.5?d.contrast(h):m.color,w=i.spikemode,T=i.spikethickness,k=i.spikecolor||_,A=g.getPxPosition(t,i);if(-1!==w.indexOf(\"toaxis\")||-1!==w.indexOf(\"across\")){if(-1!==w.indexOf(\"toaxis\")&&(x=A,b=v),-1!==w.indexOf(\"across\")){var M=i._counterDomainMin,S=i._counterDomainMax;\"free\"===i.anchor&&(M=Math.min(M,i.position),S=Math.max(S,i.position)),x=l.l+M*l.w,b=l.l+S*l.w}o.insert(\"line\",\":first-child\").attr({x1:x,x2:b,y1:y,y2:y,\"stroke-width\":T,stroke:k,\"stroke-dasharray\":p.dashStyle(i.spikedash,T)}).classed(\"spikeline\",!0).classed(\"crisp\",!0),o.insert(\"line\",\":first-child\").attr({x1:x,x2:b,y1:y,y2:y,\"stroke-width\":T+2,stroke:h}).classed(\"spikeline\",!0).classed(\"crisp\",!0)}-1!==w.indexOf(\"marker\")&&o.insert(\"circle\",\":first-child\").attr({cx:A+(\"right\"!==i.side?T:-T),cy:y,r:T,fill:k}).classed(\"spikeline\",!0)}if(f){var E,L,C=e.vLinePoint;n=C&&C.xa,i=C&&C.ya,\"cursor\"===n.spikesnap?(E=u.pointerX,L=u.pointerY):(E=n._offset+C.x,L=i._offset+C.y);var P,O,I=a.readability(C.color,h)<1.5?d.contrast(h):C.color,z=n.spikemode,D=n.spikethickness,R=n.spikecolor||I,F=g.getPxPosition(t,n);if(-1!==z.indexOf(\"toaxis\")||-1!==z.indexOf(\"across\")){if(-1!==z.indexOf(\"toaxis\")&&(P=F,O=L),-1!==z.indexOf(\"across\")){var B=n._counterDomainMin,N=n._counterDomainMax;\"free\"===n.anchor&&(B=Math.min(B,n.position),N=Math.max(N,n.position)),P=l.t+(1-N)*l.h,O=l.t+(1-B)*l.h}o.insert(\"line\",\":first-child\").attr({x1:E,x2:E,y1:P,y2:O,\"stroke-width\":D,stroke:R,\"stroke-dasharray\":p.dashStyle(n.spikedash,D)}).classed(\"spikeline\",!0).classed(\"crisp\",!0),o.insert(\"line\",\":first-child\").attr({x1:E,x2:E,y1:P,y2:O,\"stroke-width\":D+2,stroke:h}).classed(\"spikeline\",!0).classed(\"crisp\",!0)}-1!==z.indexOf(\"marker\")&&o.insert(\"circle\",\":first-child\").attr({cx:E,cy:F-(\"top\"!==n.side?D:-D),r:D,fill:R}).classed(\"spikeline\",!0)}}}function j(t,e){return!e||e.vLinePoint!==t._spikepoints.vLinePoint||e.hLinePoint!==t._spikepoints.hLinePoint}function U(t,e){return f.plainText(t||\"\",{len:e,allowedTags:[\"br\",\"sub\",\"sup\",\"b\",\"i\",\"em\"]})}function V(t,e,r){var n=e[t+\"a\"],i=e[t+\"Val\"],a=e.cd[0];if(\"category\"===n.type||\"multicategory\"===n.type)i=n._categoriesMap[i];else if(\"date\"===n.type){var o=e.trace[t+\"periodalignment\"];if(o){var s=e.cd[e.index],l=s[t+\"Start\"];void 0===l&&(l=s[t]);var u=s[t+\"End\"];void 0===u&&(u=s[t]);var c=u-l;\"end\"===o?i+=c:\"middle\"===o&&(i+=c/2)}i=n.d2c(i)}return a&&a.t&&a.t.posLetter===n._id&&(\"group\"!==r.boxmode&&\"group\"!==r.violinmode||(i+=a.t.dPos)),i}function q(t){return t.offsetTop+t.clientTop}function H(t){return t.offsetLeft+t.clientLeft}function G(t,e){var r=t._fullLayout,n=e.getBoundingClientRect(),i=n.left,a=n.top,s=i+n.width,l=a+n.height,u=o.apply3DTransform(r._invTransform)(i,a),c=o.apply3DTransform(r._invTransform)(s,l),f=u[0],h=u[1],p=c[0],d=c[1];return{x:f,y:h,width:p-f,height:d-h,top:Math.min(h,d),left:Math.min(f,p),right:Math.max(f,p),bottom:Math.max(h,d)}}},16132:function(t,e,r){\"use strict\";var n=r(3400),i=r(76308),a=r(10624).isUnifiedHover;t.exports=function(t,e,r,o){o=o||{};var s=e.legend;function l(t){o.font[t]||(o.font[t]=s?e.legend.font[t]:e.font[t])}e&&a(e.hovermode)&&(o.font||(o.font={}),l(\"size\"),l(\"family\"),l(\"color\"),l(\"weight\"),l(\"style\"),l(\"variant\"),s?(o.bgcolor||(o.bgcolor=i.combine(e.legend.bgcolor,e.paper_bgcolor)),o.bordercolor||(o.bordercolor=e.legend.bordercolor)):o.bgcolor||(o.bgcolor=e.paper_bgcolor)),r(\"hoverlabel.bgcolor\",o.bgcolor),r(\"hoverlabel.bordercolor\",o.bordercolor),r(\"hoverlabel.namelength\",o.namelength),n.coerceFont(r,\"hoverlabel.font\",o.font),r(\"hoverlabel.align\",o.align)}},41008:function(t,e,r){\"use strict\";var n=r(3400),i=r(65460);t.exports=function(t,e){function r(r,a){return void 0!==e[r]?e[r]:n.coerce(t,e,i,r,a)}return r(\"clickmode\"),r(\"hoversubplots\"),r(\"hovermode\")}},93024:function(t,e,r){\"use strict\";var n=r(33428),i=r(3400),a=r(86476),o=r(10624),s=r(65460),l=r(83292);t.exports={moduleType:\"component\",name:\"fx\",constants:r(92456),schema:{layout:s},attributes:r(55756),layoutAttributes:s,supplyLayoutGlobalDefaults:r(81976),supplyDefaults:r(95448),supplyLayoutDefaults:r(88336),calc:r(55056),getDistanceFunction:o.getDistanceFunction,getClosest:o.getClosest,inbox:o.inbox,quadrature:o.quadrature,appendArrayPointValue:o.appendArrayPointValue,castHoverOption:function(t,e,r){return i.castOption(t,e,\"hoverlabel.\"+r)},castHoverinfo:function(t,e,r){return i.castOption(t,r,\"hoverinfo\",(function(r){return i.coerceHoverinfo({hoverinfo:r},{_module:t._module},e)}))},hover:l.hover,unhover:a.unhover,loneHover:l.loneHover,loneUnhover:function(t){var e=i.isD3Selection(t)?t:n.select(t);e.selectAll(\"g.hovertext\").remove(),e.selectAll(\".spikeline\").remove()},click:r(62376)}},65460:function(t,e,r){\"use strict\";var n=r(92456),i=r(25376),a=i({editType:\"none\"});a.family.dflt=n.HOVERFONT,a.size.dflt=n.HOVERFONTSIZE,t.exports={clickmode:{valType:\"flaglist\",flags:[\"event\",\"select\"],dflt:\"event\",editType:\"plot\",extras:[\"none\"]},dragmode:{valType:\"enumerated\",values:[\"zoom\",\"pan\",\"select\",\"lasso\",\"drawclosedpath\",\"drawopenpath\",\"drawline\",\"drawrect\",\"drawcircle\",\"orbit\",\"turntable\",!1],dflt:\"zoom\",editType:\"modebar\"},hovermode:{valType:\"enumerated\",values:[\"x\",\"y\",\"closest\",!1,\"x unified\",\"y unified\"],dflt:\"closest\",editType:\"modebar\"},hoversubplots:{valType:\"enumerated\",values:[\"single\",\"overlaying\",\"axis\"],dflt:\"overlaying\",editType:\"none\"},hoverdistance:{valType:\"integer\",min:-1,dflt:20,editType:\"none\"},spikedistance:{valType:\"integer\",min:-1,dflt:-1,editType:\"none\"},hoverlabel:{bgcolor:{valType:\"color\",editType:\"none\"},bordercolor:{valType:\"color\",editType:\"none\"},font:a,grouptitlefont:i({editType:\"none\"}),align:{valType:\"enumerated\",values:[\"left\",\"right\",\"auto\"],dflt:\"auto\",editType:\"none\"},namelength:{valType:\"integer\",min:-1,dflt:15,editType:\"none\"},editType:\"none\"},selectdirection:{valType:\"enumerated\",values:[\"h\",\"v\",\"d\",\"any\"],dflt:\"any\",editType:\"none\"}}},88336:function(t,e,r){\"use strict\";var n=r(3400),i=r(65460),a=r(41008),o=r(16132);t.exports=function(t,e){function r(r,a){return n.coerce(t,e,i,r,a)}a(t,e)&&(r(\"hoverdistance\"),r(\"spikedistance\")),\"select\"===r(\"dragmode\")&&r(\"selectdirection\");var s=e._has(\"mapbox\"),l=e._has(\"geo\"),u=e._basePlotModules.length;\"zoom\"===e.dragmode&&((s||l)&&1===u||s&&l&&2===u)&&(e.dragmode=\"pan\"),o(t,e,r),n.coerceFont(r,\"hoverlabel.grouptitlefont\",e.hoverlabel.font)}},81976:function(t,e,r){\"use strict\";var n=r(3400),i=r(16132),a=r(65460);t.exports=function(t,e){i(t,e,(function(r,i){return n.coerce(t,e,a,r,i)}))}},12704:function(t,e,r){\"use strict\";var n=r(3400),i=r(53756).counter,a=r(86968).u,o=r(33816).idRegex,s=r(31780),l={rows:{valType:\"integer\",min:1,editType:\"plot\"},roworder:{valType:\"enumerated\",values:[\"top to bottom\",\"bottom to top\"],dflt:\"top to bottom\",editType:\"plot\"},columns:{valType:\"integer\",min:1,editType:\"plot\"},subplots:{valType:\"info_array\",freeLength:!0,dimensions:2,items:{valType:\"enumerated\",values:[i(\"xy\").toString(),\"\"],editType:\"plot\"},editType:\"plot\"},xaxes:{valType:\"info_array\",freeLength:!0,items:{valType:\"enumerated\",values:[o.x.toString(),\"\"],editType:\"plot\"},editType:\"plot\"},yaxes:{valType:\"info_array\",freeLength:!0,items:{valType:\"enumerated\",values:[o.y.toString(),\"\"],editType:\"plot\"},editType:\"plot\"},pattern:{valType:\"enumerated\",values:[\"independent\",\"coupled\"],dflt:\"coupled\",editType:\"plot\"},xgap:{valType:\"number\",min:0,max:1,editType:\"plot\"},ygap:{valType:\"number\",min:0,max:1,editType:\"plot\"},domain:a({name:\"grid\",editType:\"plot\",noGridCell:!0},{}),xside:{valType:\"enumerated\",values:[\"bottom\",\"bottom plot\",\"top plot\",\"top\"],dflt:\"bottom plot\",editType:\"plot\"},yside:{valType:\"enumerated\",values:[\"left\",\"left plot\",\"right plot\",\"right\"],dflt:\"left plot\",editType:\"plot\"},editType:\"plot\"};function u(t,e,r){var n=e[r+\"axes\"],i=Object.keys((t._splomAxes||{})[r]||{});return Array.isArray(n)?n:i.length?i:void 0}function c(t,e,r,n,i,a){var o=e(t+\"gap\",r),s=e(\"domain.\"+t);e(t+\"side\",n);for(var l=new Array(i),u=s[0],c=(s[1]-u)/(i-o),f=c*(1-o),h=0;h1){h||p||d||\"independent\"===k(\"pattern\")&&(h=!0),g._hasSubplotGrid=h;var x,b,_=\"top to bottom\"===k(\"roworder\"),w=h?.2:.1,T=h?.3:.1;v&&e._splomGridDflt&&(x=e._splomGridDflt.xside,b=e._splomGridDflt.yside),g._domains={x:c(\"x\",k,w,x,m),y:c(\"y\",k,T,b,y,_)}}else delete e.grid}function k(t,e){return n.coerce(r,g,l,t,e)}},contentDefaults:function(t,e){var r=e.grid;if(r&&r._domains){var n,i,a,o,s,l,c,h=t.grid||{},p=e._subplots,d=r._hasSubplotGrid,v=r.rows,g=r.columns,y=\"independent\"===r.pattern,m=r._axisMap={};if(d){var x=h.subplots||[];l=r.subplots=new Array(v);var b=1;for(n=0;n(\"legend\"===t?1:0));if(!1===M&&(r[t]=void 0),(!1!==M||f.uirevision)&&(p(\"uirevision\",r.uirevision),!1!==M)){p(\"borderwidth\");var S,E,L,C=\"h\"===p(\"orientation\"),P=\"paper\"===p(\"yref\"),O=\"paper\"===p(\"xref\"),I=\"left\";if(C?(S=0,n.getComponentMethod(\"rangeslider\",\"isVisible\")(e.xaxis)?P?(E=1.1,L=\"bottom\"):(E=1,L=\"top\"):P?(E=-.1,L=\"top\"):(E=0,L=\"bottom\")):(E=1,L=\"auto\",O?S=1.02:(S=1,I=\"right\")),i.coerce(f,h,{x:{valType:\"number\",editType:\"legend\",min:O?-2:0,max:O?3:1,dflt:S}},\"x\"),i.coerce(f,h,{y:{valType:\"number\",editType:\"legend\",min:P?-2:0,max:P?3:1,dflt:E}},\"y\"),p(\"traceorder\",_),u.isGrouped(r[t])&&p(\"tracegroupgap\"),p(\"entrywidth\"),p(\"entrywidthmode\"),p(\"indentation\"),p(\"itemsizing\"),p(\"itemwidth\"),p(\"itemclick\"),p(\"itemdoubleclick\"),p(\"groupclick\"),p(\"xanchor\",I),p(\"yanchor\",L),p(\"valign\"),i.noneOrAll(f,h,[\"x\",\"y\"]),p(\"title.text\")){p(\"title.side\",C?\"left\":\"top\");var z=i.extendFlat({},d,{size:i.bigFont(d.size)});i.coerceFont(p,\"title.font\",z)}}}}t.exports=function(t,e,r){var n,a=r.slice(),o=e.shapes;if(o)for(n=0;n1)}var B=d.hiddenlabels||[];if(!(T||d.showlegend&&S.length))return s.selectAll(\".\"+w).remove(),d._topdefs.select(\"#\"+r).remove(),a.autoMargin(t,w);var N=i.ensureSingle(s,\"g\",w,(function(t){T||t.attr(\"pointer-events\",\"all\")})),j=i.ensureSingleById(d._topdefs,\"clipPath\",r,(function(t){t.append(\"rect\")})),U=i.ensureSingle(N,\"rect\",\"bg\",(function(t){t.attr(\"shape-rendering\",\"crispEdges\")}));U.call(c.stroke,h.bordercolor).call(c.fill,h.bgcolor).style(\"stroke-width\",h.borderwidth+\"px\");var V,q=i.ensureSingle(N,\"g\",\"scrollbox\"),H=h.title;h._titleWidth=0,h._titleHeight=0,H.text?((V=i.ensureSingle(q,\"text\",w+\"titletext\")).attr(\"text-anchor\",\"start\").call(u.font,H.font).text(H.text),L(V,q,t,h,_)):q.selectAll(\".\"+w+\"titletext\").remove();var G=i.ensureSingle(N,\"rect\",\"scrollbar\",(function(t){t.attr(p.scrollBarEnterAttrs).call(c.fill,p.scrollBarColor)})),W=q.selectAll(\"g.groups\").data(S);W.enter().append(\"g\").attr(\"class\",\"groups\"),W.exit().remove();var Y=W.selectAll(\"g.traces\").data(i.identity);Y.enter().append(\"g\").attr(\"class\",\"traces\"),Y.exit().remove(),Y.style(\"opacity\",(function(t){var e=t[0].trace;return o.traceIs(e,\"pie-like\")?-1!==B.indexOf(t[0].label)?.5:1:\"legendonly\"===e.visible?.5:1})).each((function(){n.select(this).call(M,t,h)})).call(x,t,h).each((function(){T||n.select(this).call(E,t,w)})),i.syncOrAsync([a.previousPromises,function(){return function(t,e,r,i){var a=t._fullLayout,o=O(i);i||(i=a[o]);var s=a._size,l=b.isVertical(i),c=b.isGrouped(i),f=\"fraction\"===i.entrywidthmode,h=i.borderwidth,d=2*h,v=p.itemGap,g=i.indentation+i.itemwidth+2*v,y=2*(h+v),m=P(i),x=i.y<0||0===i.y&&\"top\"===m,_=i.y>1||1===i.y&&\"bottom\"===m,w=i.tracegroupgap,T={};i._maxHeight=Math.max(x||_?a.height/2:s.h,30);var A=0;i._width=0,i._height=0;var M=function(t){var e=0,r=0,n=t.title.side;return n&&(-1!==n.indexOf(\"left\")&&(e=t._titleWidth),-1!==n.indexOf(\"top\")&&(r=t._titleHeight)),[e,r]}(i);if(l)r.each((function(t){var e=t[0].height;u.setTranslate(this,h+M[0],h+M[1]+i._height+e/2+v),i._height+=e,i._width=Math.max(i._width,t[0].width)})),A=g+i._width,i._width+=v+g+d,i._height+=y,c&&(e.each((function(t,e){u.setTranslate(this,0,e*i.tracegroupgap)})),i._height+=(i._lgroupsLength-1)*i.tracegroupgap);else{var S=C(i),E=i.x<0||0===i.x&&\"right\"===S,L=i.x>1||1===i.x&&\"left\"===S,I=_||x,z=a.width/2;i._maxWidth=Math.max(E?I&&\"left\"===S?s.l+s.w:z:L?I&&\"right\"===S?s.r+s.w:z:s.w,2*g);var D=0,R=0;r.each((function(t){var e=k(t,i,g);D=Math.max(D,e),R+=e})),A=null;var F=0;if(c){var B=0,N=0,j=0;e.each((function(){var t=0,e=0;n.select(this).selectAll(\"g.traces\").each((function(r){var n=k(r,i,g),a=r[0].height;u.setTranslate(this,M[0],M[1]+h+v+a/2+e),e+=a,t=Math.max(t,n),T[r[0].trace.legendgroup]=t}));var r=t+v;N>0&&r+h+N>i._maxWidth?(F=Math.max(F,N),N=0,j+=B+w,B=e):B=Math.max(B,e),u.setTranslate(this,N,j),N+=r})),i._width=Math.max(F,N)+h,i._height=j+B+y}else{var U=r.size(),V=R+d+(U-1)*v=i._maxWidth&&(F=Math.max(F,W),H=0,G+=q,i._height+=q,q=0),u.setTranslate(this,M[0]+h+H,M[1]+h+G+e/2+v),W=H+r+v,H+=n,q=Math.max(q,e)})),V?(i._width=H+d,i._height=q+y):(i._width=Math.max(F,W)+d,i._height+=q+y)}}i._width=Math.ceil(Math.max(i._width+M[0],i._titleWidth+2*(h+p.titlePad))),i._height=Math.ceil(Math.max(i._height+M[1],i._titleHeight+2*(h+p.itemGap))),i._effHeight=Math.min(i._height,i._maxHeight);var Y=t._context.edits,X=Y.legendText||Y.legendPosition;r.each((function(t){var e=n.select(this).select(\".\"+o+\"toggle\"),r=t[0].height,a=t[0].trace.legendgroup,s=k(t,i,g);c&&\"\"!==a&&(s=T[a]);var h=X?g:A||s;l||f||(h+=v/2),u.setRect(e,0,-r/2,h,r)}))}(t,W,Y,h)},function(){var e,c,m,x,b=d._size,_=h.borderwidth,k=\"paper\"===h.xref,M=\"paper\"===h.yref;if(H.text&&function(t,e,r){if(\"top center\"===e.title.side||\"top right\"===e.title.side){var n=e.title.font.size*v,i=0,a=t.node(),o=u.bBox(a).width;\"top center\"===e.title.side?i=.5*(e._width-2*r-2*p.titlePad-o):\"top right\"===e.title.side&&(i=e._width-2*r-2*p.titlePad-o),f.positionText(t,r+p.titlePad+i,r+n)}}(V,h,_),!T){var S,E;S=k?b.l+b.w*h.x-g[C(h)]*h._width:d.width*h.x-g[C(h)]*h._width,E=M?b.t+b.h*(1-h.y)-g[P(h)]*h._effHeight:d.height*(1-h.y)-g[P(h)]*h._effHeight;var L=function(t,e,r,n){var i=t._fullLayout,o=i[e],s=C(o),l=P(o),u=\"paper\"===o.xref,c=\"paper\"===o.yref;t._fullLayout._reservedMargin[e]={};var f=o.y<.5?\"b\":\"t\",h=o.x<.5?\"l\":\"r\",p={r:i.width-r,l:r+o._width,b:i.height-n,t:n+o._effHeight};if(u&&c)return a.autoMargin(t,e,{x:o.x,y:o.y,l:o._width*g[s],r:o._width*y[s],b:o._effHeight*y[l],t:o._effHeight*g[l]});u?t._fullLayout._reservedMargin[e][f]=p[f]:c||\"v\"===o.orientation?t._fullLayout._reservedMargin[e][h]=p[h]:t._fullLayout._reservedMargin[e][f]=p[f]}(t,w,S,E);if(L)return;if(d.margin.autoexpand){var O=S,I=E;S=k?i.constrain(S,0,d.width-h._width):O,E=M?i.constrain(E,0,d.height-h._effHeight):I,S!==O&&i.log(\"Constrain \"+w+\".x to make legend fit inside graph\"),E!==I&&i.log(\"Constrain \"+w+\".y to make legend fit inside graph\")}u.setTranslate(N,S,E)}if(G.on(\".drag\",null),N.on(\"wheel\",null),T||h._height<=h._maxHeight||t._context.staticPlot){var z=h._effHeight;T&&(z=h._height),U.attr({width:h._width-_,height:z-_,x:_/2,y:_/2}),u.setTranslate(q,0,0),j.select(\"rect\").attr({width:h._width-2*_,height:z-2*_,x:_,y:_}),u.setClipUrl(q,r,t),u.setRect(G,0,0,0,0),delete h._scrollY}else{var D,R,F,B=Math.max(p.scrollBarMinHeight,h._effHeight*h._effHeight/h._height),W=h._effHeight-B-2*p.scrollBarMargin,Y=h._height-h._effHeight,X=W/Y,Z=Math.min(h._scrollY||0,Y);U.attr({width:h._width-2*_+p.scrollBarWidth+p.scrollBarMargin,height:h._effHeight-_,x:_/2,y:_/2}),j.select(\"rect\").attr({width:h._width-2*_+p.scrollBarWidth+p.scrollBarMargin,height:h._effHeight-2*_,x:_,y:_+Z}),u.setClipUrl(q,r,t),$(Z,B,X),N.on(\"wheel\",(function(){$(Z=i.constrain(h._scrollY+n.event.deltaY/W*Y,0,Y),B,X),0!==Z&&Z!==Y&&n.event.preventDefault()}));var K=n.behavior.drag().on(\"dragstart\",(function(){var t=n.event.sourceEvent;D=\"touchstart\"===t.type?t.changedTouches[0].clientY:t.clientY,F=Z})).on(\"drag\",(function(){var t=n.event.sourceEvent;2===t.buttons||t.ctrlKey||(R=\"touchmove\"===t.type?t.changedTouches[0].clientY:t.clientY,Z=function(t,e,r){var n=(r-e)/X+t;return i.constrain(n,0,Y)}(F,D,R),$(Z,B,X))}));G.call(K);var J=n.behavior.drag().on(\"dragstart\",(function(){var t=n.event.sourceEvent;\"touchstart\"===t.type&&(D=t.changedTouches[0].clientY,F=Z)})).on(\"drag\",(function(){var t=n.event.sourceEvent;\"touchmove\"===t.type&&(R=t.changedTouches[0].clientY,Z=function(t,e,r){var n=(e-r)/X+t;return i.constrain(n,0,Y)}(F,D,R),$(Z,B,X))}));q.call(J)}function $(e,r,n){h._scrollY=t._fullLayout[w]._scrollY=e,u.setTranslate(q,0,-e),u.setRect(G,h._width,p.scrollBarMargin+e*n,p.scrollBarWidth,r),j.select(\"rect\").attr(\"y\",_+e)}t._context.edits.legendPosition&&(N.classed(\"cursor-move\",!0),l.init({element:N.node(),gd:t,prepFn:function(){var t=u.getTranslate(N);m=t.x,x=t.y},moveFn:function(t,r){var n=m+t,i=x+r;u.setTranslate(N,n,i),e=l.align(n,h._width,b.l,b.l+b.w,h.xanchor),c=l.align(i+h._height,-h._height,b.t+b.h,b.t,h.yanchor)},doneFn:function(){if(void 0!==e&&void 0!==c){var r={};r[w+\".x\"]=e,r[w+\".y\"]=c,o.call(\"_guiRelayout\",t,r)}},clickFn:function(e,r){var n=s.selectAll(\"g.traces\").filter((function(){var t=this.getBoundingClientRect();return r.clientX>=t.left&&r.clientX<=t.right&&r.clientY>=t.top&&r.clientY<=t.bottom}));n.size()>0&&A(t,N,n,e,r)}}))}],t)}}function k(t,e,r){var n=t[0],i=n.width,a=e.entrywidthmode,o=n.trace.legendwidth||e.entrywidth;return\"fraction\"===a?e._maxWidth*o:r+(o||i)}function A(t,e,r,n,i){var a=r.data()[0][0].trace,l={event:i,node:r.node(),curveNumber:a.index,expandedIndex:a._expandedIndex,data:t.data,layout:t.layout,frames:t._transitionData._frames,config:t._context,fullData:t._fullData,fullLayout:t._fullLayout};a._group&&(l.group=a._group),o.traceIs(a,\"pie-like\")&&(l.label=r.datum()[0].label);var u=s.triggerHandler(t,\"plotly_legendclick\",l);if(1===n){if(!1===u)return;e._clickTimeout=setTimeout((function(){t._fullLayout&&h(r,t,n)}),t._context.doubleClickDelay)}else 2===n&&(e._clickTimeout&&clearTimeout(e._clickTimeout),t._legendMouseDownTime=0,!1!==s.triggerHandler(t,\"plotly_legenddoubleclick\",l)&&!1!==u&&h(r,t,n))}function M(t,e,r){var n,a,s=O(r),l=t.data()[0][0],c=l.trace,h=o.traceIs(c,\"pie-like\"),d=!r._inHover&&e._context.edits.legendText&&!h,v=r._maxNameLength;l.groupTitle?(n=l.groupTitle.text,a=l.groupTitle.font):(a=r.font,r.entries?n=l.text:(n=h?l.label:c.name,c._meta&&(n=i.templateString(n,c._meta))));var g=i.ensureSingle(t,\"text\",s+\"text\");g.attr(\"text-anchor\",\"start\").call(u.font,a).text(d?S(n,v):n);var y=r.indentation+r.itemwidth+2*p.itemGap;f.positionText(g,y,0),d?g.call(f.makeEditable,{gd:e,text:n}).call(L,t,e,r).on(\"edit\",(function(n){this.text(S(n,v)).call(L,t,e,r);var a=l.trace._fullInput||{},s={};if(o.hasTransform(a,\"groupby\")){var u=o.getTransformIndices(a,\"groupby\"),f=u[u.length-1],h=i.keyedContainer(a,\"transforms[\"+f+\"].styles\",\"target\",\"value.name\");h.set(l.trace._group,n),s=h.constructUpdate()}else s.name=n;return a._isShape?o.call(\"_guiRelayout\",e,\"shapes[\"+c.index+\"].name\",s.name):o.call(\"_guiRestyle\",e,s,c.index)})):L(g,t,e,r)}function S(t,e){var r=Math.max(4,e);if(t&&t.trim().length>=r/2)return t;for(var n=r-(t=t||\"\").length;n>0;n--)t+=\" \";return t}function E(t,e,r){var a,o=e._context.doubleClickDelay,s=1,l=i.ensureSingle(t,\"rect\",r+\"toggle\",(function(t){e._context.staticPlot||t.style(\"cursor\",\"pointer\").attr(\"pointer-events\",\"all\"),t.call(c.fill,\"rgba(0,0,0,0)\")}));e._context.staticPlot||(l.on(\"mousedown\",(function(){(a=(new Date).getTime())-e._legendMouseDownTimeo&&(s=Math.max(s-1,1)),A(e,i,t,s,n.event)}})))}function L(t,e,r,n,i){n._inHover&&t.attr(\"data-notex\",!0),f.convertToTspans(t,r,(function(){!function(t,e,r,n){var i=t.data()[0][0];if(r._inHover||!i||i.trace.showlegend){var a=t.select(\"g[class*=math-group]\"),o=a.node(),s=O(r);r||(r=e._fullLayout[s]);var l,c,h=r.borderwidth,d=(n===_?r.title.font:i.groupTitle?i.groupTitle.font:r.font).size*v;if(o){var g=u.bBox(o);l=g.height,c=g.width,n===_?u.setTranslate(a,h,h+.75*l):u.setTranslate(a,0,.25*l)}else{var y=\".\"+s+(n===_?\"title\":\"\")+\"text\",m=t.select(y),x=f.lineCount(m),b=m.node();if(l=d*x,c=b?u.bBox(b).width:0,n===_)\"left\"===r.title.side&&(c+=2*p.itemGap),f.positionText(m,h+p.titlePad,h+d);else{var w=2*p.itemGap+r.indentation+r.itemwidth;i.groupTitle&&(w=p.itemGap,c-=r.indentation+r.itemwidth),f.positionText(m,w,-d*((x-1)/2-.3))}}n===_?(r._titleWidth=c,r._titleHeight=l):(i.lineHeight=d,i.height=Math.max(l,16)+3,i.width=c)}else t.remove()}(e,r,n,i)}))}function C(t){return i.isRightAnchor(t)?\"right\":i.isCenterAnchor(t)?\"center\":\"left\"}function P(t){return i.isBottomAnchor(t)?\"bottom\":i.isMiddleAnchor(t)?\"middle\":\"top\"}function O(t){return t._id||\"legend\"}t.exports=function(t,e){if(e)T(t,e);else{var r=t._fullLayout,i=r._legends;r._infolayer.selectAll('[class^=\"legend\"]').each((function(){var t=n.select(this),e=t.attr(\"class\").split(\" \")[0];e.match(w)&&-1===i.indexOf(e)&&t.remove()}));for(var a=0;aS&&(M=S)}k[a][0]._groupMinRank=M,k[a][0]._preGroupSort=a}var E=function(t,e){return t.trace.legendrank-e.trace.legendrank||t._preSort-e._preSort};for(k.forEach((function(t,e){t[0]._preGroupSort=e})),k.sort((function(t,e){return t[0]._groupMinRank-e[0]._groupMinRank||t[0]._preGroupSort-e[0]._preGroupSort})),a=0;ar?r:t}t.exports=function(t,e,r){var y=e._fullLayout;r||(r=y.legend);var m=\"constant\"===r.itemsizing,x=r.itemwidth,b=(x+2*p.itemGap)/2,_=o(b,0),w=function(t,e,r,n){var i;if(t+1)i=t;else{if(!(e&&e.width>0))return 0;i=e.width}return m?n:Math.min(i,r)};function T(t,a,o){var c=t[0].trace,f=c.marker||{},h=f.line||{},p=f.cornerradius?\"M6,3a3,3,0,0,1-3,3H-3a3,3,0,0,1-3-3V-3a3,3,0,0,1,3-3H3a3,3,0,0,1,3,3Z\":\"M6,6H-6V-6H6Z\",d=o?c.visible&&c.type===o:i.traceIs(c,\"bar\"),v=n.select(a).select(\"g.legendpoints\").selectAll(\"path.legend\"+o).data(d?[t]:[]);v.enter().append(\"path\").classed(\"legend\"+o,!0).attr(\"d\",p).attr(\"transform\",_),v.exit().remove(),v.each((function(t){var i=n.select(this),a=t[0],o=w(a.mlw,f.line,5,2);i.style(\"stroke-width\",o+\"px\");var p=a.mcc;if(!r._inHover&&\"mc\"in a){var d=u(f),v=d.mid;void 0===v&&(v=(d.max+d.min)/2),p=s.tryColorscale(f,\"\")(v)}var y=p||a.mc||f.color,m=f.pattern,x=m&&s.getPatternAttr(m.shape,0,\"\");if(x){var b=s.getPatternAttr(m.bgcolor,0,null),_=s.getPatternAttr(m.fgcolor,0,null),T=m.fgopacity,k=g(m.size,8,10),A=g(m.solidity,.5,1),M=\"legend-\"+c.uid;i.call(s.pattern,\"legend\",e,M,x,k,A,p,m.fillmode,b,_,T)}else i.call(l.fill,y);o&&l.stroke(i,a.mlc||h.color)}))}function k(t,r,o){var s=t[0],l=s.trace,u=o?l.visible&&l.type===o:i.traceIs(l,o),c=n.select(r).select(\"g.legendpoints\").selectAll(\"path.legend\"+o).data(u?[t]:[]);if(c.enter().append(\"path\").classed(\"legend\"+o,!0).attr(\"d\",\"M6,6H-6V-6H6Z\").attr(\"transform\",_),c.exit().remove(),c.size()){var p=l.marker||{},d=w(h(p.line.width,s.pts),p.line,5,2),v=\"pieLike\",g=a.minExtend(l,{marker:{line:{width:d}}},v),y=a.minExtend(s,{trace:g},v);f(c,y,g,e)}}t.each((function(t){var e=n.select(this),i=a.ensureSingle(e,\"g\",\"layers\");i.style(\"opacity\",t[0].trace.opacity);var s=r.indentation,l=r.valign,u=t[0].lineHeight,c=t[0].height;if(\"middle\"===l&&0===s||!u||!c)i.attr(\"transform\",null);else{var f={top:1,bottom:-1}[l]*(.5*(u-c+3))||0,h=r.indentation;i.attr(\"transform\",o(h,f))}i.selectAll(\"g.legendfill\").data([t]).enter().append(\"g\").classed(\"legendfill\",!0),i.selectAll(\"g.legendlines\").data([t]).enter().append(\"g\").classed(\"legendlines\",!0);var p=i.selectAll(\"g.legendsymbols\").data([t]);p.enter().append(\"g\").classed(\"legendsymbols\",!0),p.selectAll(\"g.legendpoints\").data([t]).enter().append(\"g\").classed(\"legendpoints\",!0)})).each((function(t){var r,i=t[0].trace,o=[];if(i.visible)switch(i.type){case\"histogram2d\":case\"heatmap\":o=[[\"M-15,-2V4H15V-2Z\"]],r=!0;break;case\"choropleth\":case\"choroplethmapbox\":o=[[\"M-6,-6V6H6V-6Z\"]],r=!0;break;case\"densitymapbox\":o=[[\"M-6,0 a6,6 0 1,0 12,0 a 6,6 0 1,0 -12,0\"]],r=\"radial\";break;case\"cone\":o=[[\"M-6,2 A2,2 0 0,0 -6,6 V6L6,4Z\"],[\"M-6,-6 A2,2 0 0,0 -6,-2 L6,-4Z\"],[\"M-6,-2 A2,2 0 0,0 -6,2 L6,0Z\"]],r=!1;break;case\"streamtube\":o=[[\"M-6,2 A2,2 0 0,0 -6,6 H6 A2,2 0 0,1 6,2 Z\"],[\"M-6,-6 A2,2 0 0,0 -6,-2 H6 A2,2 0 0,1 6,-6 Z\"],[\"M-6,-2 A2,2 0 0,0 -6,2 H6 A2,2 0 0,1 6,-2 Z\"]],r=!1;break;case\"surface\":o=[[\"M-6,-6 A2,3 0 0,0 -6,0 H6 A2,3 0 0,1 6,-6 Z\"],[\"M-6,1 A2,3 0 0,1 -6,6 H6 A2,3 0 0,0 6,0 Z\"]],r=!0;break;case\"mesh3d\":o=[[\"M-6,6H0L-6,-6Z\"],[\"M6,6H0L6,-6Z\"],[\"M-6,-6H6L0,6Z\"]],r=!1;break;case\"volume\":o=[[\"M-6,6H0L-6,-6Z\"],[\"M6,6H0L6,-6Z\"],[\"M-6,-6H6L0,6Z\"]],r=!0;break;case\"isosurface\":o=[[\"M-6,6H0L-6,-6Z\"],[\"M6,6H0L6,-6Z\"],[\"M-6,-6 A12,24 0 0,0 6,-6 L0,6Z\"]],r=!1}var c=n.select(this).select(\"g.legendpoints\").selectAll(\"path.legend3dandfriends\").data(o);c.enter().append(\"path\").classed(\"legend3dandfriends\",!0).attr(\"transform\",_).style(\"stroke-miterlimit\",1),c.exit().remove(),c.each((function(t,o){var c,f=n.select(this),h=u(i),p=h.colorscale,v=h.reversescale;if(p){if(!r){var g=p.length;c=0===o?p[v?g-1:0][1]:1===o?p[v?0:g-1][1]:p[Math.floor((g-1)/2)][1]}}else{var y=i.vertexcolor||i.facecolor||i.color;c=a.isArrayOrTypedArray(y)?y[o]||y[0]:y}f.attr(\"d\",t[0]),c?f.call(l.fill,c):f.call((function(t){if(t.size()){var n=\"legendfill-\"+i.uid;s.gradient(t,e,n,d(v,\"radial\"===r),p,\"fill\")}}))}))})).each((function(t){var e=t[0].trace,r=\"waterfall\"===e.type;if(t[0]._distinct&&r){var i=t[0].trace[t[0].dir].marker;return t[0].mc=i.color,t[0].mlw=i.line.width,t[0].mlc=i.line.color,T(t,this,\"waterfall\")}var a=[];e.visible&&r&&(a=t[0].hasTotals?[[\"increasing\",\"M-6,-6V6H0Z\"],[\"totals\",\"M6,6H0L-6,-6H-0Z\"],[\"decreasing\",\"M6,6V-6H0Z\"]]:[[\"increasing\",\"M-6,-6V6H6Z\"],[\"decreasing\",\"M6,6V-6H-6Z\"]]);var o=n.select(this).select(\"g.legendpoints\").selectAll(\"path.legendwaterfall\").data(a);o.enter().append(\"path\").classed(\"legendwaterfall\",!0).attr(\"transform\",_).style(\"stroke-miterlimit\",1),o.exit().remove(),o.each((function(t){var r=n.select(this),i=e[t[0]].marker,a=w(void 0,i.line,5,2);r.attr(\"d\",t[1]).style(\"stroke-width\",a+\"px\").call(l.fill,i.color),a&&r.call(l.stroke,i.line.color)}))})).each((function(t){T(t,this,\"funnel\")})).each((function(t){T(t,this)})).each((function(t){var r=t[0].trace,o=n.select(this).select(\"g.legendpoints\").selectAll(\"path.legendbox\").data(r.visible&&i.traceIs(r,\"box-violin\")?[t]:[]);o.enter().append(\"path\").classed(\"legendbox\",!0).attr(\"d\",\"M6,6H-6V-6H6Z\").attr(\"transform\",_),o.exit().remove(),o.each((function(){var t=n.select(this);if(\"all\"!==r.boxpoints&&\"all\"!==r.points||0!==l.opacity(r.fillcolor)||0!==l.opacity((r.line||{}).color)){var i=w(void 0,r.line,5,2);t.style(\"stroke-width\",i+\"px\").call(l.fill,r.fillcolor),i&&l.stroke(t,r.line.color)}else{var u=a.minExtend(r,{marker:{size:m?12:a.constrain(r.marker.size,2,16),sizeref:1,sizemin:1,sizemode:\"diameter\"}});o.call(s.pointStyle,u,e)}}))})).each((function(t){k(t,this,\"funnelarea\")})).each((function(t){k(t,this,\"pie\")})).each((function(t){var r,i,o=v(t),l=o.showFill,f=o.showLine,h=o.showGradientLine,p=o.showGradientFill,g=o.anyFill,y=o.anyLine,m=t[0],b=m.trace,_=u(b),T=_.colorscale,k=_.reversescale,A=c.hasMarkers(b)||!g?\"M5,0\":y?\"M5,-2\":\"M5,-3\",M=n.select(this),S=M.select(\".legendfill\").selectAll(\"path\").data(l||p?[t]:[]);if(S.enter().append(\"path\").classed(\"js-fill\",!0),S.exit().remove(),S.attr(\"d\",A+\"h\"+x+\"v6h-\"+x+\"z\").call((function(t){if(t.size())if(l)s.fillGroupStyle(t,e,!0);else{var r=\"legendfill-\"+b.uid;s.gradient(t,e,r,d(k),T,\"fill\")}})),f||h){var E=w(void 0,b.line,10,5);i=a.minExtend(b,{line:{width:E}}),r=[a.minExtend(m,{trace:i})]}var L=M.select(\".legendlines\").selectAll(\"path\").data(f||h?[r]:[]);L.enter().append(\"path\").classed(\"js-line\",!0),L.exit().remove(),L.attr(\"d\",A+(h?\"l\"+x+\",0.0001\":\"h\"+x)).call(f?s.lineGroupStyle:function(t){if(t.size()){var r=\"legendline-\"+b.uid;s.lineGroupStyle(t),s.gradient(t,e,r,d(k),T,\"stroke\")}})})).each((function(t){var r,i,o=v(t),l=o.anyFill,u=o.anyLine,f=o.showLine,h=o.showMarker,p=t[0],d=p.trace,g=!h&&!u&&!l&&c.hasText(d);function y(t,e,r,n){var i=a.nestedProperty(d,t).get(),o=a.isArrayOrTypedArray(i)&&e?e(i):i;if(m&&o&&void 0!==n&&(o=n),r){if(or[1])return r[1]}return o}function x(t){return p._distinct&&p.index&&t[p.index]?t[p.index]:t[0]}if(h||g||f){var b={},w={};if(h){b.mc=y(\"marker.color\",x),b.mx=y(\"marker.symbol\",x),b.mo=y(\"marker.opacity\",a.mean,[.2,1]),b.mlc=y(\"marker.line.color\",x),b.mlw=y(\"marker.line.width\",a.mean,[0,5],2),w.marker={sizeref:1,sizemin:1,sizemode:\"diameter\"};var T=y(\"marker.size\",a.mean,[2,16],12);b.ms=T,w.marker.size=T}f&&(w.line={width:y(\"line.width\",x,[0,10],5)}),g&&(b.tx=\"Aa\",b.tp=y(\"textposition\",x),b.ts=10,b.tc=y(\"textfont.color\",x),b.tf=y(\"textfont.family\",x),b.tw=y(\"textfont.weight\",x),b.ty=y(\"textfont.style\",x),b.tv=y(\"textfont.variant\",x)),r=[a.minExtend(p,b)],(i=a.minExtend(d,w)).selectedpoints=null,i.texttemplate=null}var k=n.select(this).select(\"g.legendpoints\"),A=k.selectAll(\"path.scatterpts\").data(h?r:[]);A.enter().insert(\"path\",\":first-child\").classed(\"scatterpts\",!0).attr(\"transform\",_),A.exit().remove(),A.call(s.pointStyle,i,e),h&&(r[0].mrc=3);var M=k.selectAll(\"g.pointtext\").data(g?r:[]);M.enter().append(\"g\").classed(\"pointtext\",!0).append(\"text\").attr(\"transform\",_),M.exit().remove(),M.selectAll(\"text\").call(s.textPointStyle,i,e)})).each((function(t){var e=t[0].trace,r=n.select(this).select(\"g.legendpoints\").selectAll(\"path.legendcandle\").data(e.visible&&\"candlestick\"===e.type?[t,t]:[]);r.enter().append(\"path\").classed(\"legendcandle\",!0).attr(\"d\",(function(t,e){return e?\"M-15,0H-8M-8,6V-6H8Z\":\"M15,0H8M8,-6V6H-8Z\"})).attr(\"transform\",_).style(\"stroke-miterlimit\",1),r.exit().remove(),r.each((function(t,r){var i=n.select(this),a=e[r?\"increasing\":\"decreasing\"],o=w(void 0,a.line,5,2);i.style(\"stroke-width\",o+\"px\").call(l.fill,a.fillcolor),o&&l.stroke(i,a.line.color)}))})).each((function(t){var e=t[0].trace,r=n.select(this).select(\"g.legendpoints\").selectAll(\"path.legendohlc\").data(e.visible&&\"ohlc\"===e.type?[t,t]:[]);r.enter().append(\"path\").classed(\"legendohlc\",!0).attr(\"d\",(function(t,e){return e?\"M-15,0H0M-8,-6V0\":\"M15,0H0M8,6V0\"})).attr(\"transform\",_).style(\"stroke-miterlimit\",1),r.exit().remove(),r.each((function(t,r){var i=n.select(this),a=e[r?\"increasing\":\"decreasing\"],o=w(void 0,a.line,5,2);i.style(\"fill\",\"none\").call(s.dashLine,a.line.dash,o),o&&l.stroke(i,a.line.color)}))}))}},66540:function(t,e,r){\"use strict\";r(76052),t.exports={editType:\"modebar\",orientation:{valType:\"enumerated\",values:[\"v\",\"h\"],dflt:\"h\",editType:\"modebar\"},bgcolor:{valType:\"color\",editType:\"modebar\"},color:{valType:\"color\",editType:\"modebar\"},activecolor:{valType:\"color\",editType:\"modebar\"},uirevision:{valType:\"any\",editType:\"none\"},add:{valType:\"string\",arrayOk:!0,dflt:\"\",editType:\"modebar\"},remove:{valType:\"string\",arrayOk:!0,dflt:\"\",editType:\"modebar\"}}},44248:function(t,e,r){\"use strict\";var n=r(24040),i=r(7316),a=r(79811),o=r(9224),s=r(4016).eraseActiveShape,l=r(3400),u=l._,c=t.exports={};function f(t,e){var r,i,o=e.currentTarget,s=o.getAttribute(\"data-attr\"),l=o.getAttribute(\"data-val\")||!0,u=t._fullLayout,c={},f=a.list(t,null,!0),h=u._cartesianSpikesEnabled;if(\"zoom\"===s){var p,d=\"in\"===l?.5:2,v=(1+d)/2,g=(1-d)/2;for(i=0;i1?(O=[\"toggleHover\"],I=[\"resetViews\"]):y?(P=[\"zoomInGeo\",\"zoomOutGeo\"],O=[\"hoverClosestGeo\"],I=[\"resetGeo\"]):g?(O=[\"hoverClosest3d\"],I=[\"resetCameraDefault3d\",\"resetCameraLastSave3d\"]):w?(P=[\"zoomInMapbox\",\"zoomOutMapbox\"],O=[\"toggleHover\"],I=[\"resetViewMapbox\"]):b?O=[\"hoverClosestGl2d\"]:m?O=[\"hoverClosestPie\"]:A?(O=[\"hoverClosestCartesian\",\"hoverCompareCartesian\"],I=[\"resetViewSankey\"]):O=[\"toggleHover\"],v&&(O=[\"toggleSpikelines\",\"hoverClosestCartesian\",\"hoverCompareCartesian\"]),(function(t){for(var e=0;e0)){var v=function(t,e,r){for(var n=r.filter((function(r){return e[r].anchor===t._id})),i=0,a=0;a0?t.touches[0].clientX:0}function y(t,e,r,n){var i=o.ensureSingle(t,\"rect\",v.bgClassName,(function(t){t.attr({x:0,y:0,\"shape-rendering\":\"crispEdges\"})})),a=n.borderwidth%2==0?n.borderwidth:n.borderwidth-1,c=-n._offsetShift,f=l.crispRound(e,n.borderwidth);i.attr({width:n._width+a,height:n._height+a,transform:s(c,c),\"stroke-width\":f}).call(u.stroke,n.bordercolor).call(u.fill,n.bgcolor)}function m(t,e,r,n){var i=e._fullLayout;o.ensureSingleById(i._topdefs,\"clipPath\",n._clipId,(function(t){t.append(\"rect\").attr({x:0,y:0})})).select(\"rect\").attr({width:n._width,height:n._height})}function x(t,e,r,i){var s,u=e.calcdata,c=t.selectAll(\"g.\"+v.rangePlotClassName).data(r._subplotsWith,o.identity);c.enter().append(\"g\").attr(\"class\",(function(t){return v.rangePlotClassName+\" \"+t})).call(l.setClipUrl,i._clipId,e),c.order(),c.exit().remove(),c.each((function(t,o){var l=n.select(this),c=0===o,p=h.getFromId(e,t,\"y\"),d=p._name,v=i[d],g={data:[],layout:{xaxis:{type:r.type,domain:[0,1],range:i.range.slice(),calendar:r.calendar},width:i._width,height:i._height,margin:{t:0,b:0,l:0,r:0}},_context:e._context};r.rangebreaks&&(g.layout.xaxis.rangebreaks=r.rangebreaks),g.layout[d]={type:p.type,domain:[0,1],range:\"match\"!==v.rangemode?v.range.slice():p.range.slice(),calendar:p.calendar},p.rangebreaks&&(g.layout[d].rangebreaks=p.rangebreaks),a.supplyDefaults(g);var y=g._fullLayout.xaxis,m=g._fullLayout[d];y.clearCalc(),y.setScale(),m.clearCalc(),m.setScale();var x={id:t,plotgroup:l,xaxis:y,yaxis:m,isRangePlot:!0};c?s=x:(x.mainplot=\"xy\",x.mainplotinfo=s),f.rangePlot(e,x,function(t,e){for(var r=[],n=0;n=n.max)e=B[r+1];else if(t=n.pmax)e=B[r+1];else if(tr._length||m+_<0)return;c=y+_,p=m+_;break;case l:if(b=\"col-resize\",y+_>r._length)return;c=y+_,p=m;break;case u:if(b=\"col-resize\",m+_<0)return;c=y,p=m+_;break;default:b=\"ew-resize\",c=v,p=v+_}if(p=0;k--){var A=r.append(\"path\").attr(g).style(\"opacity\",k?.1:y).call(o.stroke,x).call(o.fill,m).call(s.dashLine,k?\"solid\":_,k?4+b:b);if(d(A,t,a),w){var M=l(t.layout,\"selections\",a);A.style({cursor:\"move\"});var S={element:A.node(),plotinfo:p,gd:t,editHelpers:M,isActiveSelection:!0},E=n(u,t);i(E,A,S)}else A.style(\"pointer-events\",k?\"all\":\"none\");T[k]=A}var L=T[0];T[1].node().addEventListener(\"click\",(function(){return function(t,e){if(h(t)){var r=+e.node().getAttribute(\"data-index\");if(r>=0){if(r===t._fullLayout._activeSelectionIndex)return void v(t);t._fullLayout._activeSelectionIndex=r,t._fullLayout._deactivateSelection=v,f(t)}}}(t,L)}))}(t._fullLayout._selectionLayer)}function d(t,e,r){var n=r.xref+r.yref;s.setClipUrl(t,\"clip\"+e._fullLayout._uid+n,e)}function v(t){h(t)&&t._fullLayout._activeSelectionIndex>=0&&(a(t),delete t._fullLayout._activeSelectionIndex,f(t))}t.exports={draw:f,drawOne:p,activateLastSelection:function(t){if(h(t)){var e=t._fullLayout.selections.length-1;t._fullLayout._activeSelectionIndex=e,t._fullLayout._deactivateSelection=v,f(t)}}}},34200:function(t,e,r){\"use strict\";var n=r(98192).u,i=r(92880).extendFlat;t.exports={newselection:{mode:{valType:\"enumerated\",values:[\"immediate\",\"gradual\"],dflt:\"immediate\",editType:\"none\"},line:{color:{valType:\"color\",editType:\"none\"},width:{valType:\"number\",min:1,dflt:1,editType:\"none\"},dash:i({},n,{dflt:\"dot\",editType:\"none\"}),editType:\"none\"},editType:\"none\"},activeselection:{fillcolor:{valType:\"color\",dflt:\"rgba(0,0,0,0)\",editType:\"none\"},opacity:{valType:\"number\",min:0,max:1,dflt:.5,editType:\"none\"},editType:\"none\"}}},81004:function(t){\"use strict\";t.exports=function(t,e,r){r(\"newselection.mode\"),r(\"newselection.line.width\")&&(r(\"newselection.line.color\"),r(\"newselection.line.dash\")),r(\"activeselection.fillcolor\"),r(\"activeselection.opacity\")}},5968:function(t,e,r){\"use strict\";var n=r(72760).selectMode,i=r(1936).clearOutline,a=r(9856),o=a.readPaths,s=a.writePaths,l=a.fixDatesForPaths;t.exports=function(t,e){if(t.length){var r=t[0][0];if(r){var a=r.getAttribute(\"d\"),u=e.gd,c=u._fullLayout.newselection,f=e.plotinfo,h=f.xaxis,p=f.yaxis,d=e.isActiveSelection,v=e.dragmode,g=(u.layout||{}).selections||[];if(!n(v)&&void 0!==d){var y=u._fullLayout._activeSelectionIndex;if(y-1,b=[];if(function(t){return t&&Array.isArray(t)&&!0!==t[0].hoverOnBox}(y)){W(t,e,a);var _=function(t,e){var r,n,i=t[0],a=-1,o=[];for(n=0;n0?function(t,e){var r,n,i,a=[];for(i=0;i0&&a.push(r);if(1===a.length&&a[0]===e.searchInfo&&(n=e.searchInfo.cd[0].trace).selectedpoints.length===e.pointNumbers.length){for(i=0;i1)return!1;if((n+=e.selectedpoints.length)>1)return!1}return 1===n}(s)&&(h=J(_))){for(o&&o.remove(),g=0;g=0})(i)&&i._fullLayout._deactivateShape(i),function(t){return t._fullLayout._activeSelectionIndex>=0}(i)&&i._fullLayout._deactivateSelection(i);var o=i._fullLayout._zoomlayer,s=p(r),l=v(r);if(s||l){var u,c,f=o.selectAll(\".select-outline-\"+n.id);f&&i._fullLayout._outlining&&(s&&(u=T(f,t)),u&&a.call(\"_guiRelayout\",i,{shapes:u}),l&&!U(t)&&(c=k(f,t)),c&&(i._fullLayout._noEmitSelectedAtStart=!0,a.call(\"_guiRelayout\",i,{selections:c}).then((function(){e&&A(i)}))),i._fullLayout._outlining=!1)}n.selection={},n.selection.selectionDefs=t.selectionDefs=[],n.selection.mergedPolygons=t.mergedPolygons=[]}function X(t){return t._id}function Z(t,e,r,n){if(!t.calcdata)return[];var i,a,o,s=[],l=e.map(X),u=r.map(X);for(o=0;o0?n[0]:r;return!!e.selectedpoints&&e.selectedpoints.indexOf(i)>-1}function $(t,e,r){var n,i;for(n=0;n-1&&e;if(!a&&e){var et=ot(t,!0);if(et.length){var nt=et[0].xref,pt=et[0].yref;if(nt&&pt){var dt=ut(et);ct([C(t,nt,\"x\"),C(t,pt,\"y\")])(Q,dt)}}t._fullLayout._noEmitSelectedAtStart?t._fullLayout._noEmitSelectedAtStart=!1:tt&&ft(t,Q),h._reselect=!1}if(!a&&h._deselect){var vt=h._deselect;(function(t,e,r){for(var n=0;n=0)k._fullLayout._deactivateShape(k);else if(!x){var r=A.clickmode;L.done(Mt).then((function(){if(L.clear(Mt),2===t){for(bt.remove(),J=0;J-1&&V(e,k,n.xaxes,n.yaxes,n.subplot,n,bt),\"event\"===r&&ft(k,void 0);l.click(k,e,P.id)})).catch(M.error)}},n.doneFn=function(){kt.remove(),L.done(Mt).then((function(){L.clear(Mt),!S&&K&&n.selectionDefs&&(K.subtract=xt,n.selectionDefs.push(K),n.mergedPolygons.length=0,[].push.apply(n.mergedPolygons,X)),(S||x)&&Y(n,S),n.doneFnCompleted&&n.doneFnCompleted(St),b&&ft(k,at)})).catch(M.error)}},clearOutline:x,clearSelectionsCache:Y,selectOnClick:V}},46056:function(t,e,r){\"use strict\";var n=r(13916),i=r(25376),a=r(52904).line,o=r(98192).u,s=r(92880).extendFlat,l=r(31780).templatedArray,u=(r(36208),r(45464)),c=r(21776).ye,f=r(97728);t.exports=l(\"shape\",{visible:s({},u.visible,{editType:\"calc+arraydraw\"}),showlegend:{valType:\"boolean\",dflt:!1,editType:\"calc+arraydraw\"},legend:s({},u.legend,{editType:\"calc+arraydraw\"}),legendgroup:s({},u.legendgroup,{editType:\"calc+arraydraw\"}),legendgrouptitle:{text:s({},u.legendgrouptitle.text,{editType:\"calc+arraydraw\"}),font:i({editType:\"calc+arraydraw\"}),editType:\"calc+arraydraw\"},legendrank:s({},u.legendrank,{editType:\"calc+arraydraw\"}),legendwidth:s({},u.legendwidth,{editType:\"calc+arraydraw\"}),type:{valType:\"enumerated\",values:[\"circle\",\"rect\",\"path\",\"line\"],editType:\"calc+arraydraw\"},layer:{valType:\"enumerated\",values:[\"below\",\"above\",\"between\"],dflt:\"above\",editType:\"arraydraw\"},xref:s({},n.xref,{}),xsizemode:{valType:\"enumerated\",values:[\"scaled\",\"pixel\"],dflt:\"scaled\",editType:\"calc+arraydraw\"},xanchor:{valType:\"any\",editType:\"calc+arraydraw\"},x0:{valType:\"any\",editType:\"calc+arraydraw\"},x1:{valType:\"any\",editType:\"calc+arraydraw\"},yref:s({},n.yref,{}),ysizemode:{valType:\"enumerated\",values:[\"scaled\",\"pixel\"],dflt:\"scaled\",editType:\"calc+arraydraw\"},yanchor:{valType:\"any\",editType:\"calc+arraydraw\"},y0:{valType:\"any\",editType:\"calc+arraydraw\"},y1:{valType:\"any\",editType:\"calc+arraydraw\"},path:{valType:\"string\",editType:\"calc+arraydraw\"},opacity:{valType:\"number\",min:0,max:1,dflt:1,editType:\"arraydraw\"},line:{color:s({},a.color,{editType:\"arraydraw\"}),width:s({},a.width,{editType:\"calc+arraydraw\"}),dash:s({},o,{editType:\"arraydraw\"}),editType:\"calc+arraydraw\"},fillcolor:{valType:\"color\",dflt:\"rgba(0,0,0,0)\",editType:\"arraydraw\"},fillrule:{valType:\"enumerated\",values:[\"evenodd\",\"nonzero\"],dflt:\"evenodd\",editType:\"arraydraw\"},editable:{valType:\"boolean\",dflt:!1,editType:\"calc+arraydraw\"},label:{text:{valType:\"string\",dflt:\"\",editType:\"arraydraw\"},texttemplate:c({},{keys:Object.keys(f)}),font:i({editType:\"calc+arraydraw\",colorEditType:\"arraydraw\"}),textposition:{valType:\"enumerated\",values:[\"top left\",\"top center\",\"top right\",\"middle left\",\"middle center\",\"middle right\",\"bottom left\",\"bottom center\",\"bottom right\",\"start\",\"middle\",\"end\"],editType:\"arraydraw\"},textangle:{valType:\"angle\",dflt:\"auto\",editType:\"calc+arraydraw\"},xanchor:{valType:\"enumerated\",values:[\"auto\",\"left\",\"center\",\"right\"],dflt:\"auto\",editType:\"calc+arraydraw\"},yanchor:{valType:\"enumerated\",values:[\"top\",\"middle\",\"bottom\"],editType:\"calc+arraydraw\"},padding:{valType:\"number\",dflt:3,min:0,editType:\"arraydraw\"},editType:\"arraydraw\"},editType:\"arraydraw\"})},96084:function(t,e,r){\"use strict\";var n=r(3400),i=r(54460),a=r(85448),o=r(65152);function s(t){return u(t.line.width,t.xsizemode,t.x0,t.x1,t.path,!1)}function l(t){return u(t.line.width,t.ysizemode,t.y0,t.y1,t.path,!0)}function u(t,e,r,i,s,l){var u=t/2,c=l;if(\"pixel\"===e){var f=s?o.extractPathCoords(s,l?a.paramIsY:a.paramIsX):[r,i],h=n.aggNums(Math.max,null,f),p=n.aggNums(Math.min,null,f),d=p<0?Math.abs(p)+u:u,v=h>0?h+u:u;return{ppad:u,ppadplus:c?d:v,ppadminus:c?v:d}}return{ppad:u}}function c(t,e,r,n,i){var s=\"category\"===t.type||\"multicategory\"===t.type?t.r2c:t.d2c;if(void 0!==e)return[s(e),s(r)];if(n){var l,u,c,f,h=1/0,p=-1/0,d=n.match(a.segmentRE);for(\"date\"===t.type&&(s=o.decodeDate(s)),l=0;lp&&(p=f)));return p>=h?[h,p]:void 0}}t.exports=function(t){var e=t._fullLayout,r=n.filterVisible(e.shapes);if(r.length&&t._fullData.length)for(var o=0;o=t?e-n:n-e,-180/Math.PI*Math.atan2(i,a)}(x,_,b,w):0),A.call((function(e){return e.call(o.font,k).attr({}),a.convertToTspans(e,t),e}));var U=function(t,e,r,n,i,a,o){var s,l,u,c,h=i.label.textposition,p=i.label.textangle,d=i.label.padding,v=i.type,g=Math.PI/180*a,y=Math.sin(g),m=Math.cos(g),x=i.label.xanchor,b=i.label.yanchor;if(\"line\"===v){\"start\"===h?(s=t,l=e):\"end\"===h?(s=r,l=n):(s=(t+r)/2,l=(e+n)/2),\"auto\"===x&&(x=\"start\"===h?\"auto\"===p?r>t?\"left\":rt?\"right\":rt?\"right\":rt?\"left\":r1&&(2!==t.length||\"Z\"!==t[1][0])&&(0===C&&(t[0][0]=\"M\"),e[L]=t,A(),M())}}()}}function V(t,r){!function(t,r){if(e.length)for(var n=0;n_?(M=p,C=\"y0\",S=_,P=\"y1\"):(M=_,C=\"y1\",S=p,P=\"y0\"),tt(n),nt(l,r),function(t,e,r){var n=e.xref,i=e.yref,a=o.getFromId(r,n),s=o.getFromId(r,i),l=\"\";\"paper\"===n||a.autorange||(l+=n),\"paper\"===i||s.autorange||(l+=i),h.setClipUrl(t,l?\"clip\"+r._fullLayout._uid+l:null,r)}(e,r,t),Q.moveFn=\"move\"===D?et:rt,Q.altKey=n.altKey)},doneFn:function(){b(t)||(v(e),it(l),T(e,t,r),i.call(\"_guiRelayout\",t,c.getUpdateObj()))},clickFn:function(){b(t)||it(l)}};function tt(r){if(b(t))D=null;else if(j)D=\"path\"===r.target.tagName?\"move\":\"start-point\"===r.target.attributes[\"data-line-point\"].value?\"resize-over-start-point\":\"resize-over-end-point\";else{var n=Q.element.getBoundingClientRect(),i=n.right-n.left,a=n.bottom-n.top,o=r.clientX-n.left,s=r.clientY-n.top,l=!U&&i>R&&a>F&&!r.shiftKey?d.getCursor(o/i,1-s/a):\"move\";v(e,l),D=l.split(\"-\")[0]}}function et(n,i){if(\"path\"===r.type){var a=function(t){return t},o=a,c=a;B?V(\"xanchor\",r.xanchor=K(w+n)):(o=function(t){return K(X(t)+n)},H&&\"date\"===H.type&&(o=y.encodeDate(o))),N?V(\"yanchor\",r.yanchor=J(A+i)):(c=function(t){return J(Z(t)+i)},W&&\"date\"===W.type&&(c=y.encodeDate(c))),V(\"path\",r.path=k(z,o,c))}else B?V(\"xanchor\",r.xanchor=K(w+n)):(V(\"x0\",r.x0=K(f+n)),V(\"x1\",r.x1=K(x+n))),N?V(\"yanchor\",r.yanchor=J(A+i)):(V(\"y0\",r.y0=J(p+i)),V(\"y1\",r.y1=J(_+i)));e.attr(\"d\",m(t,r)),nt(l,r),u(t,s,r,q)}function rt(n,i){if(U){var a=function(t){return t},o=a,c=a;B?V(\"xanchor\",r.xanchor=K(w+n)):(o=function(t){return K(X(t)+n)},H&&\"date\"===H.type&&(o=y.encodeDate(o))),N?V(\"yanchor\",r.yanchor=J(A+i)):(c=function(t){return J(Z(t)+i)},W&&\"date\"===W.type&&(c=y.encodeDate(c))),V(\"path\",r.path=k(z,o,c))}else if(j){if(\"resize-over-start-point\"===D){var h=f+n,d=N?p-i:p+i;V(\"x0\",r.x0=B?h:K(h)),V(\"y0\",r.y0=N?d:J(d))}else if(\"resize-over-end-point\"===D){var v=x+n,g=N?_-i:_+i;V(\"x1\",r.x1=B?v:K(v)),V(\"y1\",r.y1=N?g:J(g))}}else{var b=function(t){return-1!==D.indexOf(t)},T=b(\"n\"),G=b(\"s\"),Y=b(\"w\"),$=b(\"e\"),Q=T?M+i:M,tt=G?S+i:S,et=Y?E+n:E,rt=$?L+n:L;N&&(T&&(Q=M-i),G&&(tt=S-i)),(!N&&tt-Q>F||N&&Q-tt>F)&&(V(C,r[C]=N?Q:J(Q)),V(P,r[P]=N?tt:J(tt))),rt-et>R&&(V(O,r[O]=B?et:K(et)),V(I,r[I]=B?rt:K(rt)))}e.attr(\"d\",m(t,r)),nt(l,r),u(t,s,r,q)}function nt(t,e){(B||N)&&function(){var r=\"path\"!==e.type,n=t.selectAll(\".visual-cue\").data([0]);n.enter().append(\"path\").attr({fill:\"#fff\",\"fill-rule\":\"evenodd\",stroke:\"#000\",\"stroke-width\":1}).classed(\"visual-cue\",!0);var i=X(B?e.xanchor:a.midRange(r?[e.x0,e.x1]:y.extractPathCoords(e.path,g.paramIsX))),o=Z(N?e.yanchor:a.midRange(r?[e.y0,e.y1]:y.extractPathCoords(e.path,g.paramIsY)));if(i=y.roundPositionForSharpStrokeRendering(i,1),o=y.roundPositionForSharpStrokeRendering(o,1),B&&N){var s=\"M\"+(i-1-1)+\",\"+(o-1-1)+\"h-8v2h8 v8h2v-8 h8v-2h-8 v-8h-2 Z\";n.attr(\"d\",s)}else if(B){var l=\"M\"+(i-1-1)+\",\"+(o-9-1)+\"v18 h2 v-18 Z\";n.attr(\"d\",l)}else{var u=\"M\"+(i-9-1)+\",\"+(o-1-1)+\"h18 v2 h-18 Z\";n.attr(\"d\",u)}}()}function it(t){t.selectAll(\".visual-cue\").remove()}d.init(Q),$.node().onmousemove=tt}(t,F,c,e,r,D):!0===c.editable&&F.style(\"pointer-events\",I||f.opacity(L)*E<=.5?\"stroke\":\"all\");F.node().addEventListener(\"click\",(function(){return function(t,e){if(_(t)){var r=+e.node().getAttribute(\"data-index\");if(r>=0){if(r===t._fullLayout._activeShapeIndex)return void A(t);t._fullLayout._activeShapeIndex=r,t._fullLayout._deactivateShape=A,x(t)}}}(t,F)}))}c._input&&!0===c.visible&&(\"above\"===c.layer?M(t._fullLayout._shapeUpperLayer):\"paper\"===c.xref||\"paper\"===c.yref?M(t._fullLayout._shapeLowerLayer):\"between\"===c.layer?M(w.shapelayerBetween):w._hadPlotinfo?M((w.mainplotinfo||w).shapelayer):M(t._fullLayout._shapeLowerLayer))}function T(t,e,r){var n=(r.xref+r.yref).replace(/paper/g,\"\").replace(/[xyz][1-9]* *domain/g,\"\");h.setClipUrl(t,n?\"clip\"+e._fullLayout._uid+n:null,e)}function k(t,e,r){return t.replace(g.segmentRE,(function(t){var n=0,i=t.charAt(0),a=g.paramIsX[i],o=g.paramIsY[i],s=g.numParams[i];return i+t.substr(1).replace(g.paramRE,(function(t){return n>=s||(a[n]?t=e(t):o[n]&&(t=r(t)),n++),t}))}))}function A(t){_(t)&&t._fullLayout._activeShapeIndex>=0&&(c(t),delete t._fullLayout._activeShapeIndex,x(t))}t.exports={draw:x,drawOne:w,eraseActiveShape:function(t){if(_(t)){c(t);var e=t._fullLayout._activeShapeIndex,r=(t.layout||{}).shapes||[];if(e0&&lp&&(t=\"X\"),t}));return a>p&&(d=d.replace(/[\\s,]*X.*/,\"\"),i.log(\"Ignoring extra params in segment \"+t)),c+d}))}(r,s,u);if(\"pixel\"===r.xsizemode){var b=s(r.xanchor);c=b+r.x0,f=b+r.x1}else c=s(r.x0),f=s(r.x1);if(\"pixel\"===r.ysizemode){var _=u(r.yanchor);h=_-r.y0,p=_-r.y1}else h=u(r.y0),p=u(r.y1);if(\"line\"===d)return\"M\"+c+\",\"+h+\"L\"+f+\",\"+p;if(\"rect\"===d)return\"M\"+c+\",\"+h+\"H\"+f+\"V\"+p+\"H\"+c+\"Z\";var w=(c+f)/2,T=(h+p)/2,k=Math.abs(w-c),A=Math.abs(T-h),M=\"A\"+k+\",\"+A,S=w+k+\",\"+T;return\"M\"+S+M+\" 0 1,1 \"+w+\",\"+(T-A)+M+\" 0 0,1 \"+S+\"Z\"}},41592:function(t,e,r){\"use strict\";var n=r(4016);t.exports={moduleType:\"component\",name:\"shapes\",layoutAttributes:r(46056),supplyLayoutDefaults:r(43712),supplyDrawNewShapeDefaults:r(65144),includeBasePlot:r(36632)(\"shapes\"),calcAutorange:r(96084),draw:n.draw,drawOne:n.drawOne}},97728:function(t){\"use strict\";function e(t,e){return e?e.d2l(t):t}function r(t,e){return e?e.l2d(t):t}function n(t,r){return e(t.x1,r)-e(t.x0,r)}function i(t,r,n){return e(t.y1,n)-e(t.y0,n)}t.exports={x0:function(t){return t.x0},x1:function(t){return t.x1},y0:function(t){return t.y0},y1:function(t){return t.y1},slope:function(t,e,r){return\"line\"!==t.type?void 0:i(t,0,r)/n(t,e)},dx:n,dy:i,width:function(t,e){return Math.abs(n(t,e))},height:function(t,e,r){return Math.abs(i(t,0,r))},length:function(t,e,r){return\"line\"!==t.type?void 0:Math.sqrt(Math.pow(n(t,e),2)+Math.pow(i(t,0,r),2))},xcenter:function(t,n){return r((e(t.x1,n)+e(t.x0,n))/2,n)},ycenter:function(t,n,i){return r((e(t.y1,i)+e(t.y0,i))/2,i)}}},89861:function(t,e,r){\"use strict\";var n=r(25376),i=r(66741),a=r(92880).extendDeepAll,o=r(67824).overrideAll,s=r(85656),l=r(31780).templatedArray,u=r(60876),c=l(\"step\",{visible:{valType:\"boolean\",dflt:!0},method:{valType:\"enumerated\",values:[\"restyle\",\"relayout\",\"animate\",\"update\",\"skip\"],dflt:\"restyle\"},args:{valType:\"info_array\",freeLength:!0,items:[{valType:\"any\"},{valType:\"any\"},{valType:\"any\"}]},label:{valType:\"string\"},value:{valType:\"string\"},execute:{valType:\"boolean\",dflt:!0}});t.exports=o(l(\"slider\",{visible:{valType:\"boolean\",dflt:!0},active:{valType:\"number\",min:0,dflt:0},steps:c,lenmode:{valType:\"enumerated\",values:[\"fraction\",\"pixels\"],dflt:\"fraction\"},len:{valType:\"number\",min:0,dflt:1},x:{valType:\"number\",min:-2,max:3,dflt:0},pad:a(i({editType:\"arraydraw\"}),{},{t:{dflt:20}}),xanchor:{valType:\"enumerated\",values:[\"auto\",\"left\",\"center\",\"right\"],dflt:\"left\"},y:{valType:\"number\",min:-2,max:3,dflt:0},yanchor:{valType:\"enumerated\",values:[\"auto\",\"top\",\"middle\",\"bottom\"],dflt:\"top\"},transition:{duration:{valType:\"number\",min:0,dflt:150},easing:{valType:\"enumerated\",values:s.transition.easing.values,dflt:\"cubic-in-out\"}},currentvalue:{visible:{valType:\"boolean\",dflt:!0},xanchor:{valType:\"enumerated\",values:[\"left\",\"center\",\"right\"],dflt:\"left\"},offset:{valType:\"number\",dflt:10},prefix:{valType:\"string\"},suffix:{valType:\"string\"},font:n({})},font:n({}),activebgcolor:{valType:\"color\",dflt:u.gripBgActiveColor},bgcolor:{valType:\"color\",dflt:u.railBgColor},bordercolor:{valType:\"color\",dflt:u.railBorderColor},borderwidth:{valType:\"number\",min:0,dflt:u.railBorderWidth},ticklen:{valType:\"number\",min:0,dflt:u.tickLength},tickcolor:{valType:\"color\",dflt:u.tickColor},tickwidth:{valType:\"number\",min:0,dflt:1},minorticklen:{valType:\"number\",min:0,dflt:u.minorTickLength}}),\"arraydraw\",\"from-root\")},60876:function(t){\"use strict\";t.exports={name:\"sliders\",containerClassName:\"slider-container\",groupClassName:\"slider-group\",inputAreaClass:\"slider-input-area\",railRectClass:\"slider-rail-rect\",railTouchRectClass:\"slider-rail-touch-rect\",gripRectClass:\"slider-grip-rect\",tickRectClass:\"slider-tick-rect\",inputProxyClass:\"slider-input-proxy\",labelsClass:\"slider-labels\",labelGroupClass:\"slider-label-group\",labelClass:\"slider-label\",currentValueClass:\"slider-current-value\",railHeight:5,menuIndexAttrName:\"slider-active-index\",autoMarginIdRoot:\"slider-\",minWidth:30,minHeight:30,textPadX:40,arrowOffsetX:4,railRadius:2,railWidth:5,railBorder:4,railBorderWidth:1,railBorderColor:\"#bec8d9\",railBgColor:\"#f8fafc\",railInset:8,stepInset:10,gripRadius:10,gripWidth:20,gripHeight:20,gripBorder:20,gripBorderWidth:1,gripBorderColor:\"#bec8d9\",gripBgColor:\"#f6f8fa\",gripBgActiveColor:\"#dbdde0\",labelPadding:8,labelOffset:0,tickWidth:1,tickColor:\"#333\",tickOffset:25,tickLength:7,minorTickOffset:25,minorTickColor:\"#333\",minorTickLength:4,currentValuePadding:8,currentValueInset:0}},8132:function(t,e,r){\"use strict\";var n=r(3400),i=r(51272),a=r(89861),o=r(60876).name,s=a.steps;function l(t,e,r){function o(r,i){return n.coerce(t,e,a,r,i)}for(var s=i(t,e,{name:\"steps\",handleItemDefaults:u}),l=0,c=0;c0&&(s=s.transition().duration(e.transition.duration).ease(e.transition.easing)),s.attr(\"transform\",l(o-.5*f.gripWidth,e._dims.currentValueTotalHeight))}}function E(t,e){var r=t._dims;return r.inputAreaStart+f.stepInset+(r.inputAreaLength-2*f.stepInset)*Math.min(1,Math.max(0,e))}function L(t,e){var r=t._dims;return Math.min(1,Math.max(0,(e-f.stepInset-r.inputAreaStart)/(r.inputAreaLength-2*f.stepInset-2*r.inputAreaStart)))}function C(t,e,r){var n=r._dims,i=s.ensureSingle(t,\"rect\",f.railTouchRectClass,(function(n){n.call(A,e,t,r).style(\"pointer-events\",\"all\")}));i.attr({width:n.inputAreaLength,height:Math.max(n.inputAreaWidth,f.tickOffset+r.ticklen+n.labelHeight)}).call(a.fill,r.bgcolor).attr(\"opacity\",0),o.setTranslate(i,0,n.currentValueTotalHeight)}function P(t,e){var r=e._dims,n=r.inputAreaLength-2*f.railInset,i=s.ensureSingle(t,\"rect\",f.railRectClass);i.attr({width:n,height:f.railWidth,rx:f.railRadius,ry:f.railRadius,\"shape-rendering\":\"crispEdges\"}).call(a.stroke,e.bordercolor).call(a.fill,e.bgcolor).style(\"stroke-width\",e.borderwidth+\"px\"),o.setTranslate(i,f.railInset,.5*(r.inputAreaWidth-f.railWidth)+r.currentValueTotalHeight)}t.exports=function(t){var e=t._context.staticPlot,r=t._fullLayout,a=function(t,e){for(var r=t[f.name],n=[],i=0;i0?[0]:[]);function l(e){e._commandObserver&&(e._commandObserver.remove(),delete e._commandObserver),i.autoMargin(t,g(e))}if(s.enter().append(\"g\").classed(f.containerClassName,!0).style(\"cursor\",e?null:\"ew-resize\"),s.exit().each((function(){n.select(this).selectAll(\"g.\"+f.groupClassName).each(l)})).remove(),0!==a.length){var u=s.selectAll(\"g.\"+f.groupClassName).data(a,y);u.enter().append(\"g\").classed(f.groupClassName,!0),u.exit().each(l).remove();for(var c=0;c0||_<0){var M={left:[-w,0],right:[w,0],top:[0,-w],bottom:[0,w]}[b.side];r.attr(\"transform\",l(M[0],M[1]))}}}return N.call(j),R&&(E?N.on(\".opacity\",null):(A=0,M=!0,N.text(m).on(\"mouseover.opacity\",(function(){n.select(this).transition().duration(h.SHOW_PLACEHOLDER).style(\"opacity\",1)})).on(\"mouseout.opacity\",(function(){n.select(this).transition().duration(h.HIDE_PLACEHOLDER).style(\"opacity\",0)}))),N.call(f.makeEditable,{gd:t}).on(\"edit\",(function(e){void 0!==x?o.call(\"_guiRestyle\",t,y,e,x):o.call(\"_guiRelayout\",t,y,e)})).on(\"cancel\",(function(){this.text(this.attr(\"data-unformatted\")).call(j)})).on(\"input\",(function(t){this.text(t||\" \").call(f.positionText,_.x,_.y)}))),N.classed(\"js-placeholder\",M),T}}},88444:function(t,e,r){\"use strict\";var n=r(25376),i=r(22548),a=r(92880).extendFlat,o=r(67824).overrideAll,s=r(66741),l=r(31780).templatedArray,u=l(\"button\",{visible:{valType:\"boolean\"},method:{valType:\"enumerated\",values:[\"restyle\",\"relayout\",\"animate\",\"update\",\"skip\"],dflt:\"restyle\"},args:{valType:\"info_array\",freeLength:!0,items:[{valType:\"any\"},{valType:\"any\"},{valType:\"any\"}]},args2:{valType:\"info_array\",freeLength:!0,items:[{valType:\"any\"},{valType:\"any\"},{valType:\"any\"}]},label:{valType:\"string\",dflt:\"\"},execute:{valType:\"boolean\",dflt:!0}});t.exports=o(l(\"updatemenu\",{_arrayAttrRegexps:[/^updatemenus\\[(0|[1-9][0-9]+)\\]\\.buttons/],visible:{valType:\"boolean\"},type:{valType:\"enumerated\",values:[\"dropdown\",\"buttons\"],dflt:\"dropdown\"},direction:{valType:\"enumerated\",values:[\"left\",\"right\",\"up\",\"down\"],dflt:\"down\"},active:{valType:\"integer\",min:-1,dflt:0},showactive:{valType:\"boolean\",dflt:!0},buttons:u,x:{valType:\"number\",min:-2,max:3,dflt:-.05},xanchor:{valType:\"enumerated\",values:[\"auto\",\"left\",\"center\",\"right\"],dflt:\"right\"},y:{valType:\"number\",min:-2,max:3,dflt:1},yanchor:{valType:\"enumerated\",values:[\"auto\",\"top\",\"middle\",\"bottom\"],dflt:\"top\"},pad:a(s({editType:\"arraydraw\"}),{}),font:n({}),bgcolor:{valType:\"color\"},bordercolor:{valType:\"color\",dflt:i.borderLine},borderwidth:{valType:\"number\",min:0,dflt:1,editType:\"arraydraw\"}}),\"arraydraw\",\"from-root\")},73712:function(t){\"use strict\";t.exports={name:\"updatemenus\",containerClassName:\"updatemenu-container\",headerGroupClassName:\"updatemenu-header-group\",headerClassName:\"updatemenu-header\",headerArrowClassName:\"updatemenu-header-arrow\",dropdownButtonGroupClassName:\"updatemenu-dropdown-button-group\",dropdownButtonClassName:\"updatemenu-dropdown-button\",buttonClassName:\"updatemenu-button\",itemRectClassName:\"updatemenu-item-rect\",itemTextClassName:\"updatemenu-item-text\",menuIndexAttrName:\"updatemenu-active-index\",autoMarginIdRoot:\"updatemenu-\",blankHeaderOpts:{label:\" \"},minWidth:30,minHeight:30,textPadX:24,arrowPadX:16,rx:2,ry:2,textOffsetX:12,textOffsetY:3,arrowOffsetX:4,gapButtonHeader:5,gapButton:2,activeColor:\"#F4FAFF\",hoverColor:\"#F4FAFF\",arrowSymbol:{left:\"◄\",right:\"►\",up:\"▲\",down:\"▼\"}}},91384:function(t,e,r){\"use strict\";var n=r(3400),i=r(51272),a=r(88444),o=r(73712).name,s=a.buttons;function l(t,e,r){function o(r,i){return n.coerce(t,e,a,r,i)}o(\"visible\",i(t,e,{name:\"buttons\",handleItemDefaults:u}).length>0)&&(o(\"active\"),o(\"direction\"),o(\"type\"),o(\"showactive\"),o(\"x\"),o(\"y\"),n.noneOrAll(t,e,[\"x\",\"y\"]),o(\"xanchor\"),o(\"yanchor\"),o(\"pad.t\"),o(\"pad.r\"),o(\"pad.b\"),o(\"pad.l\"),n.coerceFont(o,\"font\",r.font),o(\"bgcolor\",r.paper_bgcolor),o(\"bordercolor\"),o(\"borderwidth\"))}function u(t,e){function r(r,i){return n.coerce(t,e,s,r,i)}r(\"visible\",\"skip\"===t.method||Array.isArray(t.args))&&(r(\"method\"),r(\"args\"),r(\"args2\"),r(\"label\"),r(\"execute\"))}t.exports=function(t,e){i(t,e,{name:o,handleItemDefaults:l})}},14420:function(t,e,r){\"use strict\";var n=r(33428),i=r(7316),a=r(76308),o=r(43616),s=r(3400),l=r(72736),u=r(31780).arrayEditor,c=r(84284).LINE_SPACING,f=r(73712),h=r(37400);function p(t){return t._index}function d(t,e){return+t.attr(f.menuIndexAttrName)===e._index}function v(t,e,r,n,i,a,o,s){e.active=o,u(t.layout,f.name,e).applyUpdate(\"active\",o),\"buttons\"===e.type?y(t,n,null,null,e):\"dropdown\"===e.type&&(i.attr(f.menuIndexAttrName,\"-1\"),g(t,n,i,a,e),s||y(t,n,i,a,e))}function g(t,e,r,n,i){var a=s.ensureSingle(e,\"g\",f.headerClassName,(function(t){t.style(\"pointer-events\",\"all\")})),l=i._dims,u=i.active,c=i.buttons[u]||f.blankHeaderOpts,h={y:i.pad.t,yPad:0,x:i.pad.l,xPad:0,index:0},p={width:l.headerWidth,height:l.headerHeight};a.call(m,i,c,t).call(M,i,h,p),s.ensureSingle(e,\"text\",f.headerArrowClassName,(function(t){t.attr(\"text-anchor\",\"end\").call(o.font,i.font).text(f.arrowSymbol[i.direction])})).attr({x:l.headerWidth-f.arrowOffsetX+i.pad.l,y:l.headerHeight/2+f.textOffsetY+i.pad.t}),a.on(\"click\",(function(){r.call(S,String(d(r,i)?-1:i._index)),y(t,e,r,n,i)})),a.on(\"mouseover\",(function(){a.call(w)})),a.on(\"mouseout\",(function(){a.call(T,i)})),o.setTranslate(e,l.lx,l.ly)}function y(t,e,r,a,o){r||(r=e).attr(\"pointer-events\",\"all\");var l=function(t){return-1==+t.attr(f.menuIndexAttrName)}(r)&&\"buttons\"!==o.type?[]:o.buttons,u=\"dropdown\"===o.type?f.dropdownButtonClassName:f.buttonClassName,c=r.selectAll(\"g.\"+u).data(s.filterVisible(l)),h=c.enter().append(\"g\").classed(u,!0),p=c.exit();\"dropdown\"===o.type?(h.attr(\"opacity\",\"0\").transition().attr(\"opacity\",\"1\"),p.transition().attr(\"opacity\",\"0\").remove()):p.remove();var d=0,g=0,y=o._dims,x=-1!==[\"up\",\"down\"].indexOf(o.direction);\"dropdown\"===o.type&&(x?g=y.headerHeight+f.gapButtonHeader:d=y.headerWidth+f.gapButtonHeader),\"dropdown\"===o.type&&\"up\"===o.direction&&(g=-f.gapButtonHeader+f.gapButton-y.openHeight),\"dropdown\"===o.type&&\"left\"===o.direction&&(d=-f.gapButtonHeader+f.gapButton-y.openWidth);var b={x:y.lx+d+o.pad.l,y:y.ly+g+o.pad.t,yPad:f.gapButton,xPad:f.gapButton,index:0},k={l:b.x+o.borderwidth,t:b.y+o.borderwidth};c.each((function(s,l){var u=n.select(this);u.call(m,o,s,t).call(M,o,b),u.on(\"click\",(function(){n.event.defaultPrevented||(s.execute&&(s.args2&&o.active===l?(v(t,o,0,e,r,a,-1),i.executeAPICommand(t,s.method,s.args2)):(v(t,o,0,e,r,a,l),i.executeAPICommand(t,s.method,s.args))),t.emit(\"plotly_buttonclicked\",{menu:o,button:s,active:o.active}))})),u.on(\"mouseover\",(function(){u.call(w)})),u.on(\"mouseout\",(function(){u.call(T,o),c.call(_,o)}))})),c.call(_,o),x?(k.w=Math.max(y.openWidth,y.headerWidth),k.h=b.y-k.t):(k.w=b.x-k.l,k.h=Math.max(y.openHeight,y.headerHeight)),k.direction=o.direction,a&&(c.size()?function(t,e,r,n,i,a){var o,s,l,u=i.direction,c=\"up\"===u||\"down\"===u,h=i._dims,p=i.active;if(c)for(s=0,l=0;l0?[0]:[]);if(o.enter().append(\"g\").classed(f.containerClassName,!0).style(\"cursor\",\"pointer\"),o.exit().each((function(){n.select(this).selectAll(\"g.\"+f.headerGroupClassName).each(a)})).remove(),0!==r.length){var l=o.selectAll(\"g.\"+f.headerGroupClassName).data(r,p);l.enter().append(\"g\").classed(f.headerGroupClassName,!0);for(var u=s.ensureSingle(o,\"g\",f.dropdownButtonGroupClassName,(function(t){t.style(\"pointer-events\",\"all\")})),c=0;cw,A=s.barLength+2*s.barPad,M=s.barWidth+2*s.barPad,S=d,E=g+y;E+M>u&&(E=u-M);var L=this.container.selectAll(\"rect.scrollbar-horizontal\").data(k?[0]:[]);L.exit().on(\".drag\",null).remove(),L.enter().append(\"rect\").classed(\"scrollbar-horizontal\",!0).call(i.fill,s.barColor),k?(this.hbar=L.attr({rx:s.barRadius,ry:s.barRadius,x:S,y:E,width:A,height:M}),this._hbarXMin=S+A/2,this._hbarTranslateMax=w-A):(delete this.hbar,delete this._hbarXMin,delete this._hbarTranslateMax);var C=y>T,P=s.barWidth+2*s.barPad,O=s.barLength+2*s.barPad,I=d+v,z=g;I+P>l&&(I=l-P);var D=this.container.selectAll(\"rect.scrollbar-vertical\").data(C?[0]:[]);D.exit().on(\".drag\",null).remove(),D.enter().append(\"rect\").classed(\"scrollbar-vertical\",!0).call(i.fill,s.barColor),C?(this.vbar=D.attr({rx:s.barRadius,ry:s.barRadius,x:I,y:z,width:P,height:O}),this._vbarYMin=z+O/2,this._vbarTranslateMax=T-O):(delete this.vbar,delete this._vbarYMin,delete this._vbarTranslateMax);var R=this.id,F=c-.5,B=C?f+P+.5:f+.5,N=h-.5,j=k?p+M+.5:p+.5,U=o._topdefs.selectAll(\"#\"+R).data(k||C?[0]:[]);if(U.exit().remove(),U.enter().append(\"clipPath\").attr(\"id\",R).append(\"rect\"),k||C?(this._clipRect=U.select(\"rect\").attr({x:Math.floor(F),y:Math.floor(N),width:Math.ceil(B)-Math.floor(F),height:Math.ceil(j)-Math.floor(N)}),this.container.call(a.setClipUrl,R,this.gd),this.bg.attr({x:d,y:g,width:v,height:y})):(this.bg.attr({width:0,height:0}),this.container.on(\"wheel\",null).on(\".drag\",null).call(a.setClipUrl,null),delete this._clipRect),k||C){var V=n.behavior.drag().on(\"dragstart\",(function(){n.event.sourceEvent.preventDefault()})).on(\"drag\",this._onBoxDrag.bind(this));this.container.on(\"wheel\",null).on(\"wheel\",this._onBoxWheel.bind(this)).on(\".drag\",null).call(V);var q=n.behavior.drag().on(\"dragstart\",(function(){n.event.sourceEvent.preventDefault(),n.event.sourceEvent.stopPropagation()})).on(\"drag\",this._onBarDrag.bind(this));k&&this.hbar.on(\".drag\",null).call(q),C&&this.vbar.on(\".drag\",null).call(q)}this.setTranslate(e,r)},s.prototype.disable=function(){(this.hbar||this.vbar)&&(this.bg.attr({width:0,height:0}),this.container.on(\"wheel\",null).on(\".drag\",null).call(a.setClipUrl,null),delete this._clipRect),this.hbar&&(this.hbar.on(\".drag\",null),this.hbar.remove(),delete this.hbar,delete this._hbarXMin,delete this._hbarTranslateMax),this.vbar&&(this.vbar.on(\".drag\",null),this.vbar.remove(),delete this.vbar,delete this._vbarYMin,delete this._vbarTranslateMax)},s.prototype._onBoxDrag=function(){var t=this.translateX,e=this.translateY;this.hbar&&(t-=n.event.dx),this.vbar&&(e-=n.event.dy),this.setTranslate(t,e)},s.prototype._onBoxWheel=function(){var t=this.translateX,e=this.translateY;this.hbar&&(t+=n.event.deltaY),this.vbar&&(e+=n.event.deltaY),this.setTranslate(t,e)},s.prototype._onBarDrag=function(){var t=this.translateX,e=this.translateY;if(this.hbar){var r=t+this._hbarXMin,i=r+this._hbarTranslateMax;t=(o.constrain(n.event.x,r,i)-r)/(i-r)*(this.position.w-this._box.w)}if(this.vbar){var a=e+this._vbarYMin,s=a+this._vbarTranslateMax;e=(o.constrain(n.event.y,a,s)-a)/(s-a)*(this.position.h-this._box.h)}this.setTranslate(t,e)},s.prototype.setTranslate=function(t,e){var r=this.position.w-this._box.w,n=this.position.h-this._box.h;if(t=o.constrain(t||0,0,r),e=o.constrain(e||0,0,n),this.translateX=t,this.translateY=e,this.container.call(a.setTranslate,this._box.l-this.position.l-t,this._box.t-this.position.t-e),this._clipRect&&this._clipRect.attr({x:Math.floor(this.position.l+t-.5),y:Math.floor(this.position.t+e-.5)}),this.hbar){var i=t/r;this.hbar.call(a.setTranslate,t+i*this._hbarTranslateMax,e)}if(this.vbar){var s=e/n;this.vbar.call(a.setTranslate,t,e+s*this._vbarTranslateMax)}}},84284:function(t){\"use strict\";t.exports={FROM_BL:{left:0,center:.5,right:1,bottom:0,middle:.5,top:1},FROM_TL:{left:0,center:.5,right:1,bottom:1,middle:.5,top:0},FROM_BR:{left:1,center:.5,right:0,bottom:0,middle:.5,top:1},LINE_SPACING:1.3,CAP_SHIFT:.7,MID_SHIFT:.35,OPPOSITE_SIDE:{left:\"right\",right:\"left\",top:\"bottom\",bottom:\"top\"}}},36208:function(t){\"use strict\";t.exports={axisRefDescription:function(t,e,r){return[\"If set to a\",t,\"axis id (e.g. *\"+t+\"* or\",\"*\"+t+\"2*), the `\"+t+\"` position refers to a\",t,\"coordinate. If set to *paper*, the `\"+t+\"`\",\"position refers to the distance from the\",e,\"of the plotting\",\"area in normalized coordinates where *0* (*1*) corresponds to the\",e,\"(\"+r+\"). If set to a\",t,\"axis ID followed by\",\"*domain* (separated by a space), the position behaves like for\",\"*paper*, but refers to the distance in fractions of the domain\",\"length from the\",e,\"of the domain of that axis: e.g.,\",\"*\"+t+\"2 domain* refers to the domain of the second\",t,\" axis and a\",t,\"position of 0.5 refers to the\",\"point between the\",e,\"and the\",r,\"of the domain of the\",\"second\",t,\"axis.\"].join(\" \")}}},48164:function(t){\"use strict\";t.exports={INCREASING:{COLOR:\"#3D9970\",SYMBOL:\"▲\"},DECREASING:{COLOR:\"#FF4136\",SYMBOL:\"▼\"}}},26880:function(t){\"use strict\";t.exports={FORMAT_LINK:\"https://github.com/d3/d3-format/tree/v1.4.5#d3-format\",DATE_FORMAT_LINK:\"https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format\"}},69104:function(t){\"use strict\";t.exports={COMPARISON_OPS:[\"=\",\"!=\",\"<\",\">=\",\">\",\"<=\"],COMPARISON_OPS2:[\"=\",\"<\",\">=\",\">\",\"<=\"],INTERVAL_OPS:[\"[]\",\"()\",\"[)\",\"(]\",\"][\",\")(\",\"](\",\")[\"],SET_OPS:[\"{}\",\"}{\"],CONSTRAINT_REDUCTION:{\"=\":\"=\",\"<\":\"<\",\"<=\":\"<\",\">\":\">\",\">=\":\">\",\"[]\":\"[]\",\"()\":\"[]\",\"[)\":\"[]\",\"(]\":\"[]\",\"][\":\"][\",\")(\":\"][\",\"](\":\"][\",\")[\":\"][\"}}},99168:function(t){\"use strict\";t.exports={solid:[[],0],dot:[[.5,1],200],dash:[[.5,1],50],longdash:[[.5,1],10],dashdot:[[.5,.625,.875,1],50],longdashdot:[[.5,.7,.8,1],10]}},87792:function(t){\"use strict\";t.exports={circle:\"●\",\"circle-open\":\"○\",square:\"■\",\"square-open\":\"□\",diamond:\"◆\",\"diamond-open\":\"◇\",cross:\"+\",x:\"❌\"}},13448:function(t){\"use strict\";t.exports={SHOW_PLACEHOLDER:100,HIDE_PLACEHOLDER:1e3,DESELECTDIM:.2}},39032:function(t){\"use strict\";t.exports={BADNUM:void 0,FP_SAFE:1e-4*Number.MAX_VALUE,ONEMAXYEAR:316224e5,ONEAVGYEAR:315576e5,ONEMINYEAR:31536e6,ONEMAXQUARTER:79488e5,ONEAVGQUARTER:78894e5,ONEMINQUARTER:76896e5,ONEMAXMONTH:26784e5,ONEAVGMONTH:26298e5,ONEMINMONTH:24192e5,ONEWEEK:6048e5,ONEDAY:864e5,ONEHOUR:36e5,ONEMIN:6e4,ONESEC:1e3,EPOCHJD:2440587.5,ALMOST_EQUAL:.999999,LOG_CLIP:10,MINUS_SIGN:\"−\"}},2264:function(t,e){\"use strict\";e.CSS_DECLARATIONS=[[\"image-rendering\",\"optimizeSpeed\"],[\"image-rendering\",\"-moz-crisp-edges\"],[\"image-rendering\",\"-o-crisp-edges\"],[\"image-rendering\",\"-webkit-optimize-contrast\"],[\"image-rendering\",\"optimize-contrast\"],[\"image-rendering\",\"crisp-edges\"],[\"image-rendering\",\"pixelated\"]],e.STYLE=e.CSS_DECLARATIONS.map((function(t){return t.join(\": \")+\"; \"})).join(\"\")},9616:function(t,e){\"use strict\";e.xmlns=\"http://www.w3.org/2000/xmlns/\",e.svg=\"http://www.w3.org/2000/svg\",e.xlink=\"http://www.w3.org/1999/xlink\",e.svgAttrs={xmlns:e.svg,\"xmlns:xlink\":e.xlink}},64884:function(t,e,r){\"use strict\";e.version=r(25788).version,r(88324),r(79288);for(var n=r(24040),i=e.register=n.register,a=r(22448),o=Object.keys(a),s=0;s\",\"\",\" \",\"\",\" plotly-logomark\",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\"\"].join(\"\")}}},98308:function(t,e){\"use strict\";e.isLeftAnchor=function(t){return\"left\"===t.xanchor||\"auto\"===t.xanchor&&t.x<=1/3},e.isCenterAnchor=function(t){return\"center\"===t.xanchor||\"auto\"===t.xanchor&&t.x>1/3&&t.x<2/3},e.isRightAnchor=function(t){return\"right\"===t.xanchor||\"auto\"===t.xanchor&&t.x>=2/3},e.isTopAnchor=function(t){return\"top\"===t.yanchor||\"auto\"===t.yanchor&&t.y>=2/3},e.isMiddleAnchor=function(t){return\"middle\"===t.yanchor||\"auto\"===t.yanchor&&t.y>1/3&&t.y<2/3},e.isBottomAnchor=function(t){return\"bottom\"===t.yanchor||\"auto\"===t.yanchor&&t.y<=1/3}},11864:function(t,e,r){\"use strict\";var n=r(20435),i=n.mod,a=n.modHalf,o=Math.PI,s=2*o;function l(t){return Math.abs(t[1]-t[0])>s-1e-14}function u(t,e){return a(e-t,s)}function c(t,e){if(l(e))return!0;var r,n;e[0](n=i(n,s))&&(n+=s);var a=i(t,s),o=a+s;return a>=r&&a<=n||o>=r&&o<=n}function f(t,e,r,n,i,a,u){i=i||0,a=a||0;var c,f,h,p,d,v=l([r,n]);function g(t,e){return[t*Math.cos(e)+i,a-t*Math.sin(e)]}v?(c=0,f=o,h=s):r=i&&t<=a);var i,a},pathArc:function(t,e,r,n,i){return f(null,t,e,r,n,i,0)},pathSector:function(t,e,r,n,i){return f(null,t,e,r,n,i,1)},pathAnnulus:function(t,e,r,n,i,a){return f(t,e,r,n,i,a,1)}}},38116:function(t,e,r){\"use strict\";var n=r(83160).decode,i=r(63620),a=Array.isArray,o=ArrayBuffer,s=DataView;function l(t){return o.isView(t)&&!(t instanceof s)}function u(t){return a(t)||l(t)}e.isTypedArray=l,e.isArrayOrTypedArray=u,e.isArray1D=function(t){return!u(t[0])},e.ensureArray=function(t,e){return a(t)||(t=[]),t.length=e,t};var c={u1c:\"undefined\"==typeof Uint8ClampedArray?void 0:Uint8ClampedArray,i1:\"undefined\"==typeof Int8Array?void 0:Int8Array,u1:\"undefined\"==typeof Uint8Array?void 0:Uint8Array,i2:\"undefined\"==typeof Int16Array?void 0:Int16Array,u2:\"undefined\"==typeof Uint16Array?void 0:Uint16Array,i4:\"undefined\"==typeof Int32Array?void 0:Int32Array,u4:\"undefined\"==typeof Uint32Array?void 0:Uint32Array,f4:\"undefined\"==typeof Float32Array?void 0:Float32Array,f8:\"undefined\"==typeof Float64Array?void 0:Float64Array};function f(t){return t.constructor===ArrayBuffer}function h(t,e,r){if(u(t)){if(u(t[0])){for(var n=r,i=0;ii.max?e.set(r):e.set(+t)}},integer:{coerceFunction:function(t,e,r,i){t%1||!n(t)||void 0!==i.min&&ti.max?e.set(r):e.set(+t)}},string:{coerceFunction:function(t,e,r,n){if(\"string\"!=typeof t){var i=\"number\"==typeof t;!0!==n.strict&&i?e.set(String(t)):e.set(r)}else n.noBlank&&!t?e.set(r):e.set(t)}},color:{coerceFunction:function(t,e,r){i(t).isValid()?e.set(t):e.set(r)}},colorlist:{coerceFunction:function(t,e,r){Array.isArray(t)&&t.length&&t.every((function(t){return i(t).isValid()}))?e.set(t):e.set(r)}},colorscale:{coerceFunction:function(t,e,r){e.set(o.get(t,r))}},angle:{coerceFunction:function(t,e,r){\"auto\"===t?e.set(\"auto\"):n(t)?e.set(f(+t,360)):e.set(r)}},subplotid:{coerceFunction:function(t,e,r,n){var i=n.regex||c(r);\"string\"==typeof t&&i.test(t)?e.set(t):e.set(r)},validateFunction:function(t,e){var r=e.dflt;return t===r||\"string\"==typeof t&&!!c(r).test(t)}},flaglist:{coerceFunction:function(t,e,r,n){if(-1===(n.extras||[]).indexOf(t))if(\"string\"==typeof t){for(var i=t.split(\"+\"),a=0;a=n&&t<=i?t:c}if(\"string\"!=typeof t&&\"number\"!=typeof t)return c;t=String(t);var u=_(r),y=t.charAt(0);!u||\"G\"!==y&&\"g\"!==y||(t=t.substr(1),r=\"\");var w=u&&\"chinese\"===r.substr(0,7),T=t.match(w?x:m);if(!T)return c;var k=T[1],A=T[3]||\"1\",M=Number(T[5]||1),S=Number(T[7]||0),E=Number(T[9]||0),L=Number(T[11]||0);if(u){if(2===k.length)return c;var C;k=Number(k);try{var P=g.getComponentMethod(\"calendars\",\"getCal\")(r);if(w){var O=\"i\"===A.charAt(A.length-1);A=parseInt(A,10),C=P.newDate(k,P.toMonthIndex(k,A,O),M)}else C=P.newDate(k,Number(A),M)}catch(t){return c}return C?(C.toJD()-v)*f+S*h+E*p+L*d:c}k=2===k.length?(Number(k)+2e3-b)%100+b:Number(k),A-=1;var I=new Date(Date.UTC(2e3,A,M,S,E));return I.setUTCFullYear(k),I.getUTCMonth()!==A||I.getUTCDate()!==M?c:I.getTime()+L*d},n=e.MIN_MS=e.dateTime2ms(\"-9999\"),i=e.MAX_MS=e.dateTime2ms(\"9999-12-31 23:59:59.9999\"),e.isDateTime=function(t,r){return e.dateTime2ms(t,r)!==c};var T=90*f,k=3*h,A=5*p;function M(t,e,r,n,i){if((e||r||n||i)&&(t+=\" \"+w(e,2)+\":\"+w(r,2),(n||i)&&(t+=\":\"+w(n,2),i))){for(var a=4;i%10==0;)a-=1,i/=10;t+=\".\"+w(i,a)}return t}e.ms2DateTime=function(t,e,r){if(\"number\"!=typeof t||!(t>=n&&t<=i))return c;e||(e=0);var a,o,s,u,m,x,b=Math.floor(10*l(t+.05,1)),w=Math.round(t-b/10);if(_(r)){var S=Math.floor(w/f)+v,E=Math.floor(l(t,f));try{a=g.getComponentMethod(\"calendars\",\"getCal\")(r).fromJD(S).formatDate(\"yyyy-mm-dd\")}catch(t){a=y(\"G%Y-%m-%d\")(new Date(w))}if(\"-\"===a.charAt(0))for(;a.length<11;)a=\"-0\"+a.substr(1);else for(;a.length<10;)a=\"0\"+a;o=e=n+f&&t<=i-f))return c;var e=Math.floor(10*l(t+.05,1)),r=new Date(Math.round(t-e/10));return M(a(\"%Y-%m-%d\")(r),r.getHours(),r.getMinutes(),r.getSeconds(),10*r.getUTCMilliseconds()+e)},e.cleanDate=function(t,r,n){if(t===c)return r;if(e.isJSDate(t)||\"number\"==typeof t&&isFinite(t)){if(_(n))return s.error(\"JS Dates and milliseconds are incompatible with world calendars\",t),r;if(!(t=e.ms2DateTimeLocal(+t))&&void 0!==r)return r}else if(!e.isDateTime(t,n))return s.error(\"unrecognized date\",t),r;return t};var S=/%\\d?f/g,E=/%h/g,L={1:\"1\",2:\"1\",3:\"2\",4:\"2\"};function C(t,e,r,n){t=t.replace(S,(function(t){var r=Math.min(+t.charAt(1)||6,6);return(e/1e3%1+2).toFixed(r).substr(2).replace(/0+$/,\"\")||\"0\"}));var i=new Date(Math.floor(e+.05));if(t=t.replace(E,(function(){return L[r(\"%q\")(i)]})),_(n))try{t=g.getComponentMethod(\"calendars\",\"worldCalFmt\")(t,e,n)}catch(t){return\"Invalid\"}return r(t)(i)}var P=[59,59.9,59.99,59.999,59.9999];e.formatDate=function(t,e,r,n,i,a){if(i=_(i)&&i,!e)if(\"y\"===r)e=a.year;else if(\"m\"===r)e=a.month;else{if(\"d\"!==r)return function(t,e){var r=l(t+.05,f),n=w(Math.floor(r/h),2)+\":\"+w(l(Math.floor(r/p),60),2);if(\"M\"!==e){o(e)||(e=0);var i=(100+Math.min(l(t/d,60),P[e])).toFixed(e).substr(1);e>0&&(i=i.replace(/0+$/,\"\").replace(/[\\.]$/,\"\")),n+=\":\"+i}return n}(t,r)+\"\\n\"+C(a.dayMonthYear,t,n,i);e=a.dayMonth+\"\\n\"+a.year}return C(e,t,n,i)};var O=3*f;e.incrementMonth=function(t,e,r){r=_(r)&&r;var n=l(t,f);if(t=Math.round(t-n),r)try{var i=Math.round(t/f)+v,a=g.getComponentMethod(\"calendars\",\"getCal\")(r),o=a.fromJD(i);return e%12?a.add(o,e,\"m\"):a.add(o,e/12,\"y\"),(o.toJD()-v)*f+n}catch(e){s.error(\"invalid ms \"+t+\" in calendar \"+r)}var u=new Date(t+O);return u.setUTCMonth(u.getUTCMonth()+e)+n-O},e.findExactDates=function(t,e){for(var r,n,i=0,a=0,s=0,l=0,u=_(e)&&g.getComponentMethod(\"calendars\",\"getCal\")(e),c=0;c0&&t[e+1][0]<0)return e;return null}switch(e=\"RUS\"===s||\"FJI\"===s?function(t){var e;if(null===u(t))e=t;else for(e=new Array(t.length),i=0;ie?r[n++]=[t[i][0]+360,t[i][1]]:i===e?(r[n++]=t[i],r[n++]=[t[i][0],-90]):r[n++]=t[i];var a=h.tester(r);a.pts.pop(),l.push(a)}:function(t){l.push(h.tester(t))},a.type){case\"MultiPolygon\":for(r=0;ri&&(i=u,e=l)}else e=r;return o.default(e).geometry.coordinates}(c),n.fIn=t,n.fOut=c,s.push(c)}else u.log([\"Location\",n.loc,\"does not have a valid GeoJSON geometry.\",\"Traces with locationmode *geojson-id* only support\",\"*Polygon* and *MultiPolygon* geometries.\"].join(\" \"))}delete i[r]}switch(r.type){case\"FeatureCollection\":var h=r.features;for(n=0;n100?(clearInterval(a),n(\"Unexpected error while fetching from \"+t)):void i++}),50)}))}for(var o=0;o0&&(r.push(i),i=[])}return i.length>0&&r.push(i),r},e.makeLine=function(t){return 1===t.length?{type:\"LineString\",coordinates:t[0]}:{type:\"MultiLineString\",coordinates:t}},e.makePolygon=function(t){if(1===t.length)return{type:\"Polygon\",coordinates:t};for(var e=new Array(t.length),r=0;r1||v<0||v>1?null:{x:t+l*v,y:e+f*v}}function l(t,e,r,n,i){var a=n*t+i*e;if(a<0)return n*n+i*i;if(a>r){var o=n-t,s=i-e;return o*o+s*s}var l=n*e-i*t;return l*l/r}e.segmentsIntersect=s,e.segmentDistance=function(t,e,r,n,i,a,o,u){if(s(t,e,r,n,i,a,o,u))return 0;var c=r-t,f=n-e,h=o-i,p=u-a,d=c*c+f*f,v=h*h+p*p,g=Math.min(l(c,f,d,i-t,a-e),l(c,f,d,o-t,u-e),l(h,p,v,t-i,e-a),l(h,p,v,r-i,n-a));return Math.sqrt(g)},e.getTextLocation=function(t,e,r,s){if(t===i&&s===a||(n={},i=t,a=s),n[r])return n[r];var l=t.getPointAtLength(o(r-s/2,e)),u=t.getPointAtLength(o(r+s/2,e)),c=Math.atan((u.y-l.y)/(u.x-l.x)),f=t.getPointAtLength(o(r,e)),h={x:(4*f.x+l.x+u.x)/6,y:(4*f.y+l.y+u.y)/6,theta:c};return n[r]=h,h},e.clearLocationCache=function(){i=null},e.getVisibleSegment=function(t,e,r){var n,i,a=e.left,o=e.right,s=e.top,l=e.bottom,u=0,c=t.getTotalLength(),f=c;function h(e){var r=t.getPointAtLength(e);0===e?n=r:e===c&&(i=r);var u=r.xo?r.x-o:0,f=r.yl?r.y-l:0;return Math.sqrt(u*u+f*f)}for(var p=h(u);p;){if((u+=p+r)>f)return;p=h(u)}for(p=h(f);p;){if(u>(f-=p+r))return;p=h(f)}return{min:u,max:f,len:f-u,total:c,isClosed:0===u&&f===c&&Math.abs(n.x-i.x)<.1&&Math.abs(n.y-i.y)<.1}},e.findPointOnPath=function(t,e,r,n){for(var i,a,o,s=(n=n||{}).pathLength||t.getTotalLength(),l=n.tolerance||.001,u=n.iterationLimit||30,c=t.getPointAtLength(0)[r]>t.getPointAtLength(s)[r]?-1:1,f=0,h=0,p=s;f0?p=i:h=i,f++}return a}},33040:function(t,e,r){\"use strict\";var n=r(38248),i=r(49760),a=r(72160),o=r(8932),s=r(22548).defaultLine,l=r(38116).isArrayOrTypedArray,u=a(s);function c(t,e){var r=t;return r[3]*=e,r}function f(t){if(n(t))return u;var e=a(t);return e.length?e:u}function h(t){return n(t)?t:1}t.exports={formatColor:function(t,e,r){var n=t.color;n&&n._inputArray&&(n=n._inputArray);var i,s,p,d,v,g=l(n),y=l(e),m=o.extractOpts(t),x=[];if(i=void 0!==m.colorscale?o.makeColorScaleFuncFromTrace(t):f,s=g?function(t,e){return void 0===t[e]?u:a(i(t[e]))}:f,p=y?function(t,e){return void 0===t[e]?1:h(t[e])}:h,g||y)for(var b=0;b1?(r*t+r*e)/r:t+e,i=String(n).length;if(i>16){var a=String(e).length;if(i>=String(t).length+a){var o=parseFloat(n).toPrecision(12);-1===o.indexOf(\"e+\")&&(n=+o)}}return n}},3400:function(t,e,r){\"use strict\";var n=r(33428),i=r(94336).E9,a=r(57624).E9,o=r(38248),s=r(39032),l=s.FP_SAFE,u=-l,c=s.BADNUM,f=t.exports={};f.adjustFormat=function(t){return!t||/^\\d[.]\\df/.test(t)||/[.]\\d%/.test(t)?t:\"0.f\"===t?\"~f\":/^\\d%/.test(t)?\"~%\":/^\\ds/.test(t)?\"~s\":!/^[~,.0$]/.test(t)&&/[&fps]/.test(t)?\"~\"+t:t};var h={};f.warnBadFormat=function(t){var e=String(t);h[e]||(h[e]=1,f.warn('encountered bad format: \"'+e+'\"'))},f.noFormat=function(t){return String(t)},f.numberFormat=function(t){var e;try{e=a(f.adjustFormat(t))}catch(e){return f.warnBadFormat(t),f.noFormat}return e},f.nestedProperty=r(22296),f.keyedContainer=r(37804),f.relativeAttr=r(23193),f.isPlainObject=r(63620),f.toLogRange=r(36896),f.relinkPrivateKeys=r(51528);var p=r(38116);f.isArrayBuffer=p.isArrayBuffer,f.isTypedArray=p.isTypedArray,f.isArrayOrTypedArray=p.isArrayOrTypedArray,f.isArray1D=p.isArray1D,f.ensureArray=p.ensureArray,f.concat=p.concat,f.maxRowLength=p.maxRowLength,f.minRowLength=p.minRowLength;var d=r(20435);f.mod=d.mod,f.modHalf=d.modHalf;var v=r(63064);f.valObjectMeta=v.valObjectMeta,f.coerce=v.coerce,f.coerce2=v.coerce2,f.coerceFont=v.coerceFont,f.coercePattern=v.coercePattern,f.coerceHoverinfo=v.coerceHoverinfo,f.coerceSelectionMarkerOpacity=v.coerceSelectionMarkerOpacity,f.validate=v.validate;var g=r(67555);f.dateTime2ms=g.dateTime2ms,f.isDateTime=g.isDateTime,f.ms2DateTime=g.ms2DateTime,f.ms2DateTimeLocal=g.ms2DateTimeLocal,f.cleanDate=g.cleanDate,f.isJSDate=g.isJSDate,f.formatDate=g.formatDate,f.incrementMonth=g.incrementMonth,f.dateTick0=g.dateTick0,f.dfltRange=g.dfltRange,f.findExactDates=g.findExactDates,f.MIN_MS=g.MIN_MS,f.MAX_MS=g.MAX_MS;var y=r(14952);f.findBin=y.findBin,f.sorterAsc=y.sorterAsc,f.sorterDes=y.sorterDes,f.distinctVals=y.distinctVals,f.roundUp=y.roundUp,f.sort=y.sort,f.findIndexOfMin=y.findIndexOfMin,f.sortObjectKeys=r(95376);var m=r(63084);f.aggNums=m.aggNums,f.len=m.len,f.mean=m.mean,f.median=m.median,f.midRange=m.midRange,f.variance=m.variance,f.stdev=m.stdev,f.interp=m.interp;var x=r(52248);f.init2dArray=x.init2dArray,f.transposeRagged=x.transposeRagged,f.dot=x.dot,f.translationMatrix=x.translationMatrix,f.rotationMatrix=x.rotationMatrix,f.rotationXYMatrix=x.rotationXYMatrix,f.apply3DTransform=x.apply3DTransform,f.apply2DTransform=x.apply2DTransform,f.apply2DTransform2=x.apply2DTransform2,f.convertCssMatrix=x.convertCssMatrix,f.inverseTransformMatrix=x.inverseTransformMatrix;var b=r(11864);f.deg2rad=b.deg2rad,f.rad2deg=b.rad2deg,f.angleDelta=b.angleDelta,f.angleDist=b.angleDist,f.isFullCircle=b.isFullCircle,f.isAngleInsideSector=b.isAngleInsideSector,f.isPtInsideSector=b.isPtInsideSector,f.pathArc=b.pathArc,f.pathSector=b.pathSector,f.pathAnnulus=b.pathAnnulus;var _=r(98308);f.isLeftAnchor=_.isLeftAnchor,f.isCenterAnchor=_.isCenterAnchor,f.isRightAnchor=_.isRightAnchor,f.isTopAnchor=_.isTopAnchor,f.isMiddleAnchor=_.isMiddleAnchor,f.isBottomAnchor=_.isBottomAnchor;var w=r(92348);f.segmentsIntersect=w.segmentsIntersect,f.segmentDistance=w.segmentDistance,f.getTextLocation=w.getTextLocation,f.clearLocationCache=w.clearLocationCache,f.getVisibleSegment=w.getVisibleSegment,f.findPointOnPath=w.findPointOnPath;var T=r(92880);f.extendFlat=T.extendFlat,f.extendDeep=T.extendDeep,f.extendDeepAll=T.extendDeepAll,f.extendDeepNoArrays=T.extendDeepNoArrays;var k=r(24248);f.log=k.log,f.warn=k.warn,f.error=k.error;var A=r(53756);f.counterRegex=A.counter;var M=r(91200);f.throttle=M.throttle,f.throttleDone=M.done,f.clearThrottle=M.clear;var S=r(52200);function E(t){var e={};for(var r in t)for(var n=t[r],i=0;il||t=e)&&o(t)&&t>=0&&t%1==0},f.noop=r(16628),f.identity=r(35536),f.repeat=function(t,e){for(var r=new Array(e),n=0;nr?Math.max(r,Math.min(e,t)):Math.max(e,Math.min(r,t))},f.bBoxIntersect=function(t,e,r){return r=r||0,t.left<=e.right+r&&e.left<=t.right+r&&t.top<=e.bottom+r&&e.top<=t.bottom+r},f.simpleMap=function(t,e,r,n,i){for(var a=t.length,o=new Array(a),s=0;s=Math.pow(2,r)?i>10?(f.warn(\"randstr failed uniqueness\"),l):t(e,r,n,(i||0)+1):l},f.OptionControl=function(t,e){t||(t={}),e||(e=\"opt\");var r={optionList:[],_newoption:function(n){n[e]=t,r[n.name]=n,r.optionList.push(n)}};return r[\"_\"+e]=t,r},f.smooth=function(t,e){if((e=Math.round(e)||0)<2)return t;var r,n,i,a,o=t.length,s=2*o,l=2*e-1,u=new Array(l),c=new Array(o);for(r=0;r=s&&(i-=s*Math.floor(i/s)),i<0?i=-1-i:i>=o&&(i=s-1-i),a+=t[i]*u[n];c[r]=a}return c},f.syncOrAsync=function(t,e,r){var n;function i(){return f.syncOrAsync(t,e,r)}for(;t.length;)if((n=(0,t.splice(0,1)[0])(e))&&n.then)return n.then(i);return r&&r(e)},f.stripTrailingSlash=function(t){return\"/\"===t.substr(-1)?t.substr(0,t.length-1):t},f.noneOrAll=function(t,e,r){if(t){var n,i=!1,a=!0;for(n=0;n0?e:0}))},f.fillArray=function(t,e,r,n){if(n=n||f.identity,f.isArrayOrTypedArray(t))for(var i=0;i1?i+o[1]:\"\";if(a&&(o.length>1||s.length>4||r))for(;n.test(s);)s=s.replace(n,\"$1\"+a+\"$2\");return s+l},f.TEMPLATE_STRING_REGEX=/%{([^\\s%{}:]*)([:|\\|][^}]*)?}/g;var D=/^\\w*$/;f.templateString=function(t,e){var r={};return t.replace(f.TEMPLATE_STRING_REGEX,(function(t,n){var i;return D.test(n)?i=e[n]:(r[n]=r[n]||f.nestedProperty(e,n).get,i=r[n]()),f.isValidTextValue(i)?i:\"\"}))};var R={max:10,count:0,name:\"hovertemplate\"};f.hovertemplateString=function(){return U.apply(R,arguments)};var F={max:10,count:0,name:\"texttemplate\"};f.texttemplateString=function(){return U.apply(F,arguments)};var B=/^(\\S+)([\\*\\/])(-?\\d+(\\.\\d+)?)$/,N={max:10,count:0,name:\"texttemplate\",parseMultDiv:!0};f.texttemplateStringForShapes=function(){return U.apply(N,arguments)};var j=/^[:|\\|]/;function U(t,e,r){var n=this,a=arguments;e||(e={});var o={};return t.replace(f.TEMPLATE_STRING_REGEX,(function(t,s,l){var u=\"_xother\"===s||\"_yother\"===s,c=\"_xother_\"===s||\"_yother_\"===s,h=\"xother_\"===s||\"yother_\"===s,p=\"xother\"===s||\"yother\"===s||u||h||c,d=s;(u||c)&&(d=d.substring(1)),(h||c)&&(d=d.substring(0,d.length-1));var v,g,y,m=null,x=null;if(n.parseMultDiv){var b=function(t){var e=t.match(B);return e?{key:e[1],op:e[2],number:Number(e[3])}:{key:t,op:null,number:null}}(d);d=b.key,m=b.op,x=b.number}if(p){if(void 0===(v=e[d]))return\"\"}else for(y=3;y=48&&o<=57,u=s>=48&&s<=57;if(l&&(n=10*n+o-48),u&&(i=10*i+s-48),!l||!u){if(n!==i)return n-i;if(o!==s)return o-s}}return i-n};var V=2e9;f.seedPseudoRandom=function(){V=2e9},f.pseudoRandom=function(){var t=V;return V=(69069*V+1)%4294967296,Math.abs(V-t)<429496729?f.pseudoRandom():V/4294967296},f.fillText=function(t,e,r){var n=Array.isArray(r)?function(t){r.push(t)}:function(t){r.text=t},i=f.extractOption(t,e,\"htx\",\"hovertext\");if(f.isValidTextValue(i))return n(i);var a=f.extractOption(t,e,\"tx\",\"text\");return f.isValidTextValue(a)?n(a):void 0},f.isValidTextValue=function(t){return t||0===t},f.formatPercent=function(t,e){e=e||0;for(var r=(Math.round(100*t*Math.pow(10,e))*Math.pow(.1,e)).toFixed(e)+\"%\",n=0;n1&&(u=1):u=0,f.strTranslate(i-u*(r+o),a-u*(n+s))+f.strScale(u)+(l?\"rotate(\"+l+(e?\"\":\" \"+r+\" \"+n)+\")\":\"\")},f.setTransormAndDisplay=function(t,e){t.attr(\"transform\",f.getTextTransform(e)),t.style(\"display\",e.scale?null:\"none\")},f.ensureUniformFontSize=function(t,e){var r=f.extendFlat({},e);return r.size=Math.max(e.size,t._fullLayout.uniformtext.minsize||0),r},f.join2=function(t,e,r){var n=t.length;return n>1?t.slice(0,-1).join(e)+r+t[n-1]:t.join(e)},f.bigFont=function(t){return Math.round(1.2*t)};var q=f.getFirefoxVersion(),H=null!==q&&q<86;f.getPositionFromD3Event=function(){return H?[n.event.layerX,n.event.layerY]:[n.event.offsetX,n.event.offsetY]}},63620:function(t){\"use strict\";t.exports=function(t){return window&&window.process&&window.process.versions?\"[object Object]\"===Object.prototype.toString.call(t):\"[object Object]\"===Object.prototype.toString.call(t)&&Object.getPrototypeOf(t).hasOwnProperty(\"hasOwnProperty\")}},37804:function(t,e,r){\"use strict\";var n=r(22296),i=/^\\w*$/;t.exports=function(t,e,r,a){var o,s,l;r=r||\"name\",a=a||\"value\";var u={};e&&e.length?(l=n(t,e),s=l.get()):s=t,e=e||\"\";var c={};if(s)for(o=0;o2)return u[e]=2|u[e],h.set(t,null);if(f){for(o=e;o1){var e=[\"LOG:\"];for(t=0;t1){var r=[];for(t=0;t\"),\"long\")}},a.warn=function(){var t;if(n.logging>0){var e=[\"WARN:\"];for(t=0;t0){var r=[];for(t=0;t\"),\"stick\")}},a.error=function(){var t;if(n.logging>0){var e=[\"ERROR:\"];for(t=0;t0){var r=[];for(t=0;t\"),\"stick\")}}},30988:function(t,e,r){\"use strict\";var n=r(33428);t.exports=function(t,e,r){var i=t.selectAll(\"g.\"+r.replace(/\\s/g,\".\")).data(e,(function(t){return t[0].trace.uid}));i.exit().remove(),i.enter().append(\"g\").attr(\"class\",r),i.order();var a=t.classed(\"rangeplot\")?\"nodeRangePlot3\":\"node3\";return i.each((function(t){t[0][a]=n.select(this)})),i}},52248:function(t,e,r){\"use strict\";var n=r(36524);e.init2dArray=function(t,e){for(var r=new Array(t),n=0;ne/2?t-Math.round(t/e)*e:t}}},22296:function(t,e,r){\"use strict\";var n=r(38248),i=r(38116).isArrayOrTypedArray;function a(t,e){return function(){var r,n,o,s,l,u=t;for(s=0;s/g),l=0;la||u===i||us||e&&l(t))}:function(t,e){var l=t[0],u=t[1];if(l===i||la||u===i||us)return!1;var c,f,h,p,d,v=r.length,g=r[0][0],y=r[0][1],m=0;for(c=1;cMath.max(f,g)||u>Math.max(h,y)))if(uc||Math.abs(n(o,h))>i)return!0;return!1},a.filter=function(t,e){var r=[t[0]],n=0,i=0;function o(o){t.push(o);var s=r.length,l=n;r.splice(i+1);for(var u=l+1;u1&&o(t.pop()),{addPt:o,raw:t,filtered:r}}},5048:function(t,e,r){\"use strict\";var n=r(16576),i=r(28624);t.exports=function(t,e,a){var o=t._fullLayout,s=!0;return o._glcanvas.each((function(n){if(n.regl)n.regl.preloadCachedCode(a);else if(!n.pick||o._has(\"parcoords\")){try{n.regl=i({canvas:this,attributes:{antialias:!n.pick,preserveDrawingBuffer:!0},pixelRatio:t._context.plotGlPixelRatio||r.g.devicePixelRatio,extensions:e||[],cachedCode:a||{}})}catch(t){s=!1}n.regl||(s=!1),s&&this.addEventListener(\"webglcontextlost\",(function(e){t&&t.emit&&t.emit(\"plotly_webglcontextlost\",{event:e,layer:n.key})}),!1)}})),s||n({container:o._glcontainer.node()}),s}},34296:function(t,e,r){\"use strict\";var n=r(38248),i=r(25928);t.exports=function(t){var e;if(\"string\"!=typeof(e=t&&t.hasOwnProperty(\"userAgent\")?t.userAgent:function(){var t;return\"undefined\"!=typeof navigator&&(t=navigator.userAgent),t&&t.headers&&\"string\"==typeof t.headers[\"user-agent\"]&&(t=t.headers[\"user-agent\"]),t}()))return!0;var r=i({ua:{headers:{\"user-agent\":e}},tablet:!0,featureDetect:!1});if(!r)for(var a=e.split(\" \"),o=1;o-1;s--){var l=a[s];if(\"Version/\"===l.substr(0,8)){var u=l.substr(8).split(\".\")[0];if(n(u)&&(u=+u),u>=13)return!0}}return r}},52416:function(t){\"use strict\";t.exports=function(t,e){if(e instanceof RegExp){for(var r=e.toString(),n=0;ni.queueLength&&(t.undoQueue.queue.shift(),t.undoQueue.index--))},startSequence:function(t){t.undoQueue=t.undoQueue||{index:0,queue:[],sequence:!1},t.undoQueue.sequence=!0,t.undoQueue.beginSequence=!0},stopSequence:function(t){t.undoQueue=t.undoQueue||{index:0,queue:[],sequence:!1},t.undoQueue.sequence=!1,t.undoQueue.beginSequence=!1},undo:function(t){var e,r;if(!(void 0===t.undoQueue||isNaN(t.undoQueue.index)||t.undoQueue.index<=0)){for(t.undoQueue.index--,e=t.undoQueue.queue[t.undoQueue.index],t.undoQueue.inSequence=!0,r=0;r=t.undoQueue.queue.length)){for(e=t.undoQueue.queue[t.undoQueue.index],t.undoQueue.inSequence=!0,r=0;re}function f(t,e){return t>=e}e.findBin=function(t,e,r){if(n(e.start))return r?Math.ceil((t-e.start)/e.size-s)-1:Math.floor((t-e.start)/e.size+s);var a,o,h=0,p=e.length,d=0,v=p>1?(e[p-1]-e[0])/(p-1):1;for(o=v>=0?r?l:u:r?f:c,t+=v*s*(r?-1:1)*(v>=0?1:-1);h90&&i.log(\"Long binary search...\"),h-1},e.sorterAsc=function(t,e){return t-e},e.sorterDes=function(t,e){return e-t},e.distinctVals=function(t){var r,n=t.slice();for(n.sort(e.sorterAsc),r=n.length-1;r>-1&&n[r]===o;r--);for(var i,a=n[r]-n[0]||1,s=a/(r||1)/1e4,l=[],u=0;u<=r;u++){var c=n[u],f=c-i;void 0===i?(l.push(c),i=c):f>s&&(a=Math.min(a,f),l.push(c),i=c)}return{vals:l,minDiff:a}},e.roundUp=function(t,e,r){for(var n,i=0,a=e.length-1,o=0,s=r?0:1,l=r?1:0,u=r?Math.ceil:Math.floor;i0&&(n=1),r&&n)return t.sort(e)}return n?t:t.reverse()},e.findIndexOfMin=function(t,e){e=e||a;for(var r,n=1/0,i=0;ia.length)&&(o=a.length),n(r)||(r=!1),i(a[0])){for(l=new Array(o),s=0;st.length-1)return t[t.length-1];var r=e%1;return r*t[Math.ceil(e)]+(1-r)*t[Math.floor(e)]}},43080:function(t,e,r){\"use strict\";var n=r(72160);t.exports=function(t){return t?n(t):[0,0,0,1]}},9188:function(t,e,r){\"use strict\";var n=r(2264),i=r(43616),a=r(3400),o=null;t.exports=function(){if(null!==o)return o;o=!1;var t=a.isIE()||a.isSafari()||a.isIOS();if(window.navigator.userAgent&&!t){var e=Array.from(n.CSS_DECLARATIONS).reverse(),r=window.CSS&&window.CSS.supports||window.supportsCSS;if(\"function\"==typeof r)o=e.some((function(t){return r.apply(null,t)}));else{var s=i.tester.append(\"image\").attr(\"style\",n.STYLE),l=window.getComputedStyle(s.node()).imageRendering;o=e.some((function(t){var e=t[1];return l===e||l===e.toLowerCase()})),s.remove()}}return o}},72736:function(t,e,r){\"use strict\";var n=r(33428),i=r(3400),a=i.strTranslate,o=r(9616),s=r(84284).LINE_SPACING,l=/([^$]*)([$]+[^$]*[$]+)([^$]*)/;e.convertToTspans=function(t,r,g){var S=t.text(),E=!t.attr(\"data-notex\")&&r&&r._context.typesetMath&&\"undefined\"!=typeof MathJax&&S.match(l),P=n.select(t.node().parentNode);if(!P.empty()){var O=t.attr(\"class\")?t.attr(\"class\").split(\" \")[0]:\"text\";return O+=\"-math\",P.selectAll(\"svg.\"+O).remove(),P.selectAll(\"g.\"+O+\"-group\").remove(),t.style(\"display\",null).attr({\"data-unformatted\":S,\"data-math\":\"N\"}),E?(r&&r._promises||[]).push(new Promise((function(e){t.style(\"display\",\"none\");var r=parseInt(t.node().style.fontSize,10),o={fontSize:r};!function(t,e,r){var a,o,s,l,h=parseInt((MathJax.version||\"\").split(\".\")[0]);if(2===h||3===h){var p=function(){var r=\"math-output-\"+i.randstr({},64),a=(l=n.select(\"body\").append(\"div\").attr({id:r}).style({visibility:\"hidden\",position:\"absolute\",\"font-size\":e.fontSize+\"px\"}).text(t.replace(u,\"\\\\lt \").replace(c,\"\\\\gt \"))).node();return 2===h?MathJax.Hub.Typeset(a):MathJax.typeset([a])},d=function(){var e=l.select(2===h?\".MathJax_SVG\":\".MathJax\"),a=!e.empty()&&l.select(\"svg\").node();if(a){var o,s=a.getBoundingClientRect();o=2===h?n.select(\"body\").select(\"#MathJax_SVG_glyphs\"):e.select(\"defs\"),r(e,o,s)}else i.log(\"There was an error in the tex syntax.\",t),r();l.remove()};2===h?MathJax.Hub.Queue((function(){return o=i.extendDeepAll({},MathJax.Hub.config),s=MathJax.Hub.processSectionDelay,void 0!==MathJax.Hub.processSectionDelay&&(MathJax.Hub.processSectionDelay=0),MathJax.Hub.Config({messageStyle:\"none\",tex2jax:{inlineMath:f},displayAlign:\"left\"})}),(function(){if(\"SVG\"!==(a=MathJax.Hub.config.menuSettings.renderer))return MathJax.Hub.setRenderer(\"SVG\")}),p,d,(function(){if(\"SVG\"!==a)return MathJax.Hub.setRenderer(a)}),(function(){return void 0!==s&&(MathJax.Hub.processSectionDelay=s),MathJax.Hub.Config(o)})):3===h&&(o=i.extendDeepAll({},MathJax.config),MathJax.config.tex||(MathJax.config.tex={}),MathJax.config.tex.inlineMath=f,\"svg\"!==(a=MathJax.config.startup.output)&&(MathJax.config.startup.output=\"svg\"),MathJax.startup.defaultReady(),MathJax.startup.promise.then((function(){p(),d(),\"svg\"!==a&&(MathJax.config.startup.output=a),MathJax.config=o})))}else i.warn(\"No MathJax version:\",MathJax.version)}(E[2],o,(function(n,i,o){P.selectAll(\"svg.\"+O).remove(),P.selectAll(\"g.\"+O+\"-group\").remove();var s=n&&n.select(\"svg\");if(!s||!s.node())return I(),void e();var l=P.append(\"g\").classed(O+\"-group\",!0).attr({\"pointer-events\":\"none\",\"data-unformatted\":S,\"data-math\":\"Y\"});l.node().appendChild(s.node()),i&&i.node()&&s.node().insertBefore(i.node().cloneNode(!0),s.node().firstChild);var u=o.width,c=o.height;s.attr({class:O,height:c,preserveAspectRatio:\"xMinYMin meet\"}).style({overflow:\"visible\",\"pointer-events\":\"none\"});var f=t.node().style.fill||\"black\",h=s.select(\"g\");h.attr({fill:f,stroke:f});var p=h.node().getBoundingClientRect(),d=p.width,v=p.height;(d>u||v>c)&&(s.style(\"overflow\",\"hidden\"),d=(p=s.node().getBoundingClientRect()).width,v=p.height);var y=+t.attr(\"x\"),m=+t.attr(\"y\"),x=-(r||t.node().getBoundingClientRect().height)/4;if(\"y\"===O[0])l.attr({transform:\"rotate(\"+[-90,y,m]+\")\"+a(-d/2,x-v/2)});else if(\"l\"===O[0])m=x-v/2;else if(\"a\"===O[0]&&0!==O.indexOf(\"atitle\"))y=0,m=x;else{var b=t.attr(\"text-anchor\");y-=d*(\"middle\"===b?.5:\"end\"===b?1:0),m=m+x-v/2}s.attr({x:y,y:m}),g&&g.call(t,l),e(l)}))}))):I(),t}function I(){P.empty()||(O=t.attr(\"class\")+\"-math\",P.select(\"svg.\"+O).remove()),t.text(\"\").style(\"white-space\",\"pre\");var r=function(t,e){e=e.replace(y,\" \");var r,a=!1,l=[],u=-1;function c(){u++;var e=document.createElementNS(o.svg,\"tspan\");n.select(e).attr({class:\"line\",dy:u*s+\"em\"}),t.appendChild(e),r=e;var i=l;if(l=[{node:e}],i.length>1)for(var a=1;a doesnt match end tag <\"+t+\">. Pretending it did match.\",e),r=l[l.length-1].node}else i.log(\"Ignoring unexpected end tag .\",e)}b.test(e)?c():(r=t,l=[{node:t}]);for(var E=e.split(m),P=0;P|>|>)/g,f=[[\"$\",\"$\"],[\"\\\\(\",\"\\\\)\"]],h={sup:\"font-size:70%\",sub:\"font-size:70%\",b:\"font-weight:bold\",i:\"font-style:italic\",a:\"cursor:pointer\",span:\"\",em:\"font-style:italic;font-weight:bold\"},p={sub:\"0.3em\",sup:\"-0.6em\"},d={sub:\"-0.21em\",sup:\"0.42em\"},v=\"​\",g=[\"http:\",\"https:\",\"mailto:\",\"\",void 0,\":\"],y=e.NEWLINES=/(\\r\\n?|\\n)/g,m=/(<[^<>]*>)/,x=/<(\\/?)([^ >]*)(\\s+(.*))?>/i,b=//i;e.BR_TAG_ALL=//gi;var _=/(^|[\\s\"'])style\\s*=\\s*(\"([^\"]*);?\"|'([^']*);?')/i,w=/(^|[\\s\"'])href\\s*=\\s*(\"([^\"]*)\"|'([^']*)')/i,T=/(^|[\\s\"'])target\\s*=\\s*(\"([^\"\\s]*)\"|'([^'\\s]*)')/i,k=/(^|[\\s\"'])popup\\s*=\\s*(\"([\\w=,]*)\"|'([\\w=,]*)')/i;function A(t,e){if(!t)return null;var r=t.match(e),n=r&&(r[3]||r[4]);return n&&L(n)}var M=/(^|;)\\s*color:/;e.plainText=function(t,e){for(var r=void 0!==(e=e||{}).len&&-1!==e.len?e.len:1/0,n=void 0!==e.allowedTags?e.allowedTags:[\"br\"],i=t.split(m),a=[],o=\"\",s=0,l=0;l3?a.push(u.substr(0,p-3)+\"...\"):a.push(u.substr(0,p));break}o=\"\"}}return a.join(\"\")};var S={mu:\"μ\",amp:\"&\",lt:\"<\",gt:\">\",nbsp:\" \",times:\"×\",plusmn:\"±\",deg:\"°\"},E=/&(#\\d+|#x[\\da-fA-F]+|[a-z]+);/g;function L(t){return t.replace(E,(function(t,e){return(\"#\"===e.charAt(0)?function(t){if(!(t>1114111)){var e=String.fromCodePoint;if(e)return e(t);var r=String.fromCharCode;return t<=65535?r(t):r(55232+(t>>10),t%1024+56320)}}(\"x\"===e.charAt(1)?parseInt(e.substr(2),16):parseInt(e.substr(1),10)):S[e])||t}))}function C(t){var e=encodeURI(decodeURI(t)),r=document.createElement(\"a\"),n=document.createElement(\"a\");r.href=t,n.href=e;var i=r.protocol,a=n.protocol;return-1!==g.indexOf(i)&&-1!==g.indexOf(a)?e:\"\"}function P(t,e,r){var n,a,o,s=r.horizontalAlign,l=r.verticalAlign||\"top\",u=t.node().getBoundingClientRect(),c=e.node().getBoundingClientRect();return a=\"bottom\"===l?function(){return u.bottom-n.height}:\"middle\"===l?function(){return u.top+(u.height-n.height)/2}:function(){return u.top},o=\"right\"===s?function(){return u.right-n.width}:\"center\"===s?function(){return u.left+(u.width-n.width)/2}:function(){return u.left},function(){n=this.node().getBoundingClientRect();var t=o()-c.left,e=a()-c.top,s=r.gd||{};if(r.gd){s._fullLayout._calcInverseTransform(s);var l=i.apply3DTransform(s._fullLayout._invTransform)(t,e);t=l[0],e=l[1]}return this.style({top:e+\"px\",left:t+\"px\",\"z-index\":1e3}),this}}e.convertEntities=L,e.sanitizeHTML=function(t){t=t.replace(y,\" \");for(var e=document.createElement(\"p\"),r=e,i=[],a=t.split(m),o=0;oa.ts+e?l():a.timer=setTimeout((function(){l(),a.timer=null}),e)},e.done=function(t){var e=r[t];return e&&e.timer?new Promise((function(t){var r=e.onDone;e.onDone=function(){r&&r(),t(),e.onDone=null}})):Promise.resolve()},e.clear=function(t){if(t)n(r[t]),delete r[t];else for(var i in r)e.clear(i)}},36896:function(t,e,r){\"use strict\";var n=r(38248);t.exports=function(t,e){if(t>0)return Math.log(t)/Math.LN10;var r=Math.log(Math.min(e[0],e[1]))/Math.LN10;return n(r)||(r=Math.log(Math.max(e[0],e[1]))/Math.LN10-6),r}},59972:function(t,e,r){\"use strict\";var n=t.exports={},i=r(79552).locationmodeToLayer,a=r(55712).NO;n.getTopojsonName=function(t){return[t.scope.replace(/ /g,\"-\"),\"_\",t.resolution.toString(),\"m\"].join(\"\")},n.getTopojsonPath=function(t,e){return t+e+\".json\"},n.getTopojsonFeatures=function(t,e){var r=i[t.locationmode],n=e.objects[r];return a(e,n).features}},11680:function(t){\"use strict\";t.exports={moduleType:\"locale\",name:\"en-US\",dictionary:{\"Click to enter Colorscale title\":\"Click to enter Colorscale title\"},format:{date:\"%m/%d/%Y\"}}},6580:function(t){\"use strict\";t.exports={moduleType:\"locale\",name:\"en\",dictionary:{\"Click to enter Colorscale title\":\"Click to enter Colourscale title\"},format:{days:[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],shortDays:[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],months:[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"],shortMonths:[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"],periods:[\"AM\",\"PM\"],dateTime:\"%a %b %e %X %Y\",date:\"%d/%m/%Y\",time:\"%H:%M:%S\",decimal:\".\",thousands:\",\",grouping:[3],currency:[\"$\",\"\"],year:\"%Y\",month:\"%b %Y\",dayMonth:\"%b %-d\",dayMonthYear:\"%b %-d, %Y\"}}},69820:function(t,e,r){\"use strict\";var n=r(24040);t.exports=function(t){for(var e,r,i=n.layoutArrayContainers,a=n.layoutArrayRegexes,o=t.split(\"[\")[0],s=0;s0&&o.log(\"Clearing previous rejected promises from queue.\"),t._promises=[]},e.cleanLayout=function(t){var r,n;t||(t={}),t.xaxis1&&(t.xaxis||(t.xaxis=t.xaxis1),delete t.xaxis1),t.yaxis1&&(t.yaxis||(t.yaxis=t.yaxis1),delete t.yaxis1),t.scene1&&(t.scene||(t.scene=t.scene1),delete t.scene1);var a=(s.subplotsRegistry.cartesian||{}).attrRegex,l=(s.subplotsRegistry.polar||{}).attrRegex,f=(s.subplotsRegistry.ternary||{}).attrRegex,h=(s.subplotsRegistry.gl3d||{}).attrRegex,v=Object.keys(t);for(r=0;r3?(I.x=1.02,I.xanchor=\"left\"):I.x<-2&&(I.x=-.02,I.xanchor=\"right\"),I.y>3?(I.y=1.02,I.yanchor=\"bottom\"):I.y<-2&&(I.y=-.02,I.yanchor=\"top\")),d(t),\"rotate\"===t.dragmode&&(t.dragmode=\"orbit\"),u.clean(t),t.template&&t.template.layout&&e.cleanLayout(t.template.layout),t},e.cleanData=function(t){for(var r=0;r0)return t.substr(0,e)}e.hasParent=function(t,e){for(var r=b(e);r;){if(r in t)return!0;r=b(r)}return!1};var _=[\"x\",\"y\",\"z\"];e.clearAxisTypes=function(t,e,r){for(var n=0;n1&&a.warn(\"Full array edits are incompatible with other edits\",f);var m=r[\"\"][\"\"];if(u(m))e.set(null);else{if(!Array.isArray(m))return a.warn(\"Unrecognized full array edit value\",f,m),!0;e.set(m)}return!v&&(h(g,y),p(t),!0)}var x,b,_,w,T,k,A,M,S=Object.keys(r).map(Number).sort(o),E=e.get(),L=E||[],C=c(y,f).get(),P=[],O=-1,I=L.length;for(x=0;xL.length-(A?0:1))a.warn(\"index out of range\",f,_);else if(void 0!==k)T.length>1&&a.warn(\"Insertion & removal are incompatible with edits to the same index.\",f,_),u(k)?P.push(_):A?(\"add\"===k&&(k={}),L.splice(_,0,k),C&&C.splice(_,0,{})):a.warn(\"Unrecognized full object edit value\",f,_,k),-1===O&&(O=_);else for(b=0;b=0;x--)L.splice(P[x],1),C&&C.splice(P[x],1);if(L.length?E||e.set(L):e.set(null),v)return!1;if(h(g,y),d!==i){var z;if(-1===O)z=S;else{for(I=Math.max(L.length,I),z=[],x=0;x=O);x++)z.push(_);for(x=O;x=t.data.length||i<-t.data.length)throw new Error(r+\" must be valid indices for gd.data.\");if(e.indexOf(i,n+1)>-1||i>=0&&e.indexOf(-t.data.length+i)>-1||i<0&&e.indexOf(t.data.length+i)>-1)throw new Error(\"each index in \"+r+\" must be unique.\")}}function z(t,e,r){if(!Array.isArray(t.data))throw new Error(\"gd.data must be an array.\");if(void 0===e)throw new Error(\"currentIndices is a required argument.\");if(Array.isArray(e)||(e=[e]),I(t,e,\"currentIndices\"),void 0===r||Array.isArray(r)||(r=[r]),void 0!==r&&I(t,r,\"newIndices\"),void 0!==r&&e.length!==r.length)throw new Error(\"current and new indices must be of equal length.\")}function D(t,e,r,n,a){!function(t,e,r,n){var i=o.isPlainObject(n);if(!Array.isArray(t.data))throw new Error(\"gd.data must be an array\");if(!o.isPlainObject(e))throw new Error(\"update must be a key:value object\");if(void 0===r)throw new Error(\"indices must be an integer or array of integers\");for(var a in I(t,r,\"indices\"),e){if(!Array.isArray(e[a])||e[a].length!==r.length)throw new Error(\"attribute \"+a+\" must be an array of length equal to indices array length\");if(i&&(!(a in n)||!Array.isArray(n[a])||n[a].length!==e[a].length))throw new Error(\"when maxPoints is set as a key:value object it must contain a 1:1 corrispondence with the keys and number of traces in the update object\")}}(t,e,r,n);for(var l=function(t,e,r,n){var a,l,u,c,f,h=o.isPlainObject(n),p=[];for(var d in Array.isArray(r)||(r=[r]),r=O(r,t.data.length-1),e)for(var v=0;v-1&&-1===r.indexOf(\"grouptitlefont\")?l(r,r.replace(\"titlefont\",\"title.font\")):r.indexOf(\"titleposition\")>-1?l(r,r.replace(\"titleposition\",\"title.position\")):r.indexOf(\"titleside\")>-1?l(r,r.replace(\"titleside\",\"title.side\")):r.indexOf(\"titleoffset\")>-1&&l(r,r.replace(\"titleoffset\",\"title.offset\")):l(r,r.replace(\"title\",\"title.text\"));function l(e,r){t[r]=t[e],delete t[e]}}function q(t,e,r){t=o.getGraphDiv(t),T.clearPromiseQueue(t);var n={};if(\"string\"==typeof e)n[e]=r;else{if(!o.isPlainObject(e))return o.warn(\"Relayout fail.\",e,r),Promise.reject();n=o.extendFlat({},e)}Object.keys(n).length&&(t.changed=!0);var i=Z(t,n),a=i.flags;a.calc&&(t.calcdata=void 0);var s=[h.previousPromises];a.layoutReplot?s.push(k.layoutReplot):Object.keys(n).length&&(H(t,a,i)||h.supplyDefaults(t),a.legend&&s.push(k.doLegend),a.layoutstyle&&s.push(k.layoutStyles),a.axrange&&G(s,i.rangesAltered),a.ticks&&s.push(k.doTicksRelayout),a.modebar&&s.push(k.doModeBar),a.camera&&s.push(k.doCamera),a.colorbars&&s.push(k.doColorBars),s.push(E)),s.push(h.rehover,h.redrag,h.reselect),u.add(t,q,[t,i.undoit],q,[t,i.redoit]);var l=o.syncOrAsync(s,t);return l&&l.then||(l=Promise.resolve(t)),l.then((function(){return t.emit(\"plotly_relayout\",i.eventData),t}))}function H(t,e,r){var n,i,a=t._fullLayout;if(!e.axrange)return!1;for(var s in e)if(\"axrange\"!==s&&e[s])return!1;var l=function(t,e){return o.coerce(n,i,v,t,e)},u={};for(var c in r.rangesAltered){var f=p.id2name(c);if(n=t.layout[f],i=a[f],d(n,i,l,u),i._matchGroup)for(var h in i._matchGroup)if(h!==c){var g=a[p.id2name(h)];g.autorange=i.autorange,g.range=i.range.slice(),g._input.range=i.range.slice()}}return!0}function G(t,e){var r=e?function(t){var r=[];for(var n in e){var i=p.getFromId(t,n);if(r.push(n),-1!==(i.ticklabelposition||\"\").indexOf(\"inside\")&&i._anchorAxis&&r.push(i._anchorAxis._id),i._matchGroup)for(var a in i._matchGroup)e[a]||r.push(a)}return p.draw(t,r,{skipTitle:!0})}:function(t){return p.draw(t,\"redraw\")};t.push(b,k.doAutoRangeAndConstraints,r,k.drawData,k.finalDraw)}var W=/^[xyz]axis[0-9]*\\.range(\\[[0|1]\\])?$/,Y=/^[xyz]axis[0-9]*\\.autorange$/,X=/^[xyz]axis[0-9]*\\.domain(\\[[0|1]\\])?$/;function Z(t,e){var r,n,i,a=t.layout,l=t._fullLayout,u=l._guiEditing,h=N(l._preGUI,u),d=Object.keys(e),v=p.list(t),g=o.extendDeepAll({},e),y={};for(V(e),d=Object.keys(e),n=0;n0&&\"string\"!=typeof I.parts[D];)D--;var R=I.parts[D],F=I.parts[D-1]+\".\"+R,j=I.parts.slice(0,D).join(\".\"),U=s(t.layout,j).get(),q=s(l,j).get(),H=I.get();if(void 0!==z){k[O]=z,S[O]=\"reverse\"===R?z:B(H);var G=f.getLayoutValObject(l,I.parts);if(G&&G.impliedEdits&&null!==z)for(var Z in G.impliedEdits)E(o.relativeAttr(O,Z),G.impliedEdits[Z]);if(-1!==[\"width\",\"height\"].indexOf(O))if(z){E(\"autosize\",null);var J=\"height\"===O?\"width\":\"height\";E(J,l[J])}else l[O]=t._initialAutoSize[O];else if(\"autosize\"===O)E(\"width\",z?null:l.width),E(\"height\",z?null:l.height);else if(F.match(W))P(F),s(l,j+\"._inputRange\").set(null);else if(F.match(Y)){P(F),s(l,j+\"._inputRange\").set(null);var $=s(l,j).get();$._inputDomain&&($._input.domain=$._inputDomain.slice())}else F.match(X)&&s(l,j+\"._inputDomain\").set(null);if(\"type\"===R){L=U;var Q=\"linear\"===q.type&&\"log\"===z,tt=\"log\"===q.type&&\"linear\"===z;if(Q||tt){if(L&&L.range)if(q.autorange)Q&&(L.range=L.range[1]>L.range[0]?[1,2]:[2,1]);else{var et=L.range[0],rt=L.range[1];Q?(et<=0&&rt<=0&&E(j+\".autorange\",!0),et<=0?et=rt/1e6:rt<=0&&(rt=et/1e6),E(j+\".range[0]\",Math.log(et)/Math.LN10),E(j+\".range[1]\",Math.log(rt)/Math.LN10)):(E(j+\".range[0]\",Math.pow(10,et)),E(j+\".range[1]\",Math.pow(10,rt)))}else E(j+\".autorange\",!0);Array.isArray(l._subplots.polar)&&l._subplots.polar.length&&l[I.parts[0]]&&\"radialaxis\"===I.parts[1]&&delete l[I.parts[0]]._subplot.viewInitial[\"radialaxis.range\"],c.getComponentMethod(\"annotations\",\"convertCoords\")(t,q,z,E),c.getComponentMethod(\"images\",\"convertCoords\")(t,q,z,E)}else E(j+\".autorange\",!0),E(j+\".range\",null);s(l,j+\"._inputRange\").set(null)}else if(R.match(M)){var nt=s(l,O).get(),it=(z||{}).type;it&&\"-\"!==it||(it=\"linear\"),c.getComponentMethod(\"annotations\",\"convertCoords\")(t,nt,it,E),c.getComponentMethod(\"images\",\"convertCoords\")(t,nt,it,E)}var at=w.containerArrayMatch(O);if(at){r=at.array,n=at.index;var ot=at.property,st=G||{editType:\"calc\"};\"\"!==n&&\"\"===ot&&(w.isAddVal(z)?S[O]=null:w.isRemoveVal(z)?S[O]=(s(a,r).get()||[])[n]:o.warn(\"unrecognized full object value\",e)),A.update(_,st),y[r]||(y[r]={});var lt=y[r][n];lt||(lt=y[r][n]={}),lt[ot]=z,delete e[O]}else\"reverse\"===R?(U.range?U.range.reverse():(E(j+\".autorange\",!0),U.range=[1,0]),q.autorange?_.calc=!0:_.plot=!0):(\"dragmode\"===O&&(!1===z&&!1!==H||!1!==z&&!1===H)||l._has(\"scatter-like\")&&l._has(\"regl\")&&\"dragmode\"===O&&(\"lasso\"===z||\"select\"===z)&&\"lasso\"!==H&&\"select\"!==H||l._has(\"gl2d\")?_.plot=!0:G?A.update(_,G):_.calc=!0,I.set(z))}}for(r in y)w.applyContainerArrayChanges(t,h(a,r),y[r],_,h)||(_.plot=!0);for(var ut in C){var ct=(L=p.getFromId(t,ut))&&L._constraintGroup;if(ct)for(var ft in _.calc=!0,ct)C[ft]||(p.getFromId(t,ft)._constraintShrinkable=!0)}(K(t)||e.height||e.width)&&(_.plot=!0);var ht=l.shapes;for(n=0;n1;)if(n.pop(),void 0!==(r=s(e,n.join(\".\")+\".uirevision\").get()))return r;return e.uirevision}function nt(t,e){for(var r=0;r=i.length?i[0]:i[t]:i}function l(t){return Array.isArray(a)?t>=a.length?a[0]:a[t]:a}function u(t,e){var r=0;return function(){if(t&&++r===e)return t()}}return void 0===n._frameWaitingCnt&&(n._frameWaitingCnt=0),new Promise((function(a,c){function f(){t.emit(\"plotly_animating\"),n._lastFrameAt=-1/0,n._timeToNext=0,n._runningTransitions=0,n._currentFrame=null;var e=function(){n._animationRaf=window.requestAnimationFrame(e),Date.now()-n._lastFrameAt>n._timeToNext&&function(){n._currentFrame&&n._currentFrame.onComplete&&n._currentFrame.onComplete();var e=n._currentFrame=n._frameQueue.shift();if(e){var r=e.name?e.name.toString():null;t._fullLayout._currentFrame=r,n._lastFrameAt=Date.now(),n._timeToNext=e.frameOpts.duration,h.transition(t,e.frame.data,e.frame.layout,T.coerceTraceIndices(t,e.frame.traces),e.frameOpts,e.transitionOpts).then((function(){e.onComplete&&e.onComplete()})),t.emit(\"plotly_animatingframe\",{name:r,frame:e.frame,animation:{frame:e.frameOpts,transition:e.transitionOpts}})}else t.emit(\"plotly_animated\"),window.cancelAnimationFrame(n._animationRaf),n._animationRaf=null}()};e()}var p,d,v=0;function g(t){return Array.isArray(i)?v>=i.length?t.transitionOpts=i[v]:t.transitionOpts=i[0]:t.transitionOpts=i,v++,t}var y=[],m=null==e,x=Array.isArray(e);if(m||x||!o.isPlainObject(e)){if(m||-1!==[\"string\",\"number\"].indexOf(typeof e))for(p=0;p0&&ww)&&k.push(d);y=k}}y.length>0?function(e){if(0!==e.length){for(var i=0;i=0;n--)if(o.isPlainObject(e[n])){var v=e[n].name,g=(c[v]||d[v]||{}).name,y=e[n].name,m=c[g]||d[g];g&&y&&\"number\"==typeof y&&m&&S<5&&(S++,o.warn('addFrames: overwriting frame \"'+(c[g]||d[g]).name+'\" with a frame whose name of type \"number\" also equates to \"'+g+'\". This is valid but may potentially lead to unexpected behavior since all plotly.js frame names are stored internally as strings.'),5===S&&o.warn(\"addFrames: This API call has yielded too many of these warnings. For the rest of this call, further warnings about numeric frame names will be suppressed.\")),d[v]={name:v},p.push({frame:h.supplyFrameDefaults(e[n]),index:r&&void 0!==r[n]&&null!==r[n]?r[n]:f+n})}p.sort((function(t,e){return t.index>e.index?-1:t.index=0;n--){if(\"number\"==typeof(i=p[n].frame).name&&o.warn(\"Warning: addFrames accepts frames with numeric names, but the numbers areimplicitly cast to strings\"),!i.name)for(;c[i.name=\"frame \"+t._transitionData._counter++];);if(c[i.name]){for(a=0;a=0;r--)n=e[r],a.push({type:\"delete\",index:n}),s.unshift({type:\"insert\",index:n,value:i[n]});var l=h.modifyFrames,c=h.modifyFrames,f=[t,s],p=[t,a];return u&&u.add(t,l,f,c,p),h.modifyFrames(t,a)},e.addTraces=function t(r,n,i){r=o.getGraphDiv(r);var a,s,l=[],c=e.deleteTraces,f=t,h=[r,l],p=[r,n];for(function(t,e,r){var n,i;if(!Array.isArray(t.data))throw new Error(\"gd.data must be an array.\");if(void 0===e)throw new Error(\"traces must be defined.\");for(Array.isArray(e)||(e=[e]),n=0;n=0&&r=0&&r=a.length)return!1;if(2===t.dimensions){if(r++,e.length===r)return t;var o=e[r];if(!_(o))return!1;t=a[i][o]}else t=a[i]}else t=a}}return t}function _(t){return t===Math.round(t)&&t>=0}function w(){var t,e,r={};for(t in f(r,o),n.subplotsRegistry)if((e=n.subplotsRegistry[t]).layoutAttributes)if(Array.isArray(e.attr))for(var i=0;i=l.length)return!1;i=(r=(n.transformsRegistry[l[u].type]||{}).attributes)&&r[e[2]],s=3}else{var c=t._module;if(c||(c=(n.modules[t.type||a.type.dflt]||{})._module),!c)return!1;if(!(i=(r=c.attributes)&&r[o])){var f=c.basePlotModule;f&&f.attributes&&(i=f.attributes[o])}i||(i=a[o])}return b(i,e,s)},e.getLayoutValObject=function(t,e){var r=function(t,e){var r,i,a,s,l=t._basePlotModules;if(l){var u;for(r=0;r=i&&(r._input||{})._templateitemname;s&&(o=i);var l,u=e+\"[\"+o+\"]\";function c(){l={},s&&(l[u]={},l[u][a]=s)}function f(t,e){s?n.nestedProperty(l[u],t).set(e):l[u+\".\"+t]=e}function h(){var t=l;return c(),t}return c(),{modifyBase:function(t,e){l[t]=e},modifyItem:f,getUpdateObj:h,applyUpdate:function(e,r){e&&f(e,r);var i=h();for(var a in i)n.nestedProperty(t,a).set(i[a])}}}},39172:function(t,e,r){\"use strict\";var n=r(33428),i=r(24040),a=r(7316),o=r(3400),s=r(72736),l=r(73696),u=r(76308),c=r(43616),f=r(81668),h=r(45460),p=r(54460),d=r(84284),v=r(71888),g=v.enforce,y=v.clean,m=r(19280).doAutoRange,x=\"start\";function b(t,e,r){for(var n=0;n=t[1]||i[1]<=t[0])&&a[0]e[0])return!0}return!1}function _(t){var r,i,s,l,f,v,g=t._fullLayout,y=g._size,m=y.p,x=p.list(t,\"\",!0);if(g._paperdiv.style({width:t._context.responsive&&g.autosize&&!t._context._hasZeroWidth&&!t.layout.width?\"100%\":g.width+\"px\",height:t._context.responsive&&g.autosize&&!t._context._hasZeroHeight&&!t.layout.height?\"100%\":g.height+\"px\"}).selectAll(\".main-svg\").call(c.setSize,g.width,g.height),t._context.setBackground(t,g.paper_bgcolor),e.drawMainTitle(t),h.manage(t),!g._has(\"cartesian\"))return a.previousPromises(t);function _(t,e,r){var n=t._lw/2;return\"x\"===t._id.charAt(0)?e?\"top\"===r?e._offset-m-n:e._offset+e._length+m+n:y.t+y.h*(1-(t.position||0))+n%1:e?\"right\"===r?e._offset+e._length+m+n:e._offset-m-n:y.l+y.w*(t.position||0)+n%1}for(r=0;r.5?\"t\":\"b\",o=t._fullLayout.margin[a],s=0;return\"paper\"===e.yref?s=r+e.pad.t+e.pad.b:\"container\"===e.yref&&(s=function(t,e,r,n,i){var a=0;return\"middle\"===r&&(a+=i/2),\"t\"===t?(\"top\"===r&&(a+=i),a+=n-e*n):(\"bottom\"===r&&(a+=i),a+=e*n),a}(a,n,i,t._fullLayout.height,r)+e.pad.t+e.pad.b),s>o?s:0}(t,r,g);if(y>0){!function(t,e,r,n){var i=\"title.automargin\",s=t._fullLayout.title,l=s.y>.5?\"t\":\"b\",u={x:s.x,y:s.y,t:0,b:0},c={};\"paper\"===s.yref&&function(t,e,r,n,i){var a=\"paper\"===e.yref?t._fullLayout._size.h:t._fullLayout.height,s=o.isTopAnchor(e)?n:n-i,l=\"b\"===r?a-s:s;return!(o.isTopAnchor(e)&&\"t\"===r||o.isBottomAnchor(e)&&\"b\"===r)&&lT?c.push({code:\"unused\",traceType:m,templateCount:w,dataCount:T}):T>w&&c.push({code:\"reused\",traceType:m,templateCount:w,dataCount:T})}}else c.push({code:\"data\"});if(function t(e,r){for(var n in e)if(\"_\"!==n.charAt(0)){var a=e[n],o=v(e,n,r);i(a)?(Array.isArray(e)&&!1===a._template&&a.templateitemname&&c.push({code:\"missing\",path:o,templateitemname:a.templateitemname}),t(a,o)):Array.isArray(a)&&g(a)&&t(a,o)}}({data:p,layout:h},\"\"),c.length)return c.map(y)}},67024:function(t,e,r){\"use strict\";var n=r(38248),i=r(36424),a=r(7316),o=r(3400),s=r(81792),l=r(37164),u=r(63268),c=r(25788).version,f={format:{valType:\"enumerated\",values:[\"png\",\"jpeg\",\"webp\",\"svg\",\"full-json\"],dflt:\"png\"},width:{valType:\"number\",min:1},height:{valType:\"number\",min:1},scale:{valType:\"number\",min:0,dflt:1},setBackground:{valType:\"any\",dflt:!1},imageDataOnly:{valType:\"boolean\",dflt:!1}};t.exports=function(t,e){var r,h,p,d;function v(t){return!(t in e)||o.validate(e[t],f[t])}if(e=e||{},o.isPlainObject(t)?(r=t.data||[],h=t.layout||{},p=t.config||{},d={}):(t=o.getGraphDiv(t),r=o.extendDeep([],t.data),h=o.extendDeep({},t.layout),p=t._context,d=t._fullLayout||{}),!v(\"width\")&&null!==e.width||!v(\"height\")&&null!==e.height)throw new Error(\"Height and width should be pixel values.\");if(!v(\"format\"))throw new Error(\"Export format is not \"+o.join2(f.format.values,\", \",\" or \")+\".\");var g={};function y(t,r){return o.coerce(e,g,f,t,r)}var m=y(\"format\"),x=y(\"width\"),b=y(\"height\"),_=y(\"scale\"),w=y(\"setBackground\"),T=y(\"imageDataOnly\"),k=document.createElement(\"div\");k.style.position=\"absolute\",k.style.left=\"-5000px\",document.body.appendChild(k);var A=o.extendFlat({},h);x?A.width=x:null===e.width&&n(d.width)&&(A.width=d.width),b?A.height=b:null===e.height&&n(d.height)&&(A.height=d.height);var M=o.extendFlat({},p,{_exportedPlot:!0,staticPlot:!0,setBackground:w}),S=s.getRedrawFunc(k);function E(){return new Promise((function(t){setTimeout(t,s.getDelay(k._fullLayout))}))}function L(){return new Promise((function(t,e){var r=l(k,m,_),n=k._fullLayout.width,f=k._fullLayout.height;function h(){i.purge(k),document.body.removeChild(k)}if(\"full-json\"===m){var p=a.graphJson(k,!1,\"keepdata\",\"object\",!0,!0);return p.version=c,p=JSON.stringify(p),h(),t(T?p:s.encodeJSON(p))}if(h(),\"svg\"===m)return t(T?r:s.encodeSVG(r));var d=document.createElement(\"canvas\");d.id=o.randstr(),u({format:m,width:n,height:f,scale:_,canvas:d,svg:r,promise:!0}).then(t).catch(e)}))}return new Promise((function(t,e){i.newPlot(k,r,A,M).then(S).then(E).then(L).then((function(e){t(function(t){return T?t.replace(s.IMAGE_URL_PREFIX,\"\"):t}(e))})).catch((function(t){e(t)}))}))}},21480:function(t,e,r){\"use strict\";var n=r(3400),i=r(7316),a=r(73060),o=r(20556).dfltConfig,s=n.isPlainObject,l=Array.isArray,u=n.isArrayOrTypedArray;function c(t,e,r,i,a,o){o=o||[];for(var f=Object.keys(t),h=0;hx.length&&i.push(p(\"unused\",a,y.concat(x.length)));var A,M,S,E,L,C=x.length,P=Array.isArray(k);if(P&&(C=Math.min(C,k.length)),2===b.dimensions)for(M=0;Mx[M].length&&i.push(p(\"unused\",a,y.concat(M,x[M].length)));var O=x[M].length;for(A=0;A<(P?Math.min(O,k[M].length):O);A++)S=P?k[M][A]:k,E=m[M][A],L=x[M][A],n.validate(E,S)?L!==E&&L!==+E&&i.push(p(\"dynamic\",a,y.concat(M,A),E,L)):i.push(p(\"value\",a,y.concat(M,A),E))}else i.push(p(\"array\",a,y.concat(M),m[M]));else for(M=0;M1&&h.push(p(\"object\",\"layout\"))),i.supplyDefaults(d);for(var v=d._fullData,g=r.length,y=0;y0&&Math.round(f)===f))return{vals:i};u=f}for(var h=e.calendar,p=\"start\"===l,d=\"end\"===l,v=t[r+\"period0\"],g=a(v,h)||0,y=[],m=[],x=[],b=i.length,_=0;_A;)k=o(k,-u,h);for(;k<=A;)k=o(k,u,h);T=o(k,-u,h)}else{for(k=g+(w=Math.round((A-g)/c))*c;k>A;)k-=c;for(;k<=A;)k+=c;T=k-c}y[_]=p?T:d?k:(T+k)/2,m[_]=T,x[_]=k}return{vals:y,starts:m,ends:x}}},26720:function(t){\"use strict\";t.exports={xaxis:{valType:\"subplotid\",dflt:\"x\",editType:\"calc+clearAxisTypes\"},yaxis:{valType:\"subplotid\",dflt:\"y\",editType:\"calc+clearAxisTypes\"}}},19280:function(t,e,r){\"use strict\";var n=r(33428),i=r(38248),a=r(3400),o=r(39032).FP_SAFE,s=r(24040),l=r(43616),u=r(79811),c=u.getFromId,f=u.isLinked;function h(t,e){var r,n,i=[],o=t._fullLayout,s=d(o,e,0),l=d(o,e,1),u=g(t,e),c=u.min,f=u.max;if(0===c.length||0===f.length)return a.simpleMap(e.range,e.r2l);var h=c[0].val,v=f[0].val;for(r=1;r0&&((A=C-s(b)-l(_))>P?M/A>O&&(w=b,T=_,O=M/A):M/C>O&&(w={val:b.val,nopad:1},T={val:_.val,nopad:1},O=M/C));if(h===v){var I=h-1,z=h+1;if(E)if(0===h)i=[0,1];else{var D=(h>0?f:c).reduce((function(t,e){return Math.max(t,l(e))}),0),R=h/(1-Math.min(.5,D/C));i=h>0?[0,R]:[R,0]}else i=L?[Math.max(0,I),Math.max(1,z)]:[I,z]}else E?(w.val>=0&&(w={val:0,nopad:1}),T.val<=0&&(T={val:0,nopad:1})):L&&(w.val-O*s(w)<0&&(w={val:0,nopad:1}),T.val<=0&&(T={val:1,nopad:1})),O=(T.val-w.val-p(e,b.val,_.val))/(C-s(w)-l(T)),i=[w.val-O*s(w),T.val+O*l(T)];return i=k(i,e),e.limitRange&&e.limitRange(),m&&i.reverse(),a.simpleMap(i,e.l2r||Number)}function p(t,e,r){var n=0;if(t.rangebreaks)for(var i=t.locateBreaks(e,r),a=0;a0?r.ppadplus:r.ppadminus)||r.ppad||0),S=A((t._m>0?r.ppadminus:r.ppadplus)||r.ppad||0),E=A(r.vpadplus||r.vpad),L=A(r.vpadminus||r.vpad);if(!T){if(h=1/0,p=-1/0,w)for(n=0;n0&&(h=a),a>p&&a-o&&(h=a),a>p&&a=O;n--)P(n);return{min:d,max:v,opts:r}},concatExtremes:g};var v=3;function g(t,e,r){var n,i,a,o=e._id,s=t._fullData,l=t._fullLayout,u=[],f=[];function h(t,e){for(n=0;n=r&&(u.extrapad||!o)){s=!1;break}i(e,u.val)&&u.pad<=r&&(o||!u.extrapad)&&(t.splice(l,1),l--)}if(s){var c=a&&0===e;t.push({val:e,pad:c?0:r,extrapad:!c&&o})}}function b(t){return i(t)&&Math.abs(t)=e}function T(t,e,r){return void 0===e||void 0===r||(e=t.d2l(e))=u&&(o=u,r=u),s<=u&&(s=u,n=u)}}return r=function(t,e){var r=e.autorangeoptions;return r&&void 0!==r.minallowed&&T(e,r.minallowed,r.maxallowed)?r.minallowed:r&&void 0!==r.clipmin&&T(e,r.clipmin,r.clipmax)?Math.max(t,e.d2l(r.clipmin)):t}(r,e),n=function(t,e){var r=e.autorangeoptions;return r&&void 0!==r.maxallowed&&T(e,r.minallowed,r.maxallowed)?r.maxallowed:r&&void 0!==r.clipmax&&T(e,r.clipmin,r.clipmax)?Math.min(t,e.d2l(r.clipmax)):t}(n,e),[r,n]}},76808:function(t){\"use strict\";t.exports=function(t,e,r){var n,i;if(r){var a=\"reversed\"===e||\"min reversed\"===e||\"max reversed\"===e;n=r[a?1:0],i=r[a?0:1]}var o=t(\"autorangeoptions.minallowed\",null===i?n:void 0),s=t(\"autorangeoptions.maxallowed\",null===n?i:void 0);void 0===o&&t(\"autorangeoptions.clipmin\"),void 0===s&&t(\"autorangeoptions.clipmax\"),t(\"autorangeoptions.include\")}},54460:function(t,e,r){\"use strict\";var n=r(33428),i=r(38248),a=r(7316),o=r(24040),s=r(3400),l=s.strTranslate,u=r(72736),c=r(81668),f=r(76308),h=r(43616),p=r(94724),d=r(98728),v=r(39032),g=v.ONEMAXYEAR,y=v.ONEAVGYEAR,m=v.ONEMINYEAR,x=v.ONEMAXQUARTER,b=v.ONEAVGQUARTER,_=v.ONEMINQUARTER,w=v.ONEMAXMONTH,T=v.ONEAVGMONTH,k=v.ONEMINMONTH,A=v.ONEWEEK,M=v.ONEDAY,S=M/2,E=v.ONEHOUR,L=v.ONEMIN,C=v.ONESEC,P=v.MINUS_SIGN,O=v.BADNUM,I={K:\"zeroline\"},z={K:\"gridline\",L:\"path\"},D={K:\"minor-gridline\",L:\"path\"},R={K:\"tick\",L:\"path\"},F={K:\"tick\",L:\"text\"},B={width:[\"x\",\"r\",\"l\",\"xl\",\"xr\"],height:[\"y\",\"t\",\"b\",\"yt\",\"yb\"],right:[\"r\",\"xr\"],left:[\"l\",\"xl\"],top:[\"t\",\"yt\"],bottom:[\"b\",\"yb\"]},N=r(84284),j=N.MID_SHIFT,U=N.CAP_SHIFT,V=N.LINE_SPACING,q=N.OPPOSITE_SIDE,H=t.exports={};H.setConvert=r(78344);var G=r(52976),W=r(79811),Y=W.idSort,X=W.isLinked;H.id2name=W.id2name,H.name2id=W.name2id,H.cleanId=W.cleanId,H.list=W.list,H.listIds=W.listIds,H.getFromId=W.getFromId,H.getFromTrace=W.getFromTrace;var Z=r(19280);H.getAutoRange=Z.getAutoRange,H.findExtremes=Z.findExtremes;var K=1e-4;function J(t){var e=(t[1]-t[0])*K;return[t[0]-e,t[1]+e]}H.coerceRef=function(t,e,r,n,i,a){var o=n.charAt(n.length-1),l=r._fullLayout._subplots[o+\"axis\"],u=n+\"ref\",c={};return i||(i=l[0]||(\"string\"==typeof a?a:a[0])),a||(a=i),l=l.concat(l.map((function(t){return t+\" domain\"}))),c[u]={valType:\"enumerated\",values:l.concat(a?\"string\"==typeof a?[a]:a:[]),dflt:i},s.coerce(t,e,c,u)},H.getRefType=function(t){return void 0===t?t:\"paper\"===t?\"paper\":\"pixel\"===t?\"pixel\":/( domain)$/.test(t)?\"domain\":\"range\"},H.coercePosition=function(t,e,r,n,i,a){var o,l;if(\"range\"!==H.getRefType(n))o=s.ensureNumber,l=r(i,a);else{var u=H.getFromId(e,n);l=r(i,a=u.fraction2r(a)),o=u.cleanPos}t[i]=o(l)},H.cleanPosition=function(t,e,r){return(\"paper\"===r||\"pixel\"===r?s.ensureNumber:H.getFromId(e,r).cleanPos)(t)},H.redrawComponents=function(t,e){e=e||H.listIds(t);var r=t._fullLayout;function n(n,i,a,s){for(var l=o.getComponentMethod(n,i),u={},c=0;cn&&h2e-6||((r-t._forceTick0)/t._minDtick%1+1.000001)%1>2e-6)&&(t._minDtick=0)):t._minDtick=0},H.saveRangeInitial=function(t,e){for(var r=H.list(t,\"\",!0),n=!1,i=0;i.3*h||c(n)||c(a))){var p=r.dtick/2;t+=t+p.8){var o=Number(r.substr(1));a.exactYears>.8&&o%12==0?t=H.tickIncrement(t,\"M6\",\"reverse\")+1.5*M:a.exactMonths>.8?t=H.tickIncrement(t,\"M1\",\"reverse\")+15.5*M:t-=S;var l=H.tickIncrement(t,r);if(l<=n)return l}return t}(m,t,y,u,a)),g=m;g<=c;)g=H.tickIncrement(g,y,!1,a);return{start:e.c2r(m,0,a),end:e.c2r(g,0,a),size:y,_dataSpan:c-u}},H.prepMinorTicks=function(t,e,r){if(!e.minor.dtick){delete t.dtick;var n,a=e.dtick&&i(e._tmin);if(a){var o=H.tickIncrement(e._tmin,e.dtick,!0);n=[e._tmin,.99*o+.01*e._tmin]}else{var l=s.simpleMap(e.range,e.r2l);n=[l[0],.8*l[0]+.2*l[1]]}if(t.range=s.simpleMap(n,e.l2r),t._isMinor=!0,H.prepTicks(t,r),a){var u=i(e.dtick),c=i(t.dtick),f=u?e.dtick:+e.dtick.substring(1),h=c?t.dtick:+t.dtick.substring(1);u&&c?et(f,h)?f===2*A&&h===2*M&&(t.dtick=A):f===2*A&&h===3*M?t.dtick=A:f!==A||(e._input.minor||{}).nticks?rt(f/h,2.5)?t.dtick=f/2:t.dtick=f:t.dtick=M:\"M\"===String(e.dtick).charAt(0)?c?t.dtick=\"M1\":et(f,h)?f>=12&&2===h&&(t.dtick=\"M3\"):t.dtick=e.dtick:\"L\"===String(t.dtick).charAt(0)?\"L\"===String(e.dtick).charAt(0)?et(f,h)||(t.dtick=rt(f/h,2.5)?e.dtick/2:e.dtick):t.dtick=\"D1\":\"D2\"===t.dtick&&+e.dtick>1&&(t.dtick=1)}t.range=e.range}void 0===e.minor._tick0Init&&(t.tick0=e.tick0)},H.prepTicks=function(t,e){var r=s.simpleMap(t.range,t.r2l,void 0,void 0,e);if(\"auto\"===t.tickmode||!t.dtick){var n,a=t.nticks;a||(\"category\"===t.type||\"multicategory\"===t.type?(n=t.tickfont?s.bigFont(t.tickfont.size||12):15,a=t._length/n):(n=\"y\"===t._id.charAt(0)?40:80,a=s.constrain(t._length/n,4,9)+1),\"radialaxis\"===t._name&&(a*=2)),t.minor&&\"array\"!==t.minor.tickmode||\"array\"===t.tickmode&&(a*=100),t._roughDTick=Math.abs(r[1]-r[0])/a,H.autoTicks(t,t._roughDTick),t._minDtick>0&&t.dtick<2*t._minDtick&&(t.dtick=t._minDtick,t.tick0=t.l2r(t._forceTick0))}\"period\"===t.ticklabelmode&&function(t){var e;function r(){return!(i(t.dtick)||\"M\"!==t.dtick.charAt(0))}var n=r(),a=H.getTickFormat(t);if(a){var o=t._dtickInit!==t.dtick;/%[fLQsSMX]/.test(a)||(/%[HI]/.test(a)?(e=E,o&&!n&&t.dtick=(I?0:1);z--){var D=!z;z?(t._dtickInit=t.dtick,t._tick0Init=t.tick0):(t.minor._dtickInit=t.minor.dtick,t.minor._tick0Init=t.minor.tick0);var R=z?t:s.extendFlat({},t,t.minor);if(D?H.prepMinorTicks(R,t,e):H.prepTicks(R,e),\"array\"!==R.tickmode)if(\"sync\"!==R.tickmode){var F=J(c),B=F[0],N=F[1],j=i(R.dtick),U=\"log\"===a&&!(j||\"L\"===R.dtick.charAt(0)),V=H.tickFirst(R,e);if(z){if(t._tmin=V,V=N:Y<=N;Y=H.tickIncrement(Y,X,f,o)){if(z&&q++,R.rangebreaks&&!f){if(Y=p)break}if(C.length>d||Y===W)break;W=Y;var Z={value:Y};z?(U&&Y!==(0|Y)&&(Z.simpleLabel=!0),l>1&&q%l&&(Z.skipLabel=!0),C.push(Z)):(Z.minor=!0,P.push(Z))}}else C=[],v=at(t);else z?(C=[],v=ot(t,!D)):(P=[],L=ot(t,!D))}if(I&&!(\"inside\"===t.minor.ticks&&\"outside\"===t.ticks||\"outside\"===t.minor.ticks&&\"inside\"===t.ticks)){for(var K=C.map((function(t){return t.value})),$=[],Q=0;Q0?(a=n-1,o=n):(a=n,o=n);var s,l=t[a].value,u=t[o].value,c=Math.abs(u-l),f=r||c,h=0;f>=m?h=c>=m&&c<=g?c:y:r===b&&f>=_?h=c>=_&&c<=x?c:b:f>=k?h=c>=k&&c<=w?c:T:r===A&&f>=A?h=A:f>=M?h=M:r===S&&f>=S?h=S:r===E&&f>=E&&(h=E),h>=c&&(h=c,s=!0);var p=i+h;if(e.rangebreaks&&h>0){for(var d=0,v=0;v<84;v++){var L=(v+.5)/84;e.maskBreaks(i*(1-L)+L*p)!==O&&d++}(h*=d/84)||(t[n].drop=!0),s&&c>A&&(h=c)}(h>0||0===n)&&(t[n].periodX=i+h/2)}}(C,t,t._definedDelta),t.rangebreaks){var it=\"y\"===t._id.charAt(0),st=1;\"auto\"===t.tickmode&&(st=t.tickfont?t.tickfont.size:12);var lt=NaN;for(r=C.length-1;r>-1;r--)if(C[r].drop)C.splice(r,1);else{C[r].value=Dt(C[r].value,t);var ut=t.c2p(C[r].value);(it?lt>ut-st:ltp||ftp&&(ct.periodX=p),ft10||\"01-01\"!==n.substr(5)?t._tickround=\"d\":t._tickround=+e.substr(1)%12==0?\"y\":\"m\";else if(e>=M&&a<=10||e>=15*M)t._tickround=\"d\";else if(e>=L&&a<=16||e>=E)t._tickround=\"M\";else if(e>=C&&a<=19||e>=L)t._tickround=\"S\";else{var o=t.l2r(r+e).replace(/^-/,\"\").length;t._tickround=Math.max(a,o)-20,t._tickround<0&&(t._tickround=4)}}else if(i(e)||\"L\"===e.charAt(0)){var s=t.range.map(t.r2d||Number);i(e)||(e=Number(e.substr(1))),t._tickround=2-Math.floor(Math.log(e)/Math.LN10+.01);var l=Math.max(Math.abs(s[0]),Math.abs(s[1])),u=Math.floor(Math.log(l)/Math.LN10+.01),c=void 0===t.minexponent?3:t.minexponent;Math.abs(u)>c&&(mt(t.exponentformat)&&!xt(u)?t._tickexponent=3*Math.round((u-1)/3):t._tickexponent=u)}else t._tickround=null}function gt(t,e,r){var n=t.tickfont||{};return{x:e,dx:0,dy:0,text:r||\"\",fontSize:n.size,font:n.family,fontWeight:n.weight,fontStyle:n.style,fontVariant:n.variant,fontColor:n.color}}H.autoTicks=function(t,e,r){var n;function a(t){return Math.pow(t,Math.floor(Math.log(e)/Math.LN10))}if(\"date\"===t.type){t.tick0=s.dateTick0(t.calendar,0);var o=2*e;if(o>y)e/=y,n=a(10),t.dtick=\"M\"+12*dt(e,n,st);else if(o>T)e/=T,t.dtick=\"M\"+dt(e,1,lt);else if(o>M){if(t.dtick=dt(e,M,t._hasDayOfWeekBreaks?[1,2,7,14]:ct),!r){var l=H.getTickFormat(t),u=\"period\"===t.ticklabelmode;u&&(t._rawTick0=t.tick0),/%[uVW]/.test(l)?t.tick0=s.dateTick0(t.calendar,2):t.tick0=s.dateTick0(t.calendar,1),u&&(t._dowTick0=t.tick0)}}else o>E?t.dtick=dt(e,E,lt):o>L?t.dtick=dt(e,L,ut):o>C?t.dtick=dt(e,C,ut):(n=a(10),t.dtick=dt(e,n,st))}else if(\"log\"===t.type){t.tick0=0;var c=s.simpleMap(t.range,t.r2l);if(t._isMinor&&(e*=1.5),e>.7)t.dtick=Math.ceil(e);else if(Math.abs(c[1]-c[0])<1){var f=1.5*Math.abs((c[1]-c[0])/e);e=Math.abs(Math.pow(10,c[1])-Math.pow(10,c[0]))/f,n=a(10),t.dtick=\"L\"+dt(e,n,st)}else t.dtick=e>.3?\"D2\":\"D1\"}else\"category\"===t.type||\"multicategory\"===t.type?(t.tick0=0,t.dtick=Math.ceil(Math.max(e,1))):zt(t)?(t.tick0=0,n=1,t.dtick=dt(e,n,pt)):(t.tick0=0,n=a(10),t.dtick=dt(e,n,st));if(0===t.dtick&&(t.dtick=1),!i(t.dtick)&&\"string\"!=typeof t.dtick){var h=t.dtick;throw t.dtick=1,\"ax.dtick error: \"+String(h)}},H.tickIncrement=function(t,e,r,a){var o=r?-1:1;if(i(e))return s.increment(t,o*e);var l=e.charAt(0),u=o*Number(e.substr(1));if(\"M\"===l)return s.incrementMonth(t,u,a);if(\"L\"===l)return Math.log(Math.pow(10,t)+u)/Math.LN10;if(\"D\"===l){var c=\"D2\"===e?ht:ft,f=t+.01*o,h=s.roundUp(s.mod(f,1),c,r);return Math.floor(f)+Math.log(n.round(Math.pow(10,h),1))/Math.LN10}throw\"unrecognized dtick \"+String(e)},H.tickFirst=function(t,e){var r=t.r2l||Number,a=s.simpleMap(t.range,r,void 0,void 0,e),o=a[1]=0&&r<=t._length?e:null};if(l&&s.isArrayOrTypedArray(t.ticktext)){var p=s.simpleMap(t.range,t.r2l),d=(Math.abs(p[1]-p[0])-(t._lBreaks||0))/1e4;for(a=0;a \")}else t._prevDateHead=l,u+=\"
\"+l;e.text=u}(t,o,r,u):\"log\"===c?function(t,e,r,n,a){var o=t.dtick,l=e.x,u=t.tickformat,c=\"string\"==typeof o&&o.charAt(0);if(\"never\"===a&&(a=\"\"),n&&\"L\"!==c&&(o=\"L3\",c=\"L\"),u||\"L\"===c)e.text=bt(Math.pow(10,l),t,a,n);else if(i(o)||\"D\"===c&&s.mod(l+.01,1)<.1){var f=Math.round(l),h=Math.abs(f),p=t.exponentformat;\"power\"===p||mt(p)&&xt(f)?(e.text=0===f?1:1===f?\"10\":\"10\"+(f>1?\"\":P)+h+\"\",e.fontSize*=1.25):(\"e\"===p||\"E\"===p)&&h>2?e.text=\"1\"+p+(f>0?\"+\":P)+h:(e.text=bt(Math.pow(10,l),t,\"\",\"fakehover\"),\"D1\"===o&&\"y\"===t._id.charAt(0)&&(e.dy-=e.fontSize/6))}else{if(\"D\"!==c)throw\"unrecognized dtick \"+String(o);e.text=String(Math.round(Math.pow(10,s.mod(l,1)))),e.fontSize*=.75}if(\"D1\"===t.dtick){var d=String(e.text).charAt(0);\"0\"!==d&&\"1\"!==d||(\"y\"===t._id.charAt(0)?e.dx-=e.fontSize/4:(e.dy+=e.fontSize/2,e.dx+=(t.range[1]>t.range[0]?1:-1)*e.fontSize*(l<0?.5:.25)))}}(t,o,0,u,g):\"category\"===c?function(t,e){var r=t._categories[Math.round(e.x)];void 0===r&&(r=\"\"),e.text=String(r)}(t,o):\"multicategory\"===c?function(t,e,r){var n=Math.round(e.x),i=t._categories[n]||[],a=void 0===i[1]?\"\":String(i[1]),o=void 0===i[0]?\"\":String(i[0]);r?e.text=o+\" - \"+a:(e.text=a,e.text2=o)}(t,o,r):zt(t)?function(t,e,r,n,i){if(\"radians\"!==t.thetaunit||r)e.text=bt(e.x,t,i,n);else{var a=e.x/180;if(0===a)e.text=\"0\";else{var o=function(t){function e(t,e){return Math.abs(t-e)<=1e-6}var r=function(t){for(var r=1;!e(Math.round(t*r)/r,t);)r*=10;return r}(t),n=t*r,i=Math.abs(function t(r,n){return e(n,0)?r:t(n,r%n)}(n,r));return[Math.round(n/i),Math.round(r/i)]}(a);if(o[1]>=100)e.text=bt(s.deg2rad(e.x),t,i,n);else{var l=e.x<0;1===o[1]?1===o[0]?e.text=\"π\":e.text=o[0]+\"π\":e.text=[\"\",o[0],\"\",\"⁄\",\"\",o[1],\"\",\"π\"].join(\"\"),l&&(e.text=P+e.text)}}}}(t,o,r,u,g):function(t,e,r,n,i){\"never\"===i?i=\"\":\"all\"===t.showexponent&&Math.abs(e.x/t.dtick)<1e-6&&(i=\"hide\"),e.text=bt(e.x,t,i,n)}(t,o,0,u,g),n||(t.tickprefix&&!v(t.showtickprefix)&&(o.text=t.tickprefix+o.text),t.ticksuffix&&!v(t.showticksuffix)&&(o.text+=t.ticksuffix)),t.labelalias&&t.labelalias.hasOwnProperty(o.text)){var y=t.labelalias[o.text];\"string\"==typeof y&&(o.text=y)}return(\"boundaries\"===t.tickson||t.showdividers)&&(o.xbnd=[h(o.x-.5),h(o.x+t.dtick-.5)]),o},H.hoverLabelText=function(t,e,r){r&&(t=s.extendFlat({},t,{hoverformat:r}));var n=s.isArrayOrTypedArray(e)?e[0]:e,i=s.isArrayOrTypedArray(e)?e[1]:void 0;if(void 0!==i&&i!==n)return H.hoverLabelText(t,n,r)+\" - \"+H.hoverLabelText(t,i,r);var a=\"log\"===t.type&&n<=0,o=H.tickText(t,t.c2l(a?-n:n),\"hover\").text;return a?0===n?\"0\":P+o:o};var yt=[\"f\",\"p\",\"n\",\"μ\",\"m\",\"\",\"k\",\"M\",\"G\",\"T\"];function mt(t){return\"SI\"===t||\"B\"===t}function xt(t){return t>14||t<-15}function bt(t,e,r,n){var a=t<0,o=e._tickround,l=r||e.exponentformat||\"B\",u=e._tickexponent,c=H.getTickFormat(e),f=e.separatethousands;if(n){var h={exponentformat:l,minexponent:e.minexponent,dtick:\"none\"===e.showexponent?e.dtick:i(t)&&Math.abs(t)||1,range:\"none\"===e.showexponent?e.range.map(e.r2d):[0,t||1]};vt(h),o=(Number(h._tickround)||0)+4,u=h._tickexponent,e.hoverformat&&(c=e.hoverformat)}if(c)return e._numFormat(c)(t).replace(/-/g,P);var p,d=Math.pow(10,-o)/2;if(\"none\"===l&&(u=0),(t=Math.abs(t))\"+p+\"\":\"B\"===l&&9===u?t+=\"B\":mt(l)&&(t+=yt[u/3+5])),a?P+t:t}function _t(t,e){if(t){var r=Object.keys(B).reduce((function(t,r){return-1!==e.indexOf(r)&&B[r].forEach((function(e){t[e]=1})),t}),{});Object.keys(t).forEach((function(e){r[e]||(1===e.length?t[e]=0:delete t[e])}))}}function wt(t,e){for(var r=[],n={},i=0;i1&&r=i.min&&t=0,a=c(t,e[1])<=0;return(r||i)&&(n||a)}if(t.tickformatstops&&t.tickformatstops.length>0)switch(t.type){case\"date\":case\"linear\":for(e=0;e=o(i)))){r=n;break}break;case\"log\":for(e=0;e=0&&i.unshift(i.splice(n,1).shift())}}));var o={false:{left:0,right:0}};return s.syncOrAsync(i.map((function(e){return function(){if(e){var n=H.getFromId(t,e);r||(r={}),r.axShifts=o,r.overlayingShiftedAx=a;var i=H.drawOne(t,n,r);return n._shiftPusher&&Bt(n,n._fullDepth||0,o,!0),n._r=n.range.slice(),n._rl=s.simpleMap(n._r,n.r2l),i}}})))},H.drawOne=function(t,e,r){var n,i,l,p=(r=r||{}).axShifts||{},d=r.overlayingShiftedAx||[];e.setScale();var v=t._fullLayout,g=e._id,y=g.charAt(0),m=H.counterLetter(g),x=v._plots[e._mainSubplot];if(x){if(e._shiftPusher=e.autoshift||-1!==d.indexOf(e._id)||-1!==d.indexOf(e.overlaying),e._shiftPusher&\"free\"===e.anchor){var b=e.linewidth/2||0;\"inside\"===e.ticks&&(b+=e.ticklen),Bt(e,b,p,!0),Bt(e,e.shift||0,p,!1)}!0===r.skipTitle&&void 0!==e._shift||(e._shift=function(t,e){return t.autoshift?e[t.overlaying][t.side]:t.shift||0}(e,p));var _=x[y+\"axislayer\"],w=e._mainLinePosition,T=w+=e._shift,k=e._mainMirrorPosition,A=e._vals=H.calcTicks(e),M=[e.mirror,T,k].join(\"_\");for(n=0;n0?r.bottom-c:0,f))));var h=0,p=0;if(e._shiftPusher&&(h=Math.max(f,r.height>0?\"l\"===l?c-r.left:r.right-c:0),e.title.text!==v._dfltTitle[y]&&(p=(e._titleStandoff||0)+(e._titleScoot||0),\"l\"===l&&(p+=At(e))),e._fullDepth=Math.max(h,p)),e.automargin){n={x:0,y:0,r:0,l:0,t:0,b:0};var d=[0,1],g=\"number\"==typeof e._shift?e._shift:0;if(\"x\"===y){if(\"b\"===l?n[l]=e._depth:(n[l]=e._depth=Math.max(r.width>0?c-r.top:0,f),d.reverse()),r.width>0){var x=r.right-(e._offset+e._length);x>0&&(n.xr=1,n.r=x);var b=e._offset-r.left;b>0&&(n.xl=0,n.l=b)}}else if(\"l\"===l?(e._depth=Math.max(r.height>0?c-r.left:0,f),n[l]=e._depth-g):(e._depth=Math.max(r.height>0?r.right-c:0,f),n[l]=e._depth+g,d.reverse()),r.height>0){var _=r.bottom-(e._offset+e._length);_>0&&(n.yb=0,n.b=_);var w=e._offset-r.top;w>0&&(n.yt=1,n.t=w)}n[m]=\"free\"===e.anchor?e.position:e._anchorAxis.domain[d[0]],e.title.text!==v._dfltTitle[y]&&(n[l]+=At(e)+(e.title.standoff||0)),e.mirror&&\"free\"!==e.anchor&&((i={x:0,y:0,r:0,l:0,t:0,b:0})[u]=e.linewidth,e.mirror&&!0!==e.mirror&&(i[u]+=f),!0===e.mirror||\"ticks\"===e.mirror?i[m]=e._anchorAxis.domain[d[1]]:\"all\"!==e.mirror&&\"allticks\"!==e.mirror||(i[m]=[e._counterDomainMin,e._counterDomainMax][d[1]]))}ft&&(s=o.getComponentMethod(\"rangeslider\",\"autoMarginOpts\")(t,e)),\"string\"==typeof e.automargin&&(_t(n,e.automargin),_t(i,e.automargin)),a.autoMargin(t,Et(e),n),a.autoMargin(t,Lt(e),i),a.autoMargin(t,Ct(e),s)})),s.syncOrAsync(ut)}}function ht(t){var r=g+(t||\"tick\");return S[r]||(S[r]=function(t,e,r){var n,i,a,o;if(t._selections[e].size())n=1/0,i=-1/0,a=1/0,o=-1/0,t._selections[e].each((function(){var t=St(this),e=h.bBox(t.node().parentNode);n=Math.min(n,e.top),i=Math.max(i,e.bottom),a=Math.min(a,e.left),o=Math.max(o,e.right)}));else{var s=H.makeLabelFns(t,r);n=i=s.yFn({dx:0,dy:0,fontSize:0}),a=o=s.xFn({dx:0,dy:0,fontSize:0})}return{top:n,bottom:i,left:a,right:o,height:i-n,width:o-a}}(e,r,T)),S[r]}},H.getTickSigns=function(t,e){var r=t._id.charAt(0),n={x:\"top\",y:\"right\"}[r],i=t.side===n?1:-1,a=[-1,1,i,-i];return\"inside\"!==(e?(t.minor||{}).ticks:t.ticks)==(\"x\"===r)&&(a=a.map((function(t){return-t}))),t.side&&a.push({l:-1,t:-1,r:1,b:1}[t.side.charAt(0)]),a},H.makeTransTickFn=function(t){return\"x\"===t._id.charAt(0)?function(e){return l(t._offset+t.l2p(e.x),0)}:function(e){return l(0,t._offset+t.l2p(e.x))}},H.makeTransTickLabelFn=function(t){var e=function(t){var e=t.ticklabelposition||\"\",r=function(t){return-1!==e.indexOf(t)},n=r(\"top\"),i=r(\"left\"),a=r(\"right\"),o=r(\"bottom\"),s=r(\"inside\"),l=o||i||n||a;if(!l&&!s)return[0,0];var u=t.side,c=l?(t.tickwidth||0)/2:0,f=3,h=t.tickfont?t.tickfont.size:12;return(o||n)&&(c+=h*U,f+=(t.linewidth||0)/2),(i||a)&&(c+=(t.linewidth||0)/2,f+=3),s&&\"top\"===u&&(f-=h*(1-U)),(i||n)&&(c=-c),\"bottom\"!==u&&\"right\"!==u||(f=-f),[l?c:0,s?f:0]}(t),r=e[0],n=e[1];return\"x\"===t._id.charAt(0)?function(e){return l(r+t._offset+t.l2p(Tt(e)),n)}:function(e){return l(n,r+t._offset+t.l2p(Tt(e)))}},H.makeTickPath=function(t,e,r,n){n||(n={});var i=n.minor;if(i&&!t.minor)return\"\";var a=void 0!==n.len?n.len:i?t.minor.ticklen:t.ticklen,o=t._id.charAt(0),s=(t.linewidth||1)/2;return\"x\"===o?\"M0,\"+(e+s*r)+\"v\"+a*r:\"M\"+(e+s*r)+\",0h\"+a*r},H.makeLabelFns=function(t,e,r){var n=t.ticklabelposition||\"\",a=function(t){return-1!==n.indexOf(t)},o=a(\"top\"),l=a(\"left\"),u=a(\"right\"),c=a(\"bottom\")||l||o||u,f=a(\"inside\"),h=\"inside\"===n&&\"inside\"===t.ticks||!f&&\"outside\"===t.ticks&&\"boundaries\"!==t.tickson,p=0,d=0,v=h?t.ticklen:0;if(f?v*=-1:c&&(v=0),h&&(p+=v,r)){var g=s.deg2rad(r);p=v*Math.cos(g)+1,d=v*Math.sin(g)}t.showticklabels&&(h||t.showline)&&(p+=.2*t.tickfont.size);var y,m,x,b,_,w={labelStandoff:p+=(t.linewidth||1)/2*(f?-1:1),labelShift:d},T=0,k=t.side,A=t._id.charAt(0),M=t.tickangle;if(\"x\"===A)b=(_=!f&&\"bottom\"===k||f&&\"top\"===k)?1:-1,f&&(b*=-1),y=d*b,m=e+p*b,x=_?1:-.2,90===Math.abs(M)&&(f?x+=j:x=-90===M&&\"bottom\"===k?U:90===M&&\"top\"===k?j:.5,T=j/2*(M/90)),w.xFn=function(t){return t.dx+y+T*t.fontSize},w.yFn=function(t){return t.dy+m+t.fontSize*x},w.anchorFn=function(t,e){if(c){if(l)return\"end\";if(u)return\"start\"}return i(e)&&0!==e&&180!==e?e*b<0!==f?\"end\":\"start\":\"middle\"},w.heightFn=function(e,r,n){return r<-60||r>60?-.5*n:\"top\"===t.side!==f?-n:0};else if(\"y\"===A){if(b=(_=!f&&\"left\"===k||f&&\"right\"===k)?1:-1,f&&(b*=-1),y=p,m=d*b,x=0,f||90!==Math.abs(M)||(x=-90===M&&\"left\"===k||90===M&&\"right\"===k?U:.5),f){var S=i(M)?+M:0;if(0!==S){var E=s.deg2rad(S);T=Math.abs(Math.sin(E))*U*b,x=0}}w.xFn=function(t){return t.dx+e-(y+t.fontSize*x)*b+T*t.fontSize},w.yFn=function(t){return t.dy+m+t.fontSize*j},w.anchorFn=function(t,e){return i(e)&&90===Math.abs(e)?\"middle\":_?\"end\":\"start\"},w.heightFn=function(e,r,n){return\"right\"===t.side&&(r*=-1),r<-30?-n:r<30?-.5*n:0}}return w},H.drawTicks=function(t,e,r){r=r||{};var i=e._id+\"tick\",a=[].concat(e.minor&&e.minor.ticks?r.vals.filter((function(t){return t.minor&&!t.noTick})):[]).concat(e.ticks?r.vals.filter((function(t){return!t.minor&&!t.noTick})):[]),o=r.layer.selectAll(\"path.\"+i).data(a,kt);o.exit().remove(),o.enter().append(\"path\").classed(i,1).classed(\"ticks\",1).classed(\"crisp\",!1!==r.crisp).each((function(t){return f.stroke(n.select(this),t.minor?e.minor.tickcolor:e.tickcolor)})).style(\"stroke-width\",(function(r){return h.crispRound(t,r.minor?e.minor.tickwidth:e.tickwidth,1)+\"px\"})).attr(\"d\",r.path).style(\"display\",null),Ft(e,[R]),o.attr(\"transform\",r.transFn)},H.drawGrid=function(t,e,r){if(r=r||{},\"sync\"!==e.tickmode){var i=e._id+\"grid\",a=e.minor&&e.minor.showgrid,o=a?r.vals.filter((function(t){return t.minor})):[],s=e.showgrid?r.vals.filter((function(t){return!t.minor})):[],l=r.counterAxis;if(l&&H.shouldShowZeroLine(t,e,l))for(var u=\"array\"===e.tickmode,c=0;c=0;y--){var m=y?v:g;if(m){var x=m.selectAll(\"path.\"+i).data(y?s:o,kt);x.exit().remove(),x.enter().append(\"path\").classed(i,1).classed(\"crisp\",!1!==r.crisp),x.attr(\"transform\",r.transFn).attr(\"d\",r.path).each((function(t){return f.stroke(n.select(this),t.minor?e.minor.gridcolor:e.gridcolor||\"#ddd\")})).style(\"stroke-dasharray\",(function(t){return h.dashStyle(t.minor?e.minor.griddash:e.griddash,t.minor?e.minor.gridwidth:e.gridwidth)})).style(\"stroke-width\",(function(t){return(t.minor?d:e._gw)+\"px\"})).style(\"display\",null),\"function\"==typeof r.path&&x.attr(\"d\",r.path)}}Ft(e,[z,D])}},H.drawZeroLine=function(t,e,r){r=r||r;var n=e._id+\"zl\",i=H.shouldShowZeroLine(t,e,r.counterAxis),a=r.layer.selectAll(\"path.\"+n).data(i?[{x:0,id:e._id}]:[]);a.exit().remove(),a.enter().append(\"path\").classed(n,1).classed(\"zl\",1).classed(\"crisp\",!1!==r.crisp).each((function(){r.layer.selectAll(\"path\").sort((function(t,e){return Y(t.id,e.id)}))})),a.attr(\"transform\",r.transFn).attr(\"d\",r.path).call(f.stroke,e.zerolinecolor||f.defaultLine).style(\"stroke-width\",h.crispRound(t,e.zerolinewidth,e._gw||1)+\"px\").style(\"display\",null),Ft(e,[I])},H.drawLabels=function(t,e,r){r=r||{};var a=t._fullLayout,o=e._id,c=r.cls||o+\"tick\",f=r.vals.filter((function(t){return t.text})),p=r.labelFns,d=r.secondary?0:e.tickangle,v=(e._prevTickAngles||{})[c],g=r.layer.selectAll(\"g.\"+c).data(e.showticklabels?f:[],kt),y=[];function m(t,a){t.each((function(t){var o=n.select(this),s=o.select(\".text-math-group\"),c=p.anchorFn(t,a),f=r.transFn.call(o.node(),t)+(i(a)&&0!=+a?\" rotate(\"+a+\",\"+p.xFn(t)+\",\"+(p.yFn(t)-t.fontSize/2)+\")\":\"\"),d=u.lineCount(o),v=V*t.fontSize,g=p.heightFn(t,i(a)?+a:0,(d-1)*v);if(g&&(f+=l(0,g)),s.empty()){var y=o.select(\"text\");y.attr({transform:f,\"text-anchor\":c}),y.style(\"opacity\",1),e._adjustTickLabelsOverflow&&e._adjustTickLabelsOverflow()}else{var m=h.bBox(s.node()).width*{end:-.5,start:.5}[c];s.attr(\"transform\",f+l(m,0))}}))}g.enter().append(\"g\").classed(c,1).append(\"text\").attr(\"text-anchor\",\"middle\").each((function(e){var r=n.select(this),i=t._promises.length;r.call(u.positionText,p.xFn(e),p.yFn(e)).call(h.font,{family:e.font,size:e.fontSize,color:e.fontColor,weight:e.fontWeight,style:e.fontStyle,variant:e.fontVariant}).text(e.text).call(u.convertToTspans,t),t._promises[i]?y.push(t._promises.pop().then((function(){m(r,d)}))):m(r,d)})),Ft(e,[F]),g.exit().remove(),r.repositionOnUpdate&&g.each((function(t){n.select(this).select(\"text\").call(u.positionText,p.xFn(t),p.yFn(t))})),e._adjustTickLabelsOverflow=function(){var r=e.ticklabeloverflow;if(r&&\"allow\"!==r){var i=-1!==r.indexOf(\"hide\"),o=\"x\"===e._id.charAt(0),l=0,u=o?t._fullLayout.width:t._fullLayout.height;if(-1!==r.indexOf(\"domain\")){var c=s.simpleMap(e.range,e.r2l);l=e.l2p(c[0])+e._offset,u=e.l2p(c[1])+e._offset}var f=Math.min(l,u),p=Math.max(l,u),d=e.side,v=1/0,y=-1/0;for(var m in g.each((function(t){var r=n.select(this);if(r.select(\".text-math-group\").empty()){var a=h.bBox(r.node()),s=0;o?(a.right>p||a.leftp||a.top+(e.tickangle?0:t.fontSize/4)e[\"_visibleLabelMin_\"+r._id]?l.style(\"display\",\"none\"):\"tick\"!==t.K||i||l.style(\"display\",null)}))}))}))}))},m(g,v+1?v:d);var x=null;e._selections&&(e._selections[c]=g);var b=[function(){return y.length&&Promise.all(y)}];e.automargin&&a._redrawFromAutoMarginCount&&90===v?(x=v,b.push((function(){m(g,v)}))):b.push((function(){if(m(g,d),f.length&&e.autotickangles&&(\"log\"!==e.type||\"D\"!==String(e.dtick).charAt(0))){x=e.autotickangles[0];var t,n=0,i=[],a=1;g.each((function(t){n=Math.max(n,t.fontSize);var r=e.l2p(t.x),o=St(this),s=h.bBox(o.node());a=Math.max(a,u.lineCount(o)),i.push({top:0,bottom:10,height:10,left:r-s.width/2,right:r+s.width/2+2,width:s.width+2})}));var o=(\"boundaries\"===e.tickson||e.showdividers)&&!r.secondary,l=f.length,c=Math.abs((f[l-1].x-f[0].x)*e._m)/(l-1),p=o?c/2:c,v=o?e.ticklen:1.25*n*a,y=p/Math.sqrt(Math.pow(p,2)+Math.pow(v,2)),b=e.autotickangles.map((function(t){return t*Math.PI/180})),_=b.find((function(t){return Math.abs(Math.cos(t))<=y}));void 0===_&&(_=b.reduce((function(t,e){return Math.abs(Math.cos(t))j*N&&(P=N,E[S]=L[S]=O[S])}var U=Math.abs(P-C);U-k>0?k*=1+k/(U-=k):k=0,\"y\"!==e._id.charAt(0)&&(k=-k),E[M]=w.p2r(w.r2p(L[M])+A*k),\"min\"===w.autorange||\"max reversed\"===w.autorange?(E[0]=null,w._rangeInitial0=void 0,w._rangeInitial1=void 0):\"max\"!==w.autorange&&\"min reversed\"!==w.autorange||(E[1]=null,w._rangeInitial0=void 0,w._rangeInitial1=void 0),a._insideTickLabelsUpdaterange[w._name+\".range\"]=E}var q=s.syncOrAsync(b);return q&&q.then&&t._promises.push(q),q},H.getPxPosition=function(t,e){var r,n=t._fullLayout._size,i=e._id.charAt(0),a=e.side;return\"free\"!==e.anchor?r=e._anchorAxis:\"x\"===i?r={_offset:n.t+(1-(e.position||0))*n.h,_length:0}:\"y\"===i&&(r={_offset:n.l+(e.position||0)*n.w+e._shift,_length:0}),\"top\"===a||\"left\"===a?r._offset:\"bottom\"===a||\"right\"===a?r._offset+r._length:void 0},H.shouldShowZeroLine=function(t,e,r){var n=s.simpleMap(e.range,e.r2l);return n[0]*n[1]<=0&&e.zeroline&&(\"linear\"===e.type||\"-\"===e.type)&&!(e.rangebreaks&&e.maskBreaks(0)===O)&&(Mt(e,0)||!function(t,e,r,n){var i=r._mainAxis;if(i){var a=t._fullLayout,o=e._id.charAt(0),s=H.counterLetter(e._id),l=e._offset+(Math.abs(n[0])1)for(n=1;n2*o}(i,e))return\"date\";var g=\"strict\"!==r.autotypenumbers;return function(t,e){for(var r=t.length,n=f(r),i=0,o=0,s={},c=0;c2*i}(i,g)?\"category\":function(t,e){for(var r=t.length,n=0;n=2){var s,u,c=\"\";if(2===o.length)for(s=0;s<2;s++)if(u=_(o[s])){c=y;break}var f=i(\"pattern\",c);if(f===y)for(s=0;s<2;s++)(u=_(o[s]))&&(e.bounds[s]=o[s]=u-1);if(f)for(s=0;s<2;s++)switch(u=o[s],f){case y:if(!n(u))return void(e.enabled=!1);if((u=+u)!==Math.floor(u)||u<0||u>=7)return void(e.enabled=!1);e.bounds[s]=o[s]=u;break;case m:if(!n(u))return void(e.enabled=!1);if((u=+u)<0||u>24)return void(e.enabled=!1);e.bounds[s]=o[s]=u}if(!1===r.autorange){var h=r.range;if(h[0]h[1])return void(e.enabled=!1)}else if(o[0]>h[0]&&o[1]n?1:-1:+(t.substr(1)||1)-+(e.substr(1)||1)},e.ref2id=function(t){return!!/^[xyz]/.test(t)&&t.split(\" \")[0]},e.isLinked=function(t,e){return a(e,t._axisMatchGroups)||a(e,t._axisConstraintGroups)}},22416:function(t,e,r){\"use strict\";var n=r(38116).isTypedArraySpec;t.exports=function(t,e,r,i){if(\"category\"===e.type){var a,o=t.categoryarray,s=Array.isArray(o)&&o.length>0||n(o);s&&(a=\"array\");var l,u=r(\"categoryorder\",a);\"array\"===u&&(l=r(\"categoryarray\")),s||\"array\"!==u||(u=e.categoryorder=\"trace\"),\"trace\"===u?e._initialCategories=[]:\"array\"===u?e._initialCategories=l.slice():(l=function(t,e){var r,n,i,a=e.dataAttr||t._id.charAt(0),o={};if(e.axData)r=e.axData;else for(r=[],n=0;nn?i.substr(n):a.substr(r))+o:i+a+t*e:o}function g(t,e){for(var r=e._size,n=r.h/r.w,i={},a=Object.keys(t),o=0;ou*x)||T)for(r=0;rI&&FP&&(P=F);h/=(P-C)/(2*O),C=l.l2r(C),P=l.l2r(P),l.range=l._input.range=S=0?Math.min(t,.9):1/(1/Math.max(t,-.3)+3.222))}function N(t,e,r,n,i){return t.append(\"path\").attr(\"class\",\"zoombox\").style({fill:e>.2?\"rgba(0,0,0,0)\":\"rgba(255,255,255,0)\",\"stroke-width\":0}).attr(\"transform\",u(r,n)).attr(\"d\",i+\"Z\")}function j(t,e,r){return t.append(\"path\").attr(\"class\",\"zoombox-corners\").style({fill:f.background,stroke:f.defaultLine,\"stroke-width\":1,opacity:0}).attr(\"transform\",u(e,r)).attr(\"d\",\"M0,0Z\")}function U(t,e,r,n,i,a){t.attr(\"d\",n+\"M\"+r.l+\",\"+r.t+\"v\"+r.h+\"h\"+r.w+\"v-\"+r.h+\"h-\"+r.w+\"Z\"),V(t,e,i,a)}function V(t,e,r,n){r||(t.transition().style(\"fill\",n>.2?\"rgba(0,0,0,0.4)\":\"rgba(255,255,255,0.3)\").duration(200),e.transition().style(\"opacity\",1).duration(200))}function q(t){n.select(t).selectAll(\".zoombox,.js-zoombox-backdrop,.js-zoombox-menu,.zoombox-corners\").remove()}function H(t){O&&t.data&&t._context.showTips&&(i.notifier(i._(t,\"Double-click to zoom back out\"),\"long\"),O=!1)}function G(t){var e=Math.floor(Math.min(t.b-t.t,t.r-t.l,P)/2);return\"M\"+(t.l-3.5)+\",\"+(t.t-.5+e)+\"h3v\"+-e+\"h\"+e+\"v-3h-\"+(e+3)+\"ZM\"+(t.r+3.5)+\",\"+(t.t-.5+e)+\"h-3v\"+-e+\"h\"+-e+\"v-3h\"+(e+3)+\"ZM\"+(t.r+3.5)+\",\"+(t.b+.5-e)+\"h-3v\"+e+\"h\"+-e+\"v3h\"+(e+3)+\"ZM\"+(t.l-3.5)+\",\"+(t.b+.5-e)+\"h3v\"+e+\"h\"+e+\"v3h-\"+(e+3)+\"Z\"}function W(t,e,r,n,a){for(var o,s,l,u,c=!1,f={},h={},p=(a||{}).xaHash,d=(a||{}).yaHash,v=0;v=0)i._fullLayout._deactivateShape(i);else{var o=i._fullLayout.clickmode;if(q(i),2!==t||yt||Ht(),gt)o.indexOf(\"select\")>-1&&S(r,i,K,J,e.id,Pt),o.indexOf(\"event\")>-1&&p.click(i,r,e.id);else if(1===t&&yt){var s=v?I:O,u=\"s\"===v||\"w\"===y?0:1,f=s._name+\".range[\"+u+\"]\",h=function(t,e){var r,n=t.range[e],i=Math.abs(n-t.range[1-e]);return\"date\"===t.type?n:\"log\"===t.type?(r=Math.ceil(Math.max(0,-Math.log(i)/Math.LN10))+3,a(\".\"+r+\"g\")(Math.pow(10,n))):(r=Math.floor(Math.log(Math.abs(n))/Math.LN10)-Math.floor(Math.log(i)/Math.LN10)+4,a(\".\"+String(r)+\"g\")(n))}(s,u),d=\"left\",g=\"middle\";if(s.fixedrange)return;v?(g=\"n\"===v?\"top\":\"bottom\",\"right\"===s.side&&(d=\"right\")):\"e\"===y&&(d=\"right\"),i._context.showAxisRangeEntryBoxes&&n.select(bt).call(c.makeEditable,{gd:i,immediate:!0,background:i._fullLayout.paper_bgcolor,text:String(h),fill:s.tickfont?s.tickfont.color:\"#444\",horizontalAlign:d,verticalAlign:g}).on(\"edit\",(function(t){var e=s.d2r(t);void 0!==e&&l.call(\"_guiRelayout\",i,f,e)}))}}}function zt(e,r){if(t._transitioningWithDuration)return!1;var n=Math.max(0,Math.min(tt,pt*e+_t)),i=Math.max(0,Math.min(et,dt*r+wt)),a=Math.abs(n-_t),o=Math.abs(i-wt);function s(){St=\"\",Tt.r=Tt.l,Tt.t=Tt.b,Lt.attr(\"d\",\"M0,0Z\")}if(Tt.l=Math.min(_t,n),Tt.r=Math.max(_t,n),Tt.t=Math.min(wt,i),Tt.b=Math.max(wt,i),rt.isSubplotConstrained)a>P||o>P?(St=\"xy\",a/tt>o/et?(o=a*et/tt,wt>i?Tt.t=wt-o:Tt.b=wt+o):(a=o*tt/et,_t>n?Tt.l=_t-a:Tt.r=_t+a),Lt.attr(\"d\",G(Tt))):s();else if(nt.isSubplotConstrained)if(a>P||o>P){St=\"xy\";var l=Math.min(Tt.l/tt,(et-Tt.b)/et),u=Math.max(Tt.r/tt,(et-Tt.t)/et);Tt.l=l*tt,Tt.r=u*tt,Tt.b=(1-l)*et,Tt.t=(1-u)*et,Lt.attr(\"d\",G(Tt))}else s();else!at||o0){var c;if(nt.isSubplotConstrained||!it&&1===at.length){for(c=0;c1&&(void 0!==a.maxallowed&&st===(a.range[0]1&&(void 0!==o.maxallowed&<===(o.range[0]b[1]-1/4096&&(e.domain=s),i.noneOrAll(t.domain,e.domain,s),\"sync\"===e.tickmode&&(e.tickmode=\"auto\")}return r(\"layer\"),e}},42568:function(t,e,r){\"use strict\";var n=r(85024);t.exports=function(t,e,r,i,a){a||(a={});var o=a.tickSuffixDflt,s=n(t);r(\"tickprefix\")&&r(\"showtickprefix\",s),r(\"ticksuffix\",o)&&r(\"showticksuffix\",s)}},96312:function(t,e,r){\"use strict\";var n=r(76808);t.exports=function(t,e,r,i){var a=e._template||{},o=e.type||a.type||\"-\";r(\"minallowed\"),r(\"maxallowed\");var s,l=r(\"range\");l||i.noInsiderange||\"log\"===o||(!(s=r(\"insiderange\"))||null!==s[0]&&null!==s[1]||(e.insiderange=!1,s=void 0),s&&(l=r(\"range\",s)));var u,c=e.getAutorangeDflt(l,i),f=r(\"autorange\",c);!l||(null!==l[0]||null!==l[1])&&(null!==l[0]&&null!==l[1]||\"reversed\"!==f&&!0!==f)&&(null===l[0]||\"min\"!==f&&\"max reversed\"!==f)&&(null===l[1]||\"max\"!==f&&\"min reversed\"!==f)||(l=void 0,delete e.range,e.autorange=!0,u=!0),u||(f=r(\"autorange\",c=e.getAutorangeDflt(l,i))),f&&(n(r,f,l),\"linear\"!==o&&\"-\"!==o||r(\"rangemode\")),e.cleanRange()}},21160:function(t,e,r){\"use strict\";var n=r(84284).FROM_BL;t.exports=function(t,e,r){void 0===r&&(r=n[t.constraintoward||\"center\"]);var i=[t.r2l(t.range[0]),t.r2l(t.range[1])],a=i[0]+(i[1]-i[0])*r;t.range=t._input.range=[t.l2r(a+(i[0]-a)*e),t.l2r(a+(i[1]-a)*e)],t.setScale()}},78344:function(t,e,r){\"use strict\";var n=r(33428),i=r(94336).E9,a=r(3400),o=a.numberFormat,s=r(38248),l=a.cleanNumber,u=a.ms2DateTime,c=a.dateTime2ms,f=a.ensureNumber,h=a.isArrayOrTypedArray,p=r(39032),d=p.FP_SAFE,v=p.BADNUM,g=p.LOG_CLIP,y=p.ONEWEEK,m=p.ONEDAY,x=p.ONEHOUR,b=p.ONEMIN,_=p.ONESEC,w=r(79811),T=r(33816),k=T.HOUR_PATTERN,A=T.WEEKDAY_PATTERN;function M(t){return Math.pow(10,t)}function S(t){return null!=t}t.exports=function(t,e){e=e||{};var r=t._id||\"x\",p=r.charAt(0);function E(e,r){if(e>0)return Math.log(e)/Math.LN10;if(e<=0&&r&&t.range&&2===t.range.length){var n=t.range[0],i=t.range[1];return.5*(n+i-2*g*Math.abs(n-i))}return v}function L(e,r,n,i){if((i||{}).msUTC&&s(e))return+e;var o=c(e,n||t.calendar);if(o===v){if(!s(e))return v;e=+e;var l=Math.floor(10*a.mod(e+.05,1)),u=Math.round(e-l/10);o=c(new Date(u))+l/10}return o}function C(e,r,n){return u(e,r,n||t.calendar)}function P(e){return t._categories[Math.round(e)]}function O(e){if(S(e)){if(void 0===t._categoriesMap&&(t._categoriesMap={}),void 0!==t._categoriesMap[e])return t._categoriesMap[e];t._categories.push(\"number\"==typeof e?String(e):e);var r=t._categories.length-1;return t._categoriesMap[e]=r,r}return v}function I(e){if(t._categoriesMap)return t._categoriesMap[e]}function z(t){var e=I(t);return void 0!==e?e:s(t)?+t:void 0}function D(t){return s(t)?+t:I(t)}function R(t,e,r){return n.round(r+e*t,2)}function F(t,e,r){return(t-r)/e}var B=function(e){return s(e)?R(e,t._m,t._b):v},N=function(e){return F(e,t._m,t._b)};if(t.rangebreaks){var j=\"y\"===p;B=function(e){if(!s(e))return v;var r=t._rangebreaks.length;if(!r)return R(e,t._m,t._b);var n=j;t.range[0]>t.range[1]&&(n=!n);for(var i=n?-1:1,a=i*e,o=0,l=0;lc)){o=a<(u+c)/2?l:l+1;break}o=l+1}var f=t._B[o]||0;return isFinite(f)?R(e,t._m2,f):0},N=function(e){var r=t._rangebreaks.length;if(!r)return F(e,t._m,t._b);for(var n=0,i=0;it._rangebreaks[i].pmax&&(n=i+1);return F(e,t._m2,t._B[n])}}t.c2l=\"log\"===t.type?E:f,t.l2c=\"log\"===t.type?M:f,t.l2p=B,t.p2l=N,t.c2p=\"log\"===t.type?function(t,e){return B(E(t,e))}:B,t.p2c=\"log\"===t.type?function(t){return M(N(t))}:N,-1!==[\"linear\",\"-\"].indexOf(t.type)?(t.d2r=t.r2d=t.d2c=t.r2c=t.d2l=t.r2l=l,t.c2d=t.c2r=t.l2d=t.l2r=f,t.d2p=t.r2p=function(e){return t.l2p(l(e))},t.p2d=t.p2r=N,t.cleanPos=f):\"log\"===t.type?(t.d2r=t.d2l=function(t,e){return E(l(t),e)},t.r2d=t.r2c=function(t){return M(l(t))},t.d2c=t.r2l=l,t.c2d=t.l2r=f,t.c2r=E,t.l2d=M,t.d2p=function(e,r){return t.l2p(t.d2r(e,r))},t.p2d=function(t){return M(N(t))},t.r2p=function(e){return t.l2p(l(e))},t.p2r=N,t.cleanPos=f):\"date\"===t.type?(t.d2r=t.r2d=a.identity,t.d2c=t.r2c=t.d2l=t.r2l=L,t.c2d=t.c2r=t.l2d=t.l2r=C,t.d2p=t.r2p=function(e,r,n){return t.l2p(L(e,0,n))},t.p2d=t.p2r=function(t,e,r){return C(N(t),e,r)},t.cleanPos=function(e){return a.cleanDate(e,v,t.calendar)}):\"category\"===t.type?(t.d2c=t.d2l=O,t.r2d=t.c2d=t.l2d=P,t.d2r=t.d2l_noadd=z,t.r2c=function(e){var r=D(e);return void 0!==r?r:t.fraction2r(.5)},t.l2r=t.c2r=f,t.r2l=D,t.d2p=function(e){return t.l2p(t.r2c(e))},t.p2d=function(t){return P(N(t))},t.r2p=t.d2p,t.p2r=N,t.cleanPos=function(t){return\"string\"==typeof t&&\"\"!==t?t:f(t)}):\"multicategory\"===t.type&&(t.r2d=t.c2d=t.l2d=P,t.d2r=t.d2l_noadd=z,t.r2c=function(e){var r=z(e);return void 0!==r?r:t.fraction2r(.5)},t.r2c_just_indices=I,t.l2r=t.c2r=f,t.r2l=z,t.d2p=function(e){return t.l2p(t.r2c(e))},t.p2d=function(t){return P(N(t))},t.r2p=t.d2p,t.p2r=N,t.cleanPos=function(t){return Array.isArray(t)||\"string\"==typeof t&&\"\"!==t?t:f(t)},t.setupMultiCategory=function(n){var i,o,s=t._traceIndices,l=t._matchGroup;if(l&&0===t._categories.length)for(var u in l)if(u!==r){var c=e[w.id2name(u)];s=s.concat(c._traceIndices)}var f=[[0,{}],[0,{}]],d=[];for(i=0;il[1]&&(i[s?0:1]=n),i[0]===i[1]){var u=t.l2r(r),c=t.l2r(n);if(void 0!==r){var f=u+1;void 0!==n&&(f=Math.min(f,c)),i[s?1:0]=f}if(void 0!==n){var h=c+1;void 0!==r&&(h=Math.max(h,u)),i[s?0:1]=h}}}},t.cleanRange=function(e,r){t._cleanRange(e,r),t.limitRange(e)},t._cleanRange=function(e,r){r||(r={}),e||(e=\"range\");var n,i,o=a.nestedProperty(t,e).get();if(i=(i=\"date\"===t.type?a.dfltRange(t.calendar):\"y\"===p?T.DFLTRANGEY:\"realaxis\"===t._name?[0,1]:r.dfltRange||T.DFLTRANGEX).slice(),\"tozero\"!==t.rangemode&&\"nonnegative\"!==t.rangemode||(i[0]=0),o&&2===o.length){var l=null===o[0],u=null===o[1];for(\"date\"!==t.type||t.autorange||(o[0]=a.cleanDate(o[0],v,t.calendar),o[1]=a.cleanDate(o[1],v,t.calendar)),n=0;n<2;n++)if(\"date\"===t.type){if(!a.isDateTime(o[n],t.calendar)){t[e]=i;break}if(t.r2l(o[0])===t.r2l(o[1])){var c=a.constrain(t.r2l(o[0]),a.MIN_MS+1e3,a.MAX_MS-1e3);o[0]=t.l2r(c-1e3),o[1]=t.l2r(c+1e3);break}}else{if(!s(o[n])){if(l||u||!s(o[1-n])){t[e]=i;break}o[n]=o[1-n]*(n?10:.1)}if(o[n]<-d?o[n]=-d:o[n]>d&&(o[n]=d),o[0]===o[1]){var f=Math.max(1,Math.abs(1e-6*o[0]));o[0]-=f,o[1]+=f}}}else a.nestedProperty(t,e).set(i)},t.setScale=function(r){var n=e._size;if(t.overlaying){var i=w.getFromId({_fullLayout:e},t.overlaying);t.domain=i.domain}var a=r&&t._r?\"_r\":\"range\",o=t.calendar;t.cleanRange(a);var s,l,u=t.r2l(t[a][0],o),c=t.r2l(t[a][1],o),f=\"y\"===p;if(f?(t._offset=n.t+(1-t.domain[1])*n.h,t._length=n.h*(t.domain[1]-t.domain[0]),t._m=t._length/(u-c),t._b=-t._m*c):(t._offset=n.l+t.domain[0]*n.w,t._length=n.w*(t.domain[1]-t.domain[0]),t._m=t._length/(c-u),t._b=-t._m*u),t._rangebreaks=[],t._lBreaks=0,t._m2=0,t._B=[],t.rangebreaks&&(t._rangebreaks=t.locateBreaks(Math.min(u,c),Math.max(u,c)),t._rangebreaks.length)){for(s=0;sc&&(h=!h),h&&t._rangebreaks.reverse();var d=h?-1:1;for(t._m2=d*t._length/(Math.abs(c-u)-t._lBreaks),t._B.push(-t._m2*(f?c:u)),s=0;si&&(i+=7,oi&&(i+=24,o=n&&o=n&&e=s.min&&(ts.max&&(s.max=n),i=!1)}i&&u.push({min:t,max:n})}};for(n=0;nr.duration?(function(){for(var r={},n=0;n rect\").call(o.setTranslate,0,0).call(o.setScale,1,1),t.plot.call(o.setTranslate,e._offset,r._offset).call(o.setScale,1,1);var n=t.plot.selectAll(\".scatterlayer .trace\");n.selectAll(\".point\").call(o.setPointGroupScale,1,1),n.selectAll(\".textpoint\").call(o.setTextPointsScale,1,1),n.call(o.hideOutsideRangePoints,t)}function g(e,r){var n=e.plotinfo,i=n.xaxis,l=n.yaxis,u=i._length,c=l._length,f=!!e.xr1,h=!!e.yr1,p=[];if(f){var d=a.simpleMap(e.xr0,i.r2l),v=a.simpleMap(e.xr1,i.r2l),g=d[1]-d[0],y=v[1]-v[0];p[0]=(d[0]*(1-r)+r*v[0]-d[0])/(d[1]-d[0])*u,p[2]=u*(1-r+r*y/g),i.range[0]=i.l2r(d[0]*(1-r)+r*v[0]),i.range[1]=i.l2r(d[1]*(1-r)+r*v[1])}else p[0]=0,p[2]=u;if(h){var m=a.simpleMap(e.yr0,l.r2l),x=a.simpleMap(e.yr1,l.r2l),b=m[1]-m[0],_=x[1]-x[0];p[1]=(m[1]*(1-r)+r*x[1]-m[1])/(m[0]-m[1])*c,p[3]=c*(1-r+r*_/b),l.range[0]=i.l2r(m[0]*(1-r)+r*x[0]),l.range[1]=l.l2r(m[1]*(1-r)+r*x[1])}else p[1]=0,p[3]=c;s.drawOne(t,i,{skipTitle:!0}),s.drawOne(t,l,{skipTitle:!0}),s.redrawComponents(t,[i._id,l._id]);var w=f?u/p[2]:1,T=h?c/p[3]:1,k=f?p[0]:0,A=h?p[1]:0,M=f?p[0]/p[2]*u:0,S=h?p[1]/p[3]*c:0,E=i._offset-M,L=l._offset-S;n.clipRect.call(o.setTranslate,k,A).call(o.setScale,1/w,1/T),n.plot.call(o.setTranslate,E,L).call(o.setScale,w,T),o.setPointGroupScale(n.zoomScalePts,1/w,1/T),o.setTextPointsScale(n.zoomScaleTxt,1/w,1/T)}s.redrawComponents(t)}},14944:function(t,e,r){\"use strict\";var n=r(24040).traceIs,i=r(52976);function a(t){return{v:\"x\",h:\"y\"}[t.orientation||\"v\"]}function o(t,e){var r=a(t),i=n(t,\"box-violin\"),o=n(t._fullInput||{},\"candlestick\");return i&&!o&&e===r&&void 0===t[r]&&void 0===t[r+\"0\"]}t.exports=function(t,e,r,s){r(\"autotypenumbers\",s.autotypenumbersDflt),\"-\"===r(\"type\",(s.splomStash||{}).type)&&(function(t,e){if(\"-\"===t.type){var r,s=t._id,l=s.charAt(0);-1!==s.indexOf(\"scene\")&&(s=l);var u=function(t,e,r){for(var n=0;n0&&(i[\"_\"+r+\"axes\"]||{})[e])return i;if((i[r+\"axis\"]||r)===e){if(o(i,r))return i;if((i[r]||[]).length||i[r+\"0\"])return i}}}(e,s,l);if(u)if(\"histogram\"!==u.type||l!=={v:\"y\",h:\"x\"}[u.orientation||\"v\"]){var c=l+\"calendar\",f=u[c],h={noMultiCategory:!n(u,\"cartesian\")||n(u,\"noMultiCategory\")};if(\"box\"===u.type&&u._hasPreCompStats&&l==={h:\"x\",v:\"y\"}[u.orientation||\"v\"]&&(h.noMultiCategory=!0),h.autotypenumbers=t.autotypenumbers,o(u,l)){var p=a(u),d=[];for(r=0;r0?\".\":\"\")+a;i.isPlainObject(o)?l(o,e,s,n+1):e(s,a,o)}}))}e.manageCommandObserver=function(t,r,n,o){var s={},l=!0;r&&r._commandObserver&&(s=r._commandObserver),s.cache||(s.cache={}),s.lookupTable={};var u=e.hasSimpleAPICommandBindings(t,n,s.lookupTable);if(r&&r._commandObserver){if(u)return s;if(r._commandObserver.remove)return r._commandObserver.remove(),r._commandObserver=null,s}if(u){a(t,u,s.cache),s.check=function(){if(l){var e=a(t,u,s.cache);return e.changed&&o&&void 0!==s.lookupTable[e.value]&&(s.disable(),Promise.resolve(o({value:e.value,type:u.type,prop:u.prop,traces:u.traces,index:s.lookupTable[e.value]})).then(s.enable,s.enable)),e.changed}};for(var c=[\"plotly_relayout\",\"plotly_redraw\",\"plotly_restyle\",\"plotly_update\",\"plotly_animatingframe\",\"plotly_afterplot\"],f=0;f0&&i<0&&(i+=360);var s=(i-n)/4;return{type:\"Polygon\",coordinates:[[[n,a],[n,o],[n+s,o],[n+2*s,o],[n+3*s,o],[i,o],[i,a],[i-s,a],[i-2*s,a],[i-3*s,a],[n,a]]]}}t.exports=function(t){return new M(t)},S.plot=function(t,e,r,n){var i=this;if(n)return i.update(t,e,!0);i._geoCalcData=t,i._fullLayout=e;var a=e[this.id],o=[],s=!1;for(var l in w.layerNameToAdjective)if(\"frame\"!==l&&a[\"show\"+l]){s=!0;break}for(var u=!1,c=0;c0&&o._module.calcGeoJSON(a,e)}if(!r){if(this.updateProjection(t,e))return;this.viewInitial&&this.scope===n.scope||this.saveViewInitial(n)}this.scope=n.scope,this.updateBaseLayers(e,n),this.updateDims(e,n),this.updateFx(e,n),d.generalUpdatePerTraceModule(this.graphDiv,this,t,n);var s=this.layers.frontplot.select(\".scatterlayer\");this.dataPoints.point=s.selectAll(\".point\"),this.dataPoints.text=s.selectAll(\"text\"),this.dataPaths.line=s.selectAll(\".js-line\");var l=this.layers.backplot.select(\".choroplethlayer\");this.dataPaths.choropleth=l.selectAll(\"path\"),this._render()},S.updateProjection=function(t,e){var r=this.graphDiv,n=e[this.id],l=e._size,c=n.domain,f=n.projection,h=n.lonaxis,p=n.lataxis,d=h._ax,v=p._ax,y=this.projection=function(t){var e=t.projection,r=e.type,n=w.projNames[r];n=\"geo\"+u.titleCase(n);for(var l=(i[n]||s[n])(),c=t._isSatellite?180*Math.acos(1/e.distance)/Math.PI:t._isClipped?w.lonaxisSpan[r]/2:null,f=[\"center\",\"rotate\",\"parallels\",\"clipExtent\"],h=function(t){return t?l:[]},p=0;pc*Math.PI/180}return!1},l.getPath=function(){return a().projection(l)},l.getBounds=function(t){return l.getPath().bounds(t)},l.precision(w.precision),t._isSatellite&&l.tilt(e.tilt).distance(e.distance),c&&l.clipAngle(c-w.clipPad),l}(n),m=[[l.l+l.w*c.x[0],l.t+l.h*(1-c.y[1])],[l.l+l.w*c.x[1],l.t+l.h*(1-c.y[0])]],x=n.center||{},b=f.rotation||{},_=h.range||[],T=p.range||[];if(n.fitbounds){d._length=m[1][0]-m[0][0],v._length=m[1][1]-m[0][1],d.range=g(r,d),v.range=g(r,v);var k=(d.range[0]+d.range[1])/2,A=(v.range[0]+v.range[1])/2;if(n._isScoped)x={lon:k,lat:A};else if(n._isClipped){x={lon:k,lat:A},b={lon:k,lat:A,roll:b.roll};var M=f.type,S=w.lonaxisSpan[M]/2||180,L=w.lataxisSpan[M]/2||90;_=[k-S,k+S],T=[A-L,A+L]}else x={lon:k,lat:A},b={lon:k,lat:b.lat,roll:b.roll}}y.center([x.lon-b.lon,x.lat-b.lat]).rotate([-b.lon,-b.lat,b.roll]).parallels(f.parallels);var C=E(_,T);y.fitExtent(m,C);var P=this.bounds=y.getBounds(C),O=this.fitScale=y.scale(),I=y.translate();if(n.fitbounds){var z=y.getBounds(E(d.range,v.range)),D=Math.min((P[1][0]-P[0][0])/(z[1][0]-z[0][0]),(P[1][1]-P[0][1])/(z[1][1]-z[0][1]));isFinite(D)?y.scale(D*O):u.warn(\"Something went wrong during\"+this.id+\"fitbounds computations.\")}else y.scale(f.scale*O);var R=this.midPt=[(P[0][0]+P[1][0])/2,(P[0][1]+P[1][1])/2];if(y.translate([I[0]+(R[0]-I[0]),I[1]+(R[1]-I[1])]).clipExtent(P),n._isAlbersUsa){var F=y([x.lon,x.lat]),B=y.translate();y.translate([B[0]-(F[0]-B[0]),B[1]-(F[1]-B[1])])}},S.updateBaseLayers=function(t,e){var r=this,i=r.topojson,a=r.layers,o=r.basePaths;function s(t){return\"lonaxis\"===t||\"lataxis\"===t}function l(t){return Boolean(w.lineLayers[t])}function u(t){return Boolean(w.fillLayers[t])}var c=(this.hasChoropleth?w.layersForChoropleth:w.layers).filter((function(t){return l(t)||u(t)?e[\"show\"+t]:!s(t)||e[t].showgrid})),p=r.framework.selectAll(\".layer\").data(c,String);p.exit().each((function(t){delete a[t],delete o[t],n.select(this).remove()})),p.enter().append(\"g\").attr(\"class\",(function(t){return\"layer \"+t})).each((function(t){var e=a[t]=n.select(this);\"bg\"===t?r.bgRect=e.append(\"rect\").style(\"pointer-events\",\"all\"):s(t)?o[t]=e.append(\"path\").style(\"fill\",\"none\"):\"backplot\"===t?e.append(\"g\").classed(\"choroplethlayer\",!0):\"frontplot\"===t?e.append(\"g\").classed(\"scatterlayer\",!0):l(t)?o[t]=e.append(\"path\").style(\"fill\",\"none\").style(\"stroke-miterlimit\",2):u(t)&&(o[t]=e.append(\"path\").style(\"stroke\",\"none\"))})),p.order(),p.each((function(r){var n=o[r],a=w.layerNameToAdjective[r];\"frame\"===r?n.datum(w.sphereSVG):l(r)||u(r)?n.datum(A(i,i.objects[r])):s(r)&&n.datum(function(t,e,r){var n,i,a,o=e[t],s=w.scopeDefaults[e.scope];\"lonaxis\"===t?(n=s.lonaxisRange,i=s.lataxisRange,a=function(t,e){return[t,e]}):\"lataxis\"===t&&(n=s.lataxisRange,i=s.lonaxisRange,a=function(t,e){return[e,t]});var l={type:\"linear\",range:[n[0],n[1]-1e-6],tick0:o.tick0,dtick:o.dtick};v.setConvert(l,r);var u=v.calcTicks(l);e.isScoped||\"lonaxis\"!==t||u.pop();for(var c=u.length,f=new Array(c),h=0;h-1&&b(n.event,i,[r.xaxis],[r.yaxis],r.id,c),s.indexOf(\"event\")>-1&&p.click(i,n.event))}))}function f(t){return r.projection.invert([t[0]+r.xaxis._offset,t[1]+r.yaxis._offset])}},S.makeFramework=function(){var t=this,e=t.graphDiv,r=e._fullLayout,i=\"clip\"+r._uid+t.id;t.clipDef=r._clips.append(\"clipPath\").attr(\"id\",i),t.clipRect=t.clipDef.append(\"rect\"),t.framework=n.select(t.container).append(\"g\").attr(\"class\",\"geo \"+t.id).call(h.setClipUrl,i,e),t.project=function(e){var r=t.projection(e);return r?[r[0]-t.xaxis._offset,r[1]-t.yaxis._offset]:[null,null]},t.xaxis={_id:\"x\",c2p:function(e){return t.project(e)[0]}},t.yaxis={_id:\"y\",c2p:function(e){return t.project(e)[1]}},t.mockAxis={type:\"linear\",showexponent:\"all\",exponentformat:\"B\"},v.setConvert(t.mockAxis,r)},S.saveViewInitial=function(t){var e,r=t.center||{},n=t.projection,i=n.rotation||{};this.viewInitial={fitbounds:t.fitbounds,\"projection.scale\":n.scale},e=t._isScoped?{\"center.lon\":r.lon,\"center.lat\":r.lat}:t._isClipped?{\"projection.rotation.lon\":i.lon,\"projection.rotation.lat\":i.lat}:{\"center.lon\":r.lon,\"center.lat\":r.lat,\"projection.rotation.lon\":i.lon},u.extendFlat(this.viewInitial,e)},S.render=function(t){this._hasMarkerAngles&&t?this.plot(this._geoCalcData,this._fullLayout,[],!0):this._render()},S._render=function(){var t,e=this.projection,r=e.getPath();function n(t){var r=e(t.lonlat);return r?c(r[0],r[1]):null}function i(t){return e.isLonLatOverEdges(t.lonlat)?\"none\":null}for(t in this.basePaths)this.basePaths[t].attr(\"d\",r);for(t in this.dataPaths)this.dataPaths[t].attr(\"d\",(function(t){return r(t.geojson)}));for(t in this.dataPoints)this.dataPoints[t].attr(\"display\",i).attr(\"transform\",n)}},10816:function(t,e,r){\"use strict\";var n=r(84888).KY,i=r(3400).counterRegex,a=r(43520),o=\"geo\",s=i(o),l={};l[o]={valType:\"subplotid\",dflt:o,editType:\"calc\"},t.exports={attr:o,name:o,idRoot:o,idRegex:s,attrRegex:s,attributes:l,layoutAttributes:r(40384),supplyLayoutDefaults:r(86920),plot:function(t){for(var e=t._fullLayout,r=t.calcdata,i=e._subplots[o],s=0;s0&&P<0&&(P+=360);var O,I,z,D=(C+P)/2;if(!p){var R=d?f.projRotate:[D,0,0];O=r(\"projection.rotation.lon\",R[0]),r(\"projection.rotation.lat\",R[1]),r(\"projection.rotation.roll\",R[2]),r(\"showcoastlines\",!d&&x)&&(r(\"coastlinecolor\"),r(\"coastlinewidth\")),r(\"showocean\",!!x&&void 0)&&r(\"oceancolor\")}p?(I=-96.6,z=38.7):(I=d?D:O,z=(L[0]+L[1])/2),r(\"center.lon\",I),r(\"center.lat\",z),v&&(r(\"projection.tilt\"),r(\"projection.distance\")),g&&r(\"projection.parallels\",f.projParallels||[0,60]),r(\"projection.scale\"),r(\"showland\",!!x&&void 0)&&r(\"landcolor\"),r(\"showlakes\",!!x&&void 0)&&r(\"lakecolor\"),r(\"showrivers\",!!x&&void 0)&&(r(\"rivercolor\"),r(\"riverwidth\")),r(\"showcountries\",d&&\"usa\"!==c&&x)&&(r(\"countrycolor\"),r(\"countrywidth\")),(\"usa\"===c||\"north america\"===c&&50===u)&&(r(\"showsubunits\",x),r(\"subunitcolor\"),r(\"subunitwidth\")),d||r(\"showframe\",x)&&(r(\"framecolor\"),r(\"framewidth\")),r(\"bgcolor\"),r(\"fitbounds\")&&(delete e.projection.scale,d?(delete e.center.lon,delete e.center.lat):y?(delete e.center.lon,delete e.center.lat,delete e.projection.rotation.lon,delete e.projection.rotation.lat,delete e.lonaxis.range,delete e.lataxis.range):(delete e.center.lon,delete e.center.lat,delete e.projection.rotation.lon))}t.exports=function(t,e,r){i(t,e,r,{type:\"geo\",attributes:s,handleDefaults:u,fullData:r,partition:\"y\"})}},79248:function(t,e,r){\"use strict\";var n=r(33428),i=r(3400),a=r(24040),o=Math.PI/180,s=180/Math.PI,l={cursor:\"pointer\"},u={cursor:\"auto\"};function c(t,e){return n.behavior.zoom().translate(e.translate()).scale(e.scale())}function f(t,e,r){var n=t.id,o=t.graphDiv,s=o.layout,l=s[n],u=o._fullLayout,c=u[n],f={},h={};function p(t,e){f[n+\".\"+t]=i.nestedProperty(l,t).get(),a.call(\"_storeDirectGUIEdit\",s,u._preGUI,f);var r=i.nestedProperty(c,t);r.get()!==e&&(r.set(e),i.nestedProperty(l,t).set(e),h[n+\".\"+t]=e)}r(p),p(\"projection.scale\",e.scale()/t.fitScale),p(\"fitbounds\",!1),o.emit(\"plotly_relayout\",h)}function h(t,e){var r=c(0,e);function i(r){var n=e.invert(t.midPt);r(\"center.lon\",n[0]),r(\"center.lat\",n[1])}return r.on(\"zoomstart\",(function(){n.select(this).style(l)})).on(\"zoom\",(function(){e.scale(n.event.scale).translate(n.event.translate),t.render(!0);var r=e.invert(t.midPt);t.graphDiv.emit(\"plotly_relayouting\",{\"geo.projection.scale\":e.scale()/t.fitScale,\"geo.center.lon\":r[0],\"geo.center.lat\":r[1]})})).on(\"zoomend\",(function(){n.select(this).style(u),f(t,e,i)})),r}function p(t,e){var r,i,a,o,s,h,p,d,v,g=c(0,e);function y(t){return e.invert(t)}function m(r){var n=e.rotate(),i=e.invert(t.midPt);r(\"projection.rotation.lon\",-n[0]),r(\"center.lon\",i[0]),r(\"center.lat\",i[1])}return g.on(\"zoomstart\",(function(){n.select(this).style(l),r=n.mouse(this),i=e.rotate(),a=e.translate(),o=i,s=y(r)})).on(\"zoom\",(function(){if(h=n.mouse(this),function(t){var r=y(t);if(!r)return!0;var n=e(r);return Math.abs(n[0]-t[0])>2||Math.abs(n[1]-t[1])>2}(r))return g.scale(e.scale()),void g.translate(e.translate());e.scale(n.event.scale),e.translate([a[0],n.event.translate[1]]),s?y(h)&&(d=y(h),p=[o[0]+(d[0]-s[0]),i[1],i[2]],e.rotate(p),o=p):s=y(r=h),v=!0,t.render(!0);var l=e.rotate(),u=e.invert(t.midPt);t.graphDiv.emit(\"plotly_relayouting\",{\"geo.projection.scale\":e.scale()/t.fitScale,\"geo.center.lon\":u[0],\"geo.center.lat\":u[1],\"geo.projection.rotation.lon\":-l[0]})})).on(\"zoomend\",(function(){n.select(this).style(u),v&&f(t,e,m)})),g}function d(t,e){var r,i={r:e.rotate(),k:e.scale()},a=c(0,e),h=function(t){for(var e=0,r=arguments.length,i=[];++ed?(a=(f>0?90:-90)-p,i=0):(a=Math.asin(f/d)*s-p,i=Math.sqrt(d*d-f*f));var v=180-a-2*p,y=(Math.atan2(h,c)-Math.atan2(u,i))*s,x=(Math.atan2(h,c)-Math.atan2(u,-i))*s;return g(r[0],r[1],a,y)<=g(r[0],r[1],v,x)?[a,y,r[2]]:[v,x,r[2]]}(T,r,E);isFinite(k[0])&&isFinite(k[1])&&isFinite(k[2])||(k=E),e.rotate(k),E=k}}else r=v(e,M=b);h.of(this,arguments)({type:\"zoom\"})})),A=h.of(this,arguments),p++||A({type:\"zoomstart\"})})).on(\"zoomend\",(function(){var r;n.select(this).style(u),d.call(a,\"zoom\",null),r=h.of(this,arguments),--p||r({type:\"zoomend\"}),f(t,e,y)})).on(\"zoom.redraw\",(function(){t.render(!0);var r=e.rotate();t.graphDiv.emit(\"plotly_relayouting\",{\"geo.projection.scale\":e.scale()/t.fitScale,\"geo.projection.rotation.lon\":-r[0],\"geo.projection.rotation.lat\":-r[1]})})),n.rebind(a,h,\"on\")}function v(t,e){var r=t.invert(e);return r&&isFinite(r[0])&&isFinite(r[1])&&function(t){var e=t[0]*o,r=t[1]*o,n=Math.cos(r);return[n*Math.cos(e),n*Math.sin(e),Math.sin(r)]}(r)}function g(t,e,r,n){var i=y(r-t),a=y(n-e);return Math.sqrt(i*i+a*a)}function y(t){return(t%360+540)%360-180}function m(t,e,r){var n=r*o,i=t.slice(),a=0===e?1:0,s=2===e?1:2,l=Math.cos(n),u=Math.sin(n);return i[a]=t[a]*l-t[s]*u,i[s]=t[s]*l+t[a]*u,i}function x(t,e){for(var r=0,n=0,i=t.length;nMath.abs(s)?(u.boxEnd[1]=u.boxStart[1]+Math.abs(a)*_*(s>=0?1:-1),u.boxEnd[1]l[3]&&(u.boxEnd[1]=l[3],u.boxEnd[0]=u.boxStart[0]+(l[3]-u.boxStart[1])/Math.abs(_))):(u.boxEnd[0]=u.boxStart[0]+Math.abs(s)/_*(a>=0?1:-1),u.boxEnd[0]l[2]&&(u.boxEnd[0]=l[2],u.boxEnd[1]=u.boxStart[1]+(l[2]-u.boxStart[0])*Math.abs(_)))}}else u.boxEnabled?(a=u.boxStart[0]!==u.boxEnd[0],s=u.boxStart[1]!==u.boxEnd[1],a||s?(a&&(g(0,u.boxStart[0],u.boxEnd[0]),t.xaxis.autorange=!1),s&&(g(1,u.boxStart[1],u.boxEnd[1]),t.yaxis.autorange=!1),t.relayoutCallback()):t.glplot.setDirty(),u.boxEnabled=!1,u.boxInited=!1):u.boxInited&&(u.boxInited=!1);break;case\"pan\":u.boxEnabled=!1,u.boxInited=!1,e?(u.panning||(u.dragStart[0]=n,u.dragStart[1]=i),Math.abs(u.dragStart[0]-n).999&&(g=\"turntable\"):g=\"turntable\")}else g=\"turntable\";r(\"dragmode\",g),r(\"hovermode\",n.getDfltFromLayout(\"hovermode\"))}t.exports=function(t,e,r){var i=e._basePlotModules.length>1;o(t,e,r,{type:c,attributes:l,handleDefaults:f,fullLayout:e,font:e.font,fullData:r,getDfltFromLayout:function(e){if(!i)return n.validate(t[e],l[e])?t[e]:void 0},autotypenumbersDflt:e.autotypenumbers,paper_bgcolor:e.paper_bgcolor,calendar:e.calendar})}},346:function(t,e,r){\"use strict\";var n=r(86140),i=r(86968).u,a=r(92880).extendFlat,o=r(3400).counterRegex;function s(t,e,r){return{x:{valType:\"number\",dflt:t,editType:\"camera\"},y:{valType:\"number\",dflt:e,editType:\"camera\"},z:{valType:\"number\",dflt:r,editType:\"camera\"},editType:\"camera\"}}t.exports={_arrayAttrRegexps:[o(\"scene\",\".annotations\",!0)],bgcolor:{valType:\"color\",dflt:\"rgba(0,0,0,0)\",editType:\"plot\"},camera:{up:a(s(0,0,1),{}),center:a(s(0,0,0),{}),eye:a(s(1.25,1.25,1.25),{}),projection:{type:{valType:\"enumerated\",values:[\"perspective\",\"orthographic\"],dflt:\"perspective\",editType:\"calc\"},editType:\"calc\"},editType:\"camera\"},domain:i({name:\"scene\",editType:\"plot\"}),aspectmode:{valType:\"enumerated\",values:[\"auto\",\"cube\",\"data\",\"manual\"],dflt:\"auto\",editType:\"plot\",impliedEdits:{\"aspectratio.x\":void 0,\"aspectratio.y\":void 0,\"aspectratio.z\":void 0}},aspectratio:{x:{valType:\"number\",min:0,editType:\"plot\",impliedEdits:{\"^aspectmode\":\"manual\"}},y:{valType:\"number\",min:0,editType:\"plot\",impliedEdits:{\"^aspectmode\":\"manual\"}},z:{valType:\"number\",min:0,editType:\"plot\",impliedEdits:{\"^aspectmode\":\"manual\"}},editType:\"plot\",impliedEdits:{aspectmode:\"manual\"}},xaxis:n,yaxis:n,zaxis:n,dragmode:{valType:\"enumerated\",values:[\"orbit\",\"turntable\",\"zoom\",\"pan\",!1],editType:\"plot\"},hovermode:{valType:\"enumerated\",values:[\"closest\",!1],dflt:\"closest\",editType:\"modebar\"},uirevision:{valType:\"any\",editType:\"none\"},editType:\"plot\",_deprecated:{cameraposition:{valType:\"info_array\",editType:\"camera\"}}}},9020:function(t,e,r){\"use strict\";var n=r(43080),i=[\"xaxis\",\"yaxis\",\"zaxis\"];function a(){this.enabled=[!0,!0,!0],this.colors=[[0,0,0,1],[0,0,0,1],[0,0,0,1]],this.drawSides=[!0,!0,!0],this.lineWidth=[1,1,1]}a.prototype.merge=function(t){for(var e=0;e<3;++e){var r=t[i[e]];r.visible?(this.enabled[e]=r.showspikes,this.colors[e]=n(r.spikecolor),this.drawSides[e]=r.spikesides,this.lineWidth[e]=r.spikethickness):(this.enabled[e]=!1,this.drawSides[e]=!1)}},t.exports=function(t){var e=new a;return e.merge(t),e}},87152:function(t,e,r){\"use strict\";t.exports=function(t){for(var e=t.axesOptions,r=t.glplot.axesPixels,s=t.fullSceneLayout,l=[[],[],[]],u=0;u<3;++u){var c=s[a[u]];if(c._length=(r[u].hi-r[u].lo)*r[u].pixelsPerDataUnit/t.dataScale[u],Math.abs(c._length)===1/0||isNaN(c._length))l[u]=[];else{c._input_range=c.range.slice(),c.range[0]=r[u].lo/t.dataScale[u],c.range[1]=r[u].hi/t.dataScale[u],c._m=1/(t.dataScale[u]*r[u].pixelsPerDataUnit),c.range[0]===c.range[1]&&(c.range[0]-=1,c.range[1]+=1);var f=c.tickmode;if(\"auto\"===c.tickmode){c.tickmode=\"linear\";var h=c.nticks||i.constrain(c._length/40,4,9);n.autoTicks(c,Math.abs(c.range[1]-c.range[0])/h)}for(var p=n.calcTicks(c,{msUTC:!0}),d=0;d/g,\" \"));l[u]=p,c.tickmode=f}}for(e.ticks=l,u=0;u<3;++u)for(o[u]=.5*(t.glplot.bounds[0][u]+t.glplot.bounds[1][u]),d=0;d<2;++d)e.bounds[d][u]=t.glplot.bounds[d][u];t.contourLevels=function(t){for(var e=new Array(3),r=0;r<3;++r){for(var n=t[r],i=new Array(n.length),a=0;ar.deltaY?1.1:1/1.1,a=t.glplot.getAspectratio();t.glplot.setAspectratio({x:n*a.x,y:n*a.y,z:n*a.z})}i(t)}}),!!u&&{passive:!1}),t.glplot.canvas.addEventListener(\"mousemove\",(function(){if(!1!==t.fullSceneLayout.dragmode&&0!==t.camera.mouseListener.buttons){var e=n();t.graphDiv.emit(\"plotly_relayouting\",e)}})),t.staticMode||t.glplot.canvas.addEventListener(\"webglcontextlost\",(function(r){e&&e.emit&&e.emit(\"plotly_webglcontextlost\",{event:r,layer:t.id})}),!1)),t.glplot.oncontextloss=function(){t.recoverContext()},t.glplot.onrender=function(){t.render()},!0},k.render=function(){var t,e=this,r=e.graphDiv,n=e.svgContainer,i=e.container.getBoundingClientRect();r._fullLayout._calcInverseTransform(r);var a=r._fullLayout._invScaleX,o=r._fullLayout._invScaleY,s=i.width*a,l=i.height*o;n.setAttributeNS(null,\"viewBox\",\"0 0 \"+s+\" \"+l),n.setAttributeNS(null,\"width\",s),n.setAttributeNS(null,\"height\",l),b(e),e.glplot.axes.update(e.axesOptions);for(var u=Object.keys(e.traces),c=null,h=e.glplot.selection,v=0;v\")):\"isosurface\"===t.type||\"volume\"===t.type?(k.valueLabel=p.hoverLabelText(e._mockAxis,e._mockAxis.d2l(h.traceCoordinate[3]),t.valuehoverformat),E.push(\"value: \"+k.valueLabel),h.textLabel&&E.push(h.textLabel),x=E.join(\"
\")):x=h.textLabel;var L={x:h.traceCoordinate[0],y:h.traceCoordinate[1],z:h.traceCoordinate[2],data:_._input,fullData:_,curveNumber:_.index,pointNumber:T};d.appendArrayPointValue(L,_,T),t._module.eventData&&(L=_._module.eventData(L,h,_,{},T));var C={points:[L]};if(e.fullSceneLayout.hovermode){var P=[];d.loneHover({trace:_,x:(.5+.5*m[0]/m[3])*s,y:(.5-.5*m[1]/m[3])*l,xLabel:k.xLabel,yLabel:k.yLabel,zLabel:k.zLabel,text:x,name:c.name,color:d.castHoverOption(_,T,\"bgcolor\")||c.color,borderColor:d.castHoverOption(_,T,\"bordercolor\"),fontFamily:d.castHoverOption(_,T,\"font.family\"),fontSize:d.castHoverOption(_,T,\"font.size\"),fontColor:d.castHoverOption(_,T,\"font.color\"),nameLength:d.castHoverOption(_,T,\"namelength\"),textAlign:d.castHoverOption(_,T,\"align\"),hovertemplate:f.castOption(_,T,\"hovertemplate\"),hovertemplateLabels:f.extendFlat({},L,k),eventData:[L]},{container:n,gd:r,inOut_bbox:P}),L.bbox=P[0]}h.distance<5&&(h.buttons||w)?r.emit(\"plotly_click\",C):r.emit(\"plotly_hover\",C),this.oldEventData=C}else d.loneUnhover(n),this.oldEventData&&r.emit(\"plotly_unhover\",this.oldEventData),this.oldEventData=void 0;e.drawAnnotations(e)},k.recoverContext=function(){var t=this;t.glplot.dispose();var e=function(){t.glplot.gl.isContextLost()?requestAnimationFrame(e):t.initializeGLPlot()?t.plot.apply(t,t.plotArgs):f.error(\"Catastrophic and unrecoverable WebGL error. Context lost.\")};requestAnimationFrame(e)};var M=[\"xaxis\",\"yaxis\",\"zaxis\"];function S(t,e,r){for(var n=t.fullSceneLayout,i=0;i<3;i++){var a=M[i],o=a.charAt(0),s=n[a],l=e[o],u=e[o+\"calendar\"],c=e[\"_\"+o+\"length\"];if(f.isArrayOrTypedArray(l))for(var h,p=0;p<(c||l.length);p++)if(f.isArrayOrTypedArray(l[p]))for(var d=0;dy[1][o])y[0][o]=-1,y[1][o]=1;else{var O=y[1][o]-y[0][o];y[0][o]-=O/32,y[1][o]+=O/32}if(b=[y[0][o],y[1][o]],b=_(b,l),y[0][o]=b[0],y[1][o]=b[1],l.isReversed()){var I=y[0][o];y[0][o]=y[1][o],y[1][o]=I}}else b=l.range,y[0][o]=l.r2l(b[0]),y[1][o]=l.r2l(b[1]);y[0][o]===y[1][o]&&(y[0][o]-=1,y[1][o]+=1),m[o]=y[1][o]-y[0][o],l.range=[y[0][o],y[1][o]],l.limitRange(),n.glplot.setBounds(o,{min:l.range[0]*p[o],max:l.range[1]*p[o]})}var z=c.aspectmode;if(\"cube\"===z)g=[1,1,1];else if(\"manual\"===z){var D=c.aspectratio;g=[D.x,D.y,D.z]}else{if(\"auto\"!==z&&\"data\"!==z)throw new Error(\"scene.js aspectRatio was not one of the enumerated types\");var R=[1,1,1];for(o=0;o<3;++o){var F=x[u=(l=c[M[o]]).type];R[o]=Math.pow(F.acc,1/F.count)/p[o]}g=\"data\"===z||Math.max.apply(null,R)/Math.min.apply(null,R)<=4?R:[1,1,1]}c.aspectratio.x=f.aspectratio.x=g[0],c.aspectratio.y=f.aspectratio.y=g[1],c.aspectratio.z=f.aspectratio.z=g[2],n.glplot.setAspectratio(c.aspectratio),n.viewInitial.aspectratio||(n.viewInitial.aspectratio={x:c.aspectratio.x,y:c.aspectratio.y,z:c.aspectratio.z}),n.viewInitial.aspectmode||(n.viewInitial.aspectmode=c.aspectmode);var B=c.domain||null,N=e._size||null;if(B&&N){var j=n.container.style;j.position=\"absolute\",j.left=N.l+B.x[0]*N.w+\"px\",j.top=N.t+(1-B.y[1])*N.h+\"px\",j.width=N.w*(B.x[1]-B.x[0])+\"px\",j.height=N.h*(B.y[1]-B.y[0])+\"px\"}n.glplot.redraw()}},k.destroy=function(){var t=this;t.glplot&&(t.camera.mouseListener.enabled=!1,t.container.removeEventListener(\"wheel\",t.camera.wheelListener),t.camera=null,t.glplot.dispose(),t.container.parentNode.removeChild(t.container),t.glplot=null)},k.getCamera=function(){var t,e=this;return e.camera.view.recalcMatrix(e.camera.view.lastT()),{up:{x:(t=e.camera).up[0],y:t.up[1],z:t.up[2]},center:{x:t.center[0],y:t.center[1],z:t.center[2]},eye:{x:t.eye[0],y:t.eye[1],z:t.eye[2]},projection:{type:!0===t._ortho?\"orthographic\":\"perspective\"}}},k.setViewport=function(t){var e,r=this,n=t.camera;r.camera.lookAt.apply(this,[[(e=n).eye.x,e.eye.y,e.eye.z],[e.center.x,e.center.y,e.center.z],[e.up.x,e.up.y,e.up.z]]),r.glplot.setAspectratio(t.aspectratio),\"orthographic\"===n.projection.type!==r.camera._ortho&&(r.glplot.redraw(),r.glplot.clearRGBA(),r.glplot.dispose(),r.initializeGLPlot())},k.isCameraChanged=function(t){var e=this.getCamera(),r=f.nestedProperty(t,this.id+\".camera\").get();function n(t,e,r,n){var i=[\"up\",\"center\",\"eye\"],a=[\"x\",\"y\",\"z\"];return e[i[r]]&&t[i[r]][a[n]]===e[i[r]][a[n]]}var i=!1;if(void 0===r)i=!0;else{for(var a=0;a<3;a++)for(var o=0;o<3;o++)if(!n(e,r,a,o)){i=!0;break}(!r.projection||e.projection&&e.projection.type!==r.projection.type)&&(i=!0)}return i},k.isAspectChanged=function(t){var e=this.glplot.getAspectratio(),r=f.nestedProperty(t,this.id+\".aspectratio\").get();return void 0===r||r.x!==e.x||r.y!==e.y||r.z!==e.z},k.saveLayout=function(t){var e,r,n,i,a,o,s=this,l=s.fullLayout,u=s.isCameraChanged(t),h=s.isAspectChanged(t),p=u||h;if(p){var d={};u&&(e=s.getCamera(),n=(r=f.nestedProperty(t,s.id+\".camera\")).get(),d[s.id+\".camera\"]=n),h&&(i=s.glplot.getAspectratio(),o=(a=f.nestedProperty(t,s.id+\".aspectratio\")).get(),d[s.id+\".aspectratio\"]=o),c.call(\"_storeDirectGUIEdit\",t,l._preGUI,d),u&&(r.set(e),f.nestedProperty(l,s.id+\".camera\").set(e)),h&&(a.set(i),f.nestedProperty(l,s.id+\".aspectratio\").set(i),s.glplot.redraw())}return p},k.updateFx=function(t,e){var r=this,n=r.camera;if(n)if(\"orbit\"===t)n.mode=\"orbit\",n.keyBindingMode=\"rotate\";else if(\"turntable\"===t){n.up=[0,0,1],n.mode=\"turntable\",n.keyBindingMode=\"rotate\";var i=r.graphDiv,a=i._fullLayout,o=r.fullSceneLayout.camera,s=o.up.x,l=o.up.y,u=o.up.z;if(u/Math.sqrt(s*s+l*l+u*u)<.999){var h=r.id+\".camera.up\",p={x:0,y:0,z:1},d={};d[h]=p;var v=i.layout;c.call(\"_storeDirectGUIEdit\",v,a._preGUI,d),o.up=p,f.nestedProperty(v,h).set(p)}}else n.keyBindingMode=t;r.fullSceneLayout.hovermode=e},k.toImage=function(t){var e=this;t||(t=\"png\"),e.staticMode&&e.container.appendChild(n),e.glplot.redraw();var r=e.glplot.gl,i=r.drawingBufferWidth,a=r.drawingBufferHeight;r.bindFramebuffer(r.FRAMEBUFFER,null);var o=new Uint8Array(i*a*4);r.readPixels(0,0,i,a,r.RGBA,r.UNSIGNED_BYTE,o),function(t,e,r){for(var n=0,i=r-1;n0)for(var s=255/o,l=0;l<3;++l)t[a+l]=Math.min(s*t[a+l],255)}}(o,i,a);var s=document.createElement(\"canvas\");s.width=i,s.height=a;var l,u=s.getContext(\"2d\",{willReadFrequently:!0}),c=u.createImageData(i,a);switch(c.data.set(o),u.putImageData(c,0,0),t){case\"jpeg\":l=s.toDataURL(\"image/jpeg\");break;case\"webp\":l=s.toDataURL(\"image/webp\");break;default:l=s.toDataURL(\"image/png\")}return e.staticMode&&e.container.removeChild(n),l},k.setConvert=function(){for(var t=0;t<3;t++){var e=this.fullSceneLayout[M[t]];p.setConvert(e,this.fullLayout),e.setScale=f.noop}},k.make4thDimension=function(){var t=this,e=t.graphDiv._fullLayout;t._mockAxis={type:\"linear\",showexponent:\"all\",exponentformat:\"B\"},p.setConvert(t._mockAxis,e)},t.exports=T},52094:function(t){\"use strict\";t.exports=function(t,e,r,n){n=n||t.length;for(var i=new Array(n),a=0;aOpenStreetMap contributors',o=['© Carto',a].join(\" \"),s=['Map tiles by Stamen Design','under CC BY 3.0',\"|\",'Data by OpenStreetMap contributors','under ODbL'].join(\" \"),l={\"open-street-map\":{id:\"osm\",version:8,sources:{\"plotly-osm-tiles\":{type:\"raster\",attribution:a,tiles:[\"https://a.tile.openstreetmap.org/{z}/{x}/{y}.png\",\"https://b.tile.openstreetmap.org/{z}/{x}/{y}.png\"],tileSize:256}},layers:[{id:\"plotly-osm-tiles\",type:\"raster\",source:\"plotly-osm-tiles\",minzoom:0,maxzoom:22}],glyphs:\"https://fonts.openmaptiles.org/{fontstack}/{range}.pbf\"},\"white-bg\":{id:\"white-bg\",version:8,sources:{},layers:[{id:\"white-bg\",type:\"background\",paint:{\"background-color\":\"#FFFFFF\"},minzoom:0,maxzoom:22}],glyphs:\"https://fonts.openmaptiles.org/{fontstack}/{range}.pbf\"},\"carto-positron\":{id:\"carto-positron\",version:8,sources:{\"plotly-carto-positron\":{type:\"raster\",attribution:o,tiles:[\"https://cartodb-basemaps-c.global.ssl.fastly.net/light_all/{z}/{x}/{y}.png\"],tileSize:256}},layers:[{id:\"plotly-carto-positron\",type:\"raster\",source:\"plotly-carto-positron\",minzoom:0,maxzoom:22}],glyphs:\"https://fonts.openmaptiles.org/{fontstack}/{range}.pbf\"},\"carto-darkmatter\":{id:\"carto-darkmatter\",version:8,sources:{\"plotly-carto-darkmatter\":{type:\"raster\",attribution:o,tiles:[\"https://cartodb-basemaps-c.global.ssl.fastly.net/dark_all/{z}/{x}/{y}.png\"],tileSize:256}},layers:[{id:\"plotly-carto-darkmatter\",type:\"raster\",source:\"plotly-carto-darkmatter\",minzoom:0,maxzoom:22}],glyphs:\"https://fonts.openmaptiles.org/{fontstack}/{range}.pbf\"},\"stamen-terrain\":{id:\"stamen-terrain\",version:8,sources:{\"plotly-stamen-terrain\":{type:\"raster\",attribution:s,tiles:[\"https://tiles.stadiamaps.com/tiles/stamen_terrain/{z}/{x}/{y}.png?api_key=\"],tileSize:256}},layers:[{id:\"plotly-stamen-terrain\",type:\"raster\",source:\"plotly-stamen-terrain\",minzoom:0,maxzoom:22}],glyphs:\"https://fonts.openmaptiles.org/{fontstack}/{range}.pbf\"},\"stamen-toner\":{id:\"stamen-toner\",version:8,sources:{\"plotly-stamen-toner\":{type:\"raster\",attribution:s,tiles:[\"https://tiles.stadiamaps.com/tiles/stamen_toner/{z}/{x}/{y}.png?api_key=\"],tileSize:256}},layers:[{id:\"plotly-stamen-toner\",type:\"raster\",source:\"plotly-stamen-toner\",minzoom:0,maxzoom:22}],glyphs:\"https://fonts.openmaptiles.org/{fontstack}/{range}.pbf\"},\"stamen-watercolor\":{id:\"stamen-watercolor\",version:8,sources:{\"plotly-stamen-watercolor\":{type:\"raster\",attribution:['Map tiles by Stamen Design','under CC BY 3.0',\"|\",'Data by OpenStreetMap contributors','under CC BY SA'].join(\" \"),tiles:[\"https://tiles.stadiamaps.com/tiles/stamen_watercolor/{z}/{x}/{y}.jpg?api_key=\"],tileSize:256}},layers:[{id:\"plotly-stamen-watercolor\",type:\"raster\",source:\"plotly-stamen-watercolor\",minzoom:0,maxzoom:22}],glyphs:\"https://fonts.openmaptiles.org/{fontstack}/{range}.pbf\"}},u=n(l);t.exports={requiredVersion:i,styleUrlPrefix:\"mapbox://styles/mapbox/\",styleUrlSuffix:\"v9\",styleValuesMapbox:[\"basic\",\"streets\",\"outdoors\",\"light\",\"dark\",\"satellite\",\"satellite-streets\"],styleValueDflt:\"basic\",stylesNonMapbox:l,styleValuesNonMapbox:u,traceLayerPrefix:\"plotly-trace-layer-\",layoutLayerPrefix:\"plotly-layout-layer-\",wrongVersionErrorMsg:[\"Your custom plotly.js bundle is not using the correct mapbox-gl version\",\"Please install @plotly/mapbox-gl@\"+i+\".\"].join(\"\\n\"),noAccessTokenErrorMsg:[\"Missing Mapbox access token.\",\"Mapbox trace type require a Mapbox access token to be registered.\",\"For example:\",\" Plotly.newPlot(gd, data, layout, { mapboxAccessToken: 'my-access-token' });\",\"More info here: https://www.mapbox.com/help/define-access-token/\"].join(\"\\n\"),missingStyleErrorMsg:[\"No valid mapbox style found, please set `mapbox.style` to one of:\",u.join(\", \"),\"or register a Mapbox access token to use a Mapbox-served style.\"].join(\"\\n\"),multipleTokensErrorMsg:[\"Set multiple mapbox access token across different mapbox subplot,\",\"using first token found as mapbox-gl does not allow multipleaccess tokens on the same page.\"].join(\"\\n\"),mapOnErrorMsg:\"Mapbox error.\",mapboxLogo:{path0:\"m 10.5,1.24 c -5.11,0 -9.25,4.15 -9.25,9.25 0,5.1 4.15,9.25 9.25,9.25 5.1,0 9.25,-4.15 9.25,-9.25 0,-5.11 -4.14,-9.25 -9.25,-9.25 z m 4.39,11.53 c -1.93,1.93 -4.78,2.31 -6.7,2.31 -0.7,0 -1.41,-0.05 -2.1,-0.16 0,0 -1.02,-5.64 2.14,-8.81 0.83,-0.83 1.95,-1.28 3.13,-1.28 1.27,0 2.49,0.51 3.39,1.42 1.84,1.84 1.89,4.75 0.14,6.52 z\",path1:\"M 10.5,-0.01 C 4.7,-0.01 0,4.7 0,10.49 c 0,5.79 4.7,10.5 10.5,10.5 5.8,0 10.5,-4.7 10.5,-10.5 C 20.99,4.7 16.3,-0.01 10.5,-0.01 Z m 0,19.75 c -5.11,0 -9.25,-4.15 -9.25,-9.25 0,-5.1 4.14,-9.26 9.25,-9.26 5.11,0 9.25,4.15 9.25,9.25 0,5.13 -4.14,9.26 -9.25,9.26 z\",path2:\"M 14.74,6.25 C 12.9,4.41 9.98,4.35 8.23,6.1 5.07,9.27 6.09,14.91 6.09,14.91 c 0,0 5.64,1.02 8.81,-2.14 C 16.64,11 16.59,8.09 14.74,6.25 Z m -2.27,4.09 -0.91,1.87 -0.9,-1.87 -1.86,-0.91 1.86,-0.9 0.9,-1.87 0.91,1.87 1.86,0.9 z\",polygon:\"11.56,12.21 10.66,10.34 8.8,9.43 10.66,8.53 11.56,6.66 12.47,8.53 14.33,9.43 12.47,10.34\"},styleRules:{map:\"overflow:hidden;position:relative;\",\"missing-css\":\"display:none;\",canary:\"background-color:salmon;\",\"ctrl-bottom-left\":\"position: absolute; pointer-events: none; z-index: 2; bottom: 0; left: 0;\",\"ctrl-bottom-right\":\"position: absolute; pointer-events: none; z-index: 2; right: 0; bottom: 0;\",ctrl:\"clear: both; pointer-events: auto; transform: translate(0, 0);\",\"ctrl-attrib.mapboxgl-compact .mapboxgl-ctrl-attrib-inner\":\"display: none;\",\"ctrl-attrib.mapboxgl-compact:hover .mapboxgl-ctrl-attrib-inner\":\"display: block; margin-top:2px\",\"ctrl-attrib.mapboxgl-compact:hover\":\"padding: 2px 24px 2px 4px; visibility: visible; margin-top: 6px;\",\"ctrl-attrib.mapboxgl-compact::after\":'content: \"\"; cursor: pointer; position: absolute; background-image: url(\\'data:image/svg+xml;charset=utf-8,%3Csvg viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\"%3E %3Cpath fill=\"%23333333\" fill-rule=\"evenodd\" d=\"M4,10a6,6 0 1,0 12,0a6,6 0 1,0 -12,0 M9,7a1,1 0 1,0 2,0a1,1 0 1,0 -2,0 M9,10a1,1 0 1,1 2,0l0,3a1,1 0 1,1 -2,0\"/%3E %3C/svg%3E\\'); background-color: rgba(255, 255, 255, 0.5); width: 24px; height: 24px; box-sizing: border-box; border-radius: 12px;',\"ctrl-attrib.mapboxgl-compact\":\"min-height: 20px; padding: 0; margin: 10px; position: relative; background-color: #fff; border-radius: 3px 12px 12px 3px;\",\"ctrl-bottom-right > .mapboxgl-ctrl-attrib.mapboxgl-compact::after\":\"bottom: 0; right: 0\",\"ctrl-bottom-left > .mapboxgl-ctrl-attrib.mapboxgl-compact::after\":\"bottom: 0; left: 0\",\"ctrl-bottom-left .mapboxgl-ctrl\":\"margin: 0 0 10px 10px; float: left;\",\"ctrl-bottom-right .mapboxgl-ctrl\":\"margin: 0 10px 10px 0; float: right;\",\"ctrl-attrib\":\"color: rgba(0, 0, 0, 0.75); text-decoration: none; font-size: 12px\",\"ctrl-attrib a\":\"color: rgba(0, 0, 0, 0.75); text-decoration: none; font-size: 12px\",\"ctrl-attrib a:hover\":\"color: inherit; text-decoration: underline;\",\"ctrl-attrib .mapbox-improve-map\":\"font-weight: bold; margin-left: 2px;\",\"attrib-empty\":\"display: none;\",\"ctrl-logo\":'display:block; width: 21px; height: 21px; background-image: url(\\'data:image/svg+xml;charset=utf-8,%3C?xml version=\"1.0\" encoding=\"utf-8\"?%3E %3Csvg version=\"1.1\" id=\"Layer_1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\" viewBox=\"0 0 21 21\" style=\"enable-background:new 0 0 21 21;\" xml:space=\"preserve\"%3E%3Cg transform=\"translate(0,0.01)\"%3E%3Cpath d=\"m 10.5,1.24 c -5.11,0 -9.25,4.15 -9.25,9.25 0,5.1 4.15,9.25 9.25,9.25 5.1,0 9.25,-4.15 9.25,-9.25 0,-5.11 -4.14,-9.25 -9.25,-9.25 z m 4.39,11.53 c -1.93,1.93 -4.78,2.31 -6.7,2.31 -0.7,0 -1.41,-0.05 -2.1,-0.16 0,0 -1.02,-5.64 2.14,-8.81 0.83,-0.83 1.95,-1.28 3.13,-1.28 1.27,0 2.49,0.51 3.39,1.42 1.84,1.84 1.89,4.75 0.14,6.52 z\" style=\"opacity:0.9;fill:%23ffffff;enable-background:new\" class=\"st0\"/%3E%3Cpath d=\"M 10.5,-0.01 C 4.7,-0.01 0,4.7 0,10.49 c 0,5.79 4.7,10.5 10.5,10.5 5.8,0 10.5,-4.7 10.5,-10.5 C 20.99,4.7 16.3,-0.01 10.5,-0.01 Z m 0,19.75 c -5.11,0 -9.25,-4.15 -9.25,-9.25 0,-5.1 4.14,-9.26 9.25,-9.26 5.11,0 9.25,4.15 9.25,9.25 0,5.13 -4.14,9.26 -9.25,9.26 z\" style=\"opacity:0.35;enable-background:new\" class=\"st1\"/%3E%3Cpath d=\"M 14.74,6.25 C 12.9,4.41 9.98,4.35 8.23,6.1 5.07,9.27 6.09,14.91 6.09,14.91 c 0,0 5.64,1.02 8.81,-2.14 C 16.64,11 16.59,8.09 14.74,6.25 Z m -2.27,4.09 -0.91,1.87 -0.9,-1.87 -1.86,-0.91 1.86,-0.9 0.9,-1.87 0.91,1.87 1.86,0.9 z\" style=\"opacity:0.35;enable-background:new\" class=\"st1\"/%3E%3Cpolygon points=\"11.56,12.21 10.66,10.34 8.8,9.43 10.66,8.53 11.56,6.66 12.47,8.53 14.33,9.43 12.47,10.34 \" style=\"opacity:0.9;fill:%23ffffff;enable-background:new\" class=\"st0\"/%3E%3C/g%3E%3C/svg%3E\\')'}}},89032:function(t,e,r){\"use strict\";var n=r(3400);t.exports=function(t,e){var r=t.split(\" \"),i=r[0],a=r[1],o=n.isArrayOrTypedArray(e)?n.mean(e):e,s=.5+o/100,l=1.5+o/100,u=[\"\",\"\"],c=[0,0];switch(i){case\"top\":u[0]=\"top\",c[1]=-l;break;case\"bottom\":u[0]=\"bottom\",c[1]=l}switch(a){case\"left\":u[1]=\"right\",c[0]=-s;break;case\"right\":u[1]=\"left\",c[0]=s}return{anchor:u[0]&&u[1]?u.join(\"-\"):u[0]?u[0]:u[1]?u[1]:\"center\",offset:c}}},33688:function(t,e,r){\"use strict\";var n=r(3480),i=r(3400),a=i.strTranslate,o=i.strScale,s=r(84888).KY,l=r(9616),u=r(33428),c=r(43616),f=r(72736),h=r(14440),p=\"mapbox\",d=e.constants=r(47552);function v(t){return\"string\"==typeof t&&(-1!==d.styleValuesMapbox.indexOf(t)||0===t.indexOf(\"mapbox://\")||0===t.indexOf(\"stamen\"))}e.name=p,e.attr=\"subplot\",e.idRoot=p,e.idRegex=e.attrRegex=i.counterRegex(p),e.attributes={subplot:{valType:\"subplotid\",dflt:\"mapbox\",editType:\"calc\"}},e.layoutAttributes=r(5232),e.supplyLayoutDefaults=r(5976),e.plot=function(t){var e=t._fullLayout,r=t.calcdata,a=e._subplots[p];if(n.version!==d.requiredVersion)throw new Error(d.wrongVersionErrorMsg);var o=function(t,e){var r=t._fullLayout;if(\"\"===t._context.mapboxAccessToken)return\"\";for(var n=[],a=[],o=!1,s=!1,l=0;l1&&i.warn(d.multipleTokensErrorMsg),n[0]):(a.length&&i.log([\"Listed mapbox access token(s)\",a.join(\",\"),\"but did not use a Mapbox map style, ignoring token(s).\"].join(\" \")),\"\")}(t,a);n.accessToken=o;for(var l=0;lw/2){var T=m.split(\"|\").join(\"
\");b.text(T).attr(\"data-unformatted\",T).call(f.convertToTspans,t),_=c.bBox(b.node())}b.attr(\"transform\",a(-3,8-_.height)),x.insert(\"rect\",\".static-attribution\").attr({x:-_.width-6,y:-_.height-3,width:_.width+6,height:_.height+3,fill:\"rgba(255, 255, 255, 0.75)\"});var k=1;_.width+6>w&&(k=w/(_.width+6));var A=[n.l+n.w*h.x[1],n.t+n.h*(1-h.y[0])];x.attr(\"transform\",a(A[0],A[1])+o(k))}},e.updateFx=function(t){for(var e=t._fullLayout,r=e._subplots[p],n=0;n0){for(var r=0;r0}function c(t){var e={},r={};switch(t.type){case\"circle\":n.extendFlat(r,{\"circle-radius\":t.circle.radius,\"circle-color\":t.color,\"circle-opacity\":t.opacity});break;case\"line\":n.extendFlat(r,{\"line-width\":t.line.width,\"line-color\":t.color,\"line-opacity\":t.opacity,\"line-dasharray\":t.line.dash});break;case\"fill\":n.extendFlat(r,{\"fill-color\":t.color,\"fill-outline-color\":t.fill.outlinecolor,\"fill-opacity\":t.opacity});break;case\"symbol\":var i=t.symbol,o=a(i.textposition,i.iconsize);n.extendFlat(e,{\"icon-image\":i.icon+\"-15\",\"icon-size\":i.iconsize/10,\"text-field\":i.text,\"text-size\":i.textfont.size,\"text-anchor\":o.anchor,\"text-offset\":o.offset,\"symbol-placement\":i.placement}),n.extendFlat(r,{\"icon-color\":t.color,\"text-color\":i.textfont.color,\"text-opacity\":t.opacity});break;case\"raster\":n.extendFlat(r,{\"raster-fade-duration\":0,\"raster-opacity\":t.opacity})}return{layout:e,paint:r}}l.update=function(t){this.visible?this.needsNewImage(t)?this.updateImage(t):this.needsNewSource(t)?(this.removeLayer(),this.updateSource(t),this.updateLayer(t)):this.needsNewLayer(t)?this.updateLayer(t):this.updateStyle(t):(this.updateSource(t),this.updateLayer(t)),this.visible=u(t)},l.needsNewImage=function(t){return this.subplot.map.getSource(this.idSource)&&\"image\"===this.sourceType&&\"image\"===t.sourcetype&&(this.source!==t.source||JSON.stringify(this.coordinates)!==JSON.stringify(t.coordinates))},l.needsNewSource=function(t){return this.sourceType!==t.sourcetype||JSON.stringify(this.source)!==JSON.stringify(t.source)||this.layerType!==t.type},l.needsNewLayer=function(t){return this.layerType!==t.type||this.below!==this.subplot.belowLookup[\"layout-\"+this.index]},l.lookupBelow=function(){return this.subplot.belowLookup[\"layout-\"+this.index]},l.updateImage=function(t){this.subplot.map.getSource(this.idSource).updateImage({url:t.source,coordinates:t.coordinates});var e=this.findFollowingMapboxLayerId(this.lookupBelow());null!==e&&this.subplot.map.moveLayer(this.idLayer,e)},l.updateSource=function(t){var e=this.subplot.map;if(e.getSource(this.idSource)&&e.removeSource(this.idSource),this.sourceType=t.sourcetype,this.source=t.source,u(t)){var r=function(t){var e,r=t.sourcetype,n=t.source,a={type:r};return\"geojson\"===r?e=\"data\":\"vector\"===r?e=\"string\"==typeof n?\"url\":\"tiles\":\"raster\"===r?(e=\"tiles\",a.tileSize=256):\"image\"===r&&(e=\"url\",a.coordinates=t.coordinates),a[e]=n,t.sourceattribution&&(a.attribution=i(t.sourceattribution)),a}(t);e.addSource(this.idSource,r)}},l.findFollowingMapboxLayerId=function(t){if(\"traces\"===t)for(var e=this.subplot.getMapLayers(),r=0;r1)for(r=0;r-1&&g(e.originalEvent,n,[r.xaxis],[r.yaxis],r.id,t),i.indexOf(\"event\")>-1&&u.click(n,e.originalEvent)}}},b.updateFx=function(t){var e=this,r=e.map,n=e.gd;if(!e.isStatic){var a,o=t.dragmode;a=function(t,r){r.isRect?(t.range={})[e.id]=[u([r.xmin,r.ymin]),u([r.xmax,r.ymax])]:(t.lassoPoints={})[e.id]=r.map(u)};var s=e.dragOptions;e.dragOptions=i.extendDeep(s||{},{dragmode:t.dragmode,element:e.div,gd:n,plotinfo:{id:e.id,domain:t[e.id].domain,xaxis:e.xaxis,yaxis:e.yaxis,fillRangeItems:a},xaxes:[e.xaxis],yaxes:[e.yaxis],subplot:e.id}),r.off(\"click\",e.onClickInPanHandler),h(o)||f(o)?(r.dragPan.disable(),r.on(\"zoomstart\",e.clearOutline),e.dragOptions.prepFn=function(t,r,n){p(t,r,n,e.dragOptions,o)},l.init(e.dragOptions)):(r.dragPan.enable(),r.off(\"zoomstart\",e.clearOutline),e.div.onmousedown=null,e.div.ontouchstart=null,e.div.removeEventListener(\"touchstart\",e.div._ontouchstart),e.onClickInPanHandler=e.onClickInPanFn(e.dragOptions),r.on(\"click\",e.onClickInPanHandler))}function u(t){var r=e.map.unproject(t);return[r.lng,r.lat]}},b.updateFramework=function(t){var e=t[this.id].domain,r=t._size,n=this.div.style;n.width=r.w*(e.x[1]-e.x[0])+\"px\",n.height=r.h*(e.y[1]-e.y[0])+\"px\",n.left=r.l+e.x[0]*r.w+\"px\",n.top=r.t+(1-e.y[1])*r.h+\"px\",this.xaxis._offset=r.l+e.x[0]*r.w,this.xaxis._length=r.w*(e.x[1]-e.x[0]),this.yaxis._offset=r.t+(1-e.y[1])*r.h,this.yaxis._length=r.h*(e.y[1]-e.y[0])},b.updateLayers=function(t){var e,r=t[this.id].layers,n=this.layerList;if(r.length!==n.length){for(e=0;e=e.width-20?(a[\"text-anchor\"]=\"start\",a.x=5):(a[\"text-anchor\"]=\"end\",a.x=e._paper.attr(\"width\")-7),r.attr(a);var o=r.select(\".js-link-to-tool\"),s=r.select(\".js-link-spacer\"),l=r.select(\".js-sourcelinks\");t._context.showSources&&t._context.showSources(t),t._context.showLink&&function(t,e){e.text(\"\");var r=e.append(\"a\").attr({\"xlink:xlink:href\":\"#\",class:\"link--impt link--embedview\",\"font-weight\":\"bold\"}).text(t._context.linkText+\" \"+String.fromCharCode(187));if(t._context.sendData)r.on(\"click\",(function(){w.sendDataToCloud(t)}));else{var n=window.location.pathname.split(\"/\"),i=window.location.search;r.attr({\"xlink:xlink:show\":\"new\",\"xlink:xlink:href\":\"/\"+n[2].split(\".\")[0]+\"/\"+n[1]+i})}}(t,o),s.text(o.text()&&l.text()?\" - \":\"\")}},w.sendDataToCloud=function(t){var e=(window.PLOTLYENV||{}).BASE_URL||t._context.plotlyServerURL;if(e){t.emit(\"plotly_beforeexport\");var r=n.select(t).append(\"div\").attr(\"id\",\"hiddenform\").style(\"display\",\"none\"),i=r.append(\"form\").attr({action:e+\"/external\",method:\"post\",target:\"_blank\"});return i.append(\"input\").attr({type:\"text\",name:\"data\"}).node().value=w.graphJson(t,!1,\"keepdata\"),i.node().submit(),r.remove(),t.emit(\"plotly_afterexport\"),!1}};var A=[\"days\",\"shortDays\",\"months\",\"shortMonths\",\"periods\",\"dateTime\",\"date\",\"time\",\"decimal\",\"thousands\",\"grouping\",\"currency\"],M=[\"year\",\"month\",\"dayMonth\",\"dayMonthYear\"];function S(t,e){var r=t._context.locale;r||(r=\"en-US\");var n=!1,i={};function a(t){for(var r=!0,a=0;a1&&z.length>1){for(l.getComponentMethod(\"grid\",\"sizeDefaults\")(u,s),o=0;o15&&z.length>15&&0===s.shapes.length&&0===s.images.length,w.linkSubplots(h,s,c,n),w.cleanPlot(h,s,c,n);var N=!(!n._has||!n._has(\"gl2d\")),j=!(!s._has||!s._has(\"gl2d\")),U=!(!n._has||!n._has(\"cartesian\"))||N,V=!(!s._has||!s._has(\"cartesian\"))||j;U&&!V?n._bgLayer.remove():V&&!U&&(s._shouldCreateBgLayer=!0),n._zoomlayer&&!t._dragging&&v({_fullLayout:n}),function(t,e){var r,n=[];e.meta&&(r=e._meta={meta:e.meta,layout:{meta:e.meta}});for(var i=0;i0){var c=1-2*s;n=Math.round(c*n),i=Math.round(c*i)}}var h=w.layoutAttributes.width.min,p=w.layoutAttributes.height.min;n1,v=!e.height&&Math.abs(r.height-i)>1;(v||d)&&(d&&(r.width=n),v&&(r.height=i)),t._initialAutoSize||(t._initialAutoSize={width:n,height:i}),w.sanitizeMargins(r)},w.supplyLayoutModuleDefaults=function(t,e,r,n){var i,a,o,s=l.componentsRegistry,u=e._basePlotModules,c=l.subplotsRegistry.cartesian;for(i in s)(o=s[i]).includeBasePlot&&o.includeBasePlot(t,e);for(var h in u.length||u.push(c),e._has(\"cartesian\")&&(l.getComponentMethod(\"grid\",\"contentDefaults\")(t,e),c.finalizeSubplots(t,e)),e._subplots)e._subplots[h].sort(f.subplotSort);for(a=0;a1&&(r.l/=y,r.r/=y)}if(p){var m=(r.t+r.b)/p;m>1&&(r.t/=m,r.b/=m)}var x=void 0!==r.xl?r.xl:r.x,b=void 0!==r.xr?r.xr:r.x,_=void 0!==r.yt?r.yt:r.y,T=void 0!==r.yb?r.yb:r.y;d[e]={l:{val:x,size:r.l+g},r:{val:b,size:r.r+g},b:{val:T,size:r.b+g},t:{val:_,size:r.t+g}},v[e]=1}else delete d[e],delete v[e];if(!n._replotting)return w.doAutoMargin(t)}},w.doAutoMargin=function(t){var e=t._fullLayout,r=e.width,n=e.height;e._size||(e._size={}),O(e);var i=e._size,a=e.margin,s={t:0,b:0,l:0,r:0},u=f.extendFlat({},i),c=a.l,h=a.r,p=a.t,v=a.b,g=e._pushmargin,y=e._pushmarginIds,m=e.minreducedwidth,x=e.minreducedheight;if(!1!==a.autoexpand){for(var b in g)y[b]||delete g[b];var _=t._fullLayout._reservedMargin;for(var T in _)for(var k in _[T]){var A=_[T][k];s[k]=Math.max(s[k],A)}for(var M in g.base={l:{val:0,size:c},r:{val:1,size:h},t:{val:1,size:p},b:{val:0,size:v}},s){var S=0;for(var E in g)\"base\"!==E&&o(g[E][M].size)&&(S=g[E][M].size>S?g[E][M].size:S);var L=Math.max(0,a[M]-S);s[M]=Math.max(0,s[M]-L)}for(var C in g){var P=g[C].l||{},I=g[C].b||{},z=P.val,D=P.size,R=I.val,F=I.size,B=r-s.r-s.l,N=n-s.t-s.b;for(var j in g){if(o(D)&&g[j].r){var U=g[j].r.val,V=g[j].r.size;if(U>z){var q=(D*U+(V-B)*z)/(U-z),H=(V*(1-z)+(D-B)*(1-U))/(U-z);q+H>c+h&&(c=q,h=H)}}if(o(F)&&g[j].t){var G=g[j].t.val,W=g[j].t.size;if(G>R){var Y=(F*G+(W-N)*R)/(G-R),X=(W*(1-R)+(F-N)*(1-G))/(G-R);Y+X>v+p&&(v=Y,p=X)}}}}}var Z=f.constrain(r-a.l-a.r,2,m),K=f.constrain(n-a.t-a.b,2,x),J=Math.max(0,r-Z),$=Math.max(0,n-K);if(J){var Q=(c+h)/J;Q>1&&(c/=Q,h/=Q)}if($){var tt=(v+p)/$;tt>1&&(v/=tt,p/=tt)}if(i.l=Math.round(c)+s.l,i.r=Math.round(h)+s.r,i.t=Math.round(p)+s.t,i.b=Math.round(v)+s.b,i.p=Math.round(a.pad),i.w=Math.round(r)-i.l-i.r,i.h=Math.round(n)-i.t-i.b,!e._replotting&&(w.didMarginChange(u,i)||function(t){if(\"_redrawFromAutoMarginCount\"in t._fullLayout)return!1;var e=d.list(t,\"\",!0);for(var r in e)if(e[r].autoshift||e[r].shift)return!0;return!1}(t))){\"_redrawFromAutoMarginCount\"in e?e._redrawFromAutoMarginCount++:e._redrawFromAutoMarginCount=1;var et=3*(1+Object.keys(y).length);if(e._redrawFromAutoMarginCount0&&(t._transitioningWithDuration=!0),t._transitionData._interruptCallbacks.push((function(){n=!0})),r.redraw&&t._transitionData._interruptCallbacks.push((function(){return l.call(\"redraw\",t)})),t._transitionData._interruptCallbacks.push((function(){t.emit(\"plotly_transitioninterrupted\",[])}));var a=0,o=0;function s(){return a++,function(){var e;o++,n||o!==a||(e=i,t._transitionData&&(function(t){if(t)for(;t.length;)t.shift()}(t._transitionData._interruptCallbacks),Promise.resolve().then((function(){if(r.redraw)return l.call(\"redraw\",t)})).then((function(){t._transitioning=!1,t._transitioningWithDuration=!1,t.emit(\"plotly_transitioned\",[])})).then(e)))}}r.runFn(s),setTimeout(s())}))}],a=f.syncOrAsync(i,t);return a&&a.then||(a=Promise.resolve()),a.then((function(){return t}))}w.didMarginChange=function(t,e){for(var r=0;r1)return!0}return!1},w.graphJson=function(t,e,r,n,i,a){(i&&e&&!t._fullData||i&&!e&&!t._fullLayout)&&w.supplyDefaults(t);var o=i?t._fullData:t.data,l=i?t._fullLayout:t.layout,u=(t._transitionData||{})._frames;function c(t,e){if(\"function\"==typeof t)return e?\"_function_\":null;if(f.isPlainObject(t)){var n,i={};return Object.keys(t).sort().forEach((function(a){if(-1===[\"_\",\"[\"].indexOf(a.charAt(0)))if(\"function\"!=typeof t[a]){if(\"keepdata\"===r){if(\"src\"===a.substr(a.length-3))return}else if(\"keepstream\"===r){if(\"string\"==typeof(n=t[a+\"src\"])&&n.indexOf(\":\")>0&&!f.isPlainObject(t.stream))return}else if(\"keepall\"!==r&&\"string\"==typeof(n=t[a+\"src\"])&&n.indexOf(\":\")>0)return;i[a]=c(t[a],e)}else e&&(i[a]=\"_function\")})),i}var a=Array.isArray(t),o=f.isTypedArray(t);if((a||o)&&t.dtype&&t.shape){var l=t.bdata;return c({dtype:t.dtype,shape:t.shape,bdata:f.isArrayBuffer(l)?s.encode(l):l},e)}return a?t.map((function(t){return c(t,e)})):o?f.simpleMap(t,f.identity):f.isJSDate(t)?f.ms2DateTimeLocal(+t):t}var h={data:(o||[]).map((function(t){var r=c(t);return e&&delete r.fit,r}))};if(!e&&(h.layout=c(l),i)){var p=l._size;h.layout.computed={margin:{b:p.b,l:p.l,r:p.r,t:p.t}}}return u&&(h.frames=c(u)),a&&(h.config=c(t._context,!0)),\"object\"===n?h:JSON.stringify(h)},w.modifyFrames=function(t,e){var r,n,i,a=t._transitionData._frames,o=t._transitionData._frameHash;for(r=0;r=0;a--)if(l[a].enabled){r._indexToPoints=l[a]._indexToPoints;break}n&&n.calc&&(o=n.calc(t,r))}Array.isArray(o)&&o[0]||(o=[{x:p,y:p}]),o[0].t||(o[0].t={}),o[0].trace=r,h[e]=o}}for(R(o,s,c),i=0;i1e-10?t:0}function h(t,e,r){e=e||0,r=r||0;for(var n=t.length,i=new Array(n),a=0;a0?r:1/0})),i=n.mod(r+1,e.length);return[e[r],e[i]]},findIntersectionXY:u,findXYatLength:function(t,e,r,n){var i=-e*r,a=e*e+1,o=2*(e*i-r),s=i*i+r*r-t*t,l=Math.sqrt(o*o-4*a*s),u=(-o+l)/(2*a),c=(-o-l)/(2*a);return[[u,e*u+i+n],[c,e*c+i+n]]},clampTiny:f,pathPolygon:function(t,e,r,n,i,a){return\"M\"+h(c(t,e,r,n),i,a).join(\"L\")},pathPolygonAnnulus:function(t,e,r,n,i,a,o){var s,l;t=90||i>90&&a>=450?1:s<=0&&u<=0?0:Math.max(s,u),[i<=180&&a>=180||i>180&&a>=540?-1:o>=0&&l>=0?0:Math.min(o,l),i<=270&&a>=270||i>270&&a>=630?-1:s>=0&&u>=0?0:Math.min(s,u),a>=360?1:o<=0&&l<=0?0:Math.max(o,l),e]}(d),_=b[2]-b[0],w=b[3]-b[1],T=p/h,k=Math.abs(w/_);T>k?(v=h,x=(p-(g=h*k))/i.h/2,y=[s[0],s[1]],m=[f[0]+x,f[1]-x]):(g=p,x=(h-(v=p/k))/i.w/2,y=[s[0]+x,s[1]-x],m=[f[0],f[1]]),r.xLength2=v,r.yLength2=g,r.xDomain2=y,r.yDomain2=m;var A,M=r.xOffset2=i.l+i.w*y[0],S=r.yOffset2=i.t+i.h*(1-m[1]),E=r.radius=v/_,L=r.innerRadius=r.getHole(e)*E,C=r.cx=M-E*b[0],P=r.cy=S+E*b[3],O=r.cxx=C-M,I=r.cyy=P-S,z=a.side;\"counterclockwise\"===z?(A=z,z=\"top\"):\"clockwise\"===z&&(A=z,z=\"bottom\"),r.radialAxis=r.mockAxis(t,e,a,{_id:\"x\",side:z,_trueSide:A,domain:[L/i.w,E/i.w]}),r.angularAxis=r.mockAxis(t,e,o,{side:\"right\",domain:[0,Math.PI],autorange:!1}),r.doAutoRange(t,e),r.updateAngularAxis(t,e),r.updateRadialAxis(t,e),r.updateRadialAxisTitle(t,e),r.xaxis=r.mockCartesianAxis(t,e,{_id:\"x\",domain:y}),r.yaxis=r.mockCartesianAxis(t,e,{_id:\"y\",domain:m});var F=r.pathSubplot();r.clipPaths.forTraces.select(\"path\").attr(\"d\",F).attr(\"transform\",l(O,I)),n.frontplot.attr(\"transform\",l(M,S)).call(c.setClipUrl,r._hasClipOnAxisFalse?null:r.clipIds.forTraces,r.gd),n.bg.attr(\"d\",F).attr(\"transform\",l(C,P)).call(u.fill,e.bgcolor)},N.mockAxis=function(t,e,r,n){var i=o.extendFlat({},r,n);return d(i,e,t),i},N.mockCartesianAxis=function(t,e,r){var n=this,i=n.isSmith,a=r._id,s=o.extendFlat({type:\"linear\"},r);p(s,t);var l={x:[0,2],y:[1,3]};return s.setRange=function(){var t=n.sectorBBox,r=l[a],i=n.radialAxis._rl,o=(i[1]-i[0])/(1-n.getHole(e));s.range=[t[r[0]]*o,t[r[1]]*o]},s.isPtWithinRange=\"x\"!==a||i?function(){return!0}:function(t){return n.isPtInside(t)},s.setRange(),s.setScale(),s},N.doAutoRange=function(t,e){var r=this,n=r.gd,i=r.radialAxis,a=r.getRadial(e);v(n,i);var o=i.range;if(a.range=o.slice(),a._input.range=o.slice(),i._rl=[i.r2l(o[0],null,\"gregorian\"),i.r2l(o[1],null,\"gregorian\")],void 0!==i.minallowed){var s=i.r2l(i.minallowed);i._rl[0]>i._rl[1]?i._rl[1]=Math.max(i._rl[1],s):i._rl[0]=Math.max(i._rl[0],s)}if(void 0!==i.maxallowed){var l=i.r2l(i.maxallowed);i._rl[0]90&&v<=270&&(g.tickangle=180);var x=m?function(t){var e=I(r,C([t.x,0]));return l(e[0]-f,e[1]-p)}:function(t){return l(g.l2p(t.x)+c,0)},b=m?function(t){return O(r,t.x,-1/0,1/0)}:function(t){return r.pathArc(g.r2p(t.x)+c)},_=j(d);if(r.radialTickLayout!==_&&(i[\"radial-axis\"].selectAll(\".xtick\").remove(),r.radialTickLayout=_),y){g.setScale();var w=0,T=m?(g.tickvals||[]).filter((function(t){return t>=0})).map((function(t){return h.tickText(g,t,!0,!1)})):h.calcTicks(g),k=m?T:h.clipEnds(g,T),A=h.getTickSigns(g)[2];m&&((\"top\"===g.ticks&&\"bottom\"===g.side||\"bottom\"===g.ticks&&\"top\"===g.side)&&(A=-A),\"top\"===g.ticks&&\"top\"===g.side&&(w=-g.ticklen),\"bottom\"===g.ticks&&\"bottom\"===g.side&&(w=g.ticklen)),h.drawTicks(n,g,{vals:T,layer:i[\"radial-axis\"],path:h.makeTickPath(g,0,A),transFn:x,crisp:!1}),h.drawGrid(n,g,{vals:k,layer:i[\"radial-grid\"],path:b,transFn:o.noop,crisp:!1}),h.drawLabels(n,g,{vals:T,layer:i[\"radial-axis\"],transFn:x,labelFns:h.makeLabelFns(g,w)})}var M=r.radialAxisAngle=r.vangles?F(U(R(d.angle),r.vangles)):d.angle,S=l(f,p),E=S+s(-M);V(i[\"radial-axis\"],y&&(d.showticklabels||d.ticks),{transform:E}),V(i[\"radial-grid\"],y&&d.showgrid,{transform:m?\"\":S}),V(i[\"radial-line\"].select(\"line\"),y&&d.showline,{x1:m?-a:c,y1:0,x2:a,y2:0,transform:E}).attr(\"stroke-width\",d.linewidth).call(u.stroke,d.linecolor)},N.updateRadialAxisTitle=function(t,e,r){if(!this.isSmith){var n=this,i=n.gd,a=n.radius,o=n.cx,s=n.cy,l=n.getRadial(e),u=n.id+\"title\",f=0;if(l.title){var h=c.bBox(n.layers[\"radial-axis\"].node()).height,p=l.title.font.size,d=l.side;f=\"top\"===d?p:\"counterclockwise\"===d?-(h+.4*p):h+.8*p}var v=void 0!==r?r:n.radialAxisAngle,g=R(v),y=Math.cos(g),m=Math.sin(g),b=o+a/2*y+f*m,_=s-a/2*m+f*y;n.layers[\"radial-axis-title\"]=x.draw(i,u,{propContainer:l,propName:n.id+\".radialaxis.title\",placeholder:z(i,\"Click to enter radial axis title\"),attributes:{x:b,y:_,\"text-anchor\":\"middle\"},transform:{rotate:-v}})}},N.updateAngularAxis=function(t,e){var r=this,n=r.gd,i=r.layers,a=r.radius,c=r.innerRadius,f=r.cx,p=r.cy,d=r.getAngular(e),v=r.angularAxis,g=r.isSmith;g||(r.fillViewInitialKey(\"angularaxis.rotation\",d.rotation),v.setGeometry(),v.setScale());var y=g?function(t){var e=I(r,C([0,t.x]));return Math.atan2(e[0]-f,e[1]-p)-Math.PI/2}:function(t){return v.t2g(t.x)};\"linear\"===v.type&&\"radians\"===v.thetaunit&&(v.tick0=F(v.tick0),v.dtick=F(v.dtick));var m=function(t){return l(f+a*Math.cos(t),p-a*Math.sin(t))},x=g?function(t){var e=I(r,C([0,t.x]));return l(e[0],e[1])}:function(t){return m(y(t))},b=g?function(t){var e=I(r,C([0,t.x])),n=Math.atan2(e[0]-f,e[1]-p)-Math.PI/2;return l(e[0],e[1])+s(-F(n))}:function(t){var e=y(t);return m(e)+s(-F(e))},_=g?function(t){return P(r,t.x,0,1/0)}:function(t){var e=y(t),r=Math.cos(e),n=Math.sin(e);return\"M\"+[f+c*r,p-c*n]+\"L\"+[f+a*r,p-a*n]},w=h.makeLabelFns(v,0).labelStandoff,T={xFn:function(t){var e=y(t);return Math.cos(e)*w},yFn:function(t){var e=y(t),r=Math.sin(e)>0?.2:1;return-Math.sin(e)*(w+t.fontSize*r)+Math.abs(Math.cos(e))*(t.fontSize*M)},anchorFn:function(t){var e=y(t),r=Math.cos(e);return Math.abs(r)<.1?\"middle\":r>0?\"start\":\"end\"},heightFn:function(t,e,r){var n=y(t);return-.5*(1+Math.sin(n))*r}},k=j(d);r.angularTickLayout!==k&&(i[\"angular-axis\"].selectAll(\".\"+v._id+\"tick\").remove(),r.angularTickLayout=k);var A,S=g?[1/0].concat(v.tickvals||[]).map((function(t){return h.tickText(v,t,!0,!1)})):h.calcTicks(v);if(g&&(S[0].text=\"∞\",S[0].fontSize*=1.75),\"linear\"===e.gridshape?(A=S.map(y),o.angleDelta(A[0],A[1])<0&&(A=A.slice().reverse())):A=null,r.vangles=A,\"category\"===v.type&&(S=S.filter((function(t){return o.isAngleInsideSector(y(t),r.sectorInRad)}))),v.visible){var E=\"inside\"===v.ticks?-1:1,L=(v.linewidth||1)/2;h.drawTicks(n,v,{vals:S,layer:i[\"angular-axis\"],path:\"M\"+E*L+\",0h\"+E*v.ticklen,transFn:b,crisp:!1}),h.drawGrid(n,v,{vals:S,layer:i[\"angular-grid\"],path:_,transFn:o.noop,crisp:!1}),h.drawLabels(n,v,{vals:S,layer:i[\"angular-axis\"],repositionOnUpdate:!0,transFn:x,labelFns:T})}V(i[\"angular-line\"].select(\"path\"),d.showline,{d:r.pathSubplot(),transform:l(f,p)}).attr(\"stroke-width\",d.linewidth).call(u.stroke,d.linecolor)},N.updateFx=function(t,e){this.gd._context.staticPlot||(!this.isSmith&&(this.updateAngularDrag(t),this.updateRadialDrag(t,e,0),this.updateRadialDrag(t,e,1)),this.updateHoverAndMainDrag(t))},N.updateHoverAndMainDrag=function(t){var e,r,s=this,u=s.isSmith,c=s.gd,f=s.layers,h=t._zoomlayer,p=S.MINZOOM,d=S.OFFEDGE,v=s.radius,x=s.innerRadius,T=s.cx,k=s.cy,A=s.cxx,M=s.cyy,L=s.sectorInRad,C=s.vangles,P=s.radialAxis,O=E.clampTiny,I=E.findXYatLength,z=E.findEnclosingVertexAngles,D=S.cornerHalfWidth,R=S.cornerLen/2,F=g.makeDragger(f,\"path\",\"maindrag\",!1===t.dragmode?\"none\":\"crosshair\");n.select(F).attr(\"d\",s.pathSubplot()).attr(\"transform\",l(T,k)),F.onmousemove=function(t){m.hover(c,t,s.id),c._fullLayout._lasthover=F,c._fullLayout._hoversubplot=s.id},F.onmouseout=function(t){c._dragging||y.unhover(c,t)};var B,N,j,U,V,q,H,G,W,Y={element:F,gd:c,subplot:s.id,plotinfo:{id:s.id,xaxis:s.xaxis,yaxis:s.yaxis},xaxes:[s.xaxis],yaxes:[s.yaxis]};function X(t,e){return Math.sqrt(t*t+e*e)}function Z(t,e){return X(t-A,e-M)}function K(t,e){return Math.atan2(M-e,t-A)}function J(t,e){return[t*Math.cos(e),t*Math.sin(-e)]}function $(t,e){if(0===t)return s.pathSector(2*D);var r=R/t,n=e-r,i=e+r,a=Math.max(0,Math.min(t,v)),o=a-D,l=a+D;return\"M\"+J(o,n)+\"A\"+[o,o]+\" 0,0,0 \"+J(o,i)+\"L\"+J(l,i)+\"A\"+[l,l]+\" 0,0,1 \"+J(l,n)+\"Z\"}function Q(t,e,r){if(0===t)return s.pathSector(2*D);var n,i,a=J(t,e),o=J(t,r),l=O((a[0]+o[0])/2),u=O((a[1]+o[1])/2);if(l&&u){var c=u/l,f=-1/c,h=I(D,c,l,u);n=I(R,f,h[0][0],h[0][1]),i=I(R,f,h[1][0],h[1][1])}else{var p,d;u?(p=R,d=D):(p=D,d=R),n=[[l-p,u-d],[l+p,u-d]],i=[[l-p,u+d],[l+p,u+d]]}return\"M\"+n.join(\"L\")+\"L\"+i.reverse().join(\"L\")+\"Z\"}function tt(t,e){return e=Math.max(Math.min(e,v),x),tp?(t-1&&1===t&&_(e,c,[s.xaxis],[s.yaxis],s.id,Y),r.indexOf(\"event\")>-1&&m.click(c,e,s.id)}Y.prepFn=function(t,n,a){var l=c._fullLayout.dragmode,f=F.getBoundingClientRect();c._fullLayout._calcInverseTransform(c);var p=c._fullLayout._invTransform;e=c._fullLayout._invScaleX,r=c._fullLayout._invScaleY;var d=o.apply3DTransform(p)(n-f.left,a-f.top);if(B=d[0],N=d[1],C){var y=E.findPolygonOffset(v,L[0],L[1],C);B+=A+y[0],N+=M+y[1]}switch(l){case\"zoom\":Y.clickFn=st,u||(Y.moveFn=C?it:rt,Y.doneFn=at,function(){j=null,U=null,V=s.pathSubplot(),q=!1;var t=c._fullLayout[s.id];H=i(t.bgcolor).getLuminance(),(G=g.makeZoombox(h,H,T,k,V)).attr(\"fill-rule\",\"evenodd\"),W=g.makeCorners(h,T,k),w(c)}());break;case\"select\":case\"lasso\":b(t,n,a,Y,l)}},y.init(Y)},N.updateRadialDrag=function(t,e,r){var i=this,u=i.gd,c=i.layers,f=i.radius,h=i.innerRadius,p=i.cx,d=i.cy,v=i.radialAxis,m=S.radialDragBoxSize,x=m/2;if(v.visible){var b,_,T,M=R(i.radialAxisAngle),E=v._rl,L=E[0],C=E[1],P=E[r],O=.75*(E[1]-E[0])/(1-i.getHole(e))/f;r?(b=p+(f+x)*Math.cos(M),_=d-(f+x)*Math.sin(M),T=\"radialdrag\"):(b=p+(h-x)*Math.cos(M),_=d-(h-x)*Math.sin(M),T=\"radialdrag-inner\");var I,z,D,B=g.makeRectDragger(c,T,\"crosshair\",-x,-x,m,m),N={element:B,gd:u};!1===t.dragmode&&(N.dragmode=!1),V(n.select(B),v.visible&&h0==(r?D>L:Dn?function(t){return t<=0}:function(t){return t>=0};t.c2g=function(r){var n=t.c2l(r)-e;return(s(n)?n:0)+o},t.g2c=function(r){return t.l2c(r+e-o)},t.g2p=function(t){return t*a},t.c2p=function(e){return t.g2p(t.c2g(e))}}}(t,e);break;case\"angularaxis\":!function(t,e){var r=t.type;if(\"linear\"===r){var i=t.d2c,s=t.c2d;t.d2c=function(t,e){return function(t,e){return\"degrees\"===e?a(t):t}(i(t),e)},t.c2d=function(t,e){return s(function(t,e){return\"degrees\"===e?o(t):t}(t,e))}}t.makeCalcdata=function(e,r){var n,i,a=e[r],o=e._length,s=function(r){return t.d2c(r,e.thetaunit)};if(a)for(n=new Array(o),i=0;i0?1:0}function r(t){var e=t[0],r=t[1];if(!isFinite(e)||!isFinite(r))return[1,0];var n=(e+1)*(e+1)+r*r;return[(e*e+r*r-1)/n,2*r/n]}function n(t,e){var r=e[0],n=e[1];return[r*t.radius+t.cx,-n*t.radius+t.cy]}function i(t,e){return e*t.radius}t.exports={smith:r,reactanceArc:function(t,e,a,o){var s=n(t,r([a,e])),l=s[0],u=s[1],c=n(t,r([o,e])),f=c[0],h=c[1];if(0===e)return[\"M\"+l+\",\"+u,\"L\"+f+\",\"+h].join(\" \");var p=i(t,1/Math.abs(e));return[\"M\"+l+\",\"+u,\"A\"+p+\",\"+p+\" 0 0,\"+(e<0?1:0)+\" \"+f+\",\"+h].join(\" \")},resistanceArc:function(t,a,o,s){var l=i(t,1/(a+1)),u=n(t,r([a,o])),c=u[0],f=u[1],h=n(t,r([a,s])),p=h[0],d=h[1];if(e(o)!==e(s)){var v=n(t,r([a,0]));return[\"M\"+c+\",\"+f,\"A\"+l+\",\"+l+\" 0 0,\"+(00){for(var n=[],i=0;i=c&&(h.min=0,d.min=0,g.min=0,t.aaxis&&delete t.aaxis.min,t.baxis&&delete t.baxis.min,t.caxis&&delete t.caxis.min)}function v(t,e,r,n){var i=h[e._name];function o(r,n){return a.coerce(t,e,i,r,n)}o(\"uirevision\",n.uirevision),e.type=\"linear\";var p=o(\"color\"),d=p!==i.color.dflt?p:r.font.color,v=e._name.charAt(0).toUpperCase(),g=\"Component \"+v,y=o(\"title.text\",g);e._hovertitle=y===g?y:v,a.coerceFont(o,\"title.font\",{weight:r.font.weight,style:r.font.style,variant:r.font.variant,family:r.font.family,size:a.bigFont(r.font.size),color:d}),o(\"min\"),c(t,e,o,\"linear\"),l(t,e,o,\"linear\"),s(t,e,o,\"linear\",{noAutotickangles:!0}),u(t,e,o,{outerTicks:!0}),o(\"showticklabels\")&&(a.coerceFont(o,\"tickfont\",{weight:r.font.weight,style:r.font.style,variant:r.font.variant,family:r.font.family,size:r.font.size,color:d}),o(\"tickangle\"),o(\"tickformat\")),f(t,e,o,{dfltColor:p,bgColor:r.bgColor,blend:60,showLine:!0,showGrid:!0,noZeroLine:!0,attributes:i}),o(\"hoverformat\"),o(\"layer\")}t.exports=function(t,e,r){o(t,e,r,{type:\"ternary\",attributes:h,handleDefaults:d,font:e.font,paper_bgcolor:e.paper_bgcolor})}},24696:function(t,e,r){\"use strict\";var n=r(33428),i=r(49760),a=r(24040),o=r(3400),s=o.strTranslate,l=o._,u=r(76308),c=r(43616),f=r(78344),h=r(92880).extendFlat,p=r(7316),d=r(54460),v=r(86476),g=r(93024),y=r(72760),m=y.freeMode,x=y.rectMode,b=r(81668),_=r(22676).prepSelect,w=r(22676).selectOnClick,T=r(22676).clearOutline,k=r(22676).clearSelectionsCache,A=r(33816);function M(t,e){this.id=t.id,this.graphDiv=t.graphDiv,this.init(e),this.makeFramework(e),this.aTickLayout=null,this.bTickLayout=null,this.cTickLayout=null}t.exports=M;var S=M.prototype;S.init=function(t){this.container=t._ternarylayer,this.defs=t._defs,this.layoutId=t._uid,this.traceHash={},this.layers={}},S.plot=function(t,e){var r=this,n=e[r.id],i=e._size;r._hasClipOnAxisFalse=!1;for(var a=0;aE*b?i=(a=b)*E:a=(i=x)/E,o=y*i/x,l=m*a/b,r=e.l+e.w*v-i/2,n=e.t+e.h*(1-g)-a/2,p.x0=r,p.y0=n,p.w=i,p.h=a,p.sum=_,p.xaxis={type:\"linear\",range:[w+2*k-_,_-w-2*T],domain:[v-o/2,v+o/2],_id:\"x\"},f(p.xaxis,p.graphDiv._fullLayout),p.xaxis.setScale(),p.xaxis.isPtWithinRange=function(t){return t.a>=p.aaxis.range[0]&&t.a<=p.aaxis.range[1]&&t.b>=p.baxis.range[1]&&t.b<=p.baxis.range[0]&&t.c>=p.caxis.range[1]&&t.c<=p.caxis.range[0]},p.yaxis={type:\"linear\",range:[w,_-T-k],domain:[g-l/2,g+l/2],_id:\"y\"},f(p.yaxis,p.graphDiv._fullLayout),p.yaxis.setScale(),p.yaxis.isPtWithinRange=function(){return!0};var A=p.yaxis.domain[0],M=p.aaxis=h({},t.aaxis,{range:[w,_-T-k],side:\"left\",tickangle:(+t.aaxis.tickangle||0)-30,domain:[A,A+l*E],anchor:\"free\",position:0,_id:\"y\",_length:i});f(M,p.graphDiv._fullLayout),M.setScale();var S=p.baxis=h({},t.baxis,{range:[_-w-k,T],side:\"bottom\",domain:p.xaxis.domain,anchor:\"free\",position:0,_id:\"x\",_length:i});f(S,p.graphDiv._fullLayout),S.setScale();var L=p.caxis=h({},t.caxis,{range:[_-w-T,k],side:\"right\",tickangle:(+t.caxis.tickangle||0)+30,domain:[A,A+l*E],anchor:\"free\",position:0,_id:\"y\",_length:i});f(L,p.graphDiv._fullLayout),L.setScale();var C=\"M\"+r+\",\"+(n+a)+\"h\"+i+\"l-\"+i/2+\",-\"+a+\"Z\";p.clipDef.select(\"path\").attr(\"d\",C),p.layers.plotbg.select(\"path\").attr(\"d\",C);var P=\"M0,\"+a+\"h\"+i+\"l-\"+i/2+\",-\"+a+\"Z\";p.clipDefRelative.select(\"path\").attr(\"d\",P);var O=s(r,n);p.plotContainer.selectAll(\".scatterlayer,.maplayer\").attr(\"transform\",O),p.clipDefRelative.select(\"path\").attr(\"transform\",null);var I=s(r-S._offset,n+a);p.layers.baxis.attr(\"transform\",I),p.layers.bgrid.attr(\"transform\",I);var z=s(r+i/2,n)+\"rotate(30)\"+s(0,-M._offset);p.layers.aaxis.attr(\"transform\",z),p.layers.agrid.attr(\"transform\",z);var D=s(r+i/2,n)+\"rotate(-30)\"+s(0,-L._offset);p.layers.caxis.attr(\"transform\",D),p.layers.cgrid.attr(\"transform\",D),p.drawAxes(!0),p.layers.aline.select(\"path\").attr(\"d\",M.showline?\"M\"+r+\",\"+(n+a)+\"l\"+i/2+\",-\"+a:\"M0,0\").call(u.stroke,M.linecolor||\"#000\").style(\"stroke-width\",(M.linewidth||0)+\"px\"),p.layers.bline.select(\"path\").attr(\"d\",S.showline?\"M\"+r+\",\"+(n+a)+\"h\"+i:\"M0,0\").call(u.stroke,S.linecolor||\"#000\").style(\"stroke-width\",(S.linewidth||0)+\"px\"),p.layers.cline.select(\"path\").attr(\"d\",L.showline?\"M\"+(r+i/2)+\",\"+n+\"l\"+i/2+\",\"+a:\"M0,0\").call(u.stroke,L.linecolor||\"#000\").style(\"stroke-width\",(L.linewidth||0)+\"px\"),p.graphDiv._context.staticPlot||p.initInteractions(),c.setClipUrl(p.layers.frontplot,p._hasClipOnAxisFalse?null:p.clipId,p.graphDiv)},S.drawAxes=function(t){var e=this,r=e.graphDiv,n=e.id.substr(7)+\"title\",i=e.layers,a=e.aaxis,o=e.baxis,s=e.caxis;if(e.drawAx(a),e.drawAx(o),e.drawAx(s),t){var u=Math.max(a.showticklabels?a.tickfont.size/2:0,(s.showticklabels?.75*s.tickfont.size:0)+(\"outside\"===s.ticks?.87*s.ticklen:0)),c=(o.showticklabels?o.tickfont.size:0)+(\"outside\"===o.ticks?o.ticklen:0)+3;i[\"a-title\"]=b.draw(r,\"a\"+n,{propContainer:a,propName:e.id+\".aaxis.title\",placeholder:l(r,\"Click to enter Component A title\"),attributes:{x:e.x0+e.w/2,y:e.y0-a.title.font.size/3-u,\"text-anchor\":\"middle\"}}),i[\"b-title\"]=b.draw(r,\"b\"+n,{propContainer:o,propName:e.id+\".baxis.title\",placeholder:l(r,\"Click to enter Component B title\"),attributes:{x:e.x0-c,y:e.y0+e.h+.83*o.title.font.size+c,\"text-anchor\":\"middle\"}}),i[\"c-title\"]=b.draw(r,\"c\"+n,{propContainer:s,propName:e.id+\".caxis.title\",placeholder:l(r,\"Click to enter Component C title\"),attributes:{x:e.x0+e.w+c,y:e.y0+e.h+.83*s.title.font.size+c,\"text-anchor\":\"middle\"}})}},S.drawAx=function(t){var e,r=this,n=r.graphDiv,i=t._name,a=i.charAt(0),s=t._id,l=r.layers[i],u=a+\"tickLayout\",c=(e=t).ticks+String(e.ticklen)+String(e.showticklabels);r[u]!==c&&(l.selectAll(\".\"+s+\"tick\").remove(),r[u]=c),t.setScale();var f=d.calcTicks(t),h=d.clipEnds(t,f),p=d.makeTransTickFn(t),v=d.getTickSigns(t)[2],g=o.deg2rad(30),y=v*(t.linewidth||1)/2,m=v*t.ticklen,x=r.w,b=r.h,_=\"b\"===a?\"M0,\"+y+\"l\"+Math.sin(g)*m+\",\"+Math.cos(g)*m:\"M\"+y+\",0l\"+Math.cos(g)*m+\",\"+-Math.sin(g)*m,w={a:\"M0,0l\"+b+\",-\"+x/2,b:\"M0,0l-\"+x/2+\",-\"+b,c:\"M0,0l-\"+b+\",\"+x/2}[a];d.drawTicks(n,t,{vals:\"inside\"===t.ticks?h:f,layer:l,path:_,transFn:p,crisp:!1}),d.drawGrid(n,t,{vals:h,layer:r.layers[a+\"grid\"],path:w,transFn:p,crisp:!1}),d.drawLabels(n,t,{vals:f,layer:l,transFn:p,labelFns:d.makeLabelFns(t,0,30)})};var L=A.MINZOOM/2+.87,C=\"m-0.87,.5h\"+L+\"v3h-\"+(L+5.2)+\"l\"+(L/2+2.6)+\",-\"+(.87*L+4.5)+\"l2.6,1.5l-\"+L/2+\",\"+.87*L+\"Z\",P=\"m0.87,.5h-\"+L+\"v3h\"+(L+5.2)+\"l-\"+(L/2+2.6)+\",-\"+(.87*L+4.5)+\"l-2.6,1.5l\"+L/2+\",\"+.87*L+\"Z\",O=\"m0,1l\"+L/2+\",\"+.87*L+\"l2.6,-1.5l-\"+(L/2+2.6)+\",-\"+(.87*L+4.5)+\"l-\"+(L/2+2.6)+\",\"+(.87*L+4.5)+\"l2.6,1.5l\"+L/2+\",-\"+.87*L+\"Z\",I=!0;function z(t){n.select(t).selectAll(\".zoombox,.js-zoombox-backdrop,.js-zoombox-menu,.zoombox-corners\").remove()}S.clearOutline=function(){k(this.dragOptions),T(this.dragOptions.gd)},S.initInteractions=function(){var t,e,r,n,f,h,p,d,y,b,T,k,M=this,S=M.layers.plotbg.select(\"path\").node(),L=M.graphDiv,D=L._fullLayout._zoomlayer;function R(t){var e={};return e[M.id+\".aaxis.min\"]=t.a,e[M.id+\".baxis.min\"]=t.b,e[M.id+\".caxis.min\"]=t.c,e}function F(t,e){var r=L._fullLayout.clickmode;z(L),2===t&&(L.emit(\"plotly_doubleclick\",null),a.call(\"_guiRelayout\",L,R({a:0,b:0,c:0}))),r.indexOf(\"select\")>-1&&1===t&&w(e,L,[M.xaxis],[M.yaxis],M.id,M.dragOptions),r.indexOf(\"event\")>-1&&g.click(L,e,M.id)}function B(t,e){return 1-e/M.h}function N(t,e){return 1-(t+(M.h-e)/Math.sqrt(3))/M.w}function j(t,e){return(t-(M.h-e)/Math.sqrt(3))/M.w}function U(i,a){var o=r+i*t,s=n+a*e,l=Math.max(0,Math.min(1,B(0,n),B(0,s))),u=Math.max(0,Math.min(1,N(r,n),N(o,s))),c=Math.max(0,Math.min(1,j(r,n),j(o,s))),v=(l/2+c)*M.w,g=(1-l/2-u)*M.w,m=(v+g)/2,x=g-v,_=(1-l)*M.h,w=_-x/E;x.2?\"rgba(0,0,0,0.4)\":\"rgba(255,255,255,0.3)\").duration(200),k.transition().style(\"opacity\",1).duration(200),b=!0),L.emit(\"plotly_relayouting\",R(p))}function V(){z(L),p!==f&&(a.call(\"_guiRelayout\",L,R(p)),I&&L.data&&L._context.showTips&&(o.notifier(l(L,\"Double-click to zoom back out\"),\"long\"),I=!1))}function q(t,e){var r=t/M.xaxis._m,n=e/M.yaxis._m,i=[(p={a:f.a-n,b:f.b+(r+n)/2,c:f.c-(r-n)/2}).a,p.b,p.c].sort(o.sorterAsc),a=i.indexOf(p.a),l=i.indexOf(p.b),u=i.indexOf(p.c);i[0]<0&&(i[1]+i[0]/2<0?(i[2]+=i[0]+i[1],i[0]=i[1]=0):(i[2]+=i[0]/2,i[1]+=i[0]/2,i[0]=0),p={a:i[a],b:i[l],c:i[u]},e=(f.a-p.a)*M.yaxis._m,t=(f.c-p.c-f.b+p.b)*M.xaxis._m);var h=s(M.x0+t,M.y0+e);M.plotContainer.selectAll(\".scatterlayer,.maplayer\").attr(\"transform\",h);var d=s(-t,-e);M.clipDefRelative.select(\"path\").attr(\"transform\",d),M.aaxis.range=[p.a,M.sum-p.b-p.c],M.baxis.range=[M.sum-p.a-p.c,p.b],M.caxis.range=[M.sum-p.a-p.b,p.c],M.drawAxes(!1),M._hasClipOnAxisFalse&&M.plotContainer.select(\".scatterlayer\").selectAll(\".trace\").call(c.hideOutsideRangePoints,M),L.emit(\"plotly_relayouting\",R(p))}function H(){a.call(\"_guiRelayout\",L,R(p))}this.dragOptions={element:S,gd:L,plotinfo:{id:M.id,domain:L._fullLayout[M.id].domain,xaxis:M.xaxis,yaxis:M.yaxis},subplot:M.id,prepFn:function(a,l,c){M.dragOptions.xaxes=[M.xaxis],M.dragOptions.yaxes=[M.yaxis],t=L._fullLayout._invScaleX,e=L._fullLayout._invScaleY;var v=M.dragOptions.dragmode=L._fullLayout.dragmode;m(v)?M.dragOptions.minDrag=1:M.dragOptions.minDrag=void 0,\"zoom\"===v?(M.dragOptions.moveFn=U,M.dragOptions.clickFn=F,M.dragOptions.doneFn=V,function(t,e,a){var l=S.getBoundingClientRect();r=e-l.left,n=a-l.top,L._fullLayout._calcInverseTransform(L);var c=L._fullLayout._invTransform,v=o.apply3DTransform(c)(r,n);r=v[0],n=v[1],f={a:M.aaxis.range[0],b:M.baxis.range[1],c:M.caxis.range[1]},p=f,h=M.aaxis.range[1]-f.a,d=i(M.graphDiv._fullLayout[M.id].bgcolor).getLuminance(),y=\"M0,\"+M.h+\"L\"+M.w/2+\", 0L\"+M.w+\",\"+M.h+\"Z\",b=!1,T=D.append(\"path\").attr(\"class\",\"zoombox\").attr(\"transform\",s(M.x0,M.y0)).style({fill:d>.2?\"rgba(0,0,0,0)\":\"rgba(255,255,255,0)\",\"stroke-width\":0}).attr(\"d\",y),k=D.append(\"path\").attr(\"class\",\"zoombox-corners\").attr(\"transform\",s(M.x0,M.y0)).style({fill:u.background,stroke:u.defaultLine,\"stroke-width\":1,opacity:0}).attr(\"d\",\"M0,0Z\"),M.clearOutline(L)}(0,l,c)):\"pan\"===v?(M.dragOptions.moveFn=q,M.dragOptions.clickFn=F,M.dragOptions.doneFn=H,f={a:M.aaxis.range[0],b:M.baxis.range[1],c:M.caxis.range[1]},p=f,M.clearOutline(L)):(x(v)||m(v))&&_(a,l,c,M.dragOptions,v)}},S.onmousemove=function(t){g.hover(L,t,M.id),L._fullLayout._lasthover=S,L._fullLayout._hoversubplot=M.id},S.onmouseout=function(t){L._dragging||v.unhover(L,t)},v.init(this.dragOptions)}},24040:function(t,e,r){\"use strict\";var n=r(24248),i=r(16628),a=r(52416),o=r(63620),s=r(52200).addStyleRule,l=r(92880),u=r(45464),c=r(64859),f=l.extendFlat,h=l.extendDeepAll;function p(t){var r=t.name,i=t.categories,a=t.meta;if(e.modules[r])n.log(\"Type \"+r+\" already registered\");else{e.subplotsRegistry[t.basePlotModule.name]||function(t){var r=t.name;if(e.subplotsRegistry[r])n.log(\"Plot type \"+r+\" already registered.\");else for(var i in y(t),e.subplotsRegistry[r]=t,e.componentsRegistry)b(i,t.name)}(t.basePlotModule);for(var o={},l=0;l-1&&(f[p[r]].title={text:\"\"});for(r=0;r\")?\"\":e.html(t).text()}));return e.remove(),r}(w)).replace(/&(?!\\w+;|\\#[0-9]+;| \\#x[0-9A-F]+;)/g,\"&\")).replace(c,\"'\"),i.isIE()&&(w=(w=(w=w.replace(/\"/gi,\"'\")).replace(/(\\('#)([^']*)('\\))/gi,'(\"#$2\")')).replace(/(\\\\')/gi,'\"')),w}},84664:function(t,e,r){\"use strict\";var n=r(3400);t.exports=function(t,e){for(var r=0;rf+u||!n(c))}for(var p=0;p=0)return t}else if(\"string\"==typeof t&&\"%\"===(t=t.trim()).slice(-1)&&n(t.slice(0,-1))&&(t=+t.slice(0,-1))>=0)return t+\"%\"}function d(t,e,r,n,a,o){var s=!(!1===(o=o||{}).moduleHasSelected),l=!(!1===o.moduleHasUnselected),u=!(!1===o.moduleHasConstrain),c=!(!1===o.moduleHasCliponaxis),f=!(!1===o.moduleHasTextangle),p=!(!1===o.moduleHasInsideanchor),d=!!o.hasPathbar,v=Array.isArray(a)||\"auto\"===a,g=v||\"inside\"===a,y=v||\"outside\"===a;if(g||y){var m=h(n,\"textfont\",r.font),x=i.extendFlat({},m),b=!(t.textfont&&t.textfont.color);if(b&&delete x.color,h(n,\"insidetextfont\",x),d){var _=i.extendFlat({},m);b&&delete _.color,h(n,\"pathbar.textfont\",_)}y&&h(n,\"outsidetextfont\",m),s&&n(\"selected.textfont.color\"),l&&n(\"unselected.textfont.color\"),u&&n(\"constraintext\"),c&&n(\"cliponaxis\"),f&&n(\"textangle\"),n(\"texttemplate\")}g&&p&&n(\"insidetextanchor\")}t.exports={supplyDefaults:function(t,e,r,n){function c(r,n){return i.coerce(t,e,f,r,n)}if(s(t,e,n,c)){l(t,e,n,c),c(\"xhoverformat\"),c(\"yhoverformat\"),c(\"zorder\"),c(\"orientation\",e.x&&!e.y?\"h\":\"v\"),c(\"base\"),c(\"offset\"),c(\"width\"),c(\"text\"),c(\"hovertext\"),c(\"hovertemplate\");var h=c(\"textposition\");d(t,0,n,c,h,{moduleHasSelected:!0,moduleHasUnselected:!0,moduleHasConstrain:!0,moduleHasCliponaxis:!0,moduleHasTextangle:!0,moduleHasInsideanchor:!0}),u(t,e,c,r,n);var p=(e.marker.line||{}).color,v=o.getComponentMethod(\"errorbars\",\"supplyDefaults\");v(t,e,p||a.defaultLine,{axis:\"y\"}),v(t,e,p||a.defaultLine,{axis:\"x\",inherit:\"y\"}),i.coerceSelectionMarkerOpacity(e,c)}else e.visible=!1},crossTraceDefaults:function(t,e){var r,n;function a(t,e){return i.coerce(n._input,n,f,t,e)}for(var o=0;oa))return e}return void 0!==r?r:t.dflt},e.coerceColor=function(t,e,r){return i(e).isValid()?e:void 0!==r?r:t.dflt},e.coerceEnumerated=function(t,e,r){return t.coerceNumber&&(e=+e),-1!==t.values.indexOf(e)?e:void 0!==r?r:t.dflt},e.getValue=function(t,e){var r;return a(t)?e0?e+=r:c<0&&(e-=r)}return e}function z(t){var e=c,r=t.b,i=I(t);return n.inbox(r-e,i-e,_+(i-e)/(i-r)-1)}var D=t[f+\"a\"],R=t[h+\"a\"];v=Math.abs(D.r2c(D.range[1])-D.r2c(D.range[0]));var F=n.getDistanceFunction(i,p,d,(function(t){return(p(t)+d(t))/2}));if(n.getClosest(g,F,t),!1!==t.index&&g[t.index].p!==u){k||(L=function(t){return Math.min(A(t),t.p-m.bargroupwidth/2)},C=function(t){return Math.max(M(t),t.p+m.bargroupwidth/2)});var B=g[t.index],N=y.base?B.b+B.s:B.s;t[h+\"0\"]=t[h+\"1\"]=R.c2p(B[h],!0),t[h+\"LabelVal\"]=N;var j=m.extents[m.extents.round(B.p)];t[f+\"0\"]=D.c2p(x?L(B):j[0],!0),t[f+\"1\"]=D.c2p(x?C(B):j[1],!0);var U=void 0!==B.orig_p;return t[f+\"LabelVal\"]=U?B.orig_p:B.p,t.labelLabel=l(D,t[f+\"LabelVal\"],y[f+\"hoverformat\"]),t.valueLabel=l(R,t[h+\"LabelVal\"],y[h+\"hoverformat\"]),t.baseLabel=l(R,B.b,y[h+\"hoverformat\"]),t.spikeDistance=(function(t){var e=c,r=t.b,i=I(t);return n.inbox(r-e,i-e,w+(i-e)/(i-r)-1)}(B)+function(t){return P(A(t),M(t),w)}(B))/2,t[f+\"Spike\"]=D.c2p(B.p,!0),o(B,y,t),t.hovertemplate=y.hovertemplate,t}}function f(t,e){var r=e.mcc||t.marker.color,n=e.mlcc||t.marker.line.color,i=s(t,e);return a.opacity(r)?r:a.opacity(n)&&i?n:void 0}t.exports={hoverPoints:function(t,e,r,n,a){var o=c(t,e,r,n,a);if(o){var s=o.cd,l=s[0].trace,u=s[o.index];return o.color=f(l,u),i.getComponentMethod(\"errorbars\",\"hoverInfo\")(u,l,o),[o]}},hoverOnBars:c,getTraceColor:f}},51132:function(t,e,r){\"use strict\";t.exports={attributes:r(20832),layoutAttributes:r(39324),supplyDefaults:r(31508).supplyDefaults,crossTraceDefaults:r(31508).crossTraceDefaults,supplyLayoutDefaults:r(37156),calc:r(71820),crossTraceCalc:r(96376).crossTraceCalc,colorbar:r(5528),arraysToCalcdata:r(84664),plot:r(98184).plot,style:r(60100).style,styleOnSelect:r(60100).styleOnSelect,hoverPoints:r(63400).hoverPoints,eventData:r(52160),selectPoints:r(45784),moduleType:\"trace\",name:\"bar\",basePlotModule:r(57952),categories:[\"bar-like\",\"cartesian\",\"svg\",\"bar\",\"oriented\",\"errorBarsOK\",\"showLegend\",\"zoomScale\"],animatable:!0,meta:{}}},39324:function(t){\"use strict\";t.exports={barmode:{valType:\"enumerated\",values:[\"stack\",\"group\",\"overlay\",\"relative\"],dflt:\"group\",editType:\"calc\"},barnorm:{valType:\"enumerated\",values:[\"\",\"fraction\",\"percent\"],dflt:\"\",editType:\"calc\"},bargap:{valType:\"number\",min:0,max:1,editType:\"calc\"},bargroupgap:{valType:\"number\",min:0,max:1,dflt:0,editType:\"calc\"},barcornerradius:{valType:\"any\",editType:\"calc\"}}},37156:function(t,e,r){\"use strict\";var n=r(24040),i=r(54460),a=r(3400),o=r(39324),s=r(31508).validateCornerradius;t.exports=function(t,e,r){function l(r,n){return a.coerce(t,e,o,r,n)}for(var u=!1,c=!1,f=!1,h={},p=l(\"barmode\"),d=0;d0)-(t<0)}function A(t,e){return t0}function E(t,e,r,n,i){return!(t<0||e<0)&&(r<=t&&n<=e||r<=e&&n<=t||(i?t>=r*(e/n):e>=n*(t/r)))}function L(t){return\"auto\"===t?0:t}function C(t,e){var r=Math.PI/180*e,n=Math.abs(Math.sin(r)),i=Math.abs(Math.cos(r));return{x:t.width*i+t.height*n,y:t.width*n+t.height*i}}function P(t,e,r,n,i,a){var o=!!a.isHorizontal,s=!!a.constrained,l=a.angle||0,u=a.anchor,c=\"end\"===u,f=\"start\"===u,h=((a.leftToRight||0)+1)/2,p=1-h,d=a.hasB,v=a.r,g=a.overhead,y=i.width,m=i.height,x=Math.abs(e-t),b=Math.abs(n-r),w=x>2*_&&b>2*_?_:0;x-=2*w,b-=2*w;var T=L(l);\"auto\"!==l||y<=x&&m<=b||!(y>x||m>b)||(y>b||m>x)&&y_){var E=function(t,e,r,n,i,a,o,s,l){var u,c,f,h,p=Math.max(0,Math.abs(e-t)-2*_),d=Math.max(0,Math.abs(n-r)-2*_),v=a-_,g=o?v-Math.sqrt(v*v-(v-o)*(v-o)):v,y=l?2*v:s?v-o:2*g,m=l?2*v:s?2*g:v-o;return i.y/i.x>=d/(p-y)?h=d/i.y:i.y/i.x<=(d-m)/p?h=p/i.x:!l&&s?(u=i.x*i.x+i.y*i.y/4,f=(p-v)*(p-v)+(d/2-v)*(d/2-v)-v*v,h=(-(c=-2*i.x*(p-v)-i.y*(d/2-v))+Math.sqrt(c*c-4*u*f))/(2*u)):l?(u=(i.x*i.x+i.y*i.y)/4,f=(p/2-v)*(p/2-v)+(d/2-v)*(d/2-v)-v*v,h=(-(c=-i.x*(p/2-v)-i.y*(d/2-v))+Math.sqrt(c*c-4*u*f))/(2*u)):(u=i.x*i.x/4+i.y*i.y,f=(p/2-v)*(p/2-v)+(d-v)*(d-v)-v*v,h=(-(c=-i.x*(p/2-v)-2*i.y*(d-v))+Math.sqrt(c*c-4*u*f))/(2*u)),{scale:h=Math.min(1,h),pad:s?Math.max(0,v-Math.sqrt(Math.max(0,v*v-(v-(d-i.y*h)/2)*(v-(d-i.y*h)/2)))-o):Math.max(0,v-Math.sqrt(Math.max(0,v*v-(v-(p-i.x*h)/2)*(v-(p-i.x*h)/2)))-o)}}(t,e,r,n,S,v,g,o,d);k=E.scale,M=E.pad}else k=1,s&&(k=Math.min(1,x/S.x,b/S.y)),M=0;var P=i.left*p+i.right*h,O=(i.top+i.bottom)/2,I=(t+_)*p+(e-_)*h,z=(r+n)/2,D=0,R=0;if(f||c){var F=(o?S.x:S.y)/2;v&&(c||d)&&(w+=M);var B=o?A(t,e):A(r,n);o?f?(I=t+B*w,D=-B*F):(I=e-B*w,D=B*F):f?(z=r+B*w,R=-B*F):(z=n-B*w,R=B*F)}return{textX:P,textY:O,targetX:I,targetY:z,anchorX:D,anchorY:R,scale:k,rotate:T}}t.exports={plot:function(t,e,r,f,g,y){var w=e.xaxis,O=e.yaxis,I=t._fullLayout,z=t._context.staticPlot;g||(g={mode:I.barmode,norm:I.barmode,gap:I.bargap,groupgap:I.bargroupgap},p(\"bar\",I));var D=a.makeTraceGroups(f,r,\"trace bars\").each((function(r){var u=n.select(this),f=r[0].trace,p=r[0].t,D=\"waterfall\"===f.type,R=\"funnel\"===f.type,F=\"histogram\"===f.type,B=\"bar\"===f.type,N=B||R,j=0;D&&f.connector.visible&&\"between\"===f.connector.mode&&(j=f.connector.line.width/2);var U=\"h\"===f.orientation,V=S(g),q=a.ensureSingle(u,\"g\",\"points\"),H=T(f),G=q.selectAll(\"g.point\").data(a.identity,H);G.enter().append(\"g\").classed(\"point\",!0),G.exit().remove(),G.each((function(u,T){var S,D,R=n.select(this),q=function(t,e,r,n){var i=[],a=[],o=n?e:r,s=n?r:e;return i[0]=o.c2p(t.s0,!0),a[0]=s.c2p(t.p0,!0),i[1]=o.c2p(t.s1,!0),a[1]=s.c2p(t.p1,!0),n?[i,a]:[a,i]}(u,w,O,U),H=q[0][0],G=q[0][1],W=q[1][0],Y=q[1][1],X=0==(U?G-H:Y-W);if(X&&N&&v.getLineWidth(f,u)&&(X=!1),X||(X=!(i(H)&&i(G)&&i(W)&&i(Y))),u.isBlank=X,X&&(U?G=H:Y=W),j&&!X&&(U?(H-=A(H,G)*j,G+=A(H,G)*j):(W-=A(W,Y)*j,Y+=A(W,Y)*j)),\"waterfall\"===f.type){if(!X){var Z=f[u.dir].marker;S=Z.line.width,D=Z.color}}else S=v.getLineWidth(f,u),D=u.mc||f.marker.color;function K(t){var e=n.round(S/2%1,2);return 0===g.gap&&0===g.groupgap?n.round(Math.round(t)-e,2):t}var J=s.opacity(D)<1||S>.01?K:function(t,e,r){return r&&t===e?t:Math.abs(t-e)>=2?K(t):t>e?Math.ceil(t):Math.floor(t)};t._context.staticPlot||(H=J(H,G,U),G=J(G,H,U),W=J(W,Y,!U),Y=J(Y,W,!U));var $,Q=U?w.c2p:O.c2p;$=u.s0>0?u._sMax:u.s0<0?u._sMin:u.s1>0?u._sMax:u._sMin;var tt,et,rt=B||F?function(t,e){if(!t)return 0;var r,n=U?Math.abs(Y-W):Math.abs(G-H),i=U?Math.abs(G-H):Math.abs(Y-W),a=J(Math.abs(Q($,!0)-Q(0,!0))),o=u.hasB?Math.min(n/2,i/2):Math.min(n/2,a);return r=\"%\"===e?n*(Math.min(50,t)/100):t,J(Math.max(Math.min(r,o),0))}(p.cornerradiusvalue,p.cornerradiusform):0,nt=\"M\"+H+\",\"+W+\"V\"+Y+\"H\"+G+\"V\"+W+\"Z\",it=0;if(rt&&u.s){var at=0===k(u.s0)||k(u.s)===k(u.s0)?u.s1:u.s0;if((it=J(u.hasB?0:Math.abs(Q($,!0)-Q(at,!0))))0?Math.sqrt(it*(2*rt-it)):0,ft=ot>0?Math.max:Math.min;tt=\"M\"+H+\",\"+W+\"V\"+(Y-ut*st)+\"H\"+ft(G-(rt-it)*ot,H)+\"A \"+rt+\",\"+rt+\" 0 0 \"+lt+\" \"+G+\",\"+(Y-rt*st-ct)+\"V\"+(W+rt*st+ct)+\"A \"+rt+\",\"+rt+\" 0 0 \"+lt+\" \"+ft(G-(rt-it)*ot,H)+\",\"+(W+ut*st)+\"Z\"}else if(u.hasB)tt=\"M\"+(H+rt*ot)+\",\"+W+\"A \"+rt+\",\"+rt+\" 0 0 \"+lt+\" \"+H+\",\"+(W+rt*st)+\"V\"+(Y-rt*st)+\"A \"+rt+\",\"+rt+\" 0 0 \"+lt+\" \"+(H+rt*ot)+\",\"+Y+\"H\"+(G-rt*ot)+\"A \"+rt+\",\"+rt+\" 0 0 \"+lt+\" \"+G+\",\"+(Y-rt*st)+\"V\"+(W+rt*st)+\"A \"+rt+\",\"+rt+\" 0 0 \"+lt+\" \"+(G-rt*ot)+\",\"+W+\"Z\";else{var ht=(et=Math.abs(Y-W)+it)0?Math.sqrt(it*(2*rt-it)):0,dt=st>0?Math.max:Math.min;tt=\"M\"+(H+ht*ot)+\",\"+W+\"V\"+dt(Y-(rt-it)*st,W)+\"A \"+rt+\",\"+rt+\" 0 0 \"+lt+\" \"+(H+rt*ot-pt)+\",\"+Y+\"H\"+(G-rt*ot+pt)+\"A \"+rt+\",\"+rt+\" 0 0 \"+lt+\" \"+(G-ht*ot)+\",\"+dt(Y-(rt-it)*st,W)+\"V\"+W+\"Z\"}}else tt=nt}else tt=nt;var vt=M(a.ensureSingle(R,\"path\"),I,g,y);if(vt.style(\"vector-effect\",z?\"none\":\"non-scaling-stroke\").attr(\"d\",isNaN((G-H)*(Y-W))||X&&t._context.staticPlot?\"M0,0Z\":tt).call(l.setClipUrl,e.layerClipId,t),!I.uniformtext.mode&&V){var gt=l.makePointStyleFns(f);l.singlePointStyle(u,vt,f,gt,t)}!function(t,e,r,n,i,s,u,f,p,g,y,w,T){var k,S=e.xaxis,O=e.yaxis,I=t._fullLayout;function z(e,r,n){return a.ensureSingle(e,\"text\").text(r).attr({class:\"bartext bartext-\"+k,\"text-anchor\":\"middle\",\"data-notex\":1}).call(l.font,n).call(o.convertToTspans,t)}var D=n[0].trace,R=\"h\"===D.orientation,F=function(t,e,r,n,i){var o,s=e[0].trace;return o=s.texttemplate?function(t,e,r,n,i){var o=e[0].trace,s=a.castOption(o,r,\"texttemplate\");if(!s)return\"\";var l,u,f,h,p=\"histogram\"===o.type,d=\"waterfall\"===o.type,v=\"funnel\"===o.type,g=\"h\"===o.orientation;function y(t){return c(h,h.c2l(t),!0).text}g?(l=\"y\",u=i,f=\"x\",h=n):(l=\"x\",u=n,f=\"y\",h=i);var m,x=e[r],_={};_.label=x.p,_.labelLabel=_[l+\"Label\"]=(m=x.p,c(u,u.c2l(m),!0).text);var w=a.castOption(o,x.i,\"text\");(0===w||w)&&(_.text=w),_.value=x.s,_.valueLabel=_[f+\"Label\"]=y(x.s);var T={};b(T,o,x.i),(p||void 0===T.x)&&(T.x=g?_.value:_.label),(p||void 0===T.y)&&(T.y=g?_.label:_.value),(p||void 0===T.xLabel)&&(T.xLabel=g?_.valueLabel:_.labelLabel),(p||void 0===T.yLabel)&&(T.yLabel=g?_.labelLabel:_.valueLabel),d&&(_.delta=+x.rawS||x.s,_.deltaLabel=y(_.delta),_.final=x.v,_.finalLabel=y(_.final),_.initial=_.final-_.delta,_.initialLabel=y(_.initial)),v&&(_.value=x.s,_.valueLabel=y(_.value),_.percentInitial=x.begR,_.percentInitialLabel=a.formatPercent(x.begR),_.percentPrevious=x.difR,_.percentPreviousLabel=a.formatPercent(x.difR),_.percentTotal=x.sumR,_.percenTotalLabel=a.formatPercent(x.sumR));var k=a.castOption(o,x.i,\"customdata\");return k&&(_.customdata=k),a.texttemplateString(s,_,t._d3locale,T,_,o._meta||{})}(t,e,r,n,i):s.textinfo?function(t,e,r,n){var i=t[0].trace,o=\"h\"===i.orientation,s=\"waterfall\"===i.type,l=\"funnel\"===i.type;function u(t){return c(o?r:n,+t,!0).text}var f,h,p=i.textinfo,d=t[e],v=p.split(\"+\"),g=[],y=function(t){return-1!==v.indexOf(t)};if(y(\"label\")&&g.push((h=t[e].p,c(o?n:r,h,!0).text)),y(\"text\")&&(0===(f=a.castOption(i,d.i,\"text\"))||f)&&g.push(f),s){var m=+d.rawS||d.s,x=d.v,b=x-m;y(\"initial\")&&g.push(u(b)),y(\"delta\")&&g.push(u(m)),y(\"final\")&&g.push(u(x))}if(l){y(\"value\")&&g.push(u(d.s));var _=0;y(\"percent initial\")&&_++,y(\"percent previous\")&&_++,y(\"percent total\")&&_++;var w=_>1;y(\"percent initial\")&&(f=a.formatPercent(d.begR),w&&(f+=\" of initial\"),g.push(f)),y(\"percent previous\")&&(f=a.formatPercent(d.difR),w&&(f+=\" of previous\"),g.push(f)),y(\"percent total\")&&(f=a.formatPercent(d.sumR),w&&(f+=\" of total\"),g.push(f))}return g.join(\"
\")}(e,r,n,i):v.getValue(s.text,r),v.coerceString(m,o)}(I,n,i,S,O);k=function(t,e){var r=v.getValue(t.textposition,e);return v.coerceEnumerated(x,r)}(D,i);var B=\"stack\"===w.mode||\"relative\"===w.mode,N=n[i],j=!B||N._outmost,U=N.hasB,V=g&&g-y>_;if(F&&\"none\"!==k&&(!N.isBlank&&s!==u&&f!==p||\"auto\"!==k&&\"inside\"!==k)){var q=I.font,H=d.getBarColor(n[i],D),G=d.getInsideTextFont(D,i,q,H),W=d.getOutsideTextFont(D,i,q),Y=D.insidetextanchor||\"end\",X=r.datum();R?\"log\"===S.type&&X.s0<=0&&(s=S.range[0]0&&$>0;it=V?U?E(rt-2*g,nt,J,$,R)||E(rt,nt-2*g,J,$,R):R?E(rt-(g-y),nt,J,$,R)||E(rt,nt-2*(g-y),J,$,R):E(rt,nt-(g-y),J,$,R)||E(rt-2*(g-y),nt,J,$,R):E(rt,nt,J,$,R),at&&it?k=\"inside\":(k=\"outside\",Z.remove(),Z=null)}else k=\"inside\";if(!Z){var ot=(Z=z(r,F,Q=a.ensureUniformFontSize(t,\"outside\"===k?W:G))).attr(\"transform\");if(Z.attr(\"transform\",\"\"),J=(K=l.bBox(Z.node())).width,$=K.height,Z.attr(\"transform\",ot),J<=0||$<=0)return void Z.remove()}var st,lt=D.textangle;st=\"outside\"===k?function(t,e,r,n,i,a){var o,s=!!a.isHorizontal,l=!!a.constrained,u=a.angle||0,c=i.width,f=i.height,h=Math.abs(e-t),p=Math.abs(n-r);o=s?p>2*_?_:0:h>2*_?_:0;var d=1;l&&(d=s?Math.min(1,p/f):Math.min(1,h/c));var v=L(u),g=C(i,v),y=(s?g.x:g.y)/2,m=(i.left+i.right)/2,x=(i.top+i.bottom)/2,b=(t+e)/2,w=(r+n)/2,T=0,k=0,M=s?A(e,t):A(r,n);return s?(b=e-M*o,T=M*y):(w=n+M*o,k=-M*y),{textX:m,textY:x,targetX:b,targetY:w,anchorX:T,anchorY:k,scale:d,rotate:v}}(s,u,f,p,K,{isHorizontal:R,constrained:\"both\"===D.constraintext||\"outside\"===D.constraintext,angle:lt}):P(s,u,f,p,K,{isHorizontal:R,constrained:\"both\"===D.constraintext||\"inside\"===D.constraintext,angle:lt,anchor:Y,hasB:U,r:g,overhead:y}),st.fontSize=Q.size,h(\"histogram\"===D.type?\"bar\":D.type,st,I),N.transform=st;var ut=M(Z,I,w,T);a.setTransormAndDisplay(ut,st)}else r.select(\"text\").remove()}(t,e,R,r,T,H,G,W,Y,rt,it,g,y),e.layerClipId&&l.hideOutsideRangePoint(u,R.select(\"text\"),w,O,f.xcalendar,f.ycalendar)}));var W=!1===f.cliponaxis;l.setClipUrl(u,W?null:e.layerClipId,t)}));u.getComponentMethod(\"errorbars\",\"plot\")(t,D,e,g)},toMoveInsideBar:P}},45784:function(t){\"use strict\";function e(t,e,r,n,i){var a=e.c2p(n?t.s0:t.p0,!0),o=e.c2p(n?t.s1:t.p1,!0),s=r.c2p(n?t.p0:t.s0,!0),l=r.c2p(n?t.p1:t.s1,!0);return i?[(a+o)/2,(s+l)/2]:n?[o,(s+l)/2]:[(a+o)/2,l]}t.exports=function(t,r){var n,i=t.cd,a=t.xaxis,o=t.yaxis,s=i[0].trace,l=\"funnel\"===s.type,u=\"h\"===s.orientation,c=[];if(!1===r)for(n=0;n1||0===i.bargap&&0===i.bargroupgap&&!t[0].trace.marker.line.width)&&n.select(this).attr(\"shape-rendering\",\"crispEdges\")})),e.selectAll(\"g.points\").each((function(e){d(n.select(this),e[0].trace,t)})),s.getComponentMethod(\"errorbars\",\"style\")(e)},styleTextPoints:v,styleOnSelect:function(t,e,r){var i=e[0].trace;i.selectedpoints?function(t,e,r){a.selectedPointStyle(t.selectAll(\"path\"),e),function(t,e,r){t.each((function(t){var i,s=n.select(this);if(t.selected){i=o.ensureUniformFontSize(r,g(s,t,e,r));var l=e.selected.textfont&&e.selected.textfont.color;l&&(i.color=l),a.font(s,i)}else a.selectedTextStyle(s,e)}))}(t.selectAll(\"text\"),e,r)}(r,i,t):(d(r,i,t),s.getComponentMethod(\"errorbars\",\"style\")(r))},getInsideTextFont:m,getOutsideTextFont:x,getBarColor:_,resizeText:l}},55592:function(t,e,r){\"use strict\";var n=r(76308),i=r(94288).hasColorscale,a=r(27260),o=r(3400).coercePattern;t.exports=function(t,e,r,s,l){var u=r(\"marker.color\",s),c=i(t,\"marker\");c&&a(t,e,l,r,{prefix:\"marker.\",cLetter:\"c\"}),r(\"marker.line.color\",n.defaultLine),i(t,\"marker.line\")&&a(t,e,l,r,{prefix:\"marker.line.\",cLetter:\"c\"}),r(\"marker.line.width\"),r(\"marker.opacity\"),o(r,\"marker.pattern\",u,c),r(\"selected.marker.color\"),r(\"unselected.marker.color\")}},82744:function(t,e,r){\"use strict\";var n=r(33428),i=r(3400);function a(t){return\"_\"+t+\"Text_minsize\"}t.exports={recordMinTextSize:function(t,e,r){if(r.uniformtext.mode){var n=a(t),i=r.uniformtext.minsize,o=e.scale*e.fontSize;e.hide=o g.point\"}e.selectAll(s).each((function(t){var e=t.transform;if(e){e.scale=l&&e.hide?0:o/e.fontSize;var r=n.select(this).select(\"text\");i.setTransormAndDisplay(r,e)}}))}}}},78100:function(t,e,r){\"use strict\";var n,i=r(21776).Ks,a=r(92880).extendFlat,o=r(8319),s=r(20832);t.exports={r:o.r,theta:o.theta,r0:o.r0,dr:o.dr,theta0:o.theta0,dtheta:o.dtheta,thetaunit:o.thetaunit,base:a({},s.base,{}),offset:a({},s.offset,{}),width:a({},s.width,{}),text:a({},s.text,{}),hovertext:a({},s.hovertext,{}),marker:(n=a({},s.marker),delete n.cornerradius,n),hoverinfo:o.hoverinfo,hovertemplate:i(),selected:s.selected,unselected:s.unselected}},47056:function(t,e,r){\"use strict\";var n=r(94288).hasColorscale,i=r(47128),a=r(3400).isArrayOrTypedArray,o=r(84664),s=r(96376).setGroupPositions,l=r(4500),u=r(24040).traceIs,c=r(3400).extendFlat;t.exports={calc:function(t,e){for(var r=t._fullLayout,s=e.subplot,u=r[s].radialaxis,c=r[s].angularaxis,f=u.makeCalcdata(e,\"r\"),h=c.makeCalcdata(e,\"theta\"),p=e._length,d=new Array(p),v=f,g=h,y=0;yh.range[1]&&(x+=Math.PI),n.getClosest(u,(function(t){return v(m,x,[t.rp0,t.rp1],[t.thetag0,t.thetag1],d)?g+Math.min(1,Math.abs(t.thetag1-t.thetag0)/y)-1+(t.rp1-m)/(t.rp1-t.rp0)-1:1/0}),t),!1!==t.index){var b=u[t.index];t.x0=t.x1=b.ct[0],t.y0=t.y1=b.ct[1];var _=i.extendFlat({},b,{r:b.s,theta:b.p});return o(b,c,t),s(_,c,f,t),t.hovertemplate=c.hovertemplate,t.color=a(c,b),t.xLabelVal=t.yLabelVal=void 0,b.s<0&&(t.idealAlign=\"left\"),[t]}}},94456:function(t,e,r){\"use strict\";t.exports={moduleType:\"trace\",name:\"barpolar\",basePlotModule:r(40872),categories:[\"polar\",\"bar\",\"showLegend\"],attributes:r(78100),layoutAttributes:r(9320),supplyDefaults:r(70384),supplyLayoutDefaults:r(89580),calc:r(47056).calc,crossTraceCalc:r(47056).crossTraceCalc,plot:r(42040),colorbar:r(5528),formatLabels:r(22852),style:r(60100).style,styleOnSelect:r(60100).styleOnSelect,hoverPoints:r(68896),selectPoints:r(45784),meta:{}}},9320:function(t){\"use strict\";t.exports={barmode:{valType:\"enumerated\",values:[\"stack\",\"overlay\"],dflt:\"stack\",editType:\"calc\"},bargap:{valType:\"number\",dflt:.1,min:0,max:1,editType:\"calc\"}}},89580:function(t,e,r){\"use strict\";var n=r(3400),i=r(9320);t.exports=function(t,e,r){var a,o={};function s(r,o){return n.coerce(t[a]||{},e[a],i,r,o)}for(var l=0;l0?(u=o,c=l):(u=l,c=o);var f=[s.findEnclosingVertexAngles(u,t.vangles)[0],(u+c)/2,s.findEnclosingVertexAngles(c,t.vangles)[1]];return s.pathPolygonAnnulus(n,i,u,c,f,e,r)}:function(t,n,i,o){return a.pathAnnulus(t,n,i,o,e,r)}}(e),d=e.layers.frontplot.select(\"g.barlayer\");a.makeTraceGroups(d,r,\"trace bars\").each((function(){var r=n.select(this),s=a.ensureSingle(r,\"g\",\"points\").selectAll(\"g.point\").data(a.identity);s.enter().append(\"g\").style(\"vector-effect\",l?\"none\":\"non-scaling-stroke\").style(\"stroke-miterlimit\",2).classed(\"point\",!0),s.exit().remove(),s.each((function(t){var e,r=n.select(this),o=t.rp0=f.c2p(t.s0),s=t.rp1=f.c2p(t.s1),l=t.thetag0=h.c2g(t.p0),d=t.thetag1=h.c2g(t.p1);if(i(o)&&i(s)&&i(l)&&i(d)&&o!==s&&l!==d){var v=f.c2g(t.s1),g=(l+d)/2;t.ct=[u.c2p(v*Math.cos(g)),c.c2p(v*Math.sin(g))],e=p(o,s,l,d)}else e=\"M0,0Z\";a.ensureSingle(r,\"path\").attr(\"d\",e)})),o.setClipUrl(r,e._hasClipOnAxisFalse?e.clipIds.forTraces:null,t)}))}},63188:function(t,e,r){\"use strict\";var n=r(98304),i=r(52904),a=r(20832),o=r(22548),s=r(29736).axisHoverFormat,l=r(21776).Ks,u=r(92880).extendFlat,c=i.marker,f=c.line;t.exports={y:{valType:\"data_array\",editType:\"calc+clearAxisTypes\"},x:{valType:\"data_array\",editType:\"calc+clearAxisTypes\"},x0:{valType:\"any\",editType:\"calc+clearAxisTypes\"},y0:{valType:\"any\",editType:\"calc+clearAxisTypes\"},dx:{valType:\"number\",editType:\"calc\"},dy:{valType:\"number\",editType:\"calc\"},xperiod:i.xperiod,yperiod:i.yperiod,xperiod0:i.xperiod0,yperiod0:i.yperiod0,xperiodalignment:i.xperiodalignment,yperiodalignment:i.yperiodalignment,xhoverformat:s(\"x\"),yhoverformat:s(\"y\"),name:{valType:\"string\",editType:\"calc+clearAxisTypes\"},q1:{valType:\"data_array\",editType:\"calc+clearAxisTypes\"},median:{valType:\"data_array\",editType:\"calc+clearAxisTypes\"},q3:{valType:\"data_array\",editType:\"calc+clearAxisTypes\"},lowerfence:{valType:\"data_array\",editType:\"calc\"},upperfence:{valType:\"data_array\",editType:\"calc\"},notched:{valType:\"boolean\",editType:\"calc\"},notchwidth:{valType:\"number\",min:0,max:.5,dflt:.25,editType:\"calc\"},notchspan:{valType:\"data_array\",editType:\"calc\"},boxpoints:{valType:\"enumerated\",values:[\"all\",\"outliers\",\"suspectedoutliers\",!1],editType:\"calc\"},jitter:{valType:\"number\",min:0,max:1,editType:\"calc\"},pointpos:{valType:\"number\",min:-2,max:2,editType:\"calc\"},sdmultiple:{valType:\"number\",min:0,editType:\"calc\",dflt:1},sizemode:{valType:\"enumerated\",values:[\"quartiles\",\"sd\"],editType:\"calc\",dflt:\"quartiles\"},boxmean:{valType:\"enumerated\",values:[!0,\"sd\",!1],editType:\"calc\"},mean:{valType:\"data_array\",editType:\"calc\"},sd:{valType:\"data_array\",editType:\"calc\"},orientation:{valType:\"enumerated\",values:[\"v\",\"h\"],editType:\"calc+clearAxisTypes\"},quartilemethod:{valType:\"enumerated\",values:[\"linear\",\"exclusive\",\"inclusive\"],dflt:\"linear\",editType:\"calc\"},width:{valType:\"number\",min:0,dflt:0,editType:\"calc\"},marker:{outliercolor:{valType:\"color\",dflt:\"rgba(0, 0, 0, 0)\",editType:\"style\"},symbol:u({},c.symbol,{arrayOk:!1,editType:\"plot\"}),opacity:u({},c.opacity,{arrayOk:!1,dflt:1,editType:\"style\"}),angle:u({},c.angle,{arrayOk:!1,editType:\"calc\"}),size:u({},c.size,{arrayOk:!1,editType:\"calc\"}),color:u({},c.color,{arrayOk:!1,editType:\"style\"}),line:{color:u({},f.color,{arrayOk:!1,dflt:o.defaultLine,editType:\"style\"}),width:u({},f.width,{arrayOk:!1,dflt:0,editType:\"style\"}),outliercolor:{valType:\"color\",editType:\"style\"},outlierwidth:{valType:\"number\",min:0,dflt:1,editType:\"style\"},editType:\"style\"},editType:\"plot\"},line:{color:{valType:\"color\",editType:\"style\"},width:{valType:\"number\",min:0,dflt:2,editType:\"style\"},editType:\"plot\"},fillcolor:n(),whiskerwidth:{valType:\"number\",min:0,max:1,dflt:.5,editType:\"calc\"},showwhiskers:{valType:\"boolean\",editType:\"calc\"},offsetgroup:a.offsetgroup,alignmentgroup:a.alignmentgroup,selected:{marker:i.selected.marker,editType:\"style\"},unselected:{marker:i.unselected.marker,editType:\"style\"},text:u({},i.text,{}),hovertext:u({},i.hovertext,{}),hovertemplate:l({}),hoveron:{valType:\"flaglist\",flags:[\"boxes\",\"points\"],dflt:\"boxes+points\",editType:\"style\"},zorder:i.zorder}},62555:function(t,e,r){\"use strict\";var n=r(38248),i=r(54460),a=r(1220),o=r(3400),s=r(39032).BADNUM,l=o._;t.exports=function(t,e){var r,u,m,x,b,_,w,T=t._fullLayout,k=i.getFromId(t,e.xaxis||\"x\"),A=i.getFromId(t,e.yaxis||\"y\"),M=[],S=\"violin\"===e.type?\"_numViolins\":\"_numBoxes\";\"h\"===e.orientation?(m=k,x=\"x\",b=A,_=\"y\",w=!!e.yperiodalignment):(m=A,x=\"y\",b=k,_=\"x\",w=!!e.xperiodalignment);var E,L,C,P,O,I,z=function(t,e,r,i){var s,l=e+\"0\"in t;if(e in t||l&&\"d\"+e in t){var u=r.makeCalcdata(t,e);return[a(t,r,e,u).vals,u]}s=l?t[e+\"0\"]:\"name\"in t&&(\"category\"===r.type||n(t.name)&&-1!==[\"linear\",\"log\"].indexOf(r.type)||o.isDateTime(t.name)&&\"date\"===r.type)?t.name:i;for(var c=\"multicategory\"===r.type?r.r2c_just_indices(s):r.d2c(s,0,t[e+\"calendar\"]),f=t._length,h=new Array(f),p=0;pE.uf};if(e._hasPreCompStats){var U=e[x],V=function(t){return m.d2c((e[t]||[])[r])},q=1/0,H=-1/0;for(r=0;r=E.q1&&E.q3>=E.med){var W=V(\"lowerfence\");E.lf=W!==s&&W<=E.q1?W:p(E,C,P);var Y=V(\"upperfence\");E.uf=Y!==s&&Y>=E.q3?Y:d(E,C,P);var X=V(\"mean\");E.mean=X!==s?X:P?o.mean(C,P):(E.q1+E.q3)/2;var Z=V(\"sd\");E.sd=X!==s&&Z>=0?Z:P?o.stdev(C,P,E.mean):E.q3-E.q1,E.lo=v(E),E.uo=g(E);var K=V(\"notchspan\");K=K!==s&&K>0?K:y(E,P),E.ln=E.med-K,E.un=E.med+K;var J=E.lf,$=E.uf;e.boxpoints&&C.length&&(J=Math.min(J,C[0]),$=Math.max($,C[P-1])),e.notched&&(J=Math.min(J,E.ln),$=Math.max($,E.un)),E.min=J,E.max=$}else{var Q;o.warn([\"Invalid input - make sure that q1 <= median <= q3\",\"q1 = \"+E.q1,\"median = \"+E.med,\"q3 = \"+E.q3].join(\"\\n\")),Q=E.med!==s?E.med:E.q1!==s?E.q3!==s?(E.q1+E.q3)/2:E.q1:E.q3!==s?E.q3:0,E.med=Q,E.q1=E.q3=Q,E.lf=E.uf=Q,E.mean=E.sd=Q,E.ln=E.un=Q,E.min=E.max=Q}q=Math.min(q,E.min),H=Math.max(H,E.max),E.pts2=L.filter(j),M.push(E)}}e._extremes[m._id]=i.findExtremes(m,[q,H],{padded:!0})}else{var tt=m.makeCalcdata(e,x),et=function(t,e){for(var r=t.length,n=new Array(r+1),i=0;i=0&&it0){var ct,ft;(E={}).pos=E[_]=B[r],L=E.pts=nt[r].sort(f),P=(C=E[x]=L.map(h)).length,E.min=C[0],E.max=C[P-1],E.mean=o.mean(C,P),E.sd=o.stdev(C,P,E.mean)*e.sdmultiple,E.med=o.interp(C,.5),P%2&&(lt||ut)?(lt?(ct=C.slice(0,P/2),ft=C.slice(P/2+1)):ut&&(ct=C.slice(0,P/2+1),ft=C.slice(P/2)),E.q1=o.interp(ct,.5),E.q3=o.interp(ft,.5)):(E.q1=o.interp(C,.25),E.q3=o.interp(C,.75)),E.lf=p(E,C,P),E.uf=d(E,C,P),E.lo=v(E),E.uo=g(E);var ht=y(E,P);E.ln=E.med-ht,E.un=E.med+ht,at=Math.min(at,E.ln),ot=Math.max(ot,E.un),E.pts2=L.filter(j),M.push(E)}e.notched&&o.isTypedArray(tt)&&(tt=Array.from(tt)),e._extremes[m._id]=i.findExtremes(m,e.notched?tt.concat([at,ot]):tt,{padded:!0})}return function(t,e){if(o.isArrayOrTypedArray(e.selectedpoints))for(var r=0;r0?(M[0].t={num:T[S],dPos:N,posLetter:_,valLetter:x,labels:{med:l(t,\"median:\"),min:l(t,\"min:\"),q1:l(t,\"q1:\"),q3:l(t,\"q3:\"),max:l(t,\"max:\"),mean:\"sd\"===e.boxmean||\"sd\"===e.sizemode?l(t,\"mean ± σ:\").replace(\"σ\",1===e.sdmultiple?\"σ\":e.sdmultiple+\"σ\"):l(t,\"mean:\"),lf:l(t,\"lower fence:\"),uf:l(t,\"upper fence:\")}},T[S]++,M):[{t:{empty:!0}}]};var u={text:\"tx\",hovertext:\"htx\"};function c(t,e,r){for(var n in u)o.isArrayOrTypedArray(e[n])&&(Array.isArray(r)?o.isArrayOrTypedArray(e[n][r[0]])&&(t[u[n]]=e[n][r[0]][r[1]]):t[u[n]]=e[n][r])}function f(t,e){return t.v-e.v}function h(t){return t.v}function p(t,e,r){return 0===r?t.q1:Math.min(t.q1,e[Math.min(o.findBin(2.5*t.q1-1.5*t.q3,e,!0)+1,r-1)])}function d(t,e,r){return 0===r?t.q3:Math.max(t.q3,e[Math.max(o.findBin(2.5*t.q3-1.5*t.q1,e),0)])}function v(t){return 4*t.q1-3*t.q3}function g(t){return 4*t.q3-3*t.q1}function y(t,e){return 0===e?0:1.57*(t.q3-t.q1)/Math.sqrt(e)}},96404:function(t,e,r){\"use strict\";var n=r(54460),i=r(3400),a=r(71888).getAxisGroup,o=[\"v\",\"h\"];function s(t,e,r,o){var s,l,u,c=e.calcdata,f=e._fullLayout,h=o._id,p=h.charAt(0),d=[],v=0;for(s=0;s1,b=1-f[t+\"gap\"],_=1-f[t+\"groupgap\"];for(s=0;s0){var H=E.pointpos,G=E.jitter,W=E.marker.size/2,Y=0;H+G>=0&&((Y=V*(H+G))>M?(q=!0,j=W,B=Y):Y>R&&(j=W,B=M)),Y<=M&&(B=M);var X=0;H-G<=0&&((X=-V*(H-G))>S?(q=!0,U=W,N=X):X>F&&(U=W,N=S)),X<=S&&(N=S)}else B=M,N=S;var Z=new Array(u.length);for(l=0;l0?(g=\"v\",y=x>0?Math.min(_,b):Math.min(b)):x>0?(g=\"h\",y=Math.min(_)):y=0;if(y){e._length=y;var S=r(\"orientation\",g);e._hasPreCompStats?\"v\"===S&&0===x?(r(\"x0\",0),r(\"dx\",1)):\"h\"===S&&0===m&&(r(\"y0\",0),r(\"dy\",1)):\"v\"===S&&0===x?r(\"x0\"):\"h\"===S&&0===m&&r(\"y0\"),i.getComponentMethod(\"calendars\",\"handleTraceDefaults\")(t,e,[\"x\",\"y\"],a)}else e.visible=!1}function f(t,e,r,i){var a=i.prefix,o=n.coerce2(t,e,u,\"marker.outliercolor\"),s=r(\"marker.line.outliercolor\"),l=\"outliers\";e._hasPreCompStats?l=\"all\":(o||s)&&(l=\"suspectedoutliers\");var c=r(a+\"points\",l);c?(r(\"jitter\",\"all\"===c?.3:0),r(\"pointpos\",\"all\"===c?-1.5:0),r(\"marker.symbol\"),r(\"marker.opacity\"),r(\"marker.size\"),r(\"marker.angle\"),r(\"marker.color\",e.line.color),r(\"marker.line.color\"),r(\"marker.line.width\"),\"suspectedoutliers\"===c&&(r(\"marker.line.outliercolor\",e.marker.color),r(\"marker.line.outlierwidth\")),r(\"selected.marker.color\"),r(\"unselected.marker.color\"),r(\"selected.marker.size\"),r(\"unselected.marker.size\"),r(\"text\"),r(\"hovertext\")):delete e.marker;var f=r(\"hoveron\");\"all\"!==f&&-1===f.indexOf(\"points\")||r(\"hovertemplate\"),n.coerceSelectionMarkerOpacity(e,r)}t.exports={supplyDefaults:function(t,e,r,i){function s(r,i){return n.coerce(t,e,u,r,i)}if(c(t,e,s,i),!1!==e.visible){o(t,e,i,s),s(\"xhoverformat\"),s(\"yhoverformat\");var l=e._hasPreCompStats;l&&(s(\"lowerfence\"),s(\"upperfence\")),s(\"line.color\",(t.marker||{}).color||r),s(\"line.width\"),s(\"fillcolor\",a.addOpacity(e.line.color,.5));var h=!1;if(l){var p=s(\"mean\"),d=s(\"sd\");p&&p.length&&(h=!0,d&&d.length&&(h=\"sd\"))}s(\"whiskerwidth\");var v,g=s(\"sizemode\");\"quartiles\"===g&&(v=s(\"boxmean\",h)),s(\"showwhiskers\",\"quartiles\"===g),\"sd\"!==g&&\"sd\"!==v||s(\"sdmultiple\"),s(\"width\"),s(\"quartilemethod\");var y=!1;if(l){var m=s(\"notchspan\");m&&m.length&&(y=!0)}else n.validate(t.notchwidth,u.notchwidth)&&(y=!0);s(\"notched\",y)&&s(\"notchwidth\"),f(t,e,s,{prefix:\"box\"}),s(\"zorder\")}},crossTraceDefaults:function(t,e){var r,i;function a(t){return n.coerce(i._input,i,u,t)}for(var o=0;ot.lo&&(x.so=!0)}return a}));h.enter().append(\"path\").classed(\"point\",!0),h.exit().remove(),h.call(a.translatePoints,o,s)}function l(t,e,r,a){var o,s,l=e.val,u=e.pos,c=!!u.rangebreaks,f=a.bPos,h=a.bPosPxOffset||0,p=r.boxmean||(r.meanline||{}).visible;Array.isArray(a.bdPos)?(o=a.bdPos[0],s=a.bdPos[1]):(o=a.bdPos,s=a.bdPos);var d=t.selectAll(\"path.mean\").data(\"box\"===r.type&&r.boxmean||\"violin\"===r.type&&r.box.visible&&r.meanline.visible?i.identity:[]);d.enter().append(\"path\").attr(\"class\",\"mean\").style({fill:\"none\",\"vector-effect\":\"non-scaling-stroke\"}),d.exit().remove(),d.each((function(t){var e=u.c2l(t.pos+f,!0),i=u.l2p(e-o)+h,a=u.l2p(e+s)+h,d=c?(i+a)/2:u.l2p(e)+h,v=l.c2p(t.mean,!0),g=l.c2p(t.mean-t.sd,!0),y=l.c2p(t.mean+t.sd,!0);\"h\"===r.orientation?n.select(this).attr(\"d\",\"M\"+v+\",\"+i+\"V\"+a+(\"sd\"===p?\"m0,0L\"+g+\",\"+d+\"L\"+v+\",\"+i+\"L\"+y+\",\"+d+\"Z\":\"\")):n.select(this).attr(\"d\",\"M\"+i+\",\"+v+\"H\"+a+(\"sd\"===p?\"m0,0L\"+d+\",\"+g+\"L\"+i+\",\"+v+\"L\"+d+\",\"+y+\"Z\":\"\"))}))}t.exports={plot:function(t,e,r,a){var u=t._context.staticPlot,c=e.xaxis,f=e.yaxis;i.makeTraceGroups(a,r,\"trace boxes\").each((function(t){var e,r,i=n.select(this),a=t[0],h=a.t,p=a.trace;h.wdPos=h.bdPos*p.whiskerwidth,!0!==p.visible||h.empty?i.remove():(\"h\"===p.orientation?(e=f,r=c):(e=c,r=f),o(i,{pos:e,val:r},p,h,u),s(i,{x:c,y:f},p,h),l(i,{pos:e,val:r},p,h))}))},plotBoxAndWhiskers:o,plotPoints:s,plotBoxMean:l}},8264:function(t){\"use strict\";t.exports=function(t,e){var r,n,i=t.cd,a=t.xaxis,o=t.yaxis,s=[];if(!1===e)for(r=0;r=10)return null;for(var r=1/0,a=-1/0,o=t.length,s=0;s0?Math.floor:Math.ceil,O=L>0?Math.ceil:Math.floor,I=L>0?Math.min:Math.max,z=L>0?Math.max:Math.min,D=P(S+C),R=O(E-C),F=[[f=M(S)]];for(a=D;a*L=0;i--)a[c-i]=t[f][i],o[c-i]=e[f][i];for(s.push({x:a,y:o,bicubic:l}),i=f,a=[],o=[];i>=0;i--)a[f-i]=t[i][0],o[f-i]=e[i][0];return s.push({x:a,y:o,bicubic:u}),s}},19216:function(t,e,r){\"use strict\";var n=r(54460),i=r(92880).extendFlat;t.exports=function(t,e,r){var a,o,s,l,u,c,f,h,p,d,v,g,y,m,x=t[\"_\"+e],b=t[e+\"axis\"],_=b._gridlines=[],w=b._minorgridlines=[],T=b._boundarylines=[],k=t[\"_\"+r],A=t[r+\"axis\"];\"array\"===b.tickmode&&(b.tickvals=x.slice());var M=t._xctrl,S=t._yctrl,E=M[0].length,L=M.length,C=t._a.length,P=t._b.length;n.prepTicks(b),\"array\"===b.tickmode&&delete b.tickvals;var O=b.smoothing?3:1;function I(n){var i,a,o,s,l,u,c,f,p,d,v,g,y=[],m=[],x={};if(\"b\"===e)for(a=t.b2j(n),o=Math.floor(Math.max(0,Math.min(P-2,a))),s=a-o,x.length=P,x.crossLength=C,x.xy=function(e){return t.evalxy([],e,a)},x.dxy=function(e,r){return t.dxydi([],e,o,r,s)},i=0;i0&&(p=t.dxydi([],i-1,o,0,s),y.push(l[0]+p[0]/3),m.push(l[1]+p[1]/3),d=t.dxydi([],i-1,o,1,s),y.push(f[0]-d[0]/3),m.push(f[1]-d[1]/3)),y.push(f[0]),m.push(f[1]),l=f;else for(i=t.a2i(n),u=Math.floor(Math.max(0,Math.min(C-2,i))),c=i-u,x.length=C,x.crossLength=P,x.xy=function(e){return t.evalxy([],i,e)},x.dxy=function(e,r){return t.dxydj([],u,e,c,r)},a=0;a0&&(v=t.dxydj([],u,a-1,c,0),y.push(l[0]+v[0]/3),m.push(l[1]+v[1]/3),g=t.dxydj([],u,a-1,c,1),y.push(f[0]-g[0]/3),m.push(f[1]-g[1]/3)),y.push(f[0]),m.push(f[1]),l=f;return x.axisLetter=e,x.axis=b,x.crossAxis=A,x.value=n,x.constvar=r,x.index=h,x.x=y,x.y=m,x.smoothing=A.smoothing,x}function z(n){var i,a,o,s,l,u=[],c=[],f={};if(f.length=x.length,f.crossLength=k.length,\"b\"===e)for(o=Math.max(0,Math.min(P-2,n)),l=Math.min(1,Math.max(0,n-o)),f.xy=function(e){return t.evalxy([],e,n)},f.dxy=function(e,r){return t.dxydi([],e,o,r,l)},i=0;ix.length-1||_.push(i(z(o),{color:b.gridcolor,width:b.gridwidth,dash:b.griddash}));for(h=c;hx.length-1||v<0||v>x.length-1))for(g=x[s],y=x[v],a=0;ax[x.length-1]||w.push(i(I(d),{color:b.minorgridcolor,width:b.minorgridwidth,dash:b.minorgriddash}));b.startline&&T.push(i(z(0),{color:b.startlinecolor,width:b.startlinewidth})),b.endline&&T.push(i(z(x.length-1),{color:b.endlinecolor,width:b.endlinewidth}))}else{for(l=5e-15,c=(u=[Math.floor((x[x.length-1]-b.tick0)/b.dtick*(1+l)),Math.ceil((x[0]-b.tick0)/b.dtick/(1+l))].sort((function(t,e){return t-e})))[0],f=u[1],h=c;h<=f;h++)p=b.tick0+b.dtick*h,_.push(i(I(p),{color:b.gridcolor,width:b.gridwidth,dash:b.griddash}));for(h=c-1;hx[x.length-1]||w.push(i(I(d),{color:b.minorgridcolor,width:b.minorgridwidth,dash:b.minorgriddash}));b.startline&&T.push(i(I(x[0]),{color:b.startlinecolor,width:b.startlinewidth})),b.endline&&T.push(i(I(x[x.length-1]),{color:b.endlinecolor,width:b.endlinewidth}))}}},14724:function(t,e,r){\"use strict\";var n=r(54460),i=r(92880).extendFlat;t.exports=function(t,e){var r,a,o,s=e._labels=[],l=e._gridlines;for(r=0;re.length&&(t=t.slice(0,e.length)):t=[],i=0;i90&&(p-=180,l=-l),{angle:p,flip:l,p:t.c2p(n,e,r),offsetMultplier:u}}},164:function(t,e,r){\"use strict\";var n=r(33428),i=r(43616),a=r(87072),o=r(53416),s=r(15584),l=r(72736),u=r(3400),c=u.strRotate,f=u.strTranslate,h=r(84284);function p(t,e,r,s,l,u,c){var f=\"const-\"+l+\"-lines\",h=r.selectAll(\".\"+f).data(u);h.enter().append(\"path\").classed(f,!0).style(\"vector-effect\",c?\"none\":\"non-scaling-stroke\"),h.each((function(r){var s=r,l=s.x,u=s.y,c=a([],l,t.c2p),f=a([],u,e.c2p),h=\"M\"+o(c,f,s.smoothing);n.select(this).attr(\"d\",h).style(\"stroke-width\",s.width).style(\"stroke\",s.color).style(\"stroke-dasharray\",i.dashStyle(s.dash,s.width)).style(\"fill\",\"none\")})),h.exit().remove()}function d(t,e,r,a,o,u,h,p){var d=u.selectAll(\"text.\"+p).data(h);d.enter().append(\"text\").classed(p,!0);var v=0,g={};return d.each((function(o,u){var h;if(\"auto\"===o.axis.tickangle)h=s(a,e,r,o.xy,o.dxy);else{var p=(o.axis.tickangle+180)*Math.PI/180;h=s(a,e,r,o.xy,[Math.cos(p),Math.sin(p)])}u||(g={angle:h.angle,flip:h.flip});var d=(o.endAnchor?-1:1)*h.flip,y=n.select(this).attr({\"text-anchor\":d>0?\"start\":\"end\",\"data-notex\":1}).call(i.font,o.font).text(o.text).call(l.convertToTspans,t),m=i.bBox(this);y.attr(\"transform\",f(h.p[0],h.p[1])+c(h.angle)+f(o.axis.labelpadding*d,.3*m.height)),v=Math.max(v,m.width+o.axis.labelpadding)})),d.exit().remove(),g.maxExtent=v,g}t.exports=function(t,e,r,i){var l=t._context.staticPlot,c=e.xaxis,f=e.yaxis,h=t._fullLayout._clips;u.makeTraceGroups(i,r,\"trace\").each((function(e){var r=n.select(this),i=e[0],v=i.trace,g=v.aaxis,m=v.baxis,x=u.ensureSingle(r,\"g\",\"minorlayer\"),b=u.ensureSingle(r,\"g\",\"majorlayer\"),_=u.ensureSingle(r,\"g\",\"boundarylayer\"),w=u.ensureSingle(r,\"g\",\"labellayer\");r.style(\"opacity\",v.opacity),p(c,f,b,0,\"a\",g._gridlines,!0),p(c,f,b,0,\"b\",m._gridlines,!0),p(c,f,x,0,\"a\",g._minorgridlines,!0),p(c,f,x,0,\"b\",m._minorgridlines,!0),p(c,f,_,0,\"a-boundary\",g._boundarylines,l),p(c,f,_,0,\"b-boundary\",m._boundarylines,l);var T=d(t,c,f,v,0,w,g._labels,\"a-label\"),k=d(t,c,f,v,0,w,m._labels,\"b-label\");!function(t,e,r,n,i,a,o,l){var c,f,h,p,d=u.aggNums(Math.min,null,r.a),v=u.aggNums(Math.max,null,r.a),g=u.aggNums(Math.min,null,r.b),m=u.aggNums(Math.max,null,r.b);c=.5*(d+v),f=g,h=r.ab2xy(c,f,!0),p=r.dxyda_rough(c,f),void 0===o.angle&&u.extendFlat(o,s(r,i,a,h,r.dxydb_rough(c,f))),y(t,e,r,0,h,p,r.aaxis,i,a,o,\"a-title\"),c=d,f=.5*(g+m),h=r.ab2xy(c,f,!0),p=r.dxydb_rough(c,f),void 0===l.angle&&u.extendFlat(l,s(r,i,a,h,r.dxyda_rough(c,f))),y(t,e,r,0,h,p,r.baxis,i,a,l,\"b-title\")}(t,w,v,0,c,f,T,k),function(t,e,r,n,i){var s,l,c,f,h=r.select(\"#\"+t._clipPathId);h.size()||(h=r.append(\"clipPath\").classed(\"carpetclip\",!0));var p=u.ensureSingle(h,\"path\",\"carpetboundary\"),d=e.clipsegments,v=[];for(f=0;f90&&m<270,b=n.select(this);b.text(h.title.text).call(l.convertToTspans,t),x&&(_=(-l.lineCount(b)+g)*v*a-_),b.attr(\"transform\",f(e.p[0],e.p[1])+c(e.angle)+f(0,_)).attr(\"text-anchor\",\"middle\").call(i.font,h.title.font)})),b.exit().remove()}},81e3:function(t,e,r){\"use strict\";var n=r(24588),i=r(14952).findBin,a=r(30180),o=r(29056),s=r(26435),l=r(24464);t.exports=function(t){var e=t._a,r=t._b,u=e.length,c=r.length,f=t.aaxis,h=t.baxis,p=e[0],d=e[u-1],v=r[0],g=r[c-1],y=e[e.length-1]-e[0],m=r[r.length-1]-r[0],x=y*n.RELATIVE_CULL_TOLERANCE,b=m*n.RELATIVE_CULL_TOLERANCE;p-=x,d+=x,v-=b,g+=b,t.isVisible=function(t,e){return t>p&&tv&&ed||eg},t.setScale=function(){var e=t._x,r=t._y,n=a(t._xctrl,t._yctrl,e,r,f.smoothing,h.smoothing);t._xctrl=n[0],t._yctrl=n[1],t.evalxy=o([t._xctrl,t._yctrl],u,c,f.smoothing,h.smoothing),t.dxydi=s([t._xctrl,t._yctrl],f.smoothing,h.smoothing),t.dxydj=l([t._xctrl,t._yctrl],f.smoothing,h.smoothing)},t.i2a=function(t){var r=Math.max(0,Math.floor(t[0]),u-2),n=t[0]-r;return(1-n)*e[r]+n*e[r+1]},t.j2b=function(t){var e=Math.max(0,Math.floor(t[1]),u-2),n=t[1]-e;return(1-n)*r[e]+n*r[e+1]},t.ij2ab=function(e){return[t.i2a(e[0]),t.j2b(e[1])]},t.a2i=function(t){var r=Math.max(0,Math.min(i(t,e),u-2)),n=e[r],a=e[r+1];return Math.max(0,Math.min(u-1,r+(t-n)/(a-n)))},t.b2j=function(t){var e=Math.max(0,Math.min(i(t,r),c-2)),n=r[e],a=r[e+1];return Math.max(0,Math.min(c-1,e+(t-n)/(a-n)))},t.ab2ij=function(e){return[t.a2i(e[0]),t.b2j(e[1])]},t.i2c=function(e,r){return t.evalxy([],e,r)},t.ab2xy=function(n,i,a){if(!a&&(ne[u-1]|ir[c-1]))return[!1,!1];var o=t.a2i(n),s=t.b2j(i),l=t.evalxy([],o,s);if(a){var f,h,p,d,v=0,g=0,y=[];ne[u-1]?(f=u-2,h=1,v=(n-e[u-1])/(e[u-1]-e[u-2])):h=o-(f=Math.max(0,Math.min(u-2,Math.floor(o)))),ir[c-1]?(p=c-2,d=1,g=(i-r[c-1])/(r[c-1]-r[c-2])):d=s-(p=Math.max(0,Math.min(c-2,Math.floor(s)))),v&&(t.dxydi(y,f,p,h,d),l[0]+=y[0]*v,l[1]+=y[1]*v),g&&(t.dxydj(y,f,p,h,d),l[0]+=y[0]*g,l[1]+=y[1]*g)}return l},t.c2p=function(t,e,r){return[e.c2p(t[0]),r.c2p(t[1])]},t.p2x=function(t,e,r){return[e.p2c(t[0]),r.p2c(t[1])]},t.dadi=function(t){var r=Math.max(0,Math.min(e.length-2,t));return e[r+1]-e[r]},t.dbdj=function(t){var e=Math.max(0,Math.min(r.length-2,t));return r[e+1]-r[e]},t.dxyda=function(e,r,n,i){var a=t.dxydi(null,e,r,n,i),o=t.dadi(e,n);return[a[0]/o,a[1]/o]},t.dxydb=function(e,r,n,i){var a=t.dxydj(null,e,r,n,i),o=t.dbdj(r,i);return[a[0]/o,a[1]/o]},t.dxyda_rough=function(e,r,n){var i=y*(n||.1),a=t.ab2xy(e+i,r,!0),o=t.ab2xy(e-i,r,!0);return[.5*(a[0]-o[0])/i,.5*(a[1]-o[1])/i]},t.dxydb_rough=function(e,r,n){var i=m*(n||.1),a=t.ab2xy(e,r+i,!0),o=t.ab2xy(e,r-i,!0);return[.5*(a[0]-o[0])/i,.5*(a[1]-o[1])/i]},t.dpdx=function(t){return t._m},t.dpdy=function(t){return t._m}}},51512:function(t,e,r){\"use strict\";var n=r(3400);t.exports=function(t,e,r){var i,a,o,s=[],l=[],u=t[0].length,c=t.length;function f(e,r){var n,i=0,a=0;return e>0&&void 0!==(n=t[r][e-1])&&(a++,i+=n),e0&&void 0!==(n=t[r-1][e])&&(a++,i+=n),r0&&a0&&i1e-5);return n.log(\"Smoother converged to\",k,\"after\",A,\"iterations\"),t}},86411:function(t,e,r){\"use strict\";var n=r(3400).isArray1D;t.exports=function(t,e,r){var i=r(\"x\"),a=i&&i.length,o=r(\"y\"),s=o&&o.length;if(!a&&!s)return!1;if(e._cheater=!i,a&&!n(i)||s&&!n(o))e._length=null;else{var l=a?i.length:1/0;s&&(l=Math.min(l,o.length)),e.a&&e.a.length&&(l=Math.min(l,e.a.length)),e.b&&e.b.length&&(l=Math.min(l,e.b.length)),e._length=l}return!0}},83372:function(t,e,r){\"use strict\";var n=r(21776).Ks,i=r(6096),a=r(49084),o=r(45464),s=r(22548).defaultLine,l=r(92880).extendFlat,u=i.marker.line;t.exports=l({locations:{valType:\"data_array\",editType:\"calc\"},locationmode:i.locationmode,z:{valType:\"data_array\",editType:\"calc\"},geojson:l({},i.geojson,{}),featureidkey:i.featureidkey,text:l({},i.text,{}),hovertext:l({},i.hovertext,{}),marker:{line:{color:l({},u.color,{dflt:s}),width:l({},u.width,{dflt:1}),editType:\"calc\"},opacity:{valType:\"number\",arrayOk:!0,min:0,max:1,dflt:1,editType:\"style\"},editType:\"calc\"},selected:{marker:{opacity:i.selected.marker.opacity,editType:\"plot\"},editType:\"plot\"},unselected:{marker:{opacity:i.unselected.marker.opacity,editType:\"plot\"},editType:\"plot\"},hoverinfo:l({},o.hoverinfo,{editType:\"calc\",flags:[\"location\",\"z\",\"text\",\"name\"]}),hovertemplate:n(),showlegend:l({},o.showlegend,{dflt:!1})},a(\"\",{cLetter:\"z\",editTypeOverride:\"calc\"}))},7924:function(t,e,r){\"use strict\";var n=r(38248),i=r(39032).BADNUM,a=r(47128),o=r(20148),s=r(4500);function l(t){return t&&\"string\"==typeof t}t.exports=function(t,e){var r,u=e._length,c=new Array(u);r=e.geojson?function(t){return l(t)||n(t)}:l;for(var f=0;f\")}}(t,f,o),[t]}},54272:function(t,e,r){\"use strict\";t.exports={attributes:r(83372),supplyDefaults:r(30972),colorbar:r(96288),calc:r(7924),calcGeoJSON:r(88364).calcGeoJSON,plot:r(88364).plot,style:r(7947).style,styleOnSelect:r(7947).styleOnSelect,hoverPoints:r(69224),eventData:r(52428),selectPoints:r(17328),moduleType:\"trace\",name:\"choropleth\",basePlotModule:r(10816),categories:[\"geo\",\"noOpacity\",\"showLegend\"],meta:{}}},88364:function(t,e,r){\"use strict\";var n=r(33428),i=r(3400),a=r(27144),o=r(59972).getTopojsonFeatures,s=r(19280).findExtremes,l=r(7947).style;t.exports={calcGeoJSON:function(t,e){for(var r=t[0].trace,n=e[r.geo],i=n._subplot,l=r.locationmode,u=r._length,c=\"geojson-id\"===l?a.extractTraceFeature(t):o(r,i.topojson),f=[],h=[],p=0;p=0;n--){var i=r[n].id;if(\"string\"==typeof i&&0===i.indexOf(\"water\"))for(var a=n+1;a=0;r--)t.removeLayer(e[r][1])},s.dispose=function(){var t=this.subplot.map;this._removeLayers(),t.removeSource(this.sourceId)},t.exports=function(t,e){var r=e[0].trace,i=new o(t,r.uid),a=i.sourceId,s=n(e),l=i.below=t.belowLookup[\"trace-\"+r.uid];return t.map.addSource(a,{type:\"geojson\",data:s.geojson}),i._addLayers(s,l),e[0].trace._glTrace=i,i}},86040:function(t,e,r){\"use strict\";var n=r(49084),i=r(29736).axisHoverFormat,a=r(21776).Ks,o=r(52948),s=r(45464),l=r(92880).extendFlat,u={x:{valType:\"data_array\",editType:\"calc+clearAxisTypes\"},y:{valType:\"data_array\",editType:\"calc+clearAxisTypes\"},z:{valType:\"data_array\",editType:\"calc+clearAxisTypes\"},u:{valType:\"data_array\",editType:\"calc\"},v:{valType:\"data_array\",editType:\"calc\"},w:{valType:\"data_array\",editType:\"calc\"},sizemode:{valType:\"enumerated\",values:[\"scaled\",\"absolute\",\"raw\"],editType:\"calc\",dflt:\"scaled\"},sizeref:{valType:\"number\",editType:\"calc\",min:0},anchor:{valType:\"enumerated\",editType:\"calc\",values:[\"tip\",\"tail\",\"cm\",\"center\"],dflt:\"cm\"},text:{valType:\"string\",dflt:\"\",arrayOk:!0,editType:\"calc\"},hovertext:{valType:\"string\",dflt:\"\",arrayOk:!0,editType:\"calc\"},hovertemplate:a({editType:\"calc\"},{keys:[\"norm\"]}),uhoverformat:i(\"u\",1),vhoverformat:i(\"v\",1),whoverformat:i(\"w\",1),xhoverformat:i(\"x\"),yhoverformat:i(\"y\"),zhoverformat:i(\"z\"),showlegend:l({},s.showlegend,{dflt:!1})};l(u,n(\"\",{colorAttr:\"u/v/w norm\",showScaleDflt:!0,editTypeOverride:\"calc\"})),[\"opacity\",\"lightposition\",\"lighting\"].forEach((function(t){u[t]=o[t]})),u.hoverinfo=l({},s.hoverinfo,{editType:\"calc\",flags:[\"x\",\"y\",\"z\",\"u\",\"v\",\"w\",\"norm\",\"text\",\"name\"],dflt:\"x+y+z+norm+text+name\"}),u.transforms=void 0,t.exports=u},83344:function(t,e,r){\"use strict\";var n=r(47128);t.exports=function(t,e){for(var r=e.u,i=e.v,a=e.w,o=Math.min(e.x.length,e.y.length,e.z.length,r.length,i.length,a.length),s=-1/0,l=1/0,u=0;uo.level||o.starts.length&&a===o.level)}break;case\"constraint\":if(n.prefixBoundary=!1,n.edgepaths.length)return;var s=n.x.length,l=n.y.length,u=-1/0,c=1/0;for(r=0;r\":p>u&&(n.prefixBoundary=!0);break;case\"<\":(pu||n.starts.length&&h===c)&&(n.prefixBoundary=!0);break;case\"][\":f=Math.min(p[0],p[1]),h=Math.max(p[0],p[1]),fu&&(n.prefixBoundary=!0)}}}},55296:function(t,e,r){\"use strict\";var n=r(8932),i=r(41076),a=r(46960);t.exports={min:\"zmin\",max:\"zmax\",calc:function(t,e,r){var o=e.contours,s=e.line,l=o.size||1,u=o.coloring,c=i(e,{isColorbar:!0});if(\"heatmap\"===u){var f=n.extractOpts(e);r._fillgradient=f.reversescale?n.flipScale(f.colorscale):f.colorscale,r._zrange=[f.min,f.max]}else\"fill\"===u&&(r._fillcolor=c);r._line={color:\"lines\"===u?c:s.color,width:!1!==o.showlines?s.width:0,dash:s.dash},r._levels={start:o.start,end:a(o),size:l}}}},93252:function(t){\"use strict\";t.exports={BOTTOMSTART:[1,9,13,104,713],TOPSTART:[4,6,7,104,713],LEFTSTART:[8,12,14,208,1114],RIGHTSTART:[2,3,11,208,1114],NEWDELTA:[null,[-1,0],[0,-1],[-1,0],[1,0],null,[0,-1],[-1,0],[0,1],[0,1],null,[0,1],[1,0],[1,0],[0,-1]],CHOOSESADDLE:{104:[4,1],208:[2,8],713:[7,13],1114:[11,14]},SADDLEREMAINDER:{1:4,2:8,4:1,7:13,8:2,11:14,13:7,14:11},LABELDISTANCE:2,LABELINCREASE:10,LABELMIN:3,LABELMAX:10,LABELOPTIMIZER:{EDGECOST:1,ANGLECOST:1,NEIGHBORCOST:5,SAMELEVELFACTOR:10,SAMELEVELDISTANCE:5,MAXCOST:100,INITIALSEARCHPOINTS:10,ITERATIONS:5}}},95536:function(t,e,r){\"use strict\";var n=r(38248),i=r(17428),a=r(76308),o=a.addOpacity,s=a.opacity,l=r(69104),u=r(3400).isArrayOrTypedArray,c=l.CONSTRAINT_REDUCTION,f=l.COMPARISON_OPS2;t.exports=function(t,e,r,a,l,h){var p,d,v,g=e.contours,y=r(\"contours.operation\");g._operation=c[y],function(t,e){var r;-1===f.indexOf(e.operation)?(t(\"contours.value\",[0,1]),u(e.value)?e.value.length>2?e.value=e.value.slice(2):0===e.length?e.value=[0,1]:e.length<2?(r=parseFloat(e.value[0]),e.value=[r,r+1]):e.value=[parseFloat(e.value[0]),parseFloat(e.value[1])]:n(e.value)&&(r=parseFloat(e.value),e.value=[r,r+1])):(t(\"contours.value\",0),n(e.value)||(u(e.value)?e.value=parseFloat(e.value[0]):e.value=0))}(r,g),\"=\"===y?p=g.showlines=!0:(p=r(\"contours.showlines\"),v=r(\"fillcolor\",o((t.line||{}).color||l,.5))),p&&(d=r(\"line.color\",v&&s(v)?o(e.fillcolor,1):l),r(\"line.width\",2),r(\"line.dash\")),r(\"line.smoothing\"),i(r,a,d,h)}},3212:function(t,e,r){\"use strict\";var n=r(69104),i=r(38248);function a(t,e){var r,a=Array.isArray(e);function o(t){return i(t)?+t:null}return-1!==n.COMPARISON_OPS2.indexOf(t)?r=o(a?e[0]:e):-1!==n.INTERVAL_OPS.indexOf(t)?r=a?[o(e[0]),o(e[1])]:[o(e),o(e)]:-1!==n.SET_OPS.indexOf(t)&&(r=a?e.map(o):[o(e)]),r}function o(t){return function(e){e=a(t,e);var r=Math.min(e[0],e[1]),n=Math.max(e[0],e[1]);return{start:r,end:n,size:n-r}}}function s(t){return function(e){return{start:e=a(t,e),end:1/0,size:1/0}}}t.exports={\"[]\":o(\"[]\"),\"][\":o(\"][\"),\">\":s(\">\"),\"<\":s(\"<\"),\"=\":s(\"=\")}},84952:function(t){\"use strict\";t.exports=function(t,e,r,n){var i=n(\"contours.start\"),a=n(\"contours.end\"),o=!1===i||!1===a,s=r(\"contours.size\");!(o?e.autocontour=!0:r(\"autocontour\",!1))&&s||r(\"ncontours\")}},82172:function(t,e,r){\"use strict\";var n=r(3400);function i(t){return n.extendFlat({},t,{edgepaths:n.extendDeep([],t.edgepaths),paths:n.extendDeep([],t.paths),starts:n.extendDeep([],t.starts)})}t.exports=function(t,e){var r,a,o,s=function(t){return t.reverse()},l=function(t){return t};switch(e){case\"=\":case\"<\":return t;case\">\":for(1!==t.length&&n.warn(\"Contour data invalid for the specified inequality operation.\"),a=t[0],r=0;r1e3){n.warn(\"Too many contours, clipping at 1000\",t);break}return l}},46960:function(t){\"use strict\";t.exports=function(t){return t.end+t.size/1e6}},88748:function(t,e,r){\"use strict\";var n=r(3400),i=r(93252);function a(t,e,r,n){return Math.abs(t[0]-e[0])20&&e?208===t||1114===t?n=0===r[0]?1:-1:a=0===r[1]?1:-1:-1!==i.BOTTOMSTART.indexOf(t)?a=1:-1!==i.LEFTSTART.indexOf(t)?n=1:-1!==i.TOPSTART.indexOf(t)?a=-1:n=-1,[n,a]}(f,r,e),p=[s(t,e,[-h[0],-h[1]])],d=t.z.length,v=t.z[0].length,g=e.slice(),y=h.slice();for(u=0;u<1e4;u++){if(f>20?(f=i.CHOOSESADDLE[f][(h[0]||h[1])<0?0:1],t.crossings[c]=i.SADDLEREMAINDER[f]):delete t.crossings[c],!(h=i.NEWDELTA[f])){n.log(\"Found bad marching index:\",f,e,t.level);break}p.push(s(t,e,h)),e[0]+=h[0],e[1]+=h[1],c=e.join(\",\"),a(p[p.length-1],p[p.length-2],o,l)&&p.pop();var m=h[0]&&(e[0]<0||e[0]>v-2)||h[1]&&(e[1]<0||e[1]>d-2);if(e[0]===g[0]&&e[1]===g[1]&&h[0]===y[0]&&h[1]===y[1]||r&&m)break;f=t.crossings[c]}1e4===u&&n.log(\"Infinite loop in contour?\");var x,b,_,w,T,k,A,M,S,E,L,C,P,O,I,z=a(p[0],p[p.length-1],o,l),D=0,R=.2*t.smoothing,F=[],B=0;for(u=1;u=B;u--)if((x=F[u])=B&&x+F[b]M&&S--,t.edgepaths[S]=L.concat(p,E));break}V||(t.edgepaths[M]=p.concat(E))}for(M=0;M=m)&&(r<=y&&(r=y),o>=m&&(o=m),l=Math.floor((o-r)/s)+1,u=0),h=0;hy&&(v.unshift(y),g.unshift(g[0])),v[v.length-1]t?0:1)+(e[0][1]>t?0:2)+(e[1][1]>t?0:4)+(e[1][0]>t?0:8);return 5===r||10===r?t>(e[0][0]+e[0][1]+e[1][0]+e[1][1])/4?5===r?713:1114:5===r?104:208:15===r?0:r}t.exports=function(t){var e,r,a,o,s,l,u,c,f,h=t[0].z,p=h.length,d=h[0].length,v=2===p||2===d;for(r=0;r=0&&(n=m,s=l):Math.abs(r[1]-n[1])<.01?Math.abs(r[1]-m[1])<.01&&(m[0]-r[0])*(n[0]-m[0])>=0&&(n=m,s=l):i.log(\"endpt to newendpt is not vert. or horz.\",r,n,m)}if(r=n,s>=0)break;f+=\"L\"+n}if(s===t.edgepaths.length){i.log(\"unclosed perimeter path\");break}h=s,(d=-1===p.indexOf(h))&&(h=p[0],f+=\"Z\")}for(h=0;hn.center?n.right-s:s-n.left)/(c+Math.abs(Math.sin(u)*o)),p=(l>n.middle?n.bottom-l:l-n.top)/(Math.abs(f)+Math.cos(u)*o);if(h<1||p<1)return 1/0;var d=y.EDGECOST*(1/(h-1)+1/(p-1));d+=y.ANGLECOST*u*u;for(var v=s-c,g=l-f,m=s+c,x=l+f,b=0;b2*y.MAXCOST)break;p&&(s/=2),l=(o=u-s/2)+1.5*s}if(h<=y.MAXCOST)return c},e.addLabelData=function(t,e,r,n){var i=e.fontSize,a=e.width+i/3,o=Math.max(0,e.height-i/3),s=t.x,l=t.y,u=t.theta,c=Math.sin(u),f=Math.cos(u),h=function(t,e){return[s+t*f-e*c,l+t*c+e*f]},p=[h(-a/2,-o/2),h(-a/2,o/2),h(a/2,o/2),h(a/2,-o/2)];r.push({text:e.text,x:s,y:l,dy:e.dy,theta:u,level:e.level,width:a,height:o}),n.push(p)},e.drawLabels=function(t,e,r,a,o){var l=t.selectAll(\"text\").data(e,(function(t){return t.text+\",\"+t.x+\",\"+t.y+\",\"+t.theta}));if(l.exit().remove(),l.enter().append(\"text\").attr({\"data-notex\":1,\"text-anchor\":\"middle\"}).each((function(t){var e=t.x+Math.sin(t.theta)*t.dy,i=t.y-Math.cos(t.theta)*t.dy;n.select(this).text(t.text).attr({x:e,y:i,transform:\"rotate(\"+180*t.theta/Math.PI+\" \"+e+\" \"+i+\")\"}).call(s.convertToTspans,r)})),o){for(var u=\"\",c=0;cr.end&&(r.start=r.end=(r.start+r.end)/2),t._input.contours||(t._input.contours={}),i.extendFlat(t._input.contours,{start:r.start,end:r.end,size:r.size}),t._input.autocontour=!0}else if(\"constraint\"!==r.type){var u,c=r.start,f=r.end,h=t._input.contours;c>f&&(r.start=h.start=f,f=r.end=h.end=c,c=r.start),r.size>0||(u=c===f?1:a(c,f,t.ncontours).dtick,h.size=r.size=u)}}},52440:function(t,e,r){\"use strict\";var n=r(33428),i=r(43616),a=r(41648),o=r(41076);t.exports=function(t){var e=n.select(t).selectAll(\"g.contour\");e.style(\"opacity\",(function(t){return t[0].trace.opacity})),e.each((function(t){var e=n.select(this),r=t[0].trace,a=r.contours,s=r.line,l=a.size||1,u=a.start,c=\"constraint\"===a.type,f=!c&&\"lines\"===a.coloring,h=!c&&\"fill\"===a.coloring,p=f||h?o(r):null;e.selectAll(\"g.contourlevel\").each((function(t){n.select(this).selectAll(\"path\").call(i.lineGroupStyle,s.width,f?p(t.level):s.color,s.dash)}));var d=a.labelfont;if(e.selectAll(\"g.contourlabels text\").each((function(t){i.font(n.select(this),{weight:d.weight,style:d.style,variant:d.variant,family:d.family,size:d.size,color:d.color||(f?p(t.level):s.color)})})),c)e.selectAll(\"g.contourfill path\").style(\"fill\",r.fillcolor);else if(h){var v;e.selectAll(\"g.contourfill path\").style(\"fill\",(function(t){return void 0===v&&(v=t.level),p(t.level+.5*l)})),void 0===v&&(v=u),e.selectAll(\"g.contourbg path\").style(\"fill\",p(v-.5*l))}})),a(t)}},97680:function(t,e,r){\"use strict\";var n=r(27260),i=r(17428);t.exports=function(t,e,r,a,o){var s,l=r(\"contours.coloring\"),u=\"\";\"fill\"===l&&(s=r(\"contours.showlines\")),!1!==s&&(\"lines\"!==l&&(u=r(\"line.color\",\"#000\")),r(\"line.width\",.5),r(\"line.dash\")),\"none\"!==l&&(!0!==t.showlegend&&(e.showlegend=!1),e._dfltShowLegend=!1,n(t,e,a,r,{prefix:\"\",cLetter:\"z\"})),r(\"line.smoothing\"),i(r,a,u,o)}},37960:function(t,e,r){\"use strict\";var n=r(83328),i=r(67104),a=r(49084),o=r(92880).extendFlat,s=i.contours;t.exports=o({carpet:{valType:\"string\",editType:\"calc\"},z:n.z,a:n.x,a0:n.x0,da:n.dx,b:n.y,b0:n.y0,db:n.dy,text:n.text,hovertext:n.hovertext,transpose:n.transpose,atype:n.xtype,btype:n.ytype,fillcolor:i.fillcolor,autocontour:i.autocontour,ncontours:i.ncontours,contours:{type:s.type,start:s.start,end:s.end,size:s.size,coloring:{valType:\"enumerated\",values:[\"fill\",\"lines\",\"none\"],dflt:\"fill\",editType:\"calc\"},showlines:s.showlines,showlabels:s.showlabels,labelfont:s.labelfont,labelformat:s.labelformat,operation:s.operation,value:s.value,editType:\"calc\",impliedEdits:{autocontour:!1}},line:{color:i.line.color,width:i.line.width,dash:i.line.dash,smoothing:i.line.smoothing,editType:\"plot\"},zorder:i.zorder,transforms:void 0},a(\"\",{cLetter:\"z\",autoColorDflt:!1}))},30572:function(t,e,r){\"use strict\";var n=r(47128),i=r(3400),a=r(2872),o=r(26136),s=r(70448),l=r(11240),u=r(35744),c=r(3252),f=r(50948),h=r(54444);t.exports=function(t,e){var r=e._carpetTrace=f(t,e);if(r&&r.visible&&\"legendonly\"!==r.visible){if(!e.a||!e.b){var p=t.data[r.index],d=t.data[e.index];d.a||(d.a=p.a),d.b||(d.b=p.b),c(d,e,e._defaultColor,t._fullLayout)}var v=function(t,e){var r,c,f,h,p,d,v,g=e._carpetTrace,y=g.aaxis,m=g.baxis;y._minDtick=0,m._minDtick=0,i.isArray1D(e.z)&&a(e,y,m,\"a\",\"b\",[\"z\"]),r=e._a=e._a||e.a,h=e._b=e._b||e.b,r=r?y.makeCalcdata(e,\"_a\"):[],h=h?m.makeCalcdata(e,\"_b\"):[],c=e.a0||0,f=e.da||1,p=e.b0||0,d=e.db||1,v=e._z=o(e._z||e.z,e.transpose),e._emptypoints=l(v),s(v,e._emptypoints);var x=i.maxRowLength(v),b=\"scaled\"===e.xtype?\"\":r,_=u(e,b,c,f,x,y),w=\"scaled\"===e.ytype?\"\":h,T={a:_,b:u(e,w,p,d,v.length,m),z:v};return\"levels\"===e.contours.type&&\"none\"!==e.contours.coloring&&n(t,e,{vals:v,containerStr:\"\",cLetter:\"z\"}),[T]}(t,e);return h(e,e._z),v}}},3252:function(t,e,r){\"use strict\";var n=r(3400),i=r(51264),a=r(37960),o=r(95536),s=r(84952),l=r(97680);t.exports=function(t,e,r,u){function c(r,i){return n.coerce(t,e,a,r,i)}if(c(\"carpet\"),t.a&&t.b){if(!i(t,e,c,u,\"a\",\"b\"))return void(e.visible=!1);c(\"text\"),\"constraint\"===c(\"contours.type\")?o(t,e,c,u,r,{hasHover:!1}):(s(t,e,c,(function(r){return n.coerce2(t,e,a,r)})),l(t,e,c,u,{hasHover:!1}))}else e._defaultColor=r,e._length=null;c(\"zorder\")}},40448:function(t,e,r){\"use strict\";t.exports={attributes:r(37960),supplyDefaults:r(3252),colorbar:r(55296),calc:r(30572),plot:r(94440),style:r(52440),moduleType:\"trace\",name:\"contourcarpet\",basePlotModule:r(57952),categories:[\"cartesian\",\"svg\",\"carpet\",\"contour\",\"symbols\",\"showLegend\",\"hasLines\",\"carpetDependent\",\"noHover\",\"noSortingByValue\"],meta:{}}},94440:function(t,e,r){\"use strict\";var n=r(33428),i=r(87072),a=r(53416),o=r(43616),s=r(3400),l=r(72424),u=r(88748),c=r(23676),f=r(93252),h=r(82172),p=r(61512),d=r(56008),v=r(50948),g=r(77712);function y(t,e,r){var n=t.getPointAtLength(e),i=t.getPointAtLength(r),a=i.x-n.x,o=i.y-n.y,s=Math.sqrt(a*a+o*o);return[a/s,o/s]}function m(t){var e=Math.sqrt(t[0]*t[0]+t[1]*t[1]);return[t[0]/e,t[1]/e]}function x(t,e){var r=Math.abs(t[0]*e[0]+t[1]*e[1]);return Math.sqrt(1-r*r)/r}t.exports=function(t,e,r,b){var _=e.xaxis,w=e.yaxis;s.makeTraceGroups(b,r,\"contour\").each((function(r){var b=n.select(this),T=r[0],k=T.trace,A=k._carpetTrace=v(t,k),M=t.calcdata[A.index][0];if(A.visible&&\"legendonly\"!==A.visible){var S=T.a,E=T.b,L=k.contours,C=p(L,e,T),P=\"constraint\"===L.type,O=L._operation,I=P?\"=\"===O?\"lines\":\"fill\":L.coloring,z=[[S[0],E[E.length-1]],[S[S.length-1],E[E.length-1]],[S[S.length-1],E[0]],[S[0],E[0]]];l(C);var D=1e-8*(S[S.length-1]-S[0]),R=1e-8*(E[E.length-1]-E[0]);u(C,D,R);var F,B,N,j,U=C;\"constraint\"===L.type&&(U=h(C,O)),function(t,e){var r,n,i,a,o,s,l,u,c;for(r=0;r=0;j--)F=M.clipsegments[j],B=i([],F.x,_.c2p),N=i([],F.y,w.c2p),B.reverse(),N.reverse(),V.push(a(B,N,F.bicubic));var q=\"M\"+V.join(\"L\")+\"Z\";!function(t,e,r,n,o,l){var u,c,f,h,p=s.ensureSingle(t,\"g\",\"contourbg\").selectAll(\"path\").data(\"fill\"!==l||o?[]:[0]);p.enter().append(\"path\"),p.exit().remove();var d=[];for(h=0;h=0&&(h=L,d=v):Math.abs(f[1]-h[1])=0&&(h=L,d=v):s.log(\"endpt to newendpt is not vert. or horz.\",f,h,L)}if(d>=0)break;m+=S(f,h),f=h}if(d===e.edgepaths.length){s.log(\"unclosed perimeter path\");break}c=d,(b=-1===x.indexOf(c))&&(c=x[0],m+=S(f,h)+\"Z\",f=null)}for(c=0;cv&&(n.max=v),n.len=n.max-n.min}function g(t,e){var r,n=0,o=.1;return(Math.abs(t[0]-l)0?+p[c]:0),f.push({type:\"Feature\",geometry:{type:\"Point\",coordinates:y},properties:m})}}var b=o.extractOpts(e),_=b.reversescale?o.flipScale(b.colorscale):b.colorscale,w=_[0][1],T=[\"interpolate\",[\"linear\"],[\"heatmap-density\"],0,a.opacity(w)<1?w:a.addOpacity(w,0)];for(c=1;c<_.length;c++)T.push(_[c][0],_[c][1]);var k=[\"interpolate\",[\"linear\"],[\"get\",\"z\"],b.min,0,b.max,1];return i.extendFlat(u.heatmap.paint,{\"heatmap-weight\":d?k:1/(b.max-b.min),\"heatmap-color\":T,\"heatmap-radius\":v?{type:\"identity\",property:\"r\"}:e.radius,\"heatmap-opacity\":e.opacity}),u.geojson={type:\"FeatureCollection\",features:f},u.heatmap.layout.visibility=\"visible\",u}},97664:function(t,e,r){\"use strict\";var n=r(3400),i=r(27260),a=r(33928);t.exports=function(t,e,r,o){function s(r,i){return n.coerce(t,e,a,r,i)}var l=s(\"lon\")||[],u=s(\"lat\")||[],c=Math.min(l.length,u.length);c?(e._length=c,s(\"z\"),s(\"radius\"),s(\"below\"),s(\"text\"),s(\"hovertext\"),s(\"hovertemplate\"),i(t,e,o,s,{prefix:\"\",cLetter:\"z\"})):e.visible=!1}},96176:function(t){\"use strict\";t.exports=function(t,e){return t.lon=e.lon,t.lat=e.lat,t.z=e.z,t}},25336:function(t,e,r){\"use strict\";var n=r(54460),i=r(63312).hoverPoints,a=r(63312).getExtraText;t.exports=function(t,e,r){var o=i(t,e,r);if(o){var s=o[0],l=s.cd,u=l[0].trace,c=l[s.index];if(delete s.color,\"z\"in c){var f=s.subplot.mockAxis;s.z=c.z,s.zLabel=n.tickText(f,f.c2l(c.z),\"hover\").text}return s.extraText=a(u,c,l[0].t.labels),[s]}}},15088:function(t,e,r){\"use strict\";t.exports={attributes:r(33928),supplyDefaults:r(97664),colorbar:r(96288),formatLabels:r(11960),calc:r(90876),plot:r(35256),hoverPoints:r(25336),eventData:r(96176),getBelow:function(t,e){for(var r=e.getMapLayers(),n=0;n=0;r--)t.removeLayer(e[r][1])},o.dispose=function(){var t=this.subplot.map;this._removeLayers(),t.removeSource(this.sourceId)},t.exports=function(t,e){var r=e[0].trace,i=new a(t,r.uid),o=i.sourceId,s=n(e),l=i.below=t.belowLookup[\"trace-\"+r.uid];return t.map.addSource(o,{type:\"geojson\",data:s.geojson}),i._addLayers(s,l),i}},74248:function(t,e,r){\"use strict\";var n=r(3400);t.exports=function(t,e){for(var r=0;r\"),l.color=function(t,e){var r=t.marker,i=e.mc||r.color,a=e.mlc||r.line.color,o=e.mlw||r.line.width;return n(i)?i:n(a)&&o?a:void 0}(c,h),[l]}}},94704:function(t,e,r){\"use strict\";t.exports={attributes:r(20088),layoutAttributes:r(7076),supplyDefaults:r(45432).supplyDefaults,crossTraceDefaults:r(45432).crossTraceDefaults,supplyLayoutDefaults:r(11631),calc:r(23096),crossTraceCalc:r(4804),plot:r(42200),style:r(44544).style,hoverPoints:r(31488),eventData:r(34580),selectPoints:r(45784),moduleType:\"trace\",name:\"funnel\",basePlotModule:r(57952),categories:[\"bar-like\",\"cartesian\",\"svg\",\"oriented\",\"showLegend\",\"zoomScale\"],meta:{}}},7076:function(t){\"use strict\";t.exports={funnelmode:{valType:\"enumerated\",values:[\"stack\",\"group\",\"overlay\"],dflt:\"stack\",editType:\"calc\"},funnelgap:{valType:\"number\",min:0,max:1,editType:\"calc\"},funnelgroupgap:{valType:\"number\",min:0,max:1,dflt:0,editType:\"calc\"}}},11631:function(t,e,r){\"use strict\";var n=r(3400),i=r(7076);t.exports=function(t,e,r){var a=!1;function o(r,a){return n.coerce(t,e,i,r,a)}for(var s=0;s path\").each((function(t){if(!t.isBlank){var e=s.marker;n.select(this).call(a.fill,t.mc||e.color).call(a.stroke,t.mlc||e.line.color).call(i.dashLine,e.line.dash,t.mlw||e.line.width).style(\"opacity\",s.selectedpoints&&!t.selected?o:1)}})),u(r,s,t),r.selectAll(\".regions\").each((function(){n.select(this).selectAll(\"path\").style(\"stroke-width\",0).call(a.fill,s.connector.fillcolor)})),r.selectAll(\".lines\").each((function(){var t=s.connector.line;i.lineGroupStyle(n.select(this).selectAll(\"path\"),t.width,t.color,t.dash)}))}))}}},22332:function(t,e,r){\"use strict\";var n=r(74996),i=r(45464),a=r(86968).u,o=r(21776).Ks,s=r(21776).Gw,l=r(92880).extendFlat;t.exports={labels:n.labels,label0:n.label0,dlabel:n.dlabel,values:n.values,marker:{colors:n.marker.colors,line:{color:l({},n.marker.line.color,{dflt:null}),width:l({},n.marker.line.width,{dflt:1}),editType:\"calc\"},pattern:n.marker.pattern,editType:\"calc\"},text:n.text,hovertext:n.hovertext,scalegroup:l({},n.scalegroup,{}),textinfo:l({},n.textinfo,{flags:[\"label\",\"text\",\"value\",\"percent\"]}),texttemplate:s({editType:\"plot\"},{keys:[\"label\",\"color\",\"value\",\"text\",\"percent\"]}),hoverinfo:l({},i.hoverinfo,{flags:[\"label\",\"text\",\"value\",\"percent\",\"name\"]}),hovertemplate:o({},{keys:[\"label\",\"color\",\"value\",\"text\",\"percent\"]}),textposition:l({},n.textposition,{values:[\"inside\",\"none\"],dflt:\"inside\"}),textfont:n.textfont,insidetextfont:n.insidetextfont,title:{text:n.title.text,font:n.title.font,position:l({},n.title.position,{values:[\"top left\",\"top center\",\"top right\"],dflt:\"top center\"}),editType:\"plot\"},domain:a({name:\"funnelarea\",trace:!0,editType:\"calc\"}),aspectratio:{valType:\"number\",min:0,dflt:1,editType:\"plot\"},baseratio:{valType:\"number\",min:0,max:1,dflt:.333,editType:\"plot\"}}},91248:function(t,e,r){\"use strict\";var n=r(7316);e.name=\"funnelarea\",e.plot=function(t,r,i,a){n.plotBasePlot(e.name,t,r,i,a)},e.clean=function(t,r,i,a){n.cleanBasePlot(e.name,t,r,i,a)}},54e3:function(t,e,r){\"use strict\";var n=r(45768);t.exports={calc:function(t,e){return n.calc(t,e)},crossTraceCalc:function(t){n.crossTraceCalc(t,{type:\"funnelarea\"})}}},92688:function(t,e,r){\"use strict\";var n=r(3400),i=r(22332),a=r(86968).Q,o=r(31508).handleText,s=r(74174).handleLabelsAndValues,l=r(74174).handleMarkerDefaults;t.exports=function(t,e,r,u){function c(r,a){return n.coerce(t,e,i,r,a)}var f=c(\"labels\"),h=c(\"values\"),p=s(f,h),d=p.len;if(e._hasLabels=p.hasLabels,e._hasValues=p.hasValues,!e._hasLabels&&e._hasValues&&(c(\"label0\"),c(\"dlabel\")),d){e._length=d,l(t,e,u,c),c(\"scalegroup\");var v,g=c(\"text\"),y=c(\"texttemplate\");if(y||(v=c(\"textinfo\",Array.isArray(g)?\"text+percent\":\"percent\")),c(\"hovertext\"),c(\"hovertemplate\"),y||v&&\"none\"!==v){var m=c(\"textposition\");o(t,e,u,c,m,{moduleHasSelected:!1,moduleHasUnselected:!1,moduleHasConstrain:!1,moduleHasCliponaxis:!1,moduleHasTextangle:!1,moduleHasInsideanchor:!1})}else\"none\"===v&&c(\"textposition\",\"none\");a(e,u,c),c(\"title.text\")&&(c(\"title.position\"),n.coerceFont(c,\"title.font\",u.font)),c(\"aspectratio\"),c(\"baseratio\")}else e.visible=!1}},62396:function(t,e,r){\"use strict\";t.exports={moduleType:\"trace\",name:\"funnelarea\",basePlotModule:r(91248),categories:[\"pie-like\",\"funnelarea\",\"showLegend\"],attributes:r(22332),layoutAttributes:r(61280),supplyDefaults:r(92688),supplyLayoutDefaults:r(35384),calc:r(54e3).calc,crossTraceCalc:r(54e3).crossTraceCalc,plot:r(39472),style:r(62096),styleOne:r(10528),meta:{}}},61280:function(t,e,r){\"use strict\";var n=r(85204).hiddenlabels;t.exports={hiddenlabels:n,funnelareacolorway:{valType:\"colorlist\",editType:\"calc\"},extendfunnelareacolors:{valType:\"boolean\",dflt:!0,editType:\"calc\"}}},35384:function(t,e,r){\"use strict\";var n=r(3400),i=r(61280);t.exports=function(t,e){function r(r,a){return n.coerce(t,e,i,r,a)}r(\"hiddenlabels\"),r(\"funnelareacolorway\",e.colorway),r(\"extendfunnelareacolors\")}},39472:function(t,e,r){\"use strict\";var n=r(33428),i=r(43616),a=r(3400),o=a.strScale,s=a.strTranslate,l=r(72736),u=r(98184).toMoveInsideBar,c=r(82744),f=c.recordMinTextSize,h=c.clearMinTextSize,p=r(69656),d=r(37820),v=d.attachFxHandlers,g=d.determineInsideTextFont,y=d.layoutAreas,m=d.prerenderTitles,x=d.positionTitleOutside,b=d.formatSliceLabel;function _(t,e){return\"l\"+(e[0]-t[0])+\",\"+(e[1]-t[1])}t.exports=function(t,e){var r=t._context.staticPlot,c=t._fullLayout;h(\"funnelarea\",c),m(e,t),y(e,c._size),a.makeTraceGroups(c._funnelarealayer,e,\"trace\").each((function(e){var h=n.select(this),d=e[0],y=d.trace;!function(t){if(t.length){var e=t[0],r=e.trace,n=r.aspectratio,i=r.baseratio;i>.999&&(i=.999);var a,o,s,l=Math.pow(i,2),u=e.vTotal,c=u,f=u*l/(1-l)/u,h=[];for(h.push(E()),o=t.length-1;o>-1;o--)if(!(s=t[o]).hidden){var p=s.v/c;f+=p,h.push(E())}var d=1/0,v=-1/0;for(o=0;o-1;o--)if(!(s=t[o]).hidden){var M=h[A+=1][0],S=h[A][1];s.TL=[-M,S],s.TR=[M,S],s.BL=T,s.BR=k,s.pxmid=(_=s.TR,w=s.BR,[.5*(_[0]+w[0]),.5*(_[1]+w[1])]),T=s.TL,k=s.TR}}function E(){var t,e={x:t=Math.sqrt(f),y:-t};return[e.x,e.y]}}(e),h.each((function(){var h=n.select(this).selectAll(\"g.slice\").data(e);h.enter().append(\"g\").classed(\"slice\",!0),h.exit().remove(),h.each((function(o,s){if(o.hidden)n.select(this).selectAll(\"path,g\").remove();else{o.pointNumber=o.i,o.curveNumber=y.index;var h=d.cx,m=d.cy,x=n.select(this),w=x.selectAll(\"path.surface\").data([o]);w.enter().append(\"path\").classed(\"surface\",!0).style({\"pointer-events\":r?\"none\":\"all\"}),x.call(v,t,e);var T=\"M\"+(h+o.TR[0])+\",\"+(m+o.TR[1])+_(o.TR,o.BR)+_(o.BR,o.BL)+_(o.BL,o.TL)+\"Z\";w.attr(\"d\",T),b(t,o,d);var k=p.castOption(y.textposition,o.pts),A=x.selectAll(\"g.slicetext\").data(o.text&&\"none\"!==k?[0]:[]);A.enter().append(\"g\").classed(\"slicetext\",!0),A.exit().remove(),A.each((function(){var r=a.ensureSingle(n.select(this),\"text\",\"\",(function(t){t.attr(\"data-notex\",1)})),p=a.ensureUniformFontSize(t,g(y,o,c.font));r.text(o.text).attr({class:\"slicetext\",transform:\"\",\"text-anchor\":\"middle\"}).call(i.font,p).call(l.convertToTspans,t);var d,v,x,b=i.bBox(r.node()),_=Math.min(o.BL[1],o.BR[1])+m,w=Math.max(o.TL[1],o.TR[1])+m;v=Math.max(o.TL[0],o.BL[0])+h,x=Math.min(o.TR[0],o.BR[0])+h,(d=u(v,x,_,w,b,{isHorizontal:!0,constrained:!0,angle:0,anchor:\"middle\"})).fontSize=p.size,f(y.type,d,c),e[s].transform=d,a.setTransormAndDisplay(r,d)}))}}));var m=n.select(this).selectAll(\"g.titletext\").data(y.title.text?[0]:[]);m.enter().append(\"g\").classed(\"titletext\",!0),m.exit().remove(),m.each((function(){var e=a.ensureSingle(n.select(this),\"text\",\"\",(function(t){t.attr(\"data-notex\",1)})),r=y.title.text;y._meta&&(r=a.templateString(r,y._meta)),e.text(r).attr({class:\"titletext\",transform:\"\",\"text-anchor\":\"middle\"}).call(i.font,y.title.font).call(l.convertToTspans,t);var u=x(d,c._size);e.attr(\"transform\",s(u.x,u.y)+o(Math.min(1,u.scale))+s(u.tx,u.ty))}))}))}))}},62096:function(t,e,r){\"use strict\";var n=r(33428),i=r(10528),a=r(82744).resizeText;t.exports=function(t){var e=t._fullLayout._funnelarealayer.selectAll(\".trace\");a(t,e,\"funnelarea\"),e.each((function(e){var r=e[0].trace,a=n.select(this);a.style({opacity:r.opacity}),a.selectAll(\"path.surface\").each((function(e){n.select(this).call(i,e,r,t)}))}))}},83328:function(t,e,r){\"use strict\";var n=r(52904),i=r(45464),a=r(25376),o=r(29736).axisHoverFormat,s=r(21776).Ks,l=r(21776).Gw,u=r(49084),c=r(92880).extendFlat;t.exports=c({z:{valType:\"data_array\",editType:\"calc\"},x:c({},n.x,{impliedEdits:{xtype:\"array\"}}),x0:c({},n.x0,{impliedEdits:{xtype:\"scaled\"}}),dx:c({},n.dx,{impliedEdits:{xtype:\"scaled\"}}),y:c({},n.y,{impliedEdits:{ytype:\"array\"}}),y0:c({},n.y0,{impliedEdits:{ytype:\"scaled\"}}),dy:c({},n.dy,{impliedEdits:{ytype:\"scaled\"}}),xperiod:c({},n.xperiod,{impliedEdits:{xtype:\"scaled\"}}),yperiod:c({},n.yperiod,{impliedEdits:{ytype:\"scaled\"}}),xperiod0:c({},n.xperiod0,{impliedEdits:{xtype:\"scaled\"}}),yperiod0:c({},n.yperiod0,{impliedEdits:{ytype:\"scaled\"}}),xperiodalignment:c({},n.xperiodalignment,{impliedEdits:{xtype:\"scaled\"}}),yperiodalignment:c({},n.yperiodalignment,{impliedEdits:{ytype:\"scaled\"}}),text:{valType:\"data_array\",editType:\"calc\"},hovertext:{valType:\"data_array\",editType:\"calc\"},transpose:{valType:\"boolean\",dflt:!1,editType:\"calc\"},xtype:{valType:\"enumerated\",values:[\"array\",\"scaled\"],editType:\"calc+clearAxisTypes\"},ytype:{valType:\"enumerated\",values:[\"array\",\"scaled\"],editType:\"calc+clearAxisTypes\"},zsmooth:{valType:\"enumerated\",values:[\"fast\",\"best\",!1],dflt:!1,editType:\"calc\"},hoverongaps:{valType:\"boolean\",dflt:!0,editType:\"none\"},connectgaps:{valType:\"boolean\",editType:\"calc\"},xgap:{valType:\"number\",dflt:0,min:0,editType:\"plot\"},ygap:{valType:\"number\",dflt:0,min:0,editType:\"plot\"},xhoverformat:o(\"x\"),yhoverformat:o(\"y\"),zhoverformat:o(\"z\",1),hovertemplate:s(),texttemplate:l({arrayOk:!1,editType:\"plot\"},{keys:[\"x\",\"y\",\"z\",\"text\"]}),textfont:a({editType:\"plot\",autoSize:!0,autoColor:!0,colorEditType:\"style\"}),showlegend:c({},i.showlegend,{dflt:!1}),zorder:n.zorder},{transforms:void 0},u(\"\",{cLetter:\"z\",autoColorDflt:!1}))},19512:function(t,e,r){\"use strict\";var n=r(24040),i=r(3400),a=r(54460),o=r(1220),s=r(55480),l=r(47128),u=r(2872),c=r(26136),f=r(70448),h=r(11240),p=r(35744),d=r(39032).BADNUM;function v(t){for(var e=[],r=t.length,n=0;n1){var e=(t[t.length-1]-t[0])/(t.length-1),r=Math.abs(e/100);for(k=0;kr)return!1}return!0}(M.rangebreaks||S.rangebreaks)&&(T=function(t,e,r){for(var n=[],i=-1,a=0;a=0;o--)(s=((f[[(r=(a=h[o])[0])-1,i=a[1]]]||v)[2]+(f[[r+1,i]]||v)[2]+(f[[r,i-1]]||v)[2]+(f[[r,i+1]]||v)[2])/20)&&(l[a]=[r,i,s],h.splice(o,1),u=!0);if(!u)throw\"findEmpties iterated with no new neighbors\";for(a in l)f[a]=l[a],c.push(l[a])}return c.sort((function(t,e){return e[2]-t[2]}))}},55512:function(t,e,r){\"use strict\";var n=r(93024),i=r(3400),a=i.isArrayOrTypedArray,o=r(54460),s=r(8932).extractOpts;t.exports=function(t,e,r,l,u){u||(u={});var c,f,h,p,d=u.isContour,v=t.cd[0],g=v.trace,y=t.xa,m=t.ya,x=v.x,b=v.y,_=v.z,w=v.xCenter,T=v.yCenter,k=v.zmask,A=g.zhoverformat,M=x,S=b;if(!1!==t.index){try{h=Math.round(t.index[1]),p=Math.round(t.index[0])}catch(e){return void i.error(\"Error hovering on heatmap, pointNumber must be [row,col], found:\",t.index)}if(h<0||h>=_[0].length||p<0||p>_.length)return}else{if(n.inbox(e-x[0],e-x[x.length-1],0)>0||n.inbox(r-b[0],r-b[b.length-1],0)>0)return;if(d){var E;for(M=[2*x[0]-x[1]],E=1;Ev&&(y=Math.max(y,Math.abs(t[a][o]-d)/(g-v))))}return y}t.exports=function(t,e){var r,i=1;for(o(t,e),r=0;r.01;r++)i=o(t,e,a(i));return i>.01&&n.log(\"interp2d didn't converge quickly\",i),t}},39096:function(t,e,r){\"use strict\";var n=r(3400);t.exports=function(t,e){t(\"texttemplate\");var r=n.extendFlat({},e.font,{color:\"auto\",size:\"auto\"});n.coerceFont(t,\"textfont\",r)}},35744:function(t,e,r){\"use strict\";var n=r(24040),i=r(3400).isArrayOrTypedArray;t.exports=function(t,e,r,a,o,s){var l,u,c,f=[],h=n.traceIs(t,\"contour\"),p=n.traceIs(t,\"histogram\"),d=n.traceIs(t,\"gl2d\");if(i(e)&&e.length>1&&!p&&\"category\"!==s.type){var v=e.length;if(!(v<=o))return h?e.slice(0,o):e.slice(0,o+1);if(h||d)f=Array.from(e).slice(0,o);else if(1===o)f=\"log\"===s.type?[.5*e[0],2*e[0]]:[e[0]-.5,e[0]+.5];else if(\"log\"===s.type){for(f=[Math.pow(e[0],1.5)/Math.pow(e[1],.5)],c=1;c0;)k=A.c2p(N[C]),C--;for(k0;)L=M.c2p(j[C]),C--;L=A._length||k<=0||E>=M._length||L<=0)return I.selectAll(\"image\").data([]).exit().remove(),void b(I);\"fast\"===Z?(J=W,$=G):(J=Q,$=tt);var et=document.createElement(\"canvas\");et.width=J,et.height=$;var rt,nt,it=et.getContext(\"2d\",{willReadFrequently:!0}),at=p(D,{noNumericCheck:!0,returnArray:!0});\"fast\"===Z?(rt=Y?function(t){return W-1-t}:l.identity,nt=X?function(t){return G-1-t}:l.identity):(rt=function(t){return l.constrain(Math.round(A.c2p(N[t])-r),0,Q)},nt=function(t){return l.constrain(Math.round(M.c2p(j[t])-E),0,tt)});var ot,st,lt,ut,ct=nt(0),ft=[ct,ct],ht=Y?0:1,pt=X?0:1,dt=0,vt=0,gt=0,yt=0;function mt(t,e){if(void 0!==t){var r=at(t);return r[0]=Math.round(r[0]),r[1]=Math.round(r[1]),r[2]=Math.round(r[2]),dt+=e,vt+=r[0]*e,gt+=r[1]*e,yt+=r[2]*e,r}return[0,0,0,0]}function xt(t,e,r,n){var i=t[r.bin0];if(void 0===i)return mt(void 0,1);var a,o=t[r.bin1],s=e[r.bin0],l=e[r.bin1],u=o-i||0,c=s-i||0;return a=void 0===o?void 0===l?0:void 0===s?2*(l-i):2*(2*l-s-i)/3:void 0===l?void 0===s?0:2*(2*i-o-s)/3:void 0===s?2*(2*l-o-i)/3:l+i-o-s,mt(i+r.frac*u+n.frac*(c+r.frac*a))}if(\"default\"!==Z){var bt,_t=0;try{bt=new Uint8Array(J*$*4)}catch(t){bt=new Array(J*$*4)}if(\"smooth\"===Z){var wt,Tt,kt,At=U||N,Mt=V||j,St=new Array(At.length),Et=new Array(Mt.length),Lt=new Array(Q),Ct=U?w:_,Pt=V?w:_;for(C=0;CZt||Zt>M._length))for(P=Gt;PJt||Jt>A._length)){var $t=c({x:Kt,y:Xt},D,t._fullLayout);$t.x=Kt,$t.y=Xt;var Qt=z.z[C][P];void 0===Qt?($t.z=\"\",$t.zLabel=\"\"):($t.z=Qt,$t.zLabel=s.tickText(Ut,Qt,\"hover\").text);var te=z.text&&z.text[C]&&z.text[C][P];void 0!==te&&!1!==te||(te=\"\"),$t.text=te;var ee=l.texttemplateString(Nt,$t,t._fullLayout._d3locale,$t,D._meta||{});if(ee){var re=ee.split(\"
\"),ne=re.length,ie=0;for(O=0;O0&&(a=!0);for(var l=0;la){var o=a-r[t];return r[t]=a,o}}return 0},max:function(t,e,r,i){var a=i[e];if(n(a)){if(a=Number(a),!n(r[t]))return r[t]=a,a;if(r[t]u?t>o?t>1.1*i?i:t>1.1*a?a:o:t>s?s:t>l?l:u:Math.pow(10,Math.floor(Math.log(t)/Math.LN10))}function p(t,e,r,n,a,s){if(n&&t>o){var l=d(e,a,s),u=d(r,a,s),c=t===i?0:1;return l[c]!==u[c]}return Math.floor(r/t)-Math.floor(e/t)>.1}function d(t,e,r){var n=e.c2d(t,i,r).split(\"-\");return\"\"===n[0]&&(n.unshift(),n[0]=\"-\"+n[0]),n}t.exports=function(t,e,r,n,a){var s,l,u=-1.1*e,h=-.1*e,p=t-h,d=r[0],v=r[1],g=Math.min(f(d+h,d+p,n,a),f(v+h,v+p,n,a)),y=Math.min(f(d+u,d+h,n,a),f(v+u,v+h,n,a));if(g>y&&yo){var m=s===i?1:6,x=s===i?\"M12\":\"M1\";return function(e,r){var o=n.c2d(e,i,a),s=o.indexOf(\"-\",m);s>0&&(o=o.substr(0,s));var u=n.d2c(o,0,a);if(ur.r2l(B)&&(j=o.tickIncrement(j,b.size,!0,p)),z.start=r.l2r(j),F||i.nestedProperty(e,y+\".start\").set(z.start)}var U=b.end,V=r.r2l(I.end),q=void 0!==V;if((b.endFound||q)&&V!==r.r2l(U)){var H=q?V:i.aggNums(Math.max,null,d);z.end=r.l2r(H),q||i.nestedProperty(e,y+\".start\").set(z.end)}var G=\"autobin\"+s;return!1===e._input[G]&&(e._input[y]=i.extendFlat({},e[y]||{}),delete e._input[G],delete e[G]),[z,d]}t.exports={calc:function(t,e){var r,a,p,d,v=[],g=[],y=\"h\"===e.orientation,m=o.getFromId(t,y?e.yaxis:e.xaxis),x=y?\"y\":\"x\",b={x:\"y\",y:\"x\"}[x],_=e[x+\"calendar\"],w=e.cumulative,T=h(t,e,m,x),k=T[0],A=T[1],M=\"string\"==typeof k.size,S=[],E=M?S:k,L=[],C=[],P=[],O=0,I=e.histnorm,z=e.histfunc,D=-1!==I.indexOf(\"density\");w.enabled&&D&&(I=I.replace(/ ?density$/,\"\"),D=!1);var R,F=\"max\"===z||\"min\"===z?null:0,B=l.count,N=u[I],j=!1,U=function(t){return m.r2c(t,0,_)};for(i.isArrayOrTypedArray(e[b])&&\"count\"!==z&&(R=e[b],j=\"avg\"===z,B=l[z]),r=U(k.start),p=U(k.end)+(r-o.tickIncrement(r,k.size,!1,_))/1e6;r=0&&d=0;n--)s(n);else if(\"increasing\"===e){for(n=1;n=0;n--)t[n]+=t[n+1];\"exclude\"===r&&(t.push(0),t.shift())}}(g,w.direction,w.currentbin);var J=Math.min(v.length,g.length),$=[],Q=0,tt=J-1;for(r=0;r=Q;r--)if(g[r]){tt=r;break}for(r=Q;r<=tt;r++)if(n(v[r])&&n(g[r])){var et={p:v[r],s:g[r],b:0};w.enabled||(et.pts=P[r],W?et.ph0=et.ph1=P[r].length?A[P[r][0]]:v[r]:(e._computePh=!0,et.ph0=H(S[r]),et.ph1=H(S[r+1],!0))),$.push(et)}return 1===$.length&&($[0].width1=o.tickIncrement($[0].p,k.size,!1,_)-$[0].p),s($,e),i.isArrayOrTypedArray(e.selectedpoints)&&i.tagSelected($,e,Z),$},calcAllAutoBins:h}},73316:function(t){\"use strict\";t.exports={eventDataKeys:[\"binNumber\"]}},80536:function(t,e,r){\"use strict\";var n=r(3400),i=r(79811),a=r(24040).traceIs,o=r(20011),s=r(31508).validateCornerradius,l=n.nestedProperty,u=r(71888).getAxisGroup,c=[{aStr:{x:\"xbins.start\",y:\"ybins.start\"},name:\"start\"},{aStr:{x:\"xbins.end\",y:\"ybins.end\"},name:\"end\"},{aStr:{x:\"xbins.size\",y:\"ybins.size\"},name:\"size\"},{aStr:{x:\"nbinsx\",y:\"nbinsy\"},name:\"nbins\"}],f=[\"x\",\"y\"];t.exports=function(t,e){var r,h,p,d,v,g,y,m=e._histogramBinOpts={},x=[],b={},_=[];function w(t,e){return n.coerce(r._input,r,r._module.attributes,t,e)}function T(t){return\"v\"===t.orientation?\"x\":\"y\"}function k(t,r,a){var o=t.uid+\"__\"+a;r||(r=o);var s=function(t,r){return i.getFromTrace({_fullLayout:e},t,r).type}(t,a),l=t[a+\"calendar\"]||\"\",u=m[r],c=!0;u&&(s===u.axType&&l===u.calendar?(c=!1,u.traces.push(t),u.dirs.push(a)):(r=o,s!==u.axType&&n.warn([\"Attempted to group the bins of trace\",t.index,\"set on a\",\"type:\"+s,\"axis\",\"with bins on\",\"type:\"+u.axType,\"axis.\"].join(\" \")),l!==u.calendar&&n.warn([\"Attempted to group the bins of trace\",t.index,\"set with a\",l,\"calendar\",\"with bins\",u.calendar?\"on a \"+u.calendar+\" calendar\":\"w/o a set calendar\"].join(\" \")))),c&&(m[r]={traces:[t],dirs:[a],axType:s,calendar:t[a+\"calendar\"]||\"\"}),t[\"_\"+a+\"bingroup\"]=r}for(v=0;vS&&T.splice(S,T.length-S),M.length>S&&M.splice(S,M.length-S);var E=[],L=[],C=[],P=\"string\"==typeof w.size,O=\"string\"==typeof A.size,I=[],z=[],D=P?I:w,R=O?z:A,F=0,B=[],N=[],j=e.histnorm,U=e.histfunc,V=-1!==j.indexOf(\"density\"),q=\"max\"===U||\"min\"===U?null:0,H=a.count,G=o[j],W=!1,Y=[],X=[],Z=\"z\"in e?e.z:\"marker\"in e&&Array.isArray(e.marker.color)?e.marker.color:\"\";Z&&\"count\"!==U&&(W=\"avg\"===U,H=a[U]);var K=w.size,J=x(w.start),$=x(w.end)+(J-i.tickIncrement(J,K,!1,y))/1e6;for(r=J;r<$;r=i.tickIncrement(r,K,!1,y))L.push(q),I.push(r),W&&C.push(0);I.push(r);var Q,tt=L.length,et=(r-J)/tt,rt=(Q=J+et/2,v.c2r(Q,0,y)),nt=A.size,it=b(A.start),at=b(A.end)+(it-i.tickIncrement(it,nt,!1,m))/1e6;for(r=it;r=0&&p=0&&d-1,flipY:C.tiling.flip.indexOf(\"y\")>-1,orientation:C.tiling.orientation,pad:{inner:C.tiling.pad},maxDepth:C._maxDepth}).descendants(),D=1/0,R=-1/0;z.forEach((function(t){var e=t.depth;e>=C._maxDepth?(t.x0=t.x1=(t.x0+t.x1)/2,t.y0=t.y1=(t.y0+t.y1)/2):(D=Math.min(D,e),R=Math.max(R,e))})),d=d.data(z,c.getPtId),C._maxVisibleLayers=isFinite(R)?R-D+1:0,d.enter().append(\"g\").classed(\"slice\",!0),k(d,p,{},[g,y],b),d.order();var F=null;if(T&&S){var B=c.getPtId(S);d.each((function(t){null===F&&c.getPtId(t)===B&&(F={x0:t.x0,x1:t.x1,y0:t.y0,y1:t.y1})}))}var N=function(){return F||{x0:0,x1:g,y0:0,y1:y}},j=d;return T&&(j=j.transition().each(\"end\",(function(){var e=n.select(this);c.setSliceCursor(e,t,{hideOnRoot:!0,hideOnLeaves:!1,isTransitioning:!1})}))),j.each((function(s){s._x0=m(s.x0),s._x1=m(s.x1),s._y0=x(s.y0),s._y1=x(s.y1),s._hoverX=m(s.x1-C.tiling.pad),s._hoverY=x(I?s.y1-C.tiling.pad/2:s.y0+C.tiling.pad/2);var d=n.select(this),v=i.ensureSingle(d,\"path\",\"surface\",(function(t){t.style(\"pointer-events\",E?\"none\":\"all\")}));T?v.transition().attrTween(\"d\",(function(t){var e=A(t,p,N(),[g,y],{orientation:C.tiling.orientation,flipX:C.tiling.flip.indexOf(\"x\")>-1,flipY:C.tiling.flip.indexOf(\"y\")>-1});return function(t){return b(e(t))}})):v.attr(\"d\",b),d.call(f,r,t,e,{styleOne:l,eventDataKeys:u.eventDataKeys,transitionTime:u.CLICK_TRANSITION_TIME,transitionEasing:u.CLICK_TRANSITION_EASING}).call(c.setSliceCursor,t,{isTransitioning:t._transitioning}),v.call(l,s,C,t,{hovered:!1}),s.x0===s.x1||s.y0===s.y1?s._text=\"\":s._text=h(s,r,C,e,L)||\"\";var k=i.ensureSingle(d,\"g\",\"slicetext\"),S=i.ensureSingle(k,\"text\",\"\",(function(t){t.attr(\"data-notex\",1)})),z=i.ensureUniformFontSize(t,c.determineTextFont(C,s,L.font));S.text(s._text||\" \").classed(\"slicetext\",!0).attr(\"text-anchor\",O?\"end\":P?\"start\":\"middle\").call(a.font,z).call(o.convertToTspans,t),s.textBB=a.bBox(S.node()),s.transform=_(s,{fontSize:z.size}),s.transform.fontSize=z.size,T?S.transition().attrTween(\"transform\",(function(t){var e=M(t,p,N(),[g,y]);return function(t){return w(e(t))}})):S.attr(\"transform\",w(s))})),F}},29044:function(t,e,r){\"use strict\";t.exports={moduleType:\"trace\",name:\"icicle\",basePlotModule:r(59564),categories:[],animatable:!0,attributes:r(97376),layoutAttributes:r(90676),supplyDefaults:r(7045),supplyLayoutDefaults:r(4304),calc:r(73876).r,crossTraceCalc:r(73876).q,plot:r(38364),style:r(47192).style,colorbar:r(5528),meta:{}}},90676:function(t){\"use strict\";t.exports={iciclecolorway:{valType:\"colorlist\",editType:\"calc\"},extendiciclecolors:{valType:\"boolean\",dflt:!0,editType:\"calc\"}}},4304:function(t,e,r){\"use strict\";var n=r(3400),i=r(90676);t.exports=function(t,e){function r(r,a){return n.coerce(t,e,i,r,a)}r(\"iciclecolorway\",e.colorway),r(\"extendiciclecolors\")}},25132:function(t,e,r){\"use strict\";var n=r(74148),i=r(83024);t.exports=function(t,e,r){var a=r.flipX,o=r.flipY,s=\"h\"===r.orientation,l=r.maxDepth,u=e[0],c=e[1];l&&(u=(t.height+1)*e[0]/Math.min(t.height+1,l),c=(t.height+1)*e[1]/Math.min(t.height+1,l));var f=n.partition().padding(r.pad.inner).size(s?[e[1],u]:[e[0],c])(t);return(s||a||o)&&i(f,e,{swapXY:s,flipX:a,flipY:o}),f}},38364:function(t,e,r){\"use strict\";var n=r(95808),i=r(67880);t.exports=function(t,e,r,a){return n(t,e,r,a,{type:\"icicle\",drawDescendants:i})}},47192:function(t,e,r){\"use strict\";var n=r(33428),i=r(76308),a=r(3400),o=r(82744).resizeText,s=r(60404);function l(t,e,r,n){var o=e.data.data,l=!e.children,u=o.i,c=a.castOption(r,u,\"marker.line.color\")||i.defaultLine,f=a.castOption(r,u,\"marker.line.width\")||0;t.call(s,e,r,n).style(\"stroke-width\",f).call(i.stroke,c).style(\"opacity\",l?r.leaf.opacity:null)}t.exports={style:function(t){var e=t._fullLayout._iciclelayer.selectAll(\".trace\");o(t,e,\"icicle\"),e.each((function(e){var r=n.select(this),i=e[0].trace;r.style(\"opacity\",i.opacity),r.selectAll(\"path.surface\").each((function(e){n.select(this).call(l,e,i,t)}))}))},styleOne:l}},95188:function(t,e,r){\"use strict\";for(var n=r(45464),i=r(52904).zorder,a=r(21776).Ks,o=r(92880).extendFlat,s=r(47797).colormodel,l=[\"rgb\",\"rgba\",\"rgba256\",\"hsl\",\"hsla\"],u=[],c=[],f=0;f0||n.inbox(r-s.y0,r-(s.y0+s.h*l.dy),0)>0)){var f,h=Math.floor((e-s.x0)/l.dx),p=Math.floor(Math.abs(r-s.y0)/l.dy);if(l._hasZ?f=s.z[p][h]:l._hasSource&&(f=l._canvas.el.getContext(\"2d\",{willReadFrequently:!0}).getImageData(h,p,1,1).data),f){var d,v=s.hi||l.hoverinfo;if(v){var g=v.split(\"+\");-1!==g.indexOf(\"all\")&&(g=[\"color\"]),-1!==g.indexOf(\"color\")&&(d=!0)}var y,m=o.colormodel[l.colormodel],x=m.colormodel||l.colormodel,b=x.length,_=l._scaler(f),w=m.suffix,T=[];(l.hovertemplate||d)&&(T.push(\"[\"+[_[0]+w[0],_[1]+w[1],_[2]+w[2]].join(\", \")),4===b&&T.push(\", \"+_[3]+w[3]),T.push(\"]\"),T=T.join(\"\"),t.extraText=x.toUpperCase()+\": \"+T),a(l.hovertext)&&a(l.hovertext[p])?y=l.hovertext[p][h]:a(l.text)&&a(l.text[p])&&(y=l.text[p][h]);var k=c.c2p(s.y0+(p+.5)*l.dy),A=s.x0+(h+.5)*l.dx,M=s.y0+(p+.5)*l.dy,S=\"[\"+f.slice(0,l.colormodel.length).join(\", \")+\"]\";return[i.extendFlat(t,{index:[p,h],x0:u.c2p(s.x0+h*l.dx),x1:u.c2p(s.x0+(h+1)*l.dx),y0:k,y1:k,color:_,xVal:A,xLabelVal:A,yVal:M,yLabelVal:M,zLabelVal:S,text:y,hovertemplateLabels:{zLabel:S,colorLabel:T,\"color[0]Label\":_[0]+w[0],\"color[1]Label\":_[1]+w[1],\"color[2]Label\":_[2]+w[2],\"color[3]Label\":_[3]+w[3]}})]}}}},48928:function(t,e,r){\"use strict\";t.exports={attributes:r(95188),supplyDefaults:r(13188),calc:r(93336),plot:r(63715),style:r(28576),hoverPoints:r(24892),eventData:r(79972),moduleType:\"trace\",name:\"image\",basePlotModule:r(57952),categories:[\"cartesian\",\"svg\",\"2dMap\",\"noSortingByValue\"],animatable:!1,meta:{}}},63715:function(t,e,r){\"use strict\";var n=r(33428),i=r(3400),a=i.strTranslate,o=r(9616),s=r(47797),l=r(9188),u=r(2264).STYLE;t.exports=function(t,e,r,c){var f=e.xaxis,h=e.yaxis,p=!t._context._exportedPlot&&l();i.makeTraceGroups(c,r,\"im\").each((function(e){var r=n.select(this),l=e[0],c=l.trace,d=(\"fast\"===c.zsmooth||!1===c.zsmooth&&p)&&!c._hasZ&&c._hasSource&&\"linear\"===f.type&&\"linear\"===h.type;c._realImage=d;var v,g,y,m,x,b,_=l.z,w=l.x0,T=l.y0,k=l.w,A=l.h,M=c.dx,S=c.dy;for(b=0;void 0===v&&b0;)g=f.c2p(w+b*M),b--;for(b=0;void 0===m&&b0;)x=h.c2p(T+b*S),b--;gI[0];if(z||D){var R=v+E/2,F=m+L/2;P+=\"transform:\"+a(R+\"px\",F+\"px\")+\"scale(\"+(z?-1:1)+\",\"+(D?-1:1)+\")\"+a(-R+\"px\",-F+\"px\")+\";\"}}C.attr(\"style\",P);var B=new Promise((function(t){if(c._hasZ)t();else if(c._hasSource)if(c._canvas&&c._canvas.el.width===k&&c._canvas.el.height===A&&c._canvas.source===c.source)t();else{var e=document.createElement(\"canvas\");e.width=k,e.height=A;var r=e.getContext(\"2d\",{willReadFrequently:!0});c._image=c._image||new Image;var n=c._image;n.onload=function(){r.drawImage(n,0,0),c._canvas={el:e,source:c.source},t()},n.setAttribute(\"src\",c.source)}})).then((function(){var t,e;if(c._hasZ)e=N((function(t,e){var r=_[e][t];return i.isTypedArray(r)&&(r=Array.from(r)),r})),t=e.toDataURL(\"image/png\");else if(c._hasSource)if(d)t=c.source;else{var r=c._canvas.el.getContext(\"2d\",{willReadFrequently:!0}).getImageData(0,0,k,A).data;e=N((function(t,e){var n=4*(e*k+t);return[r[n],r[n+1],r[n+2],r[n+3]]})),t=e.toDataURL(\"image/png\")}C.attr({\"xlink:href\":t,height:L,width:E,x:v,y:m})}));t._promises.push(B)}function N(t){var e=document.createElement(\"canvas\");e.width=E,e.height=L;var r,n=e.getContext(\"2d\",{willReadFrequently:!0}),a=function(t){return i.constrain(Math.round(f.c2p(w+t*M)-v),0,E)},o=function(t){return i.constrain(Math.round(h.c2p(T+t*S)-m),0,L)},u=s.colormodel[c.colormodel],p=u.colormodel||c.colormodel,d=u.fmt;for(b=0;b0}function T(t){t.each((function(t){m.stroke(n.select(this),t.line.color)})).each((function(t){m.fill(n.select(this),t.color)})).style(\"stroke-width\",(function(t){return t.line.width}))}function k(t,e,r){var n=t._fullLayout,i=o.extendFlat({type:\"linear\",ticks:\"outside\",range:r,showline:!0},e),a={type:\"linear\",_id:\"x\"+e._id},s={letter:\"x\",font:n.font,noAutotickangles:!0,noHover:!0,noTickson:!0};function l(t,e){return o.coerce(i,a,y,t,e)}return v(i,a,l,s,n),g(i,a,l,s),a}function A(t,e,r){return[Math.min(e/t.width,r/t.height),t,e+\"x\"+r]}function M(t,e,r,i){var a=document.createElementNS(\"http://www.w3.org/2000/svg\",\"text\"),o=n.select(a);return o.text(t).attr(\"x\",0).attr(\"y\",0).attr(\"text-anchor\",r).attr(\"data-unformatted\",t).call(p.convertToTspans,i).call(f.font,e),f.bBox(o.node())}function S(t,e,r,n,i,a){var s=\"_cache\"+e;t[s]&&t[s].key===i||(t[s]={key:i,value:r});var l=o.aggNums(a,null,[t[s].value,n],2);return t[s].value=l,l}t.exports=function(t,e,r,v){var g,y=t._fullLayout;w(r)&&v&&(g=v()),o.makeTraceGroups(y._indicatorlayer,e,\"trace\").each((function(e){var v,E,L,C,P,O=e[0].trace,I=n.select(this),z=O._hasGauge,D=O._isAngular,R=O._isBullet,F=O.domain,B={w:y._size.w*(F.x[1]-F.x[0]),h:y._size.h*(F.y[1]-F.y[0]),l:y._size.l+y._size.w*F.x[0],r:y._size.r+y._size.w*(1-F.x[1]),t:y._size.t+y._size.h*(1-F.y[1]),b:y._size.b+y._size.h*F.y[0]},N=B.l+B.w/2,j=B.t+B.h/2,U=Math.min(B.w/2,B.h),V=h.innerRadius*U,q=O.align||\"center\";if(E=j,z){if(D&&(v=N,E=j+U/2,L=function(t){return function(t,e){return[e/Math.sqrt(t.width/2*(t.width/2)+t.height*t.height),t,e]}(t,.9*V)}),R){var H=h.bulletPadding,G=1-h.bulletNumberDomainSize+H;v=B.l+(G+(1-G)*b[q])*B.w,L=function(t){return A(t,(h.bulletNumberDomainSize-H)*B.w,B.h)}}}else v=B.l+b[q]*B.w,L=function(t){return A(t,B.w,B.h)};!function(t,e,r,i){var u,c,h,v=r[0].trace,g=i.numbersX,y=i.numbersY,T=v.align||\"center\",A=x[T],E=i.transitionOpts,L=i.onComplete,C=o.ensureSingle(e,\"g\",\"numbers\"),P=[];v._hasNumber&&P.push(\"number\"),v._hasDelta&&(P.push(\"delta\"),\"left\"===v.delta.position&&P.reverse());var O=C.selectAll(\"text\").data(P);function I(e,r,n,i){if(!e.match(\"s\")||n>=0==i>=0||r(n).slice(-1).match(_)||r(i).slice(-1).match(_))return r;var a=e.slice().replace(\"s\",\"f\").replace(/\\d+/,(function(t){return parseInt(t)-1})),o=k(t,{tickformat:a});return function(t){return Math.abs(t)<1?d.tickText(o,t).text:r(t)}}O.enter().append(\"text\"),O.attr(\"text-anchor\",(function(){return A})).attr(\"class\",(function(t){return t})).attr(\"x\",null).attr(\"y\",null).attr(\"dx\",null).attr(\"dy\",null),O.exit().remove();var z,D=v.mode+v.align;if(v._hasDelta&&(z=function(){var e=k(t,{tickformat:v.delta.valueformat},v._range);e.setScale(),d.prepTicks(e);var i=function(t){return d.tickText(e,t).text},o=v.delta.suffix,s=v.delta.prefix,l=function(t){return v.delta.relative?t.relativeDelta:t.delta},u=function(t,e){return 0===t||\"number\"!=typeof t||isNaN(t)?\"-\":(t>0?v.delta.increasing.symbol:v.delta.decreasing.symbol)+s+e(t)+o},h=function(t){return t.delta>=0?v.delta.increasing.color:v.delta.decreasing.color};void 0===v._deltaLastValue&&(v._deltaLastValue=l(r[0]));var g=C.select(\"text.delta\");function y(){g.text(u(l(r[0]),i)).call(m.fill,h(r[0])).call(p.convertToTspans,t)}return g.call(f.font,v.delta.font).call(m.fill,h({delta:v._deltaLastValue})),w(E)?g.transition().duration(E.duration).ease(E.easing).tween(\"text\",(function(){var t=n.select(this),e=l(r[0]),o=v._deltaLastValue,s=I(v.delta.valueformat,i,o,e),c=a(o,e);return v._deltaLastValue=e,function(e){t.text(u(c(e),s)),t.call(m.fill,h({delta:c(e)}))}})).each(\"end\",(function(){y(),L&&L()})).each(\"interrupt\",(function(){y(),L&&L()})):y(),c=M(u(l(r[0]),i),v.delta.font,A,t),g}(),D+=v.delta.position+v.delta.font.size+v.delta.font.family+v.delta.valueformat,D+=v.delta.increasing.symbol+v.delta.decreasing.symbol,h=c),v._hasNumber&&(function(){var e=k(t,{tickformat:v.number.valueformat},v._range);e.setScale(),d.prepTicks(e);var i=function(t){return d.tickText(e,t).text},o=v.number.suffix,s=v.number.prefix,l=C.select(\"text.number\");function c(){var e=\"number\"==typeof r[0].y?s+i(r[0].y)+o:\"-\";l.text(e).call(f.font,v.number.font).call(p.convertToTspans,t)}w(E)?l.transition().duration(E.duration).ease(E.easing).each(\"end\",(function(){c(),L&&L()})).each(\"interrupt\",(function(){c(),L&&L()})).attrTween(\"text\",(function(){var t=n.select(this),e=a(r[0].lastY,r[0].y);v._lastValue=r[0].y;var l=I(v.number.valueformat,i,r[0].lastY,r[0].y);return function(r){t.text(s+l(e(r))+o)}})):c(),u=M(s+i(r[0].y)+o,v.number.font,A,t)}(),D+=v.number.font.size+v.number.font.family+v.number.valueformat+v.number.suffix+v.number.prefix,h=u),v._hasDelta&&v._hasNumber){var R,F,B=[(u.left+u.right)/2,(u.top+u.bottom)/2],N=[(c.left+c.right)/2,(c.top+c.bottom)/2],j=.75*v.delta.font.size;\"left\"===v.delta.position&&(R=S(v,\"deltaPos\",0,-1*(u.width*b[v.align]+c.width*(1-b[v.align])+j),D,Math.min),F=B[1]-N[1],h={width:u.width+c.width+j,height:Math.max(u.height,c.height),left:c.left+R,right:u.right,top:Math.min(u.top,c.top+F),bottom:Math.max(u.bottom,c.bottom+F)}),\"right\"===v.delta.position&&(R=S(v,\"deltaPos\",0,u.width*(1-b[v.align])+c.width*b[v.align]+j,D,Math.max),F=B[1]-N[1],h={width:u.width+c.width+j,height:Math.max(u.height,c.height),left:u.left,right:c.right+R,top:Math.min(u.top,c.top+F),bottom:Math.max(u.bottom,c.bottom+F)}),\"bottom\"===v.delta.position&&(R=null,F=c.height,h={width:Math.max(u.width,c.width),height:u.height+c.height,left:Math.min(u.left,c.left),right:Math.max(u.right,c.right),top:u.bottom-u.height,bottom:u.bottom+c.height}),\"top\"===v.delta.position&&(R=null,F=u.top,h={width:Math.max(u.width,c.width),height:u.height+c.height,left:Math.min(u.left,c.left),right:Math.max(u.right,c.right),top:u.bottom-u.height-c.height,bottom:u.bottom}),z.attr({dx:R,dy:F})}(v._hasNumber||v._hasDelta)&&C.attr(\"transform\",(function(){var t=i.numbersScaler(h);D+=t[2];var e,r=S(v,\"numbersScale\",1,t[0],D,Math.min);v._scaleNumbers||(r=1),e=v._isAngular?y-r*h.bottom:y-r*(h.top+h.bottom)/2,v._numbersTop=r*h.top+e;var n=h[T];\"center\"===T&&(n=(h.left+h.right)/2);var a=g-r*n;return a=S(v,\"numbersTranslate\",0,a,D,Math.max),l(a,e)+s(r)}))}(t,I,e,{numbersX:v,numbersY:E,numbersScaler:L,transitionOpts:r,onComplete:g}),z&&(C={range:O.gauge.axis.range,color:O.gauge.bgcolor,line:{color:O.gauge.bordercolor,width:0},thickness:1},P={range:O.gauge.axis.range,color:\"rgba(0, 0, 0, 0)\",line:{color:O.gauge.bordercolor,width:O.gauge.borderwidth},thickness:1});var W=I.selectAll(\"g.angular\").data(D?e:[]);W.exit().remove();var Y=I.selectAll(\"g.angularaxis\").data(D?e:[]);Y.exit().remove(),D&&function(t,e,r,a){var o,s,f,h,p=r[0].trace,v=a.size,g=a.radius,y=a.innerRadius,m=a.gaugeBg,x=a.gaugeOutline,b=[v.l+v.w/2,v.t+v.h/2+g/2],_=a.gauge,A=a.layer,M=a.transitionOpts,S=a.onComplete,E=Math.PI/2;function L(t){var e=p.gauge.axis.range[0],r=(t-e)/(p.gauge.axis.range[1]-e)*Math.PI-E;return r<-E?-E:r>E?E:r}function C(t){return n.svg.arc().innerRadius((y+g)/2-t/2*(g-y)).outerRadius((y+g)/2+t/2*(g-y)).startAngle(-E)}function P(t){t.attr(\"d\",(function(t){return C(t.thickness).startAngle(L(t.range[0])).endAngle(L(t.range[1]))()}))}_.enter().append(\"g\").classed(\"angular\",!0),_.attr(\"transform\",l(b[0],b[1])),A.enter().append(\"g\").classed(\"angularaxis\",!0).classed(\"crisp\",!0),A.selectAll(\"g.xangularaxistick,path,text\").remove(),(o=k(t,p.gauge.axis)).type=\"linear\",o.range=p.gauge.axis.range,o._id=\"xangularaxis\",o.ticklabeloverflow=\"allow\",o.setScale();var O=function(t){return(o.range[0]-t.x)/(o.range[1]-o.range[0])*Math.PI+Math.PI},I={},z=d.makeLabelFns(o,0).labelStandoff;I.xFn=function(t){var e=O(t);return Math.cos(e)*z},I.yFn=function(t){var e=O(t),r=Math.sin(e)>0?.2:1;return-Math.sin(e)*(z+t.fontSize*r)+Math.abs(Math.cos(e))*(t.fontSize*c)},I.anchorFn=function(t){var e=O(t),r=Math.cos(e);return Math.abs(r)<.1?\"middle\":r>0?\"start\":\"end\"},I.heightFn=function(t,e,r){var n=O(t);return-.5*(1+Math.sin(n))*r};var D=function(t){return l(b[0]+g*Math.cos(t),b[1]-g*Math.sin(t))};f=function(t){return D(O(t))};if(s=d.calcTicks(o),h=d.getTickSigns(o)[2],o.visible){h=\"inside\"===o.ticks?-1:1;var R=(o.linewidth||1)/2;d.drawTicks(t,o,{vals:s,layer:A,path:\"M\"+h*R+\",0h\"+h*o.ticklen,transFn:function(t){var e=O(t);return D(e)+\"rotate(\"+-u(e)+\")\"}}),d.drawLabels(t,o,{vals:s,layer:A,transFn:f,labelFns:I})}var F=[m].concat(p.gauge.steps),B=_.selectAll(\"g.bg-arc\").data(F);B.enter().append(\"g\").classed(\"bg-arc\",!0).append(\"path\"),B.select(\"path\").call(P).call(T),B.exit().remove();var N=C(p.gauge.bar.thickness),j=_.selectAll(\"g.value-arc\").data([p.gauge.bar]);j.enter().append(\"g\").classed(\"value-arc\",!0).append(\"path\");var U,V,q,H=j.select(\"path\");w(M)?(H.transition().duration(M.duration).ease(M.easing).each(\"end\",(function(){S&&S()})).each(\"interrupt\",(function(){S&&S()})).attrTween(\"d\",(U=N,V=L(r[0].lastY),q=L(r[0].y),function(){var t=i(V,q);return function(e){return U.endAngle(t(e))()}})),p._lastValue=r[0].y):H.attr(\"d\",\"number\"==typeof r[0].y?N.endAngle(L(r[0].y)):\"M0,0Z\"),H.call(T),j.exit().remove(),F=[];var G=p.gauge.threshold.value;(G||0===G)&&F.push({range:[G,G],color:p.gauge.threshold.color,line:{color:p.gauge.threshold.line.color,width:p.gauge.threshold.line.width},thickness:p.gauge.threshold.thickness});var W=_.selectAll(\"g.threshold-arc\").data(F);W.enter().append(\"g\").classed(\"threshold-arc\",!0).append(\"path\"),W.select(\"path\").call(P).call(T),W.exit().remove();var Y=_.selectAll(\"g.gauge-outline\").data([x]);Y.enter().append(\"g\").classed(\"gauge-outline\",!0).append(\"path\"),Y.select(\"path\").call(P).call(T),Y.exit().remove()}(t,0,e,{radius:U,innerRadius:V,gauge:W,layer:Y,size:B,gaugeBg:C,gaugeOutline:P,transitionOpts:r,onComplete:g});var X=I.selectAll(\"g.bullet\").data(R?e:[]);X.exit().remove();var Z=I.selectAll(\"g.bulletaxis\").data(R?e:[]);Z.exit().remove(),R&&function(t,e,r,n){var i,a,o,s,u,c=r[0].trace,f=n.gauge,p=n.layer,v=n.gaugeBg,g=n.gaugeOutline,y=n.size,x=c.domain,b=n.transitionOpts,_=n.onComplete;f.enter().append(\"g\").classed(\"bullet\",!0),f.attr(\"transform\",l(y.l,y.t)),p.enter().append(\"g\").classed(\"bulletaxis\",!0).classed(\"crisp\",!0),p.selectAll(\"g.xbulletaxistick,path,text\").remove();var A=y.h,M=c.gauge.bar.thickness*A,S=x.x[0],E=x.x[0]+(x.x[1]-x.x[0])*(c._hasNumber||c._hasDelta?1-h.bulletNumberDomainSize:1);function L(t){t.attr(\"width\",(function(t){return Math.max(0,i.c2p(t.range[1])-i.c2p(t.range[0]))})).attr(\"x\",(function(t){return i.c2p(t.range[0])})).attr(\"y\",(function(t){return.5*(1-t.thickness)*A})).attr(\"height\",(function(t){return t.thickness*A}))}(i=k(t,c.gauge.axis))._id=\"xbulletaxis\",i.domain=[S,E],i.setScale(),a=d.calcTicks(i),o=d.makeTransTickFn(i),s=d.getTickSigns(i)[2],u=y.t+y.h,i.visible&&(d.drawTicks(t,i,{vals:\"inside\"===i.ticks?d.clipEnds(i,a):a,layer:p,path:d.makeTickPath(i,u,s),transFn:o}),d.drawLabels(t,i,{vals:a,layer:p,transFn:o,labelFns:d.makeLabelFns(i,u)}));var C=[v].concat(c.gauge.steps),P=f.selectAll(\"g.bg-bullet\").data(C);P.enter().append(\"g\").classed(\"bg-bullet\",!0).append(\"rect\"),P.select(\"rect\").call(L).call(T),P.exit().remove();var O=f.selectAll(\"g.value-bullet\").data([c.gauge.bar]);O.enter().append(\"g\").classed(\"value-bullet\",!0).append(\"rect\"),O.select(\"rect\").attr(\"height\",M).attr(\"y\",(A-M)/2).call(T),w(b)?O.select(\"rect\").transition().duration(b.duration).ease(b.easing).each(\"end\",(function(){_&&_()})).each(\"interrupt\",(function(){_&&_()})).attr(\"width\",Math.max(0,i.c2p(Math.min(c.gauge.axis.range[1],r[0].y)))):O.select(\"rect\").attr(\"width\",\"number\"==typeof r[0].y?Math.max(0,i.c2p(Math.min(c.gauge.axis.range[1],r[0].y))):0),O.exit().remove();var I=r.filter((function(){return c.gauge.threshold.value||0===c.gauge.threshold.value})),z=f.selectAll(\"g.threshold-bullet\").data(I);z.enter().append(\"g\").classed(\"threshold-bullet\",!0).append(\"line\"),z.select(\"line\").attr(\"x1\",i.c2p(c.gauge.threshold.value)).attr(\"x2\",i.c2p(c.gauge.threshold.value)).attr(\"y1\",(1-c.gauge.threshold.thickness)/2*A).attr(\"y2\",(1-(1-c.gauge.threshold.thickness)/2)*A).call(m.stroke,c.gauge.threshold.line.color).style(\"stroke-width\",c.gauge.threshold.line.width),z.exit().remove();var D=f.selectAll(\"g.gauge-outline\").data([g]);D.enter().append(\"g\").classed(\"gauge-outline\",!0).append(\"rect\"),D.select(\"rect\").call(L).call(T),D.exit().remove()}(t,0,e,{gauge:X,layer:Z,size:B,gaugeBg:C,gaugeOutline:P,transitionOpts:r,onComplete:g});var K=I.selectAll(\"text.title\").data(e);K.exit().remove(),K.enter().append(\"text\").classed(\"title\",!0),K.attr(\"text-anchor\",(function(){return R?x.right:x[O.title.align]})).text(O.title.text).call(f.font,O.title.font).call(p.convertToTspans,t),K.attr(\"transform\",(function(){var t,e=B.l+B.w*b[O.title.align],r=h.titlePadding,n=f.bBox(K.node());return z?(D&&(t=O.gauge.axis.visible?f.bBox(Y.node()).top-r-n.bottom:B.t+B.h/2-U/2-n.bottom-r),R&&(t=E-(n.top+n.bottom)/2,e=B.l-h.bulletPadding*B.w)):t=O._numbersTop-r-n.bottom,l(e,t)}))}))}},50048:function(t,e,r){\"use strict\";var n=r(49084),i=r(29736).axisHoverFormat,a=r(21776).Ks,o=r(52948),s=r(45464),l=r(92880).extendFlat,u=r(67824).overrideAll,c=t.exports=u(l({x:{valType:\"data_array\"},y:{valType:\"data_array\"},z:{valType:\"data_array\"},value:{valType:\"data_array\"},isomin:{valType:\"number\"},isomax:{valType:\"number\"},surface:{show:{valType:\"boolean\",dflt:!0},count:{valType:\"integer\",dflt:2,min:1},fill:{valType:\"number\",min:0,max:1,dflt:1},pattern:{valType:\"flaglist\",flags:[\"A\",\"B\",\"C\",\"D\",\"E\"],extras:[\"all\",\"odd\",\"even\"],dflt:\"all\"}},spaceframe:{show:{valType:\"boolean\",dflt:!1},fill:{valType:\"number\",min:0,max:1,dflt:.15}},slices:{x:{show:{valType:\"boolean\",dflt:!1},locations:{valType:\"data_array\",dflt:[]},fill:{valType:\"number\",min:0,max:1,dflt:1}},y:{show:{valType:\"boolean\",dflt:!1},locations:{valType:\"data_array\",dflt:[]},fill:{valType:\"number\",min:0,max:1,dflt:1}},z:{show:{valType:\"boolean\",dflt:!1},locations:{valType:\"data_array\",dflt:[]},fill:{valType:\"number\",min:0,max:1,dflt:1}}},caps:{x:{show:{valType:\"boolean\",dflt:!0},fill:{valType:\"number\",min:0,max:1,dflt:1}},y:{show:{valType:\"boolean\",dflt:!0},fill:{valType:\"number\",min:0,max:1,dflt:1}},z:{show:{valType:\"boolean\",dflt:!0},fill:{valType:\"number\",min:0,max:1,dflt:1}}},text:{valType:\"string\",dflt:\"\",arrayOk:!0},hovertext:{valType:\"string\",dflt:\"\",arrayOk:!0},hovertemplate:a(),xhoverformat:i(\"x\"),yhoverformat:i(\"y\"),zhoverformat:i(\"z\"),valuehoverformat:i(\"value\",1),showlegend:l({},s.showlegend,{dflt:!1})},n(\"\",{colorAttr:\"`value`\",showScaleDflt:!0,editTypeOverride:\"calc\"}),{opacity:o.opacity,lightposition:o.lightposition,lighting:o.lighting,flatshading:o.flatshading,contour:o.contour,hoverinfo:l({},s.hoverinfo)}),\"calc\",\"nested\");c.flatshading.dflt=!0,c.lighting.facenormalsepsilon.dflt=0,c.x.editType=c.y.editType=c.z.editType=c.value.editType=\"calc+clearAxisTypes\",c.transforms=void 0},62624:function(t,e,r){\"use strict\";var n=r(47128),i=r(3832).processGrid,a=r(3832).filter;t.exports=function(t,e){e._len=Math.min(e.x.length,e.y.length,e.z.length,e.value.length),e._x=a(e.x,e._len),e._y=a(e.y,e._len),e._z=a(e.z,e._len),e._value=a(e.value,e._len);var r=i(e);e._gridFill=r.fill,e._Xs=r.Xs,e._Ys=r.Ys,e._Zs=r.Zs,e._len=r.len;for(var o=1/0,s=-1/0,l=0;l0;r--){var n=Math.min(e[r],e[r-1]),i=Math.max(e[r],e[r-1]);if(i>n&&n-1}function R(t,e){return null===t?e:t}function F(e,r,n){C();var i,a,o,l=[r],u=[n];if(s>=1)l=[r],u=[n];else if(s>0){var c=function(t,e){var r=t[0],n=t[1],i=t[2],a=function(t,e,r){for(var n=[],i=0;i-1?n[p]:L(d,v,y);h[p]=x>-1?x:O(d,v,y,R(e,m))}i=h[0],a=h[1],o=h[2],t._meshI.push(i),t._meshJ.push(a),t._meshK.push(o),++g}}function B(t,e,r,n){var i=t[3];in&&(i=n);for(var a=(t[3]-i)/(t[3]-e[3]+1e-9),o=[],s=0;s<4;s++)o[s]=(1-a)*t[s]+a*e[s];return o}function N(t,e,r){return t>=e&&t<=r}function j(t){var e=.001*(E-S);return t>=S-e&&t<=E+e}function U(e){for(var r=[],n=0;n<4;n++){var i=e[n];r.push([t._x[i],t._y[i],t._z[i],t._value[i]])}return r}var V=3;function q(t,e,r,n,i,a){a||(a=1),r=[-1,-1,-1];var o=!1,s=[N(e[0][3],n,i),N(e[1][3],n,i),N(e[2][3],n,i)];if(!s[0]&&!s[1]&&!s[2])return!1;var l=function(t,e,r){return j(e[0][3])&&j(e[1][3])&&j(e[2][3])?(F(t,e,r),!0):aMath.abs(L-M)?[A,L]:[L,M];d=!0,Q(r,C[0],C[1]),d=!1}}var I=[[Math.min(S,M),Math.max(S,M)],[Math.min(A,E),Math.max(A,E)]];[\"x\",\"y\",\"z\"].forEach((function(r){for(var n=[],i=0;i0&&(f.push(d.id),\"x\"===r?h.push([d.distRatio,0,0]):\"y\"===r?h.push([0,d.distRatio,0]):h.push([0,0,d.distRatio]))}else c=nt(1,\"x\"===r?b-1:\"y\"===r?_-1:w-1);f.length>0&&(n[a]=\"x\"===r?tt(e,f,o,s,h,n[a]):\"y\"===r?et(e,f,o,s,h,n[a]):rt(e,f,o,s,h,n[a]),a++),c.length>0&&(n[a]=\"x\"===r?K(e,c,o,s,n[a]):\"y\"===r?J(e,c,o,s,n[a]):$(e,c,o,s,n[a]),a++)}var v=t.caps[r];v.show&&v.fill&&(z(v.fill),n[a]=\"x\"===r?K(e,[0,b-1],o,s,n[a]):\"y\"===r?J(e,[0,_-1],o,s,n[a]):$(e,[0,w-1],o,s,n[a]),a++)}})),0===g&&P(),t._meshX=n,t._meshY=i,t._meshZ=a,t._meshIntensity=o,t._Xs=y,t._Ys=m,t._Zs=x}(),t}t.exports={findNearestOnAxis:u,generateIsoMeshes:p,createIsosurfaceTrace:function(t,e){var r=t.glplot.gl,i=n({gl:r}),a=new c(t,i,e.uid);return i._trace=a,a.update(e),t.glplot.add(i),a}}},70548:function(t,e,r){\"use strict\";var n=r(3400),i=r(24040),a=r(50048),o=r(27260);function s(t,e,r,n,a){var s=a(\"isomin\"),l=a(\"isomax\");null!=l&&null!=s&&s>l&&(e.isomin=null,e.isomax=null);var u=a(\"x\"),c=a(\"y\"),f=a(\"z\"),h=a(\"value\");u&&u.length&&c&&c.length&&f&&f.length&&h&&h.length?(i.getComponentMethod(\"calendars\",\"handleTraceDefaults\")(t,e,[\"x\",\"y\",\"z\"],n),a(\"valuehoverformat\"),[\"x\",\"y\",\"z\"].forEach((function(t){a(t+\"hoverformat\");var e=\"caps.\"+t;a(e+\".show\")&&a(e+\".fill\");var r=\"slices.\"+t;a(r+\".show\")&&(a(r+\".fill\"),a(r+\".locations\"))})),a(\"spaceframe.show\")&&a(\"spaceframe.fill\"),a(\"surface.show\")&&(a(\"surface.count\"),a(\"surface.fill\"),a(\"surface.pattern\")),a(\"contour.show\")&&(a(\"contour.color\"),a(\"contour.width\")),[\"text\",\"hovertext\",\"hovertemplate\",\"lighting.ambient\",\"lighting.diffuse\",\"lighting.specular\",\"lighting.roughness\",\"lighting.fresnel\",\"lighting.vertexnormalsepsilon\",\"lighting.facenormalsepsilon\",\"lightposition.x\",\"lightposition.y\",\"lightposition.z\",\"flatshading\",\"opacity\"].forEach((function(t){a(t)})),o(t,e,n,a,{prefix:\"\",cLetter:\"c\"}),e._length=null):e.visible=!1}t.exports={supplyDefaults:function(t,e,r,i){s(t,e,0,i,(function(r,i){return n.coerce(t,e,a,r,i)}))},supplyIsoDefaults:s}},6296:function(t,e,r){\"use strict\";t.exports={attributes:r(50048),supplyDefaults:r(70548).supplyDefaults,calc:r(62624),colorbar:{min:\"cmin\",max:\"cmax\"},plot:r(31460).createIsosurfaceTrace,moduleType:\"trace\",name:\"isosurface\",basePlotModule:r(12536),categories:[\"gl3d\",\"showLegend\"],meta:{}}},52948:function(t,e,r){\"use strict\";var n=r(49084),i=r(29736).axisHoverFormat,a=r(21776).Ks,o=r(16716),s=r(45464),l=r(92880).extendFlat;t.exports=l({x:{valType:\"data_array\",editType:\"calc+clearAxisTypes\"},y:{valType:\"data_array\",editType:\"calc+clearAxisTypes\"},z:{valType:\"data_array\",editType:\"calc+clearAxisTypes\"},i:{valType:\"data_array\",editType:\"calc\"},j:{valType:\"data_array\",editType:\"calc\"},k:{valType:\"data_array\",editType:\"calc\"},text:{valType:\"string\",dflt:\"\",arrayOk:!0,editType:\"calc\"},hovertext:{valType:\"string\",dflt:\"\",arrayOk:!0,editType:\"calc\"},hovertemplate:a({editType:\"calc\"}),xhoverformat:i(\"x\"),yhoverformat:i(\"y\"),zhoverformat:i(\"z\"),delaunayaxis:{valType:\"enumerated\",values:[\"x\",\"y\",\"z\"],dflt:\"z\",editType:\"calc\"},alphahull:{valType:\"number\",dflt:-1,editType:\"calc\"},intensity:{valType:\"data_array\",editType:\"calc\"},intensitymode:{valType:\"enumerated\",values:[\"vertex\",\"cell\"],dflt:\"vertex\",editType:\"calc\"},color:{valType:\"color\",editType:\"calc\"},vertexcolor:{valType:\"data_array\",editType:\"calc\"},facecolor:{valType:\"data_array\",editType:\"calc\"},transforms:void 0},n(\"\",{colorAttr:\"`intensity`\",showScaleDflt:!0,editTypeOverride:\"calc\"}),{opacity:o.opacity,flatshading:{valType:\"boolean\",dflt:!1,editType:\"calc\"},contour:{show:l({},o.contours.x.show,{}),color:o.contours.x.color,width:o.contours.x.width,editType:\"calc\"},lightposition:{x:l({},o.lightposition.x,{dflt:1e5}),y:l({},o.lightposition.y,{dflt:1e5}),z:l({},o.lightposition.z,{dflt:0}),editType:\"calc\"},lighting:l({vertexnormalsepsilon:{valType:\"number\",min:0,max:1,dflt:1e-12,editType:\"calc\"},facenormalsepsilon:{valType:\"number\",min:0,max:1,dflt:1e-6,editType:\"calc\"},editType:\"calc\"},o.lighting),hoverinfo:l({},s.hoverinfo,{editType:\"calc\"}),showlegend:l({},s.showlegend,{dflt:!1})})},1876:function(t,e,r){\"use strict\";var n=r(47128);t.exports=function(t,e){e.intensity&&n(t,e,{vals:e.intensity,containerStr:\"\",cLetter:\"c\"})}},576:function(t,e,r){\"use strict\";var n=r(67792).gl_mesh3d,i=r(67792).delaunay_triangulate,a=r(67792).alpha_shape,o=r(67792).convex_hull,s=r(33040).parseColorScale,l=r(3400).isArrayOrTypedArray,u=r(43080),c=r(8932).extractOpts,f=r(52094);function h(t,e,r){this.scene=t,this.uid=r,this.mesh=e,this.name=\"\",this.color=\"#fff\",this.data=null,this.showContour=!1}var p=h.prototype;function d(t){for(var e=[],r=t.length,n=0;n=e-.5)return!1;return!0}p.handlePick=function(t){if(t.object===this.mesh){var e=t.index=t.data.index;t.data._cellCenter?t.traceCoordinate=t.data.dataCoordinate:t.traceCoordinate=[this.data.x[e],this.data.y[e],this.data.z[e]];var r=this.data.hovertext||this.data.text;return l(r)&&void 0!==r[e]?t.textLabel=r[e]:r&&(t.textLabel=r),!0}},p.update=function(t){var e=this.scene,r=e.fullSceneLayout;this.data=t;var n,l=t.x.length,h=f(v(r.xaxis,t.x,e.dataScale[0],t.xcalendar),v(r.yaxis,t.y,e.dataScale[1],t.ycalendar),v(r.zaxis,t.z,e.dataScale[2],t.zcalendar));if(t.i&&t.j&&t.k){if(t.i.length!==t.j.length||t.j.length!==t.k.length||!y(t.i,l)||!y(t.j,l)||!y(t.k,l))return;n=f(g(t.i),g(t.j),g(t.k))}else n=0===t.alphahull?o(h):t.alphahull>0?a(t.alphahull,h):function(t,e){for(var r=[\"x\",\"y\",\"z\"].indexOf(t),n=[],a=e.length,o=0;oy):g=A>w,y=A;var M=u(w,T,k,A);M.pos=_,M.yc=(w+A)/2,M.i=b,M.dir=g?\"increasing\":\"decreasing\",M.x=M.pos,M.y=[k,T],m&&(M.orig_p=r[b]),d&&(M.tx=e.text[b]),v&&(M.htx=e.hovertext[b]),x.push(M)}else x.push({pos:_,empty:!0})}return e._extremes[l._id]=a.findExtremes(l,n.concat(h,f),{padded:!0}),x.length&&(x[0].t={labels:{open:i(t,\"open:\")+\" \",high:i(t,\"high:\")+\" \",low:i(t,\"low:\")+\" \",close:i(t,\"close:\")+\" \"}}),x}t.exports={calc:function(t,e){var r=a.getFromId(t,e.xaxis),i=a.getFromId(t,e.yaxis),s=function(t,e,r){var i=r._minDiff;if(!i){var a,s=t._fullData,l=[];for(i=1/0,a=0;a\"+u.labels[x]+n.hoverLabelText(s,b,l.yhoverformat):((m=i.extendFlat({},h)).y0=m.y1=_,m.yLabelVal=b,m.yLabel=u.labels[x]+n.hoverLabelText(s,b,l.yhoverformat),m.name=\"\",f.push(m),g[b]=m)}return f}function h(t,e,r,i){var a=t.cd,o=t.ya,l=a[0].trace,f=a[0].t,h=c(t,e,r,i);if(!h)return[];var p=a[h.index],d=h.index=p.i,v=p.dir;function g(t){return f.labels[t]+n.hoverLabelText(o,l[t][d],l.yhoverformat)}var y=p.hi||l.hoverinfo,m=y.split(\"+\"),x=\"all\"===y,b=x||-1!==m.indexOf(\"y\"),_=x||-1!==m.indexOf(\"text\"),w=b?[g(\"open\"),g(\"high\"),g(\"low\"),g(\"close\")+\" \"+u[v]]:[];return _&&s(p,l,w),h.extraText=w.join(\"
\"),h.y0=h.y1=o.c2p(p.yc,!0),[h]}t.exports={hoverPoints:function(t,e,r,n){return t.cd[0].trace.hoverlabel.split?f(t,e,r,n):h(t,e,r,n)},hoverSplit:f,hoverOnPoints:h}},65456:function(t,e,r){\"use strict\";t.exports={moduleType:\"trace\",name:\"ohlc\",basePlotModule:r(57952),categories:[\"cartesian\",\"svg\",\"showLegend\"],meta:{},attributes:r(20279),supplyDefaults:r(23860),calc:r(42812).calc,plot:r(36664),style:r(14008),hoverPoints:r(18720).hoverPoints,selectPoints:r(97384)}},52744:function(t,e,r){\"use strict\";var n=r(24040),i=r(3400);t.exports=function(t,e,r,a){var o=r(\"x\"),s=r(\"open\"),l=r(\"high\"),u=r(\"low\"),c=r(\"close\");if(r(\"hoverlabel.split\"),n.getComponentMethod(\"calendars\",\"handleTraceDefaults\")(t,e,[\"x\"],a),s&&l&&u&&c){var f=Math.min(s.length,l.length,u.length,c.length);return o&&(f=Math.min(f,i.minRowLength(o))),e._length=f,f}}},36664:function(t,e,r){\"use strict\";var n=r(33428),i=r(3400);t.exports=function(t,e,r,a){var o=e.yaxis,s=e.xaxis,l=!!s.rangebreaks;i.makeTraceGroups(a,r,\"trace ohlc\").each((function(t){var e=n.select(this),r=t[0],a=r.t;if(!0!==r.trace.visible||a.empty)e.remove();else{var u=a.tickLen,c=e.selectAll(\"path\").data(i.identity);c.enter().append(\"path\"),c.exit().remove(),c.attr(\"d\",(function(t){if(t.empty)return\"M0,0Z\";var e=s.c2p(t.pos-u,!0),r=s.c2p(t.pos+u,!0),n=l?(e+r)/2:s.c2p(t.pos,!0);return\"M\"+e+\",\"+o.c2p(t.o,!0)+\"H\"+n+\"M\"+n+\",\"+o.c2p(t.h,!0)+\"V\"+o.c2p(t.l,!0)+\"M\"+r+\",\"+o.c2p(t.c,!0)+\"H\"+n}))}}))}},97384:function(t){\"use strict\";t.exports=function(t,e){var r,n=t.cd,i=t.xaxis,a=t.yaxis,o=[],s=n[0].t.bPos||0;if(!1===e)for(r=0;r=t.length)return!1;if(void 0!==e[t[r]])return!1;e[t[r]]=!0}return!0}(r))for(e=0;e0||c(s);u&&(o=\"array\");var f=r(\"categoryorder\",o);\"array\"===f?(r(\"categoryarray\"),r(\"ticktext\")):(delete t.categoryarray,delete t.ticktext),u||\"array\"!==f||(e.categoryorder=\"trace\")}}t.exports=function(t,e,r,c){function h(r,i){return n.coerce(t,e,l,r,i)}var p=s(t,e,{name:\"dimensions\",handleItemDefaults:f}),d=function(t,e,r,o,s){s(\"line.shape\"),s(\"line.hovertemplate\");var l=s(\"line.color\",o.colorway[0]);if(i(t,\"line\")&&n.isArrayOrTypedArray(l)){if(l.length)return s(\"line.colorscale\"),a(t,e,o,s,{prefix:\"line.\",cLetter:\"c\"}),l.length;e.line.color=r}return 1/0}(t,e,r,c,h);o(e,c,h),Array.isArray(p)&&p.length||(e.visible=!1),u(e,p,\"values\",d),h(\"hoveron\"),h(\"hovertemplate\"),h(\"arrangement\"),h(\"bundlecolors\"),h(\"sortpaths\"),h(\"counts\");var v={weight:c.font.weight,style:c.font.style,variant:c.font.variant,family:c.font.family,size:Math.round(c.font.size),color:c.font.color};n.coerceFont(h,\"labelfont\",v);var g={weight:c.font.weight,style:c.font.style,variant:c.font.variant,family:c.font.family,size:Math.round(c.font.size/1.2),color:c.font.color};n.coerceFont(h,\"tickfont\",g)}},22020:function(t,e,r){\"use strict\";t.exports={attributes:r(72140),supplyDefaults:r(76671),calc:r(69136),plot:r(60268),colorbar:{container:\"line\",min:\"cmin\",max:\"cmax\"},moduleType:\"trace\",name:\"parcats\",basePlotModule:r(91800),categories:[\"noOpacity\"],meta:{}}},51036:function(t,e,r){\"use strict\";var n=r(33428),i=r(67756).Gz,a=r(36424),o=r(93024),s=r(3400),l=s.strTranslate,u=r(43616),c=r(49760),f=r(72736);function h(t,e,r,i){var a=e._context.staticPlot,o=t.map(F.bind(0,e,r)),c=i.selectAll(\"g.parcatslayer\").data([null]);c.enter().append(\"g\").attr(\"class\",\"parcatslayer\").style(\"pointer-events\",a?\"none\":\"all\");var h=c.selectAll(\"g.trace.parcats\").data(o,p),m=h.enter().append(\"g\").attr(\"class\",\"trace parcats\");h.attr(\"transform\",(function(t){return l(t.x,t.y)})),m.append(\"g\").attr(\"class\",\"paths\");var x=h.select(\"g.paths\").selectAll(\"path.path\").data((function(t){return t.paths}),p);x.attr(\"fill\",(function(t){return t.model.color}));var w=x.enter().append(\"path\").attr(\"class\",\"path\").attr(\"stroke-opacity\",0).attr(\"fill\",(function(t){return t.model.color})).attr(\"fill-opacity\",0);_(w),x.attr(\"d\",(function(t){return t.svgD})),w.empty()||x.sort(v),x.exit().remove(),x.on(\"mouseover\",g).on(\"mouseout\",y).on(\"click\",b),m.append(\"g\").attr(\"class\",\"dimensions\");var A=h.select(\"g.dimensions\").selectAll(\"g.dimension\").data((function(t){return t.dimensions}),p);A.enter().append(\"g\").attr(\"class\",\"dimension\"),A.attr(\"transform\",(function(t){return l(t.x,0)})),A.exit().remove();var M=A.selectAll(\"g.category\").data((function(t){return t.categories}),p),S=M.enter().append(\"g\").attr(\"class\",\"category\");M.attr(\"transform\",(function(t){return l(0,t.y)})),S.append(\"rect\").attr(\"class\",\"catrect\").attr(\"pointer-events\",\"none\"),M.select(\"rect.catrect\").attr(\"fill\",\"none\").attr(\"width\",(function(t){return t.width})).attr(\"height\",(function(t){return t.height})),T(S);var E=M.selectAll(\"rect.bandrect\").data((function(t){return t.bands}),p);E.each((function(){s.raiseToTop(this)})),E.attr(\"fill\",(function(t){return t.color}));var z=E.enter().append(\"rect\").attr(\"class\",\"bandrect\").attr(\"stroke-opacity\",0).attr(\"fill\",(function(t){return t.color})).attr(\"fill-opacity\",0);E.attr(\"fill\",(function(t){return t.color})).attr(\"width\",(function(t){return t.width})).attr(\"height\",(function(t){return t.height})).attr(\"y\",(function(t){return t.y})).attr(\"cursor\",(function(t){return\"fixed\"===t.parcatsViewModel.arrangement?\"default\":\"perpendicular\"===t.parcatsViewModel.arrangement?\"ns-resize\":\"move\"})),k(z),E.exit().remove(),S.append(\"text\").attr(\"class\",\"catlabel\").attr(\"pointer-events\",\"none\");var D=e._fullLayout.paper_bgcolor;M.select(\"text.catlabel\").attr(\"text-anchor\",(function(t){return d(t)?\"start\":\"end\"})).attr(\"alignment-baseline\",\"middle\").style(\"text-shadow\",f.makeTextShadow(D)).style(\"fill\",\"rgb(0, 0, 0)\").attr(\"x\",(function(t){return d(t)?t.width+5:-5})).attr(\"y\",(function(t){return t.height/2})).text((function(t){return t.model.categoryLabel})).each((function(t){u.font(n.select(this),t.parcatsViewModel.categorylabelfont),f.convertToTspans(n.select(this),e)})),S.append(\"text\").attr(\"class\",\"dimlabel\"),M.select(\"text.dimlabel\").attr(\"text-anchor\",\"middle\").attr(\"alignment-baseline\",\"baseline\").attr(\"cursor\",(function(t){return\"fixed\"===t.parcatsViewModel.arrangement?\"default\":\"ew-resize\"})).attr(\"x\",(function(t){return t.width/2})).attr(\"y\",-5).text((function(t,e){return 0===e?t.parcatsViewModel.model.dimensions[t.model.dimensionInd].dimensionLabel:null})).each((function(t){u.font(n.select(this),t.parcatsViewModel.labelfont)})),M.selectAll(\"rect.bandrect\").on(\"mouseover\",L).on(\"mouseout\",C),M.exit().remove(),A.call(n.behavior.drag().origin((function(t){return{x:t.x,y:0}})).on(\"dragstart\",P).on(\"drag\",O).on(\"dragend\",I)),h.each((function(t){t.traceSelection=n.select(this),t.pathSelection=n.select(this).selectAll(\"g.paths\").selectAll(\"path.path\"),t.dimensionSelection=n.select(this).selectAll(\"g.dimensions\").selectAll(\"g.dimension\")})),h.exit().remove()}function p(t){return t.key}function d(t){var e=t.parcatsViewModel.dimensions.length,r=t.parcatsViewModel.dimensions[e-1].model.dimensionInd;return t.model.dimensionInd===r}function v(t,e){return t.model.rawColor>e.model.rawColor?1:t.model.rawColor\"),L=n.mouse(f)[0];o.loneHover({trace:h,x:b-d.left+v.left,y:_-d.top+v.top,text:E,color:t.model.color,borderColor:\"black\",fontFamily:'Monaco, \"Courier New\", monospace',fontSize:10,fontColor:T,idealAlign:L1&&h.displayInd===f.dimensions.length-1?(i=u.left,a=\"left\"):(i=u.left+u.width,a=\"right\");var v=c.model.count,g=c.model.categoryLabel,y=v/c.parcatsViewModel.model.count,m={countLabel:v,categoryLabel:g,probabilityLabel:y.toFixed(3)},x=[];-1!==c.parcatsViewModel.hoverinfoItems.indexOf(\"count\")&&x.push([\"Count:\",m.countLabel].join(\" \")),-1!==c.parcatsViewModel.hoverinfoItems.indexOf(\"probability\")&&x.push([\"P(\"+m.categoryLabel+\"):\",m.probabilityLabel].join(\" \"));var b=x.join(\"
\");return{trace:p,x:o*(i-e.left),y:s*(d-e.top),text:b,color:\"lightgray\",borderColor:\"black\",fontFamily:'Monaco, \"Courier New\", monospace',fontSize:12,fontColor:\"black\",idealAlign:a,hovertemplate:p.hovertemplate,hovertemplateLabels:m,eventData:[{data:p._input,fullData:p,count:v,category:g,probability:y}]}}function L(t){if(!t.parcatsViewModel.dragDimension&&-1===t.parcatsViewModel.hoverinfoItems.indexOf(\"skip\")){if(n.mouse(this)[1]<-1)return;var e,r=t.parcatsViewModel.graphDiv,i=r._fullLayout,a=i._paperdiv.node().getBoundingClientRect(),l=t.parcatsViewModel.hoveron,u=this;\"color\"===l?(function(t){var e=n.select(t).datum(),r=A(e);w(r),r.each((function(){s.raiseToTop(this)})),n.select(t.parentNode).selectAll(\"rect.bandrect\").filter((function(t){return t.color===e.color})).each((function(){s.raiseToTop(this),n.select(this).attr(\"stroke\",\"black\").attr(\"stroke-width\",1.5)}))}(u),S(u,\"plotly_hover\",n.event)):(function(t){n.select(t.parentNode).selectAll(\"rect.bandrect\").each((function(t){var e=A(t);w(e),e.each((function(){s.raiseToTop(this)}))})),n.select(t.parentNode).select(\"rect.catrect\").attr(\"stroke\",\"black\").attr(\"stroke-width\",2.5)}(u),M(u,\"plotly_hover\",n.event)),-1===t.parcatsViewModel.hoverinfoItems.indexOf(\"none\")&&(\"category\"===l?e=E(r,a,u):\"color\"===l?e=function(t,e,r){t._fullLayout._calcInverseTransform(t);var i,a,o=t._fullLayout._invScaleX,s=t._fullLayout._invScaleY,l=r.getBoundingClientRect(),u=n.select(r).datum(),f=u.categoryViewModel,h=f.parcatsViewModel,p=h.model.dimensions[f.model.dimensionInd],d=h.trace,v=l.y+l.height/2;h.dimensions.length>1&&p.displayInd===h.dimensions.length-1?(i=l.left,a=\"left\"):(i=l.left+l.width,a=\"right\");var g=f.model.categoryLabel,y=u.parcatsViewModel.model.count,m=0;u.categoryViewModel.bands.forEach((function(t){t.color===u.color&&(m+=t.count)}));var x=f.model.count,b=0;h.pathSelection.each((function(t){t.model.color===u.color&&(b+=t.model.count)}));var _=m/y,w=m/b,T=m/x,k={countLabel:m,categoryLabel:g,probabilityLabel:_.toFixed(3)},A=[];-1!==f.parcatsViewModel.hoverinfoItems.indexOf(\"count\")&&A.push([\"Count:\",k.countLabel].join(\" \")),-1!==f.parcatsViewModel.hoverinfoItems.indexOf(\"probability\")&&(A.push(\"P(color ∩ \"+g+\"): \"+k.probabilityLabel),A.push(\"P(\"+g+\" | color): \"+w.toFixed(3)),A.push(\"P(color | \"+g+\"): \"+T.toFixed(3)));var M=A.join(\"
\"),S=c.mostReadable(u.color,[\"black\",\"white\"]);return{trace:d,x:o*(i-e.left),y:s*(v-e.top),text:M,color:u.color,borderColor:\"black\",fontFamily:'Monaco, \"Courier New\", monospace',fontColor:S,fontSize:10,idealAlign:a,hovertemplate:d.hovertemplate,hovertemplateLabels:k,eventData:[{data:d._input,fullData:d,category:g,count:y,probability:_,categorycount:x,colorcount:b,bandcolorcount:m}]}}(r,a,u):\"dimension\"===l&&(e=function(t,e,r){var i=[];return n.select(r.parentNode.parentNode).selectAll(\"g.category\").select(\"rect.catrect\").each((function(){i.push(E(t,e,this))})),i}(r,a,u)),e&&o.loneHover(e,{container:i._hoverlayer.node(),outerContainer:i._paper.node(),gd:r}))}}function C(t){var e=t.parcatsViewModel;e.dragDimension||(_(e.pathSelection),T(e.dimensionSelection.selectAll(\"g.category\")),k(e.dimensionSelection.selectAll(\"g.category\").selectAll(\"rect.bandrect\")),o.loneUnhover(e.graphDiv._fullLayout._hoverlayer.node()),e.pathSelection.sort(v),-1!==e.hoverinfoItems.indexOf(\"skip\"))||(\"color\"===t.parcatsViewModel.hoveron?S(this,\"plotly_unhover\",n.event):M(this,\"plotly_unhover\",n.event))}function P(t){\"fixed\"!==t.parcatsViewModel.arrangement&&(t.dragDimensionDisplayInd=t.model.displayInd,t.initialDragDimensionDisplayInds=t.parcatsViewModel.model.dimensions.map((function(t){return t.displayInd})),t.dragHasMoved=!1,t.dragCategoryDisplayInd=null,n.select(this).selectAll(\"g.category\").select(\"rect.catrect\").each((function(e){var r=n.mouse(this)[0],i=n.mouse(this)[1];-2<=r&&r<=e.width+2&&-2<=i&&i<=e.height+2&&(t.dragCategoryDisplayInd=e.model.displayInd,t.initialDragCategoryDisplayInds=t.model.categories.map((function(t){return t.displayInd})),e.model.dragY=e.y,s.raiseToTop(this.parentNode),n.select(this.parentNode).selectAll(\"rect.bandrect\").each((function(e){e.yf.y+f.height/2&&(o.model.displayInd=f.model.displayInd,f.model.displayInd=l),t.dragCategoryDisplayInd=o.model.displayInd}if(null===t.dragCategoryDisplayInd||\"freeform\"===t.parcatsViewModel.arrangement){a.model.dragX=n.event.x;var h=t.parcatsViewModel.dimensions[r],p=t.parcatsViewModel.dimensions[i];void 0!==h&&a.model.dragXp.x&&(a.model.displayInd=p.model.displayInd,p.model.displayInd=t.dragDimensionDisplayInd),t.dragDimensionDisplayInd=a.model.displayInd}j(t.parcatsViewModel),N(t.parcatsViewModel),R(t.parcatsViewModel),D(t.parcatsViewModel)}}function I(t){if(\"fixed\"!==t.parcatsViewModel.arrangement&&null!==t.dragDimensionDisplayInd){n.select(this).selectAll(\"text\").attr(\"font-weight\",\"normal\");var e={},r=z(t.parcatsViewModel),i=t.parcatsViewModel.model.dimensions.map((function(t){return t.displayInd})),o=t.initialDragDimensionDisplayInds.some((function(t,e){return t!==i[e]}));o&&i.forEach((function(r,n){var i=t.parcatsViewModel.model.dimensions[n].containerInd;e[\"dimensions[\"+i+\"].displayindex\"]=r}));var s=!1;if(null!==t.dragCategoryDisplayInd){var l=t.model.categories.map((function(t){return t.displayInd}));if(s=t.initialDragCategoryDisplayInds.some((function(t,e){return t!==l[e]}))){var u=t.model.categories.slice().sort((function(t,e){return t.displayInd-e.displayInd})),c=u.map((function(t){return t.categoryValue})),f=u.map((function(t){return t.categoryLabel}));e[\"dimensions[\"+t.model.containerInd+\"].categoryarray\"]=[c],e[\"dimensions[\"+t.model.containerInd+\"].ticktext\"]=[f],e[\"dimensions[\"+t.model.containerInd+\"].categoryorder\"]=\"array\"}}-1===t.parcatsViewModel.hoverinfoItems.indexOf(\"skip\")&&!t.dragHasMoved&&t.potentialClickBand&&(\"color\"===t.parcatsViewModel.hoveron?S(t.potentialClickBand,\"plotly_click\",n.event.sourceEvent):M(t.potentialClickBand,\"plotly_click\",n.event.sourceEvent)),t.model.dragX=null,null!==t.dragCategoryDisplayInd&&(t.parcatsViewModel.dimensions[t.dragDimensionDisplayInd].categories[t.dragCategoryDisplayInd].model.dragY=null,t.dragCategoryDisplayInd=null),t.dragDimensionDisplayInd=null,t.parcatsViewModel.dragDimension=null,t.dragHasMoved=null,t.potentialClickBand=null,j(t.parcatsViewModel),N(t.parcatsViewModel),n.transition().duration(300).ease(\"cubic-in-out\").each((function(){R(t.parcatsViewModel,!0),D(t.parcatsViewModel,!0)})).each(\"end\",(function(){(o||s)&&a.restyle(t.parcatsViewModel.graphDiv,e,[r])}))}}function z(t){for(var e,r=t.graphDiv._fullData,n=0;n=0;s--)c+=\"C\"+u[s]+\",\"+(e[s+1]+n)+\" \"+l[s]+\",\"+(e[s]+n)+\" \"+(t[s]+r[s])+\",\"+(e[s]+n),c+=\"l-\"+r[s]+\",0 \";return c+\"Z\"}function N(t){var e=t.dimensions,r=t.model,n=e.map((function(t){return t.categories.map((function(t){return t.y}))})),i=t.model.dimensions.map((function(t){return t.categories.map((function(t){return t.displayInd}))})),a=t.model.dimensions.map((function(t){return t.displayInd})),o=t.dimensions.map((function(t){return t.model.dimensionInd})),s=e.map((function(t){return t.x})),l=e.map((function(t){return t.width})),u=[];for(var c in r.paths)r.paths.hasOwnProperty(c)&&u.push(r.paths[c]);function f(t){var e=t.categoryInds.map((function(t,e){return i[e][t]}));return o.map((function(t){return e[t]}))}u.sort((function(e,r){var n=f(e),i=f(r);return\"backward\"===t.sortpaths&&(n.reverse(),i.reverse()),n.push(e.valueInds[0]),i.push(r.valueInds[0]),t.bundlecolors&&(n.unshift(e.rawColor),i.unshift(r.rawColor)),ni?1:0}));for(var h=new Array(u.length),p=e[0].model.count,d=e[0].categories.map((function(t){return t.height})).reduce((function(t,e){return t+e})),v=0;v0?d*(y.count/p):0;for(var m,x=new Array(n.length),b=0;b1?(t.width-80-16)/(n-1):0)*i;var a,o,s,l,u,c=[],f=t.model.maxCats,h=e.categories.length,p=e.count,d=t.height-8*(f-1),v=8*(f-h)/2,g=e.categories.map((function(t){return{displayInd:t.displayInd,categoryInd:t.categoryInd}}));for(g.sort((function(t,e){return t.displayInd-e.displayInd})),u=0;u0?o.count/p*d:0,s={key:o.valueInds[0],model:o,width:16,height:a,y:null!==o.dragY?o.dragY:v,bands:[],parcatsViewModel:t},v=v+a+8,c.push(s);return{key:e.dimensionInd,x:null!==e.dragX?e.dragX:r,y:0,width:16,model:e,categories:c,parcatsViewModel:t,dragCategoryDisplayInd:null,dragDimensionDisplayInd:null,initialDragDimensionDisplayInds:null,initialDragCategoryDisplayInds:null,dragHasMoved:null,potentialClickBand:null}}t.exports=function(t,e,r,n){h(r,t,n,e)}},60268:function(t,e,r){\"use strict\";var n=r(51036);t.exports=function(t,e,r,i){var a=t._fullLayout,o=a._paper,s=a._size;n(t,o,e,{width:s.w,height:s.h,margin:{t:s.t,r:s.r,b:s.b,l:s.l}},r,i)}},82296:function(t,e,r){\"use strict\";var n=r(49084),i=r(94724),a=r(25376),o=r(86968).u,s=r(92880).extendFlat,l=r(31780).templatedArray;t.exports={domain:o({name:\"parcoords\",trace:!0,editType:\"plot\"}),labelangle:{valType:\"angle\",dflt:0,editType:\"plot\"},labelside:{valType:\"enumerated\",values:[\"top\",\"bottom\"],dflt:\"top\",editType:\"plot\"},labelfont:a({editType:\"plot\"}),tickfont:a({editType:\"plot\"}),rangefont:a({editType:\"plot\"}),dimensions:l(\"dimension\",{label:{valType:\"string\",editType:\"plot\"},tickvals:s({},i.tickvals,{editType:\"plot\"}),ticktext:s({},i.ticktext,{editType:\"plot\"}),tickformat:s({},i.tickformat,{editType:\"plot\"}),visible:{valType:\"boolean\",dflt:!0,editType:\"plot\"},range:{valType:\"info_array\",items:[{valType:\"number\",editType:\"plot\"},{valType:\"number\",editType:\"plot\"}],editType:\"plot\"},constraintrange:{valType:\"info_array\",freeLength:!0,dimensions:\"1-2\",items:[{valType:\"any\",editType:\"plot\"},{valType:\"any\",editType:\"plot\"}],editType:\"plot\"},multiselect:{valType:\"boolean\",dflt:!0,editType:\"plot\"},values:{valType:\"data_array\",editType:\"calc\"},editType:\"calc\"}),line:s({editType:\"calc\"},n(\"line\",{colorscaleDflt:\"Viridis\",autoColorDflt:!1,editTypeOverride:\"calc\"})),unselected:{line:{color:{valType:\"color\",dflt:\"#7f7f7f\",editType:\"plot\"},opacity:{valType:\"number\",min:0,max:1,dflt:\"auto\",editType:\"plot\"},editType:\"plot\"},editType:\"plot\"}}},71864:function(t,e,r){\"use strict\";var n=r(30140),i=r(33428),a=r(71688).keyFun,o=r(71688).repeat,s=r(3400).sorterAsc,l=r(3400).strTranslate,u=n.bar.snapRatio;function c(t,e){return t*(1-u)+e*u}var f=n.bar.snapClose;function h(t,e){return t*(1-f)+e*f}function p(t,e,r,n){if(function(t,e){for(var r=0;r=e[r][0]&&t<=e[r][1])return!0;return!1}(r,n))return r;var i=t?-1:1,a=0,o=e.length-1;if(i<0){var s=a;a=o,o=s}for(var l=e[a],u=l,f=a;i*fe){h=r;break}}if(a=c,isNaN(a)&&(a=isNaN(f)||isNaN(h)?isNaN(f)?h:f:e-u[f][1]t[1]+r||e=.9*t[1]+.1*t[0]?\"n\":e<=.9*t[0]+.1*t[1]?\"s\":\"ns\"}(d,e);v&&(o.interval=l[a],o.intervalPix=d,o.region=v)}}if(t.ordinal&&!o.region){var g=t.unitTickvals,m=t.unitToPaddedPx.invert(e);for(r=0;r=x[0]&&m<=x[1]){o.clickableOrdinalRange=x;break}}}return o}function w(t,e){i.event.sourceEvent.stopPropagation();var r=e.height-i.mouse(t)[1]-2*n.verticalPadding,a=e.brush.svgBrush;a.wasDragged=!0,a._dragging=!0,a.grabbingBar?a.newExtent=[r-a.grabPoint,r+a.barLength-a.grabPoint].map(e.unitToPaddedPx.invert):a.newExtent=[a.startExtent,e.unitToPaddedPx.invert(r)].sort(s),e.brush.filterSpecified=!0,a.extent=a.stayingIntervals.concat([a.newExtent]),a.brushCallback(e),b(t.parentNode)}function T(t,e){var r=_(e,e.height-i.mouse(t)[1]-2*n.verticalPadding),a=\"crosshair\";r.clickableOrdinalRange?a=\"pointer\":r.region&&(a=r.region+\"-resize\"),i.select(document.body).style(\"cursor\",a)}function k(t){t.on(\"mousemove\",(function(t){i.event.preventDefault(),t.parent.inBrushDrag||T(this,t)})).on(\"mouseleave\",(function(t){t.parent.inBrushDrag||m()})).call(i.behavior.drag().on(\"dragstart\",(function(t){!function(t,e){i.event.sourceEvent.stopPropagation();var r=e.height-i.mouse(t)[1]-2*n.verticalPadding,a=e.unitToPaddedPx.invert(r),o=e.brush,s=_(e,r),l=s.interval,u=o.svgBrush;if(u.wasDragged=!1,u.grabbingBar=\"ns\"===s.region,u.grabbingBar){var c=l.map(e.unitToPaddedPx);u.grabPoint=r-c[0]-n.verticalPadding,u.barLength=c[1]-c[0]}u.clickableOrdinalRange=s.clickableOrdinalRange,u.stayingIntervals=e.multiselect&&o.filterSpecified?o.filter.getConsolidated():[],l&&(u.stayingIntervals=u.stayingIntervals.filter((function(t){return t[0]!==l[0]&&t[1]!==l[1]}))),u.startExtent=s.region?l[\"s\"===s.region?1:0]:a,e.parent.inBrushDrag=!0,u.brushStartCallback()}(this,t)})).on(\"drag\",(function(t){w(this,t)})).on(\"dragend\",(function(t){!function(t,e){var r=e.brush,n=r.filter,a=r.svgBrush;a._dragging||(T(t,e),w(t,e),e.brush.svgBrush.wasDragged=!1),a._dragging=!1,i.event.sourceEvent.stopPropagation();var o=a.grabbingBar;if(a.grabbingBar=!1,a.grabLocation=void 0,e.parent.inBrushDrag=!1,m(),!a.wasDragged)return a.wasDragged=void 0,a.clickableOrdinalRange?r.filterSpecified&&e.multiselect?a.extent.push(a.clickableOrdinalRange):(a.extent=[a.clickableOrdinalRange],r.filterSpecified=!0):o?(a.extent=a.stayingIntervals,0===a.extent.length&&M(r)):M(r),a.brushCallback(e),b(t.parentNode),void a.brushEndCallback(r.filterSpecified?n.getConsolidated():[]);var s=function(){n.set(n.getConsolidated())};if(e.ordinal){var l=e.unitTickvals;l[l.length-1]a.newExtent[0];a.extent=a.stayingIntervals.concat(u?[a.newExtent]:[]),a.extent.length||M(r),a.brushCallback(e),u?b(t.parentNode,s):(s(),b(t.parentNode))}else s();a.brushEndCallback(r.filterSpecified?n.getConsolidated():[])}(this,t)})))}function A(t,e){return t[0]-e[0]}function M(t){t.filterSpecified=!1,t.svgBrush.extent=[[-1/0,1/0]]}function S(t){for(var e,r=t.slice(),n=[],i=r.shift();i;){for(e=i.slice();(i=r.shift())&&i[0]<=e[1];)e[1]=Math.max(e[1],i[1]);n.push(e)}return 1===n.length&&n[0][0]>n[0][1]&&(n=[]),n}t.exports={makeBrush:function(t,e,r,n,i,a){var o,l=function(){var t,e,r=[];return{set:function(n){1===(r=n.map((function(t){return t.slice().sort(s)})).sort(A)).length&&r[0][0]===-1/0&&r[0][1]===1/0&&(r=[[0,-1]]),t=S(r),e=r.reduce((function(t,e){return[Math.min(t[0],e[0]),Math.max(t[1],e[1])]}),[1/0,-1/0])},get:function(){return r.slice()},getConsolidated:function(){return t},getBounds:function(){return e}}}();return l.set(r),{filter:l,filterSpecified:e,svgBrush:{extent:[],brushStartCallback:n,brushCallback:(o=i,function(t){var e=t.brush,r=function(t){return t.svgBrush.extent.map((function(t){return t.slice()}))}(e),n=r.slice();e.filter.set(n),o()}),brushEndCallback:a}}},ensureAxisBrush:function(t,e,r){var i=t.selectAll(\".\"+n.cn.axisBrush).data(o,a);i.enter().append(\"g\").classed(n.cn.axisBrush,!0),function(t,e,r){var i=r._context.staticPlot,a=t.selectAll(\".background\").data(o);a.enter().append(\"rect\").classed(\"background\",!0).call(d).call(v).style(\"pointer-events\",i?\"none\":\"auto\").attr(\"transform\",l(0,n.verticalPadding)),a.call(k).attr(\"height\",(function(t){return t.height-n.verticalPadding}));var s=t.selectAll(\".highlight-shadow\").data(o);s.enter().append(\"line\").classed(\"highlight-shadow\",!0).attr(\"x\",-n.bar.width/2).attr(\"stroke-width\",n.bar.width+n.bar.strokeWidth).attr(\"stroke\",e).attr(\"opacity\",n.bar.strokeOpacity).attr(\"stroke-linecap\",\"butt\"),s.attr(\"y1\",(function(t){return t.height})).call(x);var u=t.selectAll(\".highlight\").data(o);u.enter().append(\"line\").classed(\"highlight\",!0).attr(\"x\",-n.bar.width/2).attr(\"stroke-width\",n.bar.width-n.bar.strokeWidth).attr(\"stroke\",n.bar.fillColor).attr(\"opacity\",n.bar.fillOpacity).attr(\"stroke-linecap\",\"butt\"),u.attr(\"y1\",(function(t){return t.height})).call(x)}(i,e,r)},cleanRanges:function(t,e){if(Array.isArray(t[0])?(t=t.map((function(t){return t.sort(s)})),t=e.multiselect?S(t.sort(A)):[t[0]]):t=[t.sort(s)],e.tickvals){var r=e.tickvals.slice().sort(s);if(!(t=t.map((function(t){var e=[p(0,r,t[0],[]),p(1,r,t[1],[])];if(e[1]>e[0])return e})).filter((function(t){return t}))).length)return}return t.length>1?t:t[0]}}},61664:function(t,e,r){\"use strict\";t.exports={attributes:r(82296),supplyDefaults:r(60664),calc:r(95044),colorbar:{container:\"line\",min:\"cmin\",max:\"cmax\"},moduleType:\"trace\",name:\"parcoords\",basePlotModule:r(19976),categories:[\"gl\",\"regl\",\"noOpacity\",\"noHover\"],meta:{}}},19976:function(t,e,r){\"use strict\";var n=r(33428),i=r(84888)._M,a=r(24196),o=r(9616);e.name=\"parcoords\",e.plot=function(t){var e=i(t.calcdata,\"parcoords\")[0];e.length&&a(t,e)},e.clean=function(t,e,r,n){var i=n._has&&n._has(\"parcoords\"),a=e._has&&e._has(\"parcoords\");i&&!a&&(n._paperdiv.selectAll(\".parcoords\").remove(),n._glimages.selectAll(\"*\").remove())},e.toSVG=function(t){var e=t._fullLayout._glimages,r=n.select(t).selectAll(\".svg-container\");r.filter((function(t,e){return e===r.size()-1})).selectAll(\".gl-canvas-context, .gl-canvas-focus\").each((function(){var t=this,r=t.toDataURL(\"image/png\");e.append(\"svg:image\").attr({xmlns:o.svg,\"xlink:href\":r,preserveAspectRatio:\"none\",x:0,y:0,width:t.style.width,height:t.style.height})})),window.setTimeout((function(){n.selectAll(\"#filterBarPattern\").attr(\"id\",\"filterBarPattern\")}),60)}},95044:function(t,e,r){\"use strict\";var n=r(3400).isArrayOrTypedArray,i=r(8932),a=r(71688).wrap;t.exports=function(t,e){var r,o;return i.hasColorscale(e,\"line\")&&n(e.line.color)?(r=e.line.color,o=i.extractOpts(e.line).colorscale,i.calc(t,e,{vals:r,containerStr:\"line\",cLetter:\"c\"})):(r=function(t){for(var e=new Array(t),r=0;rf&&(n.log(\"parcoords traces support up to \"+f+\" dimensions at the moment\"),d.splice(f));var v=s(t,e,{name:\"dimensions\",layout:l,handleItemDefaults:p}),g=function(t,e,r,o,s){var l=s(\"line.color\",r);if(i(t,\"line\")&&n.isArrayOrTypedArray(l)){if(l.length)return s(\"line.colorscale\"),a(t,e,o,s,{prefix:\"line.\",cLetter:\"c\"}),l.length;e.line.color=r}return 1/0}(t,e,r,l,c);o(e,l,c),Array.isArray(v)&&v.length||(e.visible=!1),h(e,v,\"values\",g);var y={weight:l.font.weight,style:l.font.style,variant:l.font.variant,family:l.font.family,size:Math.round(l.font.size/1.2),color:l.font.color};n.coerceFont(c,\"labelfont\",y),n.coerceFont(c,\"tickfont\",y),n.coerceFont(c,\"rangefont\",y),c(\"labelangle\"),c(\"labelside\"),c(\"unselected.line.color\"),c(\"unselected.line.opacity\")}},95724:function(t,e,r){\"use strict\";var n=r(3400).isTypedArray;e.convertTypedArray=function(t){return n(t)?Array.prototype.slice.call(t):t},e.isOrdinal=function(t){return!!t.tickvals},e.isVisible=function(t){return t.visible||!(\"visible\"in t)}},29928:function(t,e,r){\"use strict\";var n=r(61664);n.plot=r(24196),t.exports=n},51352:function(t,e,r){\"use strict\";var n=[\"precision highp float;\",\"\",\"varying vec4 fragColor;\",\"\",\"attribute vec4 p01_04, p05_08, p09_12, p13_16,\",\" p17_20, p21_24, p25_28, p29_32,\",\" p33_36, p37_40, p41_44, p45_48,\",\" p49_52, p53_56, p57_60, colors;\",\"\",\"uniform mat4 dim0A, dim1A, dim0B, dim1B, dim0C, dim1C, dim0D, dim1D,\",\" loA, hiA, loB, hiB, loC, hiC, loD, hiD;\",\"\",\"uniform vec2 resolution, viewBoxPos, viewBoxSize;\",\"uniform float maskHeight;\",\"uniform float drwLayer; // 0: context, 1: focus, 2: pick\",\"uniform vec4 contextColor;\",\"uniform sampler2D maskTexture, palette;\",\"\",\"bool isPick = (drwLayer > 1.5);\",\"bool isContext = (drwLayer < 0.5);\",\"\",\"const vec4 ZEROS = vec4(0.0, 0.0, 0.0, 0.0);\",\"const vec4 UNITS = vec4(1.0, 1.0, 1.0, 1.0);\",\"\",\"float val(mat4 p, mat4 v) {\",\" return dot(matrixCompMult(p, v) * UNITS, UNITS);\",\"}\",\"\",\"float axisY(float ratio, mat4 A, mat4 B, mat4 C, mat4 D) {\",\" float y1 = val(A, dim0A) + val(B, dim0B) + val(C, dim0C) + val(D, dim0D);\",\" float y2 = val(A, dim1A) + val(B, dim1B) + val(C, dim1C) + val(D, dim1D);\",\" return y1 * (1.0 - ratio) + y2 * ratio;\",\"}\",\"\",\"int iMod(int a, int b) {\",\" return a - b * (a / b);\",\"}\",\"\",\"bool fOutside(float p, float lo, float hi) {\",\" return (lo < hi) && (lo > p || p > hi);\",\"}\",\"\",\"bool vOutside(vec4 p, vec4 lo, vec4 hi) {\",\" return (\",\" fOutside(p[0], lo[0], hi[0]) ||\",\" fOutside(p[1], lo[1], hi[1]) ||\",\" fOutside(p[2], lo[2], hi[2]) ||\",\" fOutside(p[3], lo[3], hi[3])\",\" );\",\"}\",\"\",\"bool mOutside(mat4 p, mat4 lo, mat4 hi) {\",\" return (\",\" vOutside(p[0], lo[0], hi[0]) ||\",\" vOutside(p[1], lo[1], hi[1]) ||\",\" vOutside(p[2], lo[2], hi[2]) ||\",\" vOutside(p[3], lo[3], hi[3])\",\" );\",\"}\",\"\",\"bool outsideBoundingBox(mat4 A, mat4 B, mat4 C, mat4 D) {\",\" return mOutside(A, loA, hiA) ||\",\" mOutside(B, loB, hiB) ||\",\" mOutside(C, loC, hiC) ||\",\" mOutside(D, loD, hiD);\",\"}\",\"\",\"bool outsideRasterMask(mat4 A, mat4 B, mat4 C, mat4 D) {\",\" mat4 pnts[4];\",\" pnts[0] = A;\",\" pnts[1] = B;\",\" pnts[2] = C;\",\" pnts[3] = D;\",\"\",\" for(int i = 0; i < 4; ++i) {\",\" for(int j = 0; j < 4; ++j) {\",\" for(int k = 0; k < 4; ++k) {\",\" if(0 == iMod(\",\" int(255.0 * texture2D(maskTexture,\",\" vec2(\",\" (float(i * 2 + j / 2) + 0.5) / 8.0,\",\" (pnts[i][j][k] * (maskHeight - 1.0) + 1.0) / maskHeight\",\" ))[3]\",\" ) / int(pow(2.0, float(iMod(j * 4 + k, 8)))),\",\" 2\",\" )) return true;\",\" }\",\" }\",\" }\",\" return false;\",\"}\",\"\",\"vec4 position(bool isContext, float v, mat4 A, mat4 B, mat4 C, mat4 D) {\",\" float x = 0.5 * sign(v) + 0.5;\",\" float y = axisY(x, A, B, C, D);\",\" float z = 1.0 - abs(v);\",\"\",\" z += isContext ? 0.0 : 2.0 * float(\",\" outsideBoundingBox(A, B, C, D) ||\",\" outsideRasterMask(A, B, C, D)\",\" );\",\"\",\" return vec4(\",\" 2.0 * (vec2(x, y) * viewBoxSize + viewBoxPos) / resolution - 1.0,\",\" z,\",\" 1.0\",\" );\",\"}\",\"\",\"void main() {\",\" mat4 A = mat4(p01_04, p05_08, p09_12, p13_16);\",\" mat4 B = mat4(p17_20, p21_24, p25_28, p29_32);\",\" mat4 C = mat4(p33_36, p37_40, p41_44, p45_48);\",\" mat4 D = mat4(p49_52, p53_56, p57_60, ZEROS);\",\"\",\" float v = colors[3];\",\"\",\" gl_Position = position(isContext, v, A, B, C, D);\",\"\",\" fragColor =\",\" isContext ? vec4(contextColor) :\",\" isPick ? vec4(colors.rgb, 1.0) : texture2D(palette, vec2(abs(v), 0.5));\",\"}\"].join(\"\\n\"),i=[\"precision highp float;\",\"\",\"varying vec4 fragColor;\",\"\",\"void main() {\",\" gl_FragColor = fragColor;\",\"}\"].join(\"\\n\"),a=r(30140).maxDimensionCount,o=r(3400),s=1e-6,l=new Uint8Array(4),u=new Uint8Array(4),c={shape:[256,1],format:\"rgba\",type:\"uint8\",mag:\"nearest\",min:\"nearest\"};function f(t,e,r,n,i){var a=t._gl;a.enable(a.SCISSOR_TEST),a.scissor(e,r,n,i),t.clear({color:[0,0,0,0],depth:1})}function h(t,e,r,n,i,a){var o=a.key;r.drawCompleted||(function(t){t.read({x:0,y:0,width:1,height:1,data:l})}(t),r.drawCompleted=!0),function s(l){var u=Math.min(n,i-l*n);0===l&&(window.cancelAnimationFrame(r.currentRafs[o]),delete r.currentRafs[o],f(t,a.scissorX,a.scissorY,a.scissorWidth,a.viewBoxSize[1])),r.clearOnly||(a.count=2*u,a.offset=2*l*n,e(a),l*n+u>>8*e)%256/255}function v(t,e,r){for(var n=new Array(8*e),i=0,a=0;au&&(u=t[i].dim1.canvasX,o=i);0===s&&f(k,0,0,r.canvasWidth,r.canvasHeight);var c=function(t){var e,r,n,i=[[],[]];for(n=0;n<64;n++){var a=!t&&ns._length&&(E=E.slice(0,s._length));var C,P=s.tickvals;function O(t,e){return{val:t,text:C[e]}}function I(t,e){return t.val-e.val}if(a(P)&&P.length){i.isTypedArray(P)&&(P=Array.from(P)),C=s.ticktext,a(C)&&C.length?C.length>P.length?C=C.slice(0,P.length):P.length>C.length&&(P=P.slice(0,C.length)):C=P.map(o(s.tickformat));for(var z=1;z=r||l>=i)return;var u=t.lineLayer.readPixel(s,i-1-l),c=0!==u[3],f=c?u[2]+256*(u[1]+256*u[0]):null,h={x:s,y:l,clientX:e.clientX,clientY:e.clientY,dataIndex:t.model.key,curveNumber:f};f!==N&&(c?a.hover(h):a.unhover&&a.unhover(h),N=f)}})),B.style(\"opacity\",(function(t){return t.pick?0:1})),p.style(\"background\",\"rgba(255, 255, 255, 0)\");var j=p.selectAll(\".\"+x.cn.parcoords).data(F,v);j.exit().remove(),j.enter().append(\"g\").classed(x.cn.parcoords,!0).style(\"shape-rendering\",\"crispEdges\").style(\"pointer-events\",\"none\"),j.attr(\"transform\",(function(t){return c(t.model.translateX,t.model.translateY)}));var U=j.selectAll(\".\"+x.cn.parcoordsControlView).data(g,v);U.enter().append(\"g\").classed(x.cn.parcoordsControlView,!0),U.attr(\"transform\",(function(t){return c(t.model.pad.l,t.model.pad.t)}));var V=U.selectAll(\".\"+x.cn.yAxis).data((function(t){return t.dimensions}),v);V.enter().append(\"g\").classed(x.cn.yAxis,!0),U.each((function(t){z(V,t,w)})),B.each((function(t){if(t.viewModel){!t.lineLayer||a?t.lineLayer=_(this,t):t.lineLayer.update(t),(t.key||0===t.key)&&(t.viewModel[t.key]=t.lineLayer);var e=!t.context||a;t.lineLayer.render(t.viewModel.panels,e)}})),V.attr(\"transform\",(function(t){return c(t.xScale(t.xIndex),0)})),V.call(n.behavior.drag().origin((function(t){return t})).on(\"drag\",(function(t){var e=t.parent;E.linePickActive(!1),t.x=Math.max(-x.overdrag,Math.min(t.model.width+x.overdrag,n.event.x)),t.canvasX=t.x*t.model.canvasPixelRatio,V.sort((function(t,e){return t.x-e.x})).each((function(e,r){e.xIndex=r,e.x=t===e?e.x:e.xScale(e.xIndex),e.canvasX=e.x*e.model.canvasPixelRatio})),z(V,e,w),V.filter((function(e){return 0!==Math.abs(t.xIndex-e.xIndex)})).attr(\"transform\",(function(t){return c(t.xScale(t.xIndex),0)})),n.select(this).attr(\"transform\",c(t.x,0)),V.each((function(r,n,i){i===t.parent.key&&(e.dimensions[n]=r)})),e.contextLayer&&e.contextLayer.render(e.panels,!1,!L(e)),e.focusLayer.render&&e.focusLayer.render(e.panels)})).on(\"dragend\",(function(t){var e=t.parent;t.x=t.xScale(t.xIndex),t.canvasX=t.x*t.model.canvasPixelRatio,z(V,e,w),n.select(this).attr(\"transform\",(function(t){return c(t.x,0)})),e.contextLayer&&e.contextLayer.render(e.panels,!1,!L(e)),e.focusLayer&&e.focusLayer.render(e.panels),e.pickLayer&&e.pickLayer.render(e.panels,!0),E.linePickActive(!0),a&&a.axesMoved&&a.axesMoved(e.key,e.dimensions.map((function(t){return t.crossfilterDimensionIndex})))}))),V.exit().remove();var q=V.selectAll(\".\"+x.cn.axisOverlays).data(g,v);q.enter().append(\"g\").classed(x.cn.axisOverlays,!0),q.selectAll(\".\"+x.cn.axis).remove();var H=q.selectAll(\".\"+x.cn.axis).data(g,v);H.enter().append(\"g\").classed(x.cn.axis,!0),H.each((function(t){var e=t.model.height/t.model.tickDistance,r=t.domainScale,i=r.domain();n.select(this).call(n.svg.axis().orient(\"left\").tickSize(4).outerTickSize(2).ticks(e,t.tickFormat).tickValues(t.ordinal?i:null).tickFormat((function(e){return m.isOrdinal(t)?e:D(t.model.dimensions[t.visibleIndex],e)})).scale(r)),h.font(H.selectAll(\"text\"),t.model.tickFont)})),H.selectAll(\".domain, .tick>line\").attr(\"fill\",\"none\").attr(\"stroke\",\"black\").attr(\"stroke-opacity\",.25).attr(\"stroke-width\",\"1px\"),H.selectAll(\"text\").style(\"text-shadow\",f.makeTextShadow(k)).style(\"cursor\",\"default\");var G=q.selectAll(\".\"+x.cn.axisHeading).data(g,v);G.enter().append(\"g\").classed(x.cn.axisHeading,!0);var W=G.selectAll(\".\"+x.cn.axisTitle).data(g,v);W.enter().append(\"text\").classed(x.cn.axisTitle,!0).attr(\"text-anchor\",\"middle\").style(\"cursor\",\"ew-resize\").style(\"pointer-events\",o?\"none\":\"auto\"),W.text((function(t){return t.label})).each((function(e){var r=n.select(this);h.font(r,e.model.labelFont),f.convertToTspans(r,t)})).attr(\"transform\",(function(t){var e=I(t.model.labelAngle,t.model.labelSide),r=x.axisTitleOffset;return(e.dir>0?\"\":c(0,2*r+t.model.height))+u(e.degrees)+c(-r*e.dx,-r*e.dy)})).attr(\"text-anchor\",(function(t){var e=I(t.model.labelAngle,t.model.labelSide);return 2*Math.abs(e.dx)>Math.abs(e.dy)?e.dir*e.dx<0?\"start\":\"end\":\"middle\"}));var Y=q.selectAll(\".\"+x.cn.axisExtent).data(g,v);Y.enter().append(\"g\").classed(x.cn.axisExtent,!0);var X=Y.selectAll(\".\"+x.cn.axisExtentTop).data(g,v);X.enter().append(\"g\").classed(x.cn.axisExtentTop,!0),X.attr(\"transform\",c(0,-x.axisExtentOffset));var Z=X.selectAll(\".\"+x.cn.axisExtentTopText).data(g,v);Z.enter().append(\"text\").classed(x.cn.axisExtentTopText,!0).call(O),Z.text((function(t){return R(t,!0)})).each((function(t){h.font(n.select(this),t.model.rangeFont)}));var K=Y.selectAll(\".\"+x.cn.axisExtentBottom).data(g,v);K.enter().append(\"g\").classed(x.cn.axisExtentBottom,!0),K.attr(\"transform\",(function(t){return c(0,t.model.height+x.axisExtentOffset)}));var J=K.selectAll(\".\"+x.cn.axisExtentBottomText).data(g,v);J.enter().append(\"text\").classed(x.cn.axisExtentBottomText,!0).attr(\"dy\",\"0.75em\").call(O),J.text((function(t){return R(t,!1)})).each((function(t){h.font(n.select(this),t.model.rangeFont)})),b.ensureAxisBrush(q,k,t)}},24196:function(t,e,r){\"use strict\";var n=r(36336),i=r(5048),a=r(95724).isVisible,o={};function s(t,e,r){var n=e.indexOf(r),i=t.indexOf(n);return-1===i&&(i+=e.length),i}(t.exports=function(t,e){var r=t._fullLayout;if(i(t,[],o)){var l={},u={},c={},f={},h=r._size;e.forEach((function(e,r){var n=e[0].trace;c[r]=n.index;var i=f[r]=n._fullInput.index;l[r]=t.data[i].dimensions,u[r]=t.data[i].dimensions.slice()})),n(t,e,{width:h.w,height:h.h,margin:{t:h.t,r:h.r,b:h.b,l:h.l}},{filterChanged:function(e,n,i){var a=u[e][n],o=i.map((function(t){return t.slice()})),s=\"dimensions[\"+n+\"].constraintrange\",l=r._tracePreGUI[t._fullData[c[e]]._fullInput.uid];if(void 0===l[s]){var h=a.constraintrange;l[s]=h||null}var p=t._fullData[c[e]].dimensions[n];o.length?(1===o.length&&(o=o[0]),a.constraintrange=o,p.constraintrange=o.slice(),o=[o]):(delete a.constraintrange,delete p.constraintrange,o=null);var d={};d[s]=o,t.emit(\"plotly_restyle\",[d,[f[e]]])},hover:function(e){t.emit(\"plotly_hover\",e)},unhover:function(e){t.emit(\"plotly_unhover\",e)},axesMoved:function(e,r){var n=function(t,e){return function(r,n){return s(t,e,r)-s(t,e,n)}}(r,u[e].filter(a));l[e].sort(n),u[e].filter((function(t){return!a(t)})).sort((function(t){return u[e].indexOf(t)})).forEach((function(t){l[e].splice(l[e].indexOf(t),1),l[e].splice(u[e].indexOf(t),0,t)})),t.emit(\"plotly_restyle\",[{dimensions:[l[e]]},[f[e]]])}})}}).reglPrecompiled=o},74996:function(t,e,r){\"use strict\";var n=r(45464),i=r(86968).u,a=r(25376),o=r(22548),s=r(21776).Ks,l=r(21776).Gw,u=r(92880).extendFlat,c=r(98192).c,f=a({editType:\"plot\",arrayOk:!0,colorEditType:\"plot\"});t.exports={labels:{valType:\"data_array\",editType:\"calc\"},label0:{valType:\"number\",dflt:0,editType:\"calc\"},dlabel:{valType:\"number\",dflt:1,editType:\"calc\"},values:{valType:\"data_array\",editType:\"calc\"},marker:{colors:{valType:\"data_array\",editType:\"calc\"},line:{color:{valType:\"color\",dflt:o.defaultLine,arrayOk:!0,editType:\"style\"},width:{valType:\"number\",min:0,dflt:0,arrayOk:!0,editType:\"style\"},editType:\"calc\"},pattern:c,editType:\"calc\"},text:{valType:\"data_array\",editType:\"plot\"},hovertext:{valType:\"string\",dflt:\"\",arrayOk:!0,editType:\"style\"},scalegroup:{valType:\"string\",dflt:\"\",editType:\"calc\"},textinfo:{valType:\"flaglist\",flags:[\"label\",\"text\",\"value\",\"percent\"],extras:[\"none\"],editType:\"calc\"},hoverinfo:u({},n.hoverinfo,{flags:[\"label\",\"text\",\"value\",\"percent\",\"name\"]}),hovertemplate:s({},{keys:[\"label\",\"color\",\"value\",\"percent\",\"text\"]}),texttemplate:l({editType:\"plot\"},{keys:[\"label\",\"color\",\"value\",\"percent\",\"text\"]}),textposition:{valType:\"enumerated\",values:[\"inside\",\"outside\",\"auto\",\"none\"],dflt:\"auto\",arrayOk:!0,editType:\"plot\"},textfont:u({},f,{}),insidetextorientation:{valType:\"enumerated\",values:[\"horizontal\",\"radial\",\"tangential\",\"auto\"],dflt:\"auto\",editType:\"plot\"},insidetextfont:u({},f,{}),outsidetextfont:u({},f,{}),automargin:{valType:\"boolean\",dflt:!1,editType:\"plot\"},title:{text:{valType:\"string\",dflt:\"\",editType:\"plot\"},font:u({},f,{}),position:{valType:\"enumerated\",values:[\"top left\",\"top center\",\"top right\",\"middle center\",\"bottom left\",\"bottom center\",\"bottom right\"],editType:\"plot\"},editType:\"plot\"},domain:i({name:\"pie\",trace:!0,editType:\"calc\"}),hole:{valType:\"number\",min:0,max:1,dflt:0,editType:\"calc\"},sort:{valType:\"boolean\",dflt:!0,editType:\"calc\"},direction:{valType:\"enumerated\",values:[\"clockwise\",\"counterclockwise\"],dflt:\"counterclockwise\",editType:\"calc\"},rotation:{valType:\"angle\",dflt:0,editType:\"calc\"},pull:{valType:\"number\",min:0,max:1,dflt:0,arrayOk:!0,editType:\"calc\"},_deprecated:{title:{valType:\"string\",dflt:\"\",editType:\"calc\"},titlefont:u({},f,{}),titleposition:{valType:\"enumerated\",values:[\"top left\",\"top center\",\"top right\",\"middle center\",\"bottom left\",\"bottom center\",\"bottom right\"],editType:\"calc\"}}}},80036:function(t,e,r){\"use strict\";var n=r(7316);e.name=\"pie\",e.plot=function(t,r,i,a){n.plotBasePlot(e.name,t,r,i,a)},e.clean=function(t,r,i,a){n.cleanBasePlot(e.name,t,r,i,a)}},45768:function(t,e,r){\"use strict\";var n=r(38248),i=r(49760),a=r(76308),o={};function s(t){return function(e,r){return!!e&&!!(e=i(e)).isValid()&&(e=a.addOpacity(e,e.getAlpha()),t[r]||(t[r]=e),e)}}function l(t,e){var r,n=JSON.stringify(t),a=e[n];if(!a){for(a=t.slice(),r=0;r=0})),(\"funnelarea\"===e.type?y:e.sort)&&a.sort((function(t,e){return e.v-t.v})),a[0]&&(a[0].vTotal=g),a},crossTraceCalc:function(t,e){var r=(e||{}).type;r||(r=\"pie\");var n=t._fullLayout,i=t.calcdata,a=n[r+\"colorway\"],s=n[\"_\"+r+\"colormap\"];n[\"extend\"+r+\"colors\"]&&(a=l(a,o));for(var u=0,c=0;c0){s=!0;break}}s||(o=0)}return{hasLabels:r,hasValues:a,len:o}}function c(t,e,r,n,i){n(\"marker.line.width\")&&n(\"marker.line.color\",i?void 0:r.paper_bgcolor);var a=n(\"marker.colors\");l(n,\"marker.pattern\",a),t.marker&&!e.marker.pattern.fgcolor&&(e.marker.pattern.fgcolor=t.marker.colors),e.marker.pattern.bgcolor||(e.marker.pattern.bgcolor=r.paper_bgcolor)}t.exports={handleLabelsAndValues:u,handleMarkerDefaults:c,supplyDefaults:function(t,e,r,n){function l(r,n){return i.coerce(t,e,a,r,n)}var f=u(l(\"labels\"),l(\"values\")),h=f.len;if(e._hasLabels=f.hasLabels,e._hasValues=f.hasValues,!e._hasLabels&&e._hasValues&&(l(\"label0\"),l(\"dlabel\")),h){e._length=h,c(t,e,n,l,!0),l(\"scalegroup\");var p,d=l(\"text\"),v=l(\"texttemplate\");if(v||(p=l(\"textinfo\",i.isArrayOrTypedArray(d)?\"text+percent\":\"percent\")),l(\"hovertext\"),l(\"hovertemplate\"),v||p&&\"none\"!==p){var g=l(\"textposition\");s(t,e,n,l,g,{moduleHasSelected:!1,moduleHasUnselected:!1,moduleHasConstrain:!1,moduleHasCliponaxis:!1,moduleHasTextangle:!1,moduleHasInsideanchor:!1}),(Array.isArray(g)||\"auto\"===g||\"outside\"===g)&&l(\"automargin\"),(\"inside\"===g||\"auto\"===g||Array.isArray(g))&&l(\"insidetextorientation\")}else\"none\"===p&&l(\"textposition\",\"none\");o(e,n,l);var y=l(\"hole\");if(l(\"title.text\")){var m=l(\"title.position\",y?\"middle center\":\"top center\");y||\"middle center\"!==m||(e.title.position=\"top center\"),i.coerceFont(l,\"title.font\",n.font)}l(\"sort\"),l(\"direction\"),l(\"rotation\"),l(\"pull\")}else e.visible=!1}}},53644:function(t,e,r){\"use strict\";var n=r(10624).appendArrayMultiPointValues;t.exports=function(t,e){var r={curveNumber:e.index,pointNumbers:t.pts,data:e._input,fullData:e,label:t.label,color:t.color,value:t.v,percent:t.percent,text:t.text,bbox:t.bbox,v:t.v};return 1===t.pts.length&&(r.pointNumber=r.i=t.pts[0]),n(r,e,t.pts),\"funnelarea\"===e.type&&(delete r.v,delete r.i),r}},21552:function(t,e,r){\"use strict\";var n=r(43616),i=r(76308);t.exports=function(t,e,r,a){var o=r.marker.pattern;o&&o.shape?n.pointStyle(t,r,a,e):i.fill(t,e.color)}},69656:function(t,e,r){\"use strict\";var n=r(3400);function i(t){return-1!==t.indexOf(\"e\")?t.replace(/[.]?0+e/,\"e\"):-1!==t.indexOf(\".\")?t.replace(/[.]?0+$/,\"\"):t}e.formatPiePercent=function(t,e){var r=i((100*t).toPrecision(3));return n.numSeparate(r,e)+\"%\"},e.formatPieValue=function(t,e){var r=i(t.toPrecision(10));return n.numSeparate(r,e)},e.getFirstFilled=function(t,e){if(n.isArrayOrTypedArray(t))for(var r=0;r\"),name:f.hovertemplate||-1!==h.indexOf(\"name\")?f.name:void 0,idealAlign:t.pxmid[0]<0?\"left\":\"right\",color:g.castOption(_.bgcolor,t.pts)||t.color,borderColor:g.castOption(_.bordercolor,t.pts),fontFamily:g.castOption(w.family,t.pts),fontSize:g.castOption(w.size,t.pts),fontColor:g.castOption(w.color,t.pts),nameLength:g.castOption(_.namelength,t.pts),textAlign:g.castOption(_.align,t.pts),hovertemplate:g.castOption(f.hovertemplate,t.pts),hovertemplateLabels:t,eventData:[y(t,f)]},{container:r._hoverlayer.node(),outerContainer:r._paper.node(),gd:e,inOut_bbox:T}),t.bbox=T[0],u._hasHoverLabel=!0}u._hasHoverEvent=!0,e.emit(\"plotly_hover\",{points:[y(t,f)],event:n.event})}})),t.on(\"mouseout\",(function(t){var r=e._fullLayout,i=e._fullData[u.index],o=n.select(this).datum();u._hasHoverEvent&&(t.originalEvent=n.event,e.emit(\"plotly_unhover\",{points:[y(o,i)],event:n.event}),u._hasHoverEvent=!1),u._hasHoverLabel&&(a.loneUnhover(r._hoverlayer.node()),u._hasHoverLabel=!1)})),t.on(\"click\",(function(t){var r=e._fullLayout,i=e._fullData[u.index];e._dragging||!1===r.hovermode||(e._hoverdata=[y(t,i)],a.click(e,n.event))}))}function b(t,e,r){var n=g.castOption(t.insidetextfont.color,e.pts);!n&&t._input.textfont&&(n=g.castOption(t._input.textfont.color,e.pts));var i=g.castOption(t.insidetextfont.family,e.pts)||g.castOption(t.textfont.family,e.pts)||r.family,a=g.castOption(t.insidetextfont.size,e.pts)||g.castOption(t.textfont.size,e.pts)||r.size,s=g.castOption(t.insidetextfont.weight,e.pts)||g.castOption(t.textfont.weight,e.pts)||r.weight,l=g.castOption(t.insidetextfont.style,e.pts)||g.castOption(t.textfont.style,e.pts)||r.style,u=g.castOption(t.insidetextfont.variant,e.pts)||g.castOption(t.textfont.variant,e.pts)||r.variant;return{color:n||o.contrast(e.color),family:i,size:a,weight:s,style:l,variant:u}}function _(t,e){for(var r,n,i=0;ie&&e>n||r=-4;g-=2)y(Math.PI*g,\"tan\");for(g=4;g>=-4;g-=2)y(Math.PI*(g+1),\"tan\")}if(f||p){for(g=4;g>=-4;g-=2)y(Math.PI*(g+1.5),\"rad\");for(g=4;g>=-4;g-=2)y(Math.PI*(g+.5),\"rad\")}}if(s||d||f){var m=Math.sqrt(t.width*t.width+t.height*t.height);if((a={scale:i*n*2/m,rCenter:1-i,rotate:0}).textPosAngle=(e.startangle+e.stopangle)/2,a.scale>=1)return a;v.push(a)}(d||p)&&((a=T(t,n,o,l,u)).textPosAngle=(e.startangle+e.stopangle)/2,v.push(a)),(d||h)&&((a=k(t,n,o,l,u)).textPosAngle=(e.startangle+e.stopangle)/2,v.push(a));for(var x=0,b=0,_=0;_=1)break}return v[x]}function T(t,e,r,n,i){e=Math.max(0,e-2*v);var a=t.width/t.height,o=S(a,n,e,r);return{scale:2*o/t.height,rCenter:A(a,o/e),rotate:M(i)}}function k(t,e,r,n,i){e=Math.max(0,e-2*v);var a=t.height/t.width,o=S(a,n,e,r);return{scale:2*o/t.width,rCenter:A(a,o/e),rotate:M(i+Math.PI/2)}}function A(t,e){return Math.cos(e)-t*e}function M(t){return(180/Math.PI*t+720)%180-90}function S(t,e,r,n){var i=t+1/(2*Math.tan(e));return r*Math.min(1/(Math.sqrt(i*i+.5)+i),n/(Math.sqrt(t*t+n/2)+t))}function E(t,e){return t.v!==e.vTotal||e.trace.hole?Math.min(1/(1+1/Math.sin(t.halfangle)),t.ring/2):1}function L(t,e){var r=e.pxmid[0],n=e.pxmid[1],i=t.width/2,a=t.height/2;return r<0&&(i*=-1),n<0&&(a*=-1),{scale:1,rCenter:1,rotate:0,x:i+Math.abs(a)*(i>0?1:-1)/2,y:a/(1+r*r/(n*n)),outside:!0}}function C(t,e){var r,n,i,a=t.trace,o={x:t.cx,y:t.cy},s={tx:0,ty:0};s.ty+=a.title.font.size,i=O(a),-1!==a.title.position.indexOf(\"top\")?(o.y-=(1+i)*t.r,s.ty-=t.titleBox.height):-1!==a.title.position.indexOf(\"bottom\")&&(o.y+=(1+i)*t.r);var l,u=t.r/(void 0===(l=t.trace.aspectratio)?1:l),c=e.w*(a.domain.x[1]-a.domain.x[0])/2;return-1!==a.title.position.indexOf(\"left\")?(c+=u,o.x-=(1+i)*u,s.tx+=t.titleBox.width/2):-1!==a.title.position.indexOf(\"center\")?c*=2:-1!==a.title.position.indexOf(\"right\")&&(c+=u,o.x+=(1+i)*u,s.tx-=t.titleBox.width/2),r=c/t.titleBox.width,n=P(t,e)/t.titleBox.height,{x:o.x,y:o.y,scale:Math.min(r,n),tx:s.tx,ty:s.ty}}function P(t,e){var r=t.trace,n=e.h*(r.domain.y[1]-r.domain.y[0]);return Math.min(t.titleBox.height,n/2)}function O(t){var e,r=t.pull;if(!r)return 0;if(l.isArrayOrTypedArray(r))for(r=0,e=0;er&&(r=t.pull[e]);return r}function I(t,e){for(var r=[],n=0;n1?c=(u=r.r)/i.aspectratio:u=(c=r.r)*i.aspectratio,l=(u*=(1+i.baseratio)/2)*c}o=Math.min(o,l/r.vTotal)}for(n=0;n\")}if(a){var x=l.castOption(i,e.i,\"texttemplate\");if(x){var b=function(t){return{label:t.label,value:t.v,valueLabel:g.formatPieValue(t.v,n.separators),percent:t.v/r.vTotal,percentLabel:g.formatPiePercent(t.v/r.vTotal,n.separators),color:t.color,text:t.text,customdata:l.castOption(i,t.i,\"customdata\")}}(e),_=g.getFirstFilled(i.text,e.pts);(m(_)||\"\"===_)&&(b.text=_),e.text=l.texttemplateString(x,b,t._fullLayout._d3locale,b,i._meta||{})}else e.text=\"\"}}function R(t,e){var r=t.rotate*Math.PI/180,n=Math.cos(r),i=Math.sin(r),a=(e.left+e.right)/2,o=(e.top+e.bottom)/2;t.textX=a*n-o*i,t.textY=a*i+o*n,t.noCenter=!0}t.exports={plot:function(t,e){var r=t._context.staticPlot,a=t._fullLayout,h=a._size;d(\"pie\",a),_(e,t),I(e,h);var v=l.makeTraceGroups(a._pielayer,e,\"trace\").each((function(e){var d=n.select(this),v=e[0],y=v.trace;!function(t){var e,r,n,i=t[0],a=i.r,o=i.trace,s=g.getRotationAngle(o.rotation),l=2*Math.PI/i.vTotal,u=\"px0\",c=\"px1\";if(\"counterclockwise\"===o.direction){for(e=0;ei.vTotal/2?1:0,r.halfangle=Math.PI*Math.min(r.v/i.vTotal,.5),r.ring=1-o.hole,r.rInscribed=E(r,i))}(e),d.attr(\"stroke-linejoin\",\"round\"),d.each((function(){var m=n.select(this).selectAll(\"g.slice\").data(e);m.enter().append(\"g\").classed(\"slice\",!0),m.exit().remove();var _=[[[],[]],[[],[]]],T=!1;m.each((function(i,o){if(i.hidden)n.select(this).selectAll(\"path,g\").remove();else{i.pointNumber=i.i,i.curveNumber=y.index,_[i.pxmid[1]<0?0:1][i.pxmid[0]<0?0:1].push(i);var u=v.cx,c=v.cy,h=n.select(this),d=h.selectAll(\"path.surface\").data([i]);if(d.enter().append(\"path\").classed(\"surface\",!0).style({\"pointer-events\":r?\"none\":\"all\"}),h.call(x,t,e),y.pull){var m=+g.castOption(y.pull,i.pts)||0;m>0&&(u+=m*i.pxmid[0],c+=m*i.pxmid[1])}i.cxFinal=u,i.cyFinal=c;var k=y.hole;if(i.v===v.vTotal){var A=\"M\"+(u+i.px0[0])+\",\"+(c+i.px0[1])+P(i.px0,i.pxmid,!0,1)+P(i.pxmid,i.px0,!0,1)+\"Z\";k?d.attr(\"d\",\"M\"+(u+k*i.px0[0])+\",\"+(c+k*i.px0[1])+P(i.px0,i.pxmid,!1,k)+P(i.pxmid,i.px0,!1,k)+\"Z\"+A):d.attr(\"d\",A)}else{var M=P(i.px0,i.px1,!0,1);if(k){var S=1-k;d.attr(\"d\",\"M\"+(u+k*i.px1[0])+\",\"+(c+k*i.px1[1])+P(i.px1,i.px0,!1,k)+\"l\"+S*i.px0[0]+\",\"+S*i.px0[1]+M+\"Z\")}else d.attr(\"d\",\"M\"+u+\",\"+c+\"l\"+i.px0[0]+\",\"+i.px0[1]+M+\"Z\")}D(t,i,v);var E=g.castOption(y.textposition,i.pts),C=h.selectAll(\"g.slicetext\").data(i.text&&\"none\"!==E?[0]:[]);C.enter().append(\"g\").classed(\"slicetext\",!0),C.exit().remove(),C.each((function(){var r=l.ensureSingle(n.select(this),\"text\",\"\",(function(t){t.attr(\"data-notex\",1)})),h=l.ensureUniformFontSize(t,\"outside\"===E?function(t,e,r){return{color:g.castOption(t.outsidetextfont.color,e.pts)||g.castOption(t.textfont.color,e.pts)||r.color,family:g.castOption(t.outsidetextfont.family,e.pts)||g.castOption(t.textfont.family,e.pts)||r.family,size:g.castOption(t.outsidetextfont.size,e.pts)||g.castOption(t.textfont.size,e.pts)||r.size,weight:g.castOption(t.outsidetextfont.weight,e.pts)||g.castOption(t.textfont.weight,e.pts)||r.weight,style:g.castOption(t.outsidetextfont.style,e.pts)||g.castOption(t.textfont.style,e.pts)||r.style,variant:g.castOption(t.outsidetextfont.variant,e.pts)||g.castOption(t.textfont.variant,e.pts)||r.variant}}(y,i,a.font):b(y,i,a.font));r.text(i.text).attr({class:\"slicetext\",transform:\"\",\"text-anchor\":\"middle\"}).call(s.font,h).call(f.convertToTspans,t);var d,m=s.bBox(r.node());if(\"outside\"===E)d=L(m,i);else if(d=w(m,i,v),\"auto\"===E&&d.scale<1){var x=l.ensureUniformFontSize(t,y.outsidetextfont);r.call(s.font,x),d=L(m=s.bBox(r.node()),i)}var _=d.textPosAngle,k=void 0===_?i.pxmid:z(v.r,_);if(d.targetX=u+k[0]*d.rCenter+(d.x||0),d.targetY=c+k[1]*d.rCenter+(d.y||0),R(d,m),d.outside){var A=d.targetY;i.yLabelMin=A-m.height/2,i.yLabelMid=A,i.yLabelMax=A+m.height/2,i.labelExtraX=0,i.labelExtraY=0,T=!0}d.fontSize=h.size,p(y.type,d,a),e[o].transform=d,l.setTransormAndDisplay(r,d)}))}function P(t,e,r,n){var a=n*(e[0]-t[0]),o=n*(e[1]-t[1]);return\"a\"+n*v.r+\",\"+n*v.r+\" 0 \"+i.largeArc+(r?\" 1 \":\" 0 \")+a+\",\"+o}}));var k=n.select(this).selectAll(\"g.titletext\").data(y.title.text?[0]:[]);if(k.enter().append(\"g\").classed(\"titletext\",!0),k.exit().remove(),k.each((function(){var e,r=l.ensureSingle(n.select(this),\"text\",\"\",(function(t){t.attr(\"data-notex\",1)})),i=y.title.text;y._meta&&(i=l.templateString(i,y._meta)),r.text(i).attr({class:\"titletext\",transform:\"\",\"text-anchor\":\"middle\"}).call(s.font,y.title.font).call(f.convertToTspans,t),e=\"middle center\"===y.title.position?function(t){var e=Math.sqrt(t.titleBox.width*t.titleBox.width+t.titleBox.height*t.titleBox.height);return{x:t.cx,y:t.cy,scale:t.trace.hole*t.r*2/e,tx:0,ty:-t.titleBox.height/2+t.trace.title.font.size}}(v):C(v,h),r.attr(\"transform\",c(e.x,e.y)+u(Math.min(1,e.scale))+c(e.tx,e.ty))})),T&&function(t,e){var r,n,i,a,o,s,u,c,f,h,p,d,v;function y(t,e){return t.pxmid[1]-e.pxmid[1]}function m(t,e){return e.pxmid[1]-t.pxmid[1]}function x(t,r){r||(r={});var i,c,f,p,d=r.labelExtraY+(n?r.yLabelMax:r.yLabelMin),v=n?t.yLabelMin:t.yLabelMax,y=n?t.yLabelMax:t.yLabelMin,m=t.cyFinal+o(t.px0[1],t.px1[1]),x=d-v;if(x*u>0&&(t.labelExtraY=x),l.isArrayOrTypedArray(e.pull))for(c=0;c=(g.castOption(e.pull,f.pts)||0)||((t.pxmid[1]-f.pxmid[1])*u>0?(x=f.cyFinal+o(f.px0[1],f.px1[1])-v-t.labelExtraY)*u>0&&(t.labelExtraY+=x):(y+t.labelExtraY-m)*u>0&&(i=3*s*Math.abs(c-h.indexOf(t)),(p=f.cxFinal+a(f.px0[0],f.px1[0])+i-(t.cxFinal+t.pxmid[0])-t.labelExtraX)*s>0&&(t.labelExtraX+=p)))}for(n=0;n<2;n++)for(i=n?y:m,o=n?Math.max:Math.min,u=n?1:-1,r=0;r<2;r++){for(a=r?Math.max:Math.min,s=r?1:-1,(c=t[n][r]).sort(i),f=t[1-n][r],h=f.concat(c),d=[],p=0;pMath.abs(f)?s+=\"l\"+f*t.pxmid[0]/t.pxmid[1]+\",\"+f+\"H\"+(a+t.labelExtraX+u):s+=\"l\"+t.labelExtraX+\",\"+c+\"v\"+(f-c)+\"h\"+u}else s+=\"V\"+(t.yLabelMid+t.labelExtraY)+\"h\"+u;l.ensureSingle(r,\"path\",\"textline\").call(o.stroke,e.outsidetextfont.color).attr({\"stroke-width\":Math.min(2,e.outsidetextfont.size/8),d:s,fill:\"none\"})}else r.select(\"path.textline\").remove()}))}(m,y),T&&y.automargin){var A=s.bBox(d.node()),M=y.domain,S=h.w*(M.x[1]-M.x[0]),E=h.h*(M.y[1]-M.y[0]),P=(.5*S-v.r)/h.w,O=(.5*E-v.r)/h.h;i.autoMargin(t,\"pie.\"+y.uid+\".automargin\",{xl:M.x[0]-P,xr:M.x[1]+P,yb:M.y[0]-O,yt:M.y[1]+O,l:Math.max(v.cx-v.r-A.left,0),r:Math.max(A.right-(v.cx+v.r),0),b:Math.max(A.bottom-(v.cy+v.r),0),t:Math.max(v.cy-v.r-A.top,0),pad:5})}}))}));setTimeout((function(){v.selectAll(\"tspan\").each((function(){var t=n.select(this);t.attr(\"dy\")&&t.attr(\"dy\",t.attr(\"dy\"))}))}),0)},formatSliceLabel:D,transformInsideText:w,determineInsideTextFont:b,positionTitleOutside:C,prerenderTitles:_,layoutAreas:I,attachFxHandlers:x,computeTransform:R}},22152:function(t,e,r){\"use strict\";var n=r(33428),i=r(10528),a=r(82744).resizeText;t.exports=function(t){var e=t._fullLayout._pielayer.selectAll(\".trace\");a(t,e,\"pie\"),e.each((function(e){var r=e[0].trace,a=n.select(this);a.style({opacity:r.opacity}),a.selectAll(\"path.surface\").each((function(e){n.select(this).call(i,e,r,t)}))}))}},10528:function(t,e,r){\"use strict\";var n=r(76308),i=r(69656).castOption,a=r(21552);t.exports=function(t,e,r,o){var s=r.marker.line,l=i(s.color,e.pts)||n.defaultLine,u=i(s.width,e.pts)||0;t.call(a,e,r,o).style(\"stroke-width\",u).call(n.stroke,l)}},35484:function(t,e,r){\"use strict\";var n=r(52904);t.exports={x:n.x,y:n.y,xy:{valType:\"data_array\",editType:\"calc\"},indices:{valType:\"data_array\",editType:\"calc\"},xbounds:{valType:\"data_array\",editType:\"calc\"},ybounds:{valType:\"data_array\",editType:\"calc\"},text:n.text,marker:{color:{valType:\"color\",arrayOk:!1,editType:\"calc\"},opacity:{valType:\"number\",min:0,max:1,dflt:1,arrayOk:!1,editType:\"calc\"},blend:{valType:\"boolean\",dflt:null,editType:\"calc\"},sizemin:{valType:\"number\",min:.1,max:2,dflt:.5,editType:\"calc\"},sizemax:{valType:\"number\",min:.1,dflt:20,editType:\"calc\"},border:{color:{valType:\"color\",arrayOk:!1,editType:\"calc\"},arearatio:{valType:\"number\",min:0,max:1,dflt:0,editType:\"calc\"},editType:\"calc\"},editType:\"calc\"},transforms:void 0}},11072:function(t,e,r){\"use strict\";var n=r(67792).gl_pointcloud2d,i=r(3400).isArrayOrTypedArray,a=r(43080),o=r(19280).findExtremes,s=r(44928);function l(t,e){this.scene=t,this.uid=e,this.type=\"pointcloud\",this.pickXData=[],this.pickYData=[],this.xData=[],this.yData=[],this.textLabels=[],this.color=\"rgb(0, 0, 0)\",this.name=\"\",this.hoverinfo=\"all\",this.idToIndex=new Int32Array(0),this.bounds=[0,0,0,0],this.pointcloudOptions={positions:new Float32Array(0),idToIndex:this.idToIndex,sizemin:.5,sizemax:12,color:[0,0,0,1],areaRatio:1,borderColor:[0,0,0,1]},this.pointcloud=n(t.glplot,this.pointcloudOptions),this.pointcloud._trace=this}var u=l.prototype;u.handlePick=function(t){var e=this.idToIndex[t.pointId];return{trace:this,dataCoord:t.dataCoord,traceCoord:this.pickXYData?[this.pickXYData[2*e],this.pickXYData[2*e+1]]:[this.pickXData[e],this.pickYData[e]],textLabel:i(this.textLabels)?this.textLabels[e]:this.textLabels,color:this.color,name:this.name,pointIndex:e,hoverinfo:this.hoverinfo}},u.update=function(t){this.index=t.index,this.textLabels=t.text,this.name=t.name,this.hoverinfo=t.hoverinfo,this.bounds=[1/0,1/0,-1/0,-1/0],this.updateFast(t),this.color=s(t,{})},u.updateFast=function(t){var e,r,n,i,s,l,u=this.xData=this.pickXData=t.x,c=this.yData=this.pickYData=t.y,f=this.pickXYData=t.xy,h=t.xbounds&&t.ybounds,p=t.indices,d=this.bounds;if(f){if(n=f,e=f.length>>>1,h)d[0]=t.xbounds[0],d[2]=t.xbounds[1],d[1]=t.ybounds[0],d[3]=t.ybounds[1];else for(l=0;ld[2]&&(d[2]=i),sd[3]&&(d[3]=s);if(p)r=p;else for(r=new Int32Array(e),l=0;ld[2]&&(d[2]=i),sd[3]&&(d[3]=s);this.idToIndex=r,this.pointcloudOptions.idToIndex=r,this.pointcloudOptions.positions=n;var v=a(t.marker.color),g=a(t.marker.border.color),y=t.opacity*t.marker.opacity;v[3]*=y,this.pointcloudOptions.color=v;var m=t.marker.blend;null===m&&(m=u.length<100||c.length<100),this.pointcloudOptions.blend=m,g[3]*=y,this.pointcloudOptions.borderColor=g;var x=t.marker.sizemin,b=Math.max(t.marker.sizemax,t.marker.sizemin);this.pointcloudOptions.sizeMin=x,this.pointcloudOptions.sizeMax=b,this.pointcloudOptions.areaRatio=t.marker.border.arearatio,this.pointcloud.update(this.pointcloudOptions);var _=this.scene.xaxis,w=this.scene.yaxis,T=b/2||.5;t._extremes[_._id]=o(_,[d[0],d[2]],{ppad:T}),t._extremes[w._id]=o(w,[d[1],d[3]],{ppad:T})},u.dispose=function(){this.pointcloud.dispose()},t.exports=function(t,e){var r=new l(t,e.uid);return r.update(e),r}},41904:function(t,e,r){\"use strict\";var n=r(3400),i=r(35484);t.exports=function(t,e,r){function a(r,a){return n.coerce(t,e,i,r,a)}a(\"x\"),a(\"y\"),a(\"xbounds\"),a(\"ybounds\"),t.xy&&t.xy instanceof Float32Array&&(e.xy=t.xy),t.indices&&t.indices instanceof Int32Array&&(e.indices=t.indices),a(\"text\"),a(\"marker.color\",r),a(\"marker.opacity\"),a(\"marker.blend\"),a(\"marker.sizemin\"),a(\"marker.sizemax\"),a(\"marker.border.color\",r),a(\"marker.border.arearatio\"),e._length=null}},156:function(t,e,r){\"use strict\";[\"*pointcloud* trace is deprecated!\",\"Please consider switching to the *scattergl* trace type.\"].join(\" \"),t.exports={attributes:r(35484),supplyDefaults:r(41904),calc:r(41484),plot:r(11072),moduleType:\"trace\",name:\"pointcloud\",basePlotModule:r(39952),categories:[\"gl\",\"gl2d\",\"showLegend\"],meta:{}}},41440:function(t,e,r){\"use strict\";var n=r(25376),i=r(45464),a=r(22548),o=r(55756),s=r(86968).u,l=r(21776).Ks,u=r(49084),c=r(31780).templatedArray,f=r(29736).descriptionOnlyNumbers,h=r(92880).extendFlat,p=r(67824).overrideAll;(t.exports=p({hoverinfo:h({},i.hoverinfo,{flags:[],arrayOk:!1}),hoverlabel:o.hoverlabel,domain:s({name:\"sankey\",trace:!0}),orientation:{valType:\"enumerated\",values:[\"v\",\"h\"],dflt:\"h\"},valueformat:{valType:\"string\",dflt:\".3s\",description:f(\"value\")},valuesuffix:{valType:\"string\",dflt:\"\"},arrangement:{valType:\"enumerated\",values:[\"snap\",\"perpendicular\",\"freeform\",\"fixed\"],dflt:\"snap\"},textfont:n({}),customdata:void 0,node:{label:{valType:\"data_array\",dflt:[]},groups:{valType:\"info_array\",impliedEdits:{x:[],y:[]},dimensions:2,freeLength:!0,dflt:[],items:{valType:\"number\",editType:\"calc\"}},x:{valType:\"data_array\",dflt:[]},y:{valType:\"data_array\",dflt:[]},color:{valType:\"color\",arrayOk:!0},customdata:{valType:\"data_array\",editType:\"calc\"},line:{color:{valType:\"color\",dflt:a.defaultLine,arrayOk:!0},width:{valType:\"number\",min:0,dflt:.5,arrayOk:!0}},pad:{valType:\"number\",arrayOk:!1,min:0,dflt:20},thickness:{valType:\"number\",arrayOk:!1,min:1,dflt:20},hoverinfo:{valType:\"enumerated\",values:[\"all\",\"none\",\"skip\"],dflt:\"all\"},hoverlabel:o.hoverlabel,hovertemplate:l({},{keys:[\"value\",\"label\"]}),align:{valType:\"enumerated\",values:[\"justify\",\"left\",\"right\",\"center\"],dflt:\"justify\"}},link:{arrowlen:{valType:\"number\",min:0,dflt:0},label:{valType:\"data_array\",dflt:[]},color:{valType:\"color\",arrayOk:!0},hovercolor:{valType:\"color\",arrayOk:!0},customdata:{valType:\"data_array\",editType:\"calc\"},line:{color:{valType:\"color\",dflt:a.defaultLine,arrayOk:!0},width:{valType:\"number\",min:0,dflt:0,arrayOk:!0}},source:{valType:\"data_array\",dflt:[]},target:{valType:\"data_array\",dflt:[]},value:{valType:\"data_array\",dflt:[]},hoverinfo:{valType:\"enumerated\",values:[\"all\",\"none\",\"skip\"],dflt:\"all\"},hoverlabel:o.hoverlabel,hovertemplate:l({},{keys:[\"value\",\"label\"]}),colorscales:c(\"concentrationscales\",{editType:\"calc\",label:{valType:\"string\",editType:\"calc\",dflt:\"\"},cmax:{valType:\"number\",editType:\"calc\",dflt:1},cmin:{valType:\"number\",editType:\"calc\",dflt:0},colorscale:h(u().colorscale,{dflt:[[0,\"white\"],[1,\"black\"]]})})}},\"calc\",\"nested\")).transforms=void 0},10760:function(t,e,r){\"use strict\";var n=r(67824).overrideAll,i=r(84888)._M,a=r(59596),o=r(65460),s=r(93972),l=r(86476),u=r(22676).prepSelect,c=r(3400),f=r(24040),h=\"sankey\";function p(t,e){var r=t._fullData[e],n=t._fullLayout,i=n.dragmode,a=\"pan\"===n.dragmode?\"move\":\"crosshair\",o=r._bgRect;if(o&&\"pan\"!==i&&\"zoom\"!==i){s(o,a);var h={_id:\"x\",c2p:c.identity,_offset:r._sankey.translateX,_length:r._sankey.width},p={_id:\"y\",c2p:c.identity,_offset:r._sankey.translateY,_length:r._sankey.height},d={gd:t,element:o.node(),plotinfo:{id:e,xaxis:h,yaxis:p,fillRangeItems:c.noop},subplot:e,xaxes:[h],yaxes:[p],doneFnCompleted:function(r){var n,i=t._fullData[e],a=i.node.groups.slice(),o=[];function s(t){for(var e=i._sankey.graph.nodes,r=0;rx&&(x=a.source[e]),a.target[e]>x&&(x=a.target[e]);var b,_=x+1;t.node._count=_;var w=t.node.groups,T={};for(e=0;e0&&s(L,_)&&s(C,_)&&(!T.hasOwnProperty(L)||!T.hasOwnProperty(C)||T[L]!==T[C])){T.hasOwnProperty(C)&&(C=T[C]),T.hasOwnProperty(L)&&(L=T[L]),C=+C,p[L=+L]=p[C]=!0;var P=\"\";a.label&&a.label[e]&&(P=a.label[e]);var O=null;P&&d.hasOwnProperty(P)&&(O=d[P]),u.push({pointNumber:e,label:P,color:c?a.color[e]:a.color,hovercolor:f?a.hovercolor[e]:a.hovercolor,customdata:h?a.customdata[e]:a.customdata,concentrationscale:O,source:L,target:C,value:+E}),S.source.push(L),S.target.push(C)}}var I=_+w.length,z=o(r.color),D=o(r.customdata),R=[];for(e=0;e_-1,childrenNodes:[],pointNumber:e,label:F,color:z?r.color[e]:r.color,customdata:D?r.customdata[e]:r.customdata})}var B=!1;return function(t,e,r){for(var a=i.init2dArray(t,0),o=0;o1}))}(I,S.source,S.target)&&(B=!0),{circular:B,links:u,nodes:R,groups:w,groupLookup:T}}(e);return a({circular:r.circular,_nodes:r.nodes,_links:r.links,_groups:r.groups,_groupLookup:r.groupLookup})}},11820:function(t){\"use strict\";t.exports={nodeTextOffsetHorizontal:4,nodeTextOffsetVertical:3,nodePadAcross:10,sankeyIterations:50,forceIterations:5,forceTicksPerFrame:10,duration:500,ease:\"linear\",cn:{sankey:\"sankey\",sankeyLinks:\"sankey-links\",sankeyLink:\"sankey-link\",sankeyNodeSet:\"sankey-node-set\",sankeyNode:\"sankey-node\",nodeRect:\"node-rect\",nodeLabel:\"node-label\"}}},47140:function(t,e,r){\"use strict\";var n=r(3400),i=r(41440),a=r(76308),o=r(49760),s=r(86968).Q,l=r(16132),u=r(31780),c=r(51272);function f(t,e){function r(r,a){return n.coerce(t,e,i.link.colorscales,r,a)}r(\"label\"),r(\"cmin\"),r(\"cmax\"),r(\"colorscale\")}t.exports=function(t,e,r,h){function p(r,a){return n.coerce(t,e,i,r,a)}var d=n.extendDeep(h.hoverlabel,t.hoverlabel),v=t.node,g=u.newContainer(e,\"node\");function y(t,e){return n.coerce(v,g,i.node,t,e)}y(\"label\"),y(\"groups\"),y(\"x\"),y(\"y\"),y(\"pad\"),y(\"thickness\"),y(\"line.color\"),y(\"line.width\"),y(\"hoverinfo\",t.hoverinfo),l(v,g,y,d),y(\"hovertemplate\"),y(\"align\");var m=h.colorway;y(\"color\",g.label.map((function(t,e){return a.addOpacity(function(t){return m[t%m.length]}(e),.8)}))),y(\"customdata\");var x=t.link||{},b=u.newContainer(e,\"link\");function _(t,e){return n.coerce(x,b,i.link,t,e)}_(\"label\"),_(\"arrowlen\"),_(\"source\"),_(\"target\"),_(\"value\"),_(\"line.color\"),_(\"line.width\"),_(\"hoverinfo\",t.hoverinfo),l(x,b,_,d),_(\"hovertemplate\");var w,T=o(h.paper_bgcolor).getLuminance()<.333,k=_(\"color\",T?\"rgba(255, 255, 255, 0.6)\":\"rgba(0, 0, 0, 0.2)\");function A(t){var e=o(t);if(!e.isValid())return t;var r=e.getAlpha();return r<=.8?e.setAlpha(r+.2):e=T?e.brighten():e.darken(),e.toRgbString()}_(\"hovercolor\",Array.isArray(k)?k.map(A):A(k)),_(\"customdata\"),c(x,b,{name:\"colorscales\",handleItemDefaults:f}),s(e,h,p),p(\"orientation\"),p(\"valueformat\"),p(\"valuesuffix\"),g.x.length&&g.y.length&&(w=\"freeform\"),p(\"arrangement\",w),n.coerceFont(p,\"textfont\",n.extendFlat({},h.font)),e._length=null}},45499:function(t,e,r){\"use strict\";t.exports={attributes:r(41440),supplyDefaults:r(47140),calc:r(48068),plot:r(59596),moduleType:\"trace\",name:\"sankey\",basePlotModule:r(10760),selectPoints:r(81128),categories:[\"noOpacity\"],meta:{}}},59596:function(t,e,r){\"use strict\";var n=r(33428),i=r(3400),a=i.numberFormat,o=r(83248),s=r(93024),l=r(76308),u=r(11820).cn,c=i._;function f(t){return\"\"!==t}function h(t,e){return t.filter((function(t){return t.key===e.traceId}))}function p(t,e){n.select(t).select(\"path\").style(\"fill-opacity\",e),n.select(t).select(\"rect\").style(\"fill-opacity\",e)}function d(t){n.select(t).select(\"text.name\").style(\"fill\",\"black\")}function v(t){return function(e){return-1!==t.node.sourceLinks.indexOf(e.link)||-1!==t.node.targetLinks.indexOf(e.link)}}function g(t){return function(e){return-1!==e.node.sourceLinks.indexOf(t.link)||-1!==e.node.targetLinks.indexOf(t.link)}}function y(t,e,r){e&&r&&h(r,e).selectAll(\".\"+u.sankeyLink).filter(v(e)).call(x.bind(0,e,r,!1))}function m(t,e,r){e&&r&&h(r,e).selectAll(\".\"+u.sankeyLink).filter(v(e)).call(b.bind(0,e,r,!1))}function x(t,e,r,n){n.style(\"fill\",(function(t){if(!t.link.concentrationscale)return t.tinyColorHoverHue})).style(\"fill-opacity\",(function(t){if(!t.link.concentrationscale)return t.tinyColorHoverAlpha})),n.each((function(r){var n=r.link.label;\"\"!==n&&h(e,t).selectAll(\".\"+u.sankeyLink).filter((function(t){return t.link.label===n})).style(\"fill\",(function(t){if(!t.link.concentrationscale)return t.tinyColorHoverHue})).style(\"fill-opacity\",(function(t){if(!t.link.concentrationscale)return t.tinyColorHoverAlpha}))})),r&&h(e,t).selectAll(\".\"+u.sankeyNode).filter(g(t)).call(y)}function b(t,e,r,n){n.style(\"fill\",(function(t){return t.tinyColorHue})).style(\"fill-opacity\",(function(t){return t.tinyColorAlpha})),n.each((function(r){var n=r.link.label;\"\"!==n&&h(e,t).selectAll(\".\"+u.sankeyLink).filter((function(t){return t.link.label===n})).style(\"fill\",(function(t){return t.tinyColorHue})).style(\"fill-opacity\",(function(t){return t.tinyColorAlpha}))})),r&&h(e,t).selectAll(u.sankeyNode).filter(g(t)).call(m)}function _(t,e){var r=t.hoverlabel||{},n=i.nestedProperty(r,e).get();return!Array.isArray(n)&&n}t.exports=function(t,e){for(var r=t._fullLayout,i=r._paper,h=r._size,v=0;v\"),color:_(o,\"bgcolor\")||l.addOpacity(v.color,1),borderColor:_(o,\"bordercolor\"),fontFamily:_(o,\"font.family\"),fontSize:_(o,\"font.size\"),fontColor:_(o,\"font.color\"),fontWeight:_(o,\"font.weight\"),fontStyle:_(o,\"font.style\"),fontVariant:_(o,\"font.variant\"),nameLength:_(o,\"namelength\"),textAlign:_(o,\"align\"),idealAlign:n.event.x\"),color:_(o,\"bgcolor\")||i.tinyColorHue,borderColor:_(o,\"bordercolor\"),fontFamily:_(o,\"font.family\"),fontSize:_(o,\"font.size\"),fontColor:_(o,\"font.color\"),fontWeight:_(o,\"font.weight\"),fontStyle:_(o,\"font.style\"),fontVariant:_(o,\"font.variant\"),nameLength:_(o,\"namelength\"),textAlign:_(o,\"align\"),idealAlign:\"left\",hovertemplate:o.hovertemplate,hovertemplateLabels:m,eventData:[i.node]},{container:r._hoverlayer.node(),outerContainer:r._paper.node(),gd:t});p(w,.85),d(w)}}},unhover:function(e,i,a){!1!==t._fullLayout.hovermode&&(n.select(e).call(m,i,a),\"skip\"!==i.node.trace.node.hoverinfo&&(i.node.fullData=i.node.trace,t.emit(\"plotly_unhover\",{event:n.event,points:[i.node]})),s.loneUnhover(r._hoverlayer.node()))},select:function(e,r,i){var a=r.node;a.originalEvent=n.event,t._hoverdata=[a],n.select(e).call(m,r,i),s.click(t,{target:!0})}}})}},83248:function(t,e,r){\"use strict\";var n=r(49812),i=r(67756).Gz,a=r(33428),o=r(26800),s=r(48932),l=r(11820),u=r(49760),c=r(76308),f=r(43616),h=r(3400),p=h.strTranslate,d=h.strRotate,v=r(71688),g=v.keyFun,y=v.repeat,m=v.unwrap,x=r(72736),b=r(24040),_=r(84284),w=_.CAP_SHIFT,T=_.LINE_SPACING;function k(t,e,r){var n,i=m(e),a=i.trace,c=a.domain,f=\"h\"===a.orientation,p=a.node.pad,d=a.node.thickness,v={justify:o.sankeyJustify,left:o.sankeyLeft,right:o.sankeyRight,center:o.sankeyCenter}[a.node.align],g=t.width*(c.x[1]-c.x[0]),y=t.height*(c.y[1]-c.y[0]),x=i._nodes,b=i._links,_=i.circular;(n=_?s.sankeyCircular().circularLinkGap(0):o.sankey()).iterations(l.sankeyIterations).size(f?[g,y]:[y,g]).nodeWidth(d).nodePadding(p).nodeId((function(t){return t.pointNumber})).nodeAlign(v).nodes(x).links(b);var w,T,k,A=n();for(var M in n.nodePadding()o+d&&(a+=1,e=s.x0),o=s.x0,i[a]||(i[a]=[]),i[a].push(s),r=e-s.x0,s.x0+=r,s.x1+=r}return i}(x=A.nodes).forEach((function(t){var e,r,n,i=0,a=t.length;for(t.sort((function(t,e){return t.y0-e.y0})),n=0;n=i||(r=i-e.y0)>1e-6&&(e.y0+=r,e.y1+=r),i=e.y1+p})),n.update(A)}return{circular:_,key:r,trace:a,guid:h.randstr(),horizontal:f,width:g,height:y,nodePad:a.node.pad,nodeLineColor:a.node.line.color,nodeLineWidth:a.node.line.width,linkLineColor:a.link.line.color,linkLineWidth:a.link.line.width,linkArrowLength:a.link.arrowlen,valueFormat:a.valueformat,valueSuffix:a.valuesuffix,textFont:a.textfont,translateX:c.x[0]*t.width+t.margin.l,translateY:t.height-c.y[1]*t.height+t.margin.t,dragParallel:f?y:g,dragPerpendicular:f?g:y,arrangement:a.arrangement,sankey:n,graph:A,forceLayouts:{},interactionState:{dragInProgress:!1,hovered:!1}}}function A(t,e,r){var n=u(e.color),i=u(e.hovercolor),a=e.source.label+\"|\"+e.target.label+\"__\"+r;return e.trace=t.trace,e.curveNumber=t.trace.index,{circular:t.circular,key:a,traceId:t.key,pointNumber:e.pointNumber,link:e,tinyColorHue:c.tinyRGB(n),tinyColorAlpha:n.getAlpha(),tinyColorHoverHue:c.tinyRGB(i),tinyColorHoverAlpha:i.getAlpha(),linkPath:M,linkLineColor:t.linkLineColor,linkLineWidth:t.linkLineWidth,linkArrowLength:t.linkArrowLength,valueFormat:t.valueFormat,valueSuffix:t.valueSuffix,sankey:t.sankey,parent:t,interactionState:t.interactionState,flow:e.flow}}function M(){return function(t){var e=t.linkArrowLength;if(t.link.circular)return function(t,e){var r=t.width/2,n=t.circularPathData;return\"top\"===t.circularLinkType?\"M \"+(n.targetX-e)+\" \"+(n.targetY+r)+\" L\"+(n.rightInnerExtent-e)+\" \"+(n.targetY+r)+\"A\"+(n.rightLargeArcRadius+r)+\" \"+(n.rightSmallArcRadius+r)+\" 0 0 1 \"+(n.rightFullExtent-r-e)+\" \"+(n.targetY-n.rightSmallArcRadius)+\"L\"+(n.rightFullExtent-r-e)+\" \"+n.verticalRightInnerExtent+\"A\"+(n.rightLargeArcRadius+r)+\" \"+(n.rightLargeArcRadius+r)+\" 0 0 1 \"+(n.rightInnerExtent-e)+\" \"+(n.verticalFullExtent-r)+\"L\"+n.leftInnerExtent+\" \"+(n.verticalFullExtent-r)+\"A\"+(n.leftLargeArcRadius+r)+\" \"+(n.leftLargeArcRadius+r)+\" 0 0 1 \"+(n.leftFullExtent+r)+\" \"+n.verticalLeftInnerExtent+\"L\"+(n.leftFullExtent+r)+\" \"+(n.sourceY-n.leftSmallArcRadius)+\"A\"+(n.leftLargeArcRadius+r)+\" \"+(n.leftSmallArcRadius+r)+\" 0 0 1 \"+n.leftInnerExtent+\" \"+(n.sourceY+r)+\"L\"+n.sourceX+\" \"+(n.sourceY+r)+\"L\"+n.sourceX+\" \"+(n.sourceY-r)+\"L\"+n.leftInnerExtent+\" \"+(n.sourceY-r)+\"A\"+(n.leftLargeArcRadius-r)+\" \"+(n.leftSmallArcRadius-r)+\" 0 0 0 \"+(n.leftFullExtent-r)+\" \"+(n.sourceY-n.leftSmallArcRadius)+\"L\"+(n.leftFullExtent-r)+\" \"+n.verticalLeftInnerExtent+\"A\"+(n.leftLargeArcRadius-r)+\" \"+(n.leftLargeArcRadius-r)+\" 0 0 0 \"+n.leftInnerExtent+\" \"+(n.verticalFullExtent+r)+\"L\"+(n.rightInnerExtent-e)+\" \"+(n.verticalFullExtent+r)+\"A\"+(n.rightLargeArcRadius-r)+\" \"+(n.rightLargeArcRadius-r)+\" 0 0 0 \"+(n.rightFullExtent+r-e)+\" \"+n.verticalRightInnerExtent+\"L\"+(n.rightFullExtent+r-e)+\" \"+(n.targetY-n.rightSmallArcRadius)+\"A\"+(n.rightLargeArcRadius-r)+\" \"+(n.rightSmallArcRadius-r)+\" 0 0 0 \"+(n.rightInnerExtent-e)+\" \"+(n.targetY-r)+\"L\"+(n.targetX-e)+\" \"+(n.targetY-r)+(e>0?\"L\"+n.targetX+\" \"+n.targetY:\"\")+\"Z\":\"M \"+(n.targetX-e)+\" \"+(n.targetY-r)+\" L\"+(n.rightInnerExtent-e)+\" \"+(n.targetY-r)+\"A\"+(n.rightLargeArcRadius+r)+\" \"+(n.rightSmallArcRadius+r)+\" 0 0 0 \"+(n.rightFullExtent-r-e)+\" \"+(n.targetY+n.rightSmallArcRadius)+\"L\"+(n.rightFullExtent-r-e)+\" \"+n.verticalRightInnerExtent+\"A\"+(n.rightLargeArcRadius+r)+\" \"+(n.rightLargeArcRadius+r)+\" 0 0 0 \"+(n.rightInnerExtent-e)+\" \"+(n.verticalFullExtent+r)+\"L\"+n.leftInnerExtent+\" \"+(n.verticalFullExtent+r)+\"A\"+(n.leftLargeArcRadius+r)+\" \"+(n.leftLargeArcRadius+r)+\" 0 0 0 \"+(n.leftFullExtent+r)+\" \"+n.verticalLeftInnerExtent+\"L\"+(n.leftFullExtent+r)+\" \"+(n.sourceY+n.leftSmallArcRadius)+\"A\"+(n.leftLargeArcRadius+r)+\" \"+(n.leftSmallArcRadius+r)+\" 0 0 0 \"+n.leftInnerExtent+\" \"+(n.sourceY-r)+\"L\"+n.sourceX+\" \"+(n.sourceY-r)+\"L\"+n.sourceX+\" \"+(n.sourceY+r)+\"L\"+n.leftInnerExtent+\" \"+(n.sourceY+r)+\"A\"+(n.leftLargeArcRadius-r)+\" \"+(n.leftSmallArcRadius-r)+\" 0 0 1 \"+(n.leftFullExtent-r)+\" \"+(n.sourceY+n.leftSmallArcRadius)+\"L\"+(n.leftFullExtent-r)+\" \"+n.verticalLeftInnerExtent+\"A\"+(n.leftLargeArcRadius-r)+\" \"+(n.leftLargeArcRadius-r)+\" 0 0 1 \"+n.leftInnerExtent+\" \"+(n.verticalFullExtent-r)+\"L\"+(n.rightInnerExtent-e)+\" \"+(n.verticalFullExtent-r)+\"A\"+(n.rightLargeArcRadius-r)+\" \"+(n.rightLargeArcRadius-r)+\" 0 0 1 \"+(n.rightFullExtent+r-e)+\" \"+n.verticalRightInnerExtent+\"L\"+(n.rightFullExtent+r-e)+\" \"+(n.targetY+n.rightSmallArcRadius)+\"A\"+(n.rightLargeArcRadius-r)+\" \"+(n.rightSmallArcRadius-r)+\" 0 0 1 \"+(n.rightInnerExtent-e)+\" \"+(n.targetY+r)+\"L\"+(n.targetX-e)+\" \"+(n.targetY+r)+(e>0?\"L\"+n.targetX+\" \"+n.targetY:\"\")+\"Z\"}(t.link,e);var r=Math.abs((t.link.target.x0-t.link.source.x1)/2);e>r&&(e=r);var n=t.link.source.x1,a=t.link.target.x0-e,o=i(n,a),s=o(.5),l=o(.5),u=t.link.y0-t.link.width/2,c=t.link.y0+t.link.width/2,f=t.link.y1-t.link.width/2,h=t.link.y1+t.link.width/2,p=\"M\"+n+\",\"+u,d=\"C\"+s+\",\"+u+\" \"+l+\",\"+f+\" \"+a+\",\"+f,v=\"C\"+l+\",\"+h+\" \"+s+\",\"+c+\" \"+n+\",\"+c,g=e>0?\"L\"+(a+e)+\",\"+(f+t.link.width/2):\"\";return p+d+(g+=\"L\"+a+\",\"+h)+v+\"Z\"}}function S(t,e){var r=u(e.color),n=l.nodePadAcross,i=t.nodePad/2;e.dx=e.x1-e.x0,e.dy=e.y1-e.y0;var a=e.dx,o=Math.max(.5,e.dy),s=\"node_\"+e.pointNumber;return e.group&&(s=h.randstr()),e.trace=t.trace,e.curveNumber=t.trace.index,{index:e.pointNumber,key:s,partOfGroup:e.partOfGroup||!1,group:e.group,traceId:t.key,trace:t.trace,node:e,nodePad:t.nodePad,nodeLineColor:t.nodeLineColor,nodeLineWidth:t.nodeLineWidth,textFont:t.textFont,size:t.horizontal?t.height:t.width,visibleWidth:Math.ceil(a),visibleHeight:o,zoneX:-n,zoneY:-i,zoneWidth:a+2*n,zoneHeight:o+2*i,labelY:t.horizontal?e.dy/2+1:e.dx/2+1,left:1===e.originalLayer,sizeAcross:t.width,forceLayouts:t.forceLayouts,horizontal:t.horizontal,darkBackground:r.getBrightness()<=128,tinyColorHue:c.tinyRGB(r),tinyColorAlpha:r.getAlpha(),valueFormat:t.valueFormat,valueSuffix:t.valueSuffix,sankey:t.sankey,graph:t.graph,arrangement:t.arrangement,uniqueNodeLabelPathId:[t.guid,t.key,s].join(\"_\"),interactionState:t.interactionState,figure:t}}function E(t){t.attr(\"transform\",(function(t){return p(t.node.x0.toFixed(3),t.node.y0.toFixed(3))}))}function L(t){t.call(E)}function C(t,e){t.call(L),e.attr(\"d\",M())}function P(t){t.attr(\"width\",(function(t){return t.node.x1-t.node.x0})).attr(\"height\",(function(t){return t.visibleHeight}))}function O(t){return t.link.width>1||t.linkLineWidth>0}function I(t){return p(t.translateX,t.translateY)+(t.horizontal?\"matrix(1 0 0 1 0 0)\":\"matrix(0 1 1 0 0 0)\")}function z(t,e,r){t.on(\".basic\",null).on(\"mouseover.basic\",(function(t){t.interactionState.dragInProgress||t.partOfGroup||(r.hover(this,t,e),t.interactionState.hovered=[this,t])})).on(\"mousemove.basic\",(function(t){t.interactionState.dragInProgress||t.partOfGroup||(r.follow(this,t),t.interactionState.hovered=[this,t])})).on(\"mouseout.basic\",(function(t){t.interactionState.dragInProgress||t.partOfGroup||(r.unhover(this,t,e),t.interactionState.hovered=!1)})).on(\"click.basic\",(function(t){t.interactionState.hovered&&(r.unhover(this,t,e),t.interactionState.hovered=!1),t.interactionState.dragInProgress||t.partOfGroup||r.select(this,t,e)}))}function D(t,e,r,i){var o=a.behavior.drag().origin((function(t){return{x:t.node.x0+t.visibleWidth/2,y:t.node.y0+t.visibleHeight/2}})).on(\"dragstart\",(function(a){if(\"fixed\"!==a.arrangement&&(h.ensureSingle(i._fullLayout._infolayer,\"g\",\"dragcover\",(function(t){i._fullLayout._dragCover=t})),h.raiseToTop(this),a.interactionState.dragInProgress=a.node,F(a.node),a.interactionState.hovered&&(r.nodeEvents.unhover.apply(0,a.interactionState.hovered),a.interactionState.hovered=!1),\"snap\"===a.arrangement)){var o=a.traceId+\"|\"+a.key;a.forceLayouts[o]?a.forceLayouts[o].alpha(1):function(t,e,r,i){!function(t){for(var e=0;e0&&n.forceLayouts[e].alpha(0)}}(0,e,a,r)).stop()}(0,o,a),function(t,e,r,n,i){window.requestAnimationFrame((function a(){var o;for(o=0;o0)window.requestAnimationFrame(a);else{var s=r.node.originalX;r.node.x0=s-r.visibleWidth/2,r.node.x1=s+r.visibleWidth/2,R(r,i)}}))}(t,e,a,o,i)}})).on(\"drag\",(function(r){if(\"fixed\"!==r.arrangement){var n=a.event.x,i=a.event.y;\"snap\"===r.arrangement?(r.node.x0=n-r.visibleWidth/2,r.node.x1=n+r.visibleWidth/2,r.node.y0=i-r.visibleHeight/2,r.node.y1=i+r.visibleHeight/2):(\"freeform\"===r.arrangement&&(r.node.x0=n-r.visibleWidth/2,r.node.x1=n+r.visibleWidth/2),i=Math.max(0,Math.min(r.size-r.visibleHeight/2,i)),r.node.y0=i-r.visibleHeight/2,r.node.y1=i+r.visibleHeight/2),F(r.node),\"snap\"!==r.arrangement&&(r.sankey.update(r.graph),C(t.filter(B(r)),e))}})).on(\"dragend\",(function(t){if(\"fixed\"!==t.arrangement){t.interactionState.dragInProgress=!1;for(var e=0;el&&C[y].gap;)y--;for(x=C[y].s,v=C.length-1;v>y;v--)C[v].s=x;for(;lS[f]&&f=0;f--){var h=t[f];if(\"scatter\"===h.type&&h.xaxis===u.xaxis&&h.yaxis===u.yaxis){h.opacity=void 0;break}}}}}},18800:function(t,e,r){\"use strict\";var n=r(3400),i=r(24040),a=r(52904),o=r(88200),s=r(43028),l=r(43980),u=r(31147),c=r(43912),f=r(74428),h=r(66828),p=r(11731),d=r(124),v=r(70840),g=r(3400).coercePattern;t.exports=function(t,e,r,y){function m(r,i){return n.coerce(t,e,a,r,i)}var x=l(t,e,y,m);if(x||(e.visible=!1),e.visible){u(t,e,y,m),m(\"xhoverformat\"),m(\"yhoverformat\"),m(\"zorder\");var b=c(t,e,y,m);\"group\"===y.scattermode&&void 0===e.orientation&&m(\"orientation\",\"v\");var _=!b&&x=Math.min(e,r)&&d<=Math.max(e,r)?0:1/0}var n=Math.max(3,t.mrc||0),i=1-1/n,a=Math.abs(h.c2p(t.x)-d);return a=Math.min(e,r)&&v<=Math.max(e,r)?0:1/0}var n=Math.max(3,t.mrc||0),i=1-1/n,a=Math.abs(p.c2p(t.y)-v);return ar!=(u=i[n][1])>=r&&(o=i[n-1][0],s=i[n][0],u-l&&(a=o+(s-o)*(r-l)/(u-l),f=Math.min(f,a),d=Math.max(d,a)));return{x0:f=Math.max(f,0),x1:d=Math.min(d,h._length),y0:r,y1:r}}(f._polygons);null===O&&(O={x0:g[0],x1:g[0],y0:g[1],y1:g[1]});var I=s.defaultLine;return s.opacity(f.fillcolor)?I=f.fillcolor:s.opacity((f.line||{}).color)&&(I=f.line.color),n.extendFlat(t,{distance:t.maxHoverDistance,x0:O.x0,x1:O.x1,y0:O.y0,y1:O.y1,color:I,hovertemplate:!1}),delete t.index,f.text&&!n.isArrayOrTypedArray(f.text)?t.text=String(f.text):t.text=f.name,[t]}}},65875:function(t,e,r){\"use strict\";var n=r(43028);t.exports={hasLines:n.hasLines,hasMarkers:n.hasMarkers,hasText:n.hasText,isBubble:n.isBubble,attributes:r(52904),layoutAttributes:r(55308),supplyDefaults:r(18800),crossTraceDefaults:r(35036),supplyLayoutDefaults:r(59748),calc:r(16356).calc,crossTraceCalc:r(96664),arraysToCalcdata:r(20148),plot:r(96504),colorbar:r(5528),formatLabels:r(76688),style:r(49224).style,styleOnSelect:r(49224).styleOnSelect,hoverPoints:r(98723),selectPoints:r(91560),animatable:!0,moduleType:\"trace\",name:\"scatter\",basePlotModule:r(57952),categories:[\"cartesian\",\"svg\",\"symbols\",\"errorBarsOK\",\"showLegend\",\"scatter-like\",\"zoomScale\"],meta:{}}},55308:function(t){\"use strict\";t.exports={scattermode:{valType:\"enumerated\",values:[\"group\",\"overlay\"],dflt:\"overlay\",editType:\"calc\"},scattergap:{valType:\"number\",min:0,max:1,editType:\"calc\"}}},59748:function(t,e,r){\"use strict\";var n=r(3400),i=r(55308);t.exports=function(t,e){var r,a=\"group\"===e.barmode;\"group\"===e.scattermode&&(\"scattergap\",r=a?e.bargap:.2,n.coerce(t,e,i,\"scattergap\",r))}},66828:function(t,e,r){\"use strict\";var n=r(3400).isArrayOrTypedArray,i=r(94288).hasColorscale,a=r(27260);t.exports=function(t,e,r,o,s,l){l||(l={});var u=(t.marker||{}).color;u&&u._inputArray&&(u=u._inputArray),s(\"line.color\",r),i(t,\"line\")?a(t,e,o,s,{prefix:\"line.\",cLetter:\"c\"}):s(\"line.color\",!n(u)&&u||r),s(\"line.width\"),l.noDash||s(\"line.dash\"),l.backoff&&s(\"line.backoff\")}},52340:function(t,e,r){\"use strict\";var n=r(43616),i=r(39032),a=i.BADNUM,o=i.LOG_CLIP,s=o+.5,l=o-.5,u=r(3400),c=u.segmentsIntersect,f=u.constrain,h=r(88200);t.exports=function(t,e){var r,i,o,p,d,v,g,y,m,x,b,_,w,T,k,A,M,S,E=e.trace||{},L=e.xaxis,C=e.yaxis,P=\"log\"===L.type,O=\"log\"===C.type,I=L._length,z=C._length,D=e.backoff,R=E.marker,F=e.connectGaps,B=e.baseTolerance,N=e.shape,j=\"linear\"===N,U=E.fill&&\"none\"!==E.fill,V=[],q=h.minTolerance,H=t.length,G=new Array(H),W=0;function Y(r){var n=t[r];if(!n)return!1;var i=e.linearized?L.l2p(n.x):L.c2p(n.x),o=e.linearized?C.l2p(n.y):C.c2p(n.y);if(i===a){if(P&&(i=L.c2p(n.x,!0)),i===a)return!1;O&&o===a&&(i*=Math.abs(L._m*z*(L._m>0?s:l)/(C._m*I*(C._m>0?s:l)))),i*=1e3}if(o===a){if(O&&(o=C.c2p(n.y,!0)),o===a)return!1;o*=1e3}return[i,o]}function X(t,e,r,n){var i=r-t,a=n-e,o=.5-t,s=.5-e,l=i*i+a*a,u=i*o+a*s;if(u>0&&uot||t[1]lt)return[f(t[0],at,ot),f(t[1],st,lt)]}function ft(t,e){return t[0]===e[0]&&(t[0]===at||t[0]===ot)||t[1]===e[1]&&(t[1]===st||t[1]===lt)||void 0}function ht(t,e,r){return function(n,i){var a=ct(n),o=ct(i),s=[];if(a&&o&&ft(a,o))return s;a&&s.push(a),o&&s.push(o);var l=2*u.constrain((n[t]+i[t])/2,e,r)-((a||n)[t]+(o||i)[t]);return l&&((a&&o?l>0==a[t]>o[t]?a:o:a||o)[t]+=l),s}}function pt(t){var e=t[0],r=t[1],n=e===G[W-1][0],i=r===G[W-1][1];if(!n||!i)if(W>1){var a=e===G[W-2][0],o=r===G[W-2][1];n&&(e===at||e===ot)&&a?o?W--:G[W-1]=t:i&&(r===st||r===lt)&&o?a?W--:G[W-1]=t:G[W++]=t}else G[W++]=t}function dt(t){G[W-1][0]!==t[0]&&G[W-1][1]!==t[1]&&pt([Q,tt]),pt(t),et=null,Q=tt=0}\"linear\"===N||\"spline\"===N?nt=function(t,e){for(var r=[],n=0,i=0;i<4;i++){var a=ut[i],o=c(t[0],t[1],e[0],e[1],a[0],a[1],a[2],a[3]);o&&(!n||Math.abs(o.x-r[0][0])>1||Math.abs(o.y-r[0][1])>1)&&(o=[o.x,o.y],n&&K(o,t)ot?ot:0,$=e[1]lt?lt:0,J||$){if(W)if(et){var n=nt(et,e);n.length>1&&(dt(n[0]),G[W++]=n[1])}else rt=nt(G[W-1],e)[0],G[W++]=rt;else G[W++]=[J||e[0],$||e[1]];var i=G[W-1];J&&$&&(i[0]!==J||i[1]!==$)?(et&&(Q!==J&&tt!==$?pt(Q&&tt?(a=et,s=(o=e)[0]-a[0],l=(o[1]-a[1])/s,(a[1]*o[0]-o[1]*a[0])/s>0?[l>0?at:ot,lt]:[l>0?ot:at,st]):[Q||J,tt||$]):Q&&tt&&pt([Q,tt])),pt([J,$])):Q-J&&tt-$&&pt([J||Q,$||tt]),et=e,Q=J,tt=$}else et&&dt(nt(et,e)[0]),G[W++]=e;var a,o,s,l}for(r=0;rZ(v,yt))break;o=v,(w=m[0]*y[0]+m[1]*y[1])>b?(b=w,p=v,g=!1):w<_&&(_=w,d=v,g=!0)}if(g?(gt(p),o!==d&>(d)):(d!==i&>(d),o!==p&>(p)),gt(o),r>=t.length||!v)break;gt(v),i=v}}else gt(p)}et&&pt([Q||et[0],tt||et[1]]),V.push(G.slice(0,W))}var mt=N.slice(N.length-1);if(D&&\"h\"!==mt&&\"v\"!==mt){for(var xt=!1,bt=-1,_t=[],wt=0;wt=0?l=p:(l=p=h,h++),l0?Math.max(r,a):0}}},5528:function(t){\"use strict\";t.exports={container:\"marker\",min:\"cmin\",max:\"cmax\"}},74428:function(t,e,r){\"use strict\";var n=r(76308),i=r(94288).hasColorscale,a=r(27260),o=r(43028);t.exports=function(t,e,r,s,l,u){var c=o.isBubble(t),f=(t.line||{}).color;u=u||{},f&&(r=f),l(\"marker.symbol\"),l(\"marker.opacity\",c?.7:1),l(\"marker.size\"),u.noAngle||(l(\"marker.angle\"),u.noAngleRef||l(\"marker.angleref\"),u.noStandOff||l(\"marker.standoff\")),l(\"marker.color\",r),i(t,\"marker\")&&a(t,e,s,l,{prefix:\"marker.\",cLetter:\"c\"}),u.noSelect||(l(\"selected.marker.color\"),l(\"unselected.marker.color\"),l(\"selected.marker.size\"),l(\"unselected.marker.size\")),u.noLine||(l(\"marker.line.color\",f&&!Array.isArray(f)&&e.marker.color!==f?f:c?n.background:n.defaultLine),i(t,\"marker.line\")&&a(t,e,s,l,{prefix:\"marker.line.\",cLetter:\"c\"}),l(\"marker.line.width\",c?1:0)),c&&(l(\"marker.sizeref\"),l(\"marker.sizemin\"),l(\"marker.sizemode\")),u.gradient&&\"none\"!==l(\"marker.gradient.type\")&&l(\"marker.gradient.color\")}},31147:function(t,e,r){\"use strict\";var n=r(3400).dateTick0,i=r(39032).ONEWEEK;function a(t,e){return n(e,t%i==0?1:0)}t.exports=function(t,e,r,n,i){if(i||(i={x:!0,y:!0}),i.x){var o=n(\"xperiod\");o&&(n(\"xperiod0\",a(o,e.xcalendar)),n(\"xperiodalignment\"))}if(i.y){var s=n(\"yperiod\");s&&(n(\"yperiod0\",a(s,e.ycalendar)),n(\"yperiodalignment\"))}}},96504:function(t,e,r){\"use strict\";var n=r(33428),i=r(24040),a=r(3400),o=a.ensureSingle,s=a.identity,l=r(43616),u=r(43028),c=r(52340),f=r(14328),h=r(92065).tester;function p(t,e,r,f,p,d,v){var g,y=t._context.staticPlot;!function(t,e,r,i,o){var s=r.xaxis,l=r.yaxis,c=n.extent(a.simpleMap(s.range,s.r2c)),f=n.extent(a.simpleMap(l.range,l.r2c)),h=i[0].trace;if(u.hasMarkers(h)){var p=h.marker.maxdisplayed;if(0!==p){var d=i.filter((function(t){return t.x>=c[0]&&t.x<=c[1]&&t.y>=f[0]&&t.y<=f[1]})),v=Math.ceil(d.length/p),g=0;o.forEach((function(t,r){var n=t[0].trace;u.hasMarkers(n)&&n.marker.maxdisplayed>0&&r0;function x(t){return m?t.transition():t}var b=r.xaxis,_=r.yaxis,w=f[0].trace,T=w.line,k=n.select(d),A=o(k,\"g\",\"errorbars\"),M=o(k,\"g\",\"lines\"),S=o(k,\"g\",\"points\"),E=o(k,\"g\",\"text\");if(i.getComponentMethod(\"errorbars\",\"plot\")(t,A,r,v),!0===w.visible){var L,C;x(k).style(\"opacity\",w.opacity);var P,O,I=w.fill.charAt(w.fill.length-1);\"x\"!==I&&\"y\"!==I&&(I=\"\"),\"y\"===I?(P=1,O=_.c2p(0,!0)):\"x\"===I&&(P=0,O=b.c2p(0,!0)),f[0][r.isRangePlot?\"nodeRangePlot3\":\"node3\"]=k;var z,D,R=\"\",F=[],B=w._prevtrace,N=null,j=null;B&&(R=B._prevRevpath||\"\",C=B._nextFill,F=B._ownPolygons,N=B._fillsegments,j=B._fillElement);var U,V,q,H,G,W,Y=\"\",X=\"\",Z=[];w._polygons=[];var K=[],J=[],$=a.noop;if(L=w._ownFill,u.hasLines(w)||\"none\"!==w.fill){C&&C.datum(f),-1!==[\"hv\",\"vh\",\"hvh\",\"vhv\"].indexOf(T.shape)?(U=l.steps(T.shape),V=l.steps(T.shape.split(\"\").reverse().join(\"\"))):U=V=\"spline\"===T.shape?function(t){var e=t[t.length-1];return t.length>1&&t[0][0]===e[0]&&t[0][1]===e[1]?l.smoothclosed(t.slice(1),T.smoothing):l.smoothopen(t,T.smoothing)}:function(t){return\"M\"+t.join(\"L\")},q=function(t){return V(t.reverse())},J=c(f,{xaxis:b,yaxis:_,trace:w,connectGaps:w.connectgaps,baseTolerance:Math.max(T.width||1,3)/4,shape:T.shape,backoff:T.backoff,simplify:T.simplify,fill:w.fill}),K=new Array(J.length);var Q=0;for(g=0;g0,g=f(t,e,r);(c=i.selectAll(\"g.trace\").data(g,(function(t){return t[0].trace.uid}))).enter().append(\"g\").attr(\"class\",(function(t){return\"trace scatter trace\"+t[0].trace.uid})).style(\"stroke-miterlimit\",2),c.order(),function(t,e,r){e.each((function(e){var i=o(n.select(this),\"g\",\"fills\");l.setClipUrl(i,r.layerClipId,t);var a=e[0].trace,u=[];a._ownfill&&u.push(\"_ownFill\"),a._nexttrace&&u.push(\"_nextFill\");var c=i.selectAll(\"g\").data(u,s);c.enter().append(\"g\"),c.exit().each((function(t){a[t]=null})).remove(),c.order().each((function(t){a[t]=o(n.select(this),\"path\",\"js-fill\")}))}))}(t,c,e),v?(u&&(h=u()),n.transition().duration(a.duration).ease(a.easing).each(\"end\",(function(){h&&h()})).each(\"interrupt\",(function(){h&&h()})).each((function(){i.selectAll(\"g.trace\").each((function(r,n){p(t,n,e,r,g,this,a)}))}))):c.each((function(r,n){p(t,n,e,r,g,this,a)})),d&&c.exit().remove(),i.selectAll(\"path:not([d])\").remove()}},91560:function(t,e,r){\"use strict\";var n=r(43028);t.exports=function(t,e){var r,i,a,o,s=t.cd,l=t.xaxis,u=t.yaxis,c=[],f=s[0].trace;if(!n.hasMarkers(f)&&!n.hasText(f))return[];if(!1===e)for(r=0;r0){var h=i.c2l(c);i._lowerLogErrorBound||(i._lowerLogErrorBound=h),i._lowerErrorBound=Math.min(i._lowerLogErrorBound,h)}}else o[s]=[-l[0]*r,l[1]*r]}return o}t.exports=function(t,e,r){var n=[i(t.x,t.error_x,e[0],r.xaxis),i(t.y,t.error_y,e[1],r.yaxis),i(t.z,t.error_z,e[2],r.zaxis)],a=function(t){for(var e=0;e-1?-1:t.indexOf(\"right\")>-1?1:0}function b(t){return null==t?0:t.indexOf(\"top\")>-1?-1:t.indexOf(\"bottom\")>-1?1:0}function _(t,e){return e(4*t)}function w(t){return p[t]}function T(t,e,r,n,i){var a=null;if(l.isArrayOrTypedArray(t)){a=[];for(var o=0;o=0){var E=function(t,e,r){var n,i=(r+1)%3,a=(r+2)%3,o=[],l=[];for(n=0;n=0&&f(\"surfacecolor\",p||d);for(var v=[\"x\",\"y\",\"z\"],g=0;g<3;++g){var y=\"projection.\"+v[g];f(y+\".show\")&&(f(y+\".opacity\"),f(y+\".scale\"))}var m=n.getComponentMethod(\"errorbars\",\"supplyDefaults\");m(t,e,p||d||r,{axis:\"z\"}),m(t,e,p||d||r,{axis:\"y\",inherit:\"z\"}),m(t,e,p||d||r,{axis:\"x\",inherit:\"z\"})}else e.visible=!1}},3296:function(t,e,r){\"use strict\";t.exports={plot:r(41064),attributes:r(91592),markerSymbols:r(87792),supplyDefaults:r(83484),colorbar:[{container:\"marker\",min:\"cmin\",max:\"cmax\"},{container:\"line\",min:\"cmin\",max:\"cmax\"}],calc:r(41484),moduleType:\"trace\",name:\"scatter3d\",basePlotModule:r(12536),categories:[\"gl3d\",\"symbols\",\"showLegend\",\"scatter-like\"],meta:{}}},90372:function(t,e,r){\"use strict\";var n=r(98304),i=r(52904),a=r(45464),o=r(21776).Ks,s=r(21776).Gw,l=r(49084),u=r(92880).extendFlat,c=i.marker,f=i.line,h=c.line;t.exports={carpet:{valType:\"string\",editType:\"calc\"},a:{valType:\"data_array\",editType:\"calc\"},b:{valType:\"data_array\",editType:\"calc\"},mode:u({},i.mode,{dflt:\"markers\"}),text:u({},i.text,{}),texttemplate:s({editType:\"plot\"},{keys:[\"a\",\"b\",\"text\"]}),hovertext:u({},i.hovertext,{}),line:{color:f.color,width:f.width,dash:f.dash,backoff:f.backoff,shape:u({},f.shape,{values:[\"linear\",\"spline\"]}),smoothing:f.smoothing,editType:\"calc\"},connectgaps:i.connectgaps,fill:u({},i.fill,{values:[\"none\",\"toself\",\"tonext\"],dflt:\"none\"}),fillcolor:n(),marker:u({symbol:c.symbol,opacity:c.opacity,maxdisplayed:c.maxdisplayed,angle:c.angle,angleref:c.angleref,standoff:c.standoff,size:c.size,sizeref:c.sizeref,sizemin:c.sizemin,sizemode:c.sizemode,line:u({width:h.width,editType:\"calc\"},l(\"marker.line\")),gradient:c.gradient,editType:\"calc\"},l(\"marker\")),textfont:i.textfont,textposition:i.textposition,selected:i.selected,unselected:i.unselected,hoverinfo:u({},a.hoverinfo,{flags:[\"a\",\"b\",\"text\",\"name\"]}),hoveron:i.hoveron,hovertemplate:o(),zorder:i.zorder}},48228:function(t,e,r){\"use strict\";var n=r(38248),i=r(90136),a=r(20148),o=r(4500),s=r(16356).calcMarkerSize,l=r(50948);t.exports=function(t,e){var r=e._carpetTrace=l(t,e);if(r&&r.visible&&\"legendonly\"!==r.visible){var u;e.xaxis=r.xaxis,e.yaxis=r.yaxis;var c,f,h=e._length,p=new Array(h),d=!1;for(u=0;u\")}return o}function m(t,e){var r;r=t.labelprefix&&t.labelprefix.length>0?t.labelprefix.replace(/ = $/,\"\"):t._hovertitle,g.push(r+\": \"+e.toFixed(3)+t.labelsuffix)}}},4184:function(t,e,r){\"use strict\";t.exports={attributes:r(90372),supplyDefaults:r(6176),colorbar:r(5528),formatLabels:r(52364),calc:r(48228),plot:r(20036),style:r(49224).style,styleOnSelect:r(49224).styleOnSelect,hoverPoints:r(58960),selectPoints:r(91560),eventData:r(89307),moduleType:\"trace\",name:\"scattercarpet\",basePlotModule:r(57952),categories:[\"svg\",\"carpet\",\"symbols\",\"showLegend\",\"carpetDependent\",\"zoomScale\"],meta:{}}},20036:function(t,e,r){\"use strict\";var n=r(96504),i=r(54460),a=r(43616);t.exports=function(t,e,r,o){var s,l,u,c=r[0][0].carpet,f=i.getFromId(t,c.xaxis||\"x\"),h=i.getFromId(t,c.yaxis||\"y\"),p={xaxis:f,yaxis:h,plot:e.plot};for(s=0;s\")}function p(t){return t+\"°\"}}(u,v,t,l[0].t.labels),t.hovertemplate=u.hovertemplate,[t]}}},36952:function(t,e,r){\"use strict\";t.exports={attributes:r(6096),supplyDefaults:r(86188),colorbar:r(5528),formatLabels:r(56696),calc:r(25212),calcGeoJSON:r(48691).calcGeoJSON,plot:r(48691).plot,style:r(25064),styleOnSelect:r(49224).styleOnSelect,hoverPoints:r(64292),eventData:r(58544),selectPoints:r(8796),moduleType:\"trace\",name:\"scattergeo\",basePlotModule:r(10816),categories:[\"geo\",\"symbols\",\"showLegend\",\"scatter-like\"],meta:{}}},48691:function(t,e,r){\"use strict\";var n=r(33428),i=r(3400),a=r(59972).getTopojsonFeatures,o=r(44808),s=r(27144),l=r(19280).findExtremes,u=r(39032).BADNUM,c=r(16356).calcMarkerSize,f=r(43028),h=r(25064);t.exports={calcGeoJSON:function(t,e){var r,n,o=t[0].trace,f=e[o.geo],h=f._subplot,p=o._length;if(i.isArrayOrTypedArray(o.locations)){var d=o.locationmode,v=\"geojson-id\"===d?s.extractTraceFeature(t):a(o,h.topojson);for(r=0;r=g,w=2*b,T={},k=l.makeCalcdata(e,\"x\"),A=m.makeCalcdata(e,\"y\"),M=s(e,l,\"x\",k),S=s(e,m,\"y\",A),E=M.vals,L=S.vals;e._x=E,e._y=L,e.xperiodalignment&&(e._origX=k,e._xStarts=M.starts,e._xEnds=M.ends),e.yperiodalignment&&(e._origY=A,e._yStarts=S.starts,e._yEnds=S.ends);var C=new Array(w),P=new Array(b);for(r=0;r1&&i.extendFlat(s.line,p.linePositions(t,r,n)),s.errorX||s.errorY){var l=p.errorBarPositions(t,r,n,a,o);s.errorX&&i.extendFlat(s.errorX,l.x),s.errorY&&i.extendFlat(s.errorY,l.y)}return s.text&&(i.extendFlat(s.text,{positions:n},p.textPosition(t,r,s.text,s.marker)),i.extendFlat(s.textSel,{positions:n},p.textPosition(t,r,s.text,s.markerSel)),i.extendFlat(s.textUnsel,{positions:n},p.textPosition(t,r,s.text,s.markerUnsel))),s}(t,0,e,C,E,L),z=d(t,x);return f(o,e),_?I.marker&&(O=I.marker.sizeAvg||Math.max(I.marker.size,3)):O=u(e,b),c(t,e,l,m,E,L,O),I.errorX&&y(e,l,I.errorX),I.errorY&&y(e,m,I.errorY),I.fill&&!z.fill2d&&(z.fill2d=!0),I.marker&&!z.scatter2d&&(z.scatter2d=!0),I.line&&!z.line2d&&(z.line2d=!0),!I.errorX&&!I.errorY||z.error2d||(z.error2d=!0),I.text&&!z.glText&&(z.glText=!0),I.marker&&(I.marker.snap=b),z.lineOptions.push(I.line),z.errorXOptions.push(I.errorX),z.errorYOptions.push(I.errorY),z.fillOptions.push(I.fill),z.markerOptions.push(I.marker),z.markerSelectedOptions.push(I.markerSel),z.markerUnselectedOptions.push(I.markerUnsel),z.textOptions.push(I.text),z.textSelectedOptions.push(I.textSel),z.textUnselectedOptions.push(I.textUnsel),z.selectBatch.push([]),z.unselectBatch.push([]),T._scene=z,T.index=z.count,T.x=E,T.y=L,T.positions=C,z.count++,[{x:!1,y:!1,t:T,trace:e}]}},67072:function(t){\"use strict\";t.exports={TOO_MANY_POINTS:1e5,SYMBOL_SDF_SIZE:200,SYMBOL_SIZE:20,SYMBOL_STROKE:1,DOT_RE:/-dot/,OPEN_RE:/-open/,DASHES:{solid:[1],dot:[1,1],dash:[4,1],longdash:[8,1],dashdot:[4,1,1,1],longdashdot:[8,1,1,1]}}},84236:function(t,e,r){\"use strict\";var n=r(38248),i=r(20472),a=r(72160),o=r(24040),s=r(3400),l=s.isArrayOrTypedArray,u=r(43616),c=r(79811),f=r(33040).formatColor,h=r(43028),p=r(7152),d=r(80088),v=r(67072),g=r(13448).DESELECTDIM,y={start:1,left:1,end:-1,right:-1,middle:0,center:0,bottom:1,top:-1},m=r(10624).appendArrayPointValue;function x(t,e){var r,i=t._fullLayout,a=e._length,o=e.textfont,u=e.textposition,c=l(u)?u:[u],f=o.color,h=o.size,p=o.family,d=o.weight,v=o.style,g=o.variant,y={},x=t._context.plotGlPixelRatio,b=e.texttemplate;if(b){y.text=[];var _=i._d3locale,w=Array.isArray(b),T=w?Math.min(b.length,a):a,k=w?function(t){return b[t]}:function(){return b};for(r=0;rv.TOO_MANY_POINTS||h.hasMarkers(e)?\"rect\":\"round\";if(u&&e.connectgaps){var f=n[0],p=n[1];for(i=0;i1?u[i]:u[0]:u,v=l(c)?c.length>1?c[i]:c[0]:c,g=y[d],m=y[v],x=f?f/.8+1:0,b=-m*x-.5*m;o.offset[i]=[g*x/p,b/p]}}return o}}},80220:function(t,e,r){\"use strict\";var n=r(3400),i=r(24040),a=r(80088),o=r(2876),s=r(88200),l=r(43028),u=r(43980),c=r(31147),f=r(74428),h=r(66828),p=r(70840),d=r(124);t.exports=function(t,e,r,v){function g(r,i){return n.coerce(t,e,o,r,i)}var y=!!t.marker&&a.isOpenSymbol(t.marker.symbol),m=l.isBubble(t),x=u(t,e,v,g);if(x){c(t,e,v,g),g(\"xhoverformat\"),g(\"yhoverformat\");var b=x100},e.isDotSymbol=function(t){return\"string\"==typeof t?n.DOT_RE.test(t):t>200}},41272:function(t,e,r){\"use strict\";var n=r(24040),i=r(3400),a=r(44928);function o(t,e,r,o){var s=t.xa,l=t.ya,u=t.distance,c=t.dxy,f=t.index,h={pointNumber:f,x:e[f],y:r[f]};h.tx=i.isArrayOrTypedArray(o.text)?o.text[f]:o.text,h.htx=Array.isArray(o.hovertext)?o.hovertext[f]:o.hovertext,h.data=Array.isArray(o.customdata)?o.customdata[f]:o.customdata,h.tp=Array.isArray(o.textposition)?o.textposition[f]:o.textposition;var p=o.textfont;p&&(h.ts=i.isArrayOrTypedArray(p.size)?p.size[f]:p.size,h.tc=i.isArrayOrTypedArray(p.color)?p.color[f]:p.color,h.tf=Array.isArray(p.family)?p.family[f]:p.family,h.tw=Array.isArray(p.weight)?p.weight[f]:p.weight,h.ty=Array.isArray(p.style)?p.style[f]:p.style,h.tv=Array.isArray(p.variant)?p.variant[f]:p.variant);var d=o.marker;d&&(h.ms=i.isArrayOrTypedArray(d.size)?d.size[f]:d.size,h.mo=i.isArrayOrTypedArray(d.opacity)?d.opacity[f]:d.opacity,h.mx=i.isArrayOrTypedArray(d.symbol)?d.symbol[f]:d.symbol,h.ma=i.isArrayOrTypedArray(d.angle)?d.angle[f]:d.angle,h.mc=i.isArrayOrTypedArray(d.color)?d.color[f]:d.color);var v=d&&d.line;v&&(h.mlc=Array.isArray(v.color)?v.color[f]:v.color,h.mlw=i.isArrayOrTypedArray(v.width)?v.width[f]:v.width);var g=d&&d.gradient;g&&\"none\"!==g.type&&(h.mgt=Array.isArray(g.type)?g.type[f]:g.type,h.mgc=Array.isArray(g.color)?g.color[f]:g.color);var y=s.c2p(h.x,!0),m=l.c2p(h.y,!0),x=h.mrc||1,b=o.hoverlabel;b&&(h.hbg=Array.isArray(b.bgcolor)?b.bgcolor[f]:b.bgcolor,h.hbc=Array.isArray(b.bordercolor)?b.bordercolor[f]:b.bordercolor,h.hts=i.isArrayOrTypedArray(b.font.size)?b.font.size[f]:b.font.size,h.htc=Array.isArray(b.font.color)?b.font.color[f]:b.font.color,h.htf=Array.isArray(b.font.family)?b.font.family[f]:b.font.family,h.hnl=i.isArrayOrTypedArray(b.namelength)?b.namelength[f]:b.namelength);var _=o.hoverinfo;_&&(h.hi=Array.isArray(_)?_[f]:_);var w=o.hovertemplate;w&&(h.ht=Array.isArray(w)?w[f]:w);var T={};T[t.index]=h;var k=o._origX,A=o._origY,M=i.extendFlat({},t,{color:a(o,h),x0:y-x,x1:y+x,xLabelVal:k?k[f]:h.x,y0:m-x,y1:m+x,yLabelVal:A?A[f]:h.y,cd:T,distance:u,spikeDistance:c,hovertemplate:h.ht});return h.htx?M.text=h.htx:h.tx?M.text=h.tx:o.text&&(M.text=o.text),i.fillText(h,o,M),n.getComponentMethod(\"errorbars\",\"hoverInfo\")(h,o,M),M}t.exports={hoverPoints:function(t,e,r,n){var i,a,s,l,u,c,f,h,p,d,v=t.cd,g=v[0].t,y=v[0].trace,m=t.xa,x=t.ya,b=g.x,_=g.y,w=m.c2p(e),T=x.c2p(r),k=t.distance;if(g.tree){var A=m.p2c(w-k),M=m.p2c(w+k),S=x.p2c(T-k),E=x.p2c(T+k);i=\"x\"===n?g.tree.range(Math.min(A,M),Math.min(x._rl[0],x._rl[1]),Math.max(A,M),Math.max(x._rl[0],x._rl[1])):g.tree.range(Math.min(A,M),Math.min(S,E),Math.max(A,M),Math.max(S,E))}else i=g.ids;var L=k;if(\"x\"===n){var C=!!y.xperiodalignment,P=!!y.yperiodalignment;for(c=0;c=Math.min(O,I)&&w<=Math.max(O,I)?0:1/0}if(f=Math.min(z,D)&&T<=Math.max(z,D)?0:1/0}d=Math.sqrt(f*f+h*h),s=i[c]}}}else for(c=i.length-1;c>-1;c--)l=b[a=i[c]],u=_[a],f=m.c2p(l)-w,h=x.c2p(u)-T,(p=Math.sqrt(f*f+h*h))m.glText.length){var T=_-m.glText.length;for(v=0;vr&&(isNaN(e[n])||isNaN(e[n+1]));)n-=2;t.positions=e.slice(r,n+2)}return t})),m.line2d.update(m.lineOptions)),m.error2d){var A=(m.errorXOptions||[]).concat(m.errorYOptions||[]);m.error2d.update(A)}m.scatter2d&&m.scatter2d.update(m.markerOptions),m.fillOrder=s.repeat(null,_),m.fill2d&&(m.fillOptions=m.fillOptions.map((function(t,e){var n=r[e];if(t&&n&&n[0]&&n[0].trace){var i,a,o=n[0],s=o.trace,l=o.t,u=m.lineOptions[e],c=[];s._ownfill&&c.push(e),s._nexttrace&&c.push(e+1),c.length&&(m.fillOrder[e]=c);var f,h,p=[],d=u&&u.positions||l.positions;if(\"tozeroy\"===s.fill){for(f=0;ff&&isNaN(d[h+1]);)h-=2;0!==d[f+1]&&(p=[d[f],0]),p=p.concat(d.slice(f,h+2)),0!==d[h+1]&&(p=p.concat([d[h],0]))}else if(\"tozerox\"===s.fill){for(f=0;ff&&isNaN(d[h]);)h-=2;0!==d[f]&&(p=[0,d[f+1]]),p=p.concat(d.slice(f,h+2)),0!==d[h]&&(p=p.concat([0,d[h+1]]))}else if(\"toself\"===s.fill||\"tonext\"===s.fill){for(p=[],i=0,t.splitNull=!0,a=0;a-1;for(v=0;v<_;v++){var L=r[v][0],C=L.trace,P=L.t,O=P.index,I=C._length,z=P.x,D=P.y;if(C.selectedpoints||S||E){if(S||(S=!0),C.selectedpoints){var R=m.selectBatch[O]=s.selIndices2selPoints(C),F={};for(g=0;g\")}function c(t){return t+\"°\"}}t.exports={hoverPoints:function(t,e,r){var o=t.cd,c=o[0].trace,f=t.xa,h=t.ya,p=t.subplot,d=[],v=l+c.uid+\"-circle\",g=c.cluster&&c.cluster.enabled;if(g){var y=p.map.queryRenderedFeatures(null,{layers:[v]});d=y.map((function(t){return t.id}))}var m=360*(e>=0?Math.floor((e+180)/360):Math.ceil((e-180)/360)),x=e-m;if(n.getClosest(o,(function(t){var e=t.lonlat;if(e[0]===s)return 1/0;if(g&&-1===d.indexOf(t.i+1))return 1/0;var n=i.modHalf(e[0],360),a=e[1],o=p.project([n,a]),l=o.x-f.c2p([x,a]),u=o.y-h.c2p([n,r]),c=Math.max(3,t.mrc||0);return Math.max(Math.sqrt(l*l+u*u)-c,1-3/c)}),t),!1!==t.index){var b=o[t.index],_=b.lonlat,w=[i.modHalf(_[0],360)+m,_[1]],T=f.c2p(w),k=h.c2p(w),A=b.mrc||1;t.x0=T-A,t.x1=T+A,t.y0=k-A,t.y1=k+A;var M={};M[c.subplot]={_subplot:p};var S=c._module.formatLabels(b,c,M);return t.lonLabel=S.lonLabel,t.latLabel=S.latLabel,t.color=a(c,b),t.extraText=u(c,b,o[0].t.labels),t.hovertemplate=c.hovertemplate,[t]}},getExtraText:u}},11572:function(t,e,r){\"use strict\";t.exports={attributes:r(31512),supplyDefaults:r(15752),colorbar:r(5528),formatLabels:r(11960),calc:r(25212),plot:r(9660),hoverPoints:r(63312).hoverPoints,eventData:r(37920),selectPoints:r(404),styleOnSelect:function(t,e){e&&e[0].trace._glTrace.update(e)},moduleType:\"trace\",name:\"scattermapbox\",basePlotModule:r(33688),categories:[\"mapbox\",\"gl\",\"symbols\",\"showLegend\",\"scatter-like\"],meta:{}}},9660:function(t,e,r){\"use strict\";var n=r(3400),i=r(59392),a=r(47552).traceLayerPrefix,o={cluster:[\"cluster\",\"clusterCount\",\"circle\"],nonCluster:[\"fill\",\"line\",\"circle\",\"symbol\"]};function s(t,e,r,n){this.type=\"scattermapbox\",this.subplot=t,this.uid=e,this.clusterEnabled=r,this.isHidden=n,this.sourceIds={fill:\"source-\"+e+\"-fill\",line:\"source-\"+e+\"-line\",circle:\"source-\"+e+\"-circle\",symbol:\"source-\"+e+\"-symbol\",cluster:\"source-\"+e+\"-circle\",clusterCount:\"source-\"+e+\"-circle\"},this.layerIds={fill:a+e+\"-fill\",line:a+e+\"-line\",circle:a+e+\"-circle\",symbol:a+e+\"-symbol\",cluster:a+e+\"-cluster\",clusterCount:a+e+\"-cluster-count\"},this.below=null}var l=s.prototype;l.addSource=function(t,e,r){var i={type:\"geojson\",data:e.geojson};r&&r.enabled&&n.extendFlat(i,{cluster:!0,clusterMaxZoom:r.maxzoom});var a=this.subplot.map.getSource(this.sourceIds[t]);a?a.setData(e.geojson):this.subplot.map.addSource(this.sourceIds[t],i)},l.setSourceData=function(t,e){this.subplot.map.getSource(this.sourceIds[t]).setData(e.geojson)},l.addLayer=function(t,e,r){var n={type:e.type,id:this.layerIds[t],source:this.sourceIds[t],layout:e.layout,paint:e.paint};e.filter&&(n.filter=e.filter);for(var i,a=this.layerIds[t],o=this.subplot.getMapLayers(),s=0;s=0;r--){var i=e[r];n.removeLayer(c.layerIds[i])}t||n.removeSource(c.sourceIds.circle)}(t):function(t){for(var e=o.nonCluster,r=e.length-1;r>=0;r--){var i=e[r];n.removeLayer(c.layerIds[i]),t||n.removeSource(c.sourceIds[i])}}(t)}function h(t){l?function(t){t||c.addSource(\"circle\",a.circle,e.cluster);for(var r=o.cluster,n=0;n=0;r--){var n=e[r];t.removeLayer(this.layerIds[n]),t.removeSource(this.sourceIds[n])}},t.exports=function(t,e){var r,n,a,l=e[0].trace,u=l.cluster&&l.cluster.enabled,c=!0!==l.visible,f=new s(t,l.uid,u,c),h=i(t.gd,e),p=f.below=t.belowLookup[\"trace-\"+l.uid];if(u)for(f.addSource(\"circle\",h.circle,l.cluster),r=0;r\")}}t.exports={hoverPoints:function(t,e,r,a){var o=n(t,e,r,a);if(o&&!1!==o[0].index){var s=o[0];if(void 0===s.index)return o;var l=t.subplot,u=s.cd[s.index],c=s.trace;if(l.isPtInside(u))return s.xLabelVal=void 0,s.yLabelVal=void 0,i(u,c,l,s),s.hovertemplate=c.hovertemplate,o}},makeHoverPointText:i}},76924:function(t,e,r){\"use strict\";t.exports={moduleType:\"trace\",name:\"scatterpolar\",basePlotModule:r(40872),categories:[\"polar\",\"symbols\",\"showLegend\",\"scatter-like\"],attributes:r(8319),supplyDefaults:r(85968).supplyDefaults,colorbar:r(5528),formatLabels:r(22852),calc:r(58320),plot:r(43456),style:r(49224).style,styleOnSelect:r(49224).styleOnSelect,hoverPoints:r(8504).hoverPoints,selectPoints:r(91560),meta:{}}},43456:function(t,e,r){\"use strict\";var n=r(96504),i=r(39032).BADNUM;t.exports=function(t,e,r){for(var a=e.layers.frontplot.select(\"g.scatterlayer\"),o=e.xaxis,s=e.yaxis,l={xaxis:o,yaxis:s,plot:e.framework,layerClipId:e._hasClipOnAxisFalse?e.clipIds.forTraces:null},u=e.radialAxis,c=e.angularAxis,f=0;f=u&&(m.marker.cluster=d.tree),m.marker&&(m.markerSel.positions=m.markerUnsel.positions=m.marker.positions=_),m.line&&_.length>1&&l.extendFlat(m.line,s.linePositions(t,p,_)),m.text&&(l.extendFlat(m.text,{positions:_},s.textPosition(t,p,m.text,m.marker)),l.extendFlat(m.textSel,{positions:_},s.textPosition(t,p,m.text,m.markerSel)),l.extendFlat(m.textUnsel,{positions:_},s.textPosition(t,p,m.text,m.markerUnsel))),m.fill&&!h.fill2d&&(h.fill2d=!0),m.marker&&!h.scatter2d&&(h.scatter2d=!0),m.line&&!h.line2d&&(h.line2d=!0),m.text&&!h.glText&&(h.glText=!0),h.lineOptions.push(m.line),h.fillOptions.push(m.fill),h.markerOptions.push(m.marker),h.markerSelectedOptions.push(m.markerSel),h.markerUnselectedOptions.push(m.markerUnsel),h.textOptions.push(m.text),h.textSelectedOptions.push(m.textSel),h.textUnselectedOptions.push(m.textUnsel),h.selectBatch.push([]),h.unselectBatch.push([]),d.x=w,d.y=T,d.rawx=w,d.rawy=T,d.r=g,d.theta=y,d.positions=_,d._scene=h,d.index=h.count,h.count++}})),a(t,e,r)}},t.exports.reglPrecompiled={}},69496:function(t,e,r){\"use strict\";var n=r(21776).Ks,i=r(21776).Gw,a=r(92880).extendFlat,o=r(98304),s=r(52904),l=r(45464),u=s.line;t.exports={mode:s.mode,real:{valType:\"data_array\",editType:\"calc+clearAxisTypes\"},imag:{valType:\"data_array\",editType:\"calc+clearAxisTypes\"},text:s.text,texttemplate:i({editType:\"plot\"},{keys:[\"real\",\"imag\",\"text\"]}),hovertext:s.hovertext,line:{color:u.color,width:u.width,dash:u.dash,backoff:u.backoff,shape:a({},u.shape,{values:[\"linear\",\"spline\"]}),smoothing:u.smoothing,editType:\"calc\"},connectgaps:s.connectgaps,marker:s.marker,cliponaxis:a({},s.cliponaxis,{dflt:!1}),textposition:s.textposition,textfont:s.textfont,fill:a({},s.fill,{values:[\"none\",\"toself\",\"tonext\"],dflt:\"none\"}),fillcolor:o(),hoverinfo:a({},l.hoverinfo,{flags:[\"real\",\"imag\",\"text\",\"name\"]}),hoveron:s.hoveron,hovertemplate:n(),selected:s.selected,unselected:s.unselected}},47507:function(t,e,r){\"use strict\";var n=r(38248),i=r(39032).BADNUM,a=r(90136),o=r(20148),s=r(4500),l=r(16356).calcMarkerSize;t.exports=function(t,e){for(var r=t._fullLayout,u=e.subplot,c=r[u].realaxis,f=r[u].imaginaryaxis,h=c.makeCalcdata(e,\"real\"),p=f.makeCalcdata(e,\"imag\"),d=e._length,v=new Array(d),g=0;g\")}}t.exports={hoverPoints:function(t,e,r,a){var o=n(t,e,r,a);if(o&&!1!==o[0].index){var s=o[0];if(void 0===s.index)return o;var l=t.subplot,u=s.cd[s.index],c=s.trace;if(l.isPtInside(u))return s.xLabelVal=void 0,s.yLabelVal=void 0,i(u,c,l,s),s.hovertemplate=c.hovertemplate,o}},makeHoverPointText:i}},95443:function(t,e,r){\"use strict\";t.exports={moduleType:\"trace\",name:\"scattersmith\",basePlotModule:r(47788),categories:[\"smith\",\"symbols\",\"showLegend\",\"scatter-like\"],attributes:r(69496),supplyDefaults:r(76716),colorbar:r(5528),formatLabels:r(49504),calc:r(47507),plot:r(34927),style:r(49224).style,styleOnSelect:r(49224).styleOnSelect,hoverPoints:r(25292).hoverPoints,selectPoints:r(91560),meta:{}}},34927:function(t,e,r){\"use strict\";var n=r(96504),i=r(39032).BADNUM,a=r(36416).smith;t.exports=function(t,e,r){for(var o=e.layers.frontplot.select(\"g.scatterlayer\"),s=e.xaxis,l=e.yaxis,u={xaxis:s,yaxis:l,plot:e.framework,layerClipId:e._hasClipOnAxisFalse?e.clipIds.forTraces:null},c=0;c\"),o.hovertemplate=h.hovertemplate,a}function x(t,e){y.push(t._hovertitle+\": \"+e)}}},34864:function(t,e,r){\"use strict\";t.exports={attributes:r(5896),supplyDefaults:r(84256),colorbar:r(5528),formatLabels:r(90404),calc:r(34335),plot:r(88776),style:r(49224).style,styleOnSelect:r(49224).styleOnSelect,hoverPoints:r(26596),selectPoints:r(91560),eventData:r(97476),moduleType:\"trace\",name:\"scatterternary\",basePlotModule:r(19352),categories:[\"ternary\",\"symbols\",\"showLegend\",\"scatter-like\"],meta:{}}},88776:function(t,e,r){\"use strict\";var n=r(96504);t.exports=function(t,e,r){var i=e.plotContainer;i.select(\".scatterlayer\").selectAll(\"*\").remove();for(var a=e.xaxis,o=e.yaxis,s={xaxis:a,yaxis:o,plot:i,layerClipId:e._hasClipOnAxisFalse?e.clipIdRelative:null},l=e.layers.frontplot.select(\"g.scatterlayer\"),u=0;uh?b.sizeAvg||Math.max(b.size,3):a(e,x),p=0;pa&&l||i-1,P=!0;if(o(x)||p.selectedpoints||C){var O=p._length;if(p.selectedpoints){v.selectBatch=p.selectedpoints;var I=p.selectedpoints,z={};for(l=0;l1&&(c=v[m-1],h=g[m-1],d=y[m-1]),e=0;ec?\"-\":\"+\")+\"x\")).replace(\"y\",(f>h?\"-\":\"+\")+\"y\")).replace(\"z\",(p>d?\"-\":\"+\")+\"z\");var L=function(){m=0,M=[],S=[],E=[]};(!m||m2?t.slice(1,e-1):2===e?[(t[0]+t[1])/2]:t}function p(t){var e=t.length;return 1===e?[.5,.5]:[t[1]-t[0],t[e-1]-t[e-2]]}function d(t,e){var r=t.fullSceneLayout,i=t.dataScale,c=e._len,f={};function d(t,e){var n=r[e],o=i[u[e]];return a.simpleMap(t,(function(t){return n.d2l(t)*o}))}if(f.vectors=l(d(e._u,\"xaxis\"),d(e._v,\"yaxis\"),d(e._w,\"zaxis\"),c),!c)return{positions:[],cells:[]};var v=d(e._Xs,\"xaxis\"),g=d(e._Ys,\"yaxis\"),y=d(e._Zs,\"zaxis\");if(f.meshgrid=[v,g,y],f.gridFill=e._gridFill,e._slen)f.startingPositions=l(d(e._startsX,\"xaxis\"),d(e._startsY,\"yaxis\"),d(e._startsZ,\"zaxis\"));else{for(var m=g[0],x=h(v),b=h(y),_=new Array(x.length*b.length),w=0,T=0;T=0};m?(r=Math.min(y.length,b.length),l=function(t){return M(y[t])&&S(t)},f=function(t){return String(y[t])}):(r=Math.min(x.length,b.length),l=function(t){return M(x[t])&&S(t)},f=function(t){return String(x[t])}),w&&(r=Math.min(r,_.length));for(var E=0;E1){for(var O=a.randstr(),I=0;I=0){e.i=s.i;var c=r.marker;c.pattern&&c.colors&&c.pattern.shape||(c.color=u,e.color=u),n.pointStyle(t,r,a,e)}else i.fill(t,u)}},45716:function(t,e,r){\"use strict\";var n=r(33428),i=r(24040),a=r(10624).appendArrayPointValue,o=r(93024),s=r(3400),l=r(95924),u=r(78176),c=r(69656).formatPieValue;function f(t,e,r){for(var n=t.data.data,i={curveNumber:e.index,pointNumber:n.i,data:e._input,fullData:e},o=0;o\"),name:A||z(\"name\")?m.name:void 0,color:k(\"hoverlabel.bgcolor\")||x.color,borderColor:k(\"hoverlabel.bordercolor\"),fontFamily:k(\"hoverlabel.font.family\"),fontSize:k(\"hoverlabel.font.size\"),fontColor:k(\"hoverlabel.font.color\"),fontWeight:k(\"hoverlabel.font.weight\"),fontStyle:k(\"hoverlabel.font.style\"),fontVariant:k(\"hoverlabel.font.variant\"),nameLength:k(\"hoverlabel.namelength\"),textAlign:k(\"hoverlabel.align\"),hovertemplate:A,hovertemplateLabels:P,eventData:l};g&&(F.x0=E-i.rInscribed*i.rpx1,F.x1=E+i.rInscribed*i.rpx1,F.idealAlign=i.pxmid[0]<0?\"left\":\"right\"),y&&(F.x=E,F.idealAlign=E<0?\"left\":\"right\");var B=[];o.loneHover(F,{container:a._hoverlayer.node(),outerContainer:a._paper.node(),gd:r,inOut_bbox:B}),l[0].bbox=B[0],d._hasHoverLabel=!0}if(y){var N=t.select(\"path.surface\");h.styleOne(N,i,m,r,{hovered:!0})}d._hasHoverEvent=!0,r.emit(\"plotly_hover\",{points:l||[f(i,m,h.eventDataKeys)],event:n.event})}})),t.on(\"mouseout\",(function(e){var i=r._fullLayout,a=r._fullData[d.index],s=n.select(this).datum();if(d._hasHoverEvent&&(e.originalEvent=n.event,r.emit(\"plotly_unhover\",{points:[f(s,a,h.eventDataKeys)],event:n.event}),d._hasHoverEvent=!1),d._hasHoverLabel&&(o.loneUnhover(i._hoverlayer.node()),d._hasHoverLabel=!1),y){var l=t.select(\"path.surface\");h.styleOne(l,s,a,r,{hovered:!1})}})),t.on(\"click\",(function(t){var e=r._fullLayout,a=r._fullData[d.index],s=g&&(u.isHierarchyRoot(t)||u.isLeaf(t)),c=u.getPtId(t),p=u.isEntry(t)?u.findEntryWithChild(v,c):u.findEntryWithLevel(v,c),y=u.getPtId(p),m={points:[f(t,a,h.eventDataKeys)],event:n.event};s||(m.nextLevel=y);var x=l.triggerHandler(r,\"plotly_\"+d.type+\"click\",m);if(!1!==x&&e.hovermode&&(r._hoverdata=[f(t,a,h.eventDataKeys)],o.click(r,n.event)),!s&&!1!==x&&!r._dragging&&!r._transitioning){i.call(\"_storeDirectGUIEdit\",a,e._tracePreGUI[a.uid],{level:a.level});var b={data:[{level:y}],traces:[d.index]},_={frame:{redraw:!1,duration:h.transitionTime},transition:{duration:h.transitionTime,easing:h.transitionEasing},mode:\"immediate\",fromcurrent:!0};o.loneUnhover(e._hoverlayer.node()),i.call(\"animate\",r,b,_)}}))}},78176:function(t,e,r){\"use strict\";var n=r(3400),i=r(76308),a=r(93972),o=r(69656);function s(t){return t.data.data.pid}e.findEntryWithLevel=function(t,r){var n;return r&&t.eachAfter((function(t){if(e.getPtId(t)===r)return n=t.copy()})),n||t},e.findEntryWithChild=function(t,r){var n;return t.eachAfter((function(t){for(var i=t.children||[],a=0;a0)},e.getMaxDepth=function(t){return t.maxdepth>=0?t.maxdepth:1/0},e.isHeader=function(t,r){return!(e.isLeaf(t)||t.depth===r._maxDepth-1)},e.getParent=function(t,r){return e.findEntryWithLevel(t,s(r))},e.listPath=function(t,r){var n=t.parent;if(!n)return[];var i=r?[n.data[r]]:[n];return e.listPath(n,r).concat(i)},e.getPath=function(t){return e.listPath(t,\"label\").join(\"/\")+\"/\"},e.formatValue=o.formatPieValue,e.formatPercent=function(t,e){var r=n.formatPercent(t,0);return\"0%\"===r&&(r=o.formatPiePercent(t,e)),r}},5621:function(t,e,r){\"use strict\";t.exports={moduleType:\"trace\",name:\"sunburst\",basePlotModule:r(54904),categories:[],animatable:!0,attributes:r(424),layoutAttributes:r(84920),supplyDefaults:r(25244),supplyLayoutDefaults:r(28732),calc:r(3776).calc,crossTraceCalc:r(3776).crossTraceCalc,plot:r(96488).plot,style:r(85676).style,colorbar:r(5528),meta:{}}},84920:function(t){\"use strict\";t.exports={sunburstcolorway:{valType:\"colorlist\",editType:\"calc\"},extendsunburstcolors:{valType:\"boolean\",dflt:!0,editType:\"calc\"}}},28732:function(t,e,r){\"use strict\";var n=r(3400),i=r(84920);t.exports=function(t,e){function r(r,a){return n.coerce(t,e,i,r,a)}r(\"sunburstcolorway\",e.colorway),r(\"extendsunburstcolors\")}},96488:function(t,e,r){\"use strict\";var n=r(33428),i=r(74148),a=r(67756).qy,o=r(43616),s=r(3400),l=r(72736),u=r(82744),c=u.recordMinTextSize,f=u.clearMinTextSize,h=r(37820),p=r(69656).getRotationAngle,d=h.computeTransform,v=h.transformInsideText,g=r(85676).styleOne,y=r(60100).resizeText,m=r(45716),x=r(27328),b=r(78176);function _(t,r,u,f){var h=t._context.staticPlot,y=t._fullLayout,_=!y.uniformtext.mode&&b.hasTransition(f),T=n.select(u).selectAll(\"g.slice\"),k=r[0],A=k.trace,M=k.hierarchy,S=b.findEntryWithLevel(M,A.level),E=b.getMaxDepth(A),L=y._size,C=A.domain,P=L.w*(C.x[1]-C.x[0]),O=L.h*(C.y[1]-C.y[0]),I=.5*Math.min(P,O),z=k.cx=L.l+L.w*(C.x[1]+C.x[0])/2,D=k.cy=L.t+L.h*(1-C.y[0])-O/2;if(!S)return T.remove();var R=null,F={};_&&T.each((function(t){F[b.getPtId(t)]={rpx0:t.rpx0,rpx1:t.rpx1,x0:t.x0,x1:t.x1,transform:t.transform},!R&&b.isEntry(t)&&(R=t)}));var B=function(t){return i.partition().size([2*Math.PI,t.height+1])(t)}(S).descendants(),N=S.height+1,j=0,U=E;k.hasMultipleRoots&&b.isHierarchyRoot(S)&&(B=B.slice(1),N-=1,j=1,U+=1),B=B.filter((function(t){return t.y1<=U}));var V=p(A.rotation);V&&B.forEach((function(t){t.x0+=V,t.x1+=V}));var q=Math.min(N,E),H=function(t){return(t-j)/q*I},G=function(t,e){return[t*Math.cos(e),-t*Math.sin(e)]},W=function(t){return s.pathAnnulus(t.rpx0,t.rpx1,t.x0,t.x1,z,D)},Y=function(t){return z+w(t)[0]*(t.transform.rCenter||0)+(t.transform.x||0)},X=function(t){return D+w(t)[1]*(t.transform.rCenter||0)+(t.transform.y||0)};(T=T.data(B,b.getPtId)).enter().append(\"g\").classed(\"slice\",!0),_?T.exit().transition().each((function(){var t=n.select(this);t.select(\"path.surface\").transition().attrTween(\"d\",(function(t){var e=function(t){var e,r=b.getPtId(t),n=F[r],i=F[b.getPtId(S)];if(i){var o=(t.x1>i.x1?2*Math.PI:0)+V;e=t.rpx1Z?2*Math.PI:0)+V;e={x0:i,x1:i}}else e={rpx0:I,rpx1:I},s.extendFlat(e,$(t));else e={rpx0:0,rpx1:0};else e={x0:V,x1:V};return a(e,n)}(t);return function(t){return W(e(t))}})):f.attr(\"d\",W),u.call(m,S,t,r,{eventDataKeys:x.eventDataKeys,transitionTime:x.CLICK_TRANSITION_TIME,transitionEasing:x.CLICK_TRANSITION_EASING}).call(b.setSliceCursor,t,{hideOnRoot:!0,hideOnLeaves:!0,isTransitioning:t._transitioning}),f.call(g,i,A,t);var p=s.ensureSingle(u,\"g\",\"slicetext\"),w=s.ensureSingle(p,\"text\",\"\",(function(t){t.attr(\"data-notex\",1)})),T=s.ensureUniformFontSize(t,b.determineTextFont(A,i,y.font));w.text(e.formatSliceLabel(i,S,A,r,y)).classed(\"slicetext\",!0).attr(\"text-anchor\",\"middle\").call(o.font,T).call(l.convertToTspans,t);var M=o.bBox(w.node());i.transform=v(M,i,k),i.transform.targetX=Y(i),i.transform.targetY=X(i);var E=function(t,e){var r=t.transform;return d(r,e),r.fontSize=T.size,c(A.type,r,y),s.getTextTransform(r)};_?w.transition().attrTween(\"transform\",(function(t){var e=function(t){var e,r=F[b.getPtId(t)],n=t.transform;if(r)e=r;else if(e={rpx1:t.rpx1,transform:{textPosAngle:n.textPosAngle,scale:0,rotate:n.rotate,rCenter:n.rCenter,x:n.x,y:n.y}},R)if(t.parent)if(Z){var i=t.x1>Z?2*Math.PI:0;e.x0=e.x1=i}else s.extendFlat(e,$(t));else e.x0=e.x1=V;else e.x0=e.x1=V;var o=a(e.transform.textPosAngle,t.transform.textPosAngle),l=a(e.rpx1,t.rpx1),u=a(e.x0,t.x0),f=a(e.x1,t.x1),h=a(e.transform.scale,n.scale),p=a(e.transform.rotate,n.rotate),d=0===n.rCenter?3:0===e.transform.rCenter?1/3:1,v=a(e.transform.rCenter,n.rCenter);return function(t){var e=l(t),r=u(t),i=f(t),a=function(t){return v(Math.pow(t,d))}(t),s={pxmid:G(e,(r+i)/2),rpx1:e,transform:{textPosAngle:o(t),rCenter:a,x:n.x,y:n.y}};return c(A.type,n,y),{transform:{targetX:Y(s),targetY:X(s),scale:h(t),rotate:p(t),rCenter:a}}}}(t);return function(t){return E(e(t),M)}})):w.attr(\"transform\",E(i,M))}))}function w(t){return e=t.rpx1,r=t.transform.textPosAngle,[e*Math.sin(r),-e*Math.cos(r)];var e,r}e.plot=function(t,e,r,i){var a,o,s=t._fullLayout,l=s._sunburstlayer,u=!r,c=!s.uniformtext.mode&&b.hasTransition(r);f(\"sunburst\",s),(a=l.selectAll(\"g.trace.sunburst\").data(e,(function(t){return t[0].trace.uid}))).enter().append(\"g\").classed(\"trace\",!0).classed(\"sunburst\",!0).attr(\"stroke-linejoin\",\"round\"),a.order(),c?(i&&(o=i()),n.transition().duration(r.duration).ease(r.easing).each(\"end\",(function(){o&&o()})).each(\"interrupt\",(function(){o&&o()})).each((function(){l.selectAll(\"g.trace\").each((function(e){_(t,e,this,r)}))}))):(a.each((function(e){_(t,e,this,r)})),s.uniformtext.mode&&y(t,s._sunburstlayer.selectAll(\".trace\"),\"sunburst\")),u&&a.exit().remove()},e.formatSliceLabel=function(t,e,r,n,i){var a=r.texttemplate,o=r.textinfo;if(!(a||o&&\"none\"!==o))return\"\";var l=i.separators,u=n[0],c=t.data.data,f=u.hierarchy,h=b.isHierarchyRoot(t),p=b.getParent(f,t),d=b.getValue(t);if(!a){var v,g=o.split(\"+\"),y=function(t){return-1!==g.indexOf(t)},m=[];if(y(\"label\")&&c.label&&m.push(c.label),c.hasOwnProperty(\"v\")&&y(\"value\")&&m.push(b.formatValue(c.v,l)),!h){y(\"current path\")&&m.push(b.getPath(t.data));var x=0;y(\"percent parent\")&&x++,y(\"percent entry\")&&x++,y(\"percent root\")&&x++;var _=x>1;if(x){var w,T=function(t){v=b.formatPercent(w,l),_&&(v+=\" of \"+t),m.push(v)};y(\"percent parent\")&&!h&&(w=d/b.getValue(p),T(\"parent\")),y(\"percent entry\")&&(w=d/b.getValue(e),T(\"entry\")),y(\"percent root\")&&(w=d/b.getValue(f),T(\"root\"))}}return y(\"text\")&&(v=s.castOption(r,c.i,\"text\"),s.isValidTextValue(v)&&m.push(v)),m.join(\"
\")}var k=s.castOption(r,c.i,\"texttemplate\");if(!k)return\"\";var A={};c.label&&(A.label=c.label),c.hasOwnProperty(\"v\")&&(A.value=c.v,A.valueLabel=b.formatValue(c.v,l)),A.currentPath=b.getPath(t.data),h||(A.percentParent=d/b.getValue(p),A.percentParentLabel=b.formatPercent(A.percentParent,l),A.parent=b.getPtLabel(p)),A.percentEntry=d/b.getValue(e),A.percentEntryLabel=b.formatPercent(A.percentEntry,l),A.entry=b.getPtLabel(e),A.percentRoot=d/b.getValue(f),A.percentRootLabel=b.formatPercent(A.percentRoot,l),A.root=b.getPtLabel(f),c.hasOwnProperty(\"color\")&&(A.color=c.color);var M=s.castOption(r,c.i,\"text\");return(s.isValidTextValue(M)||\"\"===M)&&(A.text=M),A.customdata=s.castOption(r,c.i,\"customdata\"),s.texttemplateString(k,A,i._d3locale,A,r._meta||{})}},85676:function(t,e,r){\"use strict\";var n=r(33428),i=r(76308),a=r(3400),o=r(82744).resizeText,s=r(60404);function l(t,e,r,n){var o=e.data.data,l=!e.children,u=o.i,c=a.castOption(r,u,\"marker.line.color\")||i.defaultLine,f=a.castOption(r,u,\"marker.line.width\")||0;t.call(s,e,r,n).style(\"stroke-width\",f).call(i.stroke,c).style(\"opacity\",l?r.leaf.opacity:null)}t.exports={style:function(t){var e=t._fullLayout._sunburstlayer.selectAll(\".trace\");o(t,e,\"sunburst\"),e.each((function(e){var r=n.select(this),i=e[0].trace;r.style(\"opacity\",i.opacity),r.selectAll(\"path.surface\").each((function(e){n.select(this).call(l,e,i,t)}))}))},styleOne:l}},16716:function(t,e,r){\"use strict\";var n=r(76308),i=r(49084),a=r(29736).axisHoverFormat,o=r(21776).Ks,s=r(45464),l=r(92880).extendFlat,u=r(67824).overrideAll;function c(t){return{show:{valType:\"boolean\",dflt:!1},start:{valType:\"number\",dflt:null,editType:\"plot\"},end:{valType:\"number\",dflt:null,editType:\"plot\"},size:{valType:\"number\",dflt:null,min:0,editType:\"plot\"},project:{x:{valType:\"boolean\",dflt:!1},y:{valType:\"boolean\",dflt:!1},z:{valType:\"boolean\",dflt:!1}},color:{valType:\"color\",dflt:n.defaultLine},usecolormap:{valType:\"boolean\",dflt:!1},width:{valType:\"number\",min:1,max:16,dflt:2},highlight:{valType:\"boolean\",dflt:!0},highlightcolor:{valType:\"color\",dflt:n.defaultLine},highlightwidth:{valType:\"number\",min:1,max:16,dflt:2}}}var f=t.exports=u(l({z:{valType:\"data_array\"},x:{valType:\"data_array\"},y:{valType:\"data_array\"},text:{valType:\"string\",dflt:\"\",arrayOk:!0},hovertext:{valType:\"string\",dflt:\"\",arrayOk:!0},hovertemplate:o(),xhoverformat:a(\"x\"),yhoverformat:a(\"y\"),zhoverformat:a(\"z\"),connectgaps:{valType:\"boolean\",dflt:!1,editType:\"calc\"},surfacecolor:{valType:\"data_array\"}},i(\"\",{colorAttr:\"z or surfacecolor\",showScaleDflt:!0,autoColorDflt:!1,editTypeOverride:\"calc\"}),{contours:{x:c(),y:c(),z:c()},hidesurface:{valType:\"boolean\",dflt:!1},lightposition:{x:{valType:\"number\",min:-1e5,max:1e5,dflt:10},y:{valType:\"number\",min:-1e5,max:1e5,dflt:1e4},z:{valType:\"number\",min:-1e5,max:1e5,dflt:0}},lighting:{ambient:{valType:\"number\",min:0,max:1,dflt:.8},diffuse:{valType:\"number\",min:0,max:1,dflt:.8},specular:{valType:\"number\",min:0,max:2,dflt:.05},roughness:{valType:\"number\",min:0,max:1,dflt:.5},fresnel:{valType:\"number\",min:0,max:5,dflt:.2}},opacity:{valType:\"number\",min:0,max:1,dflt:1},opacityscale:{valType:\"any\",editType:\"calc\"},_deprecated:{zauto:l({},i.zauto,{}),zmin:l({},i.zmin,{}),zmax:l({},i.zmax,{})},hoverinfo:l({},s.hoverinfo),showlegend:l({},s.showlegend,{dflt:!1})}),\"calc\",\"nested\");f.x.editType=f.y.editType=f.z.editType=\"calc+clearAxisTypes\",f.transforms=void 0},56576:function(t,e,r){\"use strict\";var n=r(47128);t.exports=function(t,e){e.surfacecolor?n(t,e,{vals:e.surfacecolor,containerStr:\"\",cLetter:\"c\"}):n(t,e,{vals:e.z,containerStr:\"\",cLetter:\"c\"})}},79164:function(t,e,r){\"use strict\";var n=r(67792).gl_surface3d,i=r(67792).ndarray,a=r(67792).ndarray_linear_interpolate.d2,o=r(70448),s=r(11240),l=r(3400).isArrayOrTypedArray,u=r(33040).parseColorScale,c=r(43080),f=r(8932).extractOpts;function h(t,e,r){this.scene=t,this.uid=r,this.surface=e,this.data=null,this.showContour=[!1,!1,!1],this.contourStart=[null,null,null],this.contourEnd=[null,null,null],this.contourSize=[0,0,0],this.minValues=[1/0,1/0,1/0],this.maxValues=[-1/0,-1/0,-1/0],this.dataScaleX=1,this.dataScaleY=1,this.refineData=!0,this.objectOffset=[0,0,0]}var p=h.prototype;p.getXat=function(t,e,r,n){var i=l(this.data.x)?l(this.data.x[0])?this.data.x[e][t]:this.data.x[t]:t;return void 0===r?i:n.d2l(i,0,r)},p.getYat=function(t,e,r,n){var i=l(this.data.y)?l(this.data.y[0])?this.data.y[e][t]:this.data.y[e]:e;return void 0===r?i:n.d2l(i,0,r)},p.getZat=function(t,e,r,n){var i=this.data.z[e][t];return null===i&&this.data.connectgaps&&this.data._interpolatedZ&&(i=this.data._interpolatedZ[e][t]),void 0===r?i:n.d2l(i,0,r)},p.handlePick=function(t){if(t.object===this.surface){var e=(t.data.index[0]-1)/this.dataScaleX-1,r=(t.data.index[1]-1)/this.dataScaleY-1,n=Math.max(Math.min(Math.round(e),this.data.z[0].length-1),0),i=Math.max(Math.min(Math.round(r),this.data._ylength-1),0);t.index=[n,i],t.traceCoordinate=[this.getXat(n,i),this.getYat(n,i),this.getZat(n,i)],t.dataCoordinate=[this.getXat(n,i,this.data.xcalendar,this.scene.fullSceneLayout.xaxis),this.getYat(n,i,this.data.ycalendar,this.scene.fullSceneLayout.yaxis),this.getZat(n,i,this.data.zcalendar,this.scene.fullSceneLayout.zaxis)];for(var a=0;a<3;a++){null!=t.dataCoordinate[a]&&(t.dataCoordinate[a]*=this.scene.dataScale[a])}var o=this.data.hovertext||this.data.text;return l(o)&&o[i]&&void 0!==o[i][n]?t.textLabel=o[i][n]:t.textLabel=o||\"\",t.data.dataCoordinate=t.dataCoordinate.slice(),this.surface.highlight(t.data),this.scene.glplot.spikes.position=t.dataCoordinate,!0}};var d=[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997,1009,1013,1019,1021,1031,1033,1039,1049,1051,1061,1063,1069,1087,1091,1093,1097,1103,1109,1117,1123,1129,1151,1153,1163,1171,1181,1187,1193,1201,1213,1217,1223,1229,1231,1237,1249,1259,1277,1279,1283,1289,1291,1297,1301,1303,1307,1319,1321,1327,1361,1367,1373,1381,1399,1409,1423,1427,1429,1433,1439,1447,1451,1453,1459,1471,1481,1483,1487,1489,1493,1499,1511,1523,1531,1543,1549,1553,1559,1567,1571,1579,1583,1597,1601,1607,1609,1613,1619,1621,1627,1637,1657,1663,1667,1669,1693,1697,1699,1709,1721,1723,1733,1741,1747,1753,1759,1777,1783,1787,1789,1801,1811,1823,1831,1847,1861,1867,1871,1873,1877,1879,1889,1901,1907,1913,1931,1933,1949,1951,1973,1979,1987,1993,1997,1999,2003,2011,2017,2027,2029,2039,2053,2063,2069,2081,2083,2087,2089,2099,2111,2113,2129,2131,2137,2141,2143,2153,2161,2179,2203,2207,2213,2221,2237,2239,2243,2251,2267,2269,2273,2281,2287,2293,2297,2309,2311,2333,2339,2341,2347,2351,2357,2371,2377,2381,2383,2389,2393,2399,2411,2417,2423,2437,2441,2447,2459,2467,2473,2477,2503,2521,2531,2539,2543,2549,2551,2557,2579,2591,2593,2609,2617,2621,2633,2647,2657,2659,2663,2671,2677,2683,2687,2689,2693,2699,2707,2711,2713,2719,2729,2731,2741,2749,2753,2767,2777,2789,2791,2797,2801,2803,2819,2833,2837,2843,2851,2857,2861,2879,2887,2897,2903,2909,2917,2927,2939,2953,2957,2963,2969,2971,2999];function v(t,e){if(t0){r=d[n];break}return r}function m(t,e){if(!(t<1||e<1)){for(var r=g(t),n=g(e),i=1,a=0;a_;)r--,r/=y(r),++r1?n:1},p.refineCoords=function(t){for(var e=this.dataScaleX,r=this.dataScaleY,n=t[0].shape[0],a=t[0].shape[1],o=0|Math.floor(t[0].shape[0]*e+1),s=0|Math.floor(t[0].shape[1]*r+1),l=1+n+1,u=1+a+1,c=i(new Float32Array(l*u),[l,u]),f=[1/e,0,0,0,1/r,0,0,0,1],h=0;h0&&null!==this.contourStart[t]&&null!==this.contourEnd[t]&&this.contourEnd[t]>this.contourStart[t]))for(i[t]=!0,e=this.contourStart[t];ea&&(this.minValues[e]=a),this.maxValues[e]\",maxDimensionCount:60,overdrag:45,releaseTransitionDuration:120,releaseTransitionEase:\"cubic-out\",scrollbarCaptureWidth:18,scrollbarHideDelay:1e3,scrollbarHideDuration:1e3,scrollbarOffset:5,scrollbarWidth:8,transitionDuration:100,transitionEase:\"cubic-out\",uplift:5,wrapSpacer:\" \",wrapSplitCharacter:\" \",cn:{table:\"table\",tableControlView:\"table-control-view\",scrollBackground:\"scroll-background\",yColumn:\"y-column\",columnBlock:\"column-block\",scrollAreaClip:\"scroll-area-clip\",scrollAreaClipRect:\"scroll-area-clip-rect\",columnBoundary:\"column-boundary\",columnBoundaryClippath:\"column-boundary-clippath\",columnBoundaryRect:\"column-boundary-rect\",columnCells:\"column-cells\",columnCell:\"column-cell\",cellRect:\"cell-rect\",cellText:\"cell-text\",cellTextHolder:\"cell-text-holder\",scrollbarKit:\"scrollbar-kit\",scrollbar:\"scrollbar\",scrollbarSlider:\"scrollbar-slider\",scrollbarGlyph:\"scrollbar-glyph\",scrollbarCaptureZone:\"scrollbar-capture-zone\"}}},55992:function(t,e,r){\"use strict\";var n=r(23536),i=r(92880).extendFlat,a=r(38248),o=r(38116).isTypedArray,s=r(38116).isArrayOrTypedArray;function l(t){if(s(t)){for(var e=0,r=0;r=e||u===t.length-1)&&(n[i]=o,o.key=l++,o.firstRowIndex=s,o.lastRowIndex=u,o={firstRowIndex:null,lastRowIndex:null,rows:[]},i+=a,s=u+1,a=0);return n}t.exports=function(t,e){var r=c(e.cells.values),o=function(t){return t.slice(e.header.values.length,t.length)},v=c(e.header.values);v.length&&!v[0].length&&(v[0]=[\"\"],v=c(v));var g=v.concat(o(r).map((function(){return f((v[0]||[\"\"]).length)}))),y=e.domain,m=Math.floor(t._fullLayout._size.w*(y.x[1]-y.x[0])),x=Math.floor(t._fullLayout._size.h*(y.y[1]-y.y[0])),b=e.header.values.length?g[0].map((function(){return e.header.height})):[n.emptyHeaderHeight],_=r.length?r[0].map((function(){return e.cells.height})):[],w=b.reduce(u,0),T=d(_,x-w+n.uplift),k=p(d(b,w),[]),A=p(T,k),M={},S=e._fullInput.columnorder;s(S)&&(S=Array.from(S)),S=S.concat(o(r.map((function(t,e){return e}))));var E=g.map((function(t,r){var n=s(e.columnwidth)?e.columnwidth[Math.min(r,e.columnwidth.length-1)]:e.columnwidth;return a(n)?Number(n):1})),L=E.reduce(u,0);E=E.map((function(t){return t/L*m}));var C=Math.max(l(e.header.line.width),l(e.cells.line.width)),P={key:e.uid+t._context.staticPlot,translateX:y.x[0]*t._fullLayout._size.w,translateY:t._fullLayout._size.h*(1-y.y[1]),size:t._fullLayout._size,width:m,maxLineWidth:C,height:x,columnOrder:S,groupHeight:x,rowBlocks:A,headerRowBlocks:k,scrollY:0,cells:i({},e.cells,{values:r}),headerCells:i({},e.header,{values:g}),gdColumns:g.map((function(t){return t[0]})),gdColumnsOriginalOrder:g.map((function(t){return t[0]})),prevPages:[0,0],scrollbarState:{scrollbarScrollInProgress:!1},columns:g.map((function(t,e){var r=M[t];return M[t]=(r||0)+1,{key:t+\"__\"+M[t],label:t,specIndex:e,xIndex:S[e],xScale:h,x:void 0,calcdata:void 0,columnWidth:E[e]}}))};return P.columns.forEach((function(t){t.calcdata=P,t.x=h(t)})),P}},53056:function(t,e,r){\"use strict\";var n=r(92880).extendFlat;e.splitToPanels=function(t){var e=[0,0],r=n({},t,{key:\"header\",type:\"header\",page:0,prevPages:e,currentRepaint:[null,null],dragHandle:!0,values:t.calcdata.headerCells.values[t.specIndex],rowBlocks:t.calcdata.headerRowBlocks,calcdata:n({},t.calcdata,{cells:t.calcdata.headerCells})});return[n({},t,{key:\"cells1\",type:\"cells\",page:0,prevPages:e,currentRepaint:[null,null],dragHandle:!1,values:t.calcdata.cells.values[t.specIndex],rowBlocks:t.calcdata.rowBlocks}),n({},t,{key:\"cells2\",type:\"cells\",page:1,prevPages:e,currentRepaint:[null,null],dragHandle:!1,values:t.calcdata.cells.values[t.specIndex],rowBlocks:t.calcdata.rowBlocks}),r]},e.splitToCells=function(t){var e=function(t){var e=t.rowBlocks[t.page],r=e?e.rows[0].rowIndex:0;return[r,e?r+e.rows.length:0]}(t);return(t.values||[]).slice(e[0],e[1]).map((function(r,n){return{keyWithinBlock:n+(\"string\"==typeof r&&r.match(/[<$&> ]/)?\"_keybuster_\"+Math.random():\"\"),key:e[0]+n,column:t,calcdata:t.calcdata,page:t.page,rowBlocks:t.rowBlocks,value:r}}))}},53212:function(t,e,r){\"use strict\";var n=r(3400),i=r(60520),a=r(86968).Q;t.exports=function(t,e,r,o){function s(r,a){return n.coerce(t,e,i,r,a)}a(e,o,s),s(\"columnwidth\"),s(\"header.values\"),s(\"header.format\"),s(\"header.align\"),s(\"header.prefix\"),s(\"header.suffix\"),s(\"header.height\"),s(\"header.line.width\"),s(\"header.line.color\"),s(\"header.fill.color\"),n.coerceFont(s,\"header.font\",n.extendFlat({},o.font)),function(t,e){for(var r=t.columnorder||[],n=t.header.values.length,i=r.slice(0,n),a=i.slice().sort((function(t,e){return t-e})),o=i.map((function(t){return a.indexOf(t)})),s=o.length;s/i),l=!a||s;t.mayHaveMarkup=a&&i.match(/[<&>]/);var u,c=\"string\"==typeof(u=i)&&u.match(n.latexCheck);t.latex=c;var f,h,p=c?\"\":k(t.calcdata.cells.prefix,e,r)||\"\",d=c?\"\":k(t.calcdata.cells.suffix,e,r)||\"\",v=c?null:k(t.calcdata.cells.format,e,r)||null,g=p+(v?o(v)(t.value):t.value)+d;if(t.wrappingNeeded=!t.wrapped&&!l&&!c&&(f=T(g)),t.cellHeightMayIncrease=s||c||t.mayHaveMarkup||(void 0===f?T(g):f),t.needsConvertToTspans=t.mayHaveMarkup||t.wrappingNeeded||t.latex,t.wrappingNeeded){var y=(\" \"===n.wrapSplitCharacter?g.replace(/i&&n.push(a),i+=l}return n}(i,l,s);1===u.length&&(u[0]===i.length-1?u.unshift(u[0]-1):u.push(u[0]+1)),u[0]%2&&u.reverse(),e.each((function(t,e){t.page=u[e],t.scrollY=l})),e.attr(\"transform\",(function(t){var e=R(t.rowBlocks,t.page)-t.scrollY;return f(0,e)})),t&&(P(t,r,e,u,n.prevPages,n,0),P(t,r,e,u,n.prevPages,n,1),b(r,t))}}function C(t,e,r,a){return function(o){var s=o.calcdata?o.calcdata:o,l=e.filter((function(t){return s.key===t.key})),u=r||s.scrollbarState.dragMultiplier,c=s.scrollY;s.scrollY=void 0===a?s.scrollY+u*i.event.dy:a;var f=l.selectAll(\".\"+n.cn.yColumn).selectAll(\".\"+n.cn.columnBlock).filter(M);return L(t,f,l),s.scrollY===c}}function P(t,e,r,n,i,a,o){n[o]!==i[o]&&(clearTimeout(a.currentRepaint[o]),a.currentRepaint[o]=setTimeout((function(){var a=r.filter((function(t,e){return e===o&&n[e]!==i[e]}));_(t,e,a,r),i[o]=n[o]})))}function O(t,e,r,a){return function(){var o=i.select(e.parentNode);o.each((function(t){var e=t.fragments;o.selectAll(\"tspan.line\").each((function(t,r){e[r].width=this.getComputedTextLength()}));var r,i,a=e[e.length-1].width,s=e.slice(0,-1),l=[],u=0,c=t.column.columnWidth-2*n.cellPad;for(t.value=\"\";s.length;)u+(i=(r=s.shift()).width+a)>c&&(t.value+=l.join(n.wrapSpacer)+n.lineBreaker,l=[],u=0),l.push(r.text),u+=i;u&&(t.value+=l.join(n.wrapSpacer)),t.wrapped=!0})),o.selectAll(\"tspan.line\").remove(),w(o.select(\".\"+n.cn.cellText),r,t,a),i.select(e.parentNode.parentNode).call(D)}}function I(t,e,r,a,o){return function(){if(!o.settledY){var s=i.select(e.parentNode),l=N(o),u=o.key-l.firstRowIndex,c=l.rows[u].rowHeight,h=o.cellHeightMayIncrease?e.parentNode.getBoundingClientRect().height+2*n.cellPad:c,p=Math.max(h,c);p-l.rows[u].rowHeight&&(l.rows[u].rowHeight=p,t.selectAll(\".\"+n.cn.columnCell).call(D),L(null,t.filter(M),0),b(r,a,!0)),s.attr(\"transform\",(function(){var t=this,e=t.parentNode.getBoundingClientRect(),r=i.select(t.parentNode).select(\".\"+n.cn.cellRect).node().getBoundingClientRect(),a=t.transform.baseVal.consolidate(),s=r.top-e.top+(a?a.matrix.f:n.cellPad);return f(z(o,i.select(t.parentNode).select(\".\"+n.cn.cellTextHolder).node().getBoundingClientRect().width),s)})),o.settledY=!0}}}function z(t,e){switch(t.align){case\"left\":default:return n.cellPad;case\"right\":return t.column.columnWidth-(e||0)-n.cellPad;case\"center\":return(t.column.columnWidth-(e||0))/2}}function D(t){t.attr(\"transform\",(function(t){var e=t.rowBlocks[0].auxiliaryBlocks.reduce((function(t,e){return t+F(e,1/0)}),0),r=F(N(t),t.key);return f(0,r+e)})).selectAll(\".\"+n.cn.cellRect).attr(\"height\",(function(t){return(e=N(t),r=t.key,e.rows[r-e.firstRowIndex]).rowHeight;var e,r}))}function R(t,e){for(var r=0,n=e-1;n>=0;n--)r+=B(t[n]);return r}function F(t,e){for(var r=0,n=0;n\",\"<\",\"|\",\"/\",\"\\\\\"],dflt:\">\",editType:\"plot\"},thickness:{valType:\"number\",min:12,editType:\"plot\"},textfont:c({},s.textfont,{}),editType:\"calc\"},text:s.text,textinfo:l.textinfo,texttemplate:i({editType:\"plot\"},{keys:u.eventDataKeys.concat([\"label\",\"value\"])}),hovertext:s.hovertext,hoverinfo:l.hoverinfo,hovertemplate:n({},{keys:u.eventDataKeys}),textfont:s.textfont,insidetextfont:s.insidetextfont,outsidetextfont:c({},s.outsidetextfont,{}),textposition:{valType:\"enumerated\",values:[\"top left\",\"top center\",\"top right\",\"middle left\",\"middle center\",\"middle right\",\"bottom left\",\"bottom center\",\"bottom right\"],dflt:\"top left\",editType:\"plot\"},sort:s.sort,root:l.root,domain:o({name:\"treemap\",trace:!0,editType:\"calc\"})}},79516:function(t,e,r){\"use strict\";var n=r(7316);e.name=\"treemap\",e.plot=function(t,r,i,a){n.plotBasePlot(e.name,t,r,i,a)},e.clean=function(t,r,i,a){n.cleanBasePlot(e.name,t,r,i,a)}},97840:function(t,e,r){\"use strict\";var n=r(3776);e.r=function(t,e){return n.calc(t,e)},e.q=function(t){return n._runCrossTraceCalc(\"treemap\",t)}},32984:function(t){\"use strict\";t.exports={CLICK_TRANSITION_TIME:750,CLICK_TRANSITION_EASING:\"poly\",eventDataKeys:[\"currentPath\",\"root\",\"entry\",\"percentRoot\",\"percentEntry\",\"percentParent\"],gapWithPathbar:1}},34092:function(t,e,r){\"use strict\";var n=r(3400),i=r(40516),a=r(76308),o=r(86968).Q,s=r(31508).handleText,l=r(78048).TEXTPAD,u=r(74174).handleMarkerDefaults,c=r(8932),f=c.hasColorscale,h=c.handleDefaults;t.exports=function(t,e,r,c){function p(r,a){return n.coerce(t,e,i,r,a)}var d=p(\"labels\"),v=p(\"parents\");if(d&&d.length&&v&&v.length){var g=p(\"values\");g&&g.length?p(\"branchvalues\"):p(\"count\"),p(\"level\"),p(\"maxdepth\"),\"squarify\"===p(\"tiling.packing\")&&p(\"tiling.squarifyratio\"),p(\"tiling.flip\"),p(\"tiling.pad\");var y=p(\"text\");p(\"texttemplate\"),e.texttemplate||p(\"textinfo\",n.isArrayOrTypedArray(y)?\"text+label\":\"label\"),p(\"hovertext\"),p(\"hovertemplate\");var m=p(\"pathbar.visible\");s(t,e,c,p,\"auto\",{hasPathbar:m,moduleHasSelected:!1,moduleHasUnselected:!1,moduleHasConstrain:!1,moduleHasCliponaxis:!1,moduleHasTextangle:!1,moduleHasInsideanchor:!1}),p(\"textposition\");var x=-1!==e.textposition.indexOf(\"bottom\");u(t,e,c,p),(e._hasColorscale=f(t,\"marker\",\"colors\")||(t.marker||{}).coloraxis)?h(t,e,c,p,{prefix:\"marker.\",cLetter:\"c\"}):p(\"marker.depthfade\",!(e.marker.colors||[]).length);var b=2*e.textfont.size;p(\"marker.pad.t\",x?b/4:b),p(\"marker.pad.l\",b/4),p(\"marker.pad.r\",b/4),p(\"marker.pad.b\",x?b:b/4),p(\"marker.cornerradius\"),e._hovered={marker:{line:{width:2,color:a.contrast(c.paper_bgcolor)}}},m&&(p(\"pathbar.thickness\",e.pathbar.textfont.size+2*l),p(\"pathbar.side\"),p(\"pathbar.edgeshape\")),p(\"sort\"),p(\"root.color\"),o(e,c,p),e._length=null}else e.visible=!1}},95808:function(t,e,r){\"use strict\";var n=r(33428),i=r(78176),a=r(82744).clearMinTextSize,o=r(60100).resizeText,s=r(52960);t.exports=function(t,e,r,l,u){var c,f,h=u.type,p=u.drawDescendants,d=t._fullLayout,v=d[\"_\"+h+\"layer\"],g=!r;a(h,d),(c=v.selectAll(\"g.trace.\"+h).data(e,(function(t){return t[0].trace.uid}))).enter().append(\"g\").classed(\"trace\",!0).classed(h,!0),c.order(),!d.uniformtext.mode&&i.hasTransition(r)?(l&&(f=l()),n.transition().duration(r.duration).ease(r.easing).each(\"end\",(function(){f&&f()})).each(\"interrupt\",(function(){f&&f()})).each((function(){v.selectAll(\"g.trace\").each((function(e){s(t,e,this,r,p)}))}))):(c.each((function(e){s(t,e,this,r,p)})),d.uniformtext.mode&&o(t,v.selectAll(\".trace\"),h)),g&&c.exit().remove()}},27336:function(t,e,r){\"use strict\";var n=r(33428),i=r(3400),a=r(43616),o=r(72736),s=r(13832),l=r(66192).styleOne,u=r(32984),c=r(78176),f=r(45716),h=!0;t.exports=function(t,e,r,p,d){var v=d.barDifY,g=d.width,y=d.height,m=d.viewX,x=d.viewY,b=d.pathSlice,_=d.toMoveInsideSlice,w=d.strTransform,T=d.hasTransition,k=d.handleSlicesExit,A=d.makeUpdateSliceInterpolator,M=d.makeUpdateTextInterpolator,S={},E=t._context.staticPlot,L=t._fullLayout,C=e[0],P=C.trace,O=C.hierarchy,I=g/P._entryDepth,z=c.listPath(r.data,\"id\"),D=s(O.copy(),[g,y],{packing:\"dice\",pad:{inner:0,top:0,left:0,right:0,bottom:0}}).descendants();(D=D.filter((function(t){var e=z.indexOf(t.data.id);return-1!==e&&(t.x0=I*e,t.x1=I*(e+1),t.y0=v,t.y1=v+y,t.onPathbar=!0,!0)}))).reverse(),(p=p.data(D,c.getPtId)).enter().append(\"g\").classed(\"pathbar\",!0),k(p,h,S,[g,y],b),p.order();var R=p;T&&(R=R.transition().each(\"end\",(function(){var e=n.select(this);c.setSliceCursor(e,t,{hideOnRoot:!1,hideOnLeaves:!1,isTransitioning:!1})}))),R.each((function(s){s._x0=m(s.x0),s._x1=m(s.x1),s._y0=x(s.y0),s._y1=x(s.y1),s._hoverX=m(s.x1-Math.min(g,y)/2),s._hoverY=x(s.y1-y/2);var p=n.select(this),d=i.ensureSingle(p,\"path\",\"surface\",(function(t){t.style(\"pointer-events\",E?\"none\":\"all\")}));T?d.transition().attrTween(\"d\",(function(t){var e=A(t,h,S,[g,y]);return function(t){return b(e(t))}})):d.attr(\"d\",b),p.call(f,r,t,e,{styleOne:l,eventDataKeys:u.eventDataKeys,transitionTime:u.CLICK_TRANSITION_TIME,transitionEasing:u.CLICK_TRANSITION_EASING}).call(c.setSliceCursor,t,{hideOnRoot:!1,hideOnLeaves:!1,isTransitioning:t._transitioning}),d.call(l,s,P,t,{hovered:!1}),s._text=(c.getPtLabel(s)||\"\").split(\"
\").join(\" \")||\"\";var v=i.ensureSingle(p,\"g\",\"slicetext\"),k=i.ensureSingle(v,\"text\",\"\",(function(t){t.attr(\"data-notex\",1)})),C=i.ensureUniformFontSize(t,c.determineTextFont(P,s,L.font,{onPathbar:!0}));k.text(s._text||\" \").classed(\"slicetext\",!0).attr(\"text-anchor\",\"start\").call(a.font,C).call(o.convertToTspans,t),s.textBB=a.bBox(k.node()),s.transform=_(s,{fontSize:C.size,onPathbar:!0}),s.transform.fontSize=C.size,T?k.transition().attrTween(\"transform\",(function(t){var e=M(t,h,S,[g,y]);return function(t){return w(e(t))}})):k.attr(\"transform\",w(s))}))}},76477:function(t,e,r){\"use strict\";var n=r(33428),i=r(3400),a=r(43616),o=r(72736),s=r(13832),l=r(66192).styleOne,u=r(32984),c=r(78176),f=r(45716),h=r(96488).formatSliceLabel,p=!1;t.exports=function(t,e,r,d,v){var g=v.width,y=v.height,m=v.viewX,x=v.viewY,b=v.pathSlice,_=v.toMoveInsideSlice,w=v.strTransform,T=v.hasTransition,k=v.handleSlicesExit,A=v.makeUpdateSliceInterpolator,M=v.makeUpdateTextInterpolator,S=v.prevEntry,E=t._context.staticPlot,L=t._fullLayout,C=e[0].trace,P=-1!==C.textposition.indexOf(\"left\"),O=-1!==C.textposition.indexOf(\"right\"),I=-1!==C.textposition.indexOf(\"bottom\"),z=!I&&!C.marker.pad.t||I&&!C.marker.pad.b,D=s(r,[g,y],{packing:C.tiling.packing,squarifyratio:C.tiling.squarifyratio,flipX:C.tiling.flip.indexOf(\"x\")>-1,flipY:C.tiling.flip.indexOf(\"y\")>-1,pad:{inner:C.tiling.pad,top:C.marker.pad.t,left:C.marker.pad.l,right:C.marker.pad.r,bottom:C.marker.pad.b}}).descendants(),R=1/0,F=-1/0;D.forEach((function(t){var e=t.depth;e>=C._maxDepth?(t.x0=t.x1=(t.x0+t.x1)/2,t.y0=t.y1=(t.y0+t.y1)/2):(R=Math.min(R,e),F=Math.max(F,e))})),d=d.data(D,c.getPtId),C._maxVisibleLayers=isFinite(F)?F-R+1:0,d.enter().append(\"g\").classed(\"slice\",!0),k(d,p,{},[g,y],b),d.order();var B=null;if(T&&S){var N=c.getPtId(S);d.each((function(t){null===B&&c.getPtId(t)===N&&(B={x0:t.x0,x1:t.x1,y0:t.y0,y1:t.y1})}))}var j=function(){return B||{x0:0,x1:g,y0:0,y1:y}},U=d;return T&&(U=U.transition().each(\"end\",(function(){var e=n.select(this);c.setSliceCursor(e,t,{hideOnRoot:!0,hideOnLeaves:!1,isTransitioning:!1})}))),U.each((function(s){var d=c.isHeader(s,C);s._x0=m(s.x0),s._x1=m(s.x1),s._y0=x(s.y0),s._y1=x(s.y1),s._hoverX=m(s.x1-C.marker.pad.r),s._hoverY=x(I?s.y1-C.marker.pad.b/2:s.y0+C.marker.pad.t/2);var v=n.select(this),k=i.ensureSingle(v,\"path\",\"surface\",(function(t){t.style(\"pointer-events\",E?\"none\":\"all\")}));T?k.transition().attrTween(\"d\",(function(t){var e=A(t,p,j(),[g,y]);return function(t){return b(e(t))}})):k.attr(\"d\",b),v.call(f,r,t,e,{styleOne:l,eventDataKeys:u.eventDataKeys,transitionTime:u.CLICK_TRANSITION_TIME,transitionEasing:u.CLICK_TRANSITION_EASING}).call(c.setSliceCursor,t,{isTransitioning:t._transitioning}),k.call(l,s,C,t,{hovered:!1}),s.x0===s.x1||s.y0===s.y1?s._text=\"\":s._text=d?z?\"\":c.getPtLabel(s)||\"\":h(s,r,C,e,L)||\"\";var S=i.ensureSingle(v,\"g\",\"slicetext\"),D=i.ensureSingle(S,\"text\",\"\",(function(t){t.attr(\"data-notex\",1)})),R=i.ensureUniformFontSize(t,c.determineTextFont(C,s,L.font)),F=s._text||\" \",B=d&&-1===F.indexOf(\"
\");D.text(F).classed(\"slicetext\",!0).attr(\"text-anchor\",O?\"end\":P||B?\"start\":\"middle\").call(a.font,R).call(o.convertToTspans,t),s.textBB=a.bBox(D.node()),s.transform=_(s,{fontSize:R.size,isHeader:d}),s.transform.fontSize=R.size,T?D.transition().attrTween(\"transform\",(function(t){var e=M(t,p,j(),[g,y]);return function(t){return w(e(t))}})):D.attr(\"transform\",w(s))})),B}},83024:function(t){\"use strict\";t.exports=function t(e,r,n){var i;n.swapXY&&(i=e.x0,e.x0=e.y0,e.y0=i,i=e.x1,e.x1=e.y1,e.y1=i),n.flipX&&(i=e.x0,e.x0=r[0]-e.x1,e.x1=r[0]-i),n.flipY&&(i=e.y0,e.y0=r[1]-e.y1,e.y1=r[1]-i);var a=e.children;if(a)for(var o=0;o-1?C+I:-(O+I):0,D={x0:P,x1:P,y0:z,y1:z+O},R=function(t,e,r){var n=y.tiling.pad,i=function(t){return t-n<=e.x0},a=function(t){return t+n>=e.x1},o=function(t){return t-n<=e.y0},s=function(t){return t+n>=e.y1};return t.x0===e.x0&&t.x1===e.x1&&t.y0===e.y0&&t.y1===e.y1?{x0:t.x0,x1:t.x1,y0:t.y0,y1:t.y1}:{x0:i(t.x0-n)?0:a(t.x0-n)?r[0]:t.x0,x1:i(t.x1+n)?0:a(t.x1+n)?r[0]:t.x1,y0:o(t.y0-n)?0:s(t.y0-n)?r[1]:t.y0,y1:o(t.y1+n)?0:s(t.y1+n)?r[1]:t.y1}},F=null,B={},N={},j=null,U=function(t,e){return e?B[h(t)]:N[h(t)]};g.hasMultipleRoots&&k&&M++,y._maxDepth=M,y._backgroundColor=v.paper_bgcolor,y._entryDepth=b.data.depth,y._atRootLevel=k;var V=-L/2+S.l+S.w*(E.x[1]+E.x[0])/2,q=-C/2+S.t+S.h*(1-(E.y[1]+E.y[0])/2),H=function(t){return V+t},G=function(t){return q+t},W=G(0),Y=H(0),X=function(t){return Y+t},Z=function(t){return W+t};function K(t,e){return t+\",\"+e}var J=X(0),$=function(t){t.x=Math.max(J,t.x)},Q=y.pathbar.edgeshape,tt=y[m?\"tiling\":\"marker\"].pad,et=function(t){return-1!==y.textposition.indexOf(t)},rt=et(\"top\"),nt=et(\"left\"),it=et(\"right\"),at=et(\"bottom\"),ot=function(t,e){var r=t.x0,n=t.x1,i=t.y0,a=t.y1,o=t.textBB,c=rt||e.isHeader&&!at?\"start\":at?\"end\":\"middle\",f=et(\"right\"),h=et(\"left\")||e.onPathbar?-1:f?1:0;if(e.isHeader){if((r+=(m?tt:tt.l)-s)>=(n-=(m?tt:tt.r)-s)){var p=(r+n)/2;r=p,n=p}var d;at?i<(d=a-(m?tt:tt.b))&&d\"===Q?(l.x-=a,u.x-=a,c.x-=a,f.x-=a):\"/\"===Q?(c.x-=a,f.x-=a,o.x-=a/2,s.x-=a/2):\"\\\\\"===Q?(l.x-=a,u.x-=a,o.x-=a/2,s.x-=a/2):\"<\"===Q&&(o.x-=a,s.x-=a),$(l),$(f),$(o),$(u),$(c),$(s),\"M\"+K(l.x,l.y)+\"L\"+K(u.x,u.y)+\"L\"+K(s.x,s.y)+\"L\"+K(c.x,c.y)+\"L\"+K(f.x,f.y)+\"L\"+K(o.x,o.y)+\"Z\"},toMoveInsideSlice:ot,makeUpdateSliceInterpolator:lt,makeUpdateTextInterpolator:ut,handleSlicesExit:ct,hasTransition:A,strTransform:ft}):w.remove()}},66192:function(t,e,r){\"use strict\";var n=r(33428),i=r(76308),a=r(3400),o=r(78176),s=r(82744).resizeText,l=r(60404);function u(t,e,r,n,s){var u,c,f=(s||{}).hovered,h=e.data.data,p=h.i,d=h.color,v=o.isHierarchyRoot(e),g=1;if(f)u=r._hovered.marker.line.color,c=r._hovered.marker.line.width;else if(v&&d===r.root.color)g=100,u=\"rgba(0,0,0,0)\",c=0;else if(u=a.castOption(r,p,\"marker.line.color\")||i.defaultLine,c=a.castOption(r,p,\"marker.line.width\")||0,!r._hasColorscale&&!e.onPathbar){var y=r.marker.depthfade;if(y){var m,x=i.combine(i.addOpacity(r._backgroundColor,.75),d);if(!0===y){var b=o.getMaxDepth(r);m=isFinite(b)?o.isLeaf(e)?0:r._maxVisibleLayers-(e.data.depth-r._entryDepth):e.data.height+1}else m=e.data.depth-r._entryDepth,r._atRootLevel||m++;if(m>0)for(var _=0;_0){var b,_,w,T,k,A=t.xa,M=t.ya;\"h\"===d.orientation?(k=e,b=\"y\",w=M,_=\"x\",T=A):(k=r,b=\"x\",w=A,_=\"y\",T=M);var S=p[t.index];if(k>=S.span[0]&&k<=S.span[1]){var E=i.extendFlat({},t),L=T.c2p(k,!0),C=s.getKdeValue(S,d,k),P=s.getPositionOnKdePath(S,d,L),O=w._offset,I=w._length;E[b+\"0\"]=P[0],E[b+\"1\"]=P[1],E[_+\"0\"]=E[_+\"1\"]=L,E[_+\"Label\"]=_+\": \"+a.hoverLabelText(T,k,d[_+\"hoverformat\"])+\", \"+p[0].t.labels.kde+\" \"+C.toFixed(3);for(var z=0,D=0;D\")),c.color=function(t,e){var r=t[e.dir].marker,n=r.color,a=r.line.color,o=r.line.width;return i(n)?n:i(a)&&o?a:void 0}(h,g),[c]}function k(t){return n(v,t,h[d+\"hoverformat\"])}}},95952:function(t,e,r){\"use strict\";t.exports={attributes:r(65776),layoutAttributes:r(91352),supplyDefaults:r(24224).supplyDefaults,crossTraceDefaults:r(24224).crossTraceDefaults,supplyLayoutDefaults:r(59464),calc:r(73540),crossTraceCalc:r(50152),plot:r(64488),style:r(12252).style,hoverPoints:r(94196),eventData:r(53256),selectPoints:r(45784),moduleType:\"trace\",name:\"waterfall\",basePlotModule:r(57952),categories:[\"bar-like\",\"cartesian\",\"svg\",\"oriented\",\"showLegend\",\"zoomScale\"],meta:{}}},91352:function(t){\"use strict\";t.exports={waterfallmode:{valType:\"enumerated\",values:[\"group\",\"overlay\"],dflt:\"group\",editType:\"calc\"},waterfallgap:{valType:\"number\",min:0,max:1,editType:\"calc\"},waterfallgroupgap:{valType:\"number\",min:0,max:1,dflt:0,editType:\"calc\"}}},59464:function(t,e,r){\"use strict\";var n=r(3400),i=r(91352);t.exports=function(t,e,r){var a=!1;function o(r,a){return n.coerce(t,e,i,r,a)}for(var s=0;s0&&(g+=h?\"M\"+f[0]+\",\"+d[1]+\"V\"+d[0]:\"M\"+f[1]+\",\"+d[0]+\"H\"+f[0]),\"between\"!==p&&(r.isSum||s path\").each((function(t){if(!t.isBlank){var e=s[t.dir].marker;n.select(this).call(a.fill,e.color).call(a.stroke,e.line.color).call(i.dashLine,e.line.dash,e.line.width).style(\"opacity\",s.selectedpoints&&!t.selected?o:1)}})),u(r,s,t),r.selectAll(\".lines\").each((function(){var t=s.connector.line;i.lineGroupStyle(n.select(this).selectAll(\"path\"),t.width,t.color,t.dash)}))}))}}},84224:function(t,e,r){\"use strict\";var n=r(54460),i=r(3400),a=r(73060),o=r(60468).W,s=r(39032).BADNUM;e.moduleType=\"transform\",e.name=\"aggregate\";var l=e.attributes={enabled:{valType:\"boolean\",dflt:!0,editType:\"calc\"},groups:{valType:\"string\",strict:!0,noBlank:!0,arrayOk:!0,dflt:\"x\",editType:\"calc\"},aggregations:{_isLinkedToArray:\"aggregation\",target:{valType:\"string\",editType:\"calc\"},func:{valType:\"enumerated\",values:[\"count\",\"sum\",\"avg\",\"median\",\"mode\",\"rms\",\"stddev\",\"min\",\"max\",\"first\",\"last\",\"change\",\"range\"],dflt:\"first\",editType:\"calc\"},funcmode:{valType:\"enumerated\",values:[\"sample\",\"population\"],dflt:\"sample\",editType:\"calc\"},enabled:{valType:\"boolean\",dflt:!0,editType:\"calc\"},editType:\"calc\"},editType:\"calc\"},u=l.aggregations;function c(t,e,r,a){if(a.enabled){for(var o=a.target,l=i.nestedProperty(e,o),u=l.get(),c=function(t,e){var r=t.func,n=e.d2c,a=e.c2d;switch(r){case\"count\":return f;case\"first\":return h;case\"last\":return p;case\"sum\":return function(t,e){for(var r=0,i=0;ii&&(i=c,o=u)}}return i?a(o):s};case\"rms\":return function(t,e){for(var r=0,i=0,o=0;o\":return function(t){return p(t)>f};case\">=\":return function(t){return p(t)>=f};case\"[]\":return function(t){var e=p(t);return e>=f[0]&&e<=f[1]};case\"()\":return function(t){var e=p(t);return e>f[0]&&e=f[0]&&ef[0]&&e<=f[1]};case\"][\":return function(t){var e=p(t);return e<=f[0]||e>=f[1]};case\")(\":return function(t){var e=p(t);return ef[1]};case\"](\":return function(t){var e=p(t);return e<=f[0]||e>f[1]};case\")[\":return function(t){var e=p(t);return e=f[1]};case\"{}\":return function(t){return-1!==f.indexOf(p(t))};case\"}{\":return function(t){return-1===f.indexOf(p(t))}}}(r,a.getDataToCoordFunc(t,e,s,i),h),x={},b={},_=0;d?(g=function(t){x[t.astr]=n.extendDeep([],t.get()),t.set(new Array(f))},y=function(t,e){var r=x[t.astr][e];t.get()[e]=r}):(g=function(t){x[t.astr]=n.extendDeep([],t.get()),t.set([])},y=function(t,e){var r=x[t.astr][e];t.get().push(r)}),k(g);for(var w=o(e.transforms,r),T=0;T1?\"%{group} (%{trace})\":\"%{group}\");var l=t.styles,u=o.styles=[];if(l)for(a=0;ah)throw new RangeError('The value \"'+t+'\" is invalid for option \"size\"');var e=new Uint8Array(t);return Object.setPrototypeOf(e,d.prototype),e}function d(t,e,r){if(\"number\"==typeof t){if(\"string\"==typeof e)throw new TypeError('The \"string\" argument must be of type string. Received type number');return y(t)}return v(t,e,r)}function v(t,e,r){if(\"string\"==typeof t)return function(t,e){if(\"string\"==typeof e&&\"\"!==e||(e=\"utf8\"),!d.isEncoding(e))throw new TypeError(\"Unknown encoding: \"+e);var r=0|_(t,e),n=p(r),i=n.write(t,e);return i!==r&&(n=n.slice(0,i)),n}(t,e);if(ArrayBuffer.isView(t))return function(t){if(et(t,Uint8Array)){var e=new Uint8Array(t);return x(e.buffer,e.byteOffset,e.byteLength)}return m(t)}(t);if(null==t)throw new TypeError(\"The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type \"+l(t));if(et(t,ArrayBuffer)||t&&et(t.buffer,ArrayBuffer))return x(t,e,r);if(\"undefined\"!=typeof SharedArrayBuffer&&(et(t,SharedArrayBuffer)||t&&et(t.buffer,SharedArrayBuffer)))return x(t,e,r);if(\"number\"==typeof t)throw new TypeError('The \"value\" argument must not be of type number. Received type number');var n=t.valueOf&&t.valueOf();if(null!=n&&n!==t)return d.from(n,e,r);var i=function(t){if(d.isBuffer(t)){var e=0|b(t.length),r=p(e);return 0===r.length||t.copy(r,0,0,e),r}return void 0!==t.length?\"number\"!=typeof t.length||rt(t.length)?p(0):m(t):\"Buffer\"===t.type&&Array.isArray(t.data)?m(t.data):void 0}(t);if(i)return i;if(\"undefined\"!=typeof Symbol&&null!=Symbol.toPrimitive&&\"function\"==typeof t[Symbol.toPrimitive])return d.from(t[Symbol.toPrimitive](\"string\"),e,r);throw new TypeError(\"The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type \"+l(t))}function g(t){if(\"number\"!=typeof t)throw new TypeError('\"size\" argument must be of type number');if(t<0)throw new RangeError('The value \"'+t+'\" is invalid for option \"size\"')}function y(t){return g(t),p(t<0?0:0|b(t))}function m(t){for(var e=t.length<0?0:0|b(t.length),r=p(e),n=0;n=h)throw new RangeError(\"Attempt to allocate Buffer larger than maximum size: 0x\"+h.toString(16)+\" bytes\");return 0|t}function _(t,e){if(d.isBuffer(t))return t.length;if(ArrayBuffer.isView(t)||et(t,ArrayBuffer))return t.byteLength;if(\"string\"!=typeof t)throw new TypeError('The \"string\" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+l(t));var r=t.length,n=arguments.length>2&&!0===arguments[2];if(!n&&0===r)return 0;for(var i=!1;;)switch(e){case\"ascii\":case\"latin1\":case\"binary\":return r;case\"utf8\":case\"utf-8\":return $(t).length;case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return 2*r;case\"hex\":return r>>>1;case\"base64\":return Q(t).length;default:if(i)return n?-1:$(t).length;e=(\"\"+e).toLowerCase(),i=!0}}function w(t,e,r){var n=!1;if((void 0===e||e<0)&&(e=0),e>this.length)return\"\";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return\"\";if((r>>>=0)<=(e>>>=0))return\"\";for(t||(t=\"utf8\");;)switch(t){case\"hex\":return R(this,e,r);case\"utf8\":case\"utf-8\":return O(this,e,r);case\"ascii\":return z(this,e,r);case\"latin1\":case\"binary\":return D(this,e,r);case\"base64\":return P(this,e,r);case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return F(this,e,r);default:if(n)throw new TypeError(\"Unknown encoding: \"+t);t=(t+\"\").toLowerCase(),n=!0}}function T(t,e,r){var n=t[e];t[e]=t[r],t[r]=n}function k(t,e,r,n,i){if(0===t.length)return-1;if(\"string\"==typeof r?(n=r,r=0):r>2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),rt(r=+r)&&(r=i?0:t.length-1),r<0&&(r=t.length+r),r>=t.length){if(i)return-1;r=t.length-1}else if(r<0){if(!i)return-1;r=0}if(\"string\"==typeof e&&(e=d.from(e,n)),d.isBuffer(e))return 0===e.length?-1:A(t,e,r,n,i);if(\"number\"==typeof e)return e&=255,\"function\"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(t,e,r):Uint8Array.prototype.lastIndexOf.call(t,e,r):A(t,[e],r,n,i);throw new TypeError(\"val must be string, number or Buffer\")}function A(t,e,r,n,i){var a,o=1,s=t.length,l=e.length;if(void 0!==n&&(\"ucs2\"===(n=String(n).toLowerCase())||\"ucs-2\"===n||\"utf16le\"===n||\"utf-16le\"===n)){if(t.length<2||e.length<2)return-1;o=2,s/=2,l/=2,r/=2}function u(t,e){return 1===o?t[e]:t.readUInt16BE(e*o)}if(i){var c=-1;for(a=r;as&&(r=s-l),a=r;a>=0;a--){for(var f=!0,h=0;hi&&(n=i):n=i;var a,o=e.length;for(n>o/2&&(n=o/2),a=0;a>8,i=r%256,a.push(i),a.push(n);return a}(e,t.length-r),t,r,n)}function P(t,e,r){return 0===e&&r===t.length?u.fromByteArray(t):u.fromByteArray(t.slice(e,r))}function O(t,e,r){r=Math.min(t.length,r);for(var n=[],i=e;i239?4:a>223?3:a>191?2:1;if(i+s<=r){var l=void 0,u=void 0,c=void 0,f=void 0;switch(s){case 1:a<128&&(o=a);break;case 2:128==(192&(l=t[i+1]))&&(f=(31&a)<<6|63&l)>127&&(o=f);break;case 3:l=t[i+1],u=t[i+2],128==(192&l)&&128==(192&u)&&(f=(15&a)<<12|(63&l)<<6|63&u)>2047&&(f<55296||f>57343)&&(o=f);break;case 4:l=t[i+1],u=t[i+2],c=t[i+3],128==(192&l)&&128==(192&u)&&128==(192&c)&&(f=(15&a)<<18|(63&l)<<12|(63&u)<<6|63&c)>65535&&f<1114112&&(o=f)}}null===o?(o=65533,s=1):o>65535&&(o-=65536,n.push(o>>>10&1023|55296),o=56320|1023&o),n.push(o),i+=s}return function(t){var e=t.length;if(e<=I)return String.fromCharCode.apply(String,t);for(var r=\"\",n=0;nn.length?(d.isBuffer(a)||(a=d.from(a)),a.copy(n,i)):Uint8Array.prototype.set.call(n,a,i);else{if(!d.isBuffer(a))throw new TypeError('\"list\" argument must be an Array of Buffers');a.copy(n,i)}i+=a.length}return n},d.byteLength=_,d.prototype._isBuffer=!0,d.prototype.swap16=function(){var t=this.length;if(t%2!=0)throw new RangeError(\"Buffer size must be a multiple of 16-bits\");for(var e=0;er&&(t+=\" ... \"),\"\"},f&&(d.prototype[f]=d.prototype.inspect),d.prototype.compare=function(t,e,r,n,i){if(et(t,Uint8Array)&&(t=d.from(t,t.offset,t.byteLength)),!d.isBuffer(t))throw new TypeError('The \"target\" argument must be one of type Buffer or Uint8Array. Received type '+l(t));if(void 0===e&&(e=0),void 0===r&&(r=t?t.length:0),void 0===n&&(n=0),void 0===i&&(i=this.length),e<0||r>t.length||n<0||i>this.length)throw new RangeError(\"out of range index\");if(n>=i&&e>=r)return 0;if(n>=i)return-1;if(e>=r)return 1;if(this===t)return 0;for(var a=(i>>>=0)-(n>>>=0),o=(r>>>=0)-(e>>>=0),s=Math.min(a,o),u=this.slice(n,i),c=t.slice(e,r),f=0;f>>=0,isFinite(r)?(r>>>=0,void 0===n&&(n=\"utf8\")):(n=r,r=void 0)}var i=this.length-e;if((void 0===r||r>i)&&(r=i),t.length>0&&(r<0||e<0)||e>this.length)throw new RangeError(\"Attempt to write outside buffer bounds\");n||(n=\"utf8\");for(var a=!1;;)switch(n){case\"hex\":return M(this,t,e,r);case\"utf8\":case\"utf-8\":return S(this,t,e,r);case\"ascii\":case\"latin1\":case\"binary\":return E(this,t,e,r);case\"base64\":return L(this,t,e,r);case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return C(this,t,e,r);default:if(a)throw new TypeError(\"Unknown encoding: \"+n);n=(\"\"+n).toLowerCase(),a=!0}},d.prototype.toJSON=function(){return{type:\"Buffer\",data:Array.prototype.slice.call(this._arr||this,0)}};var I=4096;function z(t,e,r){var n=\"\";r=Math.min(t.length,r);for(var i=e;in)&&(r=n);for(var i=\"\",a=e;ar)throw new RangeError(\"Trying to access beyond buffer length\")}function N(t,e,r,n,i,a){if(!d.isBuffer(t))throw new TypeError('\"buffer\" argument must be a Buffer instance');if(e>i||et.length)throw new RangeError(\"Index out of range\")}function j(t,e,r,n,i){X(e,n,i,t,r,7);var a=Number(e&BigInt(4294967295));t[r++]=a,a>>=8,t[r++]=a,a>>=8,t[r++]=a,a>>=8,t[r++]=a;var o=Number(e>>BigInt(32)&BigInt(4294967295));return t[r++]=o,o>>=8,t[r++]=o,o>>=8,t[r++]=o,o>>=8,t[r++]=o,r}function U(t,e,r,n,i){X(e,n,i,t,r,7);var a=Number(e&BigInt(4294967295));t[r+7]=a,a>>=8,t[r+6]=a,a>>=8,t[r+5]=a,a>>=8,t[r+4]=a;var o=Number(e>>BigInt(32)&BigInt(4294967295));return t[r+3]=o,o>>=8,t[r+2]=o,o>>=8,t[r+1]=o,o>>=8,t[r]=o,r+8}function V(t,e,r,n,i,a){if(r+n>t.length)throw new RangeError(\"Index out of range\");if(r<0)throw new RangeError(\"Index out of range\")}function q(t,e,r,n,i){return e=+e,r>>>=0,i||V(t,0,r,4),c.write(t,e,r,n,23,4),r+4}function H(t,e,r,n,i){return e=+e,r>>>=0,i||V(t,0,r,8),c.write(t,e,r,n,52,8),r+8}d.prototype.slice=function(t,e){var r=this.length;(t=~~t)<0?(t+=r)<0&&(t=0):t>r&&(t=r),(e=void 0===e?r:~~e)<0?(e+=r)<0&&(e=0):e>r&&(e=r),e>>=0,e>>>=0,r||B(t,e,this.length);for(var n=this[t],i=1,a=0;++a>>=0,e>>>=0,r||B(t,e,this.length);for(var n=this[t+--e],i=1;e>0&&(i*=256);)n+=this[t+--e]*i;return n},d.prototype.readUint8=d.prototype.readUInt8=function(t,e){return t>>>=0,e||B(t,1,this.length),this[t]},d.prototype.readUint16LE=d.prototype.readUInt16LE=function(t,e){return t>>>=0,e||B(t,2,this.length),this[t]|this[t+1]<<8},d.prototype.readUint16BE=d.prototype.readUInt16BE=function(t,e){return t>>>=0,e||B(t,2,this.length),this[t]<<8|this[t+1]},d.prototype.readUint32LE=d.prototype.readUInt32LE=function(t,e){return t>>>=0,e||B(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},d.prototype.readUint32BE=d.prototype.readUInt32BE=function(t,e){return t>>>=0,e||B(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},d.prototype.readBigUInt64LE=it((function(t){Z(t>>>=0,\"offset\");var e=this[t],r=this[t+7];void 0!==e&&void 0!==r||K(t,this.length-8);var n=e+this[++t]*Math.pow(2,8)+this[++t]*Math.pow(2,16)+this[++t]*Math.pow(2,24),i=this[++t]+this[++t]*Math.pow(2,8)+this[++t]*Math.pow(2,16)+r*Math.pow(2,24);return BigInt(n)+(BigInt(i)<>>=0,\"offset\");var e=this[t],r=this[t+7];void 0!==e&&void 0!==r||K(t,this.length-8);var n=e*Math.pow(2,24)+this[++t]*Math.pow(2,16)+this[++t]*Math.pow(2,8)+this[++t],i=this[++t]*Math.pow(2,24)+this[++t]*Math.pow(2,16)+this[++t]*Math.pow(2,8)+r;return(BigInt(n)<>>=0,e>>>=0,r||B(t,e,this.length);for(var n=this[t],i=1,a=0;++a=(i*=128)&&(n-=Math.pow(2,8*e)),n},d.prototype.readIntBE=function(t,e,r){t>>>=0,e>>>=0,r||B(t,e,this.length);for(var n=e,i=1,a=this[t+--n];n>0&&(i*=256);)a+=this[t+--n]*i;return a>=(i*=128)&&(a-=Math.pow(2,8*e)),a},d.prototype.readInt8=function(t,e){return t>>>=0,e||B(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},d.prototype.readInt16LE=function(t,e){t>>>=0,e||B(t,2,this.length);var r=this[t]|this[t+1]<<8;return 32768&r?4294901760|r:r},d.prototype.readInt16BE=function(t,e){t>>>=0,e||B(t,2,this.length);var r=this[t+1]|this[t]<<8;return 32768&r?4294901760|r:r},d.prototype.readInt32LE=function(t,e){return t>>>=0,e||B(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},d.prototype.readInt32BE=function(t,e){return t>>>=0,e||B(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},d.prototype.readBigInt64LE=it((function(t){Z(t>>>=0,\"offset\");var e=this[t],r=this[t+7];void 0!==e&&void 0!==r||K(t,this.length-8);var n=this[t+4]+this[t+5]*Math.pow(2,8)+this[t+6]*Math.pow(2,16)+(r<<24);return(BigInt(n)<>>=0,\"offset\");var e=this[t],r=this[t+7];void 0!==e&&void 0!==r||K(t,this.length-8);var n=(e<<24)+this[++t]*Math.pow(2,16)+this[++t]*Math.pow(2,8)+this[++t];return(BigInt(n)<>>=0,e||B(t,4,this.length),c.read(this,t,!0,23,4)},d.prototype.readFloatBE=function(t,e){return t>>>=0,e||B(t,4,this.length),c.read(this,t,!1,23,4)},d.prototype.readDoubleLE=function(t,e){return t>>>=0,e||B(t,8,this.length),c.read(this,t,!0,52,8)},d.prototype.readDoubleBE=function(t,e){return t>>>=0,e||B(t,8,this.length),c.read(this,t,!1,52,8)},d.prototype.writeUintLE=d.prototype.writeUIntLE=function(t,e,r,n){t=+t,e>>>=0,r>>>=0,n||N(this,t,e,r,Math.pow(2,8*r)-1,0);var i=1,a=0;for(this[e]=255&t;++a>>=0,r>>>=0,n||N(this,t,e,r,Math.pow(2,8*r)-1,0);var i=r-1,a=1;for(this[e+i]=255&t;--i>=0&&(a*=256);)this[e+i]=t/a&255;return e+r},d.prototype.writeUint8=d.prototype.writeUInt8=function(t,e,r){return t=+t,e>>>=0,r||N(this,t,e,1,255,0),this[e]=255&t,e+1},d.prototype.writeUint16LE=d.prototype.writeUInt16LE=function(t,e,r){return t=+t,e>>>=0,r||N(this,t,e,2,65535,0),this[e]=255&t,this[e+1]=t>>>8,e+2},d.prototype.writeUint16BE=d.prototype.writeUInt16BE=function(t,e,r){return t=+t,e>>>=0,r||N(this,t,e,2,65535,0),this[e]=t>>>8,this[e+1]=255&t,e+2},d.prototype.writeUint32LE=d.prototype.writeUInt32LE=function(t,e,r){return t=+t,e>>>=0,r||N(this,t,e,4,4294967295,0),this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t,e+4},d.prototype.writeUint32BE=d.prototype.writeUInt32BE=function(t,e,r){return t=+t,e>>>=0,r||N(this,t,e,4,4294967295,0),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t,e+4},d.prototype.writeBigUInt64LE=it((function(t){return j(this,t,arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,BigInt(0),BigInt(\"0xffffffffffffffff\"))})),d.prototype.writeBigUInt64BE=it((function(t){return U(this,t,arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,BigInt(0),BigInt(\"0xffffffffffffffff\"))})),d.prototype.writeIntLE=function(t,e,r,n){if(t=+t,e>>>=0,!n){var i=Math.pow(2,8*r-1);N(this,t,e,r,i-1,-i)}var a=0,o=1,s=0;for(this[e]=255&t;++a>0)-s&255;return e+r},d.prototype.writeIntBE=function(t,e,r,n){if(t=+t,e>>>=0,!n){var i=Math.pow(2,8*r-1);N(this,t,e,r,i-1,-i)}var a=r-1,o=1,s=0;for(this[e+a]=255&t;--a>=0&&(o*=256);)t<0&&0===s&&0!==this[e+a+1]&&(s=1),this[e+a]=(t/o>>0)-s&255;return e+r},d.prototype.writeInt8=function(t,e,r){return t=+t,e>>>=0,r||N(this,t,e,1,127,-128),t<0&&(t=255+t+1),this[e]=255&t,e+1},d.prototype.writeInt16LE=function(t,e,r){return t=+t,e>>>=0,r||N(this,t,e,2,32767,-32768),this[e]=255&t,this[e+1]=t>>>8,e+2},d.prototype.writeInt16BE=function(t,e,r){return t=+t,e>>>=0,r||N(this,t,e,2,32767,-32768),this[e]=t>>>8,this[e+1]=255&t,e+2},d.prototype.writeInt32LE=function(t,e,r){return t=+t,e>>>=0,r||N(this,t,e,4,2147483647,-2147483648),this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24,e+4},d.prototype.writeInt32BE=function(t,e,r){return t=+t,e>>>=0,r||N(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t,e+4},d.prototype.writeBigInt64LE=it((function(t){return j(this,t,arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,-BigInt(\"0x8000000000000000\"),BigInt(\"0x7fffffffffffffff\"))})),d.prototype.writeBigInt64BE=it((function(t){return U(this,t,arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,-BigInt(\"0x8000000000000000\"),BigInt(\"0x7fffffffffffffff\"))})),d.prototype.writeFloatLE=function(t,e,r){return q(this,t,e,!0,r)},d.prototype.writeFloatBE=function(t,e,r){return q(this,t,e,!1,r)},d.prototype.writeDoubleLE=function(t,e,r){return H(this,t,e,!0,r)},d.prototype.writeDoubleBE=function(t,e,r){return H(this,t,e,!1,r)},d.prototype.copy=function(t,e,r,n){if(!d.isBuffer(t))throw new TypeError(\"argument should be a Buffer\");if(r||(r=0),n||0===n||(n=this.length),e>=t.length&&(e=t.length),e||(e=0),n>0&&n=this.length)throw new RangeError(\"Index out of range\");if(n<0)throw new RangeError(\"sourceEnd out of bounds\");n>this.length&&(n=this.length),t.length-e>>=0,r=void 0===r?this.length:r>>>0,t||(t=0),\"number\"==typeof t)for(a=e;a=n+4;r-=3)e=\"_\".concat(t.slice(r-3,r)).concat(e);return\"\".concat(t.slice(0,r)).concat(e)}function X(t,e,r,n,i,a){if(t>r||t3?0===e||e===BigInt(0)?\">= 0\".concat(s,\" and < 2\").concat(s,\" ** \").concat(8*(a+1)).concat(s):\">= -(2\".concat(s,\" ** \").concat(8*(a+1)-1).concat(s,\") and < 2 ** \")+\"\".concat(8*(a+1)-1).concat(s):\">= \".concat(e).concat(s,\" and <= \").concat(r).concat(s),new G.ERR_OUT_OF_RANGE(\"value\",o,t)}!function(t,e,r){Z(e,\"offset\"),void 0!==t[e]&&void 0!==t[e+r]||K(e,t.length-(r+1))}(n,i,a)}function Z(t,e){if(\"number\"!=typeof t)throw new G.ERR_INVALID_ARG_TYPE(e,\"number\",t)}function K(t,e,r){if(Math.floor(t)!==t)throw Z(t,r),new G.ERR_OUT_OF_RANGE(r||\"offset\",\"an integer\",t);if(e<0)throw new G.ERR_BUFFER_OUT_OF_BOUNDS;throw new G.ERR_OUT_OF_RANGE(r||\"offset\",\">= \".concat(r?1:0,\" and <= \").concat(e),t)}W(\"ERR_BUFFER_OUT_OF_BOUNDS\",(function(t){return t?\"\".concat(t,\" is outside of buffer bounds\"):\"Attempt to access memory outside buffer bounds\"}),RangeError),W(\"ERR_INVALID_ARG_TYPE\",(function(t,e){return'The \"'.concat(t,'\" argument must be of type number. Received type ').concat(l(e))}),TypeError),W(\"ERR_OUT_OF_RANGE\",(function(t,e,r){var n='The value of \"'.concat(t,'\" is out of range.'),i=r;return Number.isInteger(r)&&Math.abs(r)>Math.pow(2,32)?i=Y(String(r)):\"bigint\"==typeof r&&(i=String(r),(r>Math.pow(BigInt(2),BigInt(32))||r<-Math.pow(BigInt(2),BigInt(32)))&&(i=Y(i)),i+=\"n\"),n+\" It must be \".concat(e,\". Received \").concat(i)}),RangeError);var J=/[^+/0-9A-Za-z-_]/g;function $(t,e){var r;e=e||1/0;for(var n=t.length,i=null,a=[],o=0;o55295&&r<57344){if(!i){if(r>56319){(e-=3)>-1&&a.push(239,191,189);continue}if(o+1===n){(e-=3)>-1&&a.push(239,191,189);continue}i=r;continue}if(r<56320){(e-=3)>-1&&a.push(239,191,189),i=r;continue}r=65536+(i-55296<<10|r-56320)}else i&&(e-=3)>-1&&a.push(239,191,189);if(i=null,r<128){if((e-=1)<0)break;a.push(r)}else if(r<2048){if((e-=2)<0)break;a.push(r>>6|192,63&r|128)}else if(r<65536){if((e-=3)<0)break;a.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error(\"Invalid code point\");if((e-=4)<0)break;a.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return a}function Q(t){return u.toByteArray(function(t){if((t=(t=t.split(\"=\")[0]).trim().replace(J,\"\")).length<2)return\"\";for(;t.length%4!=0;)t+=\"=\";return t}(t))}function tt(t,e,r,n){var i;for(i=0;i=e.length||i>=t.length);++i)e[i+r]=t[i];return i}function et(t,e){return t instanceof e||null!=t&&null!=t.constructor&&null!=t.constructor.name&&t.constructor.name===e.name}function rt(t){return t!=t}var nt=function(){for(var t=\"0123456789abcdef\",e=new Array(256),r=0;r<16;++r)for(var n=16*r,i=0;i<16;++i)e[n+i]=t[r]+t[i];return e}();function it(t){return\"undefined\"==typeof BigInt?at:t}function at(){throw new Error(\"BigInt not supported\")}},9216:function(t){\"use strict\";t.exports=i,t.exports.isMobile=i,t.exports.default=i;var e=/(android|bb\\d+|meego).+mobile|armv7l|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series[46]0|samsungbrowser.*mobile|symbian|treo|up\\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i,r=/CrOS/,n=/android|ipad|playbook|silk/i;function i(t){t||(t={});var i=t.ua;if(i||\"undefined\"==typeof navigator||(i=navigator.userAgent),i&&i.headers&&\"string\"==typeof i.headers[\"user-agent\"]&&(i=i.headers[\"user-agent\"]),\"string\"!=typeof i)return!1;var a=e.test(i)&&!r.test(i)||!!t.tablet&&n.test(i);return!a&&t.tablet&&t.featureDetect&&navigator&&navigator.maxTouchPoints>1&&-1!==i.indexOf(\"Macintosh\")&&-1!==i.indexOf(\"Safari\")&&(a=!0),a}},6296:function(t,e,r){\"use strict\";t.exports=function(t){var e=(t=t||{}).eye||[0,0,1],r=t.center||[0,0,0],s=t.up||[0,1,0],l=t.distanceLimits||[0,1/0],u=t.mode||\"turntable\",c=n(),f=i(),h=a();return c.setDistanceLimits(l[0],l[1]),c.lookAt(0,e,r,s),f.setDistanceLimits(l[0],l[1]),f.lookAt(0,e,r,s),h.setDistanceLimits(l[0],l[1]),h.lookAt(0,e,r,s),new o({turntable:c,orbit:f,matrix:h},u)};var n=r(7261),i=r(9977),a=r(4192);function o(t,e){this._controllerNames=Object.keys(t),this._controllerList=this._controllerNames.map((function(e){return t[e]})),this._mode=e,this._active=t[e],this._active||(this._mode=\"turntable\",this._active=t.turntable),this.modes=this._controllerNames,this.computedMatrix=this._active.computedMatrix,this.computedEye=this._active.computedEye,this.computedUp=this._active.computedUp,this.computedCenter=this._active.computedCenter,this.computedRadius=this._active.computedRadius}var s=o.prototype;s.flush=function(t){for(var e=this._controllerList,r=0;r0?o-4:o;for(r=0;r>16&255,u[c++]=e>>8&255,u[c++]=255&e;return 2===l&&(e=n[t.charCodeAt(r)]<<2|n[t.charCodeAt(r+1)]>>4,u[c++]=255&e),1===l&&(e=n[t.charCodeAt(r)]<<10|n[t.charCodeAt(r+1)]<<4|n[t.charCodeAt(r+2)]>>2,u[c++]=e>>8&255,u[c++]=255&e),u},e.fromByteArray=function(t){for(var e,n=t.length,i=n%3,a=[],o=16383,s=0,u=n-i;su?u:s+o));return 1===i?(e=t[n-1],a.push(r[e>>2]+r[e<<4&63]+\"==\")):2===i&&(e=(t[n-2]<<8)+t[n-1],a.push(r[e>>10]+r[e>>4&63]+r[e<<2&63]+\"=\")),a.join(\"\")};for(var r=[],n=[],i=\"undefined\"!=typeof Uint8Array?Uint8Array:Array,a=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\",o=0;o<64;++o)r[o]=a[o],n[a.charCodeAt(o)]=o;function s(t){var e=t.length;if(e%4>0)throw new Error(\"Invalid string. Length must be a multiple of 4\");var r=t.indexOf(\"=\");return-1===r&&(r=e),[r,r===e?0:4-r%4]}function l(t,e,n){for(var i,a,o=[],s=e;s>18&63]+r[a>>12&63]+r[a>>6&63]+r[63&a]);return o.join(\"\")}n[\"-\".charCodeAt(0)]=62,n[\"_\".charCodeAt(0)]=63},3865:function(t,e,r){\"use strict\";var n=r(869);t.exports=function(t,e){return n(t[0].mul(e[1]).add(e[0].mul(t[1])),t[1].mul(e[1]))}},1318:function(t){\"use strict\";t.exports=function(t,e){return t[0].mul(e[1]).cmp(e[0].mul(t[1]))}},8697:function(t,e,r){\"use strict\";var n=r(869);t.exports=function(t,e){return n(t[0].mul(e[1]),t[1].mul(e[0]))}},7842:function(t,e,r){\"use strict\";var n=r(6330),i=r(1533),a=r(2651),o=r(4387),s=r(869),l=r(8697);t.exports=function t(e,r){if(n(e))return r?l(e,t(r)):[e[0].clone(),e[1].clone()];var u,c,f=0;if(i(e))u=e.clone();else if(\"string\"==typeof e)u=o(e);else{if(0===e)return[a(0),a(1)];if(e===Math.floor(e))u=a(e);else{for(;e!==Math.floor(e);)e*=Math.pow(2,256),f-=256;u=a(e)}}if(n(r))u.mul(r[1]),c=r[0].clone();else if(i(r))c=r.clone();else if(\"string\"==typeof r)c=o(r);else if(r)if(r===Math.floor(r))c=a(r);else{for(;r!==Math.floor(r);)r*=Math.pow(2,256),f+=256;c=a(r)}else c=a(1);return f>0?u=u.ushln(f):f<0&&(c=c.ushln(-f)),s(u,c)}},6330:function(t,e,r){\"use strict\";var n=r(1533);t.exports=function(t){return Array.isArray(t)&&2===t.length&&n(t[0])&&n(t[1])}},5716:function(t,e,r){\"use strict\";var n=r(6859);t.exports=function(t){return t.cmp(new n(0))}},1369:function(t,e,r){\"use strict\";var n=r(5716);t.exports=function(t){var e=t.length,r=t.words,i=0;if(1===e)i=r[0];else if(2===e)i=r[0]+67108864*r[1];else for(var a=0;a20?52:r+32}},1533:function(t,e,r){\"use strict\";r(6859),t.exports=function(t){return t&&\"object\"==typeof t&&Boolean(t.words)}},2651:function(t,e,r){\"use strict\";var n=r(6859),i=r(2361);t.exports=function(t){var e=i.exponent(t);return e<52?new n(t):new n(t*Math.pow(2,52-e)).ushln(e-52)}},869:function(t,e,r){\"use strict\";var n=r(2651),i=r(5716);t.exports=function(t,e){var r=i(t),a=i(e);if(0===r)return[n(0),n(1)];if(0===a)return[n(0),n(0)];a<0&&(t=t.neg(),e=e.neg());var o=t.gcd(e);return o.cmpn(1)?[t.div(o),e.div(o)]:[t,e]}},4387:function(t,e,r){\"use strict\";var n=r(6859);t.exports=function(t){return new n(t)}},6504:function(t,e,r){\"use strict\";var n=r(869);t.exports=function(t,e){return n(t[0].mul(e[0]),t[1].mul(e[1]))}},7721:function(t,e,r){\"use strict\";var n=r(5716);t.exports=function(t){return n(t[0])*n(t[1])}},5572:function(t,e,r){\"use strict\";var n=r(869);t.exports=function(t,e){return n(t[0].mul(e[1]).sub(t[1].mul(e[0])),t[1].mul(e[1]))}},946:function(t,e,r){\"use strict\";var n=r(1369),i=r(4025);t.exports=function(t){var e=t[0],r=t[1];if(0===e.cmpn(0))return 0;var a=e.abs().divmod(r.abs()),o=a.div,s=n(o),l=a.mod,u=e.negative!==r.negative?-1:1;if(0===l.cmpn(0))return u*s;if(s){var c=i(s)+4;return u*(s+(h=n(l.ushln(c).divRound(r)))*Math.pow(2,-c))}var f=r.bitLength()-l.bitLength()+53,h=n(l.ushln(f).divRound(r));return f<1023?u*h*Math.pow(2,-f):u*(h*=Math.pow(2,-1023))*Math.pow(2,1023-f)}},2478:function(t){\"use strict\";function e(t,e,r,n,i){for(var a=i+1;n<=i;){var o=n+i>>>1,s=t[o];(void 0!==r?r(s,e):s-e)>=0?(a=o,i=o-1):n=o+1}return a}function r(t,e,r,n,i){for(var a=i+1;n<=i;){var o=n+i>>>1,s=t[o];(void 0!==r?r(s,e):s-e)>0?(a=o,i=o-1):n=o+1}return a}function n(t,e,r,n,i){for(var a=n-1;n<=i;){var o=n+i>>>1,s=t[o];(void 0!==r?r(s,e):s-e)<0?(a=o,n=o+1):i=o-1}return a}function i(t,e,r,n,i){for(var a=n-1;n<=i;){var o=n+i>>>1,s=t[o];(void 0!==r?r(s,e):s-e)<=0?(a=o,n=o+1):i=o-1}return a}function a(t,e,r,n,i){for(;n<=i;){var a=n+i>>>1,o=t[a],s=void 0!==r?r(o,e):o-e;if(0===s)return a;s<=0?n=a+1:i=a-1}return-1}function o(t,e,r,n,i,a){return\"function\"==typeof r?a(t,e,r,void 0===n?0:0|n,void 0===i?t.length-1:0|i):a(t,e,void 0,void 0===r?0:0|r,void 0===n?t.length-1:0|n)}t.exports={ge:function(t,r,n,i,a){return o(t,r,n,i,a,e)},gt:function(t,e,n,i,a){return o(t,e,n,i,a,r)},lt:function(t,e,r,i,a){return o(t,e,r,i,a,n)},le:function(t,e,r,n,a){return o(t,e,r,n,a,i)},eq:function(t,e,r,n,i){return o(t,e,r,n,i,a)}}},8828:function(t,e){\"use strict\";function r(t){var e=32;return(t&=-t)&&e--,65535&t&&(e-=16),16711935&t&&(e-=8),252645135&t&&(e-=4),858993459&t&&(e-=2),1431655765&t&&(e-=1),e}e.INT_BITS=32,e.INT_MAX=2147483647,e.INT_MIN=-1<<31,e.sign=function(t){return(t>0)-(t<0)},e.abs=function(t){var e=t>>31;return(t^e)-e},e.min=function(t,e){return e^(t^e)&-(t65535)<<4,e|=r=((t>>>=e)>255)<<3,e|=r=((t>>>=r)>15)<<2,(e|=r=((t>>>=r)>3)<<1)|(t>>>=r)>>1},e.log10=function(t){return t>=1e9?9:t>=1e8?8:t>=1e7?7:t>=1e6?6:t>=1e5?5:t>=1e4?4:t>=1e3?3:t>=100?2:t>=10?1:0},e.popCount=function(t){return 16843009*((t=(858993459&(t-=t>>>1&1431655765))+(t>>>2&858993459))+(t>>>4)&252645135)>>>24},e.countTrailingZeros=r,e.nextPow2=function(t){return t+=0===t,--t,t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,1+(t|=t>>>16)},e.prevPow2=function(t){return t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,(t|=t>>>16)-(t>>>1)},e.parity=function(t){return t^=t>>>16,t^=t>>>8,t^=t>>>4,27030>>>(t&=15)&1};var n=new Array(256);!function(t){for(var e=0;e<256;++e){var r=e,n=e,i=7;for(r>>>=1;r;r>>>=1)n<<=1,n|=1&r,--i;t[e]=n<>>8&255]<<16|n[t>>>16&255]<<8|n[t>>>24&255]},e.interleave2=function(t,e){return(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t&=65535)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e&=65535)|e<<8))|e<<4))|e<<2))|e<<1))<<1},e.deinterleave2=function(t,e){return(t=65535&((t=16711935&((t=252645135&((t=858993459&((t=t>>>e&1431655765)|t>>>1))|t>>>2))|t>>>4))|t>>>16))<<16>>16},e.interleave3=function(t,e,r){return t=1227133513&((t=3272356035&((t=251719695&((t=4278190335&((t&=1023)|t<<16))|t<<8))|t<<4))|t<<2),(t|=(e=1227133513&((e=3272356035&((e=251719695&((e=4278190335&((e&=1023)|e<<16))|e<<8))|e<<4))|e<<2))<<1)|(r=1227133513&((r=3272356035&((r=251719695&((r=4278190335&((r&=1023)|r<<16))|r<<8))|r<<4))|r<<2))<<2},e.deinterleave3=function(t,e){return(t=1023&((t=4278190335&((t=251719695&((t=3272356035&((t=t>>>e&1227133513)|t>>>2))|t>>>4))|t>>>8))|t>>>16))<<22>>22},e.nextCombination=function(t){var e=t|t-1;return e+1|(~e&-~e)-1>>>r(t)+1}},6859:function(t,e,r){!function(t,e){\"use strict\";function n(t,e){if(!t)throw new Error(e||\"Assertion failed\")}function i(t,e){t.super_=e;var r=function(){};r.prototype=e.prototype,t.prototype=new r,t.prototype.constructor=t}function a(t,e,r){if(a.isBN(t))return t;this.negative=0,this.words=null,this.length=0,this.red=null,null!==t&&(\"le\"!==e&&\"be\"!==e||(r=e,e=10),this._init(t||0,e||10,r||\"be\"))}var o;\"object\"==typeof t?t.exports=a:e.BN=a,a.BN=a,a.wordSize=26;try{o=\"undefined\"!=typeof window&&void 0!==window.Buffer?window.Buffer:r(7790).Buffer}catch(t){}function s(t,e){var r=t.charCodeAt(e);return r>=65&&r<=70?r-55:r>=97&&r<=102?r-87:r-48&15}function l(t,e,r){var n=s(t,r);return r-1>=e&&(n|=s(t,r-1)<<4),n}function u(t,e,r,n){for(var i=0,a=Math.min(t.length,r),o=e;o=49?s-49+10:s>=17?s-17+10:s}return i}a.isBN=function(t){return t instanceof a||null!==t&&\"object\"==typeof t&&t.constructor.wordSize===a.wordSize&&Array.isArray(t.words)},a.max=function(t,e){return t.cmp(e)>0?t:e},a.min=function(t,e){return t.cmp(e)<0?t:e},a.prototype._init=function(t,e,r){if(\"number\"==typeof t)return this._initNumber(t,e,r);if(\"object\"==typeof t)return this._initArray(t,e,r);\"hex\"===e&&(e=16),n(e===(0|e)&&e>=2&&e<=36);var i=0;\"-\"===(t=t.toString().replace(/\\s+/g,\"\"))[0]&&(i++,this.negative=1),i=0;i-=3)o=t[i]|t[i-1]<<8|t[i-2]<<16,this.words[a]|=o<>>26-s&67108863,(s+=24)>=26&&(s-=26,a++);else if(\"le\"===r)for(i=0,a=0;i>>26-s&67108863,(s+=24)>=26&&(s-=26,a++);return this.strip()},a.prototype._parseHex=function(t,e,r){this.length=Math.ceil((t.length-e)/6),this.words=new Array(this.length);for(var n=0;n=e;n-=2)i=l(t,e,n)<=18?(a-=18,o+=1,this.words[o]|=i>>>26):a+=8;else for(n=(t.length-e)%2==0?e+1:e;n=18?(a-=18,o+=1,this.words[o]|=i>>>26):a+=8;this.strip()},a.prototype._parseBase=function(t,e,r){this.words=[0],this.length=1;for(var n=0,i=1;i<=67108863;i*=e)n++;n--,i=i/e|0;for(var a=t.length-r,o=a%n,s=Math.min(a,a-o)+r,l=0,c=r;c1&&0===this.words[this.length-1];)this.length--;return this._normSign()},a.prototype._normSign=function(){return 1===this.length&&0===this.words[0]&&(this.negative=0),this},a.prototype.inspect=function(){return(this.red?\"\"};var c=[\"\",\"0\",\"00\",\"000\",\"0000\",\"00000\",\"000000\",\"0000000\",\"00000000\",\"000000000\",\"0000000000\",\"00000000000\",\"000000000000\",\"0000000000000\",\"00000000000000\",\"000000000000000\",\"0000000000000000\",\"00000000000000000\",\"000000000000000000\",\"0000000000000000000\",\"00000000000000000000\",\"000000000000000000000\",\"0000000000000000000000\",\"00000000000000000000000\",\"000000000000000000000000\",\"0000000000000000000000000\"],f=[0,0,25,16,12,11,10,9,8,8,7,7,7,7,6,6,6,6,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5],h=[0,0,33554432,43046721,16777216,48828125,60466176,40353607,16777216,43046721,1e7,19487171,35831808,62748517,7529536,11390625,16777216,24137569,34012224,47045881,64e6,4084101,5153632,6436343,7962624,9765625,11881376,14348907,17210368,20511149,243e5,28629151,33554432,39135393,45435424,52521875,60466176];function p(t,e,r){r.negative=e.negative^t.negative;var n=t.length+e.length|0;r.length=n,n=n-1|0;var i=0|t.words[0],a=0|e.words[0],o=i*a,s=67108863&o,l=o/67108864|0;r.words[0]=s;for(var u=1;u>>26,f=67108863&l,h=Math.min(u,e.length-1),p=Math.max(0,u-t.length+1);p<=h;p++){var d=u-p|0;c+=(o=(i=0|t.words[d])*(a=0|e.words[p])+f)/67108864|0,f=67108863&o}r.words[u]=0|f,l=0|c}return 0!==l?r.words[u]=0|l:r.length--,r.strip()}a.prototype.toString=function(t,e){var r;if(e=0|e||1,16===(t=t||10)||\"hex\"===t){r=\"\";for(var i=0,a=0,o=0;o>>24-i&16777215)||o!==this.length-1?c[6-l.length]+l+r:l+r,(i+=2)>=26&&(i-=26,o--)}for(0!==a&&(r=a.toString(16)+r);r.length%e!=0;)r=\"0\"+r;return 0!==this.negative&&(r=\"-\"+r),r}if(t===(0|t)&&t>=2&&t<=36){var u=f[t],p=h[t];r=\"\";var d=this.clone();for(d.negative=0;!d.isZero();){var v=d.modn(p).toString(t);r=(d=d.idivn(p)).isZero()?v+r:c[u-v.length]+v+r}for(this.isZero()&&(r=\"0\"+r);r.length%e!=0;)r=\"0\"+r;return 0!==this.negative&&(r=\"-\"+r),r}n(!1,\"Base should be between 2 and 36\")},a.prototype.toNumber=function(){var t=this.words[0];return 2===this.length?t+=67108864*this.words[1]:3===this.length&&1===this.words[2]?t+=4503599627370496+67108864*this.words[1]:this.length>2&&n(!1,\"Number can only safely store up to 53 bits\"),0!==this.negative?-t:t},a.prototype.toJSON=function(){return this.toString(16)},a.prototype.toBuffer=function(t,e){return n(void 0!==o),this.toArrayLike(o,t,e)},a.prototype.toArray=function(t,e){return this.toArrayLike(Array,t,e)},a.prototype.toArrayLike=function(t,e,r){var i=this.byteLength(),a=r||Math.max(1,i);n(i<=a,\"byte array longer than desired length\"),n(a>0,\"Requested array length <= 0\"),this.strip();var o,s,l=\"le\"===e,u=new t(a),c=this.clone();if(l){for(s=0;!c.isZero();s++)o=c.andln(255),c.iushrn(8),u[s]=o;for(;s=4096&&(r+=13,e>>>=13),e>=64&&(r+=7,e>>>=7),e>=8&&(r+=4,e>>>=4),e>=2&&(r+=2,e>>>=2),r+e},a.prototype._zeroBits=function(t){if(0===t)return 26;var e=t,r=0;return 0==(8191&e)&&(r+=13,e>>>=13),0==(127&e)&&(r+=7,e>>>=7),0==(15&e)&&(r+=4,e>>>=4),0==(3&e)&&(r+=2,e>>>=2),0==(1&e)&&r++,r},a.prototype.bitLength=function(){var t=this.words[this.length-1],e=this._countBits(t);return 26*(this.length-1)+e},a.prototype.zeroBits=function(){if(this.isZero())return 0;for(var t=0,e=0;et.length?this.clone().ior(t):t.clone().ior(this)},a.prototype.uor=function(t){return this.length>t.length?this.clone().iuor(t):t.clone().iuor(this)},a.prototype.iuand=function(t){var e;e=this.length>t.length?t:this;for(var r=0;rt.length?this.clone().iand(t):t.clone().iand(this)},a.prototype.uand=function(t){return this.length>t.length?this.clone().iuand(t):t.clone().iuand(this)},a.prototype.iuxor=function(t){var e,r;this.length>t.length?(e=this,r=t):(e=t,r=this);for(var n=0;nt.length?this.clone().ixor(t):t.clone().ixor(this)},a.prototype.uxor=function(t){return this.length>t.length?this.clone().iuxor(t):t.clone().iuxor(this)},a.prototype.inotn=function(t){n(\"number\"==typeof t&&t>=0);var e=0|Math.ceil(t/26),r=t%26;this._expand(e),r>0&&e--;for(var i=0;i0&&(this.words[i]=~this.words[i]&67108863>>26-r),this.strip()},a.prototype.notn=function(t){return this.clone().inotn(t)},a.prototype.setn=function(t,e){n(\"number\"==typeof t&&t>=0);var r=t/26|0,i=t%26;return this._expand(r+1),this.words[r]=e?this.words[r]|1<t.length?(r=this,n=t):(r=t,n=this);for(var i=0,a=0;a>>26;for(;0!==i&&a>>26;if(this.length=r.length,0!==i)this.words[this.length]=i,this.length++;else if(r!==this)for(;at.length?this.clone().iadd(t):t.clone().iadd(this)},a.prototype.isub=function(t){if(0!==t.negative){t.negative=0;var e=this.iadd(t);return t.negative=1,e._normSign()}if(0!==this.negative)return this.negative=0,this.iadd(t),this.negative=1,this._normSign();var r,n,i=this.cmp(t);if(0===i)return this.negative=0,this.length=1,this.words[0]=0,this;i>0?(r=this,n=t):(r=t,n=this);for(var a=0,o=0;o>26,this.words[o]=67108863&e;for(;0!==a&&o>26,this.words[o]=67108863&e;if(0===a&&o>>13,p=0|o[1],d=8191&p,v=p>>>13,g=0|o[2],y=8191&g,m=g>>>13,x=0|o[3],b=8191&x,_=x>>>13,w=0|o[4],T=8191&w,k=w>>>13,A=0|o[5],M=8191&A,S=A>>>13,E=0|o[6],L=8191&E,C=E>>>13,P=0|o[7],O=8191&P,I=P>>>13,z=0|o[8],D=8191&z,R=z>>>13,F=0|o[9],B=8191&F,N=F>>>13,j=0|s[0],U=8191&j,V=j>>>13,q=0|s[1],H=8191&q,G=q>>>13,W=0|s[2],Y=8191&W,X=W>>>13,Z=0|s[3],K=8191&Z,J=Z>>>13,$=0|s[4],Q=8191&$,tt=$>>>13,et=0|s[5],rt=8191&et,nt=et>>>13,it=0|s[6],at=8191&it,ot=it>>>13,st=0|s[7],lt=8191&st,ut=st>>>13,ct=0|s[8],ft=8191&ct,ht=ct>>>13,pt=0|s[9],dt=8191&pt,vt=pt>>>13;r.negative=t.negative^e.negative,r.length=19;var gt=(u+(n=Math.imul(f,U))|0)+((8191&(i=(i=Math.imul(f,V))+Math.imul(h,U)|0))<<13)|0;u=((a=Math.imul(h,V))+(i>>>13)|0)+(gt>>>26)|0,gt&=67108863,n=Math.imul(d,U),i=(i=Math.imul(d,V))+Math.imul(v,U)|0,a=Math.imul(v,V);var yt=(u+(n=n+Math.imul(f,H)|0)|0)+((8191&(i=(i=i+Math.imul(f,G)|0)+Math.imul(h,H)|0))<<13)|0;u=((a=a+Math.imul(h,G)|0)+(i>>>13)|0)+(yt>>>26)|0,yt&=67108863,n=Math.imul(y,U),i=(i=Math.imul(y,V))+Math.imul(m,U)|0,a=Math.imul(m,V),n=n+Math.imul(d,H)|0,i=(i=i+Math.imul(d,G)|0)+Math.imul(v,H)|0,a=a+Math.imul(v,G)|0;var mt=(u+(n=n+Math.imul(f,Y)|0)|0)+((8191&(i=(i=i+Math.imul(f,X)|0)+Math.imul(h,Y)|0))<<13)|0;u=((a=a+Math.imul(h,X)|0)+(i>>>13)|0)+(mt>>>26)|0,mt&=67108863,n=Math.imul(b,U),i=(i=Math.imul(b,V))+Math.imul(_,U)|0,a=Math.imul(_,V),n=n+Math.imul(y,H)|0,i=(i=i+Math.imul(y,G)|0)+Math.imul(m,H)|0,a=a+Math.imul(m,G)|0,n=n+Math.imul(d,Y)|0,i=(i=i+Math.imul(d,X)|0)+Math.imul(v,Y)|0,a=a+Math.imul(v,X)|0;var xt=(u+(n=n+Math.imul(f,K)|0)|0)+((8191&(i=(i=i+Math.imul(f,J)|0)+Math.imul(h,K)|0))<<13)|0;u=((a=a+Math.imul(h,J)|0)+(i>>>13)|0)+(xt>>>26)|0,xt&=67108863,n=Math.imul(T,U),i=(i=Math.imul(T,V))+Math.imul(k,U)|0,a=Math.imul(k,V),n=n+Math.imul(b,H)|0,i=(i=i+Math.imul(b,G)|0)+Math.imul(_,H)|0,a=a+Math.imul(_,G)|0,n=n+Math.imul(y,Y)|0,i=(i=i+Math.imul(y,X)|0)+Math.imul(m,Y)|0,a=a+Math.imul(m,X)|0,n=n+Math.imul(d,K)|0,i=(i=i+Math.imul(d,J)|0)+Math.imul(v,K)|0,a=a+Math.imul(v,J)|0;var bt=(u+(n=n+Math.imul(f,Q)|0)|0)+((8191&(i=(i=i+Math.imul(f,tt)|0)+Math.imul(h,Q)|0))<<13)|0;u=((a=a+Math.imul(h,tt)|0)+(i>>>13)|0)+(bt>>>26)|0,bt&=67108863,n=Math.imul(M,U),i=(i=Math.imul(M,V))+Math.imul(S,U)|0,a=Math.imul(S,V),n=n+Math.imul(T,H)|0,i=(i=i+Math.imul(T,G)|0)+Math.imul(k,H)|0,a=a+Math.imul(k,G)|0,n=n+Math.imul(b,Y)|0,i=(i=i+Math.imul(b,X)|0)+Math.imul(_,Y)|0,a=a+Math.imul(_,X)|0,n=n+Math.imul(y,K)|0,i=(i=i+Math.imul(y,J)|0)+Math.imul(m,K)|0,a=a+Math.imul(m,J)|0,n=n+Math.imul(d,Q)|0,i=(i=i+Math.imul(d,tt)|0)+Math.imul(v,Q)|0,a=a+Math.imul(v,tt)|0;var _t=(u+(n=n+Math.imul(f,rt)|0)|0)+((8191&(i=(i=i+Math.imul(f,nt)|0)+Math.imul(h,rt)|0))<<13)|0;u=((a=a+Math.imul(h,nt)|0)+(i>>>13)|0)+(_t>>>26)|0,_t&=67108863,n=Math.imul(L,U),i=(i=Math.imul(L,V))+Math.imul(C,U)|0,a=Math.imul(C,V),n=n+Math.imul(M,H)|0,i=(i=i+Math.imul(M,G)|0)+Math.imul(S,H)|0,a=a+Math.imul(S,G)|0,n=n+Math.imul(T,Y)|0,i=(i=i+Math.imul(T,X)|0)+Math.imul(k,Y)|0,a=a+Math.imul(k,X)|0,n=n+Math.imul(b,K)|0,i=(i=i+Math.imul(b,J)|0)+Math.imul(_,K)|0,a=a+Math.imul(_,J)|0,n=n+Math.imul(y,Q)|0,i=(i=i+Math.imul(y,tt)|0)+Math.imul(m,Q)|0,a=a+Math.imul(m,tt)|0,n=n+Math.imul(d,rt)|0,i=(i=i+Math.imul(d,nt)|0)+Math.imul(v,rt)|0,a=a+Math.imul(v,nt)|0;var wt=(u+(n=n+Math.imul(f,at)|0)|0)+((8191&(i=(i=i+Math.imul(f,ot)|0)+Math.imul(h,at)|0))<<13)|0;u=((a=a+Math.imul(h,ot)|0)+(i>>>13)|0)+(wt>>>26)|0,wt&=67108863,n=Math.imul(O,U),i=(i=Math.imul(O,V))+Math.imul(I,U)|0,a=Math.imul(I,V),n=n+Math.imul(L,H)|0,i=(i=i+Math.imul(L,G)|0)+Math.imul(C,H)|0,a=a+Math.imul(C,G)|0,n=n+Math.imul(M,Y)|0,i=(i=i+Math.imul(M,X)|0)+Math.imul(S,Y)|0,a=a+Math.imul(S,X)|0,n=n+Math.imul(T,K)|0,i=(i=i+Math.imul(T,J)|0)+Math.imul(k,K)|0,a=a+Math.imul(k,J)|0,n=n+Math.imul(b,Q)|0,i=(i=i+Math.imul(b,tt)|0)+Math.imul(_,Q)|0,a=a+Math.imul(_,tt)|0,n=n+Math.imul(y,rt)|0,i=(i=i+Math.imul(y,nt)|0)+Math.imul(m,rt)|0,a=a+Math.imul(m,nt)|0,n=n+Math.imul(d,at)|0,i=(i=i+Math.imul(d,ot)|0)+Math.imul(v,at)|0,a=a+Math.imul(v,ot)|0;var Tt=(u+(n=n+Math.imul(f,lt)|0)|0)+((8191&(i=(i=i+Math.imul(f,ut)|0)+Math.imul(h,lt)|0))<<13)|0;u=((a=a+Math.imul(h,ut)|0)+(i>>>13)|0)+(Tt>>>26)|0,Tt&=67108863,n=Math.imul(D,U),i=(i=Math.imul(D,V))+Math.imul(R,U)|0,a=Math.imul(R,V),n=n+Math.imul(O,H)|0,i=(i=i+Math.imul(O,G)|0)+Math.imul(I,H)|0,a=a+Math.imul(I,G)|0,n=n+Math.imul(L,Y)|0,i=(i=i+Math.imul(L,X)|0)+Math.imul(C,Y)|0,a=a+Math.imul(C,X)|0,n=n+Math.imul(M,K)|0,i=(i=i+Math.imul(M,J)|0)+Math.imul(S,K)|0,a=a+Math.imul(S,J)|0,n=n+Math.imul(T,Q)|0,i=(i=i+Math.imul(T,tt)|0)+Math.imul(k,Q)|0,a=a+Math.imul(k,tt)|0,n=n+Math.imul(b,rt)|0,i=(i=i+Math.imul(b,nt)|0)+Math.imul(_,rt)|0,a=a+Math.imul(_,nt)|0,n=n+Math.imul(y,at)|0,i=(i=i+Math.imul(y,ot)|0)+Math.imul(m,at)|0,a=a+Math.imul(m,ot)|0,n=n+Math.imul(d,lt)|0,i=(i=i+Math.imul(d,ut)|0)+Math.imul(v,lt)|0,a=a+Math.imul(v,ut)|0;var kt=(u+(n=n+Math.imul(f,ft)|0)|0)+((8191&(i=(i=i+Math.imul(f,ht)|0)+Math.imul(h,ft)|0))<<13)|0;u=((a=a+Math.imul(h,ht)|0)+(i>>>13)|0)+(kt>>>26)|0,kt&=67108863,n=Math.imul(B,U),i=(i=Math.imul(B,V))+Math.imul(N,U)|0,a=Math.imul(N,V),n=n+Math.imul(D,H)|0,i=(i=i+Math.imul(D,G)|0)+Math.imul(R,H)|0,a=a+Math.imul(R,G)|0,n=n+Math.imul(O,Y)|0,i=(i=i+Math.imul(O,X)|0)+Math.imul(I,Y)|0,a=a+Math.imul(I,X)|0,n=n+Math.imul(L,K)|0,i=(i=i+Math.imul(L,J)|0)+Math.imul(C,K)|0,a=a+Math.imul(C,J)|0,n=n+Math.imul(M,Q)|0,i=(i=i+Math.imul(M,tt)|0)+Math.imul(S,Q)|0,a=a+Math.imul(S,tt)|0,n=n+Math.imul(T,rt)|0,i=(i=i+Math.imul(T,nt)|0)+Math.imul(k,rt)|0,a=a+Math.imul(k,nt)|0,n=n+Math.imul(b,at)|0,i=(i=i+Math.imul(b,ot)|0)+Math.imul(_,at)|0,a=a+Math.imul(_,ot)|0,n=n+Math.imul(y,lt)|0,i=(i=i+Math.imul(y,ut)|0)+Math.imul(m,lt)|0,a=a+Math.imul(m,ut)|0,n=n+Math.imul(d,ft)|0,i=(i=i+Math.imul(d,ht)|0)+Math.imul(v,ft)|0,a=a+Math.imul(v,ht)|0;var At=(u+(n=n+Math.imul(f,dt)|0)|0)+((8191&(i=(i=i+Math.imul(f,vt)|0)+Math.imul(h,dt)|0))<<13)|0;u=((a=a+Math.imul(h,vt)|0)+(i>>>13)|0)+(At>>>26)|0,At&=67108863,n=Math.imul(B,H),i=(i=Math.imul(B,G))+Math.imul(N,H)|0,a=Math.imul(N,G),n=n+Math.imul(D,Y)|0,i=(i=i+Math.imul(D,X)|0)+Math.imul(R,Y)|0,a=a+Math.imul(R,X)|0,n=n+Math.imul(O,K)|0,i=(i=i+Math.imul(O,J)|0)+Math.imul(I,K)|0,a=a+Math.imul(I,J)|0,n=n+Math.imul(L,Q)|0,i=(i=i+Math.imul(L,tt)|0)+Math.imul(C,Q)|0,a=a+Math.imul(C,tt)|0,n=n+Math.imul(M,rt)|0,i=(i=i+Math.imul(M,nt)|0)+Math.imul(S,rt)|0,a=a+Math.imul(S,nt)|0,n=n+Math.imul(T,at)|0,i=(i=i+Math.imul(T,ot)|0)+Math.imul(k,at)|0,a=a+Math.imul(k,ot)|0,n=n+Math.imul(b,lt)|0,i=(i=i+Math.imul(b,ut)|0)+Math.imul(_,lt)|0,a=a+Math.imul(_,ut)|0,n=n+Math.imul(y,ft)|0,i=(i=i+Math.imul(y,ht)|0)+Math.imul(m,ft)|0,a=a+Math.imul(m,ht)|0;var Mt=(u+(n=n+Math.imul(d,dt)|0)|0)+((8191&(i=(i=i+Math.imul(d,vt)|0)+Math.imul(v,dt)|0))<<13)|0;u=((a=a+Math.imul(v,vt)|0)+(i>>>13)|0)+(Mt>>>26)|0,Mt&=67108863,n=Math.imul(B,Y),i=(i=Math.imul(B,X))+Math.imul(N,Y)|0,a=Math.imul(N,X),n=n+Math.imul(D,K)|0,i=(i=i+Math.imul(D,J)|0)+Math.imul(R,K)|0,a=a+Math.imul(R,J)|0,n=n+Math.imul(O,Q)|0,i=(i=i+Math.imul(O,tt)|0)+Math.imul(I,Q)|0,a=a+Math.imul(I,tt)|0,n=n+Math.imul(L,rt)|0,i=(i=i+Math.imul(L,nt)|0)+Math.imul(C,rt)|0,a=a+Math.imul(C,nt)|0,n=n+Math.imul(M,at)|0,i=(i=i+Math.imul(M,ot)|0)+Math.imul(S,at)|0,a=a+Math.imul(S,ot)|0,n=n+Math.imul(T,lt)|0,i=(i=i+Math.imul(T,ut)|0)+Math.imul(k,lt)|0,a=a+Math.imul(k,ut)|0,n=n+Math.imul(b,ft)|0,i=(i=i+Math.imul(b,ht)|0)+Math.imul(_,ft)|0,a=a+Math.imul(_,ht)|0;var St=(u+(n=n+Math.imul(y,dt)|0)|0)+((8191&(i=(i=i+Math.imul(y,vt)|0)+Math.imul(m,dt)|0))<<13)|0;u=((a=a+Math.imul(m,vt)|0)+(i>>>13)|0)+(St>>>26)|0,St&=67108863,n=Math.imul(B,K),i=(i=Math.imul(B,J))+Math.imul(N,K)|0,a=Math.imul(N,J),n=n+Math.imul(D,Q)|0,i=(i=i+Math.imul(D,tt)|0)+Math.imul(R,Q)|0,a=a+Math.imul(R,tt)|0,n=n+Math.imul(O,rt)|0,i=(i=i+Math.imul(O,nt)|0)+Math.imul(I,rt)|0,a=a+Math.imul(I,nt)|0,n=n+Math.imul(L,at)|0,i=(i=i+Math.imul(L,ot)|0)+Math.imul(C,at)|0,a=a+Math.imul(C,ot)|0,n=n+Math.imul(M,lt)|0,i=(i=i+Math.imul(M,ut)|0)+Math.imul(S,lt)|0,a=a+Math.imul(S,ut)|0,n=n+Math.imul(T,ft)|0,i=(i=i+Math.imul(T,ht)|0)+Math.imul(k,ft)|0,a=a+Math.imul(k,ht)|0;var Et=(u+(n=n+Math.imul(b,dt)|0)|0)+((8191&(i=(i=i+Math.imul(b,vt)|0)+Math.imul(_,dt)|0))<<13)|0;u=((a=a+Math.imul(_,vt)|0)+(i>>>13)|0)+(Et>>>26)|0,Et&=67108863,n=Math.imul(B,Q),i=(i=Math.imul(B,tt))+Math.imul(N,Q)|0,a=Math.imul(N,tt),n=n+Math.imul(D,rt)|0,i=(i=i+Math.imul(D,nt)|0)+Math.imul(R,rt)|0,a=a+Math.imul(R,nt)|0,n=n+Math.imul(O,at)|0,i=(i=i+Math.imul(O,ot)|0)+Math.imul(I,at)|0,a=a+Math.imul(I,ot)|0,n=n+Math.imul(L,lt)|0,i=(i=i+Math.imul(L,ut)|0)+Math.imul(C,lt)|0,a=a+Math.imul(C,ut)|0,n=n+Math.imul(M,ft)|0,i=(i=i+Math.imul(M,ht)|0)+Math.imul(S,ft)|0,a=a+Math.imul(S,ht)|0;var Lt=(u+(n=n+Math.imul(T,dt)|0)|0)+((8191&(i=(i=i+Math.imul(T,vt)|0)+Math.imul(k,dt)|0))<<13)|0;u=((a=a+Math.imul(k,vt)|0)+(i>>>13)|0)+(Lt>>>26)|0,Lt&=67108863,n=Math.imul(B,rt),i=(i=Math.imul(B,nt))+Math.imul(N,rt)|0,a=Math.imul(N,nt),n=n+Math.imul(D,at)|0,i=(i=i+Math.imul(D,ot)|0)+Math.imul(R,at)|0,a=a+Math.imul(R,ot)|0,n=n+Math.imul(O,lt)|0,i=(i=i+Math.imul(O,ut)|0)+Math.imul(I,lt)|0,a=a+Math.imul(I,ut)|0,n=n+Math.imul(L,ft)|0,i=(i=i+Math.imul(L,ht)|0)+Math.imul(C,ft)|0,a=a+Math.imul(C,ht)|0;var Ct=(u+(n=n+Math.imul(M,dt)|0)|0)+((8191&(i=(i=i+Math.imul(M,vt)|0)+Math.imul(S,dt)|0))<<13)|0;u=((a=a+Math.imul(S,vt)|0)+(i>>>13)|0)+(Ct>>>26)|0,Ct&=67108863,n=Math.imul(B,at),i=(i=Math.imul(B,ot))+Math.imul(N,at)|0,a=Math.imul(N,ot),n=n+Math.imul(D,lt)|0,i=(i=i+Math.imul(D,ut)|0)+Math.imul(R,lt)|0,a=a+Math.imul(R,ut)|0,n=n+Math.imul(O,ft)|0,i=(i=i+Math.imul(O,ht)|0)+Math.imul(I,ft)|0,a=a+Math.imul(I,ht)|0;var Pt=(u+(n=n+Math.imul(L,dt)|0)|0)+((8191&(i=(i=i+Math.imul(L,vt)|0)+Math.imul(C,dt)|0))<<13)|0;u=((a=a+Math.imul(C,vt)|0)+(i>>>13)|0)+(Pt>>>26)|0,Pt&=67108863,n=Math.imul(B,lt),i=(i=Math.imul(B,ut))+Math.imul(N,lt)|0,a=Math.imul(N,ut),n=n+Math.imul(D,ft)|0,i=(i=i+Math.imul(D,ht)|0)+Math.imul(R,ft)|0,a=a+Math.imul(R,ht)|0;var Ot=(u+(n=n+Math.imul(O,dt)|0)|0)+((8191&(i=(i=i+Math.imul(O,vt)|0)+Math.imul(I,dt)|0))<<13)|0;u=((a=a+Math.imul(I,vt)|0)+(i>>>13)|0)+(Ot>>>26)|0,Ot&=67108863,n=Math.imul(B,ft),i=(i=Math.imul(B,ht))+Math.imul(N,ft)|0,a=Math.imul(N,ht);var It=(u+(n=n+Math.imul(D,dt)|0)|0)+((8191&(i=(i=i+Math.imul(D,vt)|0)+Math.imul(R,dt)|0))<<13)|0;u=((a=a+Math.imul(R,vt)|0)+(i>>>13)|0)+(It>>>26)|0,It&=67108863;var zt=(u+(n=Math.imul(B,dt))|0)+((8191&(i=(i=Math.imul(B,vt))+Math.imul(N,dt)|0))<<13)|0;return u=((a=Math.imul(N,vt))+(i>>>13)|0)+(zt>>>26)|0,zt&=67108863,l[0]=gt,l[1]=yt,l[2]=mt,l[3]=xt,l[4]=bt,l[5]=_t,l[6]=wt,l[7]=Tt,l[8]=kt,l[9]=At,l[10]=Mt,l[11]=St,l[12]=Et,l[13]=Lt,l[14]=Ct,l[15]=Pt,l[16]=Ot,l[17]=It,l[18]=zt,0!==u&&(l[19]=u,r.length++),r};function v(t,e,r){return(new g).mulp(t,e,r)}function g(t,e){this.x=t,this.y=e}Math.imul||(d=p),a.prototype.mulTo=function(t,e){var r,n=this.length+t.length;return r=10===this.length&&10===t.length?d(this,t,e):n<63?p(this,t,e):n<1024?function(t,e,r){r.negative=e.negative^t.negative,r.length=t.length+e.length;for(var n=0,i=0,a=0;a>>26)|0)>>>26,o&=67108863}r.words[a]=s,n=o,o=i}return 0!==n?r.words[a]=n:r.length--,r.strip()}(this,t,e):v(this,t,e),r},g.prototype.makeRBT=function(t){for(var e=new Array(t),r=a.prototype._countBits(t)-1,n=0;n>=1;return n},g.prototype.permute=function(t,e,r,n,i,a){for(var o=0;o>>=1)i++;return 1<>>=13,r[2*o+1]=8191&a,a>>>=13;for(o=2*e;o>=26,e+=i/67108864|0,e+=a>>>26,this.words[r]=67108863&a}return 0!==e&&(this.words[r]=e,this.length++),this},a.prototype.muln=function(t){return this.clone().imuln(t)},a.prototype.sqr=function(){return this.mul(this)},a.prototype.isqr=function(){return this.imul(this.clone())},a.prototype.pow=function(t){var e=function(t){for(var e=new Array(t.bitLength()),r=0;r>>i}return e}(t);if(0===e.length)return new a(1);for(var r=this,n=0;n=0);var e,r=t%26,i=(t-r)/26,a=67108863>>>26-r<<26-r;if(0!==r){var o=0;for(e=0;e>>26-r}o&&(this.words[e]=o,this.length++)}if(0!==i){for(e=this.length-1;e>=0;e--)this.words[e+i]=this.words[e];for(e=0;e=0),i=e?(e-e%26)/26:0;var a=t%26,o=Math.min((t-a)/26,this.length),s=67108863^67108863>>>a<o)for(this.length-=o,u=0;u=0&&(0!==c||u>=i);u--){var f=0|this.words[u];this.words[u]=c<<26-a|f>>>a,c=f&s}return l&&0!==c&&(l.words[l.length++]=c),0===this.length&&(this.words[0]=0,this.length=1),this.strip()},a.prototype.ishrn=function(t,e,r){return n(0===this.negative),this.iushrn(t,e,r)},a.prototype.shln=function(t){return this.clone().ishln(t)},a.prototype.ushln=function(t){return this.clone().iushln(t)},a.prototype.shrn=function(t){return this.clone().ishrn(t)},a.prototype.ushrn=function(t){return this.clone().iushrn(t)},a.prototype.testn=function(t){n(\"number\"==typeof t&&t>=0);var e=t%26,r=(t-e)/26,i=1<=0);var e=t%26,r=(t-e)/26;if(n(0===this.negative,\"imaskn works only with positive numbers\"),this.length<=r)return this;if(0!==e&&r++,this.length=Math.min(r,this.length),0!==e){var i=67108863^67108863>>>e<=67108864;e++)this.words[e]-=67108864,e===this.length-1?this.words[e+1]=1:this.words[e+1]++;return this.length=Math.max(this.length,e+1),this},a.prototype.isubn=function(t){if(n(\"number\"==typeof t),n(t<67108864),t<0)return this.iaddn(-t);if(0!==this.negative)return this.negative=0,this.iaddn(t),this.negative=1,this;if(this.words[0]-=t,1===this.length&&this.words[0]<0)this.words[0]=-this.words[0],this.negative=1;else for(var e=0;e>26)-(l/67108864|0),this.words[i+r]=67108863&a}for(;i>26,this.words[i+r]=67108863&a;if(0===s)return this.strip();for(n(-1===s),s=0,i=0;i>26,this.words[i]=67108863&a;return this.negative=1,this.strip()},a.prototype._wordDiv=function(t,e){var r=(this.length,t.length),n=this.clone(),i=t,o=0|i.words[i.length-1];0!=(r=26-this._countBits(o))&&(i=i.ushln(r),n.iushln(r),o=0|i.words[i.length-1]);var s,l=n.length-i.length;if(\"mod\"!==e){(s=new a(null)).length=l+1,s.words=new Array(s.length);for(var u=0;u=0;f--){var h=67108864*(0|n.words[i.length+f])+(0|n.words[i.length+f-1]);for(h=Math.min(h/o|0,67108863),n._ishlnsubmul(i,h,f);0!==n.negative;)h--,n.negative=0,n._ishlnsubmul(i,1,f),n.isZero()||(n.negative^=1);s&&(s.words[f]=h)}return s&&s.strip(),n.strip(),\"div\"!==e&&0!==r&&n.iushrn(r),{div:s||null,mod:n}},a.prototype.divmod=function(t,e,r){return n(!t.isZero()),this.isZero()?{div:new a(0),mod:new a(0)}:0!==this.negative&&0===t.negative?(s=this.neg().divmod(t,e),\"mod\"!==e&&(i=s.div.neg()),\"div\"!==e&&(o=s.mod.neg(),r&&0!==o.negative&&o.iadd(t)),{div:i,mod:o}):0===this.negative&&0!==t.negative?(s=this.divmod(t.neg(),e),\"mod\"!==e&&(i=s.div.neg()),{div:i,mod:s.mod}):0!=(this.negative&t.negative)?(s=this.neg().divmod(t.neg(),e),\"div\"!==e&&(o=s.mod.neg(),r&&0!==o.negative&&o.isub(t)),{div:s.div,mod:o}):t.length>this.length||this.cmp(t)<0?{div:new a(0),mod:this}:1===t.length?\"div\"===e?{div:this.divn(t.words[0]),mod:null}:\"mod\"===e?{div:null,mod:new a(this.modn(t.words[0]))}:{div:this.divn(t.words[0]),mod:new a(this.modn(t.words[0]))}:this._wordDiv(t,e);var i,o,s},a.prototype.div=function(t){return this.divmod(t,\"div\",!1).div},a.prototype.mod=function(t){return this.divmod(t,\"mod\",!1).mod},a.prototype.umod=function(t){return this.divmod(t,\"mod\",!0).mod},a.prototype.divRound=function(t){var e=this.divmod(t);if(e.mod.isZero())return e.div;var r=0!==e.div.negative?e.mod.isub(t):e.mod,n=t.ushrn(1),i=t.andln(1),a=r.cmp(n);return a<0||1===i&&0===a?e.div:0!==e.div.negative?e.div.isubn(1):e.div.iaddn(1)},a.prototype.modn=function(t){n(t<=67108863);for(var e=(1<<26)%t,r=0,i=this.length-1;i>=0;i--)r=(e*r+(0|this.words[i]))%t;return r},a.prototype.idivn=function(t){n(t<=67108863);for(var e=0,r=this.length-1;r>=0;r--){var i=(0|this.words[r])+67108864*e;this.words[r]=i/t|0,e=i%t}return this.strip()},a.prototype.divn=function(t){return this.clone().idivn(t)},a.prototype.egcd=function(t){n(0===t.negative),n(!t.isZero());var e=this,r=t.clone();e=0!==e.negative?e.umod(t):e.clone();for(var i=new a(1),o=new a(0),s=new a(0),l=new a(1),u=0;e.isEven()&&r.isEven();)e.iushrn(1),r.iushrn(1),++u;for(var c=r.clone(),f=e.clone();!e.isZero();){for(var h=0,p=1;0==(e.words[0]&p)&&h<26;++h,p<<=1);if(h>0)for(e.iushrn(h);h-- >0;)(i.isOdd()||o.isOdd())&&(i.iadd(c),o.isub(f)),i.iushrn(1),o.iushrn(1);for(var d=0,v=1;0==(r.words[0]&v)&&d<26;++d,v<<=1);if(d>0)for(r.iushrn(d);d-- >0;)(s.isOdd()||l.isOdd())&&(s.iadd(c),l.isub(f)),s.iushrn(1),l.iushrn(1);e.cmp(r)>=0?(e.isub(r),i.isub(s),o.isub(l)):(r.isub(e),s.isub(i),l.isub(o))}return{a:s,b:l,gcd:r.iushln(u)}},a.prototype._invmp=function(t){n(0===t.negative),n(!t.isZero());var e=this,r=t.clone();e=0!==e.negative?e.umod(t):e.clone();for(var i,o=new a(1),s=new a(0),l=r.clone();e.cmpn(1)>0&&r.cmpn(1)>0;){for(var u=0,c=1;0==(e.words[0]&c)&&u<26;++u,c<<=1);if(u>0)for(e.iushrn(u);u-- >0;)o.isOdd()&&o.iadd(l),o.iushrn(1);for(var f=0,h=1;0==(r.words[0]&h)&&f<26;++f,h<<=1);if(f>0)for(r.iushrn(f);f-- >0;)s.isOdd()&&s.iadd(l),s.iushrn(1);e.cmp(r)>=0?(e.isub(r),o.isub(s)):(r.isub(e),s.isub(o))}return(i=0===e.cmpn(1)?o:s).cmpn(0)<0&&i.iadd(t),i},a.prototype.gcd=function(t){if(this.isZero())return t.abs();if(t.isZero())return this.abs();var e=this.clone(),r=t.clone();e.negative=0,r.negative=0;for(var n=0;e.isEven()&&r.isEven();n++)e.iushrn(1),r.iushrn(1);for(;;){for(;e.isEven();)e.iushrn(1);for(;r.isEven();)r.iushrn(1);var i=e.cmp(r);if(i<0){var a=e;e=r,r=a}else if(0===i||0===r.cmpn(1))break;e.isub(r)}return r.iushln(n)},a.prototype.invm=function(t){return this.egcd(t).a.umod(t)},a.prototype.isEven=function(){return 0==(1&this.words[0])},a.prototype.isOdd=function(){return 1==(1&this.words[0])},a.prototype.andln=function(t){return this.words[0]&t},a.prototype.bincn=function(t){n(\"number\"==typeof t);var e=t%26,r=(t-e)/26,i=1<>>26,s&=67108863,this.words[o]=s}return 0!==a&&(this.words[o]=a,this.length++),this},a.prototype.isZero=function(){return 1===this.length&&0===this.words[0]},a.prototype.cmpn=function(t){var e,r=t<0;if(0!==this.negative&&!r)return-1;if(0===this.negative&&r)return 1;if(this.strip(),this.length>1)e=1;else{r&&(t=-t),n(t<=67108863,\"Number is too big\");var i=0|this.words[0];e=i===t?0:it.length)return 1;if(this.length=0;r--){var n=0|this.words[r],i=0|t.words[r];if(n!==i){ni&&(e=1);break}}return e},a.prototype.gtn=function(t){return 1===this.cmpn(t)},a.prototype.gt=function(t){return 1===this.cmp(t)},a.prototype.gten=function(t){return this.cmpn(t)>=0},a.prototype.gte=function(t){return this.cmp(t)>=0},a.prototype.ltn=function(t){return-1===this.cmpn(t)},a.prototype.lt=function(t){return-1===this.cmp(t)},a.prototype.lten=function(t){return this.cmpn(t)<=0},a.prototype.lte=function(t){return this.cmp(t)<=0},a.prototype.eqn=function(t){return 0===this.cmpn(t)},a.prototype.eq=function(t){return 0===this.cmp(t)},a.red=function(t){return new T(t)},a.prototype.toRed=function(t){return n(!this.red,\"Already a number in reduction context\"),n(0===this.negative,\"red works only with positives\"),t.convertTo(this)._forceRed(t)},a.prototype.fromRed=function(){return n(this.red,\"fromRed works only with numbers in reduction context\"),this.red.convertFrom(this)},a.prototype._forceRed=function(t){return this.red=t,this},a.prototype.forceRed=function(t){return n(!this.red,\"Already a number in reduction context\"),this._forceRed(t)},a.prototype.redAdd=function(t){return n(this.red,\"redAdd works only with red numbers\"),this.red.add(this,t)},a.prototype.redIAdd=function(t){return n(this.red,\"redIAdd works only with red numbers\"),this.red.iadd(this,t)},a.prototype.redSub=function(t){return n(this.red,\"redSub works only with red numbers\"),this.red.sub(this,t)},a.prototype.redISub=function(t){return n(this.red,\"redISub works only with red numbers\"),this.red.isub(this,t)},a.prototype.redShl=function(t){return n(this.red,\"redShl works only with red numbers\"),this.red.shl(this,t)},a.prototype.redMul=function(t){return n(this.red,\"redMul works only with red numbers\"),this.red._verify2(this,t),this.red.mul(this,t)},a.prototype.redIMul=function(t){return n(this.red,\"redMul works only with red numbers\"),this.red._verify2(this,t),this.red.imul(this,t)},a.prototype.redSqr=function(){return n(this.red,\"redSqr works only with red numbers\"),this.red._verify1(this),this.red.sqr(this)},a.prototype.redISqr=function(){return n(this.red,\"redISqr works only with red numbers\"),this.red._verify1(this),this.red.isqr(this)},a.prototype.redSqrt=function(){return n(this.red,\"redSqrt works only with red numbers\"),this.red._verify1(this),this.red.sqrt(this)},a.prototype.redInvm=function(){return n(this.red,\"redInvm works only with red numbers\"),this.red._verify1(this),this.red.invm(this)},a.prototype.redNeg=function(){return n(this.red,\"redNeg works only with red numbers\"),this.red._verify1(this),this.red.neg(this)},a.prototype.redPow=function(t){return n(this.red&&!t.red,\"redPow(normalNum)\"),this.red._verify1(this),this.red.pow(this,t)};var y={k256:null,p224:null,p192:null,p25519:null};function m(t,e){this.name=t,this.p=new a(e,16),this.n=this.p.bitLength(),this.k=new a(1).iushln(this.n).isub(this.p),this.tmp=this._tmp()}function x(){m.call(this,\"k256\",\"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f\")}function b(){m.call(this,\"p224\",\"ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001\")}function _(){m.call(this,\"p192\",\"ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff\")}function w(){m.call(this,\"25519\",\"7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed\")}function T(t){if(\"string\"==typeof t){var e=a._prime(t);this.m=e.p,this.prime=e}else n(t.gtn(1),\"modulus must be greater than 1\"),this.m=t,this.prime=null}function k(t){T.call(this,t),this.shift=this.m.bitLength(),this.shift%26!=0&&(this.shift+=26-this.shift%26),this.r=new a(1).iushln(this.shift),this.r2=this.imod(this.r.sqr()),this.rinv=this.r._invmp(this.m),this.minv=this.rinv.mul(this.r).isubn(1).div(this.m),this.minv=this.minv.umod(this.r),this.minv=this.r.sub(this.minv)}m.prototype._tmp=function(){var t=new a(null);return t.words=new Array(Math.ceil(this.n/13)),t},m.prototype.ireduce=function(t){var e,r=t;do{this.split(r,this.tmp),e=(r=(r=this.imulK(r)).iadd(this.tmp)).bitLength()}while(e>this.n);var n=e0?r.isub(this.p):void 0!==r.strip?r.strip():r._strip(),r},m.prototype.split=function(t,e){t.iushrn(this.n,0,e)},m.prototype.imulK=function(t){return t.imul(this.k)},i(x,m),x.prototype.split=function(t,e){for(var r=4194303,n=Math.min(t.length,9),i=0;i>>22,a=o}a>>>=22,t.words[i-10]=a,0===a&&t.length>10?t.length-=10:t.length-=9},x.prototype.imulK=function(t){t.words[t.length]=0,t.words[t.length+1]=0,t.length+=2;for(var e=0,r=0;r>>=26,t.words[r]=i,e=n}return 0!==e&&(t.words[t.length++]=e),t},a._prime=function(t){if(y[t])return y[t];var e;if(\"k256\"===t)e=new x;else if(\"p224\"===t)e=new b;else if(\"p192\"===t)e=new _;else{if(\"p25519\"!==t)throw new Error(\"Unknown prime \"+t);e=new w}return y[t]=e,e},T.prototype._verify1=function(t){n(0===t.negative,\"red works only with positives\"),n(t.red,\"red works only with red numbers\")},T.prototype._verify2=function(t,e){n(0==(t.negative|e.negative),\"red works only with positives\"),n(t.red&&t.red===e.red,\"red works only with red numbers\")},T.prototype.imod=function(t){return this.prime?this.prime.ireduce(t)._forceRed(this):t.umod(this.m)._forceRed(this)},T.prototype.neg=function(t){return t.isZero()?t.clone():this.m.sub(t)._forceRed(this)},T.prototype.add=function(t,e){this._verify2(t,e);var r=t.add(e);return r.cmp(this.m)>=0&&r.isub(this.m),r._forceRed(this)},T.prototype.iadd=function(t,e){this._verify2(t,e);var r=t.iadd(e);return r.cmp(this.m)>=0&&r.isub(this.m),r},T.prototype.sub=function(t,e){this._verify2(t,e);var r=t.sub(e);return r.cmpn(0)<0&&r.iadd(this.m),r._forceRed(this)},T.prototype.isub=function(t,e){this._verify2(t,e);var r=t.isub(e);return r.cmpn(0)<0&&r.iadd(this.m),r},T.prototype.shl=function(t,e){return this._verify1(t),this.imod(t.ushln(e))},T.prototype.imul=function(t,e){return this._verify2(t,e),this.imod(t.imul(e))},T.prototype.mul=function(t,e){return this._verify2(t,e),this.imod(t.mul(e))},T.prototype.isqr=function(t){return this.imul(t,t.clone())},T.prototype.sqr=function(t){return this.mul(t,t)},T.prototype.sqrt=function(t){if(t.isZero())return t.clone();var e=this.m.andln(3);if(n(e%2==1),3===e){var r=this.m.add(new a(1)).iushrn(2);return this.pow(t,r)}for(var i=this.m.subn(1),o=0;!i.isZero()&&0===i.andln(1);)o++,i.iushrn(1);n(!i.isZero());var s=new a(1).toRed(this),l=s.redNeg(),u=this.m.subn(1).iushrn(1),c=this.m.bitLength();for(c=new a(2*c*c).toRed(this);0!==this.pow(c,u).cmp(l);)c.redIAdd(l);for(var f=this.pow(c,i),h=this.pow(t,i.addn(1).iushrn(1)),p=this.pow(t,i),d=o;0!==p.cmp(s);){for(var v=p,g=0;0!==v.cmp(s);g++)v=v.redSqr();n(g=0;n--){for(var u=e.words[n],c=l-1;c>=0;c--){var f=u>>c&1;i!==r[0]&&(i=this.sqr(i)),0!==f||0!==o?(o<<=1,o|=f,(4==++s||0===n&&0===c)&&(i=this.mul(i,r[o]),s=0,o=0)):s=0}l=26}return i},T.prototype.convertTo=function(t){var e=t.umod(this.m);return e===t?e.clone():e},T.prototype.convertFrom=function(t){var e=t.clone();return e.red=null,e},a.mont=function(t){return new k(t)},i(k,T),k.prototype.convertTo=function(t){return this.imod(t.ushln(this.shift))},k.prototype.convertFrom=function(t){var e=this.imod(t.mul(this.rinv));return e.red=null,e},k.prototype.imul=function(t,e){if(t.isZero()||e.isZero())return t.words[0]=0,t.length=1,t;var r=t.imul(e),n=r.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),i=r.isub(n).iushrn(this.shift),a=i;return i.cmp(this.m)>=0?a=i.isub(this.m):i.cmpn(0)<0&&(a=i.iadd(this.m)),a._forceRed(this)},k.prototype.mul=function(t,e){if(t.isZero()||e.isZero())return new a(0)._forceRed(this);var r=t.mul(e),n=r.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),i=r.isub(n).iushrn(this.shift),o=i;return i.cmp(this.m)>=0?o=i.isub(this.m):i.cmpn(0)<0&&(o=i.iadd(this.m)),o._forceRed(this)},k.prototype.invm=function(t){return this.imod(t._invmp(this.m).mul(this.r2))._forceRed(this)}}(t=r.nmd(t),this)},6204:function(t){\"use strict\";t.exports=function(t){var e,r,n,i=t.length,a=0;for(e=0;e>>1;if(!(c<=0)){var f,h=i.mallocDouble(2*c*s),p=i.mallocInt32(s);if((s=l(t,c,h,p))>0){if(1===c&&n)a.init(s),f=a.sweepComplete(c,r,0,s,h,p,0,s,h,p);else{var d=i.mallocDouble(2*c*u),v=i.mallocInt32(u);(u=l(e,c,d,v))>0&&(a.init(s+u),f=1===c?a.sweepBipartite(c,r,0,s,h,p,0,u,d,v):o(c,r,n,s,h,p,u,d,v),i.free(d),i.free(v))}i.free(h),i.free(p)}return f}}}function c(t,e){n.push([t,e])}},2455:function(t,e){\"use strict\";function r(t){return t?function(t,e,r,n,i,a,o,s,l,u,c){return i-n>l-s?function(t,e,r,n,i,a,o,s,l,u,c){for(var f=2*t,h=n,p=f*n;hu-l?n?function(t,e,r,n,i,a,o,s,l,u,c){for(var f=2*t,h=n,p=f*n;h0;){var z=(O-=1)*b,D=w[z],R=w[z+1],F=w[z+2],B=w[z+3],N=w[z+4],j=w[z+5],U=O*_,V=T[U],q=T[U+1],H=1&j,G=!!(16&j),W=c,Y=S,X=L,Z=C;if(H&&(W=L,Y=C,X=c,Z=S),!(2&j&&R>=(F=g(t,D,R,F,W,Y,q))||4&j&&(R=y(t,D,R,F,W,Y,V))>=F)){var K=F-R,J=N-B;if(G){if(t*K*(K+J)=p0)&&!(p1>=hi)\"),v=c(\"lo===p0\"),g=c(\"lo>>1,h=2*t,p=f,d=s[h*f+e];u=x?(p=m,d=x):y>=_?(p=g,d=y):(p=b,d=_):x>=_?(p=m,d=x):_>=y?(p=g,d=y):(p=b,d=_);for(var w=h*(c-1),T=h*p,k=0;kr&&i[f+e]>u;--c,f-=o){for(var h=f,p=f+o,d=0;dh;++h,l+=s)if(i[l+f]===o)if(c===h)c+=1,u+=s;else{for(var p=0;s>p;++p){var d=i[l+p];i[l+p]=i[u],i[u++]=d}var v=a[h];a[h]=a[c],a[c++]=v}return c},\"loh;++h,l+=s)if(i[l+f]p;++p){var d=i[l+p];i[l+p]=i[u],i[u++]=d}var v=a[h];a[h]=a[c],a[c++]=v}return c},\"lo<=p0\":function(t,e,r,n,i,a,o){for(var s=2*t,l=s*r,u=l,c=r,f=t+e,h=r;n>h;++h,l+=s)if(i[l+f]<=o)if(c===h)c+=1,u+=s;else{for(var p=0;s>p;++p){var d=i[l+p];i[l+p]=i[u],i[u++]=d}var v=a[h];a[h]=a[c],a[c++]=v}return c},\"hi<=p0\":function(t,e,r,n,i,a,o){for(var s=2*t,l=s*r,u=l,c=r,f=t+e,h=r;n>h;++h,l+=s)if(i[l+f]<=o)if(c===h)c+=1,u+=s;else{for(var p=0;s>p;++p){var d=i[l+p];i[l+p]=i[u],i[u++]=d}var v=a[h];a[h]=a[c],a[c++]=v}return c},\"lop;++p,l+=s){var d=i[l+f],v=i[l+h];if(dg;++g){var y=i[l+g];i[l+g]=i[u],i[u++]=y}var m=a[p];a[p]=a[c],a[c++]=m}}return c},\"lo<=p0&&p0<=hi\":function(t,e,r,n,i,a,o){for(var s=2*t,l=s*r,u=l,c=r,f=e,h=t+e,p=r;n>p;++p,l+=s){var d=i[l+f],v=i[l+h];if(d<=o&&o<=v)if(c===p)c+=1,u+=s;else{for(var g=0;s>g;++g){var y=i[l+g];i[l+g]=i[u],i[u++]=y}var m=a[p];a[p]=a[c],a[c++]=m}}return c},\"!(lo>=p0)&&!(p1>=hi)\":function(t,e,r,n,i,a,o,s){for(var l=2*t,u=l*r,c=u,f=r,h=e,p=t+e,d=r;n>d;++d,u+=l){var v=i[u+h],g=i[u+p];if(!(v>=o||s>=g))if(f===d)f+=1,c+=l;else{for(var y=0;l>y;++y){var m=i[u+y];i[u+y]=i[c],i[c++]=m}var x=a[d];a[d]=a[f],a[f++]=x}}return f}}},1811:function(t){\"use strict\";t.exports=function(t,n){n<=4*e?r(0,n-1,t):u(0,n-1,t)};var e=32;function r(t,e,r){for(var n=2*(t+1),i=t+1;i<=e;++i){for(var a=r[n++],o=r[n++],s=i,l=n-2;s-- >t;){var u=r[l-2],c=r[l-1];if(ur[e+1])}function l(t,e,r,n){var i=n[t*=2];return i>1,g=v-h,y=v+h,m=p,x=g,b=v,_=y,w=d,T=t+1,k=c-1,A=0;s(m,x,f)&&(A=m,m=x,x=A),s(_,w,f)&&(A=_,_=w,w=A),s(m,b,f)&&(A=m,m=b,b=A),s(x,b,f)&&(A=x,x=b,b=A),s(m,_,f)&&(A=m,m=_,_=A),s(b,_,f)&&(A=b,b=_,_=A),s(x,w,f)&&(A=x,x=w,w=A),s(x,b,f)&&(A=x,x=b,b=A),s(_,w,f)&&(A=_,_=w,w=A);for(var M=f[2*x],S=f[2*x+1],E=f[2*_],L=f[2*_+1],C=2*m,P=2*b,O=2*w,I=2*p,z=2*v,D=2*d,R=0;R<2;++R){var F=f[C+R],B=f[P+R],N=f[O+R];f[I+R]=F,f[z+R]=B,f[D+R]=N}i(g,t,f),i(y,c,f);for(var j=T;j<=k;++j)if(l(j,M,S,f))j!==T&&n(j,T,f),++T;else if(!l(j,E,L,f))for(;;){if(l(k,E,L,f)){l(k,M,S,f)?(a(j,T,k,f),++T,--k):(n(j,k,f),--k);break}if(--k>>1;a(d,S);var E=0,L=0;for(T=0;T=o)v(c,f,L--,C=C-o|0);else if(C>=0)v(l,u,E--,C);else if(C<=-o){C=-C-o|0;for(var P=0;P>>1;a(d,E);var L=0,C=0,P=0;for(k=0;k>1==d[2*k+3]>>1&&(I=2,k+=1),O<0){for(var z=-(O>>1)-1,D=0;D>1)-1,0===I?v(l,u,L--,z):1===I?v(c,f,C--,z):2===I&&v(h,p,P--,z)}},scanBipartite:function(t,e,r,n,i,s,c,f,h,p,y,m){var x=0,b=2*t,_=e,w=e+t,T=1,k=1;n?k=o:T=o;for(var A=i;A>>1;a(d,L);var C=0;for(A=0;A=o?(O=!n,M-=o):(O=!!n,M-=1),O)g(l,u,C++,M);else{var I=m[M],z=b*M,D=y[z+e+1],R=y[z+e+1+t];t:for(var F=0;F>>1;a(d,T);var k=0;for(x=0;x=o)l[k++]=b-o;else{var M=p[b-=1],S=g*b,E=h[S+e+1],L=h[S+e+1+t];t:for(var C=0;C=0;--C)if(l[C]===b){for(z=C+1;z0;){for(var p=r.pop(),d=(c=-1,f=-1,l=o[s=r.pop()],1);d=0||(e.flip(s,p),i(t,e,r,c,s,f),i(t,e,r,s,f,c),i(t,e,r,f,p,c),i(t,e,r,p,c,f))}}},5023:function(t,e,r){\"use strict\";var n,i=r(2478);function a(t,e,r,n,i,a,o){this.cells=t,this.neighbor=e,this.flags=n,this.constraint=r,this.active=i,this.next=a,this.boundary=o}function o(t,e){return t[0]-e[0]||t[1]-e[1]||t[2]-e[2]}t.exports=function(t,e,r){var n=function(t,e){for(var r=t.cells(),n=r.length,i=0;i0||l.length>0;){for(;s.length>0;){var p=s.pop();if(u[p]!==-i){u[p]=i,c[p];for(var d=0;d<3;++d){var v=h[3*p+d];v>=0&&0===u[v]&&(f[3*p+d]?l.push(v):(s.push(v),u[v]=i))}}}var g=l;l=s,s=g,l.length=0,i=-i}var y=function(t,e,r){for(var n=0,i=0;i1&&i(r[h[p-2]],r[h[p-1]],a)>0;)t.push([h[p-1],h[p-2],o]),p-=1;h.length=p,h.push(o);var d=f.upperIds;for(p=d.length;p>1&&i(r[d[p-2]],r[d[p-1]],a)<0;)t.push([d[p-2],d[p-1],o]),p-=1;d.length=p,d.push(o)}}function c(t,e){var r;return(r=t.a[0]d[0]&&i.push(new o(d,p,2,l),new o(p,d,1,l))}i.sort(s);for(var v=i[0].a[0]-(1+Math.abs(i[0].a[0]))*Math.pow(2,-52),g=[new a([v,1],[v,0],-1,[],[],[],[])],y=[],m=(l=0,i.length);l=0}}(),a.removeTriangle=function(t,e,r){var n=this.stars;o(n[t],e,r),o(n[e],r,t),o(n[r],t,e)},a.addTriangle=function(t,e,r){var n=this.stars;n[t].push(e,r),n[e].push(r,t),n[r].push(t,e)},a.opposite=function(t,e){for(var r=this.stars[e],n=1,i=r.length;ne[2]?1:0)}function y(t,e,r){if(0!==t.length){if(e)for(var n=0;n=0;--a){var x=e[c=(S=n[a])[0]],b=x[0],_=x[1],w=t[b],T=t[_];if((w[0]-T[0]||w[1]-T[1])<0){var k=b;b=_,_=k}x[0]=b;var A,M=x[1]=S[1];for(i&&(A=x[2]);a>0&&n[a-1][0]===c;){var S,E=(S=n[--a])[1];i?e.push([M,E,A]):e.push([M,E]),M=E}i?e.push([M,_,A]):e.push([M,_])}return h}(t,e,h,v,r),m=d(t,g);return y(e,m,r),!!m||h.length>0||v.length>0}},3637:function(t,e,r){\"use strict\";t.exports=function(t,e,r,n){var a=s(e,t),f=s(n,r),h=c(a,f);if(0===o(h))return null;var p=c(f,s(t,r)),d=i(p,h),v=u(a,d);return l(t,v)};var n=r(6504),i=r(8697),a=r(5572),o=r(7721),s=r(544),l=r(2653),u=r(8987);function c(t,e){return a(n(t[0],e[1]),n(t[1],e[0]))}},3642:function(t){t.exports={jet:[{index:0,rgb:[0,0,131]},{index:.125,rgb:[0,60,170]},{index:.375,rgb:[5,255,255]},{index:.625,rgb:[255,255,0]},{index:.875,rgb:[250,0,0]},{index:1,rgb:[128,0,0]}],hsv:[{index:0,rgb:[255,0,0]},{index:.169,rgb:[253,255,2]},{index:.173,rgb:[247,255,2]},{index:.337,rgb:[0,252,4]},{index:.341,rgb:[0,252,10]},{index:.506,rgb:[1,249,255]},{index:.671,rgb:[2,0,253]},{index:.675,rgb:[8,0,253]},{index:.839,rgb:[255,0,251]},{index:.843,rgb:[255,0,245]},{index:1,rgb:[255,0,6]}],hot:[{index:0,rgb:[0,0,0]},{index:.3,rgb:[230,0,0]},{index:.6,rgb:[255,210,0]},{index:1,rgb:[255,255,255]}],spring:[{index:0,rgb:[255,0,255]},{index:1,rgb:[255,255,0]}],summer:[{index:0,rgb:[0,128,102]},{index:1,rgb:[255,255,102]}],autumn:[{index:0,rgb:[255,0,0]},{index:1,rgb:[255,255,0]}],winter:[{index:0,rgb:[0,0,255]},{index:1,rgb:[0,255,128]}],bone:[{index:0,rgb:[0,0,0]},{index:.376,rgb:[84,84,116]},{index:.753,rgb:[169,200,200]},{index:1,rgb:[255,255,255]}],copper:[{index:0,rgb:[0,0,0]},{index:.804,rgb:[255,160,102]},{index:1,rgb:[255,199,127]}],greys:[{index:0,rgb:[0,0,0]},{index:1,rgb:[255,255,255]}],yignbu:[{index:0,rgb:[8,29,88]},{index:.125,rgb:[37,52,148]},{index:.25,rgb:[34,94,168]},{index:.375,rgb:[29,145,192]},{index:.5,rgb:[65,182,196]},{index:.625,rgb:[127,205,187]},{index:.75,rgb:[199,233,180]},{index:.875,rgb:[237,248,217]},{index:1,rgb:[255,255,217]}],greens:[{index:0,rgb:[0,68,27]},{index:.125,rgb:[0,109,44]},{index:.25,rgb:[35,139,69]},{index:.375,rgb:[65,171,93]},{index:.5,rgb:[116,196,118]},{index:.625,rgb:[161,217,155]},{index:.75,rgb:[199,233,192]},{index:.875,rgb:[229,245,224]},{index:1,rgb:[247,252,245]}],yiorrd:[{index:0,rgb:[128,0,38]},{index:.125,rgb:[189,0,38]},{index:.25,rgb:[227,26,28]},{index:.375,rgb:[252,78,42]},{index:.5,rgb:[253,141,60]},{index:.625,rgb:[254,178,76]},{index:.75,rgb:[254,217,118]},{index:.875,rgb:[255,237,160]},{index:1,rgb:[255,255,204]}],bluered:[{index:0,rgb:[0,0,255]},{index:1,rgb:[255,0,0]}],rdbu:[{index:0,rgb:[5,10,172]},{index:.35,rgb:[106,137,247]},{index:.5,rgb:[190,190,190]},{index:.6,rgb:[220,170,132]},{index:.7,rgb:[230,145,90]},{index:1,rgb:[178,10,28]}],picnic:[{index:0,rgb:[0,0,255]},{index:.1,rgb:[51,153,255]},{index:.2,rgb:[102,204,255]},{index:.3,rgb:[153,204,255]},{index:.4,rgb:[204,204,255]},{index:.5,rgb:[255,255,255]},{index:.6,rgb:[255,204,255]},{index:.7,rgb:[255,153,255]},{index:.8,rgb:[255,102,204]},{index:.9,rgb:[255,102,102]},{index:1,rgb:[255,0,0]}],rainbow:[{index:0,rgb:[150,0,90]},{index:.125,rgb:[0,0,200]},{index:.25,rgb:[0,25,255]},{index:.375,rgb:[0,152,255]},{index:.5,rgb:[44,255,150]},{index:.625,rgb:[151,255,0]},{index:.75,rgb:[255,234,0]},{index:.875,rgb:[255,111,0]},{index:1,rgb:[255,0,0]}],portland:[{index:0,rgb:[12,51,131]},{index:.25,rgb:[10,136,186]},{index:.5,rgb:[242,211,56]},{index:.75,rgb:[242,143,56]},{index:1,rgb:[217,30,30]}],blackbody:[{index:0,rgb:[0,0,0]},{index:.2,rgb:[230,0,0]},{index:.4,rgb:[230,210,0]},{index:.7,rgb:[255,255,255]},{index:1,rgb:[160,200,255]}],earth:[{index:0,rgb:[0,0,130]},{index:.1,rgb:[0,180,180]},{index:.2,rgb:[40,210,40]},{index:.4,rgb:[230,230,50]},{index:.6,rgb:[120,70,20]},{index:1,rgb:[255,255,255]}],electric:[{index:0,rgb:[0,0,0]},{index:.15,rgb:[30,0,100]},{index:.4,rgb:[120,0,100]},{index:.6,rgb:[160,90,0]},{index:.8,rgb:[230,200,0]},{index:1,rgb:[255,250,220]}],alpha:[{index:0,rgb:[255,255,255,0]},{index:1,rgb:[255,255,255,1]}],viridis:[{index:0,rgb:[68,1,84]},{index:.13,rgb:[71,44,122]},{index:.25,rgb:[59,81,139]},{index:.38,rgb:[44,113,142]},{index:.5,rgb:[33,144,141]},{index:.63,rgb:[39,173,129]},{index:.75,rgb:[92,200,99]},{index:.88,rgb:[170,220,50]},{index:1,rgb:[253,231,37]}],inferno:[{index:0,rgb:[0,0,4]},{index:.13,rgb:[31,12,72]},{index:.25,rgb:[85,15,109]},{index:.38,rgb:[136,34,106]},{index:.5,rgb:[186,54,85]},{index:.63,rgb:[227,89,51]},{index:.75,rgb:[249,140,10]},{index:.88,rgb:[249,201,50]},{index:1,rgb:[252,255,164]}],magma:[{index:0,rgb:[0,0,4]},{index:.13,rgb:[28,16,68]},{index:.25,rgb:[79,18,123]},{index:.38,rgb:[129,37,129]},{index:.5,rgb:[181,54,122]},{index:.63,rgb:[229,80,100]},{index:.75,rgb:[251,135,97]},{index:.88,rgb:[254,194,135]},{index:1,rgb:[252,253,191]}],plasma:[{index:0,rgb:[13,8,135]},{index:.13,rgb:[75,3,161]},{index:.25,rgb:[125,3,168]},{index:.38,rgb:[168,34,150]},{index:.5,rgb:[203,70,121]},{index:.63,rgb:[229,107,93]},{index:.75,rgb:[248,148,65]},{index:.88,rgb:[253,195,40]},{index:1,rgb:[240,249,33]}],warm:[{index:0,rgb:[125,0,179]},{index:.13,rgb:[172,0,187]},{index:.25,rgb:[219,0,170]},{index:.38,rgb:[255,0,130]},{index:.5,rgb:[255,63,74]},{index:.63,rgb:[255,123,0]},{index:.75,rgb:[234,176,0]},{index:.88,rgb:[190,228,0]},{index:1,rgb:[147,255,0]}],cool:[{index:0,rgb:[125,0,179]},{index:.13,rgb:[116,0,218]},{index:.25,rgb:[98,74,237]},{index:.38,rgb:[68,146,231]},{index:.5,rgb:[0,204,197]},{index:.63,rgb:[0,247,146]},{index:.75,rgb:[0,255,88]},{index:.88,rgb:[40,255,8]},{index:1,rgb:[147,255,0]}],\"rainbow-soft\":[{index:0,rgb:[125,0,179]},{index:.1,rgb:[199,0,180]},{index:.2,rgb:[255,0,121]},{index:.3,rgb:[255,108,0]},{index:.4,rgb:[222,194,0]},{index:.5,rgb:[150,255,0]},{index:.6,rgb:[0,255,55]},{index:.7,rgb:[0,246,150]},{index:.8,rgb:[50,167,222]},{index:.9,rgb:[103,51,235]},{index:1,rgb:[124,0,186]}],bathymetry:[{index:0,rgb:[40,26,44]},{index:.13,rgb:[59,49,90]},{index:.25,rgb:[64,76,139]},{index:.38,rgb:[63,110,151]},{index:.5,rgb:[72,142,158]},{index:.63,rgb:[85,174,163]},{index:.75,rgb:[120,206,163]},{index:.88,rgb:[187,230,172]},{index:1,rgb:[253,254,204]}],cdom:[{index:0,rgb:[47,15,62]},{index:.13,rgb:[87,23,86]},{index:.25,rgb:[130,28,99]},{index:.38,rgb:[171,41,96]},{index:.5,rgb:[206,67,86]},{index:.63,rgb:[230,106,84]},{index:.75,rgb:[242,149,103]},{index:.88,rgb:[249,193,135]},{index:1,rgb:[254,237,176]}],chlorophyll:[{index:0,rgb:[18,36,20]},{index:.13,rgb:[25,63,41]},{index:.25,rgb:[24,91,59]},{index:.38,rgb:[13,119,72]},{index:.5,rgb:[18,148,80]},{index:.63,rgb:[80,173,89]},{index:.75,rgb:[132,196,122]},{index:.88,rgb:[175,221,162]},{index:1,rgb:[215,249,208]}],density:[{index:0,rgb:[54,14,36]},{index:.13,rgb:[89,23,80]},{index:.25,rgb:[110,45,132]},{index:.38,rgb:[120,77,178]},{index:.5,rgb:[120,113,213]},{index:.63,rgb:[115,151,228]},{index:.75,rgb:[134,185,227]},{index:.88,rgb:[177,214,227]},{index:1,rgb:[230,241,241]}],\"freesurface-blue\":[{index:0,rgb:[30,4,110]},{index:.13,rgb:[47,14,176]},{index:.25,rgb:[41,45,236]},{index:.38,rgb:[25,99,212]},{index:.5,rgb:[68,131,200]},{index:.63,rgb:[114,156,197]},{index:.75,rgb:[157,181,203]},{index:.88,rgb:[200,208,216]},{index:1,rgb:[241,237,236]}],\"freesurface-red\":[{index:0,rgb:[60,9,18]},{index:.13,rgb:[100,17,27]},{index:.25,rgb:[142,20,29]},{index:.38,rgb:[177,43,27]},{index:.5,rgb:[192,87,63]},{index:.63,rgb:[205,125,105]},{index:.75,rgb:[216,162,148]},{index:.88,rgb:[227,199,193]},{index:1,rgb:[241,237,236]}],oxygen:[{index:0,rgb:[64,5,5]},{index:.13,rgb:[106,6,15]},{index:.25,rgb:[144,26,7]},{index:.38,rgb:[168,64,3]},{index:.5,rgb:[188,100,4]},{index:.63,rgb:[206,136,11]},{index:.75,rgb:[220,174,25]},{index:.88,rgb:[231,215,44]},{index:1,rgb:[248,254,105]}],par:[{index:0,rgb:[51,20,24]},{index:.13,rgb:[90,32,35]},{index:.25,rgb:[129,44,34]},{index:.38,rgb:[159,68,25]},{index:.5,rgb:[182,99,19]},{index:.63,rgb:[199,134,22]},{index:.75,rgb:[212,171,35]},{index:.88,rgb:[221,210,54]},{index:1,rgb:[225,253,75]}],phase:[{index:0,rgb:[145,105,18]},{index:.13,rgb:[184,71,38]},{index:.25,rgb:[186,58,115]},{index:.38,rgb:[160,71,185]},{index:.5,rgb:[110,97,218]},{index:.63,rgb:[50,123,164]},{index:.75,rgb:[31,131,110]},{index:.88,rgb:[77,129,34]},{index:1,rgb:[145,105,18]}],salinity:[{index:0,rgb:[42,24,108]},{index:.13,rgb:[33,50,162]},{index:.25,rgb:[15,90,145]},{index:.38,rgb:[40,118,137]},{index:.5,rgb:[59,146,135]},{index:.63,rgb:[79,175,126]},{index:.75,rgb:[120,203,104]},{index:.88,rgb:[193,221,100]},{index:1,rgb:[253,239,154]}],temperature:[{index:0,rgb:[4,35,51]},{index:.13,rgb:[23,51,122]},{index:.25,rgb:[85,59,157]},{index:.38,rgb:[129,79,143]},{index:.5,rgb:[175,95,130]},{index:.63,rgb:[222,112,101]},{index:.75,rgb:[249,146,66]},{index:.88,rgb:[249,196,65]},{index:1,rgb:[232,250,91]}],turbidity:[{index:0,rgb:[34,31,27]},{index:.13,rgb:[65,50,41]},{index:.25,rgb:[98,69,52]},{index:.38,rgb:[131,89,57]},{index:.5,rgb:[161,112,59]},{index:.63,rgb:[185,140,66]},{index:.75,rgb:[202,174,88]},{index:.88,rgb:[216,209,126]},{index:1,rgb:[233,246,171]}],\"velocity-blue\":[{index:0,rgb:[17,32,64]},{index:.13,rgb:[35,52,116]},{index:.25,rgb:[29,81,156]},{index:.38,rgb:[31,113,162]},{index:.5,rgb:[50,144,169]},{index:.63,rgb:[87,173,176]},{index:.75,rgb:[149,196,189]},{index:.88,rgb:[203,221,211]},{index:1,rgb:[254,251,230]}],\"velocity-green\":[{index:0,rgb:[23,35,19]},{index:.13,rgb:[24,64,38]},{index:.25,rgb:[11,95,45]},{index:.38,rgb:[39,123,35]},{index:.5,rgb:[95,146,12]},{index:.63,rgb:[152,165,18]},{index:.75,rgb:[201,186,69]},{index:.88,rgb:[233,216,137]},{index:1,rgb:[255,253,205]}],cubehelix:[{index:0,rgb:[0,0,0]},{index:.07,rgb:[22,5,59]},{index:.13,rgb:[60,4,105]},{index:.2,rgb:[109,1,135]},{index:.27,rgb:[161,0,147]},{index:.33,rgb:[210,2,142]},{index:.4,rgb:[251,11,123]},{index:.47,rgb:[255,29,97]},{index:.53,rgb:[255,54,69]},{index:.6,rgb:[255,85,46]},{index:.67,rgb:[255,120,34]},{index:.73,rgb:[255,157,37]},{index:.8,rgb:[241,191,57]},{index:.87,rgb:[224,220,93]},{index:.93,rgb:[218,241,142]},{index:1,rgb:[227,253,198]}]}},6729:function(t,e,r){\"use strict\";var n=r(3642),i=r(395);function a(t){return[t[0]/255,t[1]/255,t[2]/255,t[3]]}function o(t){for(var e,r=\"#\",n=0;n<3;++n)r+=(\"00\"+(e=(e=t[n]).toString(16))).substr(e.length);return r}function s(t){return\"rgba(\"+t.join(\",\")+\")\"}t.exports=function(t){var e,r,l,u,c,f,h,p,d,v;if(t||(t={}),p=(t.nshades||72)-1,h=t.format||\"hex\",(f=t.colormap)||(f=\"jet\"),\"string\"==typeof f){if(f=f.toLowerCase(),!n[f])throw Error(f+\" not a supported colorscale\");c=n[f]}else{if(!Array.isArray(f))throw Error(\"unsupported colormap option\",f);c=f.slice()}if(c.length>p+1)throw new Error(f+\" map requires nshades to be at least size \"+c.length);d=Array.isArray(t.alpha)?2!==t.alpha.length?[1,1]:t.alpha.slice():\"number\"==typeof t.alpha?[t.alpha,t.alpha]:[1,1],e=c.map((function(t){return Math.round(t.index*p)})),d[0]=Math.min(Math.max(d[0],0),1),d[1]=Math.min(Math.max(d[1],0),1);var g=c.map((function(t,e){var r=c[e].index,n=c[e].rgb.slice();return 4===n.length&&n[3]>=0&&n[3]<=1||(n[3]=d[0]+(d[1]-d[0])*r),n})),y=[];for(v=0;v0||l(t,e,a)?-1:1:0===s?u>0||l(t,e,r)?1:-1:i(u-s)}var f=n(t,e,r);return f>0?o>0&&n(t,e,a)>0?1:-1:f<0?o>0||n(t,e,a)>0?1:-1:n(t,e,a)>0||l(t,e,r)?1:-1};var n=r(3250),i=r(8572),a=r(9362),o=r(5382),s=r(8210);function l(t,e,r){var n=a(t[0],-e[0]),i=a(t[1],-e[1]),l=a(r[0],-e[0]),u=a(r[1],-e[1]),c=s(o(n,l),o(i,u));return c[c.length-1]>=0}},8572:function(t){\"use strict\";t.exports=function(t){return t<0?-1:t>0?1:0}},8507:function(t){t.exports=function(t,n){var i=t.length,a=t.length-n.length;if(a)return a;switch(i){case 0:return 0;case 1:return t[0]-n[0];case 2:return t[0]+t[1]-n[0]-n[1]||e(t[0],t[1])-e(n[0],n[1]);case 3:var o=t[0]+t[1],s=n[0]+n[1];if(a=o+t[2]-(s+n[2]))return a;var l=e(t[0],t[1]),u=e(n[0],n[1]);return e(l,t[2])-e(u,n[2])||e(l+t[2],o)-e(u+n[2],s);case 4:var c=t[0],f=t[1],h=t[2],p=t[3],d=n[0],v=n[1],g=n[2],y=n[3];return c+f+h+p-(d+v+g+y)||e(c,f,h,p)-e(d,v,g,y,d)||e(c+f,c+h,c+p,f+h,f+p,h+p)-e(d+v,d+g,d+y,v+g,v+y,g+y)||e(c+f+h,c+f+p,c+h+p,f+h+p)-e(d+v+g,d+v+y,d+g+y,v+g+y);default:for(var m=t.slice().sort(r),x=n.slice().sort(r),b=0;bt[r][0]&&(r=n);return er?[[r],[e]]:[[e]]}},4750:function(t,e,r){\"use strict\";t.exports=function(t){var e=n(t),r=e.length;if(r<=2)return[];for(var i=new Array(r),a=e[r-1],o=0;o=e[l]&&(s+=1);a[o]=s}}return t}(n(a,!0),r)}};var n=r(8954),i=r(3952)},4769:function(t){\"use strict\";t.exports=function(t,e,r,n,i,a){var o=i-1,s=i*i,l=o*o,u=(1+2*i)*l,c=i*l,f=s*(3-2*i),h=s*o;if(t.length){a||(a=new Array(t.length));for(var p=t.length-1;p>=0;--p)a[p]=u*t[p]+c*e[p]+f*r[p]+h*n[p];return a}return u*t+c*e+f*r+h*n},t.exports.derivative=function(t,e,r,n,i,a){var o=6*i*i-6*i,s=3*i*i-4*i+1,l=-6*i*i+6*i,u=3*i*i-2*i;if(t.length){a||(a=new Array(t.length));for(var c=t.length-1;c>=0;--c)a[c]=o*t[c]+s*e[c]+l*r[c]+u*n[c];return a}return o*t+s*e+l*r[c]+u*n}},7642:function(t,e,r){\"use strict\";var n=r(8954),i=r(1682);function a(t,e){this.point=t,this.index=e}function o(t,e){for(var r=t.point,n=e.point,i=r.length,a=0;a=2)return!1;t[r]=n}return!0})):_.filter((function(t){for(var e=0;e<=s;++e){var r=y[t[e]];if(r<0)return!1;t[e]=r}return!0})),1&s)for(c=0;c<_.length;++c)h=(b=_[c])[0],b[0]=b[1],b[1]=h;return _}},2361:function(t){var e=!1;if(\"undefined\"!=typeof Float64Array){var r=new Float64Array(1),n=new Uint32Array(r.buffer);r[0]=1,e=!0,1072693248===n[1]?(t.exports=function(t){return r[0]=t,[n[0],n[1]]},t.exports.pack=function(t,e){return n[0]=t,n[1]=e,r[0]},t.exports.lo=function(t){return r[0]=t,n[0]},t.exports.hi=function(t){return r[0]=t,n[1]}):1072693248===n[0]?(t.exports=function(t){return r[0]=t,[n[1],n[0]]},t.exports.pack=function(t,e){return n[1]=t,n[0]=e,r[0]},t.exports.lo=function(t){return r[0]=t,n[1]},t.exports.hi=function(t){return r[0]=t,n[0]}):e=!1}if(!e){var i=new Buffer(8);t.exports=function(t){return i.writeDoubleLE(t,0,!0),[i.readUInt32LE(0,!0),i.readUInt32LE(4,!0)]},t.exports.pack=function(t,e){return i.writeUInt32LE(t,0,!0),i.writeUInt32LE(e,4,!0),i.readDoubleLE(0,!0)},t.exports.lo=function(t){return i.writeDoubleLE(t,0,!0),i.readUInt32LE(0,!0)},t.exports.hi=function(t){return i.writeDoubleLE(t,0,!0),i.readUInt32LE(4,!0)}}t.exports.sign=function(e){return t.exports.hi(e)>>>31},t.exports.exponent=function(e){return(t.exports.hi(e)<<1>>>21)-1023},t.exports.fraction=function(e){var r=t.exports.lo(e),n=t.exports.hi(e),i=1048575&n;return 2146435072&n&&(i+=1<<20),[r,i]},t.exports.denormalized=function(e){return!(2146435072&t.exports.hi(e))}},1338:function(t){\"use strict\";function e(t,r,n){var i=0|t[n];if(i<=0)return[];var a,o=new Array(i);if(n===t.length-1)for(a=0;a0)return function(t,e){var r,n;for(r=new Array(t),n=0;n=r-1){h=l.length-1;var d=t-e[r-1];for(p=0;p=r-1)for(var c=s.length-1,f=(e[r-1],0);f=0;--r)if(t[--e])return!1;return!0},s.jump=function(t){var e=this.lastT(),r=this.dimension;if(!(t0;--f)n.push(a(l[f-1],u[f-1],arguments[f])),i.push(0)}},s.push=function(t){var e=this.lastT(),r=this.dimension;if(!(t1e-6?1/s:0;this._time.push(t);for(var h=r;h>0;--h){var p=a(u[h-1],c[h-1],arguments[h]);n.push(p),i.push((p-n[o++])*f)}}},s.set=function(t){var e=this.dimension;if(!(t0;--l)r.push(a(o[l-1],s[l-1],arguments[l])),n.push(0)}},s.move=function(t){var e=this.lastT(),r=this.dimension;if(!(t<=e||arguments.length!==r+1)){var n=this._state,i=this._velocity,o=n.length-this.dimension,s=this.bounds,l=s[0],u=s[1],c=t-e,f=c>1e-6?1/c:0;this._time.push(t);for(var h=r;h>0;--h){var p=arguments[h];n.push(a(l[h-1],u[h-1],n[o++]+p)),i.push(p*f)}}},s.idle=function(t){var e=this.lastT();if(!(t=0;--f)n.push(a(l[f],u[f],n[o]+c*i[o])),i.push(0),o+=1}}},3840:function(t){\"use strict\";function e(t,e,r,n,i,a){this._color=t,this.key=e,this.value=r,this.left=n,this.right=i,this._count=a}function r(t){return new e(t._color,t.key,t.value,t.left,t.right,t._count)}function n(t,r){return new e(t,r.key,r.value,r.left,r.right,r._count)}function i(t){t._count=1+(t.left?t.left._count:0)+(t.right?t.right._count:0)}function a(t,e){this._compare=t,this.root=e}t.exports=function(t){return new a(t||p,null)};var o=a.prototype;function s(t,e){var r;return e.left&&(r=s(t,e.left))?r:(r=t(e.key,e.value))||(e.right?s(t,e.right):void 0)}function l(t,e,r,n){if(e(t,n.key)<=0){var i;if(n.left&&(i=l(t,e,r,n.left)))return i;if(i=r(n.key,n.value))return i}if(n.right)return l(t,e,r,n.right)}function u(t,e,r,n,i){var a,o=r(t,i.key),s=r(e,i.key);if(o<=0){if(i.left&&(a=u(t,e,r,n,i.left)))return a;if(s>0&&(a=n(i.key,i.value)))return a}if(s>0&&i.right)return u(t,e,r,n,i.right)}function c(t,e){this.tree=t,this._stack=e}Object.defineProperty(o,\"keys\",{get:function(){var t=[];return this.forEach((function(e,r){t.push(e)})),t}}),Object.defineProperty(o,\"values\",{get:function(){var t=[];return this.forEach((function(e,r){t.push(r)})),t}}),Object.defineProperty(o,\"length\",{get:function(){return this.root?this.root._count:0}}),o.insert=function(t,r){for(var o=this._compare,s=this.root,l=[],u=[];s;){var c=o(t,s.key);l.push(s),u.push(c),s=c<=0?s.left:s.right}l.push(new e(0,t,r,null,null,1));for(var f=l.length-2;f>=0;--f)s=l[f],u[f]<=0?l[f]=new e(s._color,s.key,s.value,l[f+1],s.right,s._count+1):l[f]=new e(s._color,s.key,s.value,s.left,l[f+1],s._count+1);for(f=l.length-1;f>1;--f){var h=l[f-1];if(s=l[f],1===h._color||1===s._color)break;var p=l[f-2];if(p.left===h)if(h.left===s){if(!(d=p.right)||0!==d._color){p._color=0,p.left=h.right,h._color=1,h.right=p,l[f-2]=h,l[f-1]=s,i(p),i(h),f>=3&&((v=l[f-3]).left===p?v.left=h:v.right=h);break}h._color=1,p.right=n(1,d),p._color=0,f-=1}else{if(!(d=p.right)||0!==d._color){h.right=s.left,p._color=0,p.left=s.right,s._color=1,s.left=h,s.right=p,l[f-2]=s,l[f-1]=h,i(p),i(h),i(s),f>=3&&((v=l[f-3]).left===p?v.left=s:v.right=s);break}h._color=1,p.right=n(1,d),p._color=0,f-=1}else if(h.right===s){if(!(d=p.left)||0!==d._color){p._color=0,p.right=h.left,h._color=1,h.left=p,l[f-2]=h,l[f-1]=s,i(p),i(h),f>=3&&((v=l[f-3]).right===p?v.right=h:v.left=h);break}h._color=1,p.left=n(1,d),p._color=0,f-=1}else{var d;if(!(d=p.left)||0!==d._color){var v;h.left=s.right,p._color=0,p.right=s.left,s._color=1,s.right=h,s.left=p,l[f-2]=s,l[f-1]=h,i(p),i(h),i(s),f>=3&&((v=l[f-3]).right===p?v.right=s:v.left=s);break}h._color=1,p.left=n(1,d),p._color=0,f-=1}}return l[0]._color=1,new a(o,l[0])},o.forEach=function(t,e,r){if(this.root)switch(arguments.length){case 1:return s(t,this.root);case 2:return l(e,this._compare,t,this.root);case 3:if(this._compare(e,r)>=0)return;return u(e,r,this._compare,t,this.root)}},Object.defineProperty(o,\"begin\",{get:function(){for(var t=[],e=this.root;e;)t.push(e),e=e.left;return new c(this,t)}}),Object.defineProperty(o,\"end\",{get:function(){for(var t=[],e=this.root;e;)t.push(e),e=e.right;return new c(this,t)}}),o.at=function(t){if(t<0)return new c(this,[]);for(var e=this.root,r=[];;){if(r.push(e),e.left){if(t=e.right._count)break;e=e.right}return new c(this,[])},o.ge=function(t){for(var e=this._compare,r=this.root,n=[],i=0;r;){var a=e(t,r.key);n.push(r),a<=0&&(i=n.length),r=a<=0?r.left:r.right}return n.length=i,new c(this,n)},o.gt=function(t){for(var e=this._compare,r=this.root,n=[],i=0;r;){var a=e(t,r.key);n.push(r),a<0&&(i=n.length),r=a<0?r.left:r.right}return n.length=i,new c(this,n)},o.lt=function(t){for(var e=this._compare,r=this.root,n=[],i=0;r;){var a=e(t,r.key);n.push(r),a>0&&(i=n.length),r=a<=0?r.left:r.right}return n.length=i,new c(this,n)},o.le=function(t){for(var e=this._compare,r=this.root,n=[],i=0;r;){var a=e(t,r.key);n.push(r),a>=0&&(i=n.length),r=a<0?r.left:r.right}return n.length=i,new c(this,n)},o.find=function(t){for(var e=this._compare,r=this.root,n=[];r;){var i=e(t,r.key);if(n.push(r),0===i)return new c(this,n);r=i<=0?r.left:r.right}return new c(this,[])},o.remove=function(t){var e=this.find(t);return e?e.remove():this},o.get=function(t){for(var e=this._compare,r=this.root;r;){var n=e(t,r.key);if(0===n)return r.value;r=n<=0?r.left:r.right}};var f=c.prototype;function h(t,e){t.key=e.key,t.value=e.value,t.left=e.left,t.right=e.right,t._color=e._color,t._count=e._count}function p(t,e){return te?1:0}Object.defineProperty(f,\"valid\",{get:function(){return this._stack.length>0}}),Object.defineProperty(f,\"node\",{get:function(){return this._stack.length>0?this._stack[this._stack.length-1]:null},enumerable:!0}),f.clone=function(){return new c(this.tree,this._stack.slice())},f.remove=function(){var t=this._stack;if(0===t.length)return this.tree;var o=new Array(t.length),s=t[t.length-1];o[o.length-1]=new e(s._color,s.key,s.value,s.left,s.right,s._count);for(var l=t.length-2;l>=0;--l)(s=t[l]).left===t[l+1]?o[l]=new e(s._color,s.key,s.value,o[l+1],s.right,s._count):o[l]=new e(s._color,s.key,s.value,s.left,o[l+1],s._count);if((s=o[o.length-1]).left&&s.right){var u=o.length;for(s=s.left;s.right;)o.push(s),s=s.right;var c=o[u-1];for(o.push(new e(s._color,c.key,c.value,s.left,s.right,s._count)),o[u-1].key=s.key,o[u-1].value=s.value,l=o.length-2;l>=u;--l)s=o[l],o[l]=new e(s._color,s.key,s.value,s.left,o[l+1],s._count);o[u-1].left=o[u]}if(0===(s=o[o.length-1])._color){var f=o[o.length-2];for(f.left===s?f.left=null:f.right===s&&(f.right=null),o.pop(),l=0;l=0;--l){if(e=t[l],0===l)return void(e._color=1);if((a=t[l-1]).left===e){if((o=a.right).right&&0===o.right._color)return s=(o=a.right=r(o)).right=r(o.right),a.right=o.left,o.left=a,o.right=s,o._color=a._color,e._color=1,a._color=1,s._color=1,i(a),i(o),l>1&&((u=t[l-2]).left===a?u.left=o:u.right=o),void(t[l-1]=o);if(o.left&&0===o.left._color)return s=(o=a.right=r(o)).left=r(o.left),a.right=s.left,o.left=s.right,s.left=a,s.right=o,s._color=a._color,a._color=1,o._color=1,e._color=1,i(a),i(o),i(s),l>1&&((u=t[l-2]).left===a?u.left=s:u.right=s),void(t[l-1]=s);if(1===o._color){if(0===a._color)return a._color=1,void(a.right=n(0,o));a.right=n(0,o);continue}o=r(o),a.right=o.left,o.left=a,o._color=a._color,a._color=0,i(a),i(o),l>1&&((u=t[l-2]).left===a?u.left=o:u.right=o),t[l-1]=o,t[l]=a,l+11&&((u=t[l-2]).right===a?u.right=o:u.left=o),void(t[l-1]=o);if(o.right&&0===o.right._color)return s=(o=a.left=r(o)).right=r(o.right),a.left=s.right,o.right=s.left,s.right=a,s.left=o,s._color=a._color,a._color=1,o._color=1,e._color=1,i(a),i(o),i(s),l>1&&((u=t[l-2]).right===a?u.right=s:u.left=s),void(t[l-1]=s);if(1===o._color){if(0===a._color)return a._color=1,void(a.left=n(0,o));a.left=n(0,o);continue}var u;o=r(o),a.left=o.right,o.right=a,o._color=a._color,a._color=0,i(a),i(o),l>1&&((u=t[l-2]).right===a?u.right=o:u.left=o),t[l-1]=o,t[l]=a,l+10)return this._stack[this._stack.length-1].key},enumerable:!0}),Object.defineProperty(f,\"value\",{get:function(){if(this._stack.length>0)return this._stack[this._stack.length-1].value},enumerable:!0}),Object.defineProperty(f,\"index\",{get:function(){var t=0,e=this._stack;if(0===e.length){var r=this.tree.root;return r?r._count:0}e[e.length-1].left&&(t=e[e.length-1].left._count);for(var n=e.length-2;n>=0;--n)e[n+1]===e[n].right&&(++t,e[n].left&&(t+=e[n].left._count));return t},enumerable:!0}),f.next=function(){var t=this._stack;if(0!==t.length){var e=t[t.length-1];if(e.right)for(e=e.right;e;)t.push(e),e=e.left;else for(t.pop();t.length>0&&t[t.length-1].right===e;)e=t[t.length-1],t.pop()}},Object.defineProperty(f,\"hasNext\",{get:function(){var t=this._stack;if(0===t.length)return!1;if(t[t.length-1].right)return!0;for(var e=t.length-1;e>0;--e)if(t[e-1].left===t[e])return!0;return!1}}),f.update=function(t){var r=this._stack;if(0===r.length)throw new Error(\"Can't update empty node!\");var n=new Array(r.length),i=r[r.length-1];n[n.length-1]=new e(i._color,i.key,t,i.left,i.right,i._count);for(var o=r.length-2;o>=0;--o)(i=r[o]).left===r[o+1]?n[o]=new e(i._color,i.key,i.value,n[o+1],i.right,i._count):n[o]=new e(i._color,i.key,i.value,i.left,n[o+1],i._count);return new a(this.tree._compare,n[0])},f.prev=function(){var t=this._stack;if(0!==t.length){var e=t[t.length-1];if(e.left)for(e=e.left;e;)t.push(e),e=e.right;else for(t.pop();t.length>0&&t[t.length-1].left===e;)e=t[t.length-1],t.pop()}},Object.defineProperty(f,\"hasPrev\",{get:function(){var t=this._stack;if(0===t.length)return!1;if(t[t.length-1].left)return!0;for(var e=t.length-1;e>0;--e)if(t[e-1].right===t[e])return!0;return!1}})},3837:function(t,e,r){\"use strict\";t.exports=function(t,e){var r=new c(t);return r.update(e),r};var n=r(4935),i=r(501),a=r(5304),o=r(6429),s=r(6444),l=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]);function u(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t}function c(t){this.gl=t,this.pixelRatio=1,this.bounds=[[-10,-10,-10],[10,10,10]],this.ticks=[[],[],[]],this.autoTicks=!0,this.tickSpacing=[1,1,1],this.tickEnable=[!0,!0,!0],this.tickFont=[\"sans-serif\",\"sans-serif\",\"sans-serif\"],this.tickFontStyle=[\"normal\",\"normal\",\"normal\"],this.tickFontWeight=[\"normal\",\"normal\",\"normal\"],this.tickFontVariant=[\"normal\",\"normal\",\"normal\"],this.tickSize=[12,12,12],this.tickAngle=[0,0,0],this.tickAlign=[\"auto\",\"auto\",\"auto\"],this.tickColor=[[0,0,0,1],[0,0,0,1],[0,0,0,1]],this.tickPad=[10,10,10],this.lastCubeProps={cubeEdges:[0,0,0],axis:[0,0,0]},this.labels=[\"x\",\"y\",\"z\"],this.labelEnable=[!0,!0,!0],this.labelFont=[\"sans-serif\",\"sans-serif\",\"sans-serif\"],this.labelFontStyle=[\"normal\",\"normal\",\"normal\"],this.labelFontWeight=[\"normal\",\"normal\",\"normal\"],this.labelFontVariant=[\"normal\",\"normal\",\"normal\"],this.labelSize=[20,20,20],this.labelAngle=[0,0,0],this.labelAlign=[\"auto\",\"auto\",\"auto\"],this.labelColor=[[0,0,0,1],[0,0,0,1],[0,0,0,1]],this.labelPad=[10,10,10],this.lineEnable=[!0,!0,!0],this.lineMirror=[!1,!1,!1],this.lineWidth=[1,1,1],this.lineColor=[[0,0,0,1],[0,0,0,1],[0,0,0,1]],this.lineTickEnable=[!0,!0,!0],this.lineTickMirror=[!1,!1,!1],this.lineTickLength=[0,0,0],this.lineTickWidth=[1,1,1],this.lineTickColor=[[0,0,0,1],[0,0,0,1],[0,0,0,1]],this.gridEnable=[!0,!0,!0],this.gridWidth=[1,1,1],this.gridColor=[[0,0,0,1],[0,0,0,1],[0,0,0,1]],this.zeroEnable=[!0,!0,!0],this.zeroLineColor=[[0,0,0,1],[0,0,0,1],[0,0,0,1]],this.zeroLineWidth=[2,2,2],this.backgroundEnable=[!1,!1,!1],this.backgroundColor=[[.8,.8,.8,.5],[.8,.8,.8,.5],[.8,.8,.8,.5]],this._firstInit=!0,this._text=null,this._lines=null,this._background=a(t)}var f=c.prototype;function h(){this.primalOffset=[0,0,0],this.primalMinor=[0,0,0],this.mirrorOffset=[0,0,0],this.mirrorMinor=[0,0,0]}f.update=function(t){function e(e,r,n){if(n in t){var i,a=t[n],o=this[n];(e?Array.isArray(a)&&Array.isArray(a[0]):Array.isArray(a))?this[n]=i=[r(a[0]),r(a[1]),r(a[2])]:this[n]=i=[r(a),r(a),r(a)];for(var s=0;s<3;++s)if(i[s]!==o[s])return!0}return!1}t=t||{};var r,a=e.bind(this,!1,Number),o=e.bind(this,!1,Boolean),l=e.bind(this,!1,String),u=e.bind(this,!0,(function(t){if(Array.isArray(t)){if(3===t.length)return[+t[0],+t[1],+t[2],1];if(4===t.length)return[+t[0],+t[1],+t[2],+t[3]]}return[0,0,0,1]})),c=!1,f=!1;if(\"bounds\"in t)for(var h=t.bounds,p=0;p<2;++p)for(var d=0;d<3;++d)h[p][d]!==this.bounds[p][d]&&(f=!0),this.bounds[p][d]=h[p][d];if(\"ticks\"in t)for(r=t.ticks,c=!0,this.autoTicks=!1,p=0;p<3;++p)this.tickSpacing[p]=0;else a(\"tickSpacing\")&&(this.autoTicks=!0,f=!0);if(this._firstInit&&(\"ticks\"in t||\"tickSpacing\"in t||(this.autoTicks=!0),f=!0,c=!0,this._firstInit=!1),f&&this.autoTicks&&(r=s.create(this.bounds,this.tickSpacing),c=!0),c){for(p=0;p<3;++p)r[p].sort((function(t,e){return t.x-e.x}));s.equal(r,this.ticks)?c=!1:this.ticks=r}o(\"tickEnable\"),l(\"tickFont\")&&(c=!0),l(\"tickFontStyle\")&&(c=!0),l(\"tickFontWeight\")&&(c=!0),l(\"tickFontVariant\")&&(c=!0),a(\"tickSize\"),a(\"tickAngle\"),a(\"tickPad\"),u(\"tickColor\");var v=l(\"labels\");l(\"labelFont\")&&(v=!0),l(\"labelFontStyle\")&&(v=!0),l(\"labelFontWeight\")&&(v=!0),l(\"labelFontVariant\")&&(v=!0),o(\"labelEnable\"),a(\"labelSize\"),a(\"labelPad\"),u(\"labelColor\"),o(\"lineEnable\"),o(\"lineMirror\"),a(\"lineWidth\"),u(\"lineColor\"),o(\"lineTickEnable\"),o(\"lineTickMirror\"),a(\"lineTickLength\"),a(\"lineTickWidth\"),u(\"lineTickColor\"),o(\"gridEnable\"),a(\"gridWidth\"),u(\"gridColor\"),o(\"zeroEnable\"),u(\"zeroLineColor\"),a(\"zeroLineWidth\"),o(\"backgroundEnable\"),u(\"backgroundColor\");var g=[{family:this.labelFont[0],style:this.labelFontStyle[0],weight:this.labelFontWeight[0],variant:this.labelFontVariant[0]},{family:this.labelFont[1],style:this.labelFontStyle[1],weight:this.labelFontWeight[1],variant:this.labelFontVariant[1]},{family:this.labelFont[2],style:this.labelFontStyle[2],weight:this.labelFontWeight[2],variant:this.labelFontVariant[2]}],y=[{family:this.tickFont[0],style:this.tickFontStyle[0],weight:this.tickFontWeight[0],variant:this.tickFontVariant[0]},{family:this.tickFont[1],style:this.tickFontStyle[1],weight:this.tickFontWeight[1],variant:this.tickFontVariant[1]},{family:this.tickFont[2],style:this.tickFontStyle[2],weight:this.tickFontWeight[2],variant:this.tickFontVariant[2]}];this._text?this._text&&(v||c)&&this._text.update(this.bounds,this.labels,g,this.ticks,y):this._text=n(this.gl,this.bounds,this.labels,g,this.ticks,y),this._lines&&c&&(this._lines.dispose(),this._lines=null),this._lines||(this._lines=i(this.gl,this.bounds,this.ticks))};var p=[new h,new h,new h];function d(t,e,r,n,i){for(var a=t.primalOffset,o=t.primalMinor,s=t.mirrorOffset,l=t.mirrorMinor,u=n[e],c=0;c<3;++c)if(e!==c){var f=a,h=s,p=o,d=l;u&1<0?(p[c]=-1,d[c]=0):(p[c]=0,d[c]=1)}}var v=[0,0,0],g={model:l,view:l,projection:l,_ortho:!1};f.isOpaque=function(){return!0},f.isTransparent=function(){return!1},f.drawTransparent=function(t){};var y=[0,0,0],m=[0,0,0],x=[0,0,0];f.draw=function(t){t=t||g;for(var e=this.gl,r=t.model||l,n=t.view||l,i=t.projection||l,a=this.bounds,s=t._ortho||!1,c=o(r,n,i,a,s),f=c.cubeEdges,h=c.axis,b=n[12],_=n[13],w=n[14],T=n[15],k=(s?2:1)*this.pixelRatio*(i[3]*b+i[7]*_+i[11]*w+i[15]*T)/e.drawingBufferHeight,A=0;A<3;++A)this.lastCubeProps.cubeEdges[A]=f[A],this.lastCubeProps.axis[A]=h[A];var M=p;for(A=0;A<3;++A)d(p[A],A,this.bounds,f,h);e=this.gl;var S,E,L,C=v;for(A=0;A<3;++A)this.backgroundEnable[A]?C[A]=h[A]:C[A]=0;for(this._background.draw(r,n,i,a,C,this.backgroundColor),this._lines.bind(r,n,i,this),A=0;A<3;++A){var P=[0,0,0];h[A]>0?P[A]=a[1][A]:P[A]=a[0][A];for(var O=0;O<2;++O){var I=(A+1+O)%3,z=(A+1+(1^O))%3;this.gridEnable[I]&&this._lines.drawGrid(I,z,this.bounds,P,this.gridColor[I],this.gridWidth[I]*this.pixelRatio)}for(O=0;O<2;++O)I=(A+1+O)%3,z=(A+1+(1^O))%3,this.zeroEnable[z]&&Math.min(a[0][z],a[1][z])<=0&&Math.max(a[0][z],a[1][z])>=0&&this._lines.drawZero(I,z,this.bounds,P,this.zeroLineColor[z],this.zeroLineWidth[z]*this.pixelRatio)}for(A=0;A<3;++A){this.lineEnable[A]&&this._lines.drawAxisLine(A,this.bounds,M[A].primalOffset,this.lineColor[A],this.lineWidth[A]*this.pixelRatio),this.lineMirror[A]&&this._lines.drawAxisLine(A,this.bounds,M[A].mirrorOffset,this.lineColor[A],this.lineWidth[A]*this.pixelRatio);var D=u(y,M[A].primalMinor),R=u(m,M[A].mirrorMinor),F=this.lineTickLength;for(O=0;O<3;++O){var B=k/r[5*O];D[O]*=F[O]*B,R[O]*=F[O]*B}this.lineTickEnable[A]&&this._lines.drawAxisTicks(A,M[A].primalOffset,D,this.lineTickColor[A],this.lineTickWidth[A]*this.pixelRatio),this.lineTickMirror[A]&&this._lines.drawAxisTicks(A,M[A].mirrorOffset,R,this.lineTickColor[A],this.lineTickWidth[A]*this.pixelRatio)}function N(t){(L=[0,0,0])[t]=1}function j(t,e,r){var n=(t+1)%3,i=(t+2)%3,a=e[n],o=e[i],s=r[n],l=r[i];a>0&&l>0||a>0&&l<0||a<0&&l>0||a<0&&l<0?N(n):(o>0&&s>0||o>0&&s<0||o<0&&s>0||o<0&&s<0)&&N(i)}for(this._lines.unbind(),this._text.bind(r,n,i,this.pixelRatio),A=0;A<3;++A){var U=M[A].primalMinor,V=M[A].mirrorMinor,q=u(x,M[A].primalOffset);for(O=0;O<3;++O)this.lineTickEnable[A]&&(q[O]+=k*U[O]*Math.max(this.lineTickLength[O],0)/r[5*O]);var H=[0,0,0];if(H[A]=1,this.tickEnable[A]){for(-3600===this.tickAngle[A]?(this.tickAngle[A]=0,this.tickAlign[A]=\"auto\"):this.tickAlign[A]=-1,E=1,\"auto\"===(S=[this.tickAlign[A],.5,E])[0]?S[0]=0:S[0]=parseInt(\"\"+S[0]),L=[0,0,0],j(A,U,V),O=0;O<3;++O)q[O]+=k*U[O]*this.tickPad[O]/r[5*O];this._text.drawTicks(A,this.tickSize[A],this.tickAngle[A],q,this.tickColor[A],H,L,S)}if(this.labelEnable[A]){for(E=0,L=[0,0,0],this.labels[A].length>4&&(N(A),E=1),\"auto\"===(S=[this.labelAlign[A],.5,E])[0]?S[0]=0:S[0]=parseInt(\"\"+S[0]),O=0;O<3;++O)q[O]+=k*U[O]*this.labelPad[O]/r[5*O];q[A]+=.5*(a[0][A]+a[1][A]),this._text.drawLabel(A,this.labelSize[A],this.labelAngle[A],q,this.labelColor[A],[0,0,0],L,S)}}this._text.unbind()},f.dispose=function(){this._text.dispose(),this._lines.dispose(),this._background.dispose(),this._lines=null,this._text=null,this._background=null,this.gl=null}},5304:function(t,e,r){\"use strict\";t.exports=function(t){for(var e=[],r=[],s=0,l=0;l<3;++l)for(var u=(l+1)%3,c=(l+2)%3,f=[0,0,0],h=[0,0,0],p=-1;p<=1;p+=2){r.push(s,s+2,s+1,s+1,s+2,s+3),f[l]=p,h[l]=p;for(var d=-1;d<=1;d+=2){f[u]=d;for(var v=-1;v<=1;v+=2)f[c]=v,e.push(f[0],f[1],f[2],h[0],h[1],h[2]),s+=1}var g=u;u=c,c=g}var y=n(t,new Float32Array(e)),m=n(t,new Uint16Array(r),t.ELEMENT_ARRAY_BUFFER),x=i(t,[{buffer:y,type:t.FLOAT,size:3,offset:0,stride:24},{buffer:y,type:t.FLOAT,size:3,offset:12,stride:24}],m),b=a(t);return b.attributes.position.location=0,b.attributes.normal.location=1,new o(t,y,x,b)};var n=r(2762),i=r(8116),a=r(1879).bg;function o(t,e,r,n){this.gl=t,this.buffer=e,this.vao=r,this.shader=n}var s=o.prototype;s.draw=function(t,e,r,n,i,a){for(var o=!1,s=0;s<3;++s)o=o||i[s];if(o){var l=this.gl;l.enable(l.POLYGON_OFFSET_FILL),l.polygonOffset(1,2),this.shader.bind(),this.shader.uniforms={model:t,view:e,projection:r,bounds:n,enable:i,colors:a},this.vao.bind(),this.vao.draw(this.gl.TRIANGLES,36),this.vao.unbind(),l.disable(l.POLYGON_OFFSET_FILL)}},s.dispose=function(){this.vao.dispose(),this.buffer.dispose(),this.shader.dispose()}},6429:function(t,e,r){\"use strict\";t.exports=function(t,e,r,a,p){i(s,e,t),i(s,r,s);for(var m=0,x=0;x<2;++x){c[2]=a[x][2];for(var b=0;b<2;++b){c[1]=a[b][1];for(var _=0;_<2;++_)c[0]=a[_][0],h(l[m],c,s),m+=1}}var w=-1;for(x=0;x<8;++x){for(var T=l[x][3],k=0;k<3;++k)u[x][k]=l[x][k]/T;p&&(u[x][2]*=-1),T<0&&(w<0||u[x][2]E&&(w|=1<E&&(w|=1<u[x][1])&&(R=x);var F=-1;for(x=0;x<3;++x)(N=R^1<u[B][0]&&(B=N))}var j=v;j[0]=j[1]=j[2]=0,j[n.log2(F^R)]=R&F,j[n.log2(R^B)]=R&B;var U=7^B;U===w||U===D?(U=7^F,j[n.log2(B^U)]=U&B):j[n.log2(F^U)]=U&F;var V=g,q=w;for(A=0;A<3;++A)V[A]=q&1< HALF_PI) && (b <= ONE_AND_HALF_PI)) ?\\n b - PI :\\n b;\\n}\\n\\nfloat look_horizontal_or_vertical(float a, float ratio) {\\n // ratio controls the ratio between being horizontal to (vertical + horizontal)\\n // if ratio is set to 0.5 then it is 50%, 50%.\\n // when using a higher ratio e.g. 0.75 the result would\\n // likely be more horizontal than vertical.\\n\\n float b = positive_angle(a);\\n\\n return\\n (b < ( ratio) * HALF_PI) ? 0.0 :\\n (b < (2.0 - ratio) * HALF_PI) ? -HALF_PI :\\n (b < (2.0 + ratio) * HALF_PI) ? 0.0 :\\n (b < (4.0 - ratio) * HALF_PI) ? HALF_PI :\\n 0.0;\\n}\\n\\nfloat roundTo(float a, float b) {\\n return float(b * floor((a + 0.5 * b) / b));\\n}\\n\\nfloat look_round_n_directions(float a, int n) {\\n float b = positive_angle(a);\\n float div = TWO_PI / float(n);\\n float c = roundTo(b, div);\\n return look_upwards(c);\\n}\\n\\nfloat applyAlignOption(float rawAngle, float delta) {\\n return\\n (option > 2) ? look_round_n_directions(rawAngle + delta, option) : // option 3-n: round to n directions\\n (option == 2) ? look_horizontal_or_vertical(rawAngle + delta, hv_ratio) : // horizontal or vertical\\n (option == 1) ? rawAngle + delta : // use free angle, and flip to align with one direction of the axis\\n (option == 0) ? look_upwards(rawAngle) : // use free angle, and stay upwards\\n (option ==-1) ? 0.0 : // useful for backward compatibility, all texts remains horizontal\\n rawAngle; // otherwise return back raw input angle\\n}\\n\\nbool isAxisTitle = (axis.x == 0.0) &&\\n (axis.y == 0.0) &&\\n (axis.z == 0.0);\\n\\nvoid main() {\\n //Compute world offset\\n float axisDistance = position.z;\\n vec3 dataPosition = axisDistance * axis + offset;\\n\\n float beta = angle; // i.e. user defined attributes for each tick\\n\\n float axisAngle;\\n float clipAngle;\\n float flip;\\n\\n if (enableAlign) {\\n axisAngle = (isAxisTitle) ? HALF_PI :\\n computeViewAngle(dataPosition, dataPosition + axis);\\n clipAngle = computeViewAngle(dataPosition, dataPosition + alignDir);\\n\\n axisAngle += (sin(axisAngle) < 0.0) ? PI : 0.0;\\n clipAngle += (sin(clipAngle) < 0.0) ? PI : 0.0;\\n\\n flip = (dot(vec2(cos(axisAngle), sin(axisAngle)),\\n vec2(sin(clipAngle),-cos(clipAngle))) > 0.0) ? 1.0 : 0.0;\\n\\n beta += applyAlignOption(clipAngle, flip * PI);\\n }\\n\\n //Compute plane offset\\n vec2 planeCoord = position.xy * pixelScale;\\n\\n mat2 planeXform = scale * mat2(\\n cos(beta), sin(beta),\\n -sin(beta), cos(beta)\\n );\\n\\n vec2 viewOffset = 2.0 * planeXform * planeCoord / resolution;\\n\\n //Compute clip position\\n vec3 clipPosition = project(dataPosition);\\n\\n //Apply text offset in clip coordinates\\n clipPosition += vec3(viewOffset, 0.0);\\n\\n //Done\\n gl_Position = vec4(clipPosition, 1.0);\\n}\"]),l=n([\"precision highp float;\\n#define GLSLIFY 1\\n\\nuniform vec4 color;\\nvoid main() {\\n gl_FragColor = color;\\n}\"]);e.Q=function(t){return i(t,s,l,null,[{name:\"position\",type:\"vec3\"}])};var u=n([\"precision highp float;\\n#define GLSLIFY 1\\n\\nattribute vec3 position;\\nattribute vec3 normal;\\n\\nuniform mat4 model, view, projection;\\nuniform vec3 enable;\\nuniform vec3 bounds[2];\\n\\nvarying vec3 colorChannel;\\n\\nvoid main() {\\n\\n vec3 signAxis = sign(bounds[1] - bounds[0]);\\n\\n vec3 realNormal = signAxis * normal;\\n\\n if(dot(realNormal, enable) > 0.0) {\\n vec3 minRange = min(bounds[0], bounds[1]);\\n vec3 maxRange = max(bounds[0], bounds[1]);\\n vec3 nPosition = mix(minRange, maxRange, 0.5 * (position + 1.0));\\n gl_Position = projection * view * model * vec4(nPosition, 1.0);\\n } else {\\n gl_Position = vec4(0,0,0,0);\\n }\\n\\n colorChannel = abs(realNormal);\\n}\"]),c=n([\"precision highp float;\\n#define GLSLIFY 1\\n\\nuniform vec4 colors[3];\\n\\nvarying vec3 colorChannel;\\n\\nvoid main() {\\n gl_FragColor = colorChannel.x * colors[0] +\\n colorChannel.y * colors[1] +\\n colorChannel.z * colors[2];\\n}\"]);e.bg=function(t){return i(t,u,c,null,[{name:\"position\",type:\"vec3\"},{name:\"normal\",type:\"vec3\"}])}},4935:function(t,e,r){\"use strict\";t.exports=function(t,e,r,n,o,l){var u=i(t),f=a(t,[{buffer:u,size:3}]),h=s(t);h.attributes.position.location=0;var p=new c(t,h,u,f);return p.update(e,r,n,o,l),p};var i=r(2762),a=r(8116),o=r(4359),s=r(1879).Q,l=window||n.global||{},u=l.__TEXT_CACHE||{};function c(t,e,r,n){this.gl=t,this.shader=e,this.buffer=r,this.vao=n,this.tickOffset=this.tickCount=this.labelOffset=this.labelCount=null}l.__TEXT_CACHE={};var f=c.prototype,h=[0,0];f.bind=function(t,e,r,n){this.vao.bind(),this.shader.bind();var i=this.shader.uniforms;i.model=t,i.view=e,i.projection=r,i.pixelScale=n,h[0]=this.gl.drawingBufferWidth,h[1]=this.gl.drawingBufferHeight,this.shader.uniforms.resolution=h},f.unbind=function(){this.vao.unbind()},f.update=function(t,e,r,n,i){var a=[];function s(t,e,r,n,i,s){var l=[r.style,r.weight,r.variant,r.family].join(\"_\"),c=u[l];c||(c=u[l]={});var f=c[e];f||(f=c[e]=function(t,e){try{return o(t,e)}catch(e){return console.warn('error vectorizing text:\"'+t+'\" error:',e),{cells:[],positions:[]}}}(e,{triangles:!0,font:r.family,fontStyle:r.style,fontWeight:r.weight,fontVariant:r.variant,textAlign:\"center\",textBaseline:\"middle\",lineSpacing:i,styletags:s}));for(var h=(n||12)/12,p=f.positions,d=f.cells,v=0,g=d.length;v=0;--m){var x=p[y[m]];a.push(h*x[0],-h*x[1],t)}}for(var l=[0,0,0],c=[0,0,0],f=[0,0,0],h=[0,0,0],p={breaklines:!0,bolds:!0,italics:!0,subscripts:!0,superscripts:!0},d=0;d<3;++d){f[d]=a.length/3|0,s(.5*(t[0][d]+t[1][d]),e[d],r[d],12,1.25,p),h[d]=(a.length/3|0)-f[d],l[d]=a.length/3|0;for(var v=0;v=0&&(i=r.length-n-1);var a=Math.pow(10,i),o=Math.round(t*e*a),s=o+\"\";if(s.indexOf(\"e\")>=0)return s;var l=o/a,u=o%a;o<0?(l=0|-Math.ceil(l),u=0|-u):(l=0|Math.floor(l),u|=0);var c=\"\"+l;if(o<0&&(c=\"-\"+c),i){for(var f=\"\"+u;f.length=t[0][i];--o)a.push({x:o*e[i],text:r(e[i],o)});n.push(a)}return n},e.equal=function(t,e){for(var r=0;r<3;++r){if(t[r].length!==e[r].length)return!1;for(var n=0;nr)throw new Error(\"gl-buffer: If resizing buffer, must not specify offset\");return t.bufferSubData(e,a,i),r}function c(t,e){for(var r=n.malloc(t.length,e),i=t.length,a=0;a=0;--n){if(e[n]!==r)return!1;r*=t[n]}return!0}(t.shape,t.stride))0===t.offset&&t.data.length===t.shape[0]?this.length=u(this.gl,this.type,this.length,this.usage,t.data,e):this.length=u(this.gl,this.type,this.length,this.usage,t.data.subarray(t.offset,t.shape[0]),e);else{var s=n.malloc(t.size,r),l=a(s,t.shape);i.assign(l,t),this.length=u(this.gl,this.type,this.length,this.usage,e<0?s:s.subarray(0,t.size),e),n.free(s)}}else if(Array.isArray(t)){var f;f=this.type===this.gl.ELEMENT_ARRAY_BUFFER?c(t,\"uint16\"):c(t,\"float32\"),this.length=u(this.gl,this.type,this.length,this.usage,e<0?f:f.subarray(0,t.length),e),n.free(f)}else if(\"object\"==typeof t&&\"number\"==typeof t.length)this.length=u(this.gl,this.type,this.length,this.usage,t,e);else{if(\"number\"!=typeof t&&void 0!==t)throw new Error(\"gl-buffer: Invalid data type\");if(e>=0)throw new Error(\"gl-buffer: Cannot specify offset when resizing buffer\");(t|=0)<=0&&(t=1),this.gl.bufferData(this.type,0|t,this.usage),this.length=t}},t.exports=function(t,e,r,n){if(r=r||t.ARRAY_BUFFER,n=n||t.DYNAMIC_DRAW,r!==t.ARRAY_BUFFER&&r!==t.ELEMENT_ARRAY_BUFFER)throw new Error(\"gl-buffer: Invalid type for webgl buffer, must be either gl.ARRAY_BUFFER or gl.ELEMENT_ARRAY_BUFFER\");if(n!==t.DYNAMIC_DRAW&&n!==t.STATIC_DRAW&&n!==t.STREAM_DRAW)throw new Error(\"gl-buffer: Invalid usage for buffer, must be either gl.DYNAMIC_DRAW, gl.STATIC_DRAW or gl.STREAM_DRAW\");var i=t.createBuffer(),a=new s(t,r,i,0,n);return a.update(e),a}},6405:function(t,e,r){\"use strict\";var n=r(2931);t.exports=function(t,e){var r=t.positions,i=t.vectors,a={positions:[],vertexIntensity:[],vertexIntensityBounds:t.vertexIntensityBounds,vectors:[],cells:[],coneOffset:t.coneOffset,colormap:t.colormap};if(0===t.positions.length)return e&&(e[0]=[0,0,0],e[1]=[0,0,0]),a;for(var o=0,s=1/0,l=-1/0,u=1/0,c=-1/0,f=1/0,h=-1/0,p=null,d=null,v=[],g=1/0,y=!1,m=\"raw\"===t.coneSizemode,x=0;xo&&(o=n.length(_)),x&&!m){var w=2*n.distance(p,b)/(n.length(d)+n.length(_));w?(g=Math.min(g,w),y=!1):y=!0}y||(p=b,d=_),v.push(_)}var T=[s,u,f],k=[l,c,h];e&&(e[0]=T,e[1]=k),0===o&&(o=1);var A=1/o;isFinite(g)||(g=1),a.vectorScale=g;var M=t.coneSize||(m?1:.5);t.absoluteConeSize&&(M=t.absoluteConeSize*A),a.coneScale=M,x=0;for(var S=0;x=1},p.isTransparent=function(){return this.opacity<1},p.pickSlots=1,p.setPickBase=function(t){this.pickId=t},p.update=function(t){t=t||{};var e=this.gl;this.dirty=!0,\"lightPosition\"in t&&(this.lightPosition=t.lightPosition),\"opacity\"in t&&(this.opacity=t.opacity),\"ambient\"in t&&(this.ambientLight=t.ambient),\"diffuse\"in t&&(this.diffuseLight=t.diffuse),\"specular\"in t&&(this.specularLight=t.specular),\"roughness\"in t&&(this.roughness=t.roughness),\"fresnel\"in t&&(this.fresnel=t.fresnel),void 0!==t.tubeScale&&(this.tubeScale=t.tubeScale),void 0!==t.vectorScale&&(this.vectorScale=t.vectorScale),void 0!==t.coneScale&&(this.coneScale=t.coneScale),void 0!==t.coneOffset&&(this.coneOffset=t.coneOffset),t.colormap&&(this.texture.shape=[256,256],this.texture.minFilter=e.LINEAR_MIPMAP_LINEAR,this.texture.magFilter=e.LINEAR,this.texture.setPixels(function(t){for(var e=c({colormap:t,nshades:256,format:\"rgba\"}),r=new Uint8Array(1024),n=0;n<256;++n){for(var i=e[n],a=0;a<3;++a)r[4*n+a]=i[a];r[4*n+3]=255*i[3]}return u(r,[256,256,4],[4,0,1])}(t.colormap)),this.texture.generateMipmap());var r=t.cells,n=t.positions,i=t.vectors;if(n&&r&&i){var a=[],o=[],s=[],l=[],f=[];this.cells=r,this.positions=n,this.vectors=i;var h=t.meshColor||[1,1,1,1],p=t.vertexIntensity,d=1/0,v=-1/0;if(p)if(t.vertexIntensityBounds)d=+t.vertexIntensityBounds[0],v=+t.vertexIntensityBounds[1];else for(var g=0;g0){var v=this.triShader;v.bind(),v.uniforms=u,this.triangleVAO.bind(),e.drawArrays(e.TRIANGLES,0,3*this.triangleCount),this.triangleVAO.unbind()}},p.drawPick=function(t){t=t||{};for(var e=this.gl,r=t.model||f,n=t.view||f,i=t.projection||f,a=[[-1e6,-1e6,-1e6],[1e6,1e6,1e6]],o=0;o<3;++o)a[0][o]=Math.max(a[0][o],this.clipBounds[0][o]),a[1][o]=Math.min(a[1][o],this.clipBounds[1][o]);this._model=[].slice.call(r),this._view=[].slice.call(n),this._projection=[].slice.call(i),this._resolution=[e.drawingBufferWidth,e.drawingBufferHeight];var s={model:r,view:n,projection:i,clipBounds:a,tubeScale:this.tubeScale,vectorScale:this.vectorScale,coneScale:this.coneScale,coneOffset:this.coneOffset,pickId:this.pickId/255},l=this.pickShader;l.bind(),l.uniforms=s,this.triangleCount>0&&(this.triangleVAO.bind(),e.drawArrays(e.TRIANGLES,0,3*this.triangleCount),this.triangleVAO.unbind())},p.pick=function(t){if(!t)return null;if(t.id!==this.pickId)return null;var e=t.value[0]+256*t.value[1]+65536*t.value[2],r=this.cells[e],n=this.positions[r[1]].slice(0,3),i={position:n,dataCoordinate:n,index:Math.floor(r[1]/48)};return\"cone\"===this.traceType?i.index=Math.floor(r[1]/48):\"streamtube\"===this.traceType&&(i.intensity=this.intensity[r[1]],i.velocity=this.vectors[r[1]].slice(0,3),i.divergence=this.vectors[r[1]][3],i.index=e),i},p.dispose=function(){this.texture.dispose(),this.triShader.dispose(),this.pickShader.dispose(),this.triangleVAO.dispose(),this.trianglePositions.dispose(),this.triangleVectors.dispose(),this.triangleColors.dispose(),this.triangleUVs.dispose(),this.triangleIds.dispose()},t.exports=function(t,e,r){var s=r.shaders;1===arguments.length&&(t=(e=t).gl);var l=function(t,e){var r=n(t,e.meshShader.vertex,e.meshShader.fragment,null,e.meshShader.attributes);return r.attributes.position.location=0,r.attributes.color.location=2,r.attributes.uv.location=3,r.attributes.vector.location=4,r}(t,s),c=function(t,e){var r=n(t,e.pickShader.vertex,e.pickShader.fragment,null,e.pickShader.attributes);return r.attributes.position.location=0,r.attributes.id.location=1,r.attributes.vector.location=4,r}(t,s),f=o(t,u(new Uint8Array([255,255,255,255]),[1,1,4]));f.generateMipmap(),f.minFilter=t.LINEAR_MIPMAP_LINEAR,f.magFilter=t.LINEAR;var p=i(t),d=i(t),v=i(t),g=i(t),y=i(t),m=new h(t,f,l,c,p,d,y,v,g,a(t,[{buffer:p,type:t.FLOAT,size:4},{buffer:y,type:t.UNSIGNED_BYTE,size:4,normalized:!0},{buffer:v,type:t.FLOAT,size:4},{buffer:g,type:t.FLOAT,size:2},{buffer:d,type:t.FLOAT,size:4}]),r.traceType||\"cone\");return m.update(e),m}},614:function(t,e,r){var n=r(3236),i=n([\"precision highp float;\\n\\nprecision highp float;\\n#define GLSLIFY 1\\n\\nvec3 getOrthogonalVector(vec3 v) {\\n // Return up-vector for only-z vector.\\n // Return ax + by + cz = 0, a point that lies on the plane that has v as a normal and that isn't (0,0,0).\\n // From the above if-statement we have ||a|| > 0 U ||b|| > 0.\\n // Assign z = 0, x = -b, y = a:\\n // a*-b + b*a + c*0 = -ba + ba + 0 = 0\\n if (v.x*v.x > v.z*v.z || v.y*v.y > v.z*v.z) {\\n return normalize(vec3(-v.y, v.x, 0.0));\\n } else {\\n return normalize(vec3(0.0, v.z, -v.y));\\n }\\n}\\n\\n// Calculate the cone vertex and normal at the given index.\\n//\\n// The returned vertex is for a cone with its top at origin and height of 1.0,\\n// pointing in the direction of the vector attribute.\\n//\\n// Each cone is made up of a top vertex, a center base vertex and base perimeter vertices.\\n// These vertices are used to make up the triangles of the cone by the following:\\n// segment + 0 top vertex\\n// segment + 1 perimeter vertex a+1\\n// segment + 2 perimeter vertex a\\n// segment + 3 center base vertex\\n// segment + 4 perimeter vertex a\\n// segment + 5 perimeter vertex a+1\\n// Where segment is the number of the radial segment * 6 and a is the angle at that radial segment.\\n// To go from index to segment, floor(index / 6)\\n// To go from segment to angle, 2*pi * (segment/segmentCount)\\n// To go from index to segment index, index - (segment*6)\\n//\\nvec3 getConePosition(vec3 d, float rawIndex, float coneOffset, out vec3 normal) {\\n\\n const float segmentCount = 8.0;\\n\\n float index = rawIndex - floor(rawIndex /\\n (segmentCount * 6.0)) *\\n (segmentCount * 6.0);\\n\\n float segment = floor(0.001 + index/6.0);\\n float segmentIndex = index - (segment*6.0);\\n\\n normal = -normalize(d);\\n\\n if (segmentIndex > 2.99 && segmentIndex < 3.01) {\\n return mix(vec3(0.0), -d, coneOffset);\\n }\\n\\n float nextAngle = (\\n (segmentIndex > 0.99 && segmentIndex < 1.01) ||\\n (segmentIndex > 4.99 && segmentIndex < 5.01)\\n ) ? 1.0 : 0.0;\\n float angle = 2.0 * 3.14159 * ((segment + nextAngle) / segmentCount);\\n\\n vec3 v1 = mix(d, vec3(0.0), coneOffset);\\n vec3 v2 = v1 - d;\\n\\n vec3 u = getOrthogonalVector(d);\\n vec3 v = normalize(cross(u, d));\\n\\n vec3 x = u * cos(angle) * length(d)*0.25;\\n vec3 y = v * sin(angle) * length(d)*0.25;\\n vec3 v3 = v2 + x + y;\\n if (segmentIndex < 3.0) {\\n vec3 tx = u * sin(angle);\\n vec3 ty = v * -cos(angle);\\n vec3 tangent = tx + ty;\\n normal = normalize(cross(v3 - v1, tangent));\\n }\\n\\n if (segmentIndex == 0.0) {\\n return mix(d, vec3(0.0), coneOffset);\\n }\\n return v3;\\n}\\n\\nattribute vec3 vector;\\nattribute vec4 color, position;\\nattribute vec2 uv;\\n\\nuniform float vectorScale, coneScale, coneOffset;\\nuniform mat4 model, view, projection, inverseModel;\\nuniform vec3 eyePosition, lightPosition;\\n\\nvarying vec3 f_normal, f_lightDirection, f_eyeDirection, f_data, f_position;\\nvarying vec4 f_color;\\nvarying vec2 f_uv;\\n\\nvoid main() {\\n // Scale the vector magnitude to stay constant with\\n // model & view changes.\\n vec3 normal;\\n vec3 XYZ = getConePosition(mat3(model) * ((vectorScale * coneScale) * vector), position.w, coneOffset, normal);\\n vec4 conePosition = model * vec4(position.xyz, 1.0) + vec4(XYZ, 0.0);\\n\\n //Lighting geometry parameters\\n vec4 cameraCoordinate = view * conePosition;\\n cameraCoordinate.xyz /= cameraCoordinate.w;\\n f_lightDirection = lightPosition - cameraCoordinate.xyz;\\n f_eyeDirection = eyePosition - cameraCoordinate.xyz;\\n f_normal = normalize((vec4(normal, 0.0) * inverseModel).xyz);\\n\\n // vec4 m_position = model * vec4(conePosition, 1.0);\\n vec4 t_position = view * conePosition;\\n gl_Position = projection * t_position;\\n\\n f_color = color;\\n f_data = conePosition.xyz;\\n f_position = position.xyz;\\n f_uv = uv;\\n}\\n\"]),a=n([\"#extension GL_OES_standard_derivatives : enable\\n\\nprecision highp float;\\n#define GLSLIFY 1\\n\\nfloat beckmannDistribution(float x, float roughness) {\\n float NdotH = max(x, 0.0001);\\n float cos2Alpha = NdotH * NdotH;\\n float tan2Alpha = (cos2Alpha - 1.0) / cos2Alpha;\\n float roughness2 = roughness * roughness;\\n float denom = 3.141592653589793 * roughness2 * cos2Alpha * cos2Alpha;\\n return exp(tan2Alpha / roughness2) / denom;\\n}\\n\\nfloat cookTorranceSpecular(\\n vec3 lightDirection,\\n vec3 viewDirection,\\n vec3 surfaceNormal,\\n float roughness,\\n float fresnel) {\\n\\n float VdotN = max(dot(viewDirection, surfaceNormal), 0.0);\\n float LdotN = max(dot(lightDirection, surfaceNormal), 0.0);\\n\\n //Half angle vector\\n vec3 H = normalize(lightDirection + viewDirection);\\n\\n //Geometric term\\n float NdotH = max(dot(surfaceNormal, H), 0.0);\\n float VdotH = max(dot(viewDirection, H), 0.000001);\\n float LdotH = max(dot(lightDirection, H), 0.000001);\\n float G1 = (2.0 * NdotH * VdotN) / VdotH;\\n float G2 = (2.0 * NdotH * LdotN) / LdotH;\\n float G = min(1.0, min(G1, G2));\\n \\n //Distribution term\\n float D = beckmannDistribution(NdotH, roughness);\\n\\n //Fresnel term\\n float F = pow(1.0 - VdotN, fresnel);\\n\\n //Multiply terms and done\\n return G * F * D / max(3.14159265 * VdotN, 0.000001);\\n}\\n\\nbool outOfRange(float a, float b, float p) {\\n return ((p > max(a, b)) || \\n (p < min(a, b)));\\n}\\n\\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y));\\n}\\n\\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y) ||\\n outOfRange(a.z, b.z, p.z));\\n}\\n\\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\\n return outOfRange(a.xyz, b.xyz, p.xyz);\\n}\\n\\nuniform vec3 clipBounds[2];\\nuniform float roughness, fresnel, kambient, kdiffuse, kspecular, opacity;\\nuniform sampler2D texture;\\n\\nvarying vec3 f_normal, f_lightDirection, f_eyeDirection, f_data, f_position;\\nvarying vec4 f_color;\\nvarying vec2 f_uv;\\n\\nvoid main() {\\n if (outOfRange(clipBounds[0], clipBounds[1], f_position)) discard;\\n vec3 N = normalize(f_normal);\\n vec3 L = normalize(f_lightDirection);\\n vec3 V = normalize(f_eyeDirection);\\n\\n if(gl_FrontFacing) {\\n N = -N;\\n }\\n\\n float specular = min(1.0, max(0.0, cookTorranceSpecular(L, V, N, roughness, fresnel)));\\n float diffuse = min(kambient + kdiffuse * max(dot(N, L), 0.0), 1.0);\\n\\n vec4 surfaceColor = f_color * texture2D(texture, f_uv);\\n vec4 litColor = surfaceColor.a * vec4(diffuse * surfaceColor.rgb + kspecular * vec3(1,1,1) * specular, 1.0);\\n\\n gl_FragColor = litColor * opacity;\\n}\\n\"]),o=n([\"precision highp float;\\n\\nprecision highp float;\\n#define GLSLIFY 1\\n\\nvec3 getOrthogonalVector(vec3 v) {\\n // Return up-vector for only-z vector.\\n // Return ax + by + cz = 0, a point that lies on the plane that has v as a normal and that isn't (0,0,0).\\n // From the above if-statement we have ||a|| > 0 U ||b|| > 0.\\n // Assign z = 0, x = -b, y = a:\\n // a*-b + b*a + c*0 = -ba + ba + 0 = 0\\n if (v.x*v.x > v.z*v.z || v.y*v.y > v.z*v.z) {\\n return normalize(vec3(-v.y, v.x, 0.0));\\n } else {\\n return normalize(vec3(0.0, v.z, -v.y));\\n }\\n}\\n\\n// Calculate the cone vertex and normal at the given index.\\n//\\n// The returned vertex is for a cone with its top at origin and height of 1.0,\\n// pointing in the direction of the vector attribute.\\n//\\n// Each cone is made up of a top vertex, a center base vertex and base perimeter vertices.\\n// These vertices are used to make up the triangles of the cone by the following:\\n// segment + 0 top vertex\\n// segment + 1 perimeter vertex a+1\\n// segment + 2 perimeter vertex a\\n// segment + 3 center base vertex\\n// segment + 4 perimeter vertex a\\n// segment + 5 perimeter vertex a+1\\n// Where segment is the number of the radial segment * 6 and a is the angle at that radial segment.\\n// To go from index to segment, floor(index / 6)\\n// To go from segment to angle, 2*pi * (segment/segmentCount)\\n// To go from index to segment index, index - (segment*6)\\n//\\nvec3 getConePosition(vec3 d, float rawIndex, float coneOffset, out vec3 normal) {\\n\\n const float segmentCount = 8.0;\\n\\n float index = rawIndex - floor(rawIndex /\\n (segmentCount * 6.0)) *\\n (segmentCount * 6.0);\\n\\n float segment = floor(0.001 + index/6.0);\\n float segmentIndex = index - (segment*6.0);\\n\\n normal = -normalize(d);\\n\\n if (segmentIndex > 2.99 && segmentIndex < 3.01) {\\n return mix(vec3(0.0), -d, coneOffset);\\n }\\n\\n float nextAngle = (\\n (segmentIndex > 0.99 && segmentIndex < 1.01) ||\\n (segmentIndex > 4.99 && segmentIndex < 5.01)\\n ) ? 1.0 : 0.0;\\n float angle = 2.0 * 3.14159 * ((segment + nextAngle) / segmentCount);\\n\\n vec3 v1 = mix(d, vec3(0.0), coneOffset);\\n vec3 v2 = v1 - d;\\n\\n vec3 u = getOrthogonalVector(d);\\n vec3 v = normalize(cross(u, d));\\n\\n vec3 x = u * cos(angle) * length(d)*0.25;\\n vec3 y = v * sin(angle) * length(d)*0.25;\\n vec3 v3 = v2 + x + y;\\n if (segmentIndex < 3.0) {\\n vec3 tx = u * sin(angle);\\n vec3 ty = v * -cos(angle);\\n vec3 tangent = tx + ty;\\n normal = normalize(cross(v3 - v1, tangent));\\n }\\n\\n if (segmentIndex == 0.0) {\\n return mix(d, vec3(0.0), coneOffset);\\n }\\n return v3;\\n}\\n\\nattribute vec4 vector;\\nattribute vec4 position;\\nattribute vec4 id;\\n\\nuniform mat4 model, view, projection;\\nuniform float vectorScale, coneScale, coneOffset;\\n\\nvarying vec3 f_position;\\nvarying vec4 f_id;\\n\\nvoid main() {\\n vec3 normal;\\n vec3 XYZ = getConePosition(mat3(model) * ((vectorScale * coneScale) * vector.xyz), position.w, coneOffset, normal);\\n vec4 conePosition = model * vec4(position.xyz, 1.0) + vec4(XYZ, 0.0);\\n gl_Position = projection * view * conePosition;\\n f_id = id;\\n f_position = position.xyz;\\n}\\n\"]),s=n([\"precision highp float;\\n#define GLSLIFY 1\\n\\nbool outOfRange(float a, float b, float p) {\\n return ((p > max(a, b)) || \\n (p < min(a, b)));\\n}\\n\\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y));\\n}\\n\\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y) ||\\n outOfRange(a.z, b.z, p.z));\\n}\\n\\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\\n return outOfRange(a.xyz, b.xyz, p.xyz);\\n}\\n\\nuniform vec3 clipBounds[2];\\nuniform float pickId;\\n\\nvarying vec3 f_position;\\nvarying vec4 f_id;\\n\\nvoid main() {\\n if (outOfRange(clipBounds[0], clipBounds[1], f_position)) discard;\\n\\n gl_FragColor = vec4(pickId, f_id.xyz);\\n}\"]);e.meshShader={vertex:i,fragment:a,attributes:[{name:\"position\",type:\"vec4\"},{name:\"color\",type:\"vec4\"},{name:\"uv\",type:\"vec2\"},{name:\"vector\",type:\"vec3\"}]},e.pickShader={vertex:o,fragment:s,attributes:[{name:\"position\",type:\"vec4\"},{name:\"id\",type:\"vec4\"},{name:\"vector\",type:\"vec3\"}]}},737:function(t){t.exports={0:\"NONE\",1:\"ONE\",2:\"LINE_LOOP\",3:\"LINE_STRIP\",4:\"TRIANGLES\",5:\"TRIANGLE_STRIP\",6:\"TRIANGLE_FAN\",256:\"DEPTH_BUFFER_BIT\",512:\"NEVER\",513:\"LESS\",514:\"EQUAL\",515:\"LEQUAL\",516:\"GREATER\",517:\"NOTEQUAL\",518:\"GEQUAL\",519:\"ALWAYS\",768:\"SRC_COLOR\",769:\"ONE_MINUS_SRC_COLOR\",770:\"SRC_ALPHA\",771:\"ONE_MINUS_SRC_ALPHA\",772:\"DST_ALPHA\",773:\"ONE_MINUS_DST_ALPHA\",774:\"DST_COLOR\",775:\"ONE_MINUS_DST_COLOR\",776:\"SRC_ALPHA_SATURATE\",1024:\"STENCIL_BUFFER_BIT\",1028:\"FRONT\",1029:\"BACK\",1032:\"FRONT_AND_BACK\",1280:\"INVALID_ENUM\",1281:\"INVALID_VALUE\",1282:\"INVALID_OPERATION\",1285:\"OUT_OF_MEMORY\",1286:\"INVALID_FRAMEBUFFER_OPERATION\",2304:\"CW\",2305:\"CCW\",2849:\"LINE_WIDTH\",2884:\"CULL_FACE\",2885:\"CULL_FACE_MODE\",2886:\"FRONT_FACE\",2928:\"DEPTH_RANGE\",2929:\"DEPTH_TEST\",2930:\"DEPTH_WRITEMASK\",2931:\"DEPTH_CLEAR_VALUE\",2932:\"DEPTH_FUNC\",2960:\"STENCIL_TEST\",2961:\"STENCIL_CLEAR_VALUE\",2962:\"STENCIL_FUNC\",2963:\"STENCIL_VALUE_MASK\",2964:\"STENCIL_FAIL\",2965:\"STENCIL_PASS_DEPTH_FAIL\",2966:\"STENCIL_PASS_DEPTH_PASS\",2967:\"STENCIL_REF\",2968:\"STENCIL_WRITEMASK\",2978:\"VIEWPORT\",3024:\"DITHER\",3042:\"BLEND\",3088:\"SCISSOR_BOX\",3089:\"SCISSOR_TEST\",3106:\"COLOR_CLEAR_VALUE\",3107:\"COLOR_WRITEMASK\",3317:\"UNPACK_ALIGNMENT\",3333:\"PACK_ALIGNMENT\",3379:\"MAX_TEXTURE_SIZE\",3386:\"MAX_VIEWPORT_DIMS\",3408:\"SUBPIXEL_BITS\",3410:\"RED_BITS\",3411:\"GREEN_BITS\",3412:\"BLUE_BITS\",3413:\"ALPHA_BITS\",3414:\"DEPTH_BITS\",3415:\"STENCIL_BITS\",3553:\"TEXTURE_2D\",4352:\"DONT_CARE\",4353:\"FASTEST\",4354:\"NICEST\",5120:\"BYTE\",5121:\"UNSIGNED_BYTE\",5122:\"SHORT\",5123:\"UNSIGNED_SHORT\",5124:\"INT\",5125:\"UNSIGNED_INT\",5126:\"FLOAT\",5386:\"INVERT\",5890:\"TEXTURE\",6401:\"STENCIL_INDEX\",6402:\"DEPTH_COMPONENT\",6406:\"ALPHA\",6407:\"RGB\",6408:\"RGBA\",6409:\"LUMINANCE\",6410:\"LUMINANCE_ALPHA\",7680:\"KEEP\",7681:\"REPLACE\",7682:\"INCR\",7683:\"DECR\",7936:\"VENDOR\",7937:\"RENDERER\",7938:\"VERSION\",9728:\"NEAREST\",9729:\"LINEAR\",9984:\"NEAREST_MIPMAP_NEAREST\",9985:\"LINEAR_MIPMAP_NEAREST\",9986:\"NEAREST_MIPMAP_LINEAR\",9987:\"LINEAR_MIPMAP_LINEAR\",10240:\"TEXTURE_MAG_FILTER\",10241:\"TEXTURE_MIN_FILTER\",10242:\"TEXTURE_WRAP_S\",10243:\"TEXTURE_WRAP_T\",10497:\"REPEAT\",10752:\"POLYGON_OFFSET_UNITS\",16384:\"COLOR_BUFFER_BIT\",32769:\"CONSTANT_COLOR\",32770:\"ONE_MINUS_CONSTANT_COLOR\",32771:\"CONSTANT_ALPHA\",32772:\"ONE_MINUS_CONSTANT_ALPHA\",32773:\"BLEND_COLOR\",32774:\"FUNC_ADD\",32777:\"BLEND_EQUATION_RGB\",32778:\"FUNC_SUBTRACT\",32779:\"FUNC_REVERSE_SUBTRACT\",32819:\"UNSIGNED_SHORT_4_4_4_4\",32820:\"UNSIGNED_SHORT_5_5_5_1\",32823:\"POLYGON_OFFSET_FILL\",32824:\"POLYGON_OFFSET_FACTOR\",32854:\"RGBA4\",32855:\"RGB5_A1\",32873:\"TEXTURE_BINDING_2D\",32926:\"SAMPLE_ALPHA_TO_COVERAGE\",32928:\"SAMPLE_COVERAGE\",32936:\"SAMPLE_BUFFERS\",32937:\"SAMPLES\",32938:\"SAMPLE_COVERAGE_VALUE\",32939:\"SAMPLE_COVERAGE_INVERT\",32968:\"BLEND_DST_RGB\",32969:\"BLEND_SRC_RGB\",32970:\"BLEND_DST_ALPHA\",32971:\"BLEND_SRC_ALPHA\",33071:\"CLAMP_TO_EDGE\",33170:\"GENERATE_MIPMAP_HINT\",33189:\"DEPTH_COMPONENT16\",33306:\"DEPTH_STENCIL_ATTACHMENT\",33635:\"UNSIGNED_SHORT_5_6_5\",33648:\"MIRRORED_REPEAT\",33901:\"ALIASED_POINT_SIZE_RANGE\",33902:\"ALIASED_LINE_WIDTH_RANGE\",33984:\"TEXTURE0\",33985:\"TEXTURE1\",33986:\"TEXTURE2\",33987:\"TEXTURE3\",33988:\"TEXTURE4\",33989:\"TEXTURE5\",33990:\"TEXTURE6\",33991:\"TEXTURE7\",33992:\"TEXTURE8\",33993:\"TEXTURE9\",33994:\"TEXTURE10\",33995:\"TEXTURE11\",33996:\"TEXTURE12\",33997:\"TEXTURE13\",33998:\"TEXTURE14\",33999:\"TEXTURE15\",34e3:\"TEXTURE16\",34001:\"TEXTURE17\",34002:\"TEXTURE18\",34003:\"TEXTURE19\",34004:\"TEXTURE20\",34005:\"TEXTURE21\",34006:\"TEXTURE22\",34007:\"TEXTURE23\",34008:\"TEXTURE24\",34009:\"TEXTURE25\",34010:\"TEXTURE26\",34011:\"TEXTURE27\",34012:\"TEXTURE28\",34013:\"TEXTURE29\",34014:\"TEXTURE30\",34015:\"TEXTURE31\",34016:\"ACTIVE_TEXTURE\",34024:\"MAX_RENDERBUFFER_SIZE\",34041:\"DEPTH_STENCIL\",34055:\"INCR_WRAP\",34056:\"DECR_WRAP\",34067:\"TEXTURE_CUBE_MAP\",34068:\"TEXTURE_BINDING_CUBE_MAP\",34069:\"TEXTURE_CUBE_MAP_POSITIVE_X\",34070:\"TEXTURE_CUBE_MAP_NEGATIVE_X\",34071:\"TEXTURE_CUBE_MAP_POSITIVE_Y\",34072:\"TEXTURE_CUBE_MAP_NEGATIVE_Y\",34073:\"TEXTURE_CUBE_MAP_POSITIVE_Z\",34074:\"TEXTURE_CUBE_MAP_NEGATIVE_Z\",34076:\"MAX_CUBE_MAP_TEXTURE_SIZE\",34338:\"VERTEX_ATTRIB_ARRAY_ENABLED\",34339:\"VERTEX_ATTRIB_ARRAY_SIZE\",34340:\"VERTEX_ATTRIB_ARRAY_STRIDE\",34341:\"VERTEX_ATTRIB_ARRAY_TYPE\",34342:\"CURRENT_VERTEX_ATTRIB\",34373:\"VERTEX_ATTRIB_ARRAY_POINTER\",34466:\"NUM_COMPRESSED_TEXTURE_FORMATS\",34467:\"COMPRESSED_TEXTURE_FORMATS\",34660:\"BUFFER_SIZE\",34661:\"BUFFER_USAGE\",34816:\"STENCIL_BACK_FUNC\",34817:\"STENCIL_BACK_FAIL\",34818:\"STENCIL_BACK_PASS_DEPTH_FAIL\",34819:\"STENCIL_BACK_PASS_DEPTH_PASS\",34877:\"BLEND_EQUATION_ALPHA\",34921:\"MAX_VERTEX_ATTRIBS\",34922:\"VERTEX_ATTRIB_ARRAY_NORMALIZED\",34930:\"MAX_TEXTURE_IMAGE_UNITS\",34962:\"ARRAY_BUFFER\",34963:\"ELEMENT_ARRAY_BUFFER\",34964:\"ARRAY_BUFFER_BINDING\",34965:\"ELEMENT_ARRAY_BUFFER_BINDING\",34975:\"VERTEX_ATTRIB_ARRAY_BUFFER_BINDING\",35040:\"STREAM_DRAW\",35044:\"STATIC_DRAW\",35048:\"DYNAMIC_DRAW\",35632:\"FRAGMENT_SHADER\",35633:\"VERTEX_SHADER\",35660:\"MAX_VERTEX_TEXTURE_IMAGE_UNITS\",35661:\"MAX_COMBINED_TEXTURE_IMAGE_UNITS\",35663:\"SHADER_TYPE\",35664:\"FLOAT_VEC2\",35665:\"FLOAT_VEC3\",35666:\"FLOAT_VEC4\",35667:\"INT_VEC2\",35668:\"INT_VEC3\",35669:\"INT_VEC4\",35670:\"BOOL\",35671:\"BOOL_VEC2\",35672:\"BOOL_VEC3\",35673:\"BOOL_VEC4\",35674:\"FLOAT_MAT2\",35675:\"FLOAT_MAT3\",35676:\"FLOAT_MAT4\",35678:\"SAMPLER_2D\",35680:\"SAMPLER_CUBE\",35712:\"DELETE_STATUS\",35713:\"COMPILE_STATUS\",35714:\"LINK_STATUS\",35715:\"VALIDATE_STATUS\",35716:\"INFO_LOG_LENGTH\",35717:\"ATTACHED_SHADERS\",35718:\"ACTIVE_UNIFORMS\",35719:\"ACTIVE_UNIFORM_MAX_LENGTH\",35720:\"SHADER_SOURCE_LENGTH\",35721:\"ACTIVE_ATTRIBUTES\",35722:\"ACTIVE_ATTRIBUTE_MAX_LENGTH\",35724:\"SHADING_LANGUAGE_VERSION\",35725:\"CURRENT_PROGRAM\",36003:\"STENCIL_BACK_REF\",36004:\"STENCIL_BACK_VALUE_MASK\",36005:\"STENCIL_BACK_WRITEMASK\",36006:\"FRAMEBUFFER_BINDING\",36007:\"RENDERBUFFER_BINDING\",36048:\"FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE\",36049:\"FRAMEBUFFER_ATTACHMENT_OBJECT_NAME\",36050:\"FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL\",36051:\"FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE\",36053:\"FRAMEBUFFER_COMPLETE\",36054:\"FRAMEBUFFER_INCOMPLETE_ATTACHMENT\",36055:\"FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT\",36057:\"FRAMEBUFFER_INCOMPLETE_DIMENSIONS\",36061:\"FRAMEBUFFER_UNSUPPORTED\",36064:\"COLOR_ATTACHMENT0\",36096:\"DEPTH_ATTACHMENT\",36128:\"STENCIL_ATTACHMENT\",36160:\"FRAMEBUFFER\",36161:\"RENDERBUFFER\",36162:\"RENDERBUFFER_WIDTH\",36163:\"RENDERBUFFER_HEIGHT\",36164:\"RENDERBUFFER_INTERNAL_FORMAT\",36168:\"STENCIL_INDEX8\",36176:\"RENDERBUFFER_RED_SIZE\",36177:\"RENDERBUFFER_GREEN_SIZE\",36178:\"RENDERBUFFER_BLUE_SIZE\",36179:\"RENDERBUFFER_ALPHA_SIZE\",36180:\"RENDERBUFFER_DEPTH_SIZE\",36181:\"RENDERBUFFER_STENCIL_SIZE\",36194:\"RGB565\",36336:\"LOW_FLOAT\",36337:\"MEDIUM_FLOAT\",36338:\"HIGH_FLOAT\",36339:\"LOW_INT\",36340:\"MEDIUM_INT\",36341:\"HIGH_INT\",36346:\"SHADER_COMPILER\",36347:\"MAX_VERTEX_UNIFORM_VECTORS\",36348:\"MAX_VARYING_VECTORS\",36349:\"MAX_FRAGMENT_UNIFORM_VECTORS\",37440:\"UNPACK_FLIP_Y_WEBGL\",37441:\"UNPACK_PREMULTIPLY_ALPHA_WEBGL\",37442:\"CONTEXT_LOST_WEBGL\",37443:\"UNPACK_COLORSPACE_CONVERSION_WEBGL\",37444:\"BROWSER_DEFAULT_WEBGL\"}},5171:function(t,e,r){var n=r(737);t.exports=function(t){return n[t]}},9165:function(t,e,r){\"use strict\";t.exports=function(t){var e=t.gl,r=n(e),o=i(e,[{buffer:r,type:e.FLOAT,size:3,offset:0,stride:40},{buffer:r,type:e.FLOAT,size:4,offset:12,stride:40},{buffer:r,type:e.FLOAT,size:3,offset:28,stride:40}]),l=a(e);l.attributes.position.location=0,l.attributes.color.location=1,l.attributes.offset.location=2;var u=new s(e,r,o,l);return u.update(t),u};var n=r(2762),i=r(8116),a=r(3436),o=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];function s(t,e,r,n){this.gl=t,this.shader=n,this.buffer=e,this.vao=r,this.pixelRatio=1,this.bounds=[[1/0,1/0,1/0],[-1/0,-1/0,-1/0]],this.clipBounds=[[-1/0,-1/0,-1/0],[1/0,1/0,1/0]],this.lineWidth=[1,1,1],this.capSize=[10,10,10],this.lineCount=[0,0,0],this.lineOffset=[0,0,0],this.opacity=1,this.hasAlpha=!1}var l=s.prototype;function u(t,e){for(var r=0;r<3;++r)t[0][r]=Math.min(t[0][r],e[r]),t[1][r]=Math.max(t[1][r],e[r])}l.isOpaque=function(){return!this.hasAlpha},l.isTransparent=function(){return this.hasAlpha},l.drawTransparent=l.draw=function(t){var e=this.gl,r=this.shader.uniforms;this.shader.bind();var n=r.view=t.view||o,i=r.projection=t.projection||o;r.model=t.model||o,r.clipBounds=this.clipBounds,r.opacity=this.opacity;var a=n[12],s=n[13],l=n[14],u=n[15],c=(t._ortho?2:1)*this.pixelRatio*(i[3]*a+i[7]*s+i[11]*l+i[15]*u)/e.drawingBufferHeight;this.vao.bind();for(var f=0;f<3;++f)e.lineWidth(this.lineWidth[f]*this.pixelRatio),r.capSize=this.capSize[f]*c,this.lineCount[f]&&e.drawArrays(e.LINES,this.lineOffset[f],this.lineCount[f]);this.vao.unbind()};var c=function(){for(var t=new Array(3),e=0;e<3;++e){for(var r=[],n=1;n<=2;++n)for(var i=-1;i<=1;i+=2){var a=[0,0,0];a[(n+e)%3]=i,r.push(a)}t[e]=r}return t}();function f(t,e,r,n){for(var i=c[n],a=0;a0&&((p=c.slice())[s]+=d[1][s],i.push(c[0],c[1],c[2],v[0],v[1],v[2],v[3],0,0,0,p[0],p[1],p[2],v[0],v[1],v[2],v[3],0,0,0),u(this.bounds,p),o+=2+f(i,p,v,s))}this.lineCount[s]=o-this.lineOffset[s]}this.buffer.update(i)}},l.dispose=function(){this.shader.dispose(),this.buffer.dispose(),this.vao.dispose()}},3436:function(t,e,r){\"use strict\";var n=r(3236),i=r(9405),a=n([\"precision highp float;\\n#define GLSLIFY 1\\n\\nattribute vec3 position, offset;\\nattribute vec4 color;\\nuniform mat4 model, view, projection;\\nuniform float capSize;\\nvarying vec4 fragColor;\\nvarying vec3 fragPosition;\\n\\nvoid main() {\\n vec4 worldPosition = model * vec4(position, 1.0);\\n worldPosition = (worldPosition / worldPosition.w) + vec4(capSize * offset, 0.0);\\n gl_Position = projection * view * worldPosition;\\n fragColor = color;\\n fragPosition = position;\\n}\"]),o=n([\"precision highp float;\\n#define GLSLIFY 1\\n\\nbool outOfRange(float a, float b, float p) {\\n return ((p > max(a, b)) || \\n (p < min(a, b)));\\n}\\n\\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y));\\n}\\n\\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y) ||\\n outOfRange(a.z, b.z, p.z));\\n}\\n\\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\\n return outOfRange(a.xyz, b.xyz, p.xyz);\\n}\\n\\nuniform vec3 clipBounds[2];\\nuniform float opacity;\\nvarying vec3 fragPosition;\\nvarying vec4 fragColor;\\n\\nvoid main() {\\n if (\\n outOfRange(clipBounds[0], clipBounds[1], fragPosition) ||\\n fragColor.a * opacity == 0.\\n ) discard;\\n\\n gl_FragColor = opacity * fragColor;\\n}\"]);t.exports=function(t){return i(t,a,o,null,[{name:\"position\",type:\"vec3\"},{name:\"color\",type:\"vec4\"},{name:\"offset\",type:\"vec3\"}])}},2260:function(t,e,r){\"use strict\";var n=r(7766);t.exports=function(t,e,r,n){i||(i=t.FRAMEBUFFER_UNSUPPORTED,a=t.FRAMEBUFFER_INCOMPLETE_ATTACHMENT,o=t.FRAMEBUFFER_INCOMPLETE_DIMENSIONS,s=t.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT);var u=t.getExtension(\"WEBGL_draw_buffers\");if(!l&&u&&function(t,e){var r=t.getParameter(e.MAX_COLOR_ATTACHMENTS_WEBGL);l=new Array(r+1);for(var n=0;n<=r;++n){for(var i=new Array(r),a=0;ac||r<0||r>c)throw new Error(\"gl-fbo: Parameters are too large for FBO\");var f=1;if(\"color\"in(n=n||{})){if((f=Math.max(0|n.color,0))<0)throw new Error(\"gl-fbo: Must specify a nonnegative number of colors\");if(f>1){if(!u)throw new Error(\"gl-fbo: Multiple draw buffer extension not supported\");if(f>t.getParameter(u.MAX_COLOR_ATTACHMENTS_WEBGL))throw new Error(\"gl-fbo: Context does not support \"+f+\" draw buffers\")}}var h=t.UNSIGNED_BYTE,p=t.getExtension(\"OES_texture_float\");if(n.float&&f>0){if(!p)throw new Error(\"gl-fbo: Context does not support floating point textures\");h=t.FLOAT}else n.preferFloat&&f>0&&p&&(h=t.FLOAT);var v=!0;\"depth\"in n&&(v=!!n.depth);var g=!1;return\"stencil\"in n&&(g=!!n.stencil),new d(t,e,r,h,f,v,g,u)};var i,a,o,s,l=null;function u(t){return[t.getParameter(t.FRAMEBUFFER_BINDING),t.getParameter(t.RENDERBUFFER_BINDING),t.getParameter(t.TEXTURE_BINDING_2D)]}function c(t,e){t.bindFramebuffer(t.FRAMEBUFFER,e[0]),t.bindRenderbuffer(t.RENDERBUFFER,e[1]),t.bindTexture(t.TEXTURE_2D,e[2])}function f(t){switch(t){case i:throw new Error(\"gl-fbo: Framebuffer unsupported\");case a:throw new Error(\"gl-fbo: Framebuffer incomplete attachment\");case o:throw new Error(\"gl-fbo: Framebuffer incomplete dimensions\");case s:throw new Error(\"gl-fbo: Framebuffer incomplete missing attachment\");default:throw new Error(\"gl-fbo: Framebuffer failed for unspecified reason\")}}function h(t,e,r,i,a,o){if(!i)return null;var s=n(t,e,r,a,i);return s.magFilter=t.NEAREST,s.minFilter=t.NEAREST,s.mipSamples=1,s.bind(),t.framebufferTexture2D(t.FRAMEBUFFER,o,t.TEXTURE_2D,s.handle,0),s}function p(t,e,r,n,i){var a=t.createRenderbuffer();return t.bindRenderbuffer(t.RENDERBUFFER,a),t.renderbufferStorage(t.RENDERBUFFER,n,e,r),t.framebufferRenderbuffer(t.FRAMEBUFFER,i,t.RENDERBUFFER,a),a}function d(t,e,r,n,i,a,o,s){this.gl=t,this._shape=[0|e,0|r],this._destroyed=!1,this._ext=s,this.color=new Array(i);for(var d=0;d1&&s.drawBuffersWEBGL(l[o]);var m=r.getExtension(\"WEBGL_depth_texture\");m?d?t.depth=h(r,i,a,m.UNSIGNED_INT_24_8_WEBGL,r.DEPTH_STENCIL,r.DEPTH_STENCIL_ATTACHMENT):v&&(t.depth=h(r,i,a,r.UNSIGNED_SHORT,r.DEPTH_COMPONENT,r.DEPTH_ATTACHMENT)):v&&d?t._depth_rb=p(r,i,a,r.DEPTH_STENCIL,r.DEPTH_STENCIL_ATTACHMENT):v?t._depth_rb=p(r,i,a,r.DEPTH_COMPONENT16,r.DEPTH_ATTACHMENT):d&&(t._depth_rb=p(r,i,a,r.STENCIL_INDEX,r.STENCIL_ATTACHMENT));var x=r.checkFramebufferStatus(r.FRAMEBUFFER);if(x!==r.FRAMEBUFFER_COMPLETE){for(t._destroyed=!0,r.bindFramebuffer(r.FRAMEBUFFER,null),r.deleteFramebuffer(t.handle),t.handle=null,t.depth&&(t.depth.dispose(),t.depth=null),t._depth_rb&&(r.deleteRenderbuffer(t._depth_rb),t._depth_rb=null),y=0;yi||r<0||r>i)throw new Error(\"gl-fbo: Can't resize FBO, invalid dimensions\");t._shape[0]=e,t._shape[1]=r;for(var a=u(n),o=0;o>8*p&255;this.pickOffset=r,i.bind();var d=i.uniforms;d.viewTransform=t,d.pickOffset=e,d.shape=this.shape;var v=i.attributes;return this.positionBuffer.bind(),v.position.pointer(),this.weightBuffer.bind(),v.weight.pointer(s.UNSIGNED_BYTE,!1),this.idBuffer.bind(),v.pickId.pointer(s.UNSIGNED_BYTE,!1),s.drawArrays(s.TRIANGLES,0,o),r+this.shape[0]*this.shape[1]}}}(),f.pick=function(t,e,r){var n=this.pickOffset,i=this.shape[0]*this.shape[1];if(r=n+i)return null;var a=r-n,o=this.xData,s=this.yData;return{object:this,pointId:a,dataCoord:[o[a%this.shape[0]],s[a/this.shape[0]|0]]}},f.update=function(t){var e=(t=t||{}).shape||[0,0],r=t.x||i(e[0]),o=t.y||i(e[1]),s=t.z||new Float32Array(e[0]*e[1]),l=!1!==t.zsmooth;this.xData=r,this.yData=o;var u,c,f,p,d=t.colorLevels||[0],v=t.colorValues||[0,0,0,1],g=d.length,y=this.bounds;l?(u=y[0]=r[0],c=y[1]=o[0],f=y[2]=r[r.length-1],p=y[3]=o[o.length-1]):(u=y[0]=r[0]+(r[1]-r[0])/2,c=y[1]=o[0]+(o[1]-o[0])/2,f=y[2]=r[r.length-1]+(r[r.length-1]-r[r.length-2])/2,p=y[3]=o[o.length-1]+(o[o.length-1]-o[o.length-2])/2);var m=1/(f-u),x=1/(p-c),b=e[0],_=e[1];this.shape=[b,_];var w=(l?(b-1)*(_-1):b*_)*(h.length>>>1);this.numVertices=w;for(var T=a.mallocUint8(4*w),k=a.mallocFloat32(2*w),A=a.mallocUint8(2*w),M=a.mallocUint32(w),S=0,E=l?b-1:b,L=l?_-1:_,C=0;C max(a, b)) || \\n (p < min(a, b)));\\n}\\n\\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y));\\n}\\n\\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y) ||\\n outOfRange(a.z, b.z, p.z));\\n}\\n\\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\\n return outOfRange(a.xyz, b.xyz, p.xyz);\\n}\\n\\nuniform vec3 clipBounds[2];\\nuniform sampler2D dashTexture;\\nuniform float dashScale;\\nuniform float opacity;\\n\\nvarying vec3 worldPosition;\\nvarying float pixelArcLength;\\nvarying vec4 fragColor;\\n\\nvoid main() {\\n if (\\n outOfRange(clipBounds[0], clipBounds[1], worldPosition) ||\\n fragColor.a * opacity == 0.\\n ) discard;\\n\\n float dashWeight = texture2D(dashTexture, vec2(dashScale * pixelArcLength, 0)).r;\\n if(dashWeight < 0.5) {\\n discard;\\n }\\n gl_FragColor = fragColor * opacity;\\n}\\n\"]),s=n([\"precision highp float;\\n#define GLSLIFY 1\\n\\n#define FLOAT_MAX 1.70141184e38\\n#define FLOAT_MIN 1.17549435e-38\\n\\n// https://github.com/mikolalysenko/glsl-read-float/blob/master/index.glsl\\nvec4 packFloat(float v) {\\n float av = abs(v);\\n\\n //Handle special cases\\n if(av < FLOAT_MIN) {\\n return vec4(0.0, 0.0, 0.0, 0.0);\\n } else if(v > FLOAT_MAX) {\\n return vec4(127.0, 128.0, 0.0, 0.0) / 255.0;\\n } else if(v < -FLOAT_MAX) {\\n return vec4(255.0, 128.0, 0.0, 0.0) / 255.0;\\n }\\n\\n vec4 c = vec4(0,0,0,0);\\n\\n //Compute exponent and mantissa\\n float e = floor(log2(av));\\n float m = av * pow(2.0, -e) - 1.0;\\n\\n //Unpack mantissa\\n c[1] = floor(128.0 * m);\\n m -= c[1] / 128.0;\\n c[2] = floor(32768.0 * m);\\n m -= c[2] / 32768.0;\\n c[3] = floor(8388608.0 * m);\\n\\n //Unpack exponent\\n float ebias = e + 127.0;\\n c[0] = floor(ebias / 2.0);\\n ebias -= c[0] * 2.0;\\n c[1] += floor(ebias) * 128.0;\\n\\n //Unpack sign bit\\n c[0] += 128.0 * step(0.0, -v);\\n\\n //Scale back to range\\n return c / 255.0;\\n}\\n\\nbool outOfRange(float a, float b, float p) {\\n return ((p > max(a, b)) || \\n (p < min(a, b)));\\n}\\n\\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y));\\n}\\n\\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y) ||\\n outOfRange(a.z, b.z, p.z));\\n}\\n\\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\\n return outOfRange(a.xyz, b.xyz, p.xyz);\\n}\\n\\nuniform float pickId;\\nuniform vec3 clipBounds[2];\\n\\nvarying vec3 worldPosition;\\nvarying float pixelArcLength;\\nvarying vec4 fragColor;\\n\\nvoid main() {\\n if (outOfRange(clipBounds[0], clipBounds[1], worldPosition)) discard;\\n\\n gl_FragColor = vec4(pickId/255.0, packFloat(pixelArcLength).xyz);\\n}\"]),l=[{name:\"position\",type:\"vec3\"},{name:\"nextPosition\",type:\"vec3\"},{name:\"arcLength\",type:\"float\"},{name:\"lineWidth\",type:\"float\"},{name:\"color\",type:\"vec4\"}];e.createShader=function(t){return i(t,a,o,null,l)},e.createPickShader=function(t){return i(t,a,s,null,l)}},5714:function(t,e,r){\"use strict\";t.exports=function(t){var e=t.gl||t.scene&&t.scene.gl,r=f(e);r.attributes.position.location=0,r.attributes.nextPosition.location=1,r.attributes.arcLength.location=2,r.attributes.lineWidth.location=3,r.attributes.color.location=4;var o=h(e);o.attributes.position.location=0,o.attributes.nextPosition.location=1,o.attributes.arcLength.location=2,o.attributes.lineWidth.location=3,o.attributes.color.location=4;for(var s=n(e),l=i(e,[{buffer:s,size:3,offset:0,stride:48},{buffer:s,size:3,offset:12,stride:48},{buffer:s,size:1,offset:24,stride:48},{buffer:s,size:1,offset:28,stride:48},{buffer:s,size:4,offset:32,stride:48}]),c=u(new Array(1024),[256,1,4]),p=0;p<1024;++p)c.data[p]=255;var d=a(e,c);d.wrap=e.REPEAT;var v=new y(e,r,o,s,l,d);return v.update(t),v};var n=r(2762),i=r(8116),a=r(7766),o=new Uint8Array(4),s=new Float32Array(o.buffer),l=r(2478),u=r(9618),c=r(7319),f=c.createShader,h=c.createPickShader,p=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];function d(t,e){for(var r=0,n=0;n<3;++n){var i=t[n]-e[n];r+=i*i}return Math.sqrt(r)}function v(t){for(var e=[[-1e6,-1e6,-1e6],[1e6,1e6,1e6]],r=0;r<3;++r)e[0][r]=Math.max(t[0][r],e[0][r]),e[1][r]=Math.min(t[1][r],e[1][r]);return e}function g(t,e,r,n){this.arcLength=t,this.position=e,this.index=r,this.dataCoordinate=n}function y(t,e,r,n,i,a){this.gl=t,this.shader=e,this.pickShader=r,this.buffer=n,this.vao=i,this.clipBounds=[[-1/0,-1/0,-1/0],[1/0,1/0,1/0]],this.points=[],this.arcLength=[],this.vertexCount=0,this.bounds=[[0,0,0],[0,0,0]],this.pickId=0,this.lineWidth=1,this.texture=a,this.dashScale=1,this.opacity=1,this.hasAlpha=!1,this.dirty=!0,this.pixelRatio=1}var m=y.prototype;m.isTransparent=function(){return this.hasAlpha},m.isOpaque=function(){return!this.hasAlpha},m.pickSlots=1,m.setPickBase=function(t){this.pickId=t},m.drawTransparent=m.draw=function(t){if(this.vertexCount){var e=this.gl,r=this.shader,n=this.vao;r.bind(),r.uniforms={model:t.model||p,view:t.view||p,projection:t.projection||p,clipBounds:v(this.clipBounds),dashTexture:this.texture.bind(),dashScale:this.dashScale/this.arcLength[this.arcLength.length-1],opacity:this.opacity,screenShape:[e.drawingBufferWidth,e.drawingBufferHeight],pixelRatio:this.pixelRatio},n.bind(),n.draw(e.TRIANGLE_STRIP,this.vertexCount),n.unbind()}},m.drawPick=function(t){if(this.vertexCount){var e=this.gl,r=this.pickShader,n=this.vao;r.bind(),r.uniforms={model:t.model||p,view:t.view||p,projection:t.projection||p,pickId:this.pickId,clipBounds:v(this.clipBounds),screenShape:[e.drawingBufferWidth,e.drawingBufferHeight],pixelRatio:this.pixelRatio},n.bind(),n.draw(e.TRIANGLE_STRIP,this.vertexCount),n.unbind()}},m.update=function(t){var e,r;this.dirty=!0;var n=!!t.connectGaps;\"dashScale\"in t&&(this.dashScale=t.dashScale),this.hasAlpha=!1,\"opacity\"in t&&(this.opacity=+t.opacity,this.opacity<1&&(this.hasAlpha=!0));var i=[],a=[],o=[],s=0,c=0,f=[[1/0,1/0,1/0],[-1/0,-1/0,-1/0]],h=t.position||t.positions;if(h){var p=t.color||t.colors||[0,0,0,1],v=t.lineWidth||1,g=!1;t:for(e=1;e0){for(var w=0;w<24;++w)i.push(i[i.length-12]);c+=2,g=!0}continue t}f[0][r]=Math.min(f[0][r],b[r],_[r]),f[1][r]=Math.max(f[1][r],b[r],_[r])}Array.isArray(p[0])?(y=p.length>e-1?p[e-1]:p.length>0?p[p.length-1]:[0,0,0,1],m=p.length>e?p[e]:p.length>0?p[p.length-1]:[0,0,0,1]):y=m=p,3===y.length&&(y=[y[0],y[1],y[2],1]),3===m.length&&(m=[m[0],m[1],m[2],1]),!this.hasAlpha&&y[3]<1&&(this.hasAlpha=!0),x=Array.isArray(v)?v.length>e-1?v[e-1]:v.length>0?v[v.length-1]:[0,0,0,1]:v;var T=s;if(s+=d(b,_),g){for(r=0;r<2;++r)i.push(b[0],b[1],b[2],_[0],_[1],_[2],T,x,y[0],y[1],y[2],y[3]);c+=2,g=!1}i.push(b[0],b[1],b[2],_[0],_[1],_[2],T,x,y[0],y[1],y[2],y[3],b[0],b[1],b[2],_[0],_[1],_[2],T,-x,y[0],y[1],y[2],y[3],_[0],_[1],_[2],b[0],b[1],b[2],s,-x,m[0],m[1],m[2],m[3],_[0],_[1],_[2],b[0],b[1],b[2],s,x,m[0],m[1],m[2],m[3]),c+=4}}if(this.buffer.update(i),a.push(s),o.push(h[h.length-1].slice()),this.bounds=f,this.vertexCount=c,this.points=o,this.arcLength=a,\"dashes\"in t){var k=t.dashes.slice();for(k.unshift(0),e=1;e1.0001)return null;y+=g[f]}return Math.abs(y-1)>.001?null:[h,s(t,g),g]}},840:function(t,e,r){var n=r(3236),i=n([\"precision highp float;\\n#define GLSLIFY 1\\n\\nattribute vec3 position, normal;\\nattribute vec4 color;\\nattribute vec2 uv;\\n\\nuniform mat4 model\\n , view\\n , projection\\n , inverseModel;\\nuniform vec3 eyePosition\\n , lightPosition;\\n\\nvarying vec3 f_normal\\n , f_lightDirection\\n , f_eyeDirection\\n , f_data;\\nvarying vec4 f_color;\\nvarying vec2 f_uv;\\n\\nvec4 project(vec3 p) {\\n return projection * view * model * vec4(p, 1.0);\\n}\\n\\nvoid main() {\\n gl_Position = project(position);\\n\\n //Lighting geometry parameters\\n vec4 cameraCoordinate = view * vec4(position , 1.0);\\n cameraCoordinate.xyz /= cameraCoordinate.w;\\n f_lightDirection = lightPosition - cameraCoordinate.xyz;\\n f_eyeDirection = eyePosition - cameraCoordinate.xyz;\\n f_normal = normalize((vec4(normal, 0.0) * inverseModel).xyz);\\n\\n f_color = color;\\n f_data = position;\\n f_uv = uv;\\n}\\n\"]),a=n([\"#extension GL_OES_standard_derivatives : enable\\n\\nprecision highp float;\\n#define GLSLIFY 1\\n\\nfloat beckmannDistribution(float x, float roughness) {\\n float NdotH = max(x, 0.0001);\\n float cos2Alpha = NdotH * NdotH;\\n float tan2Alpha = (cos2Alpha - 1.0) / cos2Alpha;\\n float roughness2 = roughness * roughness;\\n float denom = 3.141592653589793 * roughness2 * cos2Alpha * cos2Alpha;\\n return exp(tan2Alpha / roughness2) / denom;\\n}\\n\\nfloat cookTorranceSpecular(\\n vec3 lightDirection,\\n vec3 viewDirection,\\n vec3 surfaceNormal,\\n float roughness,\\n float fresnel) {\\n\\n float VdotN = max(dot(viewDirection, surfaceNormal), 0.0);\\n float LdotN = max(dot(lightDirection, surfaceNormal), 0.0);\\n\\n //Half angle vector\\n vec3 H = normalize(lightDirection + viewDirection);\\n\\n //Geometric term\\n float NdotH = max(dot(surfaceNormal, H), 0.0);\\n float VdotH = max(dot(viewDirection, H), 0.000001);\\n float LdotH = max(dot(lightDirection, H), 0.000001);\\n float G1 = (2.0 * NdotH * VdotN) / VdotH;\\n float G2 = (2.0 * NdotH * LdotN) / LdotH;\\n float G = min(1.0, min(G1, G2));\\n \\n //Distribution term\\n float D = beckmannDistribution(NdotH, roughness);\\n\\n //Fresnel term\\n float F = pow(1.0 - VdotN, fresnel);\\n\\n //Multiply terms and done\\n return G * F * D / max(3.14159265 * VdotN, 0.000001);\\n}\\n\\n//#pragma glslify: beckmann = require(glsl-specular-beckmann) // used in gl-surface3d\\n\\nbool outOfRange(float a, float b, float p) {\\n return ((p > max(a, b)) || \\n (p < min(a, b)));\\n}\\n\\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y));\\n}\\n\\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y) ||\\n outOfRange(a.z, b.z, p.z));\\n}\\n\\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\\n return outOfRange(a.xyz, b.xyz, p.xyz);\\n}\\n\\nuniform vec3 clipBounds[2];\\nuniform float roughness\\n , fresnel\\n , kambient\\n , kdiffuse\\n , kspecular;\\nuniform sampler2D texture;\\n\\nvarying vec3 f_normal\\n , f_lightDirection\\n , f_eyeDirection\\n , f_data;\\nvarying vec4 f_color;\\nvarying vec2 f_uv;\\n\\nvoid main() {\\n if (f_color.a == 0.0 ||\\n outOfRange(clipBounds[0], clipBounds[1], f_data)\\n ) discard;\\n\\n vec3 N = normalize(f_normal);\\n vec3 L = normalize(f_lightDirection);\\n vec3 V = normalize(f_eyeDirection);\\n\\n if(gl_FrontFacing) {\\n N = -N;\\n }\\n\\n float specular = min(1.0, max(0.0, cookTorranceSpecular(L, V, N, roughness, fresnel)));\\n //float specular = max(0.0, beckmann(L, V, N, roughness)); // used in gl-surface3d\\n\\n float diffuse = min(kambient + kdiffuse * max(dot(N, L), 0.0), 1.0);\\n\\n vec4 surfaceColor = vec4(f_color.rgb, 1.0) * texture2D(texture, f_uv);\\n vec4 litColor = surfaceColor.a * vec4(diffuse * surfaceColor.rgb + kspecular * vec3(1,1,1) * specular, 1.0);\\n\\n gl_FragColor = litColor * f_color.a;\\n}\\n\"]),o=n([\"precision highp float;\\n#define GLSLIFY 1\\n\\nattribute vec3 position;\\nattribute vec4 color;\\nattribute vec2 uv;\\n\\nuniform mat4 model, view, projection;\\n\\nvarying vec4 f_color;\\nvarying vec3 f_data;\\nvarying vec2 f_uv;\\n\\nvoid main() {\\n gl_Position = projection * view * model * vec4(position, 1.0);\\n f_color = color;\\n f_data = position;\\n f_uv = uv;\\n}\"]),s=n([\"precision highp float;\\n#define GLSLIFY 1\\n\\nbool outOfRange(float a, float b, float p) {\\n return ((p > max(a, b)) || \\n (p < min(a, b)));\\n}\\n\\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y));\\n}\\n\\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y) ||\\n outOfRange(a.z, b.z, p.z));\\n}\\n\\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\\n return outOfRange(a.xyz, b.xyz, p.xyz);\\n}\\n\\nuniform vec3 clipBounds[2];\\nuniform sampler2D texture;\\nuniform float opacity;\\n\\nvarying vec4 f_color;\\nvarying vec3 f_data;\\nvarying vec2 f_uv;\\n\\nvoid main() {\\n if (outOfRange(clipBounds[0], clipBounds[1], f_data)) discard;\\n\\n gl_FragColor = f_color * texture2D(texture, f_uv) * opacity;\\n}\"]),l=n([\"precision highp float;\\n#define GLSLIFY 1\\n\\nbool outOfRange(float a, float b, float p) {\\n return ((p > max(a, b)) || \\n (p < min(a, b)));\\n}\\n\\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y));\\n}\\n\\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y) ||\\n outOfRange(a.z, b.z, p.z));\\n}\\n\\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\\n return outOfRange(a.xyz, b.xyz, p.xyz);\\n}\\n\\nattribute vec3 position;\\nattribute vec4 color;\\nattribute vec2 uv;\\nattribute float pointSize;\\n\\nuniform mat4 model, view, projection;\\nuniform vec3 clipBounds[2];\\n\\nvarying vec4 f_color;\\nvarying vec2 f_uv;\\n\\nvoid main() {\\n if (outOfRange(clipBounds[0], clipBounds[1], position)) {\\n\\n gl_Position = vec4(0.0, 0.0 ,0.0 ,0.0);\\n } else {\\n gl_Position = projection * view * model * vec4(position, 1.0);\\n }\\n gl_PointSize = pointSize;\\n f_color = color;\\n f_uv = uv;\\n}\"]),u=n([\"precision highp float;\\n#define GLSLIFY 1\\n\\nuniform sampler2D texture;\\nuniform float opacity;\\n\\nvarying vec4 f_color;\\nvarying vec2 f_uv;\\n\\nvoid main() {\\n vec2 pointR = gl_PointCoord.xy - vec2(0.5, 0.5);\\n if(dot(pointR, pointR) > 0.25) {\\n discard;\\n }\\n gl_FragColor = f_color * texture2D(texture, f_uv) * opacity;\\n}\"]),c=n([\"precision highp float;\\n#define GLSLIFY 1\\n\\nattribute vec3 position;\\nattribute vec4 id;\\n\\nuniform mat4 model, view, projection;\\n\\nvarying vec3 f_position;\\nvarying vec4 f_id;\\n\\nvoid main() {\\n gl_Position = projection * view * model * vec4(position, 1.0);\\n f_id = id;\\n f_position = position;\\n}\"]),f=n([\"precision highp float;\\n#define GLSLIFY 1\\n\\nbool outOfRange(float a, float b, float p) {\\n return ((p > max(a, b)) || \\n (p < min(a, b)));\\n}\\n\\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y));\\n}\\n\\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y) ||\\n outOfRange(a.z, b.z, p.z));\\n}\\n\\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\\n return outOfRange(a.xyz, b.xyz, p.xyz);\\n}\\n\\nuniform vec3 clipBounds[2];\\nuniform float pickId;\\n\\nvarying vec3 f_position;\\nvarying vec4 f_id;\\n\\nvoid main() {\\n if (outOfRange(clipBounds[0], clipBounds[1], f_position)) discard;\\n\\n gl_FragColor = vec4(pickId, f_id.xyz);\\n}\"]),h=n([\"precision highp float;\\n#define GLSLIFY 1\\n\\nbool outOfRange(float a, float b, float p) {\\n return ((p > max(a, b)) || \\n (p < min(a, b)));\\n}\\n\\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y));\\n}\\n\\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y) ||\\n outOfRange(a.z, b.z, p.z));\\n}\\n\\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\\n return outOfRange(a.xyz, b.xyz, p.xyz);\\n}\\n\\nattribute vec3 position;\\nattribute float pointSize;\\nattribute vec4 id;\\n\\nuniform mat4 model, view, projection;\\nuniform vec3 clipBounds[2];\\n\\nvarying vec3 f_position;\\nvarying vec4 f_id;\\n\\nvoid main() {\\n if (outOfRange(clipBounds[0], clipBounds[1], position)) {\\n\\n gl_Position = vec4(0.0, 0.0, 0.0, 0.0);\\n } else {\\n gl_Position = projection * view * model * vec4(position, 1.0);\\n gl_PointSize = pointSize;\\n }\\n f_id = id;\\n f_position = position;\\n}\"]),p=n([\"precision highp float;\\n#define GLSLIFY 1\\n\\nattribute vec3 position;\\n\\nuniform mat4 model, view, projection;\\n\\nvoid main() {\\n gl_Position = projection * view * model * vec4(position, 1.0);\\n}\"]),d=n([\"precision highp float;\\n#define GLSLIFY 1\\n\\nuniform vec3 contourColor;\\n\\nvoid main() {\\n gl_FragColor = vec4(contourColor, 1.0);\\n}\\n\"]);e.meshShader={vertex:i,fragment:a,attributes:[{name:\"position\",type:\"vec3\"},{name:\"normal\",type:\"vec3\"},{name:\"color\",type:\"vec4\"},{name:\"uv\",type:\"vec2\"}]},e.wireShader={vertex:o,fragment:s,attributes:[{name:\"position\",type:\"vec3\"},{name:\"color\",type:\"vec4\"},{name:\"uv\",type:\"vec2\"}]},e.pointShader={vertex:l,fragment:u,attributes:[{name:\"position\",type:\"vec3\"},{name:\"color\",type:\"vec4\"},{name:\"uv\",type:\"vec2\"},{name:\"pointSize\",type:\"float\"}]},e.pickShader={vertex:c,fragment:f,attributes:[{name:\"position\",type:\"vec3\"},{name:\"id\",type:\"vec4\"}]},e.pointPickShader={vertex:h,fragment:f,attributes:[{name:\"position\",type:\"vec3\"},{name:\"pointSize\",type:\"float\"},{name:\"id\",type:\"vec4\"}]},e.contourShader={vertex:p,fragment:d,attributes:[{name:\"position\",type:\"vec3\"}]}},7201:function(t,e,r){\"use strict\";var n=r(9405),i=r(2762),a=r(8116),o=r(7766),s=r(8406),l=r(6760),u=r(7608),c=r(9618),f=r(6729),h=r(7765),p=r(1888),d=r(840),v=r(7626),g=d.meshShader,y=d.wireShader,m=d.pointShader,x=d.pickShader,b=d.pointPickShader,_=d.contourShader,w=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];function T(t,e,r,n,i,a,o,s,l,u,c,f,h,p,d,v,g,y,m,x,b,_,T,k,A,M,S){this.gl=t,this.pixelRatio=1,this.cells=[],this.positions=[],this.intensity=[],this.texture=e,this.dirty=!0,this.triShader=r,this.lineShader=n,this.pointShader=i,this.pickShader=a,this.pointPickShader=o,this.contourShader=s,this.trianglePositions=l,this.triangleColors=c,this.triangleNormals=h,this.triangleUVs=f,this.triangleIds=u,this.triangleVAO=p,this.triangleCount=0,this.lineWidth=1,this.edgePositions=d,this.edgeColors=g,this.edgeUVs=y,this.edgeIds=v,this.edgeVAO=m,this.edgeCount=0,this.pointPositions=x,this.pointColors=_,this.pointUVs=T,this.pointSizes=k,this.pointIds=b,this.pointVAO=A,this.pointCount=0,this.contourLineWidth=1,this.contourPositions=M,this.contourVAO=S,this.contourCount=0,this.contourColor=[0,0,0],this.contourEnable=!0,this.pickVertex=!0,this.pickId=1,this.bounds=[[1/0,1/0,1/0],[-1/0,-1/0,-1/0]],this.clipBounds=[[-1/0,-1/0,-1/0],[1/0,1/0,1/0]],this.lightPosition=[1e5,1e5,0],this.ambientLight=.8,this.diffuseLight=.8,this.specularLight=2,this.roughness=.5,this.fresnel=1.5,this.opacity=1,this.hasAlpha=!1,this.opacityscale=!1,this._model=w,this._view=w,this._projection=w,this._resolution=[1,1]}var k=T.prototype;function A(t,e){if(!e)return 1;if(!e.length)return 1;for(var r=0;rt&&r>0){var n=(e[r][0]-t)/(e[r][0]-e[r-1][0]);return e[r][1]*(1-n)+n*e[r-1][1]}}return 1}function M(t){var e=n(t,m.vertex,m.fragment);return e.attributes.position.location=0,e.attributes.color.location=2,e.attributes.uv.location=3,e.attributes.pointSize.location=4,e}function S(t){var e=n(t,x.vertex,x.fragment);return e.attributes.position.location=0,e.attributes.id.location=1,e}function E(t){var e=n(t,b.vertex,b.fragment);return e.attributes.position.location=0,e.attributes.id.location=1,e.attributes.pointSize.location=4,e}function L(t){var e=n(t,_.vertex,_.fragment);return e.attributes.position.location=0,e}k.isOpaque=function(){return!this.hasAlpha},k.isTransparent=function(){return this.hasAlpha},k.pickSlots=1,k.setPickBase=function(t){this.pickId=t},k.highlight=function(t){if(t&&this.contourEnable){for(var e=h(this.cells,this.intensity,t.intensity),r=e.cells,n=e.vertexIds,i=e.vertexWeights,a=r.length,o=p.mallocFloat32(6*a),s=0,l=0;l0&&((f=this.triShader).bind(),f.uniforms=s,this.triangleVAO.bind(),e.drawArrays(e.TRIANGLES,0,3*this.triangleCount),this.triangleVAO.unbind()),this.edgeCount>0&&this.lineWidth>0&&((f=this.lineShader).bind(),f.uniforms=s,this.edgeVAO.bind(),e.lineWidth(this.lineWidth*this.pixelRatio),e.drawArrays(e.LINES,0,2*this.edgeCount),this.edgeVAO.unbind()),this.pointCount>0&&((f=this.pointShader).bind(),f.uniforms=s,this.pointVAO.bind(),e.drawArrays(e.POINTS,0,this.pointCount),this.pointVAO.unbind()),this.contourEnable&&this.contourCount>0&&this.contourLineWidth>0&&((f=this.contourShader).bind(),f.uniforms=s,this.contourVAO.bind(),e.drawArrays(e.LINES,0,this.contourCount),this.contourVAO.unbind())},k.drawPick=function(t){t=t||{};for(var e=this.gl,r=t.model||w,n=t.view||w,i=t.projection||w,a=[[-1e6,-1e6,-1e6],[1e6,1e6,1e6]],o=0;o<3;++o)a[0][o]=Math.max(a[0][o],this.clipBounds[0][o]),a[1][o]=Math.min(a[1][o],this.clipBounds[1][o]);this._model=[].slice.call(r),this._view=[].slice.call(n),this._projection=[].slice.call(i),this._resolution=[e.drawingBufferWidth,e.drawingBufferHeight];var s,l={model:r,view:n,projection:i,clipBounds:a,pickId:this.pickId/255};(s=this.pickShader).bind(),s.uniforms=l,this.triangleCount>0&&(this.triangleVAO.bind(),e.drawArrays(e.TRIANGLES,0,3*this.triangleCount),this.triangleVAO.unbind()),this.edgeCount>0&&(this.edgeVAO.bind(),e.lineWidth(this.lineWidth*this.pixelRatio),e.drawArrays(e.LINES,0,2*this.edgeCount),this.edgeVAO.unbind()),this.pointCount>0&&((s=this.pointPickShader).bind(),s.uniforms=l,this.pointVAO.bind(),e.drawArrays(e.POINTS,0,this.pointCount),this.pointVAO.unbind())},k.pick=function(t){if(!t)return null;if(t.id!==this.pickId)return null;for(var e=t.value[0]+256*t.value[1]+65536*t.value[2],r=this.cells[e],n=this.positions,i=new Array(r.length),a=0;ai[k]&&(r.uniforms.dataAxis=u,r.uniforms.screenOffset=c,r.uniforms.color=g[t],r.uniforms.angle=y[t],a.drawArrays(a.TRIANGLES,i[k],i[A]-i[k]))),m[t]&&T&&(c[1^t]-=M*p*x[t],r.uniforms.dataAxis=f,r.uniforms.screenOffset=c,r.uniforms.color=b[t],r.uniforms.angle=_[t],a.drawArrays(a.TRIANGLES,w,T)),c[1^t]=M*s[2+(1^t)]-1,d[t+2]&&(c[1^t]+=M*p*v[t+2],ki[k]&&(r.uniforms.dataAxis=u,r.uniforms.screenOffset=c,r.uniforms.color=g[t+2],r.uniforms.angle=y[t+2],a.drawArrays(a.TRIANGLES,i[k],i[A]-i[k]))),m[t+2]&&T&&(c[1^t]+=M*p*x[t+2],r.uniforms.dataAxis=f,r.uniforms.screenOffset=c,r.uniforms.color=b[t+2],r.uniforms.angle=_[t+2],a.drawArrays(a.TRIANGLES,w,T))}),v.drawTitle=function(){var t=[0,0],e=[0,0];return function(){var r=this.plot,n=this.shader,i=r.gl,a=r.screenBox,o=r.titleCenter,s=r.titleAngle,l=r.titleColor,u=r.pixelRatio;if(this.titleCount){for(var c=0;c<2;++c)e[c]=2*(o[c]*u-a[c])/(a[2+c]-a[c])-1;n.bind(),n.uniforms.dataAxis=t,n.uniforms.screenOffset=e,n.uniforms.angle=s,n.uniforms.color=l,i.drawArrays(i.TRIANGLES,this.titleOffset,this.titleCount)}}}(),v.bind=(h=[0,0],p=[0,0],d=[0,0],function(){var t=this.plot,e=this.shader,r=t._tickBounds,n=t.dataBox,i=t.screenBox,a=t.viewBox;e.bind();for(var o=0;o<2;++o){var s=r[o],l=r[o+2]-s,u=.5*(n[o+2]+n[o]),c=n[o+2]-n[o],f=a[o],v=a[o+2]-f,g=i[o],y=i[o+2]-g;p[o]=2*l/c*v/y,h[o]=2*(s-u)/c*v/y}d[1]=2*t.pixelRatio/(i[3]-i[1]),d[0]=d[1]*(i[3]-i[1])/(i[2]-i[0]),e.uniforms.dataScale=p,e.uniforms.dataShift=h,e.uniforms.textScale=d,this.vbo.bind(),e.attributes.textCoordinate.pointer()}),v.update=function(t){var e,r,n,i,o,s=[],l=t.ticks,u=t.bounds;for(o=0;o<2;++o){var c=[Math.floor(s.length/3)],f=[-1/0],h=l[o];for(e=0;e=0){var v=e[d]-n[d]*(e[d+2]-e[d])/(n[d+2]-n[d]);0===d?o.drawLine(v,e[1],v,e[3],p[d],h[d]):o.drawLine(e[0],v,e[2],v,p[d],h[d])}}for(d=0;d=0;--t)this.objects[t].dispose();for(this.objects.length=0,t=this.overlays.length-1;t>=0;--t)this.overlays[t].dispose();this.overlays.length=0,this.gl=null},u.addObject=function(t){this.objects.indexOf(t)<0&&(this.objects.push(t),this.setDirty())},u.removeObject=function(t){for(var e=this.objects,r=0;rMath.abs(e))u.rotate(a,0,0,-t*r*Math.PI*d.rotateSpeed/window.innerWidth);else if(!d._ortho){var o=-d.zoomSpeed*i*e/window.innerHeight*(a-u.lastT())/20;u.pan(a,0,0,f*(Math.exp(o)-1))}}}),!0)},d.enableMouseListeners(),d};var n=r(3025),i=r(6296),a=r(351),o=r(8512),s=r(24),l=r(7520)},799:function(t,e,r){var n=r(3236),i=r(9405),a=n([\"precision mediump float;\\n#define GLSLIFY 1\\nattribute vec2 position;\\nvarying vec2 uv;\\nvoid main() {\\n uv = position;\\n gl_Position = vec4(position, 0, 1);\\n}\"]),o=n([\"precision mediump float;\\n#define GLSLIFY 1\\n\\nuniform sampler2D accumBuffer;\\nvarying vec2 uv;\\n\\nvoid main() {\\n vec4 accum = texture2D(accumBuffer, 0.5 * (uv + 1.0));\\n gl_FragColor = min(vec4(1,1,1,1), accum);\\n}\"]);t.exports=function(t){return i(t,a,o,null,[{name:\"position\",type:\"vec2\"}])}},4100:function(t,e,r){\"use strict\";var n=r(4437),i=r(3837),a=r(5445),o=r(4449),s=r(3589),l=r(2260),u=r(7169),c=r(351),f=r(4772),h=r(4040),p=r(799),d=r(9216)({tablet:!0,featureDetect:!0});function v(){this.mouse=[-1,-1],this.screen=null,this.distance=1/0,this.index=null,this.dataCoordinate=null,this.dataPosition=null,this.object=null,this.data=null}function g(t){var e=Math.round(Math.log(Math.abs(t))/Math.log(10));if(e<0){var r=Math.round(Math.pow(10,-e));return Math.ceil(t*r)/r}return e>0?(r=Math.round(Math.pow(10,e)),Math.ceil(t/r)*r):Math.ceil(t)}function y(t){return\"boolean\"!=typeof t||t}t.exports={createScene:function(t){(t=t||{}).camera=t.camera||{};var e=t.canvas;e||(e=document.createElement(\"canvas\"),t.container?t.container.appendChild(e):document.body.appendChild(e));var r=t.gl;if(r||(t.glOptions&&(d=!!t.glOptions.preserveDrawingBuffer),r=function(t,e){var r=null;try{(r=t.getContext(\"webgl\",e))||(r=t.getContext(\"experimental-webgl\",e))}catch(t){return null}return r}(e,t.glOptions||{premultipliedAlpha:!0,antialias:!0,preserveDrawingBuffer:d})),!r)throw new Error(\"webgl not supported\");var m=t.bounds||[[-10,-10,-10],[10,10,10]],x=new v,b=l(r,r.drawingBufferWidth,r.drawingBufferHeight,{preferFloat:!d}),_=p(r),w=t.cameraObject&&!0===t.cameraObject._ortho||t.camera.projection&&\"orthographic\"===t.camera.projection.type||!1,T={eye:t.camera.eye||[2,0,0],center:t.camera.center||[0,0,0],up:t.camera.up||[0,1,0],zoomMin:t.camera.zoomMax||.1,zoomMax:t.camera.zoomMin||100,mode:t.camera.mode||\"turntable\",_ortho:w},k=t.axes||{},A=i(r,k);A.enable=!k.disable;var M=t.spikes||{},S=o(r,M),E=[],L=[],C=[],P=[],O=!0,I=!0,z={view:null,projection:new Array(16),model:new Array(16),_ortho:!1},D=(I=!0,[r.drawingBufferWidth,r.drawingBufferHeight]),R=t.cameraObject||n(e,T),F={gl:r,contextLost:!1,pixelRatio:t.pixelRatio||1,canvas:e,selection:x,camera:R,axes:A,axesPixels:null,spikes:S,bounds:m,objects:E,shape:D,aspect:t.aspectRatio||[1,1,1],pickRadius:t.pickRadius||10,zNear:t.zNear||.01,zFar:t.zFar||1e3,fovy:t.fovy||Math.PI/4,clearColor:t.clearColor||[0,0,0,0],autoResize:y(t.autoResize),autoBounds:y(t.autoBounds),autoScale:!!t.autoScale,autoCenter:y(t.autoCenter),clipToBounds:y(t.clipToBounds),snapToData:!!t.snapToData,onselect:t.onselect||null,onrender:t.onrender||null,onclick:t.onclick||null,cameraParams:z,oncontextloss:null,mouseListener:null,_stopped:!1,getAspectratio:function(){return{x:this.aspect[0],y:this.aspect[1],z:this.aspect[2]}},setAspectratio:function(t){this.aspect[0]=t.x,this.aspect[1]=t.y,this.aspect[2]=t.z,I=!0},setBounds:function(t,e){this.bounds[0][t]=e.min,this.bounds[1][t]=e.max},setClearColor:function(t){this.clearColor=t},clearRGBA:function(){this.gl.clearColor(this.clearColor[0],this.clearColor[1],this.clearColor[2],this.clearColor[3]),this.gl.clear(this.gl.COLOR_BUFFER_BIT|this.gl.DEPTH_BUFFER_BIT)}},B=[r.drawingBufferWidth/F.pixelRatio|0,r.drawingBufferHeight/F.pixelRatio|0];function N(){if(!F._stopped&&F.autoResize){var t=e.parentNode,r=1,n=1;t&&t!==document.body?(r=t.clientWidth,n=t.clientHeight):(r=window.innerWidth,n=window.innerHeight);var i=0|Math.ceil(r*F.pixelRatio),a=0|Math.ceil(n*F.pixelRatio);if(i!==e.width||a!==e.height){e.width=i,e.height=a;var o=e.style;o.position=o.position||\"absolute\",o.left=\"0px\",o.top=\"0px\",o.width=r+\"px\",o.height=n+\"px\",O=!0}}}function j(){for(var t=E.length,e=P.length,n=0;n0&&0===C[e-1];)C.pop(),P.pop().dispose()}function U(){if(F.contextLost)return!0;r.isContextLost()&&(F.contextLost=!0,F.mouseListener.enabled=!1,F.selection.object=null,F.oncontextloss&&F.oncontextloss())}F.autoResize&&N(),window.addEventListener(\"resize\",N),F.update=function(t){F._stopped||(t=t||{},O=!0,I=!0)},F.add=function(t){F._stopped||(t.axes=A,E.push(t),L.push(-1),O=!0,I=!0,j())},F.remove=function(t){if(!F._stopped){var e=E.indexOf(t);e<0||(E.splice(e,1),L.pop(),O=!0,I=!0,j())}},F.dispose=function(){if(!F._stopped&&(F._stopped=!0,window.removeEventListener(\"resize\",N),e.removeEventListener(\"webglcontextlost\",U),F.mouseListener.enabled=!1,!F.contextLost)){A.dispose(),S.dispose();for(var t=0;tx.distance)continue;for(var u=0;u 1.0) {\\n discard;\\n }\\n baseColor = mix(borderColor, color, step(radius, centerFraction));\\n gl_FragColor = vec4(baseColor.rgb * baseColor.a, baseColor.a);\\n }\\n}\\n\"]),e.pickVertex=n([\"precision mediump float;\\n#define GLSLIFY 1\\n\\nattribute vec2 position;\\nattribute vec4 pickId;\\n\\nuniform mat3 matrix;\\nuniform float pointSize;\\nuniform vec4 pickOffset;\\n\\nvarying vec4 fragId;\\n\\nvoid main() {\\n vec3 hgPosition = matrix * vec3(position, 1);\\n gl_Position = vec4(hgPosition.xy, 0, hgPosition.z);\\n gl_PointSize = pointSize;\\n\\n vec4 id = pickId + pickOffset;\\n id.y += floor(id.x / 256.0);\\n id.x -= floor(id.x / 256.0) * 256.0;\\n\\n id.z += floor(id.y / 256.0);\\n id.y -= floor(id.y / 256.0) * 256.0;\\n\\n id.w += floor(id.z / 256.0);\\n id.z -= floor(id.z / 256.0) * 256.0;\\n\\n fragId = id;\\n}\\n\"]),e.pickFragment=n([\"precision mediump float;\\n#define GLSLIFY 1\\n\\nvarying vec4 fragId;\\n\\nvoid main() {\\n float radius = length(2.0 * gl_PointCoord.xy - 1.0);\\n if(radius > 1.0) {\\n discard;\\n }\\n gl_FragColor = fragId / 255.0;\\n}\\n\"])},4696:function(t,e,r){\"use strict\";var n=r(9405),i=r(2762),a=r(1888),o=r(6640);function s(t,e,r,n,i){this.plot=t,this.offsetBuffer=e,this.pickBuffer=r,this.shader=n,this.pickShader=i,this.sizeMin=.5,this.sizeMinCap=2,this.sizeMax=20,this.areaRatio=1,this.pointCount=0,this.color=[1,0,0,1],this.borderColor=[0,0,0,1],this.blend=!1,this.pickOffset=0,this.points=null}t.exports=function(t,e){var r=t.gl,a=new s(t,i(r),i(r),n(r,o.pointVertex,o.pointFragment),n(r,o.pickVertex,o.pickFragment));return a.update(e),t.addObject(a),a};var l,u,c=s.prototype;c.dispose=function(){this.shader.dispose(),this.pickShader.dispose(),this.offsetBuffer.dispose(),this.pickBuffer.dispose(),this.plot.removeObject(this)},c.update=function(t){var e;function r(e,r){return e in t?t[e]:r}t=t||{},this.sizeMin=r(\"sizeMin\",.5),this.sizeMax=r(\"sizeMax\",20),this.color=r(\"color\",[1,0,0,1]).slice(),this.areaRatio=r(\"areaRatio\",1),this.borderColor=r(\"borderColor\",[0,0,0,1]).slice(),this.blend=r(\"blend\",!1);var n=t.positions.length>>>1,i=t.positions instanceof Float32Array,o=t.idToIndex instanceof Int32Array&&t.idToIndex.length>=n,s=t.positions,l=i?s:a.mallocFloat32(s.length),u=o?t.idToIndex:a.mallocInt32(n);if(i||l.set(s),!o)for(l.set(s),e=0;e>>1;for(r=0;r=e[0]&&a<=e[2]&&o>=e[1]&&o<=e[3]&&n++}return n}(this.points,i),c=this.plot.pickPixelRatio*Math.max(Math.min(this.sizeMinCap,this.sizeMin),Math.min(this.sizeMax,this.sizeMax/Math.pow(s,.33333)));l[0]=2/a,l[4]=2/o,l[6]=-2*i[0]/a-1,l[7]=-2*i[1]/o-1,this.offsetBuffer.bind(),r.bind(),r.attributes.position.pointer(),r.uniforms.matrix=l,r.uniforms.color=this.color,r.uniforms.borderColor=this.borderColor,r.uniforms.pointCloud=c<5,r.uniforms.pointSize=c,r.uniforms.centerFraction=Math.min(1,Math.max(0,Math.sqrt(1-this.areaRatio))),e&&(u[0]=255&t,u[1]=t>>8&255,u[2]=t>>16&255,u[3]=t>>24&255,this.pickBuffer.bind(),r.attributes.pickId.pointer(n.UNSIGNED_BYTE),r.uniforms.pickOffset=u,this.pickOffset=t);var f=n.getParameter(n.BLEND),h=n.getParameter(n.DITHER);return f&&!this.blend&&n.disable(n.BLEND),h&&n.disable(n.DITHER),n.drawArrays(n.POINTS,0,this.pointCount),f&&!this.blend&&n.enable(n.BLEND),h&&n.enable(n.DITHER),t+this.pointCount}),c.draw=c.unifiedDraw,c.drawPick=c.unifiedDraw,c.pick=function(t,e,r){var n=this.pickOffset,i=this.pointCount;if(r=n+i)return null;var a=r-n,o=this.points;return{object:this,pointId:a,dataCoord:[o[2*a],o[2*a+1]]}}},783:function(t){t.exports=function(t,e,r,n){var i,a,o,s,l,u=e[0],c=e[1],f=e[2],h=e[3],p=r[0],d=r[1],v=r[2],g=r[3];return(a=u*p+c*d+f*v+h*g)<0&&(a=-a,p=-p,d=-d,v=-v,g=-g),1-a>1e-6?(i=Math.acos(a),o=Math.sin(i),s=Math.sin((1-n)*i)/o,l=Math.sin(n*i)/o):(s=1-n,l=n),t[0]=s*u+l*p,t[1]=s*c+l*d,t[2]=s*f+l*v,t[3]=s*h+l*g,t}},5964:function(t){\"use strict\";t.exports=function(t){return t||0===t?t.toString():\"\"}},9366:function(t,e,r){\"use strict\";var n=r(4359);t.exports=function(t,e,r){var a=[e.style,e.weight,e.variant,e.family].join(\"_\"),o=i[a];if(o||(o=i[a]={}),t in o)return o[t];var s={textAlign:\"center\",textBaseline:\"middle\",lineHeight:1,font:e.family,fontStyle:e.style,fontWeight:e.weight,fontVariant:e.variant,lineSpacing:1.25,styletags:{breaklines:!0,bolds:!0,italics:!0,subscripts:!0,superscripts:!0},triangles:!0},l=n(t,s);s.triangles=!1;var u,c,f=n(t,s);if(r&&1!==r){for(u=0;u max(a, b)) || \\n (p < min(a, b)));\\n}\\n\\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y));\\n}\\n\\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y) ||\\n outOfRange(a.z, b.z, p.z));\\n}\\n\\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\\n return outOfRange(a.xyz, b.xyz, p.xyz);\\n}\\n\\nattribute vec3 position;\\nattribute vec4 color;\\nattribute vec2 glyph;\\nattribute vec4 id;\\n\\nuniform vec4 highlightId;\\nuniform float highlightScale;\\nuniform mat4 model, view, projection;\\nuniform vec3 clipBounds[2];\\n\\nvarying vec4 interpColor;\\nvarying vec4 pickId;\\nvarying vec3 dataCoordinate;\\n\\nvoid main() {\\n if (outOfRange(clipBounds[0], clipBounds[1], position)) {\\n\\n gl_Position = vec4(0,0,0,0);\\n } else {\\n float scale = 1.0;\\n if(distance(highlightId, id) < 0.0001) {\\n scale = highlightScale;\\n }\\n\\n vec4 worldPosition = model * vec4(position, 1);\\n vec4 viewPosition = view * worldPosition;\\n viewPosition = viewPosition / viewPosition.w;\\n vec4 clipPosition = projection * (viewPosition + scale * vec4(glyph.x, -glyph.y, 0, 0));\\n\\n gl_Position = clipPosition;\\n interpColor = color;\\n pickId = id;\\n dataCoordinate = position;\\n }\\n}\"]),o=i([\"precision highp float;\\n#define GLSLIFY 1\\n\\nbool outOfRange(float a, float b, float p) {\\n return ((p > max(a, b)) || \\n (p < min(a, b)));\\n}\\n\\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y));\\n}\\n\\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y) ||\\n outOfRange(a.z, b.z, p.z));\\n}\\n\\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\\n return outOfRange(a.xyz, b.xyz, p.xyz);\\n}\\n\\nattribute vec3 position;\\nattribute vec4 color;\\nattribute vec2 glyph;\\nattribute vec4 id;\\n\\nuniform mat4 model, view, projection;\\nuniform vec2 screenSize;\\nuniform vec3 clipBounds[2];\\nuniform float highlightScale, pixelRatio;\\nuniform vec4 highlightId;\\n\\nvarying vec4 interpColor;\\nvarying vec4 pickId;\\nvarying vec3 dataCoordinate;\\n\\nvoid main() {\\n if (outOfRange(clipBounds[0], clipBounds[1], position)) {\\n\\n gl_Position = vec4(0,0,0,0);\\n } else {\\n float scale = pixelRatio;\\n if(distance(highlightId.bgr, id.bgr) < 0.001) {\\n scale *= highlightScale;\\n }\\n\\n vec4 worldPosition = model * vec4(position, 1.0);\\n vec4 viewPosition = view * worldPosition;\\n vec4 clipPosition = projection * viewPosition;\\n clipPosition /= clipPosition.w;\\n\\n gl_Position = clipPosition + vec4(screenSize * scale * vec2(glyph.x, -glyph.y), 0.0, 0.0);\\n interpColor = color;\\n pickId = id;\\n dataCoordinate = position;\\n }\\n}\"]),s=i([\"precision highp float;\\n#define GLSLIFY 1\\n\\nbool outOfRange(float a, float b, float p) {\\n return ((p > max(a, b)) || \\n (p < min(a, b)));\\n}\\n\\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y));\\n}\\n\\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y) ||\\n outOfRange(a.z, b.z, p.z));\\n}\\n\\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\\n return outOfRange(a.xyz, b.xyz, p.xyz);\\n}\\n\\nattribute vec3 position;\\nattribute vec4 color;\\nattribute vec2 glyph;\\nattribute vec4 id;\\n\\nuniform float highlightScale;\\nuniform vec4 highlightId;\\nuniform vec3 axes[2];\\nuniform mat4 model, view, projection;\\nuniform vec2 screenSize;\\nuniform vec3 clipBounds[2];\\nuniform float scale, pixelRatio;\\n\\nvarying vec4 interpColor;\\nvarying vec4 pickId;\\nvarying vec3 dataCoordinate;\\n\\nvoid main() {\\n if (outOfRange(clipBounds[0], clipBounds[1], position)) {\\n\\n gl_Position = vec4(0,0,0,0);\\n } else {\\n float lscale = pixelRatio * scale;\\n if(distance(highlightId, id) < 0.0001) {\\n lscale *= highlightScale;\\n }\\n\\n vec4 clipCenter = projection * view * model * vec4(position, 1);\\n vec3 dataPosition = position + 0.5*lscale*(axes[0] * glyph.x + axes[1] * glyph.y) * clipCenter.w * screenSize.y;\\n vec4 clipPosition = projection * view * model * vec4(dataPosition, 1);\\n\\n gl_Position = clipPosition;\\n interpColor = color;\\n pickId = id;\\n dataCoordinate = dataPosition;\\n }\\n}\\n\"]),l=i([\"precision highp float;\\n#define GLSLIFY 1\\n\\nbool outOfRange(float a, float b, float p) {\\n return ((p > max(a, b)) || \\n (p < min(a, b)));\\n}\\n\\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y));\\n}\\n\\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y) ||\\n outOfRange(a.z, b.z, p.z));\\n}\\n\\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\\n return outOfRange(a.xyz, b.xyz, p.xyz);\\n}\\n\\nuniform vec3 fragClipBounds[2];\\nuniform float opacity;\\n\\nvarying vec4 interpColor;\\nvarying vec3 dataCoordinate;\\n\\nvoid main() {\\n if (\\n outOfRange(fragClipBounds[0], fragClipBounds[1], dataCoordinate) ||\\n interpColor.a * opacity == 0.\\n ) discard;\\n gl_FragColor = interpColor * opacity;\\n}\\n\"]),u=i([\"precision highp float;\\n#define GLSLIFY 1\\n\\nbool outOfRange(float a, float b, float p) {\\n return ((p > max(a, b)) || \\n (p < min(a, b)));\\n}\\n\\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y));\\n}\\n\\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y) ||\\n outOfRange(a.z, b.z, p.z));\\n}\\n\\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\\n return outOfRange(a.xyz, b.xyz, p.xyz);\\n}\\n\\nuniform vec3 fragClipBounds[2];\\nuniform float pickGroup;\\n\\nvarying vec4 pickId;\\nvarying vec3 dataCoordinate;\\n\\nvoid main() {\\n if (outOfRange(fragClipBounds[0], fragClipBounds[1], dataCoordinate)) discard;\\n\\n gl_FragColor = vec4(pickGroup, pickId.bgr);\\n}\"]),c=[{name:\"position\",type:\"vec3\"},{name:\"color\",type:\"vec4\"},{name:\"glyph\",type:\"vec2\"},{name:\"id\",type:\"vec4\"}],f={vertex:a,fragment:l,attributes:c},h={vertex:o,fragment:l,attributes:c},p={vertex:s,fragment:l,attributes:c},d={vertex:a,fragment:u,attributes:c},v={vertex:o,fragment:u,attributes:c},g={vertex:s,fragment:u,attributes:c};function y(t,e){var r=n(t,e),i=r.attributes;return i.position.location=0,i.color.location=1,i.glyph.location=2,i.id.location=3,r}e.createPerspective=function(t){return y(t,f)},e.createOrtho=function(t){return y(t,h)},e.createProject=function(t){return y(t,p)},e.createPickPerspective=function(t){return y(t,d)},e.createPickOrtho=function(t){return y(t,v)},e.createPickProject=function(t){return y(t,g)}},8418:function(t,e,r){\"use strict\";var n=r(5219),i=r(2762),a=r(8116),o=r(1888),s=r(6760),l=r(1283),u=r(9366),c=r(5964),f=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];function h(t,e){var r=t[0],n=t[1],i=t[2],a=t[3];return t[0]=e[0]*r+e[4]*n+e[8]*i+e[12]*a,t[1]=e[1]*r+e[5]*n+e[9]*i+e[13]*a,t[2]=e[2]*r+e[6]*n+e[10]*i+e[14]*a,t[3]=e[3]*r+e[7]*n+e[11]*i+e[15]*a,t}function p(t,e,r,n){return h(n,n),h(n,n),h(n,n)}function d(t,e){this.index=t,this.dataCoordinate=this.position=e}function v(t){return!0===t||t>1?1:t}function g(t,e,r,n,i,a,o,s,l,u,c,f){this.gl=t,this.pixelRatio=1,this.shader=e,this.orthoShader=r,this.projectShader=n,this.pointBuffer=i,this.colorBuffer=a,this.glyphBuffer=o,this.idBuffer=s,this.vao=l,this.vertexCount=0,this.lineVertexCount=0,this.opacity=1,this.hasAlpha=!1,this.lineWidth=0,this.projectScale=[2/3,2/3,2/3],this.projectOpacity=[1,1,1],this.projectHasAlpha=!1,this.pickId=0,this.pickPerspectiveShader=u,this.pickOrthoShader=c,this.pickProjectShader=f,this.points=[],this._selectResult=new d(0,[0,0,0]),this.useOrtho=!0,this.bounds=[[1/0,1/0,1/0],[-1/0,-1/0,-1/0]],this.axesProject=[!0,!0,!0],this.axesBounds=[[-1/0,-1/0,-1/0],[1/0,1/0,1/0]],this.highlightId=[1,1,1,1],this.highlightScale=2,this.clipBounds=[[-1/0,-1/0,-1/0],[1/0,1/0,1/0]],this.dirty=!0}t.exports=function(t){var e=t.gl,r=l.createPerspective(e),n=l.createOrtho(e),o=l.createProject(e),s=l.createPickPerspective(e),u=l.createPickOrtho(e),c=l.createPickProject(e),f=i(e),h=i(e),p=i(e),d=i(e),v=new g(e,r,n,o,f,h,p,d,a(e,[{buffer:f,size:3,type:e.FLOAT},{buffer:h,size:4,type:e.FLOAT},{buffer:p,size:2,type:e.FLOAT},{buffer:d,size:4,type:e.UNSIGNED_BYTE,normalized:!0}]),s,u,c);return v.update(t),v};var y=g.prototype;y.pickSlots=1,y.setPickBase=function(t){this.pickId=t},y.isTransparent=function(){if(this.hasAlpha)return!0;for(var t=0;t<3;++t)if(this.axesProject[t]&&this.projectHasAlpha)return!0;return!1},y.isOpaque=function(){if(!this.hasAlpha)return!0;for(var t=0;t<3;++t)if(this.axesProject[t]&&!this.projectHasAlpha)return!0;return!1};var m=[0,0],x=[0,0,0],b=[0,0,0],_=[0,0,0,1],w=[0,0,0,1],T=f.slice(),k=[0,0,0],A=[[0,0,0],[0,0,0]];function M(t){return t[0]=t[1]=t[2]=0,t}function S(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=1,t}function E(t,e,r,n){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[r]=n,t}var L=[[-1e8,-1e8,-1e8],[1e8,1e8,1e8]];function C(t,e,r,n,i,a,o){var l=r.gl;if((a===r.projectHasAlpha||o)&&function(t,e,r,n){var i,a=e.axesProject,o=e.gl,l=t.uniforms,u=r.model||f,c=r.view||f,h=r.projection||f,d=e.axesBounds,v=function(t){for(var e=A,r=0;r<2;++r)for(var n=0;n<3;++n)e[r][n]=Math.max(Math.min(t[r][n],1e8),-1e8);return e}(e.clipBounds);i=e.axes&&e.axes.lastCubeProps?e.axes.lastCubeProps.axis:[1,1,1],m[0]=2/o.drawingBufferWidth,m[1]=2/o.drawingBufferHeight,t.bind(),l.view=c,l.projection=h,l.screenSize=m,l.highlightId=e.highlightId,l.highlightScale=e.highlightScale,l.clipBounds=v,l.pickGroup=e.pickId/255,l.pixelRatio=n;for(var g=0;g<3;++g)if(a[g]){l.scale=e.projectScale[g],l.opacity=e.projectOpacity[g];for(var y=T,L=0;L<16;++L)y[L]=0;for(L=0;L<4;++L)y[5*L]=1;y[5*g]=0,i[g]<0?y[12+g]=d[0][g]:y[12+g]=d[1][g],s(y,u,y),l.model=y;var C=(g+1)%3,P=(g+2)%3,O=M(x),I=M(b);O[C]=1,I[P]=1;var z=p(0,0,0,S(_,O)),D=p(0,0,0,S(w,I));if(Math.abs(z[1])>Math.abs(D[1])){var R=z;z=D,D=R,R=O,O=I,I=R;var F=C;C=P,P=F}z[0]<0&&(O[C]=-1),D[1]>0&&(I[P]=-1);var B=0,N=0;for(L=0;L<4;++L)B+=Math.pow(u[4*C+L],2),N+=Math.pow(u[4*P+L],2);O[C]/=Math.sqrt(B),I[P]/=Math.sqrt(N),l.axes[0]=O,l.axes[1]=I,l.fragClipBounds[0]=E(k,v[0],g,-1e8),l.fragClipBounds[1]=E(k,v[1],g,1e8),e.vao.bind(),e.vao.draw(o.TRIANGLES,e.vertexCount),e.lineWidth>0&&(o.lineWidth(e.lineWidth*n),e.vao.draw(o.LINES,e.lineVertexCount,e.vertexCount)),e.vao.unbind()}}(e,r,n,i),a===r.hasAlpha||o){t.bind();var u=t.uniforms;u.model=n.model||f,u.view=n.view||f,u.projection=n.projection||f,m[0]=2/l.drawingBufferWidth,m[1]=2/l.drawingBufferHeight,u.screenSize=m,u.highlightId=r.highlightId,u.highlightScale=r.highlightScale,u.fragClipBounds=L,u.clipBounds=r.axes.bounds,u.opacity=r.opacity,u.pickGroup=r.pickId/255,u.pixelRatio=i,r.vao.bind(),r.vao.draw(l.TRIANGLES,r.vertexCount),r.lineWidth>0&&(l.lineWidth(r.lineWidth*i),r.vao.draw(l.LINES,r.lineVertexCount,r.vertexCount)),r.vao.unbind()}}function P(t,e,r,i){var a;a=Array.isArray(t)?e=this.pointCount||e<0)return null;var r=this.points[e],n=this._selectResult;n.index=e;for(var i=0;i<3;++i)n.position[i]=n.dataCoordinate[i]=r[i];return n},y.highlight=function(t){if(t){var e=t.index,r=255&e,n=e>>8&255,i=e>>16&255;this.highlightId=[r/255,n/255,i/255,0]}else this.highlightId=[1,1,1,1]},y.update=function(t){if(\"perspective\"in(t=t||{})&&(this.useOrtho=!t.perspective),\"orthographic\"in t&&(this.useOrtho=!!t.orthographic),\"lineWidth\"in t&&(this.lineWidth=t.lineWidth),\"project\"in t)if(Array.isArray(t.project))this.axesProject=t.project;else{var e=!!t.project;this.axesProject=[e,e,e]}if(\"projectScale\"in t)if(Array.isArray(t.projectScale))this.projectScale=t.projectScale.slice();else{var r=+t.projectScale;this.projectScale=[r,r,r]}if(this.projectHasAlpha=!1,\"projectOpacity\"in t){Array.isArray(t.projectOpacity)?this.projectOpacity=t.projectOpacity.slice():(r=+t.projectOpacity,this.projectOpacity=[r,r,r]);for(var n=0;n<3;++n)this.projectOpacity[n]=v(this.projectOpacity[n]),this.projectOpacity[n]<1&&(this.projectHasAlpha=!0)}this.hasAlpha=!1,\"opacity\"in t&&(this.opacity=v(t.opacity),this.opacity<1&&(this.hasAlpha=!0)),this.dirty=!0;var i,a,s=t.position,l={family:t.font||\"normal\",style:t.fontStyle||\"normal\",weight:t.fontWeight||\"normal\",variant:t.fontVariant||\"normal\"},u=t.alignment||[0,0];if(2===u.length)i=u[0],a=u[1];else for(i=[],a=[],n=0;n0){var I=0,z=x,D=[0,0,0,1],R=[0,0,0,1],F=Array.isArray(p)&&Array.isArray(p[0]),B=Array.isArray(y)&&Array.isArray(y[0]);t:for(n=0;n<_;++n){for(m+=1,w=s[n],T=0;T<3;++T){if(isNaN(w[T])||!isFinite(w[T]))continue t;f[T]=Math.max(f[T],w[T]),c[T]=Math.min(c[T],w[T])}k=(N=P(h,n,l,this.pixelRatio)).mesh,A=N.lines,M=N.bounds;var N,j=N.visible;if(j)if(Array.isArray(p)){if(3===(U=F?n0?1-M[0][0]:W<0?1+M[1][0]:1,Y*=Y>0?1-M[0][1]:Y<0?1+M[1][1]:1],Z=k.cells||[],K=k.positions||[];for(T=0;T0){var y=r*c;o.drawBox(f-y,h-y,p+y,h+y,a),o.drawBox(f-y,d-y,p+y,d+y,a),o.drawBox(f-y,h-y,f+y,d+y,a),o.drawBox(p-y,h-y,p+y,d+y,a)}}}},s.update=function(t){t=t||{},this.innerFill=!!t.innerFill,this.outerFill=!!t.outerFill,this.innerColor=(t.innerColor||[0,0,0,.5]).slice(),this.outerColor=(t.outerColor||[0,0,0,.5]).slice(),this.borderColor=(t.borderColor||[0,0,0,1]).slice(),this.borderWidth=t.borderWidth||0,this.selectBox=(t.selectBox||this.selectBox).slice()},s.dispose=function(){this.boxBuffer.dispose(),this.boxShader.dispose(),this.plot.removeOverlay(this)}},3589:function(t,e,r){\"use strict\";t.exports=function(t,e){var r=e[0],a=e[1];return new l(t,n(t,r,a,{}),i.mallocUint8(r*a*4))};var n=r(2260),i=r(1888),a=r(9618),o=r(8828).nextPow2;function s(t,e,r,n,i){this.coord=[t,e],this.id=r,this.value=n,this.distance=i}function l(t,e,r){this.gl=t,this.fbo=e,this.buffer=r,this._readTimeout=null;var n=this;this._readCallback=function(){n.gl&&(e.bind(),t.readPixels(0,0,e.shape[0],e.shape[1],t.RGBA,t.UNSIGNED_BYTE,n.buffer),n._readTimeout=null)}}var u=l.prototype;Object.defineProperty(u,\"shape\",{get:function(){return this.gl?this.fbo.shape.slice():[0,0]},set:function(t){if(this.gl){this.fbo.shape=t;var e=this.fbo.shape[0],r=this.fbo.shape[1];if(r*e*4>this.buffer.length){i.free(this.buffer);for(var n=this.buffer=i.mallocUint8(o(r*e*4)),a=0;ar)for(t=r;te)for(t=e;t=0){for(var T=0|w.type.charAt(w.type.length-1),k=new Array(T),A=0;A=0;)M+=1;_[m]=M}var S=new Array(r.length);function E(){h.program=o.program(p,h._vref,h._fref,b,_);for(var t=0;t=0){if((d=h.charCodeAt(h.length-1)-48)<2||d>4)throw new n(\"\",\"Invalid data type for attribute \"+f+\": \"+h);s(t,e,p[0],i,d,a,f)}else{if(!(h.indexOf(\"mat\")>=0))throw new n(\"\",\"Unknown data type for attribute \"+f+\": \"+h);var d;if((d=h.charCodeAt(h.length-1)-48)<2||d>4)throw new n(\"\",\"Invalid data type for attribute \"+f+\": \"+h);l(t,e,p,i,d,a,f)}}}return a};var n=r(8866);function i(t,e,r,n,i,a){this._gl=t,this._wrapper=e,this._index=r,this._locations=n,this._dimension=i,this._constFunc=a}var a=i.prototype;a.pointer=function(t,e,r,n){var i=this,a=i._gl,o=i._locations[i._index];a.vertexAttribPointer(o,i._dimension,t||a.FLOAT,!!e,r||0,n||0),a.enableVertexAttribArray(o)},a.set=function(t,e,r,n){return this._constFunc(this._locations[this._index],t,e,r,n)},Object.defineProperty(a,\"location\",{get:function(){return this._locations[this._index]},set:function(t){return t!==this._locations[this._index]&&(this._locations[this._index]=0|t,this._wrapper.program=null),0|t}});var o=[function(t,e,r){return void 0===r.length?t.vertexAttrib1f(e,r):t.vertexAttrib1fv(e,r)},function(t,e,r,n){return void 0===r.length?t.vertexAttrib2f(e,r,n):t.vertexAttrib2fv(e,r)},function(t,e,r,n,i){return void 0===r.length?t.vertexAttrib3f(e,r,n,i):t.vertexAttrib3fv(e,r)},function(t,e,r,n,i,a){return void 0===r.length?t.vertexAttrib4f(e,r,n,i,a):t.vertexAttrib4fv(e,r)}];function s(t,e,r,n,a,s,l){var u=o[a],c=new i(t,e,r,n,a,u);Object.defineProperty(s,l,{set:function(e){return t.disableVertexAttribArray(n[r]),u(t,n[r],e),e},get:function(){return c},enumerable:!0})}function l(t,e,r,n,i,a,o){for(var l=new Array(i),u=new Array(i),c=0;c4)throw new i(\"\",\"Invalid uniform dimension type for matrix \"+name+\": \"+m);t[\"uniformMatrix\"+y+\"fv\"](s[f],!1,h);break}throw new i(\"\",\"Unknown uniform data type for \"+name+\": \"+m)}if((y=m.charCodeAt(m.length-1)-48)<2||y>4)throw new i(\"\",\"Invalid data type\");switch(m.charAt(0)){case\"b\":case\"i\":t[\"uniform\"+y+\"iv\"](s[f],h);break;case\"v\":t[\"uniform\"+y+\"fv\"](s[f],h);break;default:throw new i(\"\",\"Unrecognized data type for vector \"+name+\": \"+m)}}}}}}function u(t,e){if(\"object\"!=typeof e)return[[t,e]];var r=[];for(var n in e){var i=e[n],a=t;parseInt(n)+\"\"===n?a+=\"[\"+n+\"]\":a+=\".\"+n,\"object\"==typeof i?r.push.apply(r,u(a,i)):r.push([a,i])}return r}function c(t,e,n){if(\"object\"==typeof n){var u=f(n);Object.defineProperty(t,e,{get:a(u),set:l(n),enumerable:!0,configurable:!1})}else s[n]?Object.defineProperty(t,e,{get:(c=n,function(t,e,r){return t.getUniform(e.program,r[c])}),set:l(n),enumerable:!0,configurable:!1}):t[e]=function(t){switch(t){case\"bool\":return!1;case\"int\":case\"sampler2D\":case\"samplerCube\":case\"float\":return 0;default:var e=t.indexOf(\"vec\");if(0<=e&&e<=1&&t.length===4+e){if((r=t.charCodeAt(t.length-1)-48)<2||r>4)throw new i(\"\",\"Invalid data type\");return\"b\"===t.charAt(0)?o(r,!1):o(r,0)}if(0===t.indexOf(\"mat\")&&4===t.length){var r;if((r=t.charCodeAt(t.length-1)-48)<2||r>4)throw new i(\"\",\"Invalid uniform dimension type for matrix \"+name+\": \"+t);return o(r*r,0)}throw new i(\"\",\"Unknown uniform data type for \"+name+\": \"+t)}}(r[n].type);var c}function f(t){var e;if(Array.isArray(t)){e=new Array(t.length);for(var r=0;r1){s[0]in a||(a[s[0]]=[]),a=a[s[0]];for(var l=1;l1)for(var l=0;l 0 U ||b|| > 0.\\n // Assign z = 0, x = -b, y = a:\\n // a*-b + b*a + c*0 = -ba + ba + 0 = 0\\n if (v.x*v.x > v.z*v.z || v.y*v.y > v.z*v.z) {\\n return normalize(vec3(-v.y, v.x, 0.0));\\n } else {\\n return normalize(vec3(0.0, v.z, -v.y));\\n }\\n}\\n\\n// Calculate the tube vertex and normal at the given index.\\n//\\n// The returned vertex is for a tube ring with its center at origin, radius of length(d), pointing in the direction of d.\\n//\\n// Each tube segment is made up of a ring of vertices.\\n// These vertices are used to make up the triangles of the tube by connecting them together in the vertex array.\\n// The indexes of tube segments run from 0 to 8.\\n//\\nvec3 getTubePosition(vec3 d, float index, out vec3 normal) {\\n float segmentCount = 8.0;\\n\\n float angle = 2.0 * 3.14159 * (index / segmentCount);\\n\\n vec3 u = getOrthogonalVector(d);\\n vec3 v = normalize(cross(u, d));\\n\\n vec3 x = u * cos(angle) * length(d);\\n vec3 y = v * sin(angle) * length(d);\\n vec3 v3 = x + y;\\n\\n normal = normalize(v3);\\n\\n return v3;\\n}\\n\\nattribute vec4 vector;\\nattribute vec4 color, position;\\nattribute vec2 uv;\\n\\nuniform float vectorScale, tubeScale;\\nuniform mat4 model, view, projection, inverseModel;\\nuniform vec3 eyePosition, lightPosition;\\n\\nvarying vec3 f_normal, f_lightDirection, f_eyeDirection, f_data, f_position;\\nvarying vec4 f_color;\\nvarying vec2 f_uv;\\n\\nvoid main() {\\n // Scale the vector magnitude to stay constant with\\n // model & view changes.\\n vec3 normal;\\n vec3 XYZ = getTubePosition(mat3(model) * (tubeScale * vector.w * normalize(vector.xyz)), position.w, normal);\\n vec4 tubePosition = model * vec4(position.xyz, 1.0) + vec4(XYZ, 0.0);\\n\\n //Lighting geometry parameters\\n vec4 cameraCoordinate = view * tubePosition;\\n cameraCoordinate.xyz /= cameraCoordinate.w;\\n f_lightDirection = lightPosition - cameraCoordinate.xyz;\\n f_eyeDirection = eyePosition - cameraCoordinate.xyz;\\n f_normal = normalize((vec4(normal, 0.0) * inverseModel).xyz);\\n\\n // vec4 m_position = model * vec4(tubePosition, 1.0);\\n vec4 t_position = view * tubePosition;\\n gl_Position = projection * t_position;\\n\\n f_color = color;\\n f_data = tubePosition.xyz;\\n f_position = position.xyz;\\n f_uv = uv;\\n}\\n\"]),a=n([\"#extension GL_OES_standard_derivatives : enable\\n\\nprecision highp float;\\n#define GLSLIFY 1\\n\\nfloat beckmannDistribution(float x, float roughness) {\\n float NdotH = max(x, 0.0001);\\n float cos2Alpha = NdotH * NdotH;\\n float tan2Alpha = (cos2Alpha - 1.0) / cos2Alpha;\\n float roughness2 = roughness * roughness;\\n float denom = 3.141592653589793 * roughness2 * cos2Alpha * cos2Alpha;\\n return exp(tan2Alpha / roughness2) / denom;\\n}\\n\\nfloat cookTorranceSpecular(\\n vec3 lightDirection,\\n vec3 viewDirection,\\n vec3 surfaceNormal,\\n float roughness,\\n float fresnel) {\\n\\n float VdotN = max(dot(viewDirection, surfaceNormal), 0.0);\\n float LdotN = max(dot(lightDirection, surfaceNormal), 0.0);\\n\\n //Half angle vector\\n vec3 H = normalize(lightDirection + viewDirection);\\n\\n //Geometric term\\n float NdotH = max(dot(surfaceNormal, H), 0.0);\\n float VdotH = max(dot(viewDirection, H), 0.000001);\\n float LdotH = max(dot(lightDirection, H), 0.000001);\\n float G1 = (2.0 * NdotH * VdotN) / VdotH;\\n float G2 = (2.0 * NdotH * LdotN) / LdotH;\\n float G = min(1.0, min(G1, G2));\\n \\n //Distribution term\\n float D = beckmannDistribution(NdotH, roughness);\\n\\n //Fresnel term\\n float F = pow(1.0 - VdotN, fresnel);\\n\\n //Multiply terms and done\\n return G * F * D / max(3.14159265 * VdotN, 0.000001);\\n}\\n\\nbool outOfRange(float a, float b, float p) {\\n return ((p > max(a, b)) || \\n (p < min(a, b)));\\n}\\n\\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y));\\n}\\n\\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y) ||\\n outOfRange(a.z, b.z, p.z));\\n}\\n\\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\\n return outOfRange(a.xyz, b.xyz, p.xyz);\\n}\\n\\nuniform vec3 clipBounds[2];\\nuniform float roughness, fresnel, kambient, kdiffuse, kspecular, opacity;\\nuniform sampler2D texture;\\n\\nvarying vec3 f_normal, f_lightDirection, f_eyeDirection, f_data, f_position;\\nvarying vec4 f_color;\\nvarying vec2 f_uv;\\n\\nvoid main() {\\n if (outOfRange(clipBounds[0], clipBounds[1], f_position)) discard;\\n vec3 N = normalize(f_normal);\\n vec3 L = normalize(f_lightDirection);\\n vec3 V = normalize(f_eyeDirection);\\n\\n if(gl_FrontFacing) {\\n N = -N;\\n }\\n\\n float specular = min(1.0, max(0.0, cookTorranceSpecular(L, V, N, roughness, fresnel)));\\n float diffuse = min(kambient + kdiffuse * max(dot(N, L), 0.0), 1.0);\\n\\n vec4 surfaceColor = f_color * texture2D(texture, f_uv);\\n vec4 litColor = surfaceColor.a * vec4(diffuse * surfaceColor.rgb + kspecular * vec3(1,1,1) * specular, 1.0);\\n\\n gl_FragColor = litColor * opacity;\\n}\\n\"]),o=n([\"precision highp float;\\n\\nprecision highp float;\\n#define GLSLIFY 1\\n\\nvec3 getOrthogonalVector(vec3 v) {\\n // Return up-vector for only-z vector.\\n // Return ax + by + cz = 0, a point that lies on the plane that has v as a normal and that isn't (0,0,0).\\n // From the above if-statement we have ||a|| > 0 U ||b|| > 0.\\n // Assign z = 0, x = -b, y = a:\\n // a*-b + b*a + c*0 = -ba + ba + 0 = 0\\n if (v.x*v.x > v.z*v.z || v.y*v.y > v.z*v.z) {\\n return normalize(vec3(-v.y, v.x, 0.0));\\n } else {\\n return normalize(vec3(0.0, v.z, -v.y));\\n }\\n}\\n\\n// Calculate the tube vertex and normal at the given index.\\n//\\n// The returned vertex is for a tube ring with its center at origin, radius of length(d), pointing in the direction of d.\\n//\\n// Each tube segment is made up of a ring of vertices.\\n// These vertices are used to make up the triangles of the tube by connecting them together in the vertex array.\\n// The indexes of tube segments run from 0 to 8.\\n//\\nvec3 getTubePosition(vec3 d, float index, out vec3 normal) {\\n float segmentCount = 8.0;\\n\\n float angle = 2.0 * 3.14159 * (index / segmentCount);\\n\\n vec3 u = getOrthogonalVector(d);\\n vec3 v = normalize(cross(u, d));\\n\\n vec3 x = u * cos(angle) * length(d);\\n vec3 y = v * sin(angle) * length(d);\\n vec3 v3 = x + y;\\n\\n normal = normalize(v3);\\n\\n return v3;\\n}\\n\\nattribute vec4 vector;\\nattribute vec4 position;\\nattribute vec4 id;\\n\\nuniform mat4 model, view, projection;\\nuniform float tubeScale;\\n\\nvarying vec3 f_position;\\nvarying vec4 f_id;\\n\\nvoid main() {\\n vec3 normal;\\n vec3 XYZ = getTubePosition(mat3(model) * (tubeScale * vector.w * normalize(vector.xyz)), position.w, normal);\\n vec4 tubePosition = model * vec4(position.xyz, 1.0) + vec4(XYZ, 0.0);\\n\\n gl_Position = projection * view * tubePosition;\\n f_id = id;\\n f_position = position.xyz;\\n}\\n\"]),s=n([\"precision highp float;\\n#define GLSLIFY 1\\n\\nbool outOfRange(float a, float b, float p) {\\n return ((p > max(a, b)) || \\n (p < min(a, b)));\\n}\\n\\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y));\\n}\\n\\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y) ||\\n outOfRange(a.z, b.z, p.z));\\n}\\n\\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\\n return outOfRange(a.xyz, b.xyz, p.xyz);\\n}\\n\\nuniform vec3 clipBounds[2];\\nuniform float pickId;\\n\\nvarying vec3 f_position;\\nvarying vec4 f_id;\\n\\nvoid main() {\\n if (outOfRange(clipBounds[0], clipBounds[1], f_position)) discard;\\n\\n gl_FragColor = vec4(pickId, f_id.xyz);\\n}\"]);e.meshShader={vertex:i,fragment:a,attributes:[{name:\"position\",type:\"vec4\"},{name:\"color\",type:\"vec4\"},{name:\"uv\",type:\"vec2\"},{name:\"vector\",type:\"vec4\"}]},e.pickShader={vertex:o,fragment:s,attributes:[{name:\"position\",type:\"vec4\"},{name:\"id\",type:\"vec4\"},{name:\"vector\",type:\"vec4\"}]}},7815:function(t,e,r){\"use strict\";var n=r(2931),i=r(9970),a=[\"xyz\",\"xzy\",\"yxz\",\"yzx\",\"zxy\",\"zyx\"],o=function(t,e){var r,n=t.length;for(r=0;re)return r-1}return r},s=function(t,e,r){return tr?r:t},l=function(t){var e=1/0;t.sort((function(t,e){return t-e}));for(var r=t.length,n=1;nf-1||m>h-1||x>p-1)return n.create();var b,_,w,T,k,A,M=a[0][d],S=a[0][y],E=a[1][v],L=a[1][m],C=a[2][g],P=(l-M)/(S-M),O=(u-E)/(L-E),I=(c-C)/(a[2][x]-C);switch(isFinite(P)||(P=.5),isFinite(O)||(O=.5),isFinite(I)||(I=.5),r.reversedX&&(d=f-1-d,y=f-1-y),r.reversedY&&(v=h-1-v,m=h-1-m),r.reversedZ&&(g=p-1-g,x=p-1-x),r.filled){case 5:k=g,A=x,w=v*p,T=m*p,b=d*p*h,_=y*p*h;break;case 4:k=g,A=x,b=d*p,_=y*p,w=v*p*f,T=m*p*f;break;case 3:w=v,T=m,k=g*h,A=x*h,b=d*h*p,_=y*h*p;break;case 2:w=v,T=m,b=d*h,_=y*h,k=g*h*f,A=x*h*f;break;case 1:b=d,_=y,k=g*f,A=x*f,w=v*f*p,T=m*f*p;break;default:b=d,_=y,w=v*f,T=m*f,k=g*f*h,A=x*f*h}var z=i[b+w+k],D=i[b+w+A],R=i[b+T+k],F=i[b+T+A],B=i[_+w+k],N=i[_+w+A],j=i[_+T+k],U=i[_+T+A],V=n.create(),q=n.create(),H=n.create(),G=n.create();n.lerp(V,z,B,P),n.lerp(q,D,N,P),n.lerp(H,R,j,P),n.lerp(G,F,U,P);var W=n.create(),Y=n.create();n.lerp(W,V,H,O),n.lerp(Y,q,G,O);var X=n.create();return n.lerp(X,W,Y,I),X}(e,t,p)},v=t.getDivergence||function(t,e){var r=n.create(),i=1e-4;n.add(r,t,[i,0,0]);var a=d(r);n.subtract(a,a,e),n.scale(a,a,1/i),n.add(r,t,[0,i,0]);var o=d(r);n.subtract(o,o,e),n.scale(o,o,1/i),n.add(r,t,[0,0,i]);var s=d(r);return n.subtract(s,s,e),n.scale(s,s,1/i),n.add(r,a,o),n.add(r,r,s),r},g=[],y=e[0][0],m=e[0][1],x=e[0][2],b=e[1][0],_=e[1][1],w=e[1][2],T=function(t){var e=t[0],r=t[1],n=t[2];return!(eb||r_||nw)},k=10*n.distance(e[0],e[1])/u,A=k*k,M=1,S=0,E=r.length;E>1&&(M=function(t){for(var e=[],r=[],n=[],i={},a={},o={},s=t.length,u=0;uS&&(S=F),D.push(F),g.push({points:P,velocities:O,divergences:D});for(var B=0;B<100*u&&P.lengthA&&n.scale(N,N,k/Math.sqrt(j)),n.add(N,N,C),I=d(N),n.squaredDistance(z,N)-A>-1e-4*A&&(P.push(N),z=N,O.push(I),R=v(N,I),F=n.length(R),isFinite(F)&&F>S&&(S=F),D.push(F)),C=N}}var U=function(t,e,r,a){for(var o=0,s=0;s0)for(T=0;T<8;T++){var k=(T+1)%8;u.push(h[T],p[T],p[k],p[k],h[k],h[T]),f.push(m,y,y,y,m,m),d.push(v,g,g,g,v,v);var A=u.length;c.push([A-6,A-5,A-4],[A-3,A-2,A-1])}var M=h;h=p,p=M;var S=m;m=y,y=S;var E=v;v=g,g=E}return{positions:u,cells:c,vectors:f,vertexIntensity:d}}(t,r,a,o)})),f=[],h=[],p=[],d=[];for(s=0;s max(a, b)) || \\n (p < min(a, b)));\\n}\\n\\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y));\\n}\\n\\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y) ||\\n outOfRange(a.z, b.z, p.z));\\n}\\n\\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\\n return outOfRange(a.xyz, b.xyz, p.xyz);\\n}\\n\\nuniform vec3 lowerBound, upperBound;\\nuniform float contourTint;\\nuniform vec4 contourColor;\\nuniform sampler2D colormap;\\nuniform vec3 clipBounds[2];\\nuniform float roughness, fresnel, kambient, kdiffuse, kspecular, opacity;\\nuniform float vertexColor;\\n\\nvarying float value, kill;\\nvarying vec3 worldCoordinate;\\nvarying vec3 lightDirection, eyeDirection, surfaceNormal;\\nvarying vec4 vColor;\\n\\nvoid main() {\\n if (\\n kill > 0.0 ||\\n vColor.a == 0.0 ||\\n outOfRange(clipBounds[0], clipBounds[1], worldCoordinate)\\n ) discard;\\n\\n vec3 N = normalize(surfaceNormal);\\n vec3 V = normalize(eyeDirection);\\n vec3 L = normalize(lightDirection);\\n\\n if(gl_FrontFacing) {\\n N = -N;\\n }\\n\\n float specular = max(beckmannSpecular(L, V, N, roughness), 0.);\\n float diffuse = min(kambient + kdiffuse * max(dot(N, L), 0.0), 1.0);\\n\\n //decide how to interpolate color — in vertex or in fragment\\n vec4 surfaceColor =\\n step(vertexColor, .5) * texture2D(colormap, vec2(value, value)) +\\n step(.5, vertexColor) * vColor;\\n\\n vec4 litColor = surfaceColor.a * vec4(diffuse * surfaceColor.rgb + kspecular * vec3(1,1,1) * specular, 1.0);\\n\\n gl_FragColor = mix(litColor, contourColor, contourTint) * opacity;\\n}\\n\"]),s=i([\"precision highp float;\\n#define GLSLIFY 1\\n\\nattribute vec4 uv;\\nattribute float f;\\n\\nuniform vec3 objectOffset;\\nuniform mat3 permutation;\\nuniform mat4 model, view, projection;\\nuniform float height, zOffset;\\nuniform sampler2D colormap;\\n\\nvarying float value, kill;\\nvarying vec3 worldCoordinate;\\nvarying vec2 planeCoordinate;\\nvarying vec3 lightDirection, eyeDirection, surfaceNormal;\\nvarying vec4 vColor;\\n\\nvoid main() {\\n vec3 dataCoordinate = permutation * vec3(uv.xy, height);\\n worldCoordinate = objectOffset + dataCoordinate;\\n vec4 worldPosition = model * vec4(worldCoordinate, 1.0);\\n\\n vec4 clipPosition = projection * view * worldPosition;\\n clipPosition.z += zOffset;\\n\\n gl_Position = clipPosition;\\n value = f + objectOffset.z;\\n kill = -1.0;\\n planeCoordinate = uv.zw;\\n\\n vColor = texture2D(colormap, vec2(value, value));\\n\\n //Don't do lighting for contours\\n surfaceNormal = vec3(1,0,0);\\n eyeDirection = vec3(0,1,0);\\n lightDirection = vec3(0,0,1);\\n}\\n\"]),l=i([\"precision highp float;\\n#define GLSLIFY 1\\n\\nbool outOfRange(float a, float b, float p) {\\n return ((p > max(a, b)) || \\n (p < min(a, b)));\\n}\\n\\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y));\\n}\\n\\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y) ||\\n outOfRange(a.z, b.z, p.z));\\n}\\n\\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\\n return outOfRange(a.xyz, b.xyz, p.xyz);\\n}\\n\\nuniform vec2 shape;\\nuniform vec3 clipBounds[2];\\nuniform float pickId;\\n\\nvarying float value, kill;\\nvarying vec3 worldCoordinate;\\nvarying vec2 planeCoordinate;\\nvarying vec3 surfaceNormal;\\n\\nvec2 splitFloat(float v) {\\n float vh = 255.0 * v;\\n float upper = floor(vh);\\n float lower = fract(vh);\\n return vec2(upper / 255.0, floor(lower * 16.0) / 16.0);\\n}\\n\\nvoid main() {\\n if ((kill > 0.0) ||\\n (outOfRange(clipBounds[0], clipBounds[1], worldCoordinate))) discard;\\n\\n vec2 ux = splitFloat(planeCoordinate.x / shape.x);\\n vec2 uy = splitFloat(planeCoordinate.y / shape.y);\\n gl_FragColor = vec4(pickId, ux.x, uy.x, ux.y + (uy.y/16.0));\\n}\\n\"]);e.createShader=function(t){var e=n(t,a,o,null,[{name:\"uv\",type:\"vec4\"},{name:\"f\",type:\"vec3\"},{name:\"normal\",type:\"vec3\"}]);return e.attributes.uv.location=0,e.attributes.f.location=1,e.attributes.normal.location=2,e},e.createPickShader=function(t){var e=n(t,a,l,null,[{name:\"uv\",type:\"vec4\"},{name:\"f\",type:\"vec3\"},{name:\"normal\",type:\"vec3\"}]);return e.attributes.uv.location=0,e.attributes.f.location=1,e.attributes.normal.location=2,e},e.createContourShader=function(t){var e=n(t,s,o,null,[{name:\"uv\",type:\"vec4\"},{name:\"f\",type:\"float\"}]);return e.attributes.uv.location=0,e.attributes.f.location=1,e},e.createPickContourShader=function(t){var e=n(t,s,l,null,[{name:\"uv\",type:\"vec4\"},{name:\"f\",type:\"float\"}]);return e.attributes.uv.location=0,e.attributes.f.location=1,e}},9499:function(t,e,r){\"use strict\";t.exports=function(t){var e=t.gl,r=m(e),n=b(e),s=x(e),l=_(e),u=i(e),c=a(e,[{buffer:u,size:4,stride:w,offset:0},{buffer:u,size:3,stride:w,offset:16},{buffer:u,size:3,stride:w,offset:28}]),f=i(e),h=a(e,[{buffer:f,size:4,stride:20,offset:0},{buffer:f,size:1,stride:20,offset:16}]),p=i(e),d=a(e,[{buffer:p,size:2,type:e.FLOAT}]),v=o(e,1,S,e.RGBA,e.UNSIGNED_BYTE);v.minFilter=e.LINEAR,v.magFilter=e.LINEAR;var g=new E(e,[0,0],[[0,0,0],[0,0,0]],r,n,u,c,v,s,l,f,h,p,d,[0,0,0]),y={levels:[[],[],[]]};for(var T in t)y[T]=t[T];return y.colormap=y.colormap||\"jet\",g.update(y),g};var n=r(8828),i=r(2762),a=r(8116),o=r(7766),s=r(1888),l=r(6729),u=r(5298),c=r(9994),f=r(9618),h=r(3711),p=r(6760),d=r(7608),v=r(2478),g=r(6199),y=r(990),m=y.createShader,x=y.createContourShader,b=y.createPickShader,_=y.createPickContourShader,w=40,T=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],k=[[0,0],[0,1],[1,0],[1,1],[1,0],[0,1]],A=[[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0]];function M(t,e,r,n,i){this.position=t,this.index=e,this.uv=r,this.level=n,this.dataCoordinate=i}!function(){for(var t=0;t<3;++t){var e=A[t],r=(t+2)%3;e[(t+1)%3+0]=1,e[r+3]=1,e[t+6]=1}}();var S=256;function E(t,e,r,n,i,a,o,l,u,c,h,p,d,v,g){this.gl=t,this.shape=e,this.bounds=r,this.objectOffset=g,this.intensityBounds=[],this._shader=n,this._pickShader=i,this._coordinateBuffer=a,this._vao=o,this._colorMap=l,this._contourShader=u,this._contourPickShader=c,this._contourBuffer=h,this._contourVAO=p,this._contourOffsets=[[],[],[]],this._contourCounts=[[],[],[]],this._vertexCount=0,this._pickResult=new M([0,0,0],[0,0],[0,0],[0,0,0],[0,0,0]),this._dynamicBuffer=d,this._dynamicVAO=v,this._dynamicOffsets=[0,0,0],this._dynamicCounts=[0,0,0],this.contourWidth=[1,1,1],this.contourLevels=[[1],[1],[1]],this.contourTint=[0,0,0],this.contourColor=[[.5,.5,.5,1],[.5,.5,.5,1],[.5,.5,.5,1]],this.showContour=!0,this.showSurface=!0,this.enableHighlight=[!0,!0,!0],this.highlightColor=[[0,0,0,1],[0,0,0,1],[0,0,0,1]],this.highlightTint=[1,1,1],this.highlightLevel=[-1,-1,-1],this.enableDynamic=[!0,!0,!0],this.dynamicLevel=[NaN,NaN,NaN],this.dynamicColor=[[0,0,0,1],[0,0,0,1],[0,0,0,1]],this.dynamicTint=[1,1,1],this.dynamicWidth=[1,1,1],this.axesBounds=[[1/0,1/0,1/0],[-1/0,-1/0,-1/0]],this.surfaceProject=[!1,!1,!1],this.contourProject=[[!1,!1,!1],[!1,!1,!1],[!1,!1,!1]],this.colorBounds=[!1,!1],this._field=[f(s.mallocFloat(1024),[0,0]),f(s.mallocFloat(1024),[0,0]),f(s.mallocFloat(1024),[0,0])],this.pickId=1,this.clipBounds=[[-1/0,-1/0,-1/0],[1/0,1/0,1/0]],this.snapToData=!1,this.pixelRatio=1,this.opacity=1,this.lightPosition=[10,1e4,0],this.ambientLight=.8,this.diffuseLight=.8,this.specularLight=2,this.roughness=.5,this.fresnel=1.5,this.vertexColor=0,this.dirty=!0}var L=E.prototype;L.genColormap=function(t,e){var r=!1,n=c([l({colormap:t,nshades:S,format:\"rgba\"}).map((function(t,n){var i=e?function(t,e){if(!e)return 1;if(!e.length)return 1;for(var r=0;rt&&r>0){var n=(e[r][0]-t)/(e[r][0]-e[r-1][0]);return e[r][1]*(1-n)+n*e[r-1][1]}}return 1}(n/255,e):t[3];return i<1&&(r=!0),[t[0],t[1],t[2],255*i]}))]);return u.divseq(n,255),this.hasAlphaScale=r,n},L.isTransparent=function(){return this.opacity<1||this.hasAlphaScale},L.isOpaque=function(){return!this.isTransparent()},L.pickSlots=1,L.setPickBase=function(t){this.pickId=t};var C=[0,0,0],P={showSurface:!1,showContour:!1,projections:[T.slice(),T.slice(),T.slice()],clipBounds:[[[0,0,0],[0,0,0]],[[0,0,0],[0,0,0]],[[0,0,0],[0,0,0]]]};function O(t,e){var r,n,i,a=e.axes&&e.axes.lastCubeProps.axis||C,o=e.showSurface,s=e.showContour;for(r=0;r<3;++r)for(o=o||e.surfaceProject[r],n=0;n<3;++n)s=s||e.contourProject[r][n];for(r=0;r<3;++r){var l=P.projections[r];for(n=0;n<16;++n)l[n]=0;for(n=0;n<4;++n)l[5*n]=1;l[5*r]=0,l[12+r]=e.axesBounds[+(a[r]>0)][r],p(l,t.model,l);var u=P.clipBounds[r];for(i=0;i<2;++i)for(n=0;n<3;++n)u[i][n]=t.clipBounds[i][n];u[0][r]=-1e8,u[1][r]=1e8}return P.showSurface=o,P.showContour=s,P}var I={model:T,view:T,projection:T,inverseModel:T.slice(),lowerBound:[0,0,0],upperBound:[0,0,0],colorMap:0,clipBounds:[[0,0,0],[0,0,0]],height:0,contourTint:0,contourColor:[0,0,0,1],permutation:[1,0,0,0,1,0,0,0,1],zOffset:-1e-4,objectOffset:[0,0,0],kambient:1,kdiffuse:1,kspecular:1,lightPosition:[1e3,1e3,1e3],eyePosition:[0,0,0],roughness:1,fresnel:1,opacity:1,vertexColor:0},z=T.slice(),D=[1,0,0,0,1,0,0,0,1];function R(t,e){t=t||{};var r=this.gl;r.disable(r.CULL_FACE),this._colorMap.bind(0);var n=I;n.model=t.model||T,n.view=t.view||T,n.projection=t.projection||T,n.lowerBound=[this.bounds[0][0],this.bounds[0][1],this.colorBounds[0]||this.bounds[0][2]],n.upperBound=[this.bounds[1][0],this.bounds[1][1],this.colorBounds[1]||this.bounds[1][2]],n.objectOffset=this.objectOffset,n.contourColor=this.contourColor[0],n.inverseModel=d(n.inverseModel,n.model);for(var i=0;i<2;++i)for(var a=n.clipBounds[i],o=0;o<3;++o)a[o]=Math.min(Math.max(this.clipBounds[i][o],-1e8),1e8);n.kambient=this.ambientLight,n.kdiffuse=this.diffuseLight,n.kspecular=this.specularLight,n.roughness=this.roughness,n.fresnel=this.fresnel,n.opacity=this.opacity,n.height=0,n.permutation=D,n.vertexColor=this.vertexColor;var s=z;for(p(s,n.view,n.model),p(s,n.projection,s),d(s,s),i=0;i<3;++i)n.eyePosition[i]=s[12+i]/s[15];var l=s[15];for(i=0;i<3;++i)l+=this.lightPosition[i]*s[4*i+3];for(i=0;i<3;++i){var u=s[12+i];for(o=0;o<3;++o)u+=s[4*o+i]*this.lightPosition[o];n.lightPosition[i]=u/l}var c=O(n,this);if(c.showSurface){for(this._shader.bind(),this._shader.uniforms=n,this._vao.bind(),this.showSurface&&this._vertexCount&&this._vao.draw(r.TRIANGLES,this._vertexCount),i=0;i<3;++i)this.surfaceProject[i]&&this.vertexCount&&(this._shader.uniforms.model=c.projections[i],this._shader.uniforms.clipBounds=c.clipBounds[i],this._vao.draw(r.TRIANGLES,this._vertexCount));this._vao.unbind()}if(c.showContour){var f=this._contourShader;n.kambient=1,n.kdiffuse=0,n.kspecular=0,n.opacity=1,f.bind(),f.uniforms=n;var h=this._contourVAO;for(h.bind(),i=0;i<3;++i)for(f.uniforms.permutation=A[i],r.lineWidth(this.contourWidth[i]*this.pixelRatio),o=0;o>4)/16)/255,i=Math.floor(n),a=n-i,o=e[1]*(t.value[1]+(15&t.value[2])/16)/255,s=Math.floor(o),l=o-s;i+=1,s+=1;var u=r.position;u[0]=u[1]=u[2]=0;for(var c=0;c<2;++c)for(var f=c?a:1-a,h=0;h<2;++h)for(var p=i+c,d=s+h,g=f*(h?l:1-l),y=0;y<3;++y)u[y]+=this._field[y].get(p,d)*g;for(var m=this._pickResult.level,x=0;x<3;++x)if(m[x]=v.le(this.contourLevels[x],u[x]),m[x]<0)this.contourLevels[x].length>0&&(m[x]=0);else if(m[x]Math.abs(_-u[x])&&(m[x]+=1)}for(r.index[0]=a<.5?i:i+1,r.index[1]=l<.5?s:s+1,r.uv[0]=n/e[0],r.uv[1]=o/e[1],y=0;y<3;++y)r.dataCoordinate[y]=this._field[y].get(r.index[0],r.index[1]);return r},L.padField=function(t,e){var r=e.shape.slice(),n=t.shape.slice();u.assign(t.lo(1,1).hi(r[0],r[1]),e),u.assign(t.lo(1).hi(r[0],1),e.hi(r[0],1)),u.assign(t.lo(1,n[1]-1).hi(r[0],1),e.lo(0,r[1]-1).hi(r[0],1)),u.assign(t.lo(0,1).hi(1,r[1]),e.hi(1)),u.assign(t.lo(n[0]-1,1).hi(1,r[1]),e.lo(r[0]-1)),t.set(0,0,e.get(0,0)),t.set(0,n[1]-1,e.get(0,r[1]-1)),t.set(n[0]-1,0,e.get(r[0]-1,0)),t.set(n[0]-1,n[1]-1,e.get(r[0]-1,r[1]-1))},L.update=function(t){t=t||{},this.objectOffset=t.objectOffset||this.objectOffset,this.dirty=!0,\"contourWidth\"in t&&(this.contourWidth=B(t.contourWidth,Number)),\"showContour\"in t&&(this.showContour=B(t.showContour,Boolean)),\"showSurface\"in t&&(this.showSurface=!!t.showSurface),\"contourTint\"in t&&(this.contourTint=B(t.contourTint,Boolean)),\"contourColor\"in t&&(this.contourColor=j(t.contourColor)),\"contourProject\"in t&&(this.contourProject=B(t.contourProject,(function(t){return B(t,Boolean)}))),\"surfaceProject\"in t&&(this.surfaceProject=t.surfaceProject),\"dynamicColor\"in t&&(this.dynamicColor=j(t.dynamicColor)),\"dynamicTint\"in t&&(this.dynamicTint=B(t.dynamicTint,Number)),\"dynamicWidth\"in t&&(this.dynamicWidth=B(t.dynamicWidth,Number)),\"opacity\"in t&&(this.opacity=t.opacity),\"opacityscale\"in t&&(this.opacityscale=t.opacityscale),\"colorBounds\"in t&&(this.colorBounds=t.colorBounds),\"vertexColor\"in t&&(this.vertexColor=t.vertexColor?1:0),\"colormap\"in t&&this._colorMap.setPixels(this.genColormap(t.colormap,this.opacityscale));var e=t.field||t.coords&&t.coords[2]||null,r=!1;if(e||(e=this._field[2].shape[0]||this._field[2].shape[2]?this._field[2].lo(1,1).hi(this._field[2].shape[0]-2,this._field[2].shape[1]-2):this._field[2].hi(0,0)),\"field\"in t||\"coords\"in t){var i=(e.shape[0]+2)*(e.shape[1]+2);i>this._field[2].data.length&&(s.freeFloat(this._field[2].data),this._field[2].data=s.mallocFloat(n.nextPow2(i))),this._field[2]=f(this._field[2].data,[e.shape[0]+2,e.shape[1]+2]),this.padField(this._field[2],e),this.shape=e.shape.slice();for(var a=this.shape,o=0;o<2;++o)this._field[2].size>this._field[o].data.length&&(s.freeFloat(this._field[o].data),this._field[o].data=s.mallocFloat(this._field[2].size)),this._field[o]=f(this._field[o].data,[a[0]+2,a[1]+2]);if(t.coords){var l=t.coords;if(!Array.isArray(l)||3!==l.length)throw new Error(\"gl-surface: invalid coordinates for x/y\");for(o=0;o<2;++o){var u=l[o];for(y=0;y<2;++y)if(u.shape[y]!==a[y])throw new Error(\"gl-surface: coords have incorrect shape\");this.padField(this._field[o],u)}}else if(t.ticks){var c=t.ticks;if(!Array.isArray(c)||2!==c.length)throw new Error(\"gl-surface: invalid ticks\");for(o=0;o<2;++o){var p=c[o];if((Array.isArray(p)||p.length)&&(p=f(p)),p.shape[0]!==a[o])throw new Error(\"gl-surface: invalid tick length\");var d=f(p.data,a);d.stride[o]=p.stride[0],d.stride[1^o]=0,this.padField(this._field[o],d)}}else{for(o=0;o<2;++o){var v=[0,0];v[o]=1,this._field[o]=f(this._field[o].data,[a[0]+2,a[1]+2],v,0)}this._field[0].set(0,0,0);for(var y=0;y0){for(var xt=0;xt<5;++xt)$.pop();U-=1}continue t}$.push(nt[0],nt[1],ot[0],ot[1],nt[2]),U+=1}}rt.push(U)}this._contourOffsets[Q]=et,this._contourCounts[Q]=rt}var bt=s.mallocFloat($.length);for(o=0;o<$.length;++o)bt[o]=$[o];this._contourBuffer.update(bt),s.freeFloat(bt)}},L.dispose=function(){this._shader.dispose(),this._vao.dispose(),this._coordinateBuffer.dispose(),this._colorMap.dispose(),this._contourBuffer.dispose(),this._contourVAO.dispose(),this._contourShader.dispose(),this._contourPickShader.dispose(),this._dynamicBuffer.dispose(),this._dynamicVAO.dispose();for(var t=0;t<3;++t)s.freeFloat(this._field[t].data)},L.highlight=function(t){var e,r;if(!t)return this._dynamicCounts=[0,0,0],this.dyanamicLevel=[NaN,NaN,NaN],void(this.highlightLevel=[-1,-1,-1]);for(e=0;e<3;++e)this.enableHighlight[e]?this.highlightLevel[e]=t.level[e]:this.highlightLevel[e]=-1;for(r=this.snapToData?t.dataCoordinate:t.position,e=0;e<3;++e)r[e]-=this.objectOffset[e];if(this.enableDynamic[0]&&r[0]!==this.dynamicLevel[0]||this.enableDynamic[1]&&r[1]!==this.dynamicLevel[1]||this.enableDynamic[2]&&r[2]!==this.dynamicLevel[2]){for(var n=0,i=this.shape,a=s.mallocFloat(12*i[0]*i[1]),o=0;o<3;++o)if(this.enableDynamic[o]){this.dynamicLevel[o]=r[o];var l=(o+1)%3,u=(o+2)%3,c=this._field[o],f=this._field[l],p=this._field[u],d=h(c,r[o]),v=d.cells,g=d.positions;for(this._dynamicOffsets[o]=n,e=0;es||o[1]<0||o[1]>s)throw new Error(\"gl-texture2d: Invalid texture size\");var l=d(o,e.stride.slice()),u=0;\"float32\"===r?u=t.FLOAT:\"float64\"===r?(u=t.FLOAT,l=!1,r=\"float32\"):\"uint8\"===r?u=t.UNSIGNED_BYTE:(u=t.UNSIGNED_BYTE,l=!1,r=\"uint8\");var f,p,g=0;if(2===o.length)g=t.LUMINANCE,o=[o[0],o[1],1],e=n(e.data,o,[e.stride[0],e.stride[1],1],e.offset);else{if(3!==o.length)throw new Error(\"gl-texture2d: Invalid shape for texture\");if(1===o[2])g=t.ALPHA;else if(2===o[2])g=t.LUMINANCE_ALPHA;else if(3===o[2])g=t.RGB;else{if(4!==o[2])throw new Error(\"gl-texture2d: Invalid shape for pixel coords\");g=t.RGBA}}u!==t.FLOAT||t.getExtension(\"OES_texture_float\")||(u=t.UNSIGNED_BYTE,l=!1);var y=e.size;if(l)f=0===e.offset&&e.data.length===y?e.data:e.data.subarray(e.offset,e.offset+y);else{var m=[o[2],o[2]*o[0],1];p=a.malloc(y,r);var x=n(p,o,m,0);\"float32\"!==r&&\"float64\"!==r||u!==t.UNSIGNED_BYTE?i.assign(x,e):c(x,e),f=p.subarray(0,y)}var b=v(t);return t.texImage2D(t.TEXTURE_2D,0,g,o[0],o[1],0,g,u,f),l||a.free(p),new h(t,b,o[0],o[1],g,u)}(t,e)}throw new Error(\"gl-texture2d: Invalid arguments for texture2d constructor\")};var o=null,s=null,l=null;function u(t){return\"undefined\"!=typeof HTMLCanvasElement&&t instanceof HTMLCanvasElement||\"undefined\"!=typeof HTMLImageElement&&t instanceof HTMLImageElement||\"undefined\"!=typeof HTMLVideoElement&&t instanceof HTMLVideoElement||\"undefined\"!=typeof ImageData&&t instanceof ImageData}var c=function(t,e){i.muls(t,e,255)};function f(t,e,r){var n=t.gl,i=n.getParameter(n.MAX_TEXTURE_SIZE);if(e<0||e>i||r<0||r>i)throw new Error(\"gl-texture2d: Invalid texture size\");return t._shape=[e,r],t.bind(),n.texImage2D(n.TEXTURE_2D,0,t.format,e,r,0,t.format,t.type,null),t._mipLevels=[0],t}function h(t,e,r,n,i,a){this.gl=t,this.handle=e,this.format=i,this.type=a,this._shape=[r,n],this._mipLevels=[0],this._magFilter=t.NEAREST,this._minFilter=t.NEAREST,this._wrapS=t.CLAMP_TO_EDGE,this._wrapT=t.CLAMP_TO_EDGE,this._anisoSamples=1;var o=this,s=[this._wrapS,this._wrapT];Object.defineProperties(s,[{get:function(){return o._wrapS},set:function(t){return o.wrapS=t}},{get:function(){return o._wrapT},set:function(t){return o.wrapT=t}}]),this._wrapVector=s;var l=[this._shape[0],this._shape[1]];Object.defineProperties(l,[{get:function(){return o._shape[0]},set:function(t){return o.width=t}},{get:function(){return o._shape[1]},set:function(t){return o.height=t}}]),this._shapeVector=l}var p=h.prototype;function d(t,e){return 3===t.length?1===e[2]&&e[1]===t[0]*t[2]&&e[0]===t[2]:1===e[0]&&e[1]===t[0]}function v(t){var e=t.createTexture();return t.bindTexture(t.TEXTURE_2D,e),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.NEAREST),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.NEAREST),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),e}function g(t,e,r,n,i){var a=t.getParameter(t.MAX_TEXTURE_SIZE);if(e<0||e>a||r<0||r>a)throw new Error(\"gl-texture2d: Invalid texture shape\");if(i===t.FLOAT&&!t.getExtension(\"OES_texture_float\"))throw new Error(\"gl-texture2d: Floating point textures not supported on this platform\");var o=v(t);return t.texImage2D(t.TEXTURE_2D,0,n,e,r,0,n,i,null),new h(t,o,e,r,n,i)}Object.defineProperties(p,{minFilter:{get:function(){return this._minFilter},set:function(t){this.bind();var e=this.gl;if(this.type===e.FLOAT&&o.indexOf(t)>=0&&(e.getExtension(\"OES_texture_float_linear\")||(t=e.NEAREST)),s.indexOf(t)<0)throw new Error(\"gl-texture2d: Unknown filter mode \"+t);return e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,t),this._minFilter=t}},magFilter:{get:function(){return this._magFilter},set:function(t){this.bind();var e=this.gl;if(this.type===e.FLOAT&&o.indexOf(t)>=0&&(e.getExtension(\"OES_texture_float_linear\")||(t=e.NEAREST)),s.indexOf(t)<0)throw new Error(\"gl-texture2d: Unknown filter mode \"+t);return e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,t),this._magFilter=t}},mipSamples:{get:function(){return this._anisoSamples},set:function(t){var e=this._anisoSamples;if(this._anisoSamples=0|Math.max(t,1),e!==this._anisoSamples){var r=this.gl.getExtension(\"EXT_texture_filter_anisotropic\");r&&this.gl.texParameterf(this.gl.TEXTURE_2D,r.TEXTURE_MAX_ANISOTROPY_EXT,this._anisoSamples)}return this._anisoSamples}},wrapS:{get:function(){return this._wrapS},set:function(t){if(this.bind(),l.indexOf(t)<0)throw new Error(\"gl-texture2d: Unknown wrap mode \"+t);return this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_WRAP_S,t),this._wrapS=t}},wrapT:{get:function(){return this._wrapT},set:function(t){if(this.bind(),l.indexOf(t)<0)throw new Error(\"gl-texture2d: Unknown wrap mode \"+t);return this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_WRAP_T,t),this._wrapT=t}},wrap:{get:function(){return this._wrapVector},set:function(t){if(Array.isArray(t)||(t=[t,t]),2!==t.length)throw new Error(\"gl-texture2d: Must specify wrap mode for rows and columns\");for(var e=0;e<2;++e)if(l.indexOf(t[e])<0)throw new Error(\"gl-texture2d: Unknown wrap mode \"+t);this._wrapS=t[0],this._wrapT=t[1];var r=this.gl;return this.bind(),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_S,this._wrapS),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_T,this._wrapT),t}},shape:{get:function(){return this._shapeVector},set:function(t){if(Array.isArray(t)){if(2!==t.length)throw new Error(\"gl-texture2d: Invalid texture shape\")}else t=[0|t,0|t];return f(this,0|t[0],0|t[1]),[0|t[0],0|t[1]]}},width:{get:function(){return this._shape[0]},set:function(t){return f(this,t|=0,this._shape[1]),t}},height:{get:function(){return this._shape[1]},set:function(t){return t|=0,f(this,this._shape[0],t),t}}}),p.bind=function(t){var e=this.gl;return void 0!==t&&e.activeTexture(e.TEXTURE0+(0|t)),e.bindTexture(e.TEXTURE_2D,this.handle),void 0!==t?0|t:e.getParameter(e.ACTIVE_TEXTURE)-e.TEXTURE0},p.dispose=function(){this.gl.deleteTexture(this.handle)},p.generateMipmap=function(){this.bind(),this.gl.generateMipmap(this.gl.TEXTURE_2D);for(var t=Math.min(this._shape[0],this._shape[1]),e=0;t>0;++e,t>>>=1)this._mipLevels.indexOf(e)<0&&this._mipLevels.push(e)},p.setPixels=function(t,e,r,o){var s=this.gl;this.bind(),Array.isArray(e)?(o=r,r=0|e[1],e=0|e[0]):(e=e||0,r=r||0),o=o||0;var l=u(t)?t:t.raw;if(l)this._mipLevels.indexOf(o)<0?(s.texImage2D(s.TEXTURE_2D,0,this.format,this.format,this.type,l),this._mipLevels.push(o)):s.texSubImage2D(s.TEXTURE_2D,o,e,r,this.format,this.type,l);else{if(!(t.shape&&t.stride&&t.data))throw new Error(\"gl-texture2d: Unsupported data type\");if(t.shape.length<2||e+t.shape[1]>this._shape[1]>>>o||r+t.shape[0]>this._shape[0]>>>o||e<0||r<0)throw new Error(\"gl-texture2d: Texture dimensions are out of bounds\");!function(t,e,r,o,s,l,u,f){var h=f.dtype,p=f.shape.slice();if(p.length<2||p.length>3)throw new Error(\"gl-texture2d: Invalid ndarray, must be 2d or 3d\");var v=0,g=0,y=d(p,f.stride.slice());if(\"float32\"===h?v=t.FLOAT:\"float64\"===h?(v=t.FLOAT,y=!1,h=\"float32\"):\"uint8\"===h?v=t.UNSIGNED_BYTE:(v=t.UNSIGNED_BYTE,y=!1,h=\"uint8\"),2===p.length)g=t.LUMINANCE,p=[p[0],p[1],1],f=n(f.data,p,[f.stride[0],f.stride[1],1],f.offset);else{if(3!==p.length)throw new Error(\"gl-texture2d: Invalid shape for texture\");if(1===p[2])g=t.ALPHA;else if(2===p[2])g=t.LUMINANCE_ALPHA;else if(3===p[2])g=t.RGB;else{if(4!==p[2])throw new Error(\"gl-texture2d: Invalid shape for pixel coords\");g=t.RGBA}p[2]}if(g!==t.LUMINANCE&&g!==t.ALPHA||s!==t.LUMINANCE&&s!==t.ALPHA||(g=s),g!==s)throw new Error(\"gl-texture2d: Incompatible texture format for setPixels\");var m=f.size,x=u.indexOf(o)<0;if(x&&u.push(o),v===l&&y)0===f.offset&&f.data.length===m?x?t.texImage2D(t.TEXTURE_2D,o,s,p[0],p[1],0,s,l,f.data):t.texSubImage2D(t.TEXTURE_2D,o,e,r,p[0],p[1],s,l,f.data):x?t.texImage2D(t.TEXTURE_2D,o,s,p[0],p[1],0,s,l,f.data.subarray(f.offset,f.offset+m)):t.texSubImage2D(t.TEXTURE_2D,o,e,r,p[0],p[1],s,l,f.data.subarray(f.offset,f.offset+m));else{var b;b=l===t.FLOAT?a.mallocFloat32(m):a.mallocUint8(m);var _=n(b,p,[p[2],p[2]*p[0],1]);v===t.FLOAT&&l===t.UNSIGNED_BYTE?c(_,f):i.assign(_,f),x?t.texImage2D(t.TEXTURE_2D,o,s,p[0],p[1],0,s,l,b.subarray(0,m)):t.texSubImage2D(t.TEXTURE_2D,o,e,r,p[0],p[1],s,l,b.subarray(0,m)),l===t.FLOAT?a.freeFloat32(b):a.freeUint8(b)}}(s,e,r,o,this.format,this.type,this._mipLevels,t)}}},1433:function(t){\"use strict\";t.exports=function(t,e,r){e?e.bind():t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,null);var n=0|t.getParameter(t.MAX_VERTEX_ATTRIBS);if(r){if(r.length>n)throw new Error(\"gl-vao: Too many vertex attributes\");for(var i=0;i1?0:Math.acos(s)};var n=r(2825),i=r(3536),a=r(244)},9226:function(t){t.exports=function(t,e){return t[0]=Math.ceil(e[0]),t[1]=Math.ceil(e[1]),t[2]=Math.ceil(e[2]),t}},3126:function(t){t.exports=function(t){var e=new Float32Array(3);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e}},3990:function(t){t.exports=function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t}},1091:function(t){t.exports=function(){var t=new Float32Array(3);return t[0]=0,t[1]=0,t[2]=0,t}},5911:function(t){t.exports=function(t,e,r){var n=e[0],i=e[1],a=e[2],o=r[0],s=r[1],l=r[2];return t[0]=i*l-a*s,t[1]=a*o-n*l,t[2]=n*s-i*o,t}},5455:function(t,e,r){t.exports=r(7056)},7056:function(t){t.exports=function(t,e){var r=e[0]-t[0],n=e[1]-t[1],i=e[2]-t[2];return Math.sqrt(r*r+n*n+i*i)}},4008:function(t,e,r){t.exports=r(6690)},6690:function(t){t.exports=function(t,e,r){return t[0]=e[0]/r[0],t[1]=e[1]/r[1],t[2]=e[2]/r[2],t}},244:function(t){t.exports=function(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]}},2613:function(t){t.exports=1e-6},9922:function(t,e,r){t.exports=function(t,e){var r=t[0],i=t[1],a=t[2],o=e[0],s=e[1],l=e[2];return Math.abs(r-o)<=n*Math.max(1,Math.abs(r),Math.abs(o))&&Math.abs(i-s)<=n*Math.max(1,Math.abs(i),Math.abs(s))&&Math.abs(a-l)<=n*Math.max(1,Math.abs(a),Math.abs(l))};var n=r(2613)},9265:function(t){t.exports=function(t,e){return t[0]===e[0]&&t[1]===e[1]&&t[2]===e[2]}},2681:function(t){t.exports=function(t,e){return t[0]=Math.floor(e[0]),t[1]=Math.floor(e[1]),t[2]=Math.floor(e[2]),t}},5137:function(t,e,r){t.exports=function(t,e,r,i,a,o){var s,l;for(e||(e=3),r||(r=0),l=i?Math.min(i*e+r,t.length):t.length,s=r;s0&&(a=1/Math.sqrt(a),t[0]=e[0]*a,t[1]=e[1]*a,t[2]=e[2]*a),t}},7636:function(t){t.exports=function(t,e){e=e||1;var r=2*Math.random()*Math.PI,n=2*Math.random()-1,i=Math.sqrt(1-n*n)*e;return t[0]=Math.cos(r)*i,t[1]=Math.sin(r)*i,t[2]=n*e,t}},6894:function(t){t.exports=function(t,e,r,n){var i=r[1],a=r[2],o=e[1]-i,s=e[2]-a,l=Math.sin(n),u=Math.cos(n);return t[0]=e[0],t[1]=i+o*u-s*l,t[2]=a+o*l+s*u,t}},109:function(t){t.exports=function(t,e,r,n){var i=r[0],a=r[2],o=e[0]-i,s=e[2]-a,l=Math.sin(n),u=Math.cos(n);return t[0]=i+s*l+o*u,t[1]=e[1],t[2]=a+s*u-o*l,t}},8692:function(t){t.exports=function(t,e,r,n){var i=r[0],a=r[1],o=e[0]-i,s=e[1]-a,l=Math.sin(n),u=Math.cos(n);return t[0]=i+o*u-s*l,t[1]=a+o*l+s*u,t[2]=e[2],t}},2447:function(t){t.exports=function(t,e){return t[0]=Math.round(e[0]),t[1]=Math.round(e[1]),t[2]=Math.round(e[2]),t}},6621:function(t){t.exports=function(t,e,r){return t[0]=e[0]*r,t[1]=e[1]*r,t[2]=e[2]*r,t}},8489:function(t){t.exports=function(t,e,r,n){return t[0]=e[0]+r[0]*n,t[1]=e[1]+r[1]*n,t[2]=e[2]+r[2]*n,t}},1463:function(t){t.exports=function(t,e,r,n){return t[0]=e,t[1]=r,t[2]=n,t}},6141:function(t,e,r){t.exports=r(2953)},5486:function(t,e,r){t.exports=r(3066)},2953:function(t){t.exports=function(t,e){var r=e[0]-t[0],n=e[1]-t[1],i=e[2]-t[2];return r*r+n*n+i*i}},3066:function(t){t.exports=function(t){var e=t[0],r=t[1],n=t[2];return e*e+r*r+n*n}},2229:function(t,e,r){t.exports=r(6843)},6843:function(t){t.exports=function(t,e,r){return t[0]=e[0]-r[0],t[1]=e[1]-r[1],t[2]=e[2]-r[2],t}},492:function(t){t.exports=function(t,e,r){var n=e[0],i=e[1],a=e[2];return t[0]=n*r[0]+i*r[3]+a*r[6],t[1]=n*r[1]+i*r[4]+a*r[7],t[2]=n*r[2]+i*r[5]+a*r[8],t}},5673:function(t){t.exports=function(t,e,r){var n=e[0],i=e[1],a=e[2],o=r[3]*n+r[7]*i+r[11]*a+r[15];return o=o||1,t[0]=(r[0]*n+r[4]*i+r[8]*a+r[12])/o,t[1]=(r[1]*n+r[5]*i+r[9]*a+r[13])/o,t[2]=(r[2]*n+r[6]*i+r[10]*a+r[14])/o,t}},264:function(t){t.exports=function(t,e,r){var n=e[0],i=e[1],a=e[2],o=r[0],s=r[1],l=r[2],u=r[3],c=u*n+s*a-l*i,f=u*i+l*n-o*a,h=u*a+o*i-s*n,p=-o*n-s*i-l*a;return t[0]=c*u+p*-o+f*-l-h*-s,t[1]=f*u+p*-s+h*-o-c*-l,t[2]=h*u+p*-l+c*-s-f*-o,t}},4361:function(t){t.exports=function(t,e,r){return t[0]=e[0]+r[0],t[1]=e[1]+r[1],t[2]=e[2]+r[2],t[3]=e[3]+r[3],t}},2335:function(t){t.exports=function(t){var e=new Float32Array(4);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e}},2933:function(t){t.exports=function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t}},7536:function(t){t.exports=function(){var t=new Float32Array(4);return t[0]=0,t[1]=0,t[2]=0,t[3]=0,t}},4691:function(t){t.exports=function(t,e){var r=e[0]-t[0],n=e[1]-t[1],i=e[2]-t[2],a=e[3]-t[3];return Math.sqrt(r*r+n*n+i*i+a*a)}},1373:function(t){t.exports=function(t,e,r){return t[0]=e[0]/r[0],t[1]=e[1]/r[1],t[2]=e[2]/r[2],t[3]=e[3]/r[3],t}},3750:function(t){t.exports=function(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]+t[3]*e[3]}},3390:function(t){t.exports=function(t,e,r,n){var i=new Float32Array(4);return i[0]=t,i[1]=e,i[2]=r,i[3]=n,i}},9970:function(t,e,r){t.exports={create:r(7536),clone:r(2335),fromValues:r(3390),copy:r(2933),set:r(4578),add:r(4361),subtract:r(6860),multiply:r(3576),divide:r(1373),min:r(2334),max:r(160),scale:r(9288),scaleAndAdd:r(4844),distance:r(4691),squaredDistance:r(7960),length:r(6808),squaredLength:r(483),negate:r(1498),inverse:r(4494),normalize:r(5177),dot:r(3750),lerp:r(2573),random:r(9131),transformMat4:r(5352),transformQuat:r(4041)}},4494:function(t){t.exports=function(t,e){return t[0]=1/e[0],t[1]=1/e[1],t[2]=1/e[2],t[3]=1/e[3],t}},6808:function(t){t.exports=function(t){var e=t[0],r=t[1],n=t[2],i=t[3];return Math.sqrt(e*e+r*r+n*n+i*i)}},2573:function(t){t.exports=function(t,e,r,n){var i=e[0],a=e[1],o=e[2],s=e[3];return t[0]=i+n*(r[0]-i),t[1]=a+n*(r[1]-a),t[2]=o+n*(r[2]-o),t[3]=s+n*(r[3]-s),t}},160:function(t){t.exports=function(t,e,r){return t[0]=Math.max(e[0],r[0]),t[1]=Math.max(e[1],r[1]),t[2]=Math.max(e[2],r[2]),t[3]=Math.max(e[3],r[3]),t}},2334:function(t){t.exports=function(t,e,r){return t[0]=Math.min(e[0],r[0]),t[1]=Math.min(e[1],r[1]),t[2]=Math.min(e[2],r[2]),t[3]=Math.min(e[3],r[3]),t}},3576:function(t){t.exports=function(t,e,r){return t[0]=e[0]*r[0],t[1]=e[1]*r[1],t[2]=e[2]*r[2],t[3]=e[3]*r[3],t}},1498:function(t){t.exports=function(t,e){return t[0]=-e[0],t[1]=-e[1],t[2]=-e[2],t[3]=-e[3],t}},5177:function(t){t.exports=function(t,e){var r=e[0],n=e[1],i=e[2],a=e[3],o=r*r+n*n+i*i+a*a;return o>0&&(o=1/Math.sqrt(o),t[0]=r*o,t[1]=n*o,t[2]=i*o,t[3]=a*o),t}},9131:function(t,e,r){var n=r(5177),i=r(9288);t.exports=function(t,e){return e=e||1,t[0]=Math.random(),t[1]=Math.random(),t[2]=Math.random(),t[3]=Math.random(),n(t,t),i(t,t,e),t}},9288:function(t){t.exports=function(t,e,r){return t[0]=e[0]*r,t[1]=e[1]*r,t[2]=e[2]*r,t[3]=e[3]*r,t}},4844:function(t){t.exports=function(t,e,r,n){return t[0]=e[0]+r[0]*n,t[1]=e[1]+r[1]*n,t[2]=e[2]+r[2]*n,t[3]=e[3]+r[3]*n,t}},4578:function(t){t.exports=function(t,e,r,n,i){return t[0]=e,t[1]=r,t[2]=n,t[3]=i,t}},7960:function(t){t.exports=function(t,e){var r=e[0]-t[0],n=e[1]-t[1],i=e[2]-t[2],a=e[3]-t[3];return r*r+n*n+i*i+a*a}},483:function(t){t.exports=function(t){var e=t[0],r=t[1],n=t[2],i=t[3];return e*e+r*r+n*n+i*i}},6860:function(t){t.exports=function(t,e,r){return t[0]=e[0]-r[0],t[1]=e[1]-r[1],t[2]=e[2]-r[2],t[3]=e[3]-r[3],t}},5352:function(t){t.exports=function(t,e,r){var n=e[0],i=e[1],a=e[2],o=e[3];return t[0]=r[0]*n+r[4]*i+r[8]*a+r[12]*o,t[1]=r[1]*n+r[5]*i+r[9]*a+r[13]*o,t[2]=r[2]*n+r[6]*i+r[10]*a+r[14]*o,t[3]=r[3]*n+r[7]*i+r[11]*a+r[15]*o,t}},4041:function(t){t.exports=function(t,e,r){var n=e[0],i=e[1],a=e[2],o=r[0],s=r[1],l=r[2],u=r[3],c=u*n+s*a-l*i,f=u*i+l*n-o*a,h=u*a+o*i-s*n,p=-o*n-s*i-l*a;return t[0]=c*u+p*-o+f*-l-h*-s,t[1]=f*u+p*-s+h*-o-c*-l,t[2]=h*u+p*-l+c*-s-f*-o,t[3]=e[3],t}},1848:function(t,e,r){var n=r(4905),i=r(6468);t.exports=function(t){for(var e=Array.isArray(t)?t:n(t),r=0;r0)continue;r=t.slice(0,1).join(\"\")}return N(r),P+=r.length,(S=S.slice(r.length)).length}}function W(){return/[^a-fA-F0-9]/.test(e)?(N(S.join(\"\")),M=l,k):(S.push(e),r=e,k+1)}function Y(){return\".\"===e||/[eE]/.test(e)?(S.push(e),M=v,r=e,k+1):\"x\"===e&&1===S.length&&\"0\"===S[0]?(M=_,S.push(e),r=e,k+1):/[^\\d]/.test(e)?(N(S.join(\"\")),M=l,k):(S.push(e),r=e,k+1)}function X(){return\"f\"===e&&(S.push(e),r=e,k+=1),/[eE]/.test(e)?(S.push(e),r=e,k+1):(\"-\"!==e&&\"+\"!==e||!/[eE]/.test(r))&&/[^\\d]/.test(e)?(N(S.join(\"\")),M=l,k):(S.push(e),r=e,k+1)}function Z(){if(/[^\\d\\w_]/.test(e)){var t=S.join(\"\");return M=B[t]?m:F[t]?y:g,N(S.join(\"\")),M=l,k}return S.push(e),r=e,k+1}};var n=r(620),i=r(7827),a=r(6852),o=r(7932),s=r(3508),l=999,u=9999,c=0,f=1,h=2,p=3,d=4,v=5,g=6,y=7,m=8,x=9,b=10,_=11,w=[\"block-comment\",\"line-comment\",\"preprocessor\",\"operator\",\"integer\",\"float\",\"ident\",\"builtin\",\"keyword\",\"whitespace\",\"eof\",\"integer\"]},3508:function(t,e,r){var n=r(6852);n=n.slice().filter((function(t){return!/^(gl\\_|texture)/.test(t)})),t.exports=n.concat([\"gl_VertexID\",\"gl_InstanceID\",\"gl_Position\",\"gl_PointSize\",\"gl_FragCoord\",\"gl_FrontFacing\",\"gl_FragDepth\",\"gl_PointCoord\",\"gl_MaxVertexAttribs\",\"gl_MaxVertexUniformVectors\",\"gl_MaxVertexOutputVectors\",\"gl_MaxFragmentInputVectors\",\"gl_MaxVertexTextureImageUnits\",\"gl_MaxCombinedTextureImageUnits\",\"gl_MaxTextureImageUnits\",\"gl_MaxFragmentUniformVectors\",\"gl_MaxDrawBuffers\",\"gl_MinProgramTexelOffset\",\"gl_MaxProgramTexelOffset\",\"gl_DepthRangeParameters\",\"gl_DepthRange\",\"trunc\",\"round\",\"roundEven\",\"isnan\",\"isinf\",\"floatBitsToInt\",\"floatBitsToUint\",\"intBitsToFloat\",\"uintBitsToFloat\",\"packSnorm2x16\",\"unpackSnorm2x16\",\"packUnorm2x16\",\"unpackUnorm2x16\",\"packHalf2x16\",\"unpackHalf2x16\",\"outerProduct\",\"transpose\",\"determinant\",\"inverse\",\"texture\",\"textureSize\",\"textureProj\",\"textureLod\",\"textureOffset\",\"texelFetch\",\"texelFetchOffset\",\"textureProjOffset\",\"textureLodOffset\",\"textureProjLod\",\"textureProjLodOffset\",\"textureGrad\",\"textureGradOffset\",\"textureProjGrad\",\"textureProjGradOffset\"])},6852:function(t){t.exports=[\"abs\",\"acos\",\"all\",\"any\",\"asin\",\"atan\",\"ceil\",\"clamp\",\"cos\",\"cross\",\"dFdx\",\"dFdy\",\"degrees\",\"distance\",\"dot\",\"equal\",\"exp\",\"exp2\",\"faceforward\",\"floor\",\"fract\",\"gl_BackColor\",\"gl_BackLightModelProduct\",\"gl_BackLightProduct\",\"gl_BackMaterial\",\"gl_BackSecondaryColor\",\"gl_ClipPlane\",\"gl_ClipVertex\",\"gl_Color\",\"gl_DepthRange\",\"gl_DepthRangeParameters\",\"gl_EyePlaneQ\",\"gl_EyePlaneR\",\"gl_EyePlaneS\",\"gl_EyePlaneT\",\"gl_Fog\",\"gl_FogCoord\",\"gl_FogFragCoord\",\"gl_FogParameters\",\"gl_FragColor\",\"gl_FragCoord\",\"gl_FragData\",\"gl_FragDepth\",\"gl_FragDepthEXT\",\"gl_FrontColor\",\"gl_FrontFacing\",\"gl_FrontLightModelProduct\",\"gl_FrontLightProduct\",\"gl_FrontMaterial\",\"gl_FrontSecondaryColor\",\"gl_LightModel\",\"gl_LightModelParameters\",\"gl_LightModelProducts\",\"gl_LightProducts\",\"gl_LightSource\",\"gl_LightSourceParameters\",\"gl_MaterialParameters\",\"gl_MaxClipPlanes\",\"gl_MaxCombinedTextureImageUnits\",\"gl_MaxDrawBuffers\",\"gl_MaxFragmentUniformComponents\",\"gl_MaxLights\",\"gl_MaxTextureCoords\",\"gl_MaxTextureImageUnits\",\"gl_MaxTextureUnits\",\"gl_MaxVaryingFloats\",\"gl_MaxVertexAttribs\",\"gl_MaxVertexTextureImageUnits\",\"gl_MaxVertexUniformComponents\",\"gl_ModelViewMatrix\",\"gl_ModelViewMatrixInverse\",\"gl_ModelViewMatrixInverseTranspose\",\"gl_ModelViewMatrixTranspose\",\"gl_ModelViewProjectionMatrix\",\"gl_ModelViewProjectionMatrixInverse\",\"gl_ModelViewProjectionMatrixInverseTranspose\",\"gl_ModelViewProjectionMatrixTranspose\",\"gl_MultiTexCoord0\",\"gl_MultiTexCoord1\",\"gl_MultiTexCoord2\",\"gl_MultiTexCoord3\",\"gl_MultiTexCoord4\",\"gl_MultiTexCoord5\",\"gl_MultiTexCoord6\",\"gl_MultiTexCoord7\",\"gl_Normal\",\"gl_NormalMatrix\",\"gl_NormalScale\",\"gl_ObjectPlaneQ\",\"gl_ObjectPlaneR\",\"gl_ObjectPlaneS\",\"gl_ObjectPlaneT\",\"gl_Point\",\"gl_PointCoord\",\"gl_PointParameters\",\"gl_PointSize\",\"gl_Position\",\"gl_ProjectionMatrix\",\"gl_ProjectionMatrixInverse\",\"gl_ProjectionMatrixInverseTranspose\",\"gl_ProjectionMatrixTranspose\",\"gl_SecondaryColor\",\"gl_TexCoord\",\"gl_TextureEnvColor\",\"gl_TextureMatrix\",\"gl_TextureMatrixInverse\",\"gl_TextureMatrixInverseTranspose\",\"gl_TextureMatrixTranspose\",\"gl_Vertex\",\"greaterThan\",\"greaterThanEqual\",\"inversesqrt\",\"length\",\"lessThan\",\"lessThanEqual\",\"log\",\"log2\",\"matrixCompMult\",\"max\",\"min\",\"mix\",\"mod\",\"normalize\",\"not\",\"notEqual\",\"pow\",\"radians\",\"reflect\",\"refract\",\"sign\",\"sin\",\"smoothstep\",\"sqrt\",\"step\",\"tan\",\"texture2D\",\"texture2DLod\",\"texture2DProj\",\"texture2DProjLod\",\"textureCube\",\"textureCubeLod\",\"texture2DLodEXT\",\"texture2DProjLodEXT\",\"textureCubeLodEXT\",\"texture2DGradEXT\",\"texture2DProjGradEXT\",\"textureCubeGradEXT\"]},7932:function(t,e,r){var n=r(620);t.exports=n.slice().concat([\"layout\",\"centroid\",\"smooth\",\"case\",\"mat2x2\",\"mat2x3\",\"mat2x4\",\"mat3x2\",\"mat3x3\",\"mat3x4\",\"mat4x2\",\"mat4x3\",\"mat4x4\",\"uvec2\",\"uvec3\",\"uvec4\",\"samplerCubeShadow\",\"sampler2DArray\",\"sampler2DArrayShadow\",\"isampler2D\",\"isampler3D\",\"isamplerCube\",\"isampler2DArray\",\"usampler2D\",\"usampler3D\",\"usamplerCube\",\"usampler2DArray\",\"coherent\",\"restrict\",\"readonly\",\"writeonly\",\"resource\",\"atomic_uint\",\"noperspective\",\"patch\",\"sample\",\"subroutine\",\"common\",\"partition\",\"active\",\"filter\",\"image1D\",\"image2D\",\"image3D\",\"imageCube\",\"iimage1D\",\"iimage2D\",\"iimage3D\",\"iimageCube\",\"uimage1D\",\"uimage2D\",\"uimage3D\",\"uimageCube\",\"image1DArray\",\"image2DArray\",\"iimage1DArray\",\"iimage2DArray\",\"uimage1DArray\",\"uimage2DArray\",\"image1DShadow\",\"image2DShadow\",\"image1DArrayShadow\",\"image2DArrayShadow\",\"imageBuffer\",\"iimageBuffer\",\"uimageBuffer\",\"sampler1DArray\",\"sampler1DArrayShadow\",\"isampler1D\",\"isampler1DArray\",\"usampler1D\",\"usampler1DArray\",\"isampler2DRect\",\"usampler2DRect\",\"samplerBuffer\",\"isamplerBuffer\",\"usamplerBuffer\",\"sampler2DMS\",\"isampler2DMS\",\"usampler2DMS\",\"sampler2DMSArray\",\"isampler2DMSArray\",\"usampler2DMSArray\"])},620:function(t){t.exports=[\"precision\",\"highp\",\"mediump\",\"lowp\",\"attribute\",\"const\",\"uniform\",\"varying\",\"break\",\"continue\",\"do\",\"for\",\"while\",\"if\",\"else\",\"in\",\"out\",\"inout\",\"float\",\"int\",\"uint\",\"void\",\"bool\",\"true\",\"false\",\"discard\",\"return\",\"mat2\",\"mat3\",\"mat4\",\"vec2\",\"vec3\",\"vec4\",\"ivec2\",\"ivec3\",\"ivec4\",\"bvec2\",\"bvec3\",\"bvec4\",\"sampler1D\",\"sampler2D\",\"sampler3D\",\"samplerCube\",\"sampler1DShadow\",\"sampler2DShadow\",\"struct\",\"asm\",\"class\",\"union\",\"enum\",\"typedef\",\"template\",\"this\",\"packed\",\"goto\",\"switch\",\"default\",\"inline\",\"noinline\",\"volatile\",\"public\",\"static\",\"extern\",\"external\",\"interface\",\"long\",\"short\",\"double\",\"half\",\"fixed\",\"unsigned\",\"input\",\"output\",\"hvec2\",\"hvec3\",\"hvec4\",\"dvec2\",\"dvec3\",\"dvec4\",\"fvec2\",\"fvec3\",\"fvec4\",\"sampler2DRect\",\"sampler3DRect\",\"sampler2DRectShadow\",\"sizeof\",\"cast\",\"namespace\",\"using\"]},7827:function(t){t.exports=[\"<<=\",\">>=\",\"++\",\"--\",\"<<\",\">>\",\"<=\",\">=\",\"==\",\"!=\",\"&&\",\"||\",\"+=\",\"-=\",\"*=\",\"/=\",\"%=\",\"&=\",\"^^\",\"^=\",\"|=\",\"(\",\")\",\"[\",\"]\",\".\",\"!\",\"~\",\"*\",\"/\",\"%\",\"+\",\"-\",\"<\",\">\",\"&\",\"^\",\"|\",\"?\",\":\",\"=\",\",\",\";\",\"{\",\"}\"]},4905:function(t,e,r){var n=r(5874);t.exports=function(t,e){var r=n(e),i=[];return(i=i.concat(r(t))).concat(r(null))}},3236:function(t){t.exports=function(t){\"string\"==typeof t&&(t=[t]);for(var e=[].slice.call(arguments,1),r=[],n=0;n>1,c=-7,f=r?i-1:0,h=r?-1:1,p=t[e+f];for(f+=h,a=p&(1<<-c)-1,p>>=-c,c+=s;c>0;a=256*a+t[e+f],f+=h,c-=8);for(o=a&(1<<-c)-1,a>>=-c,c+=n;c>0;o=256*o+t[e+f],f+=h,c-=8);if(0===a)a=1-u;else{if(a===l)return o?NaN:1/0*(p?-1:1);o+=Math.pow(2,n),a-=u}return(p?-1:1)*o*Math.pow(2,a-n)},e.write=function(t,e,r,n,i,a){var o,s,l,u=8*a-i-1,c=(1<>1,h=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,p=n?0:a-1,d=n?1:-1,v=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(s=isNaN(e)?1:0,o=c):(o=Math.floor(Math.log(e)/Math.LN2),e*(l=Math.pow(2,-o))<1&&(o--,l*=2),(e+=o+f>=1?h/l:h*Math.pow(2,1-f))*l>=2&&(o++,l/=2),o+f>=c?(s=0,o=c):o+f>=1?(s=(e*l-1)*Math.pow(2,i),o+=f):(s=e*Math.pow(2,f-1)*Math.pow(2,i),o=0));i>=8;t[r+p]=255&s,p+=d,s/=256,i-=8);for(o=o<0;t[r+p]=255&o,p+=d,o/=256,u-=8);t[r+p-d]|=128*v}},8954:function(t,e,r){\"use strict\";t.exports=function(t,e){var r=t.length;if(0===r)throw new Error(\"Must have at least d+1 points\");var i=t[0].length;if(r<=i)throw new Error(\"Must input at least d+1 points\");var o=t.slice(0,i+1),s=n.apply(void 0,o);if(0===s)throw new Error(\"Input not in general position\");for(var l=new Array(i+1),c=0;c<=i;++c)l[c]=c;s<0&&(l[0]=1,l[1]=0);var f=new a(l,new Array(i+1),!1),h=f.adjacent,p=new Array(i+2);for(c=0;c<=i;++c){for(var d=l.slice(),v=0;v<=i;++v)v===c&&(d[v]=-1);var g=d[0];d[0]=d[1],d[1]=g;var y=new a(d,new Array(i+1),!0);h[c]=y,p[c]=y}for(p[i+1]=f,c=0;c<=i;++c){d=h[c].vertices;var m=h[c].adjacent;for(v=0;v<=i;++v){var x=d[v];if(x<0)m[v]=f;else for(var b=0;b<=i;++b)h[b].vertices.indexOf(x)<0&&(m[v]=h[b])}}var _=new u(i,o,p),w=!!e;for(c=i+1;c0;)for(var s=(t=o.pop()).adjacent,l=0;l<=r;++l){var u=s[l];if(u.boundary&&!(u.lastVisited<=-n)){for(var c=u.vertices,f=0;f<=r;++f){var h=c[f];i[f]=h<0?e:a[h]}var p=this.orient();if(p>0)return u;u.lastVisited=-n,0===p&&o.push(u)}}return null},c.walk=function(t,e){var r=this.vertices.length-1,n=this.dimension,i=this.vertices,a=this.tuple,o=e?this.interior.length*Math.random()|0:this.interior.length-1,s=this.interior[o];t:for(;!s.boundary;){for(var l=s.vertices,u=s.adjacent,c=0;c<=n;++c)a[c]=i[l[c]];for(s.lastVisited=r,c=0;c<=n;++c){var f=u[c];if(!(f.lastVisited>=r)){var h=a[c];a[c]=t;var p=this.orient();if(a[c]=h,p<0){s=f;continue t}f.boundary?f.lastVisited=-r:f.lastVisited=r}}return}return s},c.addPeaks=function(t,e){var r=this.vertices.length-1,n=this.dimension,i=this.vertices,l=this.tuple,u=this.interior,c=this.simplices,f=[e];e.lastVisited=r,e.vertices[e.vertices.indexOf(-1)]=r,e.boundary=!1,u.push(e);for(var h=[];f.length>0;){var p=(e=f.pop()).vertices,d=e.adjacent,v=p.indexOf(r);if(!(v<0))for(var g=0;g<=n;++g)if(g!==v){var y=d[g];if(y.boundary&&!(y.lastVisited>=r)){var m=y.vertices;if(y.lastVisited!==-r){for(var x=0,b=0;b<=n;++b)m[b]<0?(x=b,l[b]=t):l[b]=i[m[b]];if(this.orient()>0){m[x]=r,y.boundary=!1,u.push(y),f.push(y),y.lastVisited=r;continue}y.lastVisited=-r}var _=y.adjacent,w=p.slice(),T=d.slice(),k=new a(w,T,!0);c.push(k);var A=_.indexOf(e);if(!(A<0))for(_[A]=k,T[v]=y,w[g]=-1,T[g]=e,d[g]=k,k.flip(),b=0;b<=n;++b){var M=w[b];if(!(M<0||M===r)){for(var S=new Array(n-1),E=0,L=0;L<=n;++L){var C=w[L];C<0||L===b||(S[E++]=C)}h.push(new o(S,k,b))}}}}}for(h.sort(s),g=0;g+1=0?o[l++]=s[c]:u=1&c;if(u===(1&t)){var f=o[0];o[0]=o[1],o[1]=f}e.push(o)}}return e}},3352:function(t,e,r){\"use strict\";var n=r(2478);function i(t,e,r,n,i){this.mid=t,this.left=e,this.right=r,this.leftPoints=n,this.rightPoints=i,this.count=(e?e.count:0)+(r?r.count:0)+n.length}t.exports=function(t){return t&&0!==t.length?new y(g(t)):new y(null)};var a=i.prototype;function o(t,e){t.mid=e.mid,t.left=e.left,t.right=e.right,t.leftPoints=e.leftPoints,t.rightPoints=e.rightPoints,t.count=e.count}function s(t,e){var r=g(e);t.mid=r.mid,t.left=r.left,t.right=r.right,t.leftPoints=r.leftPoints,t.rightPoints=r.rightPoints,t.count=r.count}function l(t,e){var r=t.intervals([]);r.push(e),s(t,r)}function u(t,e){var r=t.intervals([]),n=r.indexOf(e);return n<0?0:(r.splice(n,1),s(t,r),1)}function c(t,e,r){for(var n=0;n=0&&t[n][1]>=e;--n){var i=r(t[n]);if(i)return i}}function h(t,e){for(var r=0;r>1],a=[],o=[],s=[];for(r=0;r3*(e+1)?l(this,t):this.left.insert(t):this.left=g([t]);else if(t[0]>this.mid)this.right?4*(this.right.count+1)>3*(e+1)?l(this,t):this.right.insert(t):this.right=g([t]);else{var r=n.ge(this.leftPoints,t,d),i=n.ge(this.rightPoints,t,v);this.leftPoints.splice(r,0,t),this.rightPoints.splice(i,0,t)}},a.remove=function(t){var e=this.count-this.leftPoints;if(t[1]3*(e-1)?u(this,t):2===(s=this.left.remove(t))?(this.left=null,this.count-=1,1):(1===s&&(this.count-=1),s):0;if(t[0]>this.mid)return this.right?4*(this.left?this.left.count:0)>3*(e-1)?u(this,t):2===(s=this.right.remove(t))?(this.right=null,this.count-=1,1):(1===s&&(this.count-=1),s):0;if(1===this.count)return this.leftPoints[0]===t?2:0;if(1===this.leftPoints.length&&this.leftPoints[0]===t){if(this.left&&this.right){for(var r=this,i=this.left;i.right;)r=i,i=i.right;if(r===this)i.right=this.right;else{var a=this.left,s=this.right;r.count-=i.count,r.right=i.left,i.left=a,i.right=s}o(this,i),this.count=(this.left?this.left.count:0)+(this.right?this.right.count:0)+this.leftPoints.length}else this.left?o(this,this.left):o(this,this.right);return 1}for(a=n.ge(this.leftPoints,t,d);athis.mid?this.right&&(r=this.right.queryPoint(t,e))?r:f(this.rightPoints,t,e):h(this.leftPoints,e);var r},a.queryInterval=function(t,e,r){var n;return tthis.mid&&this.right&&(n=this.right.queryInterval(t,e,r))?n:ethis.mid?f(this.rightPoints,t,r):h(this.leftPoints,r)};var m=y.prototype;m.insert=function(t){this.root?this.root.insert(t):this.root=new i(t[0],null,null,[t],[t])},m.remove=function(t){if(this.root){var e=this.root.remove(t);return 2===e&&(this.root=null),0!==e}return!1},m.queryPoint=function(t,e){if(this.root)return this.root.queryPoint(t,e)},m.queryInterval=function(t,e,r){if(t<=e&&this.root)return this.root.queryInterval(t,e,r)},Object.defineProperty(m,\"count\",{get:function(){return this.root?this.root.count:0}}),Object.defineProperty(m,\"intervals\",{get:function(){return this.root?this.root.intervals([]):[]}})},7762:function(t){\"use strict\";t.exports=function(t){for(var e=new Array(t),r=0;r13)&&32!==e&&133!==e&&160!==e&&5760!==e&&6158!==e&&(e<8192||e>8205)&&8232!==e&&8233!==e&&8239!==e&&8287!==e&&8288!==e&&12288!==e&&65279!==e)return!1;return!0}},395:function(t){t.exports=function(t,e,r){return t*(1-r)+e*r}},2652:function(t,e,r){var n=r(4335),i=r(6864),a=r(1903),o=r(9921),s=r(7608),l=r(5665),u={length:r(1387),normalize:r(3536),dot:r(244),cross:r(5911)},c=i(),f=i(),h=[0,0,0,0],p=[[0,0,0],[0,0,0],[0,0,0]],d=[0,0,0];function v(t,e,r,n,i){t[0]=e[0]*n+r[0]*i,t[1]=e[1]*n+r[1]*i,t[2]=e[2]*n+r[2]*i}t.exports=function(t,e,r,i,g,y){if(e||(e=[0,0,0]),r||(r=[0,0,0]),i||(i=[0,0,0]),g||(g=[0,0,0,1]),y||(y=[0,0,0,1]),!n(c,t))return!1;if(a(f,c),f[3]=0,f[7]=0,f[11]=0,f[15]=1,Math.abs(o(f)<1e-8))return!1;var m,x,b,_,w,T,k,A=c[3],M=c[7],S=c[11],E=c[12],L=c[13],C=c[14],P=c[15];if(0!==A||0!==M||0!==S){if(h[0]=A,h[1]=M,h[2]=S,h[3]=P,!s(f,f))return!1;l(f,f),m=g,b=f,_=(x=h)[0],w=x[1],T=x[2],k=x[3],m[0]=b[0]*_+b[4]*w+b[8]*T+b[12]*k,m[1]=b[1]*_+b[5]*w+b[9]*T+b[13]*k,m[2]=b[2]*_+b[6]*w+b[10]*T+b[14]*k,m[3]=b[3]*_+b[7]*w+b[11]*T+b[15]*k}else g[0]=g[1]=g[2]=0,g[3]=1;if(e[0]=E,e[1]=L,e[2]=C,function(t,e){t[0][0]=e[0],t[0][1]=e[1],t[0][2]=e[2],t[1][0]=e[4],t[1][1]=e[5],t[1][2]=e[6],t[2][0]=e[8],t[2][1]=e[9],t[2][2]=e[10]}(p,c),r[0]=u.length(p[0]),u.normalize(p[0],p[0]),i[0]=u.dot(p[0],p[1]),v(p[1],p[1],p[0],1,-i[0]),r[1]=u.length(p[1]),u.normalize(p[1],p[1]),i[0]/=r[1],i[1]=u.dot(p[0],p[2]),v(p[2],p[2],p[0],1,-i[1]),i[2]=u.dot(p[1],p[2]),v(p[2],p[2],p[1],1,-i[2]),r[2]=u.length(p[2]),u.normalize(p[2],p[2]),i[1]/=r[2],i[2]/=r[2],u.cross(d,p[1],p[2]),u.dot(p[0],d)<0)for(var O=0;O<3;O++)r[O]*=-1,p[O][0]*=-1,p[O][1]*=-1,p[O][2]*=-1;return y[0]=.5*Math.sqrt(Math.max(1+p[0][0]-p[1][1]-p[2][2],0)),y[1]=.5*Math.sqrt(Math.max(1-p[0][0]+p[1][1]-p[2][2],0)),y[2]=.5*Math.sqrt(Math.max(1-p[0][0]-p[1][1]+p[2][2],0)),y[3]=.5*Math.sqrt(Math.max(1+p[0][0]+p[1][1]+p[2][2],0)),p[2][1]>p[1][2]&&(y[0]=-y[0]),p[0][2]>p[2][0]&&(y[1]=-y[1]),p[1][0]>p[0][1]&&(y[2]=-y[2]),!0}},4335:function(t){t.exports=function(t,e){var r=e[15];if(0===r)return!1;for(var n=1/r,i=0;i<16;i++)t[i]=e[i]*n;return!0}},7442:function(t,e,r){var n=r(6658),i=r(7182),a=r(2652),o=r(9921),s=r(8648),l=f(),u=f(),c=f();function f(){return{translate:h(),scale:h(1),skew:h(),perspective:[0,0,0,1],quaternion:[0,0,0,1]}}function h(t){return[t||0,t||0,t||0]}t.exports=function(t,e,r,f){if(0===o(e)||0===o(r))return!1;var h=a(e,l.translate,l.scale,l.skew,l.perspective,l.quaternion),p=a(r,u.translate,u.scale,u.skew,u.perspective,u.quaternion);return!(!h||!p||(n(c.translate,l.translate,u.translate,f),n(c.skew,l.skew,u.skew,f),n(c.scale,l.scale,u.scale,f),n(c.perspective,l.perspective,u.perspective,f),s(c.quaternion,l.quaternion,u.quaternion,f),i(t,c.translate,c.scale,c.skew,c.perspective,c.quaternion),0))}},7182:function(t,e,r){var n={identity:r(7894),translate:r(7656),multiply:r(6760),create:r(6864),scale:r(2504),fromRotationTranslation:r(6743)},i=(n.create(),n.create());t.exports=function(t,e,r,a,o,s){return n.identity(t),n.fromRotationTranslation(t,s,e),t[3]=o[0],t[7]=o[1],t[11]=o[2],t[15]=o[3],n.identity(i),0!==a[2]&&(i[9]=a[2],n.multiply(t,t,i)),0!==a[1]&&(i[9]=0,i[8]=a[1],n.multiply(t,t,i)),0!==a[0]&&(i[8]=0,i[4]=a[0],n.multiply(t,t,i)),n.scale(t,t,r),t}},4192:function(t,e,r){\"use strict\";var n=r(2478),i=r(7442),a=r(7608),o=r(5567),s=r(2408),l=r(7089),u=r(6582),c=r(7656),f=(r(2504),r(3536)),h=[0,0,0];function p(t){this._components=t.slice(),this._time=[0],this.prevMatrix=t.slice(),this.nextMatrix=t.slice(),this.computedMatrix=t.slice(),this.computedInverse=t.slice(),this.computedEye=[0,0,0],this.computedUp=[0,0,0],this.computedCenter=[0,0,0],this.computedRadius=[0],this._limits=[-1/0,1/0]}t.exports=function(t){return new p((t=t||{}).matrix||[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1])};var d=p.prototype;d.recalcMatrix=function(t){var e=this._time,r=n.le(e,t),o=this.computedMatrix;if(!(r<0)){var s=this._components;if(r===e.length-1)for(var l=16*r,u=0;u<16;++u)o[u]=s[l++];else{var c=e[r+1]-e[r],h=(l=16*r,this.prevMatrix),p=!0;for(u=0;u<16;++u)h[u]=s[l++];var d=this.nextMatrix;for(u=0;u<16;++u)d[u]=s[l++],p=p&&h[u]===d[u];if(c<1e-6||p)for(u=0;u<16;++u)o[u]=h[u];else i(o,h,d,(t-e[r])/c)}var v=this.computedUp;v[0]=o[1],v[1]=o[5],v[2]=o[9],f(v,v);var g=this.computedInverse;a(g,o);var y=this.computedEye,m=g[15];y[0]=g[12]/m,y[1]=g[13]/m,y[2]=g[14]/m;var x=this.computedCenter,b=Math.exp(this.computedRadius[0]);for(u=0;u<3;++u)x[u]=y[u]-o[2+4*u]*b}},d.idle=function(t){if(!(t1&&n(t[o[c-2]],t[o[c-1]],u)<=0;)c-=1,o.pop();for(o.push(l),c=s.length;c>1&&n(t[s[c-2]],t[s[c-1]],u)>=0;)c-=1,s.pop();s.push(l)}r=new Array(s.length+o.length-2);for(var f=0,h=(i=0,o.length);i0;--p)r[f++]=s[p];return r};var n=r(3250)[3]},351:function(t,e,r){\"use strict\";t.exports=function(t,e){e||(e=t,t=window);var r=0,i=0,a=0,o={shift:!1,alt:!1,control:!1,meta:!1},s=!1;function l(t){var e=!1;return\"altKey\"in t&&(e=e||t.altKey!==o.alt,o.alt=!!t.altKey),\"shiftKey\"in t&&(e=e||t.shiftKey!==o.shift,o.shift=!!t.shiftKey),\"ctrlKey\"in t&&(e=e||t.ctrlKey!==o.control,o.control=!!t.ctrlKey),\"metaKey\"in t&&(e=e||t.metaKey!==o.meta,o.meta=!!t.metaKey),e}function u(t,s){var u=n.x(s),c=n.y(s);\"buttons\"in s&&(t=0|s.buttons),(t!==r||u!==i||c!==a||l(s))&&(r=0|t,i=u||0,a=c||0,e&&e(r,i,a,o))}function c(t){u(0,t)}function f(){(r||i||a||o.shift||o.alt||o.meta||o.control)&&(i=a=0,r=0,o.shift=o.alt=o.control=o.meta=!1,e&&e(0,0,0,o))}function h(t){l(t)&&e&&e(r,i,a,o)}function p(t){0===n.buttons(t)?u(0,t):u(r,t)}function d(t){u(r|n.buttons(t),t)}function v(t){u(r&~n.buttons(t),t)}function g(){s||(s=!0,t.addEventListener(\"mousemove\",p),t.addEventListener(\"mousedown\",d),t.addEventListener(\"mouseup\",v),t.addEventListener(\"mouseleave\",c),t.addEventListener(\"mouseenter\",c),t.addEventListener(\"mouseout\",c),t.addEventListener(\"mouseover\",c),t.addEventListener(\"blur\",f),t.addEventListener(\"keyup\",h),t.addEventListener(\"keydown\",h),t.addEventListener(\"keypress\",h),t!==window&&(window.addEventListener(\"blur\",f),window.addEventListener(\"keyup\",h),window.addEventListener(\"keydown\",h),window.addEventListener(\"keypress\",h)))}g();var y={element:t};return Object.defineProperties(y,{enabled:{get:function(){return s},set:function(e){e?g():s&&(s=!1,t.removeEventListener(\"mousemove\",p),t.removeEventListener(\"mousedown\",d),t.removeEventListener(\"mouseup\",v),t.removeEventListener(\"mouseleave\",c),t.removeEventListener(\"mouseenter\",c),t.removeEventListener(\"mouseout\",c),t.removeEventListener(\"mouseover\",c),t.removeEventListener(\"blur\",f),t.removeEventListener(\"keyup\",h),t.removeEventListener(\"keydown\",h),t.removeEventListener(\"keypress\",h),t!==window&&(window.removeEventListener(\"blur\",f),window.removeEventListener(\"keyup\",h),window.removeEventListener(\"keydown\",h),window.removeEventListener(\"keypress\",h)))},enumerable:!0},buttons:{get:function(){return r},enumerable:!0},x:{get:function(){return i},enumerable:!0},y:{get:function(){return a},enumerable:!0},mods:{get:function(){return o},enumerable:!0}}),y};var n=r(4687)},24:function(t){var e={left:0,top:0};t.exports=function(t,r,n){r=r||t.currentTarget||t.srcElement,Array.isArray(n)||(n=[0,0]);var i,a=t.clientX||0,o=t.clientY||0,s=(i=r)===window||i===document||i===document.body?e:i.getBoundingClientRect();return n[0]=a-s.left,n[1]=o-s.top,n}},4687:function(t,e){\"use strict\";function r(t){return t.target||t.srcElement||window}e.buttons=function(t){if(\"object\"==typeof t){if(\"buttons\"in t)return t.buttons;if(\"which\"in t){if(2===(e=t.which))return 4;if(3===e)return 2;if(e>0)return 1<=0)return 1< 0\"),\"function\"!=typeof t.vertex&&e(\"Must specify vertex creation function\"),\"function\"!=typeof t.cell&&e(\"Must specify cell creation function\"),\"function\"!=typeof t.phase&&e(\"Must specify phase function\");for(var o=t.getters||[],s=new Array(a),l=0;l=0?s[l]=!0:s[l]=!1;return function(t,e,r,a,o,s){var l=[s,o].join(\",\");return(0,i[l])(t,e,r,n.mallocUint32,n.freeUint32)}(t.vertex,t.cell,t.phase,0,r,s)};var i={\"false,0,1\":function(t,e,r,n,i){return function(a,o,s,l){var u,c=0|a.shape[0],f=0|a.shape[1],h=a.data,p=0|a.offset,d=0|a.stride[0],v=0|a.stride[1],g=p,y=0|-d,m=0,x=0|-v,b=0,_=-d-v|0,w=0,T=0|d,k=v-d*c|0,A=0,M=0,S=0,E=2*c|0,L=n(E),C=n(E),P=0,O=0,I=-1,z=-1,D=0,R=0|-c,F=0|c,B=0,N=-c-1|0,j=c-1|0,U=0,V=0,q=0;for(A=0;A0){if(M=1,L[P++]=r(h[g],o,s,l),g+=T,c>0)for(A=1,u=h[g],O=L[P]=r(u,o,s,l),D=L[P+I],B=L[P+R],U=L[P+N],O===D&&O===B&&O===U||(m=h[g+y],b=h[g+x],w=h[g+_],t(A,M,u,m,b,w,O,D,B,U,o,s,l),V=C[P]=S++),P+=1,g+=T,A=2;A0)for(A=1,u=h[g],O=L[P]=r(u,o,s,l),D=L[P+I],B=L[P+R],U=L[P+N],O===D&&O===B&&O===U||(m=h[g+y],b=h[g+x],w=h[g+_],t(A,M,u,m,b,w,O,D,B,U,o,s,l),V=C[P]=S++,U!==B&&e(C[P+R],V,b,w,B,U,o,s,l)),P+=1,g+=T,A=2;A0){if(A=1,L[P++]=r(h[g],o,s,l),g+=T,f>0)for(M=1,u=h[g],O=L[P]=r(u,o,s,l),B=L[P+R],D=L[P+I],U=L[P+N],O===B&&O===D&&O===U||(m=h[g+y],b=h[g+x],w=h[g+_],t(A,M,u,m,b,w,O,B,D,U,o,s,l),V=C[P]=S++),P+=1,g+=T,M=2;M0)for(M=1,u=h[g],O=L[P]=r(u,o,s,l),B=L[P+R],D=L[P+I],U=L[P+N],O===B&&O===D&&O===U||(m=h[g+y],b=h[g+x],w=h[g+_],t(A,M,u,m,b,w,O,B,D,U,o,s,l),V=C[P]=S++,U!==B&&e(C[P+R],V,w,m,U,B,o,s,l)),P+=1,g+=T,M=2;M2&&a[1]>2&&n(i.pick(-1,-1).lo(1,1).hi(a[0]-2,a[1]-2),t.pick(-1,-1,0).lo(1,1).hi(a[0]-2,a[1]-2),t.pick(-1,-1,1).lo(1,1).hi(a[0]-2,a[1]-2)),a[1]>2&&(r(i.pick(0,-1).lo(1).hi(a[1]-2),t.pick(0,-1,1).lo(1).hi(a[1]-2)),e(t.pick(0,-1,0).lo(1).hi(a[1]-2))),a[1]>2&&(r(i.pick(a[0]-1,-1).lo(1).hi(a[1]-2),t.pick(a[0]-1,-1,1).lo(1).hi(a[1]-2)),e(t.pick(a[0]-1,-1,0).lo(1).hi(a[1]-2))),a[0]>2&&(r(i.pick(-1,0).lo(1).hi(a[0]-2),t.pick(-1,0,0).lo(1).hi(a[0]-2)),e(t.pick(-1,0,1).lo(1).hi(a[0]-2))),a[0]>2&&(r(i.pick(-1,a[1]-1).lo(1).hi(a[0]-2),t.pick(-1,a[1]-1,0).lo(1).hi(a[0]-2)),e(t.pick(-1,a[1]-1,1).lo(1).hi(a[0]-2))),t.set(0,0,0,0),t.set(0,0,1,0),t.set(a[0]-1,0,0,0),t.set(a[0]-1,0,1,0),t.set(0,a[1]-1,0,0),t.set(0,a[1]-1,1,0),t.set(a[0]-1,a[1]-1,0,0),t.set(a[0]-1,a[1]-1,1,0),t}}t.exports=function(t,e,r){return Array.isArray(r)||(r=n(e.dimension,\"string\"==typeof r?r:\"clamp\")),0===e.size?t:0===e.dimension?(t.set(0),t):function(t){var e=t.join();if(a=c[e])return a;for(var r=t.length,n=[f,h],i=1;i<=r;++i)n.push(p(i));var a=d.apply(void 0,n);return c[e]=a,a}(r)(t,e)}},4317:function(t){\"use strict\";function e(t,e){var r=Math.floor(e),n=e-r,i=0<=r&&r0;){x<64?(l=x,x=0):(l=64,x-=64);for(var b=0|t[1];b>0;){b<64?(u=b,b=0):(u=64,b-=64),n=y+x*f+b*h,o=m+x*d+b*v;var _=0,w=0,T=0,k=p,A=f-c*p,M=h-l*f,S=g,E=d-c*g,L=v-l*d;for(T=0;T0;){v<64?(l=v,v=0):(l=64,v-=64);for(var g=0|t[0];g>0;){g<64?(s=g,g=0):(s=64,g-=64),n=p+v*c+g*u,o=d+v*h+g*f;var y=0,m=0,x=c,b=u-l*c,_=h,w=f-l*h;for(m=0;m0;){m<64?(u=m,m=0):(u=64,m-=64);for(var x=0|t[0];x>0;){x<64?(s=x,x=0):(s=64,x-=64);for(var b=0|t[1];b>0;){b<64?(l=b,b=0):(l=64,b-=64),n=g+m*h+x*c+b*f,o=y+m*v+x*p+b*d;var _=0,w=0,T=0,k=h,A=c-u*h,M=f-s*c,S=v,E=p-u*v,L=d-s*p;for(T=0;Tr;){y=0,m=v-o;e:for(g=0;gb)break e;m+=f,y+=h}for(y=v,m=v-o,g=0;g>1,H=q-j,G=q+j,W=U,Y=H,X=q,Z=G,K=V,J=i+1,$=a-1,Q=!0,tt=0,et=0,rt=0,nt=f,it=e(nt),at=e(nt);A=l*W,M=l*Y,N=s;t:for(k=0;k0){g=W,W=Y,Y=g;break t}if(rt<0)break t;N+=p}A=l*Z,M=l*K,N=s;t:for(k=0;k0){g=Z,Z=K,K=g;break t}if(rt<0)break t;N+=p}A=l*W,M=l*X,N=s;t:for(k=0;k0){g=W,W=X,X=g;break t}if(rt<0)break t;N+=p}A=l*Y,M=l*X,N=s;t:for(k=0;k0){g=Y,Y=X,X=g;break t}if(rt<0)break t;N+=p}A=l*W,M=l*Z,N=s;t:for(k=0;k0){g=W,W=Z,Z=g;break t}if(rt<0)break t;N+=p}A=l*X,M=l*Z,N=s;t:for(k=0;k0){g=X,X=Z,Z=g;break t}if(rt<0)break t;N+=p}A=l*Y,M=l*K,N=s;t:for(k=0;k0){g=Y,Y=K,K=g;break t}if(rt<0)break t;N+=p}A=l*Y,M=l*X,N=s;t:for(k=0;k0){g=Y,Y=X,X=g;break t}if(rt<0)break t;N+=p}A=l*Z,M=l*K,N=s;t:for(k=0;k0){g=Z,Z=K,K=g;break t}if(rt<0)break t;N+=p}for(A=l*W,M=l*Y,S=l*X,E=l*Z,L=l*K,C=l*U,P=l*q,O=l*V,B=0,N=s,k=0;k0)){if(rt<0){for(A=l*b,M=l*J,S=l*$,N=s,k=0;k0)for(;;){for(_=s+$*l,B=0,k=0;k0)){for(_=s+$*l,B=0,k=0;kV){t:for(;;){for(_=s+J*l,B=0,N=s,k=0;k1&&n?s(r,n[0],n[1]):s(r)}(t,e,l);return n(l,u)}},446:function(t,e,r){\"use strict\";var n=r(7640),i={};t.exports=function(t){var e=t.order,r=t.dtype,a=[e,r].join(\":\"),o=i[a];return o||(i[a]=o=n(e,r)),o(t),t}},9618:function(t,e,r){var n=r(7163),i=\"undefined\"!=typeof Float64Array;function a(t,e){return t[0]-e[0]}function o(){var t,e=this.stride,r=new Array(e.length);for(t=0;t=0&&(e+=a*(r=0|t),i-=r),new n(this.data,i,a,e)},i.step=function(t){var e=this.shape[0],r=this.stride[0],i=this.offset,a=0,o=Math.ceil;return\"number\"==typeof t&&((a=0|t)<0?(i+=r*(e-1),e=o(-e/a)):e=o(e/a),r*=a),new n(this.data,e,r,i)},i.transpose=function(t){t=void 0===t?0:0|t;var e=this.shape,r=this.stride;return new n(this.data,e[t],r[t],this.offset)},i.pick=function(t){var r=[],n=[],i=this.offset;return\"number\"==typeof t&&t>=0?i=i+this.stride[0]*t|0:(r.push(this.shape[0]),n.push(this.stride[0])),(0,e[r.length+1])(this.data,r,n,i)},function(t,e,r,i){return new n(t,e[0],r[0],i)}},2:function(t,e,r){function n(t,e,r,n,i,a){this.data=t,this.shape=[e,r],this.stride=[n,i],this.offset=0|a}var i=n.prototype;return i.dtype=t,i.dimension=2,Object.defineProperty(i,\"size\",{get:function(){return this.shape[0]*this.shape[1]}}),Object.defineProperty(i,\"order\",{get:function(){return Math.abs(this.stride[0])>Math.abs(this.stride[1])?[1,0]:[0,1]}}),i.set=function(e,r,n){return\"generic\"===t?this.data.set(this.offset+this.stride[0]*e+this.stride[1]*r,n):this.data[this.offset+this.stride[0]*e+this.stride[1]*r]=n},i.get=function(e,r){return\"generic\"===t?this.data.get(this.offset+this.stride[0]*e+this.stride[1]*r):this.data[this.offset+this.stride[0]*e+this.stride[1]*r]},i.index=function(t,e){return this.offset+this.stride[0]*t+this.stride[1]*e},i.hi=function(t,e){return new n(this.data,\"number\"!=typeof t||t<0?this.shape[0]:0|t,\"number\"!=typeof e||e<0?this.shape[1]:0|e,this.stride[0],this.stride[1],this.offset)},i.lo=function(t,e){var r=this.offset,i=0,a=this.shape[0],o=this.shape[1],s=this.stride[0],l=this.stride[1];return\"number\"==typeof t&&t>=0&&(r+=s*(i=0|t),a-=i),\"number\"==typeof e&&e>=0&&(r+=l*(i=0|e),o-=i),new n(this.data,a,o,s,l,r)},i.step=function(t,e){var r=this.shape[0],i=this.shape[1],a=this.stride[0],o=this.stride[1],s=this.offset,l=0,u=Math.ceil;return\"number\"==typeof t&&((l=0|t)<0?(s+=a*(r-1),r=u(-r/l)):r=u(r/l),a*=l),\"number\"==typeof e&&((l=0|e)<0?(s+=o*(i-1),i=u(-i/l)):i=u(i/l),o*=l),new n(this.data,r,i,a,o,s)},i.transpose=function(t,e){t=void 0===t?0:0|t,e=void 0===e?1:0|e;var r=this.shape,i=this.stride;return new n(this.data,r[t],r[e],i[t],i[e],this.offset)},i.pick=function(t,r){var n=[],i=[],a=this.offset;return\"number\"==typeof t&&t>=0?a=a+this.stride[0]*t|0:(n.push(this.shape[0]),i.push(this.stride[0])),\"number\"==typeof r&&r>=0?a=a+this.stride[1]*r|0:(n.push(this.shape[1]),i.push(this.stride[1])),(0,e[n.length+1])(this.data,n,i,a)},function(t,e,r,i){return new n(t,e[0],e[1],r[0],r[1],i)}},3:function(t,e,r){function n(t,e,r,n,i,a,o,s){this.data=t,this.shape=[e,r,n],this.stride=[i,a,o],this.offset=0|s}var i=n.prototype;return i.dtype=t,i.dimension=3,Object.defineProperty(i,\"size\",{get:function(){return this.shape[0]*this.shape[1]*this.shape[2]}}),Object.defineProperty(i,\"order\",{get:function(){var t=Math.abs(this.stride[0]),e=Math.abs(this.stride[1]),r=Math.abs(this.stride[2]);return t>e?e>r?[2,1,0]:t>r?[1,2,0]:[1,0,2]:t>r?[2,0,1]:r>e?[0,1,2]:[0,2,1]}}),i.set=function(e,r,n,i){return\"generic\"===t?this.data.set(this.offset+this.stride[0]*e+this.stride[1]*r+this.stride[2]*n,i):this.data[this.offset+this.stride[0]*e+this.stride[1]*r+this.stride[2]*n]=i},i.get=function(e,r,n){return\"generic\"===t?this.data.get(this.offset+this.stride[0]*e+this.stride[1]*r+this.stride[2]*n):this.data[this.offset+this.stride[0]*e+this.stride[1]*r+this.stride[2]*n]},i.index=function(t,e,r){return this.offset+this.stride[0]*t+this.stride[1]*e+this.stride[2]*r},i.hi=function(t,e,r){return new n(this.data,\"number\"!=typeof t||t<0?this.shape[0]:0|t,\"number\"!=typeof e||e<0?this.shape[1]:0|e,\"number\"!=typeof r||r<0?this.shape[2]:0|r,this.stride[0],this.stride[1],this.stride[2],this.offset)},i.lo=function(t,e,r){var i=this.offset,a=0,o=this.shape[0],s=this.shape[1],l=this.shape[2],u=this.stride[0],c=this.stride[1],f=this.stride[2];return\"number\"==typeof t&&t>=0&&(i+=u*(a=0|t),o-=a),\"number\"==typeof e&&e>=0&&(i+=c*(a=0|e),s-=a),\"number\"==typeof r&&r>=0&&(i+=f*(a=0|r),l-=a),new n(this.data,o,s,l,u,c,f,i)},i.step=function(t,e,r){var i=this.shape[0],a=this.shape[1],o=this.shape[2],s=this.stride[0],l=this.stride[1],u=this.stride[2],c=this.offset,f=0,h=Math.ceil;return\"number\"==typeof t&&((f=0|t)<0?(c+=s*(i-1),i=h(-i/f)):i=h(i/f),s*=f),\"number\"==typeof e&&((f=0|e)<0?(c+=l*(a-1),a=h(-a/f)):a=h(a/f),l*=f),\"number\"==typeof r&&((f=0|r)<0?(c+=u*(o-1),o=h(-o/f)):o=h(o/f),u*=f),new n(this.data,i,a,o,s,l,u,c)},i.transpose=function(t,e,r){t=void 0===t?0:0|t,e=void 0===e?1:0|e,r=void 0===r?2:0|r;var i=this.shape,a=this.stride;return new n(this.data,i[t],i[e],i[r],a[t],a[e],a[r],this.offset)},i.pick=function(t,r,n){var i=[],a=[],o=this.offset;return\"number\"==typeof t&&t>=0?o=o+this.stride[0]*t|0:(i.push(this.shape[0]),a.push(this.stride[0])),\"number\"==typeof r&&r>=0?o=o+this.stride[1]*r|0:(i.push(this.shape[1]),a.push(this.stride[1])),\"number\"==typeof n&&n>=0?o=o+this.stride[2]*n|0:(i.push(this.shape[2]),a.push(this.stride[2])),(0,e[i.length+1])(this.data,i,a,o)},function(t,e,r,i){return new n(t,e[0],e[1],e[2],r[0],r[1],r[2],i)}},4:function(t,e,r){function n(t,e,r,n,i,a,o,s,l,u){this.data=t,this.shape=[e,r,n,i],this.stride=[a,o,s,l],this.offset=0|u}var i=n.prototype;return i.dtype=t,i.dimension=4,Object.defineProperty(i,\"size\",{get:function(){return this.shape[0]*this.shape[1]*this.shape[2]*this.shape[3]}}),Object.defineProperty(i,\"order\",{get:r}),i.set=function(e,r,n,i,a){return\"generic\"===t?this.data.set(this.offset+this.stride[0]*e+this.stride[1]*r+this.stride[2]*n+this.stride[3]*i,a):this.data[this.offset+this.stride[0]*e+this.stride[1]*r+this.stride[2]*n+this.stride[3]*i]=a},i.get=function(e,r,n,i){return\"generic\"===t?this.data.get(this.offset+this.stride[0]*e+this.stride[1]*r+this.stride[2]*n+this.stride[3]*i):this.data[this.offset+this.stride[0]*e+this.stride[1]*r+this.stride[2]*n+this.stride[3]*i]},i.index=function(t,e,r,n){return this.offset+this.stride[0]*t+this.stride[1]*e+this.stride[2]*r+this.stride[3]*n},i.hi=function(t,e,r,i){return new n(this.data,\"number\"!=typeof t||t<0?this.shape[0]:0|t,\"number\"!=typeof e||e<0?this.shape[1]:0|e,\"number\"!=typeof r||r<0?this.shape[2]:0|r,\"number\"!=typeof i||i<0?this.shape[3]:0|i,this.stride[0],this.stride[1],this.stride[2],this.stride[3],this.offset)},i.lo=function(t,e,r,i){var a=this.offset,o=0,s=this.shape[0],l=this.shape[1],u=this.shape[2],c=this.shape[3],f=this.stride[0],h=this.stride[1],p=this.stride[2],d=this.stride[3];return\"number\"==typeof t&&t>=0&&(a+=f*(o=0|t),s-=o),\"number\"==typeof e&&e>=0&&(a+=h*(o=0|e),l-=o),\"number\"==typeof r&&r>=0&&(a+=p*(o=0|r),u-=o),\"number\"==typeof i&&i>=0&&(a+=d*(o=0|i),c-=o),new n(this.data,s,l,u,c,f,h,p,d,a)},i.step=function(t,e,r,i){var a=this.shape[0],o=this.shape[1],s=this.shape[2],l=this.shape[3],u=this.stride[0],c=this.stride[1],f=this.stride[2],h=this.stride[3],p=this.offset,d=0,v=Math.ceil;return\"number\"==typeof t&&((d=0|t)<0?(p+=u*(a-1),a=v(-a/d)):a=v(a/d),u*=d),\"number\"==typeof e&&((d=0|e)<0?(p+=c*(o-1),o=v(-o/d)):o=v(o/d),c*=d),\"number\"==typeof r&&((d=0|r)<0?(p+=f*(s-1),s=v(-s/d)):s=v(s/d),f*=d),\"number\"==typeof i&&((d=0|i)<0?(p+=h*(l-1),l=v(-l/d)):l=v(l/d),h*=d),new n(this.data,a,o,s,l,u,c,f,h,p)},i.transpose=function(t,e,r,i){t=void 0===t?0:0|t,e=void 0===e?1:0|e,r=void 0===r?2:0|r,i=void 0===i?3:0|i;var a=this.shape,o=this.stride;return new n(this.data,a[t],a[e],a[r],a[i],o[t],o[e],o[r],o[i],this.offset)},i.pick=function(t,r,n,i){var a=[],o=[],s=this.offset;return\"number\"==typeof t&&t>=0?s=s+this.stride[0]*t|0:(a.push(this.shape[0]),o.push(this.stride[0])),\"number\"==typeof r&&r>=0?s=s+this.stride[1]*r|0:(a.push(this.shape[1]),o.push(this.stride[1])),\"number\"==typeof n&&n>=0?s=s+this.stride[2]*n|0:(a.push(this.shape[2]),o.push(this.stride[2])),\"number\"==typeof i&&i>=0?s=s+this.stride[3]*i|0:(a.push(this.shape[3]),o.push(this.stride[3])),(0,e[a.length+1])(this.data,a,o,s)},function(t,e,r,i){return new n(t,e[0],e[1],e[2],e[3],r[0],r[1],r[2],r[3],i)}},5:function(t,e,r){function n(t,e,r,n,i,a,o,s,l,u,c,f){this.data=t,this.shape=[e,r,n,i,a],this.stride=[o,s,l,u,c],this.offset=0|f}var i=n.prototype;return i.dtype=t,i.dimension=5,Object.defineProperty(i,\"size\",{get:function(){return this.shape[0]*this.shape[1]*this.shape[2]*this.shape[3]*this.shape[4]}}),Object.defineProperty(i,\"order\",{get:r}),i.set=function(e,r,n,i,a,o){return\"generic\"===t?this.data.set(this.offset+this.stride[0]*e+this.stride[1]*r+this.stride[2]*n+this.stride[3]*i+this.stride[4]*a,o):this.data[this.offset+this.stride[0]*e+this.stride[1]*r+this.stride[2]*n+this.stride[3]*i+this.stride[4]*a]=o},i.get=function(e,r,n,i,a){return\"generic\"===t?this.data.get(this.offset+this.stride[0]*e+this.stride[1]*r+this.stride[2]*n+this.stride[3]*i+this.stride[4]*a):this.data[this.offset+this.stride[0]*e+this.stride[1]*r+this.stride[2]*n+this.stride[3]*i+this.stride[4]*a]},i.index=function(t,e,r,n,i){return this.offset+this.stride[0]*t+this.stride[1]*e+this.stride[2]*r+this.stride[3]*n+this.stride[4]*i},i.hi=function(t,e,r,i,a){return new n(this.data,\"number\"!=typeof t||t<0?this.shape[0]:0|t,\"number\"!=typeof e||e<0?this.shape[1]:0|e,\"number\"!=typeof r||r<0?this.shape[2]:0|r,\"number\"!=typeof i||i<0?this.shape[3]:0|i,\"number\"!=typeof a||a<0?this.shape[4]:0|a,this.stride[0],this.stride[1],this.stride[2],this.stride[3],this.stride[4],this.offset)},i.lo=function(t,e,r,i,a){var o=this.offset,s=0,l=this.shape[0],u=this.shape[1],c=this.shape[2],f=this.shape[3],h=this.shape[4],p=this.stride[0],d=this.stride[1],v=this.stride[2],g=this.stride[3],y=this.stride[4];return\"number\"==typeof t&&t>=0&&(o+=p*(s=0|t),l-=s),\"number\"==typeof e&&e>=0&&(o+=d*(s=0|e),u-=s),\"number\"==typeof r&&r>=0&&(o+=v*(s=0|r),c-=s),\"number\"==typeof i&&i>=0&&(o+=g*(s=0|i),f-=s),\"number\"==typeof a&&a>=0&&(o+=y*(s=0|a),h-=s),new n(this.data,l,u,c,f,h,p,d,v,g,y,o)},i.step=function(t,e,r,i,a){var o=this.shape[0],s=this.shape[1],l=this.shape[2],u=this.shape[3],c=this.shape[4],f=this.stride[0],h=this.stride[1],p=this.stride[2],d=this.stride[3],v=this.stride[4],g=this.offset,y=0,m=Math.ceil;return\"number\"==typeof t&&((y=0|t)<0?(g+=f*(o-1),o=m(-o/y)):o=m(o/y),f*=y),\"number\"==typeof e&&((y=0|e)<0?(g+=h*(s-1),s=m(-s/y)):s=m(s/y),h*=y),\"number\"==typeof r&&((y=0|r)<0?(g+=p*(l-1),l=m(-l/y)):l=m(l/y),p*=y),\"number\"==typeof i&&((y=0|i)<0?(g+=d*(u-1),u=m(-u/y)):u=m(u/y),d*=y),\"number\"==typeof a&&((y=0|a)<0?(g+=v*(c-1),c=m(-c/y)):c=m(c/y),v*=y),new n(this.data,o,s,l,u,c,f,h,p,d,v,g)},i.transpose=function(t,e,r,i,a){t=void 0===t?0:0|t,e=void 0===e?1:0|e,r=void 0===r?2:0|r,i=void 0===i?3:0|i,a=void 0===a?4:0|a;var o=this.shape,s=this.stride;return new n(this.data,o[t],o[e],o[r],o[i],o[a],s[t],s[e],s[r],s[i],s[a],this.offset)},i.pick=function(t,r,n,i,a){var o=[],s=[],l=this.offset;return\"number\"==typeof t&&t>=0?l=l+this.stride[0]*t|0:(o.push(this.shape[0]),s.push(this.stride[0])),\"number\"==typeof r&&r>=0?l=l+this.stride[1]*r|0:(o.push(this.shape[1]),s.push(this.stride[1])),\"number\"==typeof n&&n>=0?l=l+this.stride[2]*n|0:(o.push(this.shape[2]),s.push(this.stride[2])),\"number\"==typeof i&&i>=0?l=l+this.stride[3]*i|0:(o.push(this.shape[3]),s.push(this.stride[3])),\"number\"==typeof a&&a>=0?l=l+this.stride[4]*a|0:(o.push(this.shape[4]),s.push(this.stride[4])),(0,e[o.length+1])(this.data,o,s,l)},function(t,e,r,i){return new n(t,e[0],e[1],e[2],e[3],e[4],r[0],r[1],r[2],r[3],r[4],i)}}};function l(t,e){var r=-1===e?\"T\":String(e),n=s[r];return-1===e?n(t):0===e?n(t,u[t][0]):n(t,u[t],o)}var u={generic:[],buffer:[],array:[],float32:[],float64:[],int8:[],int16:[],int32:[],uint8_clamped:[],uint8:[],uint16:[],uint32:[],bigint64:[],biguint64:[]};t.exports=function(t,e,r,a){if(void 0===t)return(0,u.array[0])([]);\"number\"==typeof t&&(t=[t]),void 0===e&&(e=[t.length]);var o=e.length;if(void 0===r){r=new Array(o);for(var s=o-1,c=1;s>=0;--s)r[s]=c,c*=e[s]}if(void 0===a)for(a=0,s=0;s>>0;t.exports=function(t,e){if(isNaN(t)||isNaN(e))return NaN;if(t===e)return t;if(0===t)return e<0?-i:i;var r=n.hi(t),o=n.lo(t);return e>t==t>0?o===a?(r+=1,o=0):o+=1:0===o?(o=a,r-=1):o-=1,n.pack(o,r)}},8406:function(t,e){e.vertexNormals=function(t,e,r){for(var n=e.length,i=new Array(n),a=void 0===r?1e-6:r,o=0;oa){var b=i[u],_=1/Math.sqrt(g*m);for(x=0;x<3;++x){var w=(x+1)%3,T=(x+2)%3;b[x]+=_*(y[w]*v[T]-y[T]*v[w])}}}for(o=0;oa)for(_=1/Math.sqrt(k),x=0;x<3;++x)b[x]*=_;else for(x=0;x<3;++x)b[x]=0}return i},e.faceNormals=function(t,e,r){for(var n=t.length,i=new Array(n),a=void 0===r?1e-6:r,o=0;oa?1/Math.sqrt(p):0,u=0;u<3;++u)h[u]*=p;i[o]=h}return i}},4081:function(t){\"use strict\";t.exports=function(t,e,r,n,i,a,o,s,l,u){var c=e+a+u;if(f>0){var f=Math.sqrt(c+1);t[0]=.5*(o-l)/f,t[1]=.5*(s-n)/f,t[2]=.5*(r-a)/f,t[3]=.5*f}else{var h=Math.max(e,a,u);f=Math.sqrt(2*h-c+1),e>=h?(t[0]=.5*f,t[1]=.5*(i+r)/f,t[2]=.5*(s+n)/f,t[3]=.5*(o-l)/f):a>=h?(t[0]=.5*(r+i)/f,t[1]=.5*f,t[2]=.5*(l+o)/f,t[3]=.5*(s-n)/f):(t[0]=.5*(n+s)/f,t[1]=.5*(o+l)/f,t[2]=.5*f,t[3]=.5*(r-i)/f)}return t}},9977:function(t,e,r){\"use strict\";t.exports=function(t){var e=(t=t||{}).center||[0,0,0],r=t.rotation||[0,0,0,1],n=t.radius||1;e=[].slice.call(e,0,3),c(r=[].slice.call(r,0,4),r);var i=new f(r,e,Math.log(n));return i.setDistanceLimits(t.zoomMin,t.zoomMax),(\"eye\"in t||\"up\"in t)&&i.lookAt(0,t.eye,t.center,t.up),i};var n=r(9215),i=r(6582),a=r(7399),o=r(7608),s=r(4081);function l(t,e,r){return Math.sqrt(Math.pow(t,2)+Math.pow(e,2)+Math.pow(r,2))}function u(t,e,r,n){return Math.sqrt(Math.pow(t,2)+Math.pow(e,2)+Math.pow(r,2)+Math.pow(n,2))}function c(t,e){var r=e[0],n=e[1],i=e[2],a=e[3],o=u(r,n,i,a);o>1e-6?(t[0]=r/o,t[1]=n/o,t[2]=i/o,t[3]=a/o):(t[0]=t[1]=t[2]=0,t[3]=1)}function f(t,e,r){this.radius=n([r]),this.center=n(e),this.rotation=n(t),this.computedRadius=this.radius.curve(0),this.computedCenter=this.center.curve(0),this.computedRotation=this.rotation.curve(0),this.computedUp=[.1,0,0],this.computedEye=[.1,0,0],this.computedMatrix=[.1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],this.recalcMatrix(0)}var h=f.prototype;h.lastT=function(){return Math.max(this.radius.lastT(),this.center.lastT(),this.rotation.lastT())},h.recalcMatrix=function(t){this.radius.curve(t),this.center.curve(t),this.rotation.curve(t);var e=this.computedRotation;c(e,e);var r=this.computedMatrix;a(r,e);var n=this.computedCenter,i=this.computedEye,o=this.computedUp,s=Math.exp(this.computedRadius[0]);i[0]=n[0]+s*r[2],i[1]=n[1]+s*r[6],i[2]=n[2]+s*r[10],o[0]=r[1],o[1]=r[5],o[2]=r[9];for(var l=0;l<3;++l){for(var u=0,f=0;f<3;++f)u+=r[l+4*f]*i[f];r[12+l]=-u}},h.getMatrix=function(t,e){this.recalcMatrix(t);var r=this.computedMatrix;if(e){for(var n=0;n<16;++n)e[n]=r[n];return e}return r},h.idle=function(t){this.center.idle(t),this.radius.idle(t),this.rotation.idle(t)},h.flush=function(t){this.center.flush(t),this.radius.flush(t),this.rotation.flush(t)},h.pan=function(t,e,r,n){e=e||0,r=r||0,n=n||0,this.recalcMatrix(t);var i=this.computedMatrix,a=i[1],o=i[5],s=i[9],u=l(a,o,s);a/=u,o/=u,s/=u;var c=i[0],f=i[4],h=i[8],p=c*a+f*o+h*s,d=l(c-=a*p,f-=o*p,h-=s*p);c/=d,f/=d,h/=d;var v=i[2],g=i[6],y=i[10],m=v*a+g*o+y*s,x=v*c+g*f+y*h,b=l(v-=m*a+x*c,g-=m*o+x*f,y-=m*s+x*h);v/=b,g/=b,y/=b;var _=c*e+a*r,w=f*e+o*r,T=h*e+s*r;this.center.move(t,_,w,T);var k=Math.exp(this.computedRadius[0]);k=Math.max(1e-4,k+n),this.radius.set(t,Math.log(k))},h.rotate=function(t,e,r,n){this.recalcMatrix(t),e=e||0,r=r||0;var i=this.computedMatrix,a=i[0],o=i[4],s=i[8],c=i[1],f=i[5],h=i[9],p=i[2],d=i[6],v=i[10],g=e*a+r*c,y=e*o+r*f,m=e*s+r*h,x=-(d*m-v*y),b=-(v*g-p*m),_=-(p*y-d*g),w=Math.sqrt(Math.max(0,1-Math.pow(x,2)-Math.pow(b,2)-Math.pow(_,2))),T=u(x,b,_,w);T>1e-6?(x/=T,b/=T,_/=T,w/=T):(x=b=_=0,w=1);var k=this.computedRotation,A=k[0],M=k[1],S=k[2],E=k[3],L=A*w+E*x+M*_-S*b,C=M*w+E*b+S*x-A*_,P=S*w+E*_+A*b-M*x,O=E*w-A*x-M*b-S*_;if(n){x=p,b=d,_=v;var I=Math.sin(n)/l(x,b,_);x*=I,b*=I,_*=I,O=O*(w=Math.cos(e))-(L=L*w+O*x+C*_-P*b)*x-(C=C*w+O*b+P*x-L*_)*b-(P=P*w+O*_+L*b-C*x)*_}var z=u(L,C,P,O);z>1e-6?(L/=z,C/=z,P/=z,O/=z):(L=C=P=0,O=1),this.rotation.set(t,L,C,P,O)},h.lookAt=function(t,e,r,n){this.recalcMatrix(t),r=r||this.computedCenter,e=e||this.computedEye,n=n||this.computedUp;var a=this.computedMatrix;i(a,e,r,n);var o=this.computedRotation;s(o,a[0],a[1],a[2],a[4],a[5],a[6],a[8],a[9],a[10]),c(o,o),this.rotation.set(t,o[0],o[1],o[2],o[3]);for(var l=0,u=0;u<3;++u)l+=Math.pow(r[u]-e[u],2);this.radius.set(t,.5*Math.log(Math.max(l,1e-6))),this.center.set(t,r[0],r[1],r[2])},h.translate=function(t,e,r,n){this.center.move(t,e||0,r||0,n||0)},h.setMatrix=function(t,e){var r=this.computedRotation;s(r,e[0],e[1],e[2],e[4],e[5],e[6],e[8],e[9],e[10]),c(r,r),this.rotation.set(t,r[0],r[1],r[2],r[3]);var n=this.computedMatrix;o(n,e);var i=n[15];if(Math.abs(i)>1e-6){var a=n[12]/i,l=n[13]/i,u=n[14]/i;this.recalcMatrix(t);var f=Math.exp(this.computedRadius[0]);this.center.set(t,a-n[2]*f,l-n[6]*f,u-n[10]*f),this.radius.idle(t)}else this.center.idle(t),this.radius.idle(t)},h.setDistance=function(t,e){e>0&&this.radius.set(t,Math.log(e))},h.setDistanceLimits=function(t,e){t=t>0?Math.log(t):-1/0,e=e>0?Math.log(e):1/0,e=Math.max(e,t),this.radius.bounds[0][0]=t,this.radius.bounds[1][0]=e},h.getDistanceLimits=function(t){var e=this.radius.bounds;return t?(t[0]=Math.exp(e[0][0]),t[1]=Math.exp(e[1][0]),t):[Math.exp(e[0][0]),Math.exp(e[1][0])]},h.toJSON=function(){return this.recalcMatrix(this.lastT()),{center:this.computedCenter.slice(),rotation:this.computedRotation.slice(),distance:Math.log(this.computedRadius[0]),zoomMin:this.radius.bounds[0][0],zoomMax:this.radius.bounds[1][0]}},h.fromJSON=function(t){var e=this.lastT(),r=t.center;r&&this.center.set(e,r[0],r[1],r[2]);var n=t.rotation;n&&this.rotation.set(e,n[0],n[1],n[2],n[3]);var i=t.distance;i&&i>0&&this.radius.set(e,Math.log(i)),this.setDistanceLimits(t.zoomMin,t.zoomMax)}},1371:function(t,e,r){\"use strict\";var n=r(3233);t.exports=function(t,e,r){return n(r=void 0!==r?r+\"\":\" \",e)+t}},3202:function(t){t.exports=function(t,e){e||(e=[0,\"\"]),t=String(t);var r=parseFloat(t,10);return e[0]=r,e[1]=t.match(/[\\d.\\-\\+]*\\s*(.*)/)[1]||\"\",e}},3088:function(t,e,r){\"use strict\";t.exports=function(t,e){for(var r=0|e.length,i=t.length,a=[new Array(r),new Array(r)],o=0;o0){o=a[c][r][0],l=c;break}s=o[1^l];for(var f=0;f<2;++f)for(var h=a[f][r],p=0;p0&&(o=d,s=v,l=f)}return i||o&&u(o,l),s}function f(t,r){var i=a[r][t][0],o=[t];u(i,r);for(var s=i[1^r];;){for(;s!==t;)o.push(s),s=c(o[o.length-2],s,!1);if(a[0][t].length+a[1][t].length===0)break;var l=o[o.length-1],f=t,h=o[1],p=c(l,f,!0);if(n(e[l],e[f],e[h],e[p])<0)break;o.push(t),s=c(l,f)}return o}function h(t,e){return e[1]===e[e.length-1]}for(o=0;o0;){a[0][o].length;var v=f(o,p);h(0,v)?d.push.apply(d,v):(d.length>0&&l.push(d),d=v)}d.length>0&&l.push(d)}return l};var n=r(3140)},5609:function(t,e,r){\"use strict\";t.exports=function(t,e){for(var r=n(t,e.length),i=new Array(e.length),a=new Array(e.length),o=[],s=0;s0;){i[p=o.pop()]=!1;var u=r[p];for(s=0;s0}))).length,g=new Array(v),y=new Array(v);for(p=0;p0;){var B=R.pop(),N=E[B];l(N,(function(t,e){return t-e}));var j,U=N.length,V=F[B];for(0===V&&(j=[q=d[B]]),p=0;p=0||(F[H]=1^V,R.push(H),0===V&&(D(q=d[H])||(q.reverse(),j.push(q))))}0===V&&r.push(j)}return r};var n=r(3134),i=r(3088),a=r(5085),o=r(5250),s=r(8210),l=r(1682),u=r(5609);function c(t,e){for(var r=new Array(t),n=0;n0&&e[i]===r[0]))return 1;a=t[i-1]}for(var s=1;a;){var l=a.key,u=n(r,l[0],l[1]);if(l[0][0]0))return 0;s=-1,a=a.right}else if(u>0)a=a.left;else{if(!(u<0))return 0;s=1,a=a.right}}return s}}(y.slabs,y.coordinates);return 0===a.length?m:function(t,e){return function(r){return t(r[0],r[1])?0:e(r)}}(l(a),m)};var n=r(3250)[3],i=r(4209),a=r(3352),o=r(2478);function s(){return!0}function l(t){for(var e={},r=0;r=u?(k=1,m=u+2*h+d):m=h*(k=-h/u)+d):(k=0,p>=0?(A=0,m=d):-p>=f?(A=1,m=f+2*p+d):m=p*(A=-p/f)+d);else if(A<0)A=0,h>=0?(k=0,m=d):-h>=u?(k=1,m=u+2*h+d):m=h*(k=-h/u)+d;else{var M=1/T;m=(k*=M)*(u*k+c*(A*=M)+2*h)+A*(c*k+f*A+2*p)+d}else k<0?(b=f+p)>(x=c+h)?(_=b-x)>=(w=u-2*c+f)?(k=1,A=0,m=u+2*h+d):m=(k=_/w)*(u*k+c*(A=1-k)+2*h)+A*(c*k+f*A+2*p)+d:(k=0,b<=0?(A=1,m=f+2*p+d):p>=0?(A=0,m=d):m=p*(A=-p/f)+d):A<0?(b=u+h)>(x=c+p)?(_=b-x)>=(w=u-2*c+f)?(A=1,k=0,m=f+2*p+d):m=(k=1-(A=_/w))*(u*k+c*A+2*h)+A*(c*k+f*A+2*p)+d:(A=0,b<=0?(k=1,m=u+2*h+d):h>=0?(k=0,m=d):m=h*(k=-h/u)+d):(_=f+p-c-h)<=0?(k=0,A=1,m=f+2*p+d):_>=(w=u-2*c+f)?(k=1,A=0,m=u+2*h+d):m=(k=_/w)*(u*k+c*(A=1-k)+2*h)+A*(c*k+f*A+2*p)+d;var S=1-k-A;for(l=0;l0){var u=t[r-1];if(0===n(s,u)&&a(u)!==l){r-=1;continue}}t[r++]=s}}return t.length=r,t}},3233:function(t){\"use strict\";var e,r=\"\";t.exports=function(t,n){if(\"string\"!=typeof t)throw new TypeError(\"expected a string\");if(1===n)return t;if(2===n)return t+t;var i=t.length*n;if(e!==t||void 0===e)e=t,r=\"\";else if(r.length>=i)return r.substr(0,i);for(;i>r.length&&n>1;)1&n&&(r+=t),n>>=1,t+=t;return r=(r+=t).substr(0,i)}},3025:function(t,e,r){t.exports=r.g.performance&&r.g.performance.now?function(){return performance.now()}:Date.now||function(){return+new Date}},7004:function(t){\"use strict\";t.exports=function(t){for(var e=t.length,r=t[t.length-1],n=e,i=e-2;i>=0;--i){var a=r;(l=(s=t[i])-((r=a+s)-a))&&(t[--n]=r,r=l)}var o=0;for(i=n;i0){if(a<=0)return o;n=i+a}else{if(!(i<0))return o;if(a>=0)return o;n=-(i+a)}var s=33306690738754716e-32*n;return o>=s||o<=-s?o:f(t,e,r)},function(t,e,r,n){var i=t[0]-n[0],a=e[0]-n[0],o=r[0]-n[0],s=t[1]-n[1],l=e[1]-n[1],u=r[1]-n[1],c=t[2]-n[2],f=e[2]-n[2],p=r[2]-n[2],d=a*u,v=o*l,g=o*s,y=i*u,m=i*l,x=a*s,b=c*(d-v)+f*(g-y)+p*(m-x),_=7771561172376103e-31*((Math.abs(d)+Math.abs(v))*Math.abs(c)+(Math.abs(g)+Math.abs(y))*Math.abs(f)+(Math.abs(m)+Math.abs(x))*Math.abs(p));return b>_||-b>_?b:h(t,e,r,n)}];function d(t){var e=p[t.length];return e||(e=p[t.length]=c(t.length)),e.apply(void 0,t)}function v(t,e,r,n,i,a,o){return function(e,r,s,l,u){switch(arguments.length){case 0:case 1:return 0;case 2:return n(e,r);case 3:return i(e,r,s);case 4:return a(e,r,s,l);case 5:return o(e,r,s,l,u)}for(var c=new Array(arguments.length),f=0;f0&&o>0||a<0&&o<0)return!1;var s=n(r,t,e),l=n(i,t,e);return!(s>0&&l>0||s<0&&l<0)&&(0!==a||0!==o||0!==s||0!==l||function(t,e,r,n){for(var i=0;i<2;++i){var a=t[i],o=e[i],s=Math.min(a,o),l=Math.max(a,o),u=r[i],c=n[i],f=Math.min(u,c);if(Math.max(u,c)=n?(i=f,(l+=1)=n?(i=f,(l+=1)>1,u=e[2*l+1];if(u===a)return l;a>1,u=e[2*l+1];if(u===a)return l;a>1,u=e[2*l+1];if(u===a)return l;a0)-(t<0)},e.abs=function(t){var e=t>>31;return(t^e)-e},e.min=function(t,e){return e^(t^e)&-(t65535)<<4,e|=r=((t>>>=e)>255)<<3,e|=r=((t>>>=r)>15)<<2,(e|=r=((t>>>=r)>3)<<1)|(t>>>=r)>>1},e.log10=function(t){return t>=1e9?9:t>=1e8?8:t>=1e7?7:t>=1e6?6:t>=1e5?5:t>=1e4?4:t>=1e3?3:t>=100?2:t>=10?1:0},e.popCount=function(t){return 16843009*((t=(858993459&(t-=t>>>1&1431655765))+(t>>>2&858993459))+(t>>>4)&252645135)>>>24},e.countTrailingZeros=r,e.nextPow2=function(t){return t+=0===t,--t,t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,1+(t|=t>>>16)},e.prevPow2=function(t){return t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,(t|=t>>>16)-(t>>>1)},e.parity=function(t){return t^=t>>>16,t^=t>>>8,t^=t>>>4,27030>>>(t&=15)&1};var n=new Array(256);!function(t){for(var e=0;e<256;++e){var r=e,n=e,i=7;for(r>>>=1;r;r>>>=1)n<<=1,n|=1&r,--i;t[e]=n<>>8&255]<<16|n[t>>>16&255]<<8|n[t>>>24&255]},e.interleave2=function(t,e){return(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t&=65535)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e&=65535)|e<<8))|e<<4))|e<<2))|e<<1))<<1},e.deinterleave2=function(t,e){return(t=65535&((t=16711935&((t=252645135&((t=858993459&((t=t>>>e&1431655765)|t>>>1))|t>>>2))|t>>>4))|t>>>16))<<16>>16},e.interleave3=function(t,e,r){return t=1227133513&((t=3272356035&((t=251719695&((t=4278190335&((t&=1023)|t<<16))|t<<8))|t<<4))|t<<2),(t|=(e=1227133513&((e=3272356035&((e=251719695&((e=4278190335&((e&=1023)|e<<16))|e<<8))|e<<4))|e<<2))<<1)|(r=1227133513&((r=3272356035&((r=251719695&((r=4278190335&((r&=1023)|r<<16))|r<<8))|r<<4))|r<<2))<<2},e.deinterleave3=function(t,e){return(t=1023&((t=4278190335&((t=251719695&((t=3272356035&((t=t>>>e&1227133513)|t>>>2))|t>>>4))|t>>>8))|t>>>16))<<22>>22},e.nextCombination=function(t){var e=t|t-1;return e+1|(~e&-~e)-1>>>r(t)+1}},2014:function(t,e,r){\"use strict\";var n=r(3105),i=r(4623);function a(t,e){var r=t.length,n=t.length-e.length,i=Math.min;if(n)return n;switch(r){case 0:return 0;case 1:return t[0]-e[0];case 2:return(s=t[0]+t[1]-e[0]-e[1])||i(t[0],t[1])-i(e[0],e[1]);case 3:var a=t[0]+t[1],o=e[0]+e[1];if(s=a+t[2]-(o+e[2]))return s;var s,l=i(t[0],t[1]),u=i(e[0],e[1]);return(s=i(l,t[2])-i(u,e[2]))||i(l+t[2],a)-i(u+e[2],o);default:var c=t.slice(0);c.sort();var f=e.slice(0);f.sort();for(var h=0;h>1,s=a(t[o],e);s<=0?(0===s&&(i=o),r=o+1):s>0&&(n=o-1)}return i}function c(t,e){for(var r=new Array(t.length),i=0,o=r.length;i=t.length||0!==a(t[g],s)););}return r}function f(t,e){if(e<0)return[];for(var r=[],i=(1<>>c&1&&u.push(i[c]);e.push(u)}return s(e)},e.skeleton=f,e.boundary=function(t){for(var e=[],r=0,n=t.length;r>1:(t>>1)-1}function x(t){for(var e=y(t);;){var r=e,n=2*t+1,i=2*(t+1),a=t;if(n0;){var r=m(t);if(!(r>=0&&e0){var t=k[0];return g(0,M-1),M-=1,x(0),t}return-1}function w(t,e){var r=k[t];return u[r]===e?t:(u[r]=-1/0,b(t),_(),u[r]=e,b((M+=1)-1))}function T(t){if(!c[t]){c[t]=!0;var e=s[t],r=l[t];s[r]>=0&&(s[r]=e),l[e]>=0&&(l[e]=r),A[e]>=0&&w(A[e],v(e)),A[r]>=0&&w(A[r],v(r))}}var k=[],A=new Array(a);for(f=0;f>1;f>=0;--f)x(f);for(;;){var S=_();if(S<0||u[S]>r)break;T(S)}var E=[];for(f=0;f=0&&r>=0&&e!==r){var n=A[e],i=A[r];n!==i&&C.push([n,i])}})),i.unique(i.normalize(C)),{positions:E,edges:C}};var n=r(3250),i=r(2014)},1303:function(t,e,r){\"use strict\";t.exports=function(t,e){var r,a,o,s;if(e[0][0]e[1][0]))return i(e,t);r=e[1],a=e[0]}if(t[0][0]t[1][0]))return-i(t,e);o=t[1],s=t[0]}var l=n(r,a,s),u=n(r,a,o);if(l<0){if(u<=0)return l}else if(l>0){if(u>=0)return l}else if(u)return u;if(l=n(s,o,a),u=n(s,o,r),l<0){if(u<=0)return l}else if(l>0){if(u>=0)return l}else if(u)return u;return a[0]-s[0]};var n=r(3250);function i(t,e){var r,i,a,o;if(e[0][0]e[1][0])){var s=Math.min(t[0][1],t[1][1]),l=Math.max(t[0][1],t[1][1]),u=Math.min(e[0][1],e[1][1]),c=Math.max(e[0][1],e[1][1]);return lc?s-c:l-c}r=e[1],i=e[0]}t[0][1]0)if(e[0]!==o[1][0])r=t,t=t.right;else{if(l=u(t.right,e))return l;t=t.left}else{if(e[0]!==o[1][0])return t;var l;if(l=u(t.right,e))return l;t=t.left}}return r}function c(t,e,r,n){this.y=t,this.index=e,this.start=r,this.closed=n}function f(t,e,r,n){this.x=t,this.segment=e,this.create=r,this.index=n}s.prototype.castUp=function(t){var e=n.le(this.coordinates,t[0]);if(e<0)return-1;this.slabs[e];var r=u(this.slabs[e],t),i=-1;if(r&&(i=r.value),this.coordinates[e]===t[0]){var s=null;if(r&&(s=r.key),e>0){var c=u(this.slabs[e-1],t);c&&(s?o(c.key,s)>0&&(s=c.key,i=c.value):(i=c.value,s=c.key))}var f=this.horizontal[e];if(f.length>0){var h=n.ge(f,t[1],l);if(h=f.length)return i;p=f[h]}}if(p.start)if(s){var d=a(s[0],s[1],[t[0],p.y]);s[0][0]>s[1][0]&&(d=-d),d>0&&(i=p.index)}else i=p.index;else p.y!==t[1]&&(i=p.index)}}}return i}},5202:function(t,e,r){\"use strict\";var n=r(1944),i=r(8210);function a(t,e){var r=i(n(t,e),[e[e.length-1]]);return r[r.length-1]}function o(t,e,r,n){var i=-e/(n-e);i<0?i=0:i>1&&(i=1);for(var a=1-i,o=t.length,s=new Array(o),l=0;l0||i>0&&c<0){var f=o(s,c,l,i);r.push(f),n.push(f.slice())}c<0?n.push(l.slice()):c>0?r.push(l.slice()):(r.push(l.slice()),n.push(l.slice())),i=c}return{positive:r,negative:n}},t.exports.positive=function(t,e){for(var r=[],n=a(t[t.length-1],e),i=t[t.length-1],s=t[0],l=0;l0||n>0&&u<0)&&r.push(o(i,u,s,n)),u>=0&&r.push(s.slice()),n=u}return r},t.exports.negative=function(t,e){for(var r=[],n=a(t[t.length-1],e),i=t[t.length-1],s=t[0],l=0;l0||n>0&&u<0)&&r.push(o(i,u,s,n)),u<=0&&r.push(s.slice()),n=u}return r}},3387:function(t,e,r){var n;!function(){\"use strict\";var i={not_string:/[^s]/,not_bool:/[^t]/,not_type:/[^T]/,not_primitive:/[^v]/,number:/[diefg]/,numeric_arg:/[bcdiefguxX]/,json:/[j]/,not_json:/[^j]/,text:/^[^\\x25]+/,modulo:/^\\x25{2}/,placeholder:/^\\x25(?:([1-9]\\d*)\\$|\\(([^)]+)\\))?(\\+)?(0|'[^$])?(-)?(\\d+)?(?:\\.(\\d+))?([b-gijostTuvxX])/,key:/^([a-z_][a-z_\\d]*)/i,key_access:/^\\.([a-z_][a-z_\\d]*)/i,index_access:/^\\[(\\d+)\\]/,sign:/^[+-]/};function a(t){return function(t,e){var r,n,o,s,l,u,c,f,h,p=1,d=t.length,v=\"\";for(n=0;n=0),s.type){case\"b\":r=parseInt(r,10).toString(2);break;case\"c\":r=String.fromCharCode(parseInt(r,10));break;case\"d\":case\"i\":r=parseInt(r,10);break;case\"j\":r=JSON.stringify(r,null,s.width?parseInt(s.width):0);break;case\"e\":r=s.precision?parseFloat(r).toExponential(s.precision):parseFloat(r).toExponential();break;case\"f\":r=s.precision?parseFloat(r).toFixed(s.precision):parseFloat(r);break;case\"g\":r=s.precision?String(Number(r.toPrecision(s.precision))):parseFloat(r);break;case\"o\":r=(parseInt(r,10)>>>0).toString(8);break;case\"s\":r=String(r),r=s.precision?r.substring(0,s.precision):r;break;case\"t\":r=String(!!r),r=s.precision?r.substring(0,s.precision):r;break;case\"T\":r=Object.prototype.toString.call(r).slice(8,-1).toLowerCase(),r=s.precision?r.substring(0,s.precision):r;break;case\"u\":r=parseInt(r,10)>>>0;break;case\"v\":r=r.valueOf(),r=s.precision?r.substring(0,s.precision):r;break;case\"x\":r=(parseInt(r,10)>>>0).toString(16);break;case\"X\":r=(parseInt(r,10)>>>0).toString(16).toUpperCase()}i.json.test(s.type)?v+=r:(!i.number.test(s.type)||f&&!s.sign?h=\"\":(h=f?\"+\":\"-\",r=r.toString().replace(i.sign,\"\")),u=s.pad_char?\"0\"===s.pad_char?\"0\":s.pad_char.charAt(1):\" \",c=s.width-(h+r).length,l=s.width&&c>0?u.repeat(c):\"\",v+=s.align?h+r+l:\"0\"===u?h+l+r:l+h+r)}return v}(function(t){if(s[t])return s[t];for(var e,r=t,n=[],a=0;r;){if(null!==(e=i.text.exec(r)))n.push(e[0]);else if(null!==(e=i.modulo.exec(r)))n.push(\"%\");else{if(null===(e=i.placeholder.exec(r)))throw new SyntaxError(\"[sprintf] unexpected placeholder\");if(e[2]){a|=1;var o=[],l=e[2],u=[];if(null===(u=i.key.exec(l)))throw new SyntaxError(\"[sprintf] failed to parse named argument key\");for(o.push(u[1]);\"\"!==(l=l.substring(u[0].length));)if(null!==(u=i.key_access.exec(l)))o.push(u[1]);else{if(null===(u=i.index_access.exec(l)))throw new SyntaxError(\"[sprintf] failed to parse named argument key\");o.push(u[1])}e[2]=o}else a|=2;if(3===a)throw new Error(\"[sprintf] mixing positional and named placeholders is not (yet) supported\");n.push({placeholder:e[0],param_no:e[1],keys:e[2],sign:e[3],pad_char:e[4],align:e[5],width:e[6],precision:e[7],type:e[8]})}r=r.substring(e[0].length)}return s[t]=n}(t),arguments)}function o(t,e){return a.apply(null,[t].concat(e||[]))}var s=Object.create(null);e.sprintf=a,e.vsprintf=o,\"undefined\"!=typeof window&&(window.sprintf=a,window.vsprintf=o,void 0===(n=function(){return{sprintf:a,vsprintf:o}}.call(e,r,e,t))||(t.exports=n))}()},3711:function(t,e,r){\"use strict\";t.exports=function(t,e){if(t.dimension<=0)return{positions:[],cells:[]};if(1===t.dimension)return function(t,e){for(var r=i(t,e),n=r.length,a=new Array(n),o=new Array(n),s=0;sn|0},vertex:function(t,e,r,n,i,a,o,s,l,u,c,f,h){var p=(o<<0)+(s<<1)+(l<<2)+(u<<3)|0;if(0!==p&&15!==p)switch(p){case 0:case 15:c.push([t-.5,e-.5]);break;case 1:c.push([t-.25-.25*(n+r-2*h)/(r-n),e-.25-.25*(i+r-2*h)/(r-i)]);break;case 2:c.push([t-.75-.25*(-n-r+2*h)/(n-r),e-.25-.25*(a+n-2*h)/(n-a)]);break;case 3:c.push([t-.5,e-.5-.5*(i+r+a+n-4*h)/(r-i+n-a)]);break;case 4:c.push([t-.25-.25*(a+i-2*h)/(i-a),e-.75-.25*(-i-r+2*h)/(i-r)]);break;case 5:c.push([t-.5-.5*(n+r+a+i-4*h)/(r-n+i-a),e-.5]);break;case 6:c.push([t-.5-.25*(-n-r+a+i)/(n-r+i-a),e-.5-.25*(-i-r+a+n)/(i-r+n-a)]);break;case 7:c.push([t-.75-.25*(a+i-2*h)/(i-a),e-.75-.25*(a+n-2*h)/(n-a)]);break;case 8:c.push([t-.75-.25*(-a-i+2*h)/(a-i),e-.75-.25*(-a-n+2*h)/(a-n)]);break;case 9:c.push([t-.5-.25*(n+r+-a-i)/(r-n+a-i),e-.5-.25*(i+r+-a-n)/(r-i+a-n)]);break;case 10:c.push([t-.5-.5*(-n-r-a-i+4*h)/(n-r+a-i),e-.5]);break;case 11:c.push([t-.25-.25*(-a-i+2*h)/(a-i),e-.75-.25*(i+r-2*h)/(r-i)]);break;case 12:c.push([t-.5,e-.5-.5*(-i-r-a-n+4*h)/(i-r+a-n)]);break;case 13:c.push([t-.75-.25*(n+r-2*h)/(r-n),e-.25-.25*(-a-n+2*h)/(a-n)]);break;case 14:c.push([t-.25-.25*(-n-r+2*h)/(n-r),e-.25-.25*(-i-r+2*h)/(i-r)])}},cell:function(t,e,r,n,i,a,o,s,l){i?s.push([t,e]):s.push([e,t])}});return function(t,e){var r=[],i=[];return n(t,r,i,e),{positions:r,cells:i}}}},o={}},529:function(t,e,r){\"use strict\";t.exports=function t(e,r,n){var a=(n=n||{}).fontStyle||\"normal\",s=n.fontWeight||\"normal\",l=n.fontVariant||\"normal\",u=[a,s,l,e].join(\"_\"),c=o[u];c||(c=o[u]={\" \":{data:new Float32Array(0),shape:.2}});var f=c[r];if(!f)if(r.length<=1||!/\\d/.test(r))f=c[r]=function(t){for(var e=t.cells,r=t.positions,n=new Float32Array(6*e.length),i=0,a=0,o=0;o0&&(v+=.02);var y=new Float32Array(d),m=0,x=-.5*v;for(g=0;gMath.max(r,n)?i[2]=1:r>Math.max(e,n)?i[0]=1:i[1]=1;for(var a=0,o=0,l=0;l<3;++l)a+=t[l]*t[l],o+=i[l]*t[l];for(l=0;l<3;++l)i[l]-=o/a*t[l];return s(i,i),i}function h(t,e,r,i,a,o,s,l){this.center=n(r),this.up=n(i),this.right=n(a),this.radius=n([o]),this.angle=n([s,l]),this.angle.bounds=[[-1/0,-Math.PI/2],[1/0,Math.PI/2]],this.setDistanceLimits(t,e),this.computedCenter=this.center.curve(0),this.computedUp=this.up.curve(0),this.computedRight=this.right.curve(0),this.computedRadius=this.radius.curve(0),this.computedAngle=this.angle.curve(0),this.computedToward=[0,0,0],this.computedEye=[0,0,0],this.computedMatrix=new Array(16);for(var u=0;u<16;++u)this.computedMatrix[u]=.5;this.recalcMatrix(0)}var p=h.prototype;p.setDistanceLimits=function(t,e){t=t>0?Math.log(t):-1/0,e=e>0?Math.log(e):1/0,e=Math.max(e,t),this.radius.bounds[0][0]=t,this.radius.bounds[1][0]=e},p.getDistanceLimits=function(t){var e=this.radius.bounds[0];return t?(t[0]=Math.exp(e[0][0]),t[1]=Math.exp(e[1][0]),t):[Math.exp(e[0][0]),Math.exp(e[1][0])]},p.recalcMatrix=function(t){this.center.curve(t),this.up.curve(t),this.right.curve(t),this.radius.curve(t),this.angle.curve(t);for(var e=this.computedUp,r=this.computedRight,n=0,i=0,a=0;a<3;++a)i+=e[a]*r[a],n+=e[a]*e[a];var l=Math.sqrt(n),c=0;for(a=0;a<3;++a)r[a]-=e[a]*i/n,c+=r[a]*r[a],e[a]/=l;var f=Math.sqrt(c);for(a=0;a<3;++a)r[a]/=f;var h=this.computedToward;o(h,e,r),s(h,h);var p=Math.exp(this.computedRadius[0]),d=this.computedAngle[0],v=this.computedAngle[1],g=Math.cos(d),y=Math.sin(d),m=Math.cos(v),x=Math.sin(v),b=this.computedCenter,_=g*m,w=y*m,T=x,k=-g*x,A=-y*x,M=m,S=this.computedEye,E=this.computedMatrix;for(a=0;a<3;++a){var L=_*r[a]+w*h[a]+T*e[a];E[4*a+1]=k*r[a]+A*h[a]+M*e[a],E[4*a+2]=L,E[4*a+3]=0}var C=E[1],P=E[5],O=E[9],I=E[2],z=E[6],D=E[10],R=P*D-O*z,F=O*I-C*D,B=C*z-P*I,N=u(R,F,B);for(R/=N,F/=N,B/=N,E[0]=R,E[4]=F,E[8]=B,a=0;a<3;++a)S[a]=b[a]+E[2+4*a]*p;for(a=0;a<3;++a){c=0;for(var j=0;j<3;++j)c+=E[a+4*j]*S[j];E[12+a]=-c}E[15]=1},p.getMatrix=function(t,e){this.recalcMatrix(t);var r=this.computedMatrix;if(e){for(var n=0;n<16;++n)e[n]=r[n];return e}return r};var d=[0,0,0];p.rotate=function(t,e,r,n){if(this.angle.move(t,e,r),n){this.recalcMatrix(t);var i=this.computedMatrix;d[0]=i[2],d[1]=i[6],d[2]=i[10];for(var o=this.computedUp,s=this.computedRight,l=this.computedToward,u=0;u<3;++u)i[4*u]=o[u],i[4*u+1]=s[u],i[4*u+2]=l[u];for(a(i,i,n,d),u=0;u<3;++u)o[u]=i[4*u],s[u]=i[4*u+1];this.up.set(t,o[0],o[1],o[2]),this.right.set(t,s[0],s[1],s[2])}},p.pan=function(t,e,r,n){e=e||0,r=r||0,n=n||0,this.recalcMatrix(t);var i=this.computedMatrix,a=(Math.exp(this.computedRadius[0]),i[1]),o=i[5],s=i[9],l=u(a,o,s);a/=l,o/=l,s/=l;var c=i[0],f=i[4],h=i[8],p=c*a+f*o+h*s,d=u(c-=a*p,f-=o*p,h-=s*p),v=(c/=d)*e+a*r,g=(f/=d)*e+o*r,y=(h/=d)*e+s*r;this.center.move(t,v,g,y);var m=Math.exp(this.computedRadius[0]);m=Math.max(1e-4,m+n),this.radius.set(t,Math.log(m))},p.translate=function(t,e,r,n){this.center.move(t,e||0,r||0,n||0)},p.setMatrix=function(t,e,r,n){var a=1;\"number\"==typeof r&&(a=0|r),(a<0||a>3)&&(a=1);var o=(a+2)%3;e||(this.recalcMatrix(t),e=this.computedMatrix);var s=e[a],l=e[a+4],f=e[a+8];if(n){var h=Math.abs(s),p=Math.abs(l),d=Math.abs(f),v=Math.max(h,p,d);h===v?(s=s<0?-1:1,l=f=0):d===v?(f=f<0?-1:1,s=l=0):(l=l<0?-1:1,s=f=0)}else{var g=u(s,l,f);s/=g,l/=g,f/=g}var y,m,x=e[o],b=e[o+4],_=e[o+8],w=x*s+b*l+_*f,T=u(x-=s*w,b-=l*w,_-=f*w),k=l*(_/=T)-f*(b/=T),A=f*(x/=T)-s*_,M=s*b-l*x,S=u(k,A,M);if(k/=S,A/=S,M/=S,this.center.jump(t,H,G,W),this.radius.idle(t),this.up.jump(t,s,l,f),this.right.jump(t,x,b,_),2===a){var E=e[1],L=e[5],C=e[9],P=E*x+L*b+C*_,O=E*k+L*A+C*M;y=R<0?-Math.PI/2:Math.PI/2,m=Math.atan2(O,P)}else{var I=e[2],z=e[6],D=e[10],R=I*s+z*l+D*f,F=I*x+z*b+D*_,B=I*k+z*A+D*M;y=Math.asin(c(R)),m=Math.atan2(B,F)}this.angle.jump(t,m,y),this.recalcMatrix(t);var N=e[2],j=e[6],U=e[10],V=this.computedMatrix;i(V,e);var q=V[15],H=V[12]/q,G=V[13]/q,W=V[14]/q,Y=Math.exp(this.computedRadius[0]);this.center.jump(t,H-N*Y,G-j*Y,W-U*Y)},p.lastT=function(){return Math.max(this.center.lastT(),this.up.lastT(),this.right.lastT(),this.radius.lastT(),this.angle.lastT())},p.idle=function(t){this.center.idle(t),this.up.idle(t),this.right.idle(t),this.radius.idle(t),this.angle.idle(t)},p.flush=function(t){this.center.flush(t),this.up.flush(t),this.right.flush(t),this.radius.flush(t),this.angle.flush(t)},p.setDistance=function(t,e){e>0&&this.radius.set(t,Math.log(e))},p.lookAt=function(t,e,r,n){this.recalcMatrix(t),e=e||this.computedEye,r=r||this.computedCenter;var i=(n=n||this.computedUp)[0],a=n[1],o=n[2],s=u(i,a,o);if(!(s<1e-6)){i/=s,a/=s,o/=s;var l=e[0]-r[0],f=e[1]-r[1],h=e[2]-r[2],p=u(l,f,h);if(!(p<1e-6)){l/=p,f/=p,h/=p;var d=this.computedRight,v=d[0],g=d[1],y=d[2],m=i*v+a*g+o*y,x=u(v-=m*i,g-=m*a,y-=m*o);if(!(x<.01&&(x=u(v=a*h-o*f,g=o*l-i*h,y=i*f-a*l))<1e-6)){v/=x,g/=x,y/=x,this.up.set(t,i,a,o),this.right.set(t,v,g,y),this.center.set(t,r[0],r[1],r[2]),this.radius.set(t,Math.log(p));var b=a*y-o*g,_=o*v-i*y,w=i*g-a*v,T=u(b,_,w),k=i*l+a*f+o*h,A=v*l+g*f+y*h,M=(b/=T)*l+(_/=T)*f+(w/=T)*h,S=Math.asin(c(k)),E=Math.atan2(M,A),L=this.angle._state,C=L[L.length-1],P=L[L.length-2];C%=2*Math.PI;var O=Math.abs(C+2*Math.PI-E),I=Math.abs(C-E),z=Math.abs(C-2*Math.PI-E);O0?r.pop():new ArrayBuffer(t)}function d(t){return new Uint8Array(p(t),0,t)}function v(t){return new Uint16Array(p(2*t),0,t)}function g(t){return new Uint32Array(p(4*t),0,t)}function y(t){return new Int8Array(p(t),0,t)}function m(t){return new Int16Array(p(2*t),0,t)}function x(t){return new Int32Array(p(4*t),0,t)}function b(t){return new Float32Array(p(4*t),0,t)}function _(t){return new Float64Array(p(8*t),0,t)}function w(t){return o?new Uint8ClampedArray(p(t),0,t):d(t)}function T(t){return s?new BigUint64Array(p(8*t),0,t):null}function k(t){return l?new BigInt64Array(p(8*t),0,t):null}function A(t){return new DataView(p(t),0,t)}function M(t){t=n.nextPow2(t);var e=n.log2(t),r=f[e];return r.length>0?r.pop():new a(t)}e.free=function(t){if(a.isBuffer(t))f[n.log2(t.length)].push(t);else{if(\"[object ArrayBuffer]\"!==Object.prototype.toString.call(t)&&(t=t.buffer),!t)return;var e=t.length||t.byteLength,r=0|n.log2(e);c[r].push(t)}},e.freeUint8=e.freeUint16=e.freeUint32=e.freeBigUint64=e.freeInt8=e.freeInt16=e.freeInt32=e.freeBigInt64=e.freeFloat32=e.freeFloat=e.freeFloat64=e.freeDouble=e.freeUint8Clamped=e.freeDataView=function(t){h(t.buffer)},e.freeArrayBuffer=h,e.freeBuffer=function(t){f[n.log2(t.length)].push(t)},e.malloc=function(t,e){if(void 0===e||\"arraybuffer\"===e)return p(t);switch(e){case\"uint8\":return d(t);case\"uint16\":return v(t);case\"uint32\":return g(t);case\"int8\":return y(t);case\"int16\":return m(t);case\"int32\":return x(t);case\"float\":case\"float32\":return b(t);case\"double\":case\"float64\":return _(t);case\"uint8_clamped\":return w(t);case\"bigint64\":return k(t);case\"biguint64\":return T(t);case\"buffer\":return M(t);case\"data\":case\"dataview\":return A(t);default:return null}return null},e.mallocArrayBuffer=p,e.mallocUint8=d,e.mallocUint16=v,e.mallocUint32=g,e.mallocInt8=y,e.mallocInt16=m,e.mallocInt32=x,e.mallocFloat32=e.mallocFloat=b,e.mallocFloat64=e.mallocDouble=_,e.mallocUint8Clamped=w,e.mallocBigUint64=T,e.mallocBigInt64=k,e.mallocDataView=A,e.mallocBuffer=M,e.clearCache=function(){for(var t=0;t<32;++t)u.UINT8[t].length=0,u.UINT16[t].length=0,u.UINT32[t].length=0,u.INT8[t].length=0,u.INT16[t].length=0,u.INT32[t].length=0,u.FLOAT[t].length=0,u.DOUBLE[t].length=0,u.BIGUINT64[t].length=0,u.BIGINT64[t].length=0,u.UINT8C[t].length=0,c[t].length=0,f[t].length=0}},1755:function(t){\"use strict\";function e(t){this.roots=new Array(t),this.ranks=new Array(t);for(var e=0;e0&&(a=n.size),n.lineSpacing&&n.lineSpacing>0&&(o=n.lineSpacing),n.styletags&&n.styletags.breaklines&&(s.breaklines=!!n.styletags.breaklines),n.styletags&&n.styletags.bolds&&(s.bolds=!!n.styletags.bolds),n.styletags&&n.styletags.italics&&(s.italics=!!n.styletags.italics),n.styletags&&n.styletags.subscripts&&(s.subscripts=!!n.styletags.subscripts),n.styletags&&n.styletags.superscripts&&(s.superscripts=!!n.styletags.superscripts)),r.font=[n.fontStyle,n.fontVariant,n.fontWeight,a+\"px\",n.font].filter((function(t){return t})).join(\" \"),r.textAlign=\"start\",r.textBaseline=\"alphabetic\",r.direction=\"ltr\",w(function(t,e,r,n,a,o){r=r.replace(/\\n/g,\"\"),r=!0===o.breaklines?r.replace(/\\/g,\"\\n\"):r.replace(/\\/g,\" \");var s=\"\",l=[];for(T=0;T-1?parseInt(t[1+i]):0,l=a>-1?parseInt(r[1+a]):0;s!==l&&(n=n.replace(F(),\"?px \"),M*=Math.pow(.75,l-s),n=n.replace(\"?px \",F())),A+=.25*L*(l-s)}if(!0===o.superscripts){var u=t.indexOf(d),f=r.indexOf(d),p=u>-1?parseInt(t[1+u]):0,v=f>-1?parseInt(r[1+f]):0;p!==v&&(n=n.replace(F(),\"?px \"),M*=Math.pow(.75,v-p),n=n.replace(\"?px \",F())),A-=.25*L*(v-p)}if(!0===o.bolds){var g=t.indexOf(c)>-1,m=r.indexOf(c)>-1;!g&&m&&(n=x?n.replace(\"italic \",\"italic bold \"):\"bold \"+n),g&&!m&&(n=n.replace(\"bold \",\"\"))}if(!0===o.italics){var x=t.indexOf(h)>-1,b=r.indexOf(h)>-1;!x&&b&&(n=\"italic \"+n),x&&!b&&(n=n.replace(\"italic \",\"\"))}e.font=n}for(w=0;w\",a=\"\",o=i.length,s=a.length,l=e[0]===d||e[0]===y,u=0,c=-s;u>-1&&-1!==(u=r.indexOf(i,u))&&-1!==(c=r.indexOf(a,u+o))&&!(c<=u);){for(var f=u;f=c)n[f]=null,r=r.substr(0,f)+\" \"+r.substr(f+1);else if(null!==n[f]){var h=n[f].indexOf(e[0]);-1===h?n[f]+=e:l&&(n[f]=n[f].substr(0,h+1)+(1+parseInt(n[f][h+1]))+n[f].substr(h+2))}var p=u+o,v=r.substr(p,c-p).indexOf(i);u=-1!==v?v:c+s}return n}function b(t,e){var r=n(t,128);return e?a(r.cells,r.positions,.25):{edges:r.cells,positions:r.positions}}function _(t,e,r,n){var i=b(t,n),a=function(t,e,r){for(var n=e.textAlign||\"start\",i=e.textBaseline||\"alphabetic\",a=[1<<30,1<<30],o=[0,0],s=t.length,l=0;l=0?e[a]:i}))},has___:{value:x((function(e){var n=m(e);return n?r in n:t.indexOf(e)>=0}))},set___:{value:x((function(n,i){var a,o=m(n);return o?o[r]=i:(a=t.indexOf(n))>=0?e[a]=i:(a=t.length,e[a]=i,t[a]=n),this}))},delete___:{value:x((function(n){var i,a,o=m(n);return o?r in o&&delete o[r]:!((i=t.indexOf(n))<0||(a=t.length-1,t[i]=void 0,e[i]=e[a],t[i]=t[a],t.length=a,e.length=a,0))}))}})};v.prototype=Object.create(Object.prototype,{get:{value:function(t,e){return this.get___(t,e)},writable:!0,configurable:!0},has:{value:function(t){return this.has___(t)},writable:!0,configurable:!0},set:{value:function(t,e){return this.set___(t,e)},writable:!0,configurable:!0},delete:{value:function(t){return this.delete___(t)},writable:!0,configurable:!0}}),\"function\"==typeof r?function(){function n(){this instanceof v||b();var t,n=new r,i=void 0,a=!1;return t=e?function(t,e){return n.set(t,e),n.has(t)||(i||(i=new v),i.set(t,e)),this}:function(t,e){if(a)try{n.set(t,e)}catch(r){i||(i=new v),i.set___(t,e)}else n.set(t,e);return this},Object.create(v.prototype,{get___:{value:x((function(t,e){return i?n.has(t)?n.get(t):i.get___(t,e):n.get(t,e)}))},has___:{value:x((function(t){return n.has(t)||!!i&&i.has___(t)}))},set___:{value:x(t)},delete___:{value:x((function(t){var e=!!n.delete(t);return i&&i.delete___(t)||e}))},permitHostObjects___:{value:x((function(t){if(t!==g)throw new Error(\"bogus call to permitHostObjects___\");a=!0}))}})}e&&\"undefined\"!=typeof Proxy&&(Proxy=void 0),n.prototype=v.prototype,t.exports=n,Object.defineProperty(WeakMap.prototype,\"constructor\",{value:WeakMap,enumerable:!1,configurable:!0,writable:!0})}():(\"undefined\"!=typeof Proxy&&(Proxy=void 0),t.exports=v)}function g(t){t.permitHostObjects___&&t.permitHostObjects___(g)}function y(t){return!(t.substr(0,8)==l&&\"___\"===t.substr(t.length-3))}function m(t){if(t!==Object(t))throw new TypeError(\"Not an object: \"+t);var e=t[u];if(e&&e.key===t)return e;if(s(t)){e={key:t};try{return o(t,u,{value:e,writable:!1,enumerable:!1,configurable:!1}),e}catch(t){return}}}function x(t){return t.prototype=null,Object.freeze(t)}function b(){p||\"undefined\"==typeof console||(p=!0,console.warn(\"WeakMap should be invoked as new WeakMap(), not WeakMap(). This will be an error in the future.\"))}}()},236:function(t,e,r){var n=r(8284);t.exports=function(){var t={};return function(e){if((\"object\"!=typeof e||null===e)&&\"function\"!=typeof e)throw new Error(\"Weakmap-shim: Key must be object\");var r=e.valueOf(t);return r&&r.identity===t?r:n(e,t)}}},8284:function(t){t.exports=function(t,e){var r={identity:e},n=t.valueOf;return Object.defineProperty(t,\"valueOf\",{value:function(t){return t!==e?n.apply(this,arguments):r},writable:!0}),r}},606:function(t,e,r){var n=r(236);t.exports=function(){var t=n();return{get:function(e,r){var n=t(e);return n.hasOwnProperty(\"value\")?n.value:r},set:function(e,r){return t(e).value=r,this},has:function(e){return\"value\"in t(e)},delete:function(e){return delete t(e).value}}}},3349:function(t){\"use strict\";t.exports=function(t){var e={};return function(r,n,i){var a=r.dtype,o=r.order,s=[a,o.join()].join(),l=e[s];return l||(e[s]=l=t([a,o])),l(r.shape.slice(0),r.data,r.stride,0|r.offset,n,i)}}(function(){return function(t,e,r,n,i,a){var o=t[0],s=r[0],l=[0],u=s;n|=0;var c=0,f=s;for(c=0;c=0!=p>=0&&i.push(l[0]+.5+.5*(h+p)/(h-p)),n+=f,++l[0]}}}.bind(void 0,{funcName:\"zeroCrossings\"}))},781:function(t,e,r){\"use strict\";t.exports=function(t,e){var r=[];return e=+e||0,n(t.hi(t.shape[0]-1),r,e),r};var n=r(3349)},7790:function(){}},r={};function i(t){var n=r[t];if(void 0!==n)return n.exports;var a=r[t]={id:t,loaded:!1,exports:{}};return e[t].call(a.exports,a,a.exports,i),a.loaded=!0,a.exports}i.g=function(){if(\"object\"==typeof globalThis)return globalThis;try{return this||new Function(\"return this\")()}catch(t){if(\"object\"==typeof window)return window}}(),i.nmd=function(t){return t.paths=[],t.children||(t.children=[]),t};var a=i(1964);t.exports=a}()},33576:function(t,e,r){\"use strict\";function n(t,e){for(var r=0;rf)throw new RangeError('The value \"'+t+'\" is invalid for option \"size\"');var e=new Uint8Array(t);return Object.setPrototypeOf(e,p.prototype),e}function p(t,e,r){if(\"number\"==typeof t){if(\"string\"==typeof e)throw new TypeError('The \"string\" argument must be of type string. Received type number');return g(t)}return d(t,e,r)}function d(t,e,r){if(\"string\"==typeof t)return function(t,e){if(\"string\"==typeof e&&\"\"!==e||(e=\"utf8\"),!p.isEncoding(e))throw new TypeError(\"Unknown encoding: \"+e);var r=0|b(t,e),n=h(r),i=n.write(t,e);return i!==r&&(n=n.slice(0,i)),n}(t,e);if(ArrayBuffer.isView(t))return function(t){if(tt(t,Uint8Array)){var e=new Uint8Array(t);return m(e.buffer,e.byteOffset,e.byteLength)}return y(t)}(t);if(null==t)throw new TypeError(\"The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type \"+s(t));if(tt(t,ArrayBuffer)||t&&tt(t.buffer,ArrayBuffer))return m(t,e,r);if(\"undefined\"!=typeof SharedArrayBuffer&&(tt(t,SharedArrayBuffer)||t&&tt(t.buffer,SharedArrayBuffer)))return m(t,e,r);if(\"number\"==typeof t)throw new TypeError('The \"value\" argument must not be of type number. Received type number');var n=t.valueOf&&t.valueOf();if(null!=n&&n!==t)return p.from(n,e,r);var i=function(t){if(p.isBuffer(t)){var e=0|x(t.length),r=h(e);return 0===r.length||t.copy(r,0,0,e),r}return void 0!==t.length?\"number\"!=typeof t.length||et(t.length)?h(0):y(t):\"Buffer\"===t.type&&Array.isArray(t.data)?y(t.data):void 0}(t);if(i)return i;if(\"undefined\"!=typeof Symbol&&null!=Symbol.toPrimitive&&\"function\"==typeof t[Symbol.toPrimitive])return p.from(t[Symbol.toPrimitive](\"string\"),e,r);throw new TypeError(\"The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type \"+s(t))}function v(t){if(\"number\"!=typeof t)throw new TypeError('\"size\" argument must be of type number');if(t<0)throw new RangeError('The value \"'+t+'\" is invalid for option \"size\"')}function g(t){return v(t),h(t<0?0:0|x(t))}function y(t){for(var e=t.length<0?0:0|x(t.length),r=h(e),n=0;n=f)throw new RangeError(\"Attempt to allocate Buffer larger than maximum size: 0x\"+f.toString(16)+\" bytes\");return 0|t}function b(t,e){if(p.isBuffer(t))return t.length;if(ArrayBuffer.isView(t)||tt(t,ArrayBuffer))return t.byteLength;if(\"string\"!=typeof t)throw new TypeError('The \"string\" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+s(t));var r=t.length,n=arguments.length>2&&!0===arguments[2];if(!n&&0===r)return 0;for(var i=!1;;)switch(e){case\"ascii\":case\"latin1\":case\"binary\":return r;case\"utf8\":case\"utf-8\":return J(t).length;case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return 2*r;case\"hex\":return r>>>1;case\"base64\":return $(t).length;default:if(i)return n?-1:J(t).length;e=(\"\"+e).toLowerCase(),i=!0}}function _(t,e,r){var n=!1;if((void 0===e||e<0)&&(e=0),e>this.length)return\"\";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return\"\";if((r>>>=0)<=(e>>>=0))return\"\";for(t||(t=\"utf8\");;)switch(t){case\"hex\":return D(this,e,r);case\"utf8\":case\"utf-8\":return P(this,e,r);case\"ascii\":return I(this,e,r);case\"latin1\":case\"binary\":return z(this,e,r);case\"base64\":return C(this,e,r);case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return R(this,e,r);default:if(n)throw new TypeError(\"Unknown encoding: \"+t);t=(t+\"\").toLowerCase(),n=!0}}function w(t,e,r){var n=t[e];t[e]=t[r],t[r]=n}function T(t,e,r,n,i){if(0===t.length)return-1;if(\"string\"==typeof r?(n=r,r=0):r>2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),et(r=+r)&&(r=i?0:t.length-1),r<0&&(r=t.length+r),r>=t.length){if(i)return-1;r=t.length-1}else if(r<0){if(!i)return-1;r=0}if(\"string\"==typeof e&&(e=p.from(e,n)),p.isBuffer(e))return 0===e.length?-1:k(t,e,r,n,i);if(\"number\"==typeof e)return e&=255,\"function\"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(t,e,r):Uint8Array.prototype.lastIndexOf.call(t,e,r):k(t,[e],r,n,i);throw new TypeError(\"val must be string, number or Buffer\")}function k(t,e,r,n,i){var a,o=1,s=t.length,l=e.length;if(void 0!==n&&(\"ucs2\"===(n=String(n).toLowerCase())||\"ucs-2\"===n||\"utf16le\"===n||\"utf-16le\"===n)){if(t.length<2||e.length<2)return-1;o=2,s/=2,l/=2,r/=2}function u(t,e){return 1===o?t[e]:t.readUInt16BE(e*o)}if(i){var c=-1;for(a=r;as&&(r=s-l),a=r;a>=0;a--){for(var f=!0,h=0;hi&&(n=i):n=i;var a,o=e.length;for(n>o/2&&(n=o/2),a=0;a>8,i=r%256,a.push(i),a.push(n);return a}(e,t.length-r),t,r,n)}function C(t,e,r){return 0===e&&r===t.length?l.fromByteArray(t):l.fromByteArray(t.slice(e,r))}function P(t,e,r){r=Math.min(t.length,r);for(var n=[],i=e;i239?4:a>223?3:a>191?2:1;if(i+s<=r){var l=void 0,u=void 0,c=void 0,f=void 0;switch(s){case 1:a<128&&(o=a);break;case 2:128==(192&(l=t[i+1]))&&(f=(31&a)<<6|63&l)>127&&(o=f);break;case 3:l=t[i+1],u=t[i+2],128==(192&l)&&128==(192&u)&&(f=(15&a)<<12|(63&l)<<6|63&u)>2047&&(f<55296||f>57343)&&(o=f);break;case 4:l=t[i+1],u=t[i+2],c=t[i+3],128==(192&l)&&128==(192&u)&&128==(192&c)&&(f=(15&a)<<18|(63&l)<<12|(63&u)<<6|63&c)>65535&&f<1114112&&(o=f)}}null===o?(o=65533,s=1):o>65535&&(o-=65536,n.push(o>>>10&1023|55296),o=56320|1023&o),n.push(o),i+=s}return function(t){var e=t.length;if(e<=O)return String.fromCharCode.apply(String,t);for(var r=\"\",n=0;nn.length?(p.isBuffer(a)||(a=p.from(a)),a.copy(n,i)):Uint8Array.prototype.set.call(n,a,i);else{if(!p.isBuffer(a))throw new TypeError('\"list\" argument must be an Array of Buffers');a.copy(n,i)}i+=a.length}return n},p.byteLength=b,p.prototype._isBuffer=!0,p.prototype.swap16=function(){var t=this.length;if(t%2!=0)throw new RangeError(\"Buffer size must be a multiple of 16-bits\");for(var e=0;er&&(t+=\" ... \"),\"\"},c&&(p.prototype[c]=p.prototype.inspect),p.prototype.compare=function(t,e,r,n,i){if(tt(t,Uint8Array)&&(t=p.from(t,t.offset,t.byteLength)),!p.isBuffer(t))throw new TypeError('The \"target\" argument must be one of type Buffer or Uint8Array. Received type '+s(t));if(void 0===e&&(e=0),void 0===r&&(r=t?t.length:0),void 0===n&&(n=0),void 0===i&&(i=this.length),e<0||r>t.length||n<0||i>this.length)throw new RangeError(\"out of range index\");if(n>=i&&e>=r)return 0;if(n>=i)return-1;if(e>=r)return 1;if(this===t)return 0;for(var a=(i>>>=0)-(n>>>=0),o=(r>>>=0)-(e>>>=0),l=Math.min(a,o),u=this.slice(n,i),c=t.slice(e,r),f=0;f>>=0,isFinite(r)?(r>>>=0,void 0===n&&(n=\"utf8\")):(n=r,r=void 0)}var i=this.length-e;if((void 0===r||r>i)&&(r=i),t.length>0&&(r<0||e<0)||e>this.length)throw new RangeError(\"Attempt to write outside buffer bounds\");n||(n=\"utf8\");for(var a=!1;;)switch(n){case\"hex\":return A(this,t,e,r);case\"utf8\":case\"utf-8\":return M(this,t,e,r);case\"ascii\":case\"latin1\":case\"binary\":return S(this,t,e,r);case\"base64\":return E(this,t,e,r);case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return L(this,t,e,r);default:if(a)throw new TypeError(\"Unknown encoding: \"+n);n=(\"\"+n).toLowerCase(),a=!0}},p.prototype.toJSON=function(){return{type:\"Buffer\",data:Array.prototype.slice.call(this._arr||this,0)}};var O=4096;function I(t,e,r){var n=\"\";r=Math.min(t.length,r);for(var i=e;in)&&(r=n);for(var i=\"\",a=e;ar)throw new RangeError(\"Trying to access beyond buffer length\")}function B(t,e,r,n,i,a){if(!p.isBuffer(t))throw new TypeError('\"buffer\" argument must be a Buffer instance');if(e>i||et.length)throw new RangeError(\"Index out of range\")}function N(t,e,r,n,i){Y(e,n,i,t,r,7);var a=Number(e&BigInt(4294967295));t[r++]=a,a>>=8,t[r++]=a,a>>=8,t[r++]=a,a>>=8,t[r++]=a;var o=Number(e>>BigInt(32)&BigInt(4294967295));return t[r++]=o,o>>=8,t[r++]=o,o>>=8,t[r++]=o,o>>=8,t[r++]=o,r}function j(t,e,r,n,i){Y(e,n,i,t,r,7);var a=Number(e&BigInt(4294967295));t[r+7]=a,a>>=8,t[r+6]=a,a>>=8,t[r+5]=a,a>>=8,t[r+4]=a;var o=Number(e>>BigInt(32)&BigInt(4294967295));return t[r+3]=o,o>>=8,t[r+2]=o,o>>=8,t[r+1]=o,o>>=8,t[r]=o,r+8}function U(t,e,r,n,i,a){if(r+n>t.length)throw new RangeError(\"Index out of range\");if(r<0)throw new RangeError(\"Index out of range\")}function V(t,e,r,n,i){return e=+e,r>>>=0,i||U(t,0,r,4),u.write(t,e,r,n,23,4),r+4}function q(t,e,r,n,i){return e=+e,r>>>=0,i||U(t,0,r,8),u.write(t,e,r,n,52,8),r+8}p.prototype.slice=function(t,e){var r=this.length;(t=~~t)<0?(t+=r)<0&&(t=0):t>r&&(t=r),(e=void 0===e?r:~~e)<0?(e+=r)<0&&(e=0):e>r&&(e=r),e>>=0,e>>>=0,r||F(t,e,this.length);for(var n=this[t],i=1,a=0;++a>>=0,e>>>=0,r||F(t,e,this.length);for(var n=this[t+--e],i=1;e>0&&(i*=256);)n+=this[t+--e]*i;return n},p.prototype.readUint8=p.prototype.readUInt8=function(t,e){return t>>>=0,e||F(t,1,this.length),this[t]},p.prototype.readUint16LE=p.prototype.readUInt16LE=function(t,e){return t>>>=0,e||F(t,2,this.length),this[t]|this[t+1]<<8},p.prototype.readUint16BE=p.prototype.readUInt16BE=function(t,e){return t>>>=0,e||F(t,2,this.length),this[t]<<8|this[t+1]},p.prototype.readUint32LE=p.prototype.readUInt32LE=function(t,e){return t>>>=0,e||F(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},p.prototype.readUint32BE=p.prototype.readUInt32BE=function(t,e){return t>>>=0,e||F(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},p.prototype.readBigUInt64LE=nt((function(t){X(t>>>=0,\"offset\");var e=this[t],r=this[t+7];void 0!==e&&void 0!==r||Z(t,this.length-8);var n=e+this[++t]*Math.pow(2,8)+this[++t]*Math.pow(2,16)+this[++t]*Math.pow(2,24),i=this[++t]+this[++t]*Math.pow(2,8)+this[++t]*Math.pow(2,16)+r*Math.pow(2,24);return BigInt(n)+(BigInt(i)<>>=0,\"offset\");var e=this[t],r=this[t+7];void 0!==e&&void 0!==r||Z(t,this.length-8);var n=e*Math.pow(2,24)+this[++t]*Math.pow(2,16)+this[++t]*Math.pow(2,8)+this[++t],i=this[++t]*Math.pow(2,24)+this[++t]*Math.pow(2,16)+this[++t]*Math.pow(2,8)+r;return(BigInt(n)<>>=0,e>>>=0,r||F(t,e,this.length);for(var n=this[t],i=1,a=0;++a=(i*=128)&&(n-=Math.pow(2,8*e)),n},p.prototype.readIntBE=function(t,e,r){t>>>=0,e>>>=0,r||F(t,e,this.length);for(var n=e,i=1,a=this[t+--n];n>0&&(i*=256);)a+=this[t+--n]*i;return a>=(i*=128)&&(a-=Math.pow(2,8*e)),a},p.prototype.readInt8=function(t,e){return t>>>=0,e||F(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},p.prototype.readInt16LE=function(t,e){t>>>=0,e||F(t,2,this.length);var r=this[t]|this[t+1]<<8;return 32768&r?4294901760|r:r},p.prototype.readInt16BE=function(t,e){t>>>=0,e||F(t,2,this.length);var r=this[t+1]|this[t]<<8;return 32768&r?4294901760|r:r},p.prototype.readInt32LE=function(t,e){return t>>>=0,e||F(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},p.prototype.readInt32BE=function(t,e){return t>>>=0,e||F(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},p.prototype.readBigInt64LE=nt((function(t){X(t>>>=0,\"offset\");var e=this[t],r=this[t+7];void 0!==e&&void 0!==r||Z(t,this.length-8);var n=this[t+4]+this[t+5]*Math.pow(2,8)+this[t+6]*Math.pow(2,16)+(r<<24);return(BigInt(n)<>>=0,\"offset\");var e=this[t],r=this[t+7];void 0!==e&&void 0!==r||Z(t,this.length-8);var n=(e<<24)+this[++t]*Math.pow(2,16)+this[++t]*Math.pow(2,8)+this[++t];return(BigInt(n)<>>=0,e||F(t,4,this.length),u.read(this,t,!0,23,4)},p.prototype.readFloatBE=function(t,e){return t>>>=0,e||F(t,4,this.length),u.read(this,t,!1,23,4)},p.prototype.readDoubleLE=function(t,e){return t>>>=0,e||F(t,8,this.length),u.read(this,t,!0,52,8)},p.prototype.readDoubleBE=function(t,e){return t>>>=0,e||F(t,8,this.length),u.read(this,t,!1,52,8)},p.prototype.writeUintLE=p.prototype.writeUIntLE=function(t,e,r,n){t=+t,e>>>=0,r>>>=0,n||B(this,t,e,r,Math.pow(2,8*r)-1,0);var i=1,a=0;for(this[e]=255&t;++a>>=0,r>>>=0,n||B(this,t,e,r,Math.pow(2,8*r)-1,0);var i=r-1,a=1;for(this[e+i]=255&t;--i>=0&&(a*=256);)this[e+i]=t/a&255;return e+r},p.prototype.writeUint8=p.prototype.writeUInt8=function(t,e,r){return t=+t,e>>>=0,r||B(this,t,e,1,255,0),this[e]=255&t,e+1},p.prototype.writeUint16LE=p.prototype.writeUInt16LE=function(t,e,r){return t=+t,e>>>=0,r||B(this,t,e,2,65535,0),this[e]=255&t,this[e+1]=t>>>8,e+2},p.prototype.writeUint16BE=p.prototype.writeUInt16BE=function(t,e,r){return t=+t,e>>>=0,r||B(this,t,e,2,65535,0),this[e]=t>>>8,this[e+1]=255&t,e+2},p.prototype.writeUint32LE=p.prototype.writeUInt32LE=function(t,e,r){return t=+t,e>>>=0,r||B(this,t,e,4,4294967295,0),this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t,e+4},p.prototype.writeUint32BE=p.prototype.writeUInt32BE=function(t,e,r){return t=+t,e>>>=0,r||B(this,t,e,4,4294967295,0),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t,e+4},p.prototype.writeBigUInt64LE=nt((function(t){return N(this,t,arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,BigInt(0),BigInt(\"0xffffffffffffffff\"))})),p.prototype.writeBigUInt64BE=nt((function(t){return j(this,t,arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,BigInt(0),BigInt(\"0xffffffffffffffff\"))})),p.prototype.writeIntLE=function(t,e,r,n){if(t=+t,e>>>=0,!n){var i=Math.pow(2,8*r-1);B(this,t,e,r,i-1,-i)}var a=0,o=1,s=0;for(this[e]=255&t;++a>0)-s&255;return e+r},p.prototype.writeIntBE=function(t,e,r,n){if(t=+t,e>>>=0,!n){var i=Math.pow(2,8*r-1);B(this,t,e,r,i-1,-i)}var a=r-1,o=1,s=0;for(this[e+a]=255&t;--a>=0&&(o*=256);)t<0&&0===s&&0!==this[e+a+1]&&(s=1),this[e+a]=(t/o>>0)-s&255;return e+r},p.prototype.writeInt8=function(t,e,r){return t=+t,e>>>=0,r||B(this,t,e,1,127,-128),t<0&&(t=255+t+1),this[e]=255&t,e+1},p.prototype.writeInt16LE=function(t,e,r){return t=+t,e>>>=0,r||B(this,t,e,2,32767,-32768),this[e]=255&t,this[e+1]=t>>>8,e+2},p.prototype.writeInt16BE=function(t,e,r){return t=+t,e>>>=0,r||B(this,t,e,2,32767,-32768),this[e]=t>>>8,this[e+1]=255&t,e+2},p.prototype.writeInt32LE=function(t,e,r){return t=+t,e>>>=0,r||B(this,t,e,4,2147483647,-2147483648),this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24,e+4},p.prototype.writeInt32BE=function(t,e,r){return t=+t,e>>>=0,r||B(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t,e+4},p.prototype.writeBigInt64LE=nt((function(t){return N(this,t,arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,-BigInt(\"0x8000000000000000\"),BigInt(\"0x7fffffffffffffff\"))})),p.prototype.writeBigInt64BE=nt((function(t){return j(this,t,arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,-BigInt(\"0x8000000000000000\"),BigInt(\"0x7fffffffffffffff\"))})),p.prototype.writeFloatLE=function(t,e,r){return V(this,t,e,!0,r)},p.prototype.writeFloatBE=function(t,e,r){return V(this,t,e,!1,r)},p.prototype.writeDoubleLE=function(t,e,r){return q(this,t,e,!0,r)},p.prototype.writeDoubleBE=function(t,e,r){return q(this,t,e,!1,r)},p.prototype.copy=function(t,e,r,n){if(!p.isBuffer(t))throw new TypeError(\"argument should be a Buffer\");if(r||(r=0),n||0===n||(n=this.length),e>=t.length&&(e=t.length),e||(e=0),n>0&&n=this.length)throw new RangeError(\"Index out of range\");if(n<0)throw new RangeError(\"sourceEnd out of bounds\");n>this.length&&(n=this.length),t.length-e>>=0,r=void 0===r?this.length:r>>>0,t||(t=0),\"number\"==typeof t)for(a=e;a=n+4;r-=3)e=\"_\".concat(t.slice(r-3,r)).concat(e);return\"\".concat(t.slice(0,r)).concat(e)}function Y(t,e,r,n,i,a){if(t>r||t3?0===e||e===BigInt(0)?\">= 0\".concat(s,\" and < 2\").concat(s,\" ** \").concat(8*(a+1)).concat(s):\">= -(2\".concat(s,\" ** \").concat(8*(a+1)-1).concat(s,\") and < 2 ** \")+\"\".concat(8*(a+1)-1).concat(s):\">= \".concat(e).concat(s,\" and <= \").concat(r).concat(s),new H.ERR_OUT_OF_RANGE(\"value\",o,t)}!function(t,e,r){X(e,\"offset\"),void 0!==t[e]&&void 0!==t[e+r]||Z(e,t.length-(r+1))}(n,i,a)}function X(t,e){if(\"number\"!=typeof t)throw new H.ERR_INVALID_ARG_TYPE(e,\"number\",t)}function Z(t,e,r){if(Math.floor(t)!==t)throw X(t,r),new H.ERR_OUT_OF_RANGE(r||\"offset\",\"an integer\",t);if(e<0)throw new H.ERR_BUFFER_OUT_OF_BOUNDS;throw new H.ERR_OUT_OF_RANGE(r||\"offset\",\">= \".concat(r?1:0,\" and <= \").concat(e),t)}G(\"ERR_BUFFER_OUT_OF_BOUNDS\",(function(t){return t?\"\".concat(t,\" is outside of buffer bounds\"):\"Attempt to access memory outside buffer bounds\"}),RangeError),G(\"ERR_INVALID_ARG_TYPE\",(function(t,e){return'The \"'.concat(t,'\" argument must be of type number. Received type ').concat(s(e))}),TypeError),G(\"ERR_OUT_OF_RANGE\",(function(t,e,r){var n='The value of \"'.concat(t,'\" is out of range.'),i=r;return Number.isInteger(r)&&Math.abs(r)>Math.pow(2,32)?i=W(String(r)):\"bigint\"==typeof r&&(i=String(r),(r>Math.pow(BigInt(2),BigInt(32))||r<-Math.pow(BigInt(2),BigInt(32)))&&(i=W(i)),i+=\"n\"),n+\" It must be \".concat(e,\". Received \").concat(i)}),RangeError);var K=/[^+/0-9A-Za-z-_]/g;function J(t,e){var r;e=e||1/0;for(var n=t.length,i=null,a=[],o=0;o55295&&r<57344){if(!i){if(r>56319){(e-=3)>-1&&a.push(239,191,189);continue}if(o+1===n){(e-=3)>-1&&a.push(239,191,189);continue}i=r;continue}if(r<56320){(e-=3)>-1&&a.push(239,191,189),i=r;continue}r=65536+(i-55296<<10|r-56320)}else i&&(e-=3)>-1&&a.push(239,191,189);if(i=null,r<128){if((e-=1)<0)break;a.push(r)}else if(r<2048){if((e-=2)<0)break;a.push(r>>6|192,63&r|128)}else if(r<65536){if((e-=3)<0)break;a.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error(\"Invalid code point\");if((e-=4)<0)break;a.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return a}function $(t){return l.toByteArray(function(t){if((t=(t=t.split(\"=\")[0]).trim().replace(K,\"\")).length<2)return\"\";for(;t.length%4!=0;)t+=\"=\";return t}(t))}function Q(t,e,r,n){var i;for(i=0;i=e.length||i>=t.length);++i)e[i+r]=t[i];return i}function tt(t,e){return t instanceof e||null!=t&&null!=t.constructor&&null!=t.constructor.name&&t.constructor.name===e.name}function et(t){return t!=t}var rt=function(){for(var t=\"0123456789abcdef\",e=new Array(256),r=0;r<16;++r)for(var n=16*r,i=0;i<16;++i)e[n+i]=t[r]+t[i];return e}();function nt(t){return\"undefined\"==typeof BigInt?it:t}function it(){throw new Error(\"BigInt not supported\")}},25928:function(t){\"use strict\";t.exports=i,t.exports.isMobile=i,t.exports.default=i;var e=/(android|bb\\d+|meego).+mobile|armv7l|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series[46]0|samsungbrowser.*mobile|symbian|treo|up\\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i,r=/CrOS/,n=/android|ipad|playbook|silk/i;function i(t){t||(t={});var i=t.ua;if(i||\"undefined\"==typeof navigator||(i=navigator.userAgent),i&&i.headers&&\"string\"==typeof i.headers[\"user-agent\"]&&(i=i.headers[\"user-agent\"]),\"string\"!=typeof i)return!1;var a=e.test(i)&&!r.test(i)||!!t.tablet&&n.test(i);return!a&&t.tablet&&t.featureDetect&&navigator&&navigator.maxTouchPoints>1&&-1!==i.indexOf(\"Macintosh\")&&-1!==i.indexOf(\"Safari\")&&(a=!0),a}},48932:function(t,e,r){\"use strict\";r.r(e),r.d(e,{sankeyCenter:function(){return h},sankeyCircular:function(){return C},sankeyJustify:function(){return f},sankeyLeft:function(){return u},sankeyRight:function(){return c}});var n=r(84706),i=r(34712),a=r(10132),o=r(6688),s=r.n(o);function l(t){return t.target.depth}function u(t){return t.depth}function c(t,e){return e-1-t.height}function f(t,e){return t.sourceLinks.length?t.depth:e-1}function h(t){return t.targetLinks.length?t.depth:t.sourceLinks.length?(0,n.SY)(t.sourceLinks,l)-1:0}function p(t){return function(){return t}}var d=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\"function\"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?\"symbol\":typeof t};function v(t,e){return y(t.source,e.source)||t.index-e.index}function g(t,e){return y(t.target,e.target)||t.index-e.index}function y(t,e){return t.partOfCycle===e.partOfCycle?t.y0-e.y0:\"top\"===t.circularLinkType||\"bottom\"===e.circularLinkType?-1:1}function m(t){return t.value}function x(t){return(t.y0+t.y1)/2}function b(t){return x(t.source)}function _(t){return x(t.target)}function w(t){return t.index}function T(t){return t.nodes}function k(t){return t.links}function A(t,e){var r=t.get(e);if(!r)throw new Error(\"missing: \"+e);return r}function M(t,e){return e(t)}var S=25,E=10,L=.3;function C(){var t,e,r=0,a=0,o=1,l=1,u=24,c=w,h=f,M=T,C=k,O=32,z=2,D=null;function F(){var f={nodes:M.apply(null,arguments),links:C.apply(null,arguments)};!function(t){t.nodes.forEach((function(t,e){t.index=e,t.sourceLinks=[],t.targetLinks=[]}));var e=(0,i.kH)(t.nodes,c);t.links.forEach((function(t,r){t.index=r;var n=t.source,i=t.target;\"object\"!==(void 0===n?\"undefined\":d(n))&&(n=t.source=A(e,n)),\"object\"!==(void 0===i?\"undefined\":d(i))&&(i=t.target=A(e,i)),n.sourceLinks.push(t),i.targetLinks.push(t)}))}(f),function(t,e,r){var n=0;if(null===r){for(var i=[],a=0;a0?e+S+E:e,bottom:r=r>0?r+S+E:r,left:a=a>0?a+S+E:a,right:i=i>0?i+S+E:i}}(s),d=function(t,e){var i=(0,n.kv)(t.nodes,(function(t){return t.column})),s=o-r,c=l-a,f=s/(s+e.right+e.left),h=c/(c+e.top+e.bottom);return r=r*f+e.left,o=0==e.right?o:o*f,a=a*h+e.top,l*=h,t.nodes.forEach((function(t){t.x0=r+t.column*((o-r-u)/i),t.x1=t.x0+u})),h}(s,p);f*=d,s.links.forEach((function(t){t.width=t.value*f})),h.forEach((function(t){var e=t.length;t.forEach((function(t,r){t.depth==h.length-1&&1==e||0==t.depth&&1==e?(t.y0=l/2-t.value*f,t.y1=t.y0+t.value*f):t.partOfCycle?0==I(t,i)?(t.y0=l/2+r,t.y1=t.y0+t.value*f):\"top\"==t.circularLinkType?(t.y0=a+r,t.y1=t.y0+t.value*f):(t.y0=l-t.value*f-r,t.y1=t.y0+t.value*f):0==p.top||0==p.bottom?(t.y0=(l-a)/e*r,t.y1=t.y0+t.value*f):(t.y0=(l-a)/2-e/2+r,t.y1=t.y0+t.value*f)}))}))})(f),g();for(var p=1,d=c;d>0;--d)v(p*=.99,f),g();function v(t,e){var r=h.length;h.forEach((function(i){var a=i.length,o=i[0].depth;i.forEach((function(i){var s;if(i.sourceLinks.length||i.targetLinks.length)if(i.partOfCycle&&I(i,e)>0);else if(0==o&&1==a)s=i.y1-i.y0,i.y0=l/2-s/2,i.y1=l/2+s/2;else if(o==r-1&&1==a)s=i.y1-i.y0,i.y0=l/2-s/2,i.y1=l/2+s/2;else{var u=(0,n.mo)(i.sourceLinks,_),c=(0,n.mo)(i.targetLinks,b),f=((u&&c?(u+c)/2:u||c)-x(i))*t;i.y0+=f,i.y1+=f}}))}))}function g(){h.forEach((function(e){var r,n,i,o=a,s=e.length;for(e.sort(y),i=0;i0&&(r.y0+=n,r.y1+=n),o=r.y1+t;if((n=o-t-l)>0)for(o=r.y0-=n,r.y1-=n,i=s-2;i>=0;--i)(n=(r=e[i]).y1+t-o)>0&&(r.y0-=n,r.y1-=n),o=r.y0}))}}(f,O,c),B(f);for(var p=0;p<4;p++)X(f,l,c),Z(f,0,c),W(f,a,l,c),X(f,l,c),Z(f,0,c);return function(t,e,r){var i=t.nodes,a=t.links,o=!1,s=!1;if(a.forEach((function(t){\"top\"==t.circularLinkType?o=!0:\"bottom\"==t.circularLinkType&&(s=!0)})),0==o||0==s){var l=(0,n.SY)(i,(function(t){return t.y0})),u=(r-e)/((0,n.kv)(i,(function(t){return t.y1}))-l);i.forEach((function(t){var e=(t.y1-t.y0)*u;t.y0=(t.y0-l)*u,t.y1=t.y0+e})),a.forEach((function(t){t.y0=(t.y0-l)*u,t.y1=(t.y1-l)*u,t.width=t.width*u}))}}(f,a,l),R(f,z,l,c),f}function B(t){t.nodes.forEach((function(t){t.sourceLinks.sort(g),t.targetLinks.sort(v)})),t.nodes.forEach((function(t){var e=t.y0,r=e,n=t.y1,i=n;t.sourceLinks.forEach((function(t){t.circular?(t.y0=n-t.width/2,n-=t.width):(t.y0=e+t.width/2,e+=t.width)})),t.targetLinks.forEach((function(t){t.circular?(t.y1=i-t.width/2,i-=t.width):(t.y1=r+t.width/2,r+=t.width)}))}))}return F.nodeId=function(t){return arguments.length?(c=\"function\"==typeof t?t:p(t),F):c},F.nodeAlign=function(t){return arguments.length?(h=\"function\"==typeof t?t:p(t),F):h},F.nodeWidth=function(t){return arguments.length?(u=+t,F):u},F.nodePadding=function(e){return arguments.length?(t=+e,F):t},F.nodes=function(t){return arguments.length?(M=\"function\"==typeof t?t:p(t),F):M},F.links=function(t){return arguments.length?(C=\"function\"==typeof t?t:p(t),F):C},F.size=function(t){return arguments.length?(r=a=0,o=+t[0],l=+t[1],F):[o-r,l-a]},F.extent=function(t){return arguments.length?(r=+t[0][0],o=+t[1][0],a=+t[0][1],l=+t[1][1],F):[[r,a],[o,l]]},F.iterations=function(t){return arguments.length?(O=+t,F):O},F.circularLinkGap=function(t){return arguments.length?(z=+t,F):z},F.nodePaddingRatio=function(t){return arguments.length?(e=+t,F):e},F.sortNodes=function(t){return arguments.length?(D=t,F):D},F.update=function(t){return P(t,c),B(t),t.links.forEach((function(t){t.circular&&(t.circularLinkType=t.y0+t.y11||i>1)}function D(t,e,r){return t.sort(F),t.forEach((function(n,i){var a,o,s=0;if($(n,r)&&z(n))n.circularPathData.verticalBuffer=s+n.width/2;else{for(var l=0;lo.source.column)){var u=t[l].circularPathData.verticalBuffer+t[l].width/2+e;s=u>s?u:s}n.circularPathData.verticalBuffer=s+n.width/2}})),t}function R(t,e,r,i){var o=(0,n.SY)(t.links,(function(t){return t.source.y0}));t.links.forEach((function(t){t.circular&&(t.circularPathData={})})),D(t.links.filter((function(t){return\"top\"==t.circularLinkType})),e,i),D(t.links.filter((function(t){return\"bottom\"==t.circularLinkType})),e,i),t.links.forEach((function(n){if(n.circular){if(n.circularPathData.arcRadius=n.width+E,n.circularPathData.leftNodeBuffer=5,n.circularPathData.rightNodeBuffer=5,n.circularPathData.sourceWidth=n.source.x1-n.source.x0,n.circularPathData.sourceX=n.source.x0+n.circularPathData.sourceWidth,n.circularPathData.targetX=n.target.x0,n.circularPathData.sourceY=n.y0,n.circularPathData.targetY=n.y1,$(n,i)&&z(n))n.circularPathData.leftSmallArcRadius=E+n.width/2,n.circularPathData.leftLargeArcRadius=E+n.width/2,n.circularPathData.rightSmallArcRadius=E+n.width/2,n.circularPathData.rightLargeArcRadius=E+n.width/2,\"bottom\"==n.circularLinkType?(n.circularPathData.verticalFullExtent=n.source.y1+S+n.circularPathData.verticalBuffer,n.circularPathData.verticalLeftInnerExtent=n.circularPathData.verticalFullExtent-n.circularPathData.leftLargeArcRadius,n.circularPathData.verticalRightInnerExtent=n.circularPathData.verticalFullExtent-n.circularPathData.rightLargeArcRadius):(n.circularPathData.verticalFullExtent=n.source.y0-S-n.circularPathData.verticalBuffer,n.circularPathData.verticalLeftInnerExtent=n.circularPathData.verticalFullExtent+n.circularPathData.leftLargeArcRadius,n.circularPathData.verticalRightInnerExtent=n.circularPathData.verticalFullExtent+n.circularPathData.rightLargeArcRadius);else{var s=n.source.column,l=n.circularLinkType,u=t.links.filter((function(t){return t.source.column==s&&t.circularLinkType==l}));\"bottom\"==n.circularLinkType?u.sort(N):u.sort(B);var c=0;u.forEach((function(t,r){t.circularLinkID==n.circularLinkID&&(n.circularPathData.leftSmallArcRadius=E+n.width/2+c,n.circularPathData.leftLargeArcRadius=E+n.width/2+r*e+c),c+=t.width})),s=n.target.column,u=t.links.filter((function(t){return t.target.column==s&&t.circularLinkType==l})),\"bottom\"==n.circularLinkType?u.sort(U):u.sort(j),c=0,u.forEach((function(t,r){t.circularLinkID==n.circularLinkID&&(n.circularPathData.rightSmallArcRadius=E+n.width/2+c,n.circularPathData.rightLargeArcRadius=E+n.width/2+r*e+c),c+=t.width})),\"bottom\"==n.circularLinkType?(n.circularPathData.verticalFullExtent=Math.max(r,n.source.y1,n.target.y1)+S+n.circularPathData.verticalBuffer,n.circularPathData.verticalLeftInnerExtent=n.circularPathData.verticalFullExtent-n.circularPathData.leftLargeArcRadius,n.circularPathData.verticalRightInnerExtent=n.circularPathData.verticalFullExtent-n.circularPathData.rightLargeArcRadius):(n.circularPathData.verticalFullExtent=o-S-n.circularPathData.verticalBuffer,n.circularPathData.verticalLeftInnerExtent=n.circularPathData.verticalFullExtent+n.circularPathData.leftLargeArcRadius,n.circularPathData.verticalRightInnerExtent=n.circularPathData.verticalFullExtent+n.circularPathData.rightLargeArcRadius)}n.circularPathData.leftInnerExtent=n.circularPathData.sourceX+n.circularPathData.leftNodeBuffer,n.circularPathData.rightInnerExtent=n.circularPathData.targetX-n.circularPathData.rightNodeBuffer,n.circularPathData.leftFullExtent=n.circularPathData.sourceX+n.circularPathData.leftLargeArcRadius+n.circularPathData.leftNodeBuffer,n.circularPathData.rightFullExtent=n.circularPathData.targetX-n.circularPathData.rightLargeArcRadius-n.circularPathData.rightNodeBuffer}if(n.circular)n.path=function(t){return\"top\"==t.circularLinkType?\"M\"+t.circularPathData.sourceX+\" \"+t.circularPathData.sourceY+\" L\"+t.circularPathData.leftInnerExtent+\" \"+t.circularPathData.sourceY+\" A\"+t.circularPathData.leftLargeArcRadius+\" \"+t.circularPathData.leftSmallArcRadius+\" 0 0 0 \"+t.circularPathData.leftFullExtent+\" \"+(t.circularPathData.sourceY-t.circularPathData.leftSmallArcRadius)+\" L\"+t.circularPathData.leftFullExtent+\" \"+t.circularPathData.verticalLeftInnerExtent+\" A\"+t.circularPathData.leftLargeArcRadius+\" \"+t.circularPathData.leftLargeArcRadius+\" 0 0 0 \"+t.circularPathData.leftInnerExtent+\" \"+t.circularPathData.verticalFullExtent+\" L\"+t.circularPathData.rightInnerExtent+\" \"+t.circularPathData.verticalFullExtent+\" A\"+t.circularPathData.rightLargeArcRadius+\" \"+t.circularPathData.rightLargeArcRadius+\" 0 0 0 \"+t.circularPathData.rightFullExtent+\" \"+t.circularPathData.verticalRightInnerExtent+\" L\"+t.circularPathData.rightFullExtent+\" \"+(t.circularPathData.targetY-t.circularPathData.rightSmallArcRadius)+\" A\"+t.circularPathData.rightLargeArcRadius+\" \"+t.circularPathData.rightSmallArcRadius+\" 0 0 0 \"+t.circularPathData.rightInnerExtent+\" \"+t.circularPathData.targetY+\" L\"+t.circularPathData.targetX+\" \"+t.circularPathData.targetY:\"M\"+t.circularPathData.sourceX+\" \"+t.circularPathData.sourceY+\" L\"+t.circularPathData.leftInnerExtent+\" \"+t.circularPathData.sourceY+\" A\"+t.circularPathData.leftLargeArcRadius+\" \"+t.circularPathData.leftSmallArcRadius+\" 0 0 1 \"+t.circularPathData.leftFullExtent+\" \"+(t.circularPathData.sourceY+t.circularPathData.leftSmallArcRadius)+\" L\"+t.circularPathData.leftFullExtent+\" \"+t.circularPathData.verticalLeftInnerExtent+\" A\"+t.circularPathData.leftLargeArcRadius+\" \"+t.circularPathData.leftLargeArcRadius+\" 0 0 1 \"+t.circularPathData.leftInnerExtent+\" \"+t.circularPathData.verticalFullExtent+\" L\"+t.circularPathData.rightInnerExtent+\" \"+t.circularPathData.verticalFullExtent+\" A\"+t.circularPathData.rightLargeArcRadius+\" \"+t.circularPathData.rightLargeArcRadius+\" 0 0 1 \"+t.circularPathData.rightFullExtent+\" \"+t.circularPathData.verticalRightInnerExtent+\" L\"+t.circularPathData.rightFullExtent+\" \"+(t.circularPathData.targetY+t.circularPathData.rightSmallArcRadius)+\" A\"+t.circularPathData.rightLargeArcRadius+\" \"+t.circularPathData.rightSmallArcRadius+\" 0 0 1 \"+t.circularPathData.rightInnerExtent+\" \"+t.circularPathData.targetY+\" L\"+t.circularPathData.targetX+\" \"+t.circularPathData.targetY}(n);else{var f=(0,a.ak)().source((function(t){return[t.source.x0+(t.source.x1-t.source.x0),t.y0]})).target((function(t){return[t.target.x0,t.y1]}));n.path=f(n)}}))}function F(t,e){return V(t)==V(e)?\"bottom\"==t.circularLinkType?N(t,e):B(t,e):V(e)-V(t)}function B(t,e){return t.y0-e.y0}function N(t,e){return e.y0-t.y0}function j(t,e){return t.y1-e.y1}function U(t,e){return e.y1-t.y1}function V(t){return t.target.column-t.source.column}function q(t){return t.target.x0-t.source.x1}function H(t,e){var r=O(t),n=q(e)/Math.tan(r);return\"up\"==J(t)?t.y1+n:t.y1-n}function G(t,e){var r=O(t),n=q(e)/Math.tan(r);return\"up\"==J(t)?t.y1-n:t.y1+n}function W(t,e,r,n){t.links.forEach((function(i){if(!i.circular&&i.target.column-i.source.column>1){var a=i.source.column+1,o=i.target.column-1,s=1,l=o-a+1;for(s=1;a<=o;a++,s++)t.nodes.forEach((function(o){if(o.column==a){var u,c=s/(l+1),f=Math.pow(1-c,3),h=3*c*Math.pow(1-c,2),p=3*Math.pow(c,2)*(1-c),d=Math.pow(c,3),v=f*i.y0+h*i.y0+p*i.y1+d*i.y1,g=v-i.width/2,y=v+i.width/2;g>o.y0&&ga.y0&&i.y0a.y0&&i.y1a.y1)&&Y(t,u,e,r)}))):(y>o.y0&&yo.y1)&&(u=y-o.y0+10,o=Y(o,u,e,r),t.nodes.forEach((function(t){M(t,n)!=M(o,n)&&t.column==o.column&&t.y0o.y1&&Y(t,u,e,r)})))}}))}}))}function Y(t,e,r,n){return t.y0+e>=r&&t.y1+e<=n&&(t.y0=t.y0+e,t.y1=t.y1+e,t.targetLinks.forEach((function(t){t.y1=t.y1+e})),t.sourceLinks.forEach((function(t){t.y0=t.y0+e}))),t}function X(t,e,r,n){t.nodes.forEach((function(i){n&&i.y+(i.y1-i.y0)>e&&(i.y=i.y-(i.y+(i.y1-i.y0)-e));var a=t.links.filter((function(t){return M(t.source,r)==M(i,r)})),o=a.length;o>1&&a.sort((function(t,e){if(!t.circular&&!e.circular){if(t.target.column==e.target.column)return t.y1-e.y1;if(!K(t,e))return t.y1-e.y1;if(t.target.column>e.target.column){var r=G(e,t);return t.y1-r}if(e.target.column>t.target.column)return G(t,e)-e.y1}return t.circular&&!e.circular?\"top\"==t.circularLinkType?-1:1:e.circular&&!t.circular?\"top\"==e.circularLinkType?1:-1:t.circular&&e.circular?t.circularLinkType===e.circularLinkType&&\"top\"==t.circularLinkType?t.target.column===e.target.column?t.target.y1-e.target.y1:e.target.column-t.target.column:t.circularLinkType===e.circularLinkType&&\"bottom\"==t.circularLinkType?t.target.column===e.target.column?e.target.y1-t.target.y1:t.target.column-e.target.column:\"top\"==t.circularLinkType?-1:1:void 0}));var s=i.y0;a.forEach((function(t){t.y0=s+t.width/2,s+=t.width})),a.forEach((function(t,e){if(\"bottom\"==t.circularLinkType){for(var r=e+1,n=0;r1&&n.sort((function(t,e){if(!t.circular&&!e.circular){if(t.source.column==e.source.column)return t.y0-e.y0;if(!K(t,e))return t.y0-e.y0;if(e.source.column0?\"up\":\"down\"}function $(t,e){return M(t.source,e)==M(t.target,e)}},26800:function(t,e,r){\"use strict\";r.r(e),r.d(e,{sankey:function(){return w},sankeyCenter:function(){return u},sankeyJustify:function(){return l},sankeyLeft:function(){return o},sankeyLinkHorizontal:function(){return M},sankeyRight:function(){return s}});var n=r(84706),i=r(34712);function a(t){return t.target.depth}function o(t){return t.depth}function s(t,e){return e-1-t.height}function l(t,e){return t.sourceLinks.length?t.depth:e-1}function u(t){return t.targetLinks.length?t.depth:t.sourceLinks.length?(0,n.SY)(t.sourceLinks,a)-1:0}function c(t){return function(){return t}}function f(t,e){return p(t.source,e.source)||t.index-e.index}function h(t,e){return p(t.target,e.target)||t.index-e.index}function p(t,e){return t.y0-e.y0}function d(t){return t.value}function v(t){return(t.y0+t.y1)/2}function g(t){return v(t.source)*t.value}function y(t){return v(t.target)*t.value}function m(t){return t.index}function x(t){return t.nodes}function b(t){return t.links}function _(t,e){var r=t.get(e);if(!r)throw new Error(\"missing: \"+e);return r}function w(){var t=0,e=0,r=1,a=1,o=24,s=8,u=m,w=l,T=x,k=b,A=32;function M(){var l={nodes:T.apply(null,arguments),links:k.apply(null,arguments)};return function(t){t.nodes.forEach((function(t,e){t.index=e,t.sourceLinks=[],t.targetLinks=[]}));var e=(0,i.kH)(t.nodes,u);t.links.forEach((function(t,r){t.index=r;var n=t.source,i=t.target;\"object\"!=typeof n&&(n=t.source=_(e,n)),\"object\"!=typeof i&&(i=t.target=_(e,i)),n.sourceLinks.push(t),i.targetLinks.push(t)}))}(l),function(t){t.nodes.forEach((function(t){t.value=Math.max((0,n.oh)(t.sourceLinks,d),(0,n.oh)(t.targetLinks,d))}))}(l),function(e){var n,i,a;for(n=e.nodes,i=[],a=0;n.length;++a,n=i,i=[])n.forEach((function(t){t.depth=a,t.sourceLinks.forEach((function(t){i.indexOf(t.target)<0&&i.push(t.target)}))}));for(n=e.nodes,i=[],a=0;n.length;++a,n=i,i=[])n.forEach((function(t){t.height=a,t.targetLinks.forEach((function(t){i.indexOf(t.source)<0&&i.push(t.source)}))}));var s=(r-t-o)/(a-1);e.nodes.forEach((function(e){e.x1=(e.x0=t+Math.max(0,Math.min(a-1,Math.floor(w.call(null,e,a))))*s)+o}))}(l),function(t){var r=(0,i.UJ)().key((function(t){return t.x0})).sortKeys(n.XE).entries(t.nodes).map((function(t){return t.values}));(function(){var i=(0,n.kv)(r,(function(t){return t.length})),o=.6666666666666666*(a-e)/(i-1);s>o&&(s=o);var l=(0,n.SY)(r,(function(t){return(a-e-(t.length-1)*s)/(0,n.oh)(t,d)}));r.forEach((function(t){t.forEach((function(t,e){t.y1=(t.y0=e)+t.value*l}))})),t.links.forEach((function(t){t.width=t.value*l}))})(),f();for(var o=1,l=A;l>0;--l)c(o*=.99),f(),u(o),f();function u(t){r.forEach((function(e){e.forEach((function(e){if(e.targetLinks.length){var r=((0,n.oh)(e.targetLinks,g)/(0,n.oh)(e.targetLinks,d)-v(e))*t;e.y0+=r,e.y1+=r}}))}))}function c(t){r.slice().reverse().forEach((function(e){e.forEach((function(e){if(e.sourceLinks.length){var r=((0,n.oh)(e.sourceLinks,y)/(0,n.oh)(e.sourceLinks,d)-v(e))*t;e.y0+=r,e.y1+=r}}))}))}function f(){r.forEach((function(t){var r,n,i,o=e,l=t.length;for(t.sort(p),i=0;i0&&(r.y0+=n,r.y1+=n),o=r.y1+s;if((n=o-s-a)>0)for(o=r.y0-=n,r.y1-=n,i=l-2;i>=0;--i)(n=(r=t[i]).y1+s-o)>0&&(r.y0-=n,r.y1-=n),o=r.y0}))}}(l),S(l),l}function S(t){t.nodes.forEach((function(t){t.sourceLinks.sort(h),t.targetLinks.sort(f)})),t.nodes.forEach((function(t){var e=t.y0,r=e;t.sourceLinks.forEach((function(t){t.y0=e+t.width/2,e+=t.width})),t.targetLinks.forEach((function(t){t.y1=r+t.width/2,r+=t.width}))}))}return M.update=function(t){return S(t),t},M.nodeId=function(t){return arguments.length?(u=\"function\"==typeof t?t:c(t),M):u},M.nodeAlign=function(t){return arguments.length?(w=\"function\"==typeof t?t:c(t),M):w},M.nodeWidth=function(t){return arguments.length?(o=+t,M):o},M.nodePadding=function(t){return arguments.length?(s=+t,M):s},M.nodes=function(t){return arguments.length?(T=\"function\"==typeof t?t:c(t),M):T},M.links=function(t){return arguments.length?(k=\"function\"==typeof t?t:c(t),M):k},M.size=function(n){return arguments.length?(t=e=0,r=+n[0],a=+n[1],M):[r-t,a-e]},M.extent=function(n){return arguments.length?(t=+n[0][0],r=+n[1][0],e=+n[0][1],a=+n[1][1],M):[[t,e],[r,a]]},M.iterations=function(t){return arguments.length?(A=+t,M):A},M}var T=r(10132);function k(t){return[t.source.x1,t.y0]}function A(t){return[t.target.x0,t.y1]}function M(){return(0,T.ak)().source(k).target(A)}},33428:function(t,e,r){var n,i;(function(){var a={version:\"3.8.0\"},o=[].slice,s=function(t){return o.call(t)},l=self.document;function u(t){return t&&(t.ownerDocument||t.document||t).documentElement}function c(t){return t&&(t.ownerDocument&&t.ownerDocument.defaultView||t.document&&t||t.defaultView)}if(l)try{s(l.documentElement.childNodes)[0].nodeType}catch(t){s=function(t){for(var e=t.length,r=new Array(e);e--;)r[e]=t[e];return r}}if(Date.now||(Date.now=function(){return+new Date}),l)try{l.createElement(\"DIV\").style.setProperty(\"opacity\",0,\"\")}catch(t){var f=this.Element.prototype,h=f.setAttribute,p=f.setAttributeNS,d=this.CSSStyleDeclaration.prototype,v=d.setProperty;f.setAttribute=function(t,e){h.call(this,t,e+\"\")},f.setAttributeNS=function(t,e,r){p.call(this,t,e,r+\"\")},d.setProperty=function(t,e,r){v.call(this,t,e+\"\",r)}}function g(t,e){return te?1:t>=e?0:NaN}function y(t){return null===t?NaN:+t}function m(t){return!isNaN(t)}function x(t){return{left:function(e,r,n,i){for(arguments.length<3&&(n=0),arguments.length<4&&(i=e.length);n>>1;t(e[a],r)<0?n=a+1:i=a}return n},right:function(e,r,n,i){for(arguments.length<3&&(n=0),arguments.length<4&&(i=e.length);n>>1;t(e[a],r)>0?i=a:n=a+1}return n}}}a.ascending=g,a.descending=function(t,e){return et?1:e>=t?0:NaN},a.min=function(t,e){var r,n,i=-1,a=t.length;if(1===arguments.length){for(;++i=n){r=n;break}for(;++in&&(r=n)}else{for(;++i=n){r=n;break}for(;++in&&(r=n)}return r},a.max=function(t,e){var r,n,i=-1,a=t.length;if(1===arguments.length){for(;++i=n){r=n;break}for(;++ir&&(r=n)}else{for(;++i=n){r=n;break}for(;++ir&&(r=n)}return r},a.extent=function(t,e){var r,n,i,a=-1,o=t.length;if(1===arguments.length){for(;++a=n){r=i=n;break}for(;++an&&(r=n),i=n){r=i=n;break}for(;++an&&(r=n),i1)return o/(l-1)},a.deviation=function(){var t=a.variance.apply(this,arguments);return t?Math.sqrt(t):t};var b=x(g);function _(t){return t.length}a.bisectLeft=b.left,a.bisect=a.bisectRight=b.right,a.bisector=function(t){return x(1===t.length?function(e,r){return g(t(e),r)}:t)},a.shuffle=function(t,e,r){(a=arguments.length)<3&&(r=t.length,a<2&&(e=0));for(var n,i,a=r-e;a;)i=Math.random()*a--|0,n=t[a+e],t[a+e]=t[i+e],t[i+e]=n;return t},a.permute=function(t,e){for(var r=e.length,n=new Array(r);r--;)n[r]=t[e[r]];return n},a.pairs=function(t){for(var e=0,r=t.length-1,n=t[0],i=new Array(r<0?0:r);e=0;)for(e=(n=t[i]).length;--e>=0;)r[--o]=n[e];return r};var w=Math.abs;function T(t,e){for(var r in e)Object.defineProperty(t.prototype,r,{value:e[r],enumerable:!1})}function k(){this._=Object.create(null)}a.range=function(t,e,r){if(arguments.length<3&&(r=1,arguments.length<2&&(e=t,t=0)),(e-t)/r==1/0)throw new Error(\"infinite range\");var n,i=[],a=function(t){for(var e=1;t*e%1;)e*=10;return e}(w(r)),o=-1;if(t*=a,e*=a,(r*=a)<0)for(;(n=t+r*++o)>e;)i.push(n/a);else for(;(n=t+r*++o)=n.length)return e?e.call(r,a):t?a.sort(t):a;for(var l,u,c,f,h=-1,p=a.length,d=n[s++],v=new k;++h=n.length)return t;var r=[],a=i[e++];return t.forEach((function(t,n){r.push({key:t,values:s(n,e)})})),a?r.sort((function(t,e){return a(t.key,e.key)})):r}return r.map=function(t,e){return o(e,t,0)},r.entries=function(t){return s(o(a.map,t,0),0)},r.key=function(t){return n.push(t),r},r.sortKeys=function(t){return i[n.length-1]=t,r},r.sortValues=function(e){return t=e,r},r.rollup=function(t){return e=t,r},r},a.set=function(t){var e=new z;if(t)for(var r=0,n=t.length;r=0&&(n=t.slice(r+1),t=t.slice(0,r)),t)return arguments.length<2?this[t].on(n):this[t].on(n,e);if(2===arguments.length){if(null==e)for(t in this)this.hasOwnProperty(t)&&this[t].on(n,null);return this}},a.event=null,a.requote=function(t){return t.replace(G,\"\\\\$&\")};var G=/[\\\\\\^\\$\\*\\+\\?\\|\\[\\]\\(\\)\\.\\{\\}]/g,W={}.__proto__?function(t,e){t.__proto__=e}:function(t,e){for(var r in e)t[r]=e[r]};function Y(t){return W(t,J),t}var X=function(t,e){return e.querySelector(t)},Z=function(t,e){return e.querySelectorAll(t)},K=function(t,e){var r=t.matches||t[F(t,\"matchesSelector\")];return K=function(t,e){return r.call(t,e)},K(t,e)};\"function\"==typeof Sizzle&&(X=function(t,e){return Sizzle(t,e)[0]||null},Z=Sizzle,K=Sizzle.matchesSelector),a.selection=function(){return a.select(l.documentElement)};var J=a.selection.prototype=[];function $(t){return\"function\"==typeof t?t:function(){return X(t,this)}}function Q(t){return\"function\"==typeof t?t:function(){return Z(t,this)}}J.select=function(t){var e,r,n,i,a=[];t=$(t);for(var o=-1,s=this.length;++o=0&&\"xmlns\"!==(r=t.slice(0,e))&&(t=t.slice(e+1)),et.hasOwnProperty(r)?{space:et[r],local:t}:t}},J.attr=function(t,e){if(arguments.length<2){if(\"string\"==typeof t){var r=this.node();return(t=a.ns.qualify(t)).local?r.getAttributeNS(t.space,t.local):r.getAttribute(t)}for(e in t)this.each(rt(e,t[e]));return this}return this.each(rt(t,e))},J.classed=function(t,e){if(arguments.length<2){if(\"string\"==typeof t){var r=this.node(),n=(t=at(t)).length,i=-1;if(e=r.classList){for(;++i=0;)(r=n[i])&&(a&&a!==r.nextSibling&&a.parentNode.insertBefore(r,a),a=r);return this},J.sort=function(t){t=dt.apply(this,arguments);for(var e=-1,r=this.length;++e0&&(t=t.slice(0,i));var l=xt.get(t);function u(){var e=this[n];e&&(this.removeEventListener(t,e,e.$),delete this[n])}return l&&(t=l,o=_t),i?e?function(){var i=o(e,s(arguments));u.call(this),this.addEventListener(t,this[n]=i,i.$=r),i._=e}:u:e?N:function(){var e,r=new RegExp(\"^__on([^.]+)\"+a.requote(t)+\"$\");for(var n in this)if(e=n.match(r)){var i=this[n];this.removeEventListener(e[1],i,i.$),delete this[n]}}}a.selection.enter=gt,a.selection.enter.prototype=yt,yt.append=J.append,yt.empty=J.empty,yt.node=J.node,yt.call=J.call,yt.size=J.size,yt.select=function(t){for(var e,r,n,i,a,o=[],s=-1,l=this.length;++s=n&&(n=e+1);!(o=s[n])&&++n1?It:t<-1?-It:Math.asin(t)}function Ft(t){return((t=Math.exp(t))+1/t)/2}var Bt=Math.SQRT2;a.interpolateZoom=function(t,e){var r,n,i=t[0],a=t[1],o=t[2],s=e[0],l=e[1],u=e[2],c=s-i,f=l-a,h=c*c+f*f;if(h0&&(t=t.transition().duration(v)),t.call(w.event)}function S(){s&&s.domain(o.range().map((function(t){return(t-h.x)/h.k})).map(o.invert)),f&&f.domain(u.range().map((function(t){return(t-h.y)/h.k})).map(u.invert))}function E(t){g++||t({type:\"zoomstart\"})}function L(t){S(),t({type:\"zoom\",scale:h.k,translate:[h.x,h.y]})}function C(t){--g||(t({type:\"zoomend\"}),e=null)}function P(){var t=this,e=_.of(t,arguments),r=0,n=a.select(c(t)).on(m,(function(){r=1,A(a.mouse(t),i),L(e)})).on(x,(function(){n.on(m,null).on(x,null),o(r),C(e)})),i=T(a.mouse(t)),o=kt(t);Ki.call(t),E(e)}function O(){var t,e=this,r=_.of(e,arguments),n={},o=0,s=\".zoom-\"+a.event.changedTouches[0].identifier,l=\"touchmove\"+s,u=\"touchend\"+s,c=[],f=a.select(e),p=kt(e);function d(){var r=a.touches(e);return t=h.k,r.forEach((function(t){t.identifier in n&&(n[t.identifier]=T(t))})),r}function v(){var t=a.event.target;a.select(t).on(l,g).on(u,m),c.push(t);for(var r=a.event.changedTouches,s=0,f=r.length;s1){y=p[0];var x=p[1],b=y[0]-x[0],_=y[1]-x[1];o=b*b+_*_}}function g(){var s,l,u,c,f=a.touches(e);Ki.call(e);for(var h=0,p=f.length;h360?t-=360:t<0&&(t+=360),t<60?n+(i-n)*t/60:t<180?i:t<240?n+(i-n)*(240-t)/60:n}(t))}return t=isNaN(t)?0:(t%=360)<0?t+360:t,e=isNaN(e)||e<0?0:e>1?1:e,n=2*(r=r<0?0:r>1?1:r)-(i=r<=.5?r*(1+e):r+e-r*e),new ae(a(t+120),a(t),a(t-120))}function Wt(t,e,r){return this instanceof Wt?(this.h=+t,this.c=+e,void(this.l=+r)):arguments.length<2?t instanceof Wt?new Wt(t.h,t.c,t.l):function(t,e,r){return t>0?new Wt(Math.atan2(r,e)*Dt,Math.sqrt(e*e+r*r),t):new Wt(NaN,NaN,t)}(t instanceof Zt?t.l:(t=he((t=a.rgb(t)).r,t.g,t.b)).l,t.a,t.b):new Wt(t,e,r)}Ht.brighter=function(t){return t=Math.pow(.7,arguments.length?t:1),new qt(this.h,this.s,this.l/t)},Ht.darker=function(t){return t=Math.pow(.7,arguments.length?t:1),new qt(this.h,this.s,t*this.l)},Ht.rgb=function(){return Gt(this.h,this.s,this.l)},a.hcl=Wt;var Yt=Wt.prototype=new Vt;function Xt(t,e,r){return isNaN(t)&&(t=0),isNaN(e)&&(e=0),new Zt(r,Math.cos(t*=zt)*e,Math.sin(t)*e)}function Zt(t,e,r){return this instanceof Zt?(this.l=+t,this.a=+e,void(this.b=+r)):arguments.length<2?t instanceof Zt?new Zt(t.l,t.a,t.b):t instanceof Wt?Xt(t.h,t.c,t.l):he((t=ae(t)).r,t.g,t.b):new Zt(t,e,r)}Yt.brighter=function(t){return new Wt(this.h,this.c,Math.min(100,this.l+Kt*(arguments.length?t:1)))},Yt.darker=function(t){return new Wt(this.h,this.c,Math.max(0,this.l-Kt*(arguments.length?t:1)))},Yt.rgb=function(){return Xt(this.h,this.c,this.l).rgb()},a.lab=Zt;var Kt=18,Jt=.95047,$t=1,Qt=1.08883,te=Zt.prototype=new Vt;function ee(t,e,r){var n=(t+16)/116,i=n+e/500,a=n-r/200;return new ae(ie(3.2404542*(i=re(i)*Jt)-1.5371385*(n=re(n)*$t)-.4985314*(a=re(a)*Qt)),ie(-.969266*i+1.8760108*n+.041556*a),ie(.0556434*i-.2040259*n+1.0572252*a))}function re(t){return t>.206893034?t*t*t:(t-4/29)/7.787037}function ne(t){return t>.008856?Math.pow(t,1/3):7.787037*t+4/29}function ie(t){return Math.round(255*(t<=.00304?12.92*t:1.055*Math.pow(t,1/2.4)-.055))}function ae(t,e,r){return this instanceof ae?(this.r=~~t,this.g=~~e,void(this.b=~~r)):arguments.length<2?t instanceof ae?new ae(t.r,t.g,t.b):ce(\"\"+t,ae,Gt):new ae(t,e,r)}function oe(t){return new ae(t>>16,t>>8&255,255&t)}function se(t){return oe(t)+\"\"}te.brighter=function(t){return new Zt(Math.min(100,this.l+Kt*(arguments.length?t:1)),this.a,this.b)},te.darker=function(t){return new Zt(Math.max(0,this.l-Kt*(arguments.length?t:1)),this.a,this.b)},te.rgb=function(){return ee(this.l,this.a,this.b)},a.rgb=ae;var le=ae.prototype=new Vt;function ue(t){return t<16?\"0\"+Math.max(0,t).toString(16):Math.min(255,t).toString(16)}function ce(t,e,r){var n,i,a,o=0,s=0,l=0;if(n=/([a-z]+)\\((.*)\\)/.exec(t=t.toLowerCase()))switch(i=n[2].split(\",\"),n[1]){case\"hsl\":return r(parseFloat(i[0]),parseFloat(i[1])/100,parseFloat(i[2])/100);case\"rgb\":return e(de(i[0]),de(i[1]),de(i[2]))}return(a=ve.get(t))?e(a.r,a.g,a.b):(null==t||\"#\"!==t.charAt(0)||isNaN(a=parseInt(t.slice(1),16))||(4===t.length?(o=(3840&a)>>4,o|=o>>4,s=240&a,s|=s>>4,l=15&a,l|=l<<4):7===t.length&&(o=(16711680&a)>>16,s=(65280&a)>>8,l=255&a)),e(o,s,l))}function fe(t,e,r){var n,i,a=Math.min(t/=255,e/=255,r/=255),o=Math.max(t,e,r),s=o-a,l=(o+a)/2;return s?(i=l<.5?s/(o+a):s/(2-o-a),n=t==o?(e-r)/s+(e0&&l<1?0:n),new qt(n,i,l)}function he(t,e,r){var n=ne((.4124564*(t=pe(t))+.3575761*(e=pe(e))+.1804375*(r=pe(r)))/Jt),i=ne((.2126729*t+.7151522*e+.072175*r)/$t);return Zt(116*i-16,500*(n-i),200*(i-ne((.0193339*t+.119192*e+.9503041*r)/Qt)))}function pe(t){return(t/=255)<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}function de(t){var e=parseFloat(t);return\"%\"===t.charAt(t.length-1)?Math.round(2.55*e):e}le.brighter=function(t){t=Math.pow(.7,arguments.length?t:1);var e=this.r,r=this.g,n=this.b,i=30;return e||r||n?(e&&e=200&&e<300||304===e){try{t=r.call(i,u)}catch(t){return void o.error.call(i,t)}o.load.call(i,t)}else o.error.call(i,u)}return self.XDomainRequest&&!(\"withCredentials\"in u)&&/^(http(s)?:)?\\/\\//.test(t)&&(u=new XDomainRequest),\"onload\"in u?u.onload=u.onerror=f:u.onreadystatechange=function(){u.readyState>3&&f()},u.onprogress=function(t){var e=a.event;a.event=t;try{o.progress.call(i,u)}finally{a.event=e}},i.header=function(t,e){return t=(t+\"\").toLowerCase(),arguments.length<2?l[t]:(null==e?delete l[t]:l[t]=e+\"\",i)},i.mimeType=function(t){return arguments.length?(e=null==t?null:t+\"\",i):e},i.responseType=function(t){return arguments.length?(c=t,i):c},i.response=function(t){return r=t,i},[\"get\",\"post\"].forEach((function(t){i[t]=function(){return i.send.apply(i,[t].concat(s(arguments)))}})),i.send=function(r,n,a){if(2===arguments.length&&\"function\"==typeof n&&(a=n,n=null),u.open(r,t,!0),null==e||\"accept\"in l||(l.accept=e+\",*/*\"),u.setRequestHeader)for(var s in l)u.setRequestHeader(s,l[s]);return null!=e&&u.overrideMimeType&&u.overrideMimeType(e),null!=c&&(u.responseType=c),null!=a&&i.on(\"error\",a).on(\"load\",(function(t){a(null,t)})),o.beforesend.call(i,u),u.send(null==n?null:n),i},i.abort=function(){return u.abort(),i},a.rebind(i,o,\"on\"),null==n?i:i.get(function(t){return 1===t.length?function(e,r){t(null==e?r:null)}:t}(n))}ve.forEach((function(t,e){ve.set(t,oe(e))})),a.functor=ge,a.xhr=ye(D),a.dsv=function(t,e){var r=new RegExp('[\"'+t+\"\\n]\"),n=t.charCodeAt(0);function i(t,r,n){arguments.length<3&&(n=r,r=null);var i=me(t,e,null==r?a:o(r),n);return i.row=function(t){return arguments.length?i.response(null==(r=t)?a:o(t)):r},i}function a(t){return i.parse(t.responseText)}function o(t){return function(e){return i.parse(e.responseText,t)}}function s(e){return e.map(l).join(t)}function l(t){return r.test(t)?'\"'+t.replace(/\\\"/g,'\"\"')+'\"':t}return i.parse=function(t,e){var r;return i.parseRows(t,(function(t,n){if(r)return r(t,n-1);var i=function(e){for(var r={},n=t.length,i=0;i=l)return o;if(i)return i=!1,a;var e=u;if(34===t.charCodeAt(e)){for(var r=e;r++24?(isFinite(e)&&(clearTimeout(we),we=setTimeout(Ae,e)),_e=0):(_e=1,Te(Ae))}function Me(){for(var t=Date.now(),e=xe;e;)t>=e.t&&e.c(t-e.t)&&(e.c=null),e=e.n;return t}function Se(){for(var t,e=xe,r=1/0;e;)e.c?(e.t1&&(e=t[a[o-2]],r=t[a[o-1]],n=t[s],(r[0]-e[0])*(n[1]-e[1])-(r[1]-e[1])*(n[0]-e[0])<=0);)--o;a[o++]=s}return a.slice(0,o)}function Pe(t,e){return t[0]-e[0]||t[1]-e[1]}a.timer=function(){ke.apply(this,arguments)},a.timer.flush=function(){Me(),Se()},a.round=function(t,e){return e?Math.round(t*(e=Math.pow(10,e)))/e:Math.round(t)},a.geom={},a.geom.hull=function(t){var e=Ee,r=Le;if(arguments.length)return n(t);function n(t){if(t.length<3)return[];var n,i=ge(e),a=ge(r),o=t.length,s=[],l=[];for(n=0;n=0;--n)p.push(t[s[u[n]][2]]);for(n=+f;nEt)s=s.L;else{if(!((i=a-Ze(s,o))>Et)){n>-Et?(e=s.P,r=s):i>-Et?(e=s,r=s.N):e=r=s;break}if(!s.R){e=s;break}s=s.R}var l=He(t);if(Be.insert(e,l),e||r){if(e===r)return tr(e),r=He(e.site),Be.insert(l,r),l.edge=r.edge=nr(e.site,l.site),Qe(e),void Qe(r);if(r){tr(e),tr(r);var u=e.site,c=u.x,f=u.y,h=t.x-c,p=t.y-f,d=r.site,v=d.x-c,g=d.y-f,y=2*(h*g-p*v),m=h*h+p*p,x=v*v+g*g,b={x:(g*m-p*x)/y+c,y:(h*x-v*m)/y+f};ir(r.edge,u,d,b),l.edge=nr(u,t,null,b),r.edge=nr(t,d,null,b),Qe(e),Qe(r)}else l.edge=nr(e.site,l.site)}}function Xe(t,e){var r=t.site,n=r.x,i=r.y,a=i-e;if(!a)return n;var o=t.P;if(!o)return-1/0;var s=(r=o.site).x,l=r.y,u=l-e;if(!u)return s;var c=s-n,f=1/a-1/u,h=c/u;return f?(-h+Math.sqrt(h*h-2*f*(c*c/(-2*u)-l+u/2+i-a/2)))/f+n:(n+s)/2}function Ze(t,e){var r=t.N;if(r)return Xe(r,e);var n=t.site;return n.y===e?n.x:1/0}function Ke(t){this.site=t,this.edges=[]}function Je(t,e){return e.angle-t.angle}function $e(){sr(this),this.x=this.y=this.arc=this.site=this.cy=null}function Qe(t){var e=t.P,r=t.N;if(e&&r){var n=e.site,i=t.site,a=r.site;if(n!==a){var o=i.x,s=i.y,l=n.x-o,u=n.y-s,c=a.x-o,f=2*(l*(g=a.y-s)-u*c);if(!(f>=-Lt)){var h=l*l+u*u,p=c*c+g*g,d=(g*h-u*p)/f,v=(l*p-c*h)/f,g=v+s,y=Ve.pop()||new $e;y.arc=t,y.site=i,y.x=d+o,y.y=g+Math.sqrt(d*d+v*v),y.cy=g,t.circle=y;for(var m=null,x=je._;x;)if(y.y=s)return;if(h>d){if(a){if(a.y>=u)return}else a={x:g,y:l};r={x:g,y:u}}else{if(a){if(a.y1)if(h>d){if(a){if(a.y>=u)return}else a={x:(l-i)/n,y:l};r={x:(u-i)/n,y:u}}else{if(a){if(a.y=s)return}else a={x:o,y:n*o+i};r={x:s,y:n*s+i}}else{if(a){if(a.x0)){if(e/=h,h<0){if(e0){if(e>f)return;e>c&&(c=e)}if(e=i-l,h||!(e<0)){if(e/=h,h<0){if(e>f)return;e>c&&(c=e)}else if(h>0){if(e0)){if(e/=p,p<0){if(e0){if(e>f)return;e>c&&(c=e)}if(e=a-u,p||!(e<0)){if(e/=p,p<0){if(e>f)return;e>c&&(c=e)}else if(p>0){if(e0&&(t.a={x:l+c*h,y:u+c*p}),f<1&&(t.b={x:l+f*h,y:u+f*p}),t}}}}}),l=o.length;l--;)(!er(e=o[l],t)||!s(e)||w(e.a.x-e.b.x)Et||w(i-r)>Et)&&(s.splice(o,0,new ar((y=a.site,m=c,x=w(n-f)Et?{x:f,y:w(e-f)Et?{x:w(r-d)Et?{x:h,y:w(e-h)Et?{x:w(r-p)=r&&u.x<=i&&u.y>=n&&u.y<=o?[[r,o],[i,o],[i,n],[r,n]]:[]).point=t[s]})),e}function s(t){return t.map((function(t,e){return{x:Math.round(n(t,e)/Et)*Et,y:Math.round(i(t,e)/Et)*Et,i:e}}))}return o.links=function(t){return fr(s(t)).edges.filter((function(t){return t.l&&t.r})).map((function(e){return{source:t[e.l.i],target:t[e.r.i]}}))},o.triangles=function(t){var e=[];return fr(s(t)).cells.forEach((function(r,n){for(var i,a,o,s,l=r.site,u=r.edges.sort(Je),c=-1,f=u.length,h=u[f-1].edge,p=h.l===l?h.r:h.l;++ca&&(i=e.slice(a,i),s[o]?s[o]+=i:s[++o]=i),(r=r[0])===(n=n[0])?s[o]?s[o]+=n:s[++o]=n:(s[++o]=null,l.push({i:o,x:xr(r,n)})),a=wr.lastIndex;return av&&(v=l.x),l.y>g&&(g=l.y),u.push(l.x),c.push(l.y);else for(f=0;fv&&(v=x),b>g&&(g=b),u.push(x),c.push(b)}var _=v-p,T=g-d;function k(t,e,r,n,i,a,o,s){if(!isNaN(r)&&!isNaN(n))if(t.leaf){var l=t.x,u=t.y;if(null!=l)if(w(l-r)+w(u-n)<.01)A(t,e,r,n,i,a,o,s);else{var c=t.point;t.x=t.y=t.point=null,A(t,c,l,u,i,a,o,s),A(t,e,r,n,i,a,o,s)}else t.x=r,t.y=n,t.point=e}else A(t,e,r,n,i,a,o,s)}function A(t,e,r,n,i,a,o,s){var l=.5*(i+o),u=.5*(a+s),c=r>=l,f=n>=u,h=f<<1|c;t.leaf=!1,c?i=l:o=l,f?a=u:s=u,k(t=t.nodes[h]||(t.nodes[h]={leaf:!0,nodes:[],point:null,x:null,y:null}),e,r,n,i,a,o,s)}_>T?g=d+_:v=p+T;var M={leaf:!0,nodes:[],point:null,x:null,y:null,add:function(t){k(M,t,+y(t,++f),+m(t,f),p,d,v,g)}};if(M.visit=function(t){gr(t,M,p,d,v,g)},M.find=function(t){return function(t,e,r,n,i,a,o){var s,l=1/0;return function t(u,c,f,h,p){if(!(c>a||f>o||h=_)<<1|e>=b,T=w+4;w=0&&!(r=a.interpolators[n](t,e)););return r}function kr(t,e){var r,n=[],i=[],a=t.length,o=e.length,s=Math.min(t.length,e.length);for(r=0;r=1)return 1;var e=t*t,r=e*t;return 4*(t<.5?r:3*(t-e)+r-.75)}function Ir(t){return 1-Math.cos(t*It)}function zr(t){return Math.pow(2,10*(t-1))}function Dr(t){return 1-Math.sqrt(1-t*t)}function Rr(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375}function Fr(t,e){return e-=t,function(r){return Math.round(t+e*r)}}function Br(t){var e,r,n,i=[t.a,t.b],a=[t.c,t.d],o=jr(i),s=Nr(i,a),l=jr(((e=a)[0]+=(n=-s)*(r=i)[0],e[1]+=n*r[1],e))||0;i[0]*a[1]=0?t.slice(0,r):t,i=r>=0?t.slice(r+1):\"in\";return n=Mr.get(n)||Ar,i=Sr.get(i)||D,e=i(n.apply(null,o.call(arguments,1))),function(t){return t<=0?0:t>=1?1:e(t)}},a.interpolateHcl=function(t,e){t=a.hcl(t),e=a.hcl(e);var r=t.h,n=t.c,i=t.l,o=e.h-r,s=e.c-n,l=e.l-i;return isNaN(s)&&(s=0,n=isNaN(n)?e.c:n),isNaN(o)?(o=0,r=isNaN(r)?e.h:r):o>180?o-=360:o<-180&&(o+=360),function(t){return Xt(r+o*t,n+s*t,i+l*t)+\"\"}},a.interpolateHsl=function(t,e){t=a.hsl(t),e=a.hsl(e);var r=t.h,n=t.s,i=t.l,o=e.h-r,s=e.s-n,l=e.l-i;return isNaN(s)&&(s=0,n=isNaN(n)?e.s:n),isNaN(o)?(o=0,r=isNaN(r)?e.h:r):o>180?o-=360:o<-180&&(o+=360),function(t){return Gt(r+o*t,n+s*t,i+l*t)+\"\"}},a.interpolateLab=function(t,e){t=a.lab(t),e=a.lab(e);var r=t.l,n=t.a,i=t.b,o=e.l-r,s=e.a-n,l=e.b-i;return function(t){return ee(r+o*t,n+s*t,i+l*t)+\"\"}},a.interpolateRound=Fr,a.transform=function(t){var e=l.createElementNS(a.ns.prefix.svg,\"g\");return(a.transform=function(t){if(null!=t){e.setAttribute(\"transform\",t);var r=e.transform.baseVal.consolidate()}return new Br(r?r.matrix:Ur)})(t)},Br.prototype.toString=function(){return\"translate(\"+this.translate+\")rotate(\"+this.rotate+\")skewX(\"+this.skew+\")scale(\"+this.scale+\")\"};var Ur={a:1,b:0,c:0,d:1,e:0,f:0};function Vr(t){return t.length?t.pop()+\",\":\"\"}function qr(t,e){var r=[],n=[];return t=a.transform(t),e=a.transform(e),function(t,e,r,n){if(t[0]!==e[0]||t[1]!==e[1]){var i=r.push(\"translate(\",null,\",\",null,\")\");n.push({i:i-4,x:xr(t[0],e[0])},{i:i-2,x:xr(t[1],e[1])})}else(e[0]||e[1])&&r.push(\"translate(\"+e+\")\")}(t.translate,e.translate,r,n),function(t,e,r,n){t!==e?(t-e>180?e+=360:e-t>180&&(t+=360),n.push({i:r.push(Vr(r)+\"rotate(\",null,\")\")-2,x:xr(t,e)})):e&&r.push(Vr(r)+\"rotate(\"+e+\")\")}(t.rotate,e.rotate,r,n),function(t,e,r,n){t!==e?n.push({i:r.push(Vr(r)+\"skewX(\",null,\")\")-2,x:xr(t,e)}):e&&r.push(Vr(r)+\"skewX(\"+e+\")\")}(t.skew,e.skew,r,n),function(t,e,r,n){if(t[0]!==e[0]||t[1]!==e[1]){var i=r.push(Vr(r)+\"scale(\",null,\",\",null,\")\");n.push({i:i-4,x:xr(t[0],e[0])},{i:i-2,x:xr(t[1],e[1])})}else 1===e[0]&&1===e[1]||r.push(Vr(r)+\"scale(\"+e+\")\")}(t.scale,e.scale,r,n),t=e=null,function(t){for(var e,i=-1,a=n.length;++i0?r=e:(t.c=null,t.t=NaN,t=null,l.end({type:\"end\",alpha:r=0})):e>0&&(l.start({type:\"start\",alpha:r=e}),t=ke(s.tick)),s):r},s.start=function(){var t,e,r,a=y.length,l=m.length,c=u[0],d=u[1];for(t=0;t=0;)r.push(i[n])}function an(t,e){for(var r=[t],n=[];null!=(t=r.pop());)if(n.push(t),(a=t.children)&&(i=a.length))for(var i,a,o=-1;++o=0;)o.push(c=u[l]),c.parent=a,c.depth=a.depth+1;r&&(a.value=0),a.children=u}else r&&(a.value=+r.call(n,a,a.depth)||0),delete a.children;return an(i,(function(e){var n,i;t&&(n=e.children)&&n.sort(t),r&&(i=e.parent)&&(i.value+=e.value)})),s}return n.sort=function(e){return arguments.length?(t=e,n):t},n.children=function(t){return arguments.length?(e=t,n):e},n.value=function(t){return arguments.length?(r=t,n):r},n.revalue=function(t){return r&&(nn(t,(function(t){t.children&&(t.value=0)})),an(t,(function(t){var e;t.children||(t.value=+r.call(n,t,t.depth)||0),(e=t.parent)&&(e.value+=t.value)}))),t},n},a.layout.partition=function(){var t=a.layout.hierarchy(),e=[1,1];function r(t,e,n,i){var a=t.children;if(t.x=e,t.y=t.depth*i,t.dx=n,t.dy=i,a&&(o=a.length)){var o,s,l,u=-1;for(n=t.value?n/t.value:0;++us&&(s=n),o.push(n)}for(r=0;ri&&(n=r,i=e);return n}function xn(t){return t.reduce(bn,0)}function bn(t,e){return t+e[1]}function _n(t,e){return wn(t,Math.ceil(Math.log(e.length)/Math.LN2+1))}function wn(t,e){for(var r=-1,n=+t[0],i=(t[1]-n)/e,a=[];++r<=e;)a[r]=i*r+n;return a}function Tn(t){return[a.min(t),a.max(t)]}function kn(t,e){return t.value-e.value}function An(t,e){var r=t._pack_next;t._pack_next=e,e._pack_prev=t,e._pack_next=r,r._pack_prev=e}function Mn(t,e){t._pack_next=e,e._pack_prev=t}function Sn(t,e){var r=e.x-t.x,n=e.y-t.y,i=t.r+e.r;return.999*i*i>r*r+n*n}function En(t){if((e=t.children)&&(l=e.length)){var e,r,n,i,a,o,s,l,u=1/0,c=-1/0,f=1/0,h=-1/0;if(e.forEach(Ln),(r=e[0]).x=-r.r,r.y=0,x(r),l>1&&((n=e[1]).x=n.r,n.y=0,x(n),l>2))for(On(r,n,i=e[2]),x(i),An(r,i),r._pack_prev=i,An(i,n),n=r._pack_next,a=3;a0)for(o=-1;++o=f[0]&&l<=f[1]&&((s=u[a.bisect(h,l,1,d)-1]).y+=v,s.push(i[o]));return u}return i.value=function(t){return arguments.length?(e=t,i):e},i.range=function(t){return arguments.length?(r=ge(t),i):r},i.bins=function(t){return arguments.length?(n=\"number\"==typeof t?function(e){return wn(e,t)}:ge(t),i):n},i.frequency=function(e){return arguments.length?(t=!!e,i):t},i},a.layout.pack=function(){var t,e=a.layout.hierarchy().sort(kn),r=0,n=[1,1];function i(i,a){var o=e.call(this,i,a),s=o[0],l=n[0],u=n[1],c=null==t?Math.sqrt:\"function\"==typeof t?t:function(){return t};if(s.x=s.y=0,an(s,(function(t){t.r=+c(t.value)})),an(s,En),r){var f=r*(t?1:Math.max(2*s.r/l,2*s.r/u))/2;an(s,(function(t){t.r+=f})),an(s,En),an(s,(function(t){t.r-=f}))}return Pn(s,l/2,u/2,t?1:1/Math.max(2*s.r/l,2*s.r/u)),o}return i.size=function(t){return arguments.length?(n=t,i):n},i.radius=function(e){return arguments.length?(t=null==e||\"function\"==typeof e?e:+e,i):t},i.padding=function(t){return arguments.length?(r=+t,i):r},rn(i,e)},a.layout.tree=function(){var t=a.layout.hierarchy().sort(null).value(null),e=In,r=[1,1],n=null;function i(i,a){var u=t.call(this,i,a),c=u[0],f=function(t){for(var e,r={A:null,children:[t]},n=[r];null!=(e=n.pop());)for(var i,a=e.children,o=0,s=a.length;op.x&&(p=t),t.depth>d.depth&&(d=t)}));var v=e(h,p)/2-h.x,g=r[0]/(p.x+e(p,h)/2+v),y=r[1]/(d.depth||1);nn(c,(function(t){t.x=(t.x+v)*g,t.y=t.depth*y}))}return u}function o(t){var r=t.children,n=t.parent.children,i=t.i?n[t.i-1]:null;if(r.length){!function(t){for(var e,r=0,n=0,i=t.children,a=i.length;--a>=0;)(e=i[a]).z+=r,e.m+=r,r+=e.s+(n+=e.c)}(t);var a=(r[0].z+r[r.length-1].z)/2;i?(t.z=i.z+e(t._,i._),t.m=t.z-a):t.z=a}else i&&(t.z=i.z+e(t._,i._));t.parent.A=function(t,r,n){if(r){for(var i,a=t,o=t,s=r,l=a.parent.children[0],u=a.m,c=o.m,f=s.m,h=l.m;s=Dn(s),a=zn(a),s&&a;)l=zn(l),(o=Dn(o)).a=t,(i=s.z+f-a.z-u+e(s._,a._))>0&&(Rn(Fn(s,t,n),t,i),u+=i,c+=i),f+=s.m,u+=a.m,h+=l.m,c+=o.m;s&&!Dn(o)&&(o.t=s,o.m+=f-c),a&&!zn(l)&&(l.t=a,l.m+=u-h,n=t)}return n}(t,i,t.parent.A||n[0])}function s(t){t._.x=t.z+t.parent.m,t.m+=t.parent.m}function l(t){t.x*=r[0],t.y=t.depth*r[1]}return i.separation=function(t){return arguments.length?(e=t,i):e},i.size=function(t){return arguments.length?(n=null==(r=t)?l:null,i):n?null:r},i.nodeSize=function(t){return arguments.length?(n=null==(r=t)?null:l,i):n?r:null},rn(i,t)},a.layout.cluster=function(){var t=a.layout.hierarchy().sort(null).value(null),e=In,r=[1,1],n=!1;function i(i,o){var s,l=t.call(this,i,o),u=l[0],c=0;an(u,(function(t){var r=t.children;r&&r.length?(t.x=function(t){return t.reduce((function(t,e){return t+e.x}),0)/t.length}(r),t.y=function(t){return 1+a.max(t,(function(t){return t.y}))}(r)):(t.x=s?c+=e(t,s):0,t.y=0,s=t)}));var f=Bn(u),h=Nn(u),p=f.x-e(f,h)/2,d=h.x+e(h,f)/2;return an(u,n?function(t){t.x=(t.x-u.x)*r[0],t.y=(u.y-t.y)*r[1]}:function(t){t.x=(t.x-p)/(d-p)*r[0],t.y=(1-(u.y?t.y/u.y:1))*r[1]}),l}return i.separation=function(t){return arguments.length?(e=t,i):e},i.size=function(t){return arguments.length?(n=null==(r=t),i):n?null:r},i.nodeSize=function(t){return arguments.length?(n=null!=(r=t),i):n?r:null},rn(i,t)},a.layout.treemap=function(){var t,e=a.layout.hierarchy(),r=Math.round,n=[1,1],i=null,o=jn,s=!1,l=\"squarify\",u=.5*(1+Math.sqrt(5));function c(t,e){for(var r,n,i=-1,a=t.length;++i0;)s.push(r=u[i-1]),s.area+=r.area,\"squarify\"!==l||(n=p(s,v))<=h?(u.pop(),h=n):(s.area-=s.pop().area,d(s,v,a,!1),v=Math.min(a.dx,a.dy),s.length=s.area=0,h=1/0);s.length&&(d(s,v,a,!0),s.length=s.area=0),e.forEach(f)}}function h(t){var e=t.children;if(e&&e.length){var r,n=o(t),i=e.slice(),a=[];for(c(i,n.dx*n.dy/t.value),a.area=0;r=i.pop();)a.push(r),a.area+=r.area,null!=r.z&&(d(a,r.z?n.dx:n.dy,n,!i.length),a.length=a.area=0);e.forEach(h)}}function p(t,e){for(var r,n=t.area,i=0,a=1/0,o=-1,s=t.length;++oi&&(i=r));return e*=e,(n*=n)?Math.max(e*i*u/n,n/(e*a*u)):1/0}function d(t,e,n,i){var a,o=-1,s=t.length,l=n.x,u=n.y,c=e?r(t.area/e):0;if(e==n.dx){for((i||c>n.dy)&&(c=n.dy);++on.dx)&&(c=n.dx);++o1);return t+e*r*Math.sqrt(-2*Math.log(i)/i)}},logNormal:function(){var t=a.random.normal.apply(a,arguments);return function(){return Math.exp(t())}},bates:function(t){var e=a.random.irwinHall(t);return function(){return e()/t}},irwinHall:function(t){return function(){for(var e=0,r=0;r2?Xn:Hn,l=n?Gr:Hr;return i=o(t,e,l,r),a=o(e,t,l,Tr),s}function s(t){return i(t)}return s.invert=function(t){return a(t)},s.domain=function(e){return arguments.length?(t=e.map(Number),o()):t},s.range=function(t){return arguments.length?(e=t,o()):e},s.rangeRound=function(t){return s.range(t).interpolate(Fr)},s.clamp=function(t){return arguments.length?(n=t,o()):n},s.interpolate=function(t){return arguments.length?(r=t,o()):r},s.ticks=function(e){return Qn(t,e)},s.tickFormat=function(e,r){return d3_scale_linearTickFormat(t,e,r)},s.nice=function(e){return Jn(t,e),o()},s.copy=function(){return Zn(t,e,r,n)},o()}function Kn(t,e){return a.rebind(t,e,\"range\",\"rangeRound\",\"interpolate\",\"clamp\")}function Jn(t,e){return Gn(t,Wn($n(t,e)[2])),Gn(t,Wn($n(t,e)[2])),t}function $n(t,e){null==e&&(e=10);var r=Vn(t),n=r[1]-r[0],i=Math.pow(10,Math.floor(Math.log(n/e)/Math.LN10)),a=e/n*i;return a<=.15?i*=10:a<=.35?i*=5:a<=.75&&(i*=2),r[0]=Math.ceil(r[0]/i)*i,r[1]=Math.floor(r[1]/i)*i+.5*i,r[2]=i,r}function Qn(t,e){return a.range.apply(a,$n(t,e))}function ti(t,e,r,n){function i(t){return(r?Math.log(t<0?0:t):-Math.log(t>0?0:-t))/Math.log(e)}function a(t){return r?Math.pow(e,t):-Math.pow(e,-t)}function o(e){return t(i(e))}return o.invert=function(e){return a(t.invert(e))},o.domain=function(e){return arguments.length?(r=e[0]>=0,t.domain((n=e.map(Number)).map(i)),o):n},o.base=function(r){return arguments.length?(e=+r,t.domain(n.map(i)),o):e},o.nice=function(){var e=Gn(n.map(i),r?Math:ei);return t.domain(e),n=e.map(a),o},o.ticks=function(){var t=Vn(n),o=[],s=t[0],l=t[1],u=Math.floor(i(s)),c=Math.ceil(i(l)),f=e%1?2:e;if(isFinite(c-u)){if(r){for(;u0;h--)o.push(a(u)*h);for(u=0;o[u]l;c--);o=o.slice(u,c)}return o},o.copy=function(){return ti(t.copy(),e,r,n)},Kn(o,t)}a.scale.linear=function(){return Zn([0,1],[0,1],Tr,!1)},a.scale.log=function(){return ti(a.scale.linear().domain([0,1]),10,!0,[1,10])};var ei={floor:function(t){return-Math.ceil(-t)},ceil:function(t){return-Math.floor(-t)}};function ri(t,e,r){var n=ni(e),i=ni(1/e);function a(e){return t(n(e))}return a.invert=function(e){return i(t.invert(e))},a.domain=function(e){return arguments.length?(t.domain((r=e.map(Number)).map(n)),a):r},a.ticks=function(t){return Qn(r,t)},a.tickFormat=function(t,e){return d3_scale_linearTickFormat(r,t,e)},a.nice=function(t){return a.domain(Jn(r,t))},a.exponent=function(o){return arguments.length?(n=ni(e=o),i=ni(1/e),t.domain(r.map(n)),a):e},a.copy=function(){return ri(t.copy(),e,r)},Kn(a,t)}function ni(t){return function(e){return e<0?-Math.pow(-e,t):Math.pow(e,t)}}function ii(t,e){var r,n,i;function o(i){return n[((r.get(i)||(\"range\"===e.t?r.set(i,t.push(i)):NaN))-1)%n.length]}function s(e,r){return a.range(t.length).map((function(t){return e+r*t}))}return o.domain=function(n){if(!arguments.length)return t;t=[],r=new k;for(var i,a=-1,s=n.length;++a0?r[n-1]:t[0],nf?0:1;if(u=Ot)return l(u,p)+(s?l(s,1-p):\"\")+\"Z\";var d,v,g,y,m,x,b,_,w,T,k,A,M=0,S=0,E=[];if((y=(+o.apply(this,arguments)||0)/2)&&(g=n===di?Math.sqrt(s*s+u*u):+n.apply(this,arguments),p||(S*=-1),u&&(S=Rt(g/u*Math.sin(y))),s&&(M=Rt(g/s*Math.sin(y)))),u){m=u*Math.cos(c+S),x=u*Math.sin(c+S),b=u*Math.cos(f-S),_=u*Math.sin(f-S);var L=Math.abs(f-c-2*S)<=Ct?0:1;if(S&&bi(m,x,b,_)===p^L){var C=(c+f)/2;m=u*Math.cos(C),x=u*Math.sin(C),b=_=null}}else m=x=0;if(s){w=s*Math.cos(f-M),T=s*Math.sin(f-M),k=s*Math.cos(c+M),A=s*Math.sin(c+M);var P=Math.abs(c-f+2*M)<=Ct?0:1;if(M&&bi(w,T,k,A)===1-p^P){var O=(c+f)/2;w=s*Math.cos(O),T=s*Math.sin(O),k=A=null}}else w=T=0;if(h>Et&&(d=Math.min(Math.abs(u-s)/2,+r.apply(this,arguments)))>.001){v=s0?0:1}function _i(t,e,r,n,i){var a=t[0]-e[0],o=t[1]-e[1],s=(i?n:-n)/Math.sqrt(a*a+o*o),l=s*o,u=-s*a,c=t[0]+l,f=t[1]+u,h=e[0]+l,p=e[1]+u,d=(c+h)/2,v=(f+p)/2,g=h-c,y=p-f,m=g*g+y*y,x=r-n,b=c*p-h*f,_=(y<0?-1:1)*Math.sqrt(Math.max(0,x*x*m-b*b)),w=(b*y-g*_)/m,T=(-b*g-y*_)/m,k=(b*y+g*_)/m,A=(-b*g+y*_)/m,M=w-d,S=T-v,E=k-d,L=A-v;return M*M+S*S>E*E+L*L&&(w=k,T=A),[[w-l,T-u],[w*r/x,T*r/x]]}function wi(){return!0}function Ti(t){var e=Ee,r=Le,n=wi,i=Ai,a=i.key,o=.7;function s(a){var s,l=[],u=[],c=-1,f=a.length,h=ge(e),p=ge(r);function d(){l.push(\"M\",i(t(u),o))}for(;++c1&&i.push(\"H\",n[0]),i.join(\"\")},\"step-before\":Si,\"step-after\":Ei,basis:Pi,\"basis-open\":function(t){if(t.length<4)return Ai(t);for(var e,r=[],n=-1,i=t.length,a=[0],o=[0];++n<3;)e=t[n],a.push(e[0]),o.push(e[1]);for(r.push(Oi(Di,a)+\",\"+Oi(Di,o)),--n;++n9&&(i=3*e/Math.sqrt(i),o[s]=i*r,o[s+1]=i*n);for(s=-1;++s<=l;)i=(t[Math.min(l,s+1)][0]-t[Math.max(0,s-1)][0])/(6*(1+o[s]*o[s])),a.push([i||0,o[s]*i||0]);return a}(t))}});function Ai(t){return t.length>1?t.join(\"L\"):t+\"Z\"}function Mi(t){return t.join(\"L\")+\"Z\"}function Si(t){for(var e=0,r=t.length,n=t[0],i=[n[0],\",\",n[1]];++e1){s=e[1],a=t[l],l++,n+=\"C\"+(i[0]+o[0])+\",\"+(i[1]+o[1])+\",\"+(a[0]-s[0])+\",\"+(a[1]-s[1])+\",\"+a[0]+\",\"+a[1];for(var u=2;uCt)+\",1 \"+e}function l(t,e,r,n){return\"Q 0,0 \"+n}return a.radius=function(t){return arguments.length?(r=ge(t),a):r},a.source=function(e){return arguments.length?(t=ge(e),a):t},a.target=function(t){return arguments.length?(e=ge(t),a):e},a.startAngle=function(t){return arguments.length?(n=ge(t),a):n},a.endAngle=function(t){return arguments.length?(i=ge(t),a):i},a},a.svg.diagonal=function(){var t=ji,e=Ui,r=qi;function n(n,i){var a=t.call(this,n,i),o=e.call(this,n,i),s=(a.y+o.y)/2,l=[a,{x:a.x,y:s},{x:o.x,y:s},o];return\"M\"+(l=l.map(r))[0]+\"C\"+l[1]+\" \"+l[2]+\" \"+l[3]}return n.source=function(e){return arguments.length?(t=ge(e),n):t},n.target=function(t){return arguments.length?(e=ge(t),n):e},n.projection=function(t){return arguments.length?(r=t,n):r},n},a.svg.diagonal.radial=function(){var t=a.svg.diagonal(),e=qi,r=t.projection;return t.projection=function(t){return arguments.length?r(function(t){return function(){var e=t.apply(this,arguments),r=e[0],n=e[1]-It;return[r*Math.cos(n),r*Math.sin(n)]}}(e=t)):e},t},a.svg.symbol=function(){var t=Gi,e=Hi;function r(r,n){return(Yi.get(t.call(this,r,n))||Wi)(e.call(this,r,n))}return r.type=function(e){return arguments.length?(t=ge(e),r):t},r.size=function(t){return arguments.length?(e=ge(t),r):e},r};var Yi=a.map({circle:Wi,cross:function(t){var e=Math.sqrt(t/5)/2;return\"M\"+-3*e+\",\"+-e+\"H\"+-e+\"V\"+-3*e+\"H\"+e+\"V\"+-e+\"H\"+3*e+\"V\"+e+\"H\"+e+\"V\"+3*e+\"H\"+-e+\"V\"+e+\"H\"+-3*e+\"Z\"},diamond:function(t){var e=Math.sqrt(t/(2*Zi)),r=e*Zi;return\"M0,\"+-e+\"L\"+r+\",0 0,\"+e+\" \"+-r+\",0Z\"},square:function(t){var e=Math.sqrt(t)/2;return\"M\"+-e+\",\"+-e+\"L\"+e+\",\"+-e+\" \"+e+\",\"+e+\" \"+-e+\",\"+e+\"Z\"},\"triangle-down\":function(t){var e=Math.sqrt(t/Xi),r=e*Xi/2;return\"M0,\"+r+\"L\"+e+\",\"+-r+\" \"+-e+\",\"+-r+\"Z\"},\"triangle-up\":function(t){var e=Math.sqrt(t/Xi),r=e*Xi/2;return\"M0,\"+-r+\"L\"+e+\",\"+r+\" \"+-e+\",\"+r+\"Z\"}});a.svg.symbolTypes=Yi.keys();var Xi=Math.sqrt(3),Zi=Math.tan(30*zt);J.transition=function(t){for(var e,r,n=Qi||++ra,i=aa(t),a=[],o=ta||{time:Date.now(),ease:Or,delay:0,duration:250},s=-1,l=this.length;++s0;)u[--h].call(t,o);if(a>=1)return f.event&&f.event.end.call(t,t.__data__,e),--c.count?delete c[n]:delete t[r],1}f||(a=i.time,o=ke((function(t){var e=f.delay;if(o.t=e+a,e<=t)return h(t-e);o.c=h}),0,a),f=c[n]={tween:new k,time:a,timer:o,delay:i.delay,duration:i.duration,ease:i.ease,index:e},i=null,++c.count)}ea.call=J.call,ea.empty=J.empty,ea.node=J.node,ea.size=J.size,a.transition=function(t,e){return t&&t.transition?Qi?t.transition(e):t:a.selection().transition(t)},a.transition.prototype=ea,ea.select=function(t){var e,r,n,i=this.id,a=this.namespace,o=[];t=$(t);for(var s=-1,l=this.length;++srect,.s>rect\").attr(\"width\",o[1]-o[0])}function v(t){t.select(\".extent\").attr(\"y\",s[0]),t.selectAll(\".extent,.e>rect,.w>rect\").attr(\"height\",s[1]-s[0])}function g(){var f,g,y=this,m=a.select(a.event.target),x=r.of(y,arguments),b=a.select(y),_=m.datum(),w=!/^(n|s)$/.test(_)&&n,T=!/^(e|w)$/.test(_)&&i,k=m.classed(\"extent\"),A=kt(y),M=a.mouse(y),S=a.select(c(y)).on(\"keydown.brush\",(function(){32==a.event.keyCode&&(k||(f=null,M[0]-=o[1],M[1]-=s[1],k=2),V())})).on(\"keyup.brush\",(function(){32==a.event.keyCode&&2==k&&(M[0]+=o[1],M[1]+=s[1],k=0,V())}));if(a.event.changedTouches?S.on(\"touchmove.brush\",C).on(\"touchend.brush\",O):S.on(\"mousemove.brush\",C).on(\"mouseup.brush\",O),b.interrupt().selectAll(\"*\").interrupt(),k)M[0]=o[0]-M[0],M[1]=s[0]-M[1];else if(_){var E=+/w$/.test(_),L=+/^n/.test(_);g=[o[1-E]-M[0],s[1-L]-M[1]],M[0]=o[E],M[1]=s[L]}else a.event.altKey&&(f=M.slice());function C(){var t=a.mouse(y),e=!1;g&&(t[0]+=g[0],t[1]+=g[1]),k||(a.event.altKey?(f||(f=[(o[0]+o[1])/2,(s[0]+s[1])/2]),M[0]=o[+(t[0](n=1))return n;for(;ra?r=i:n=i,i=.5*(n-r)+r}return i},i.prototype.solve=function(t,e){return this.sampleCurveY(this.solveCurveX(t,e))};var a=o;function o(t,e){this.x=t,this.y=e}o.prototype={clone:function(){return new o(this.x,this.y)},add:function(t){return this.clone()._add(t)},sub:function(t){return this.clone()._sub(t)},multByPoint:function(t){return this.clone()._multByPoint(t)},divByPoint:function(t){return this.clone()._divByPoint(t)},mult:function(t){return this.clone()._mult(t)},div:function(t){return this.clone()._div(t)},rotate:function(t){return this.clone()._rotate(t)},rotateAround:function(t,e){return this.clone()._rotateAround(t,e)},matMult:function(t){return this.clone()._matMult(t)},unit:function(){return this.clone()._unit()},perp:function(){return this.clone()._perp()},round:function(){return this.clone()._round()},mag:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},equals:function(t){return this.x===t.x&&this.y===t.y},dist:function(t){return Math.sqrt(this.distSqr(t))},distSqr:function(t){var e=t.x-this.x,r=t.y-this.y;return e*e+r*r},angle:function(){return Math.atan2(this.y,this.x)},angleTo:function(t){return Math.atan2(this.y-t.y,this.x-t.x)},angleWith:function(t){return this.angleWithSep(t.x,t.y)},angleWithSep:function(t,e){return Math.atan2(this.x*e-this.y*t,this.x*t+this.y*e)},_matMult:function(t){var e=t[0]*this.x+t[1]*this.y,r=t[2]*this.x+t[3]*this.y;return this.x=e,this.y=r,this},_add:function(t){return this.x+=t.x,this.y+=t.y,this},_sub:function(t){return this.x-=t.x,this.y-=t.y,this},_mult:function(t){return this.x*=t,this.y*=t,this},_div:function(t){return this.x/=t,this.y/=t,this},_multByPoint:function(t){return this.x*=t.x,this.y*=t.y,this},_divByPoint:function(t){return this.x/=t.x,this.y/=t.y,this},_unit:function(){return this._div(this.mag()),this},_perp:function(){var t=this.y;return this.y=this.x,this.x=-t,this},_rotate:function(t){var e=Math.cos(t),r=Math.sin(t),n=e*this.x-r*this.y,i=r*this.x+e*this.y;return this.x=n,this.y=i,this},_rotateAround:function(t,e){var r=Math.cos(t),n=Math.sin(t),i=e.x+r*(this.x-e.x)-n*(this.y-e.y),a=e.y+n*(this.x-e.x)+r*(this.y-e.y);return this.x=i,this.y=a,this},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}},o.convert=function(t){return t instanceof o?t:Array.isArray(t)?new o(t[0],t[1]):t};var s=\"undefined\"!=typeof self?self:{};var l=Math.pow(2,53)-1;function u(t,e,r,i){var a=new n(t,e,r,i);return function(t){return a.solve(t)}}var c=u(.25,.1,.25,1);function f(t,e,r){return Math.min(r,Math.max(e,t))}function h(t,e,r){var n=r-e,i=((t-e)%n+n)%n+e;return i===e?r:i}function p(t){for(var e=[],r=arguments.length-1;r-- >0;)e[r]=arguments[r+1];for(var n=0,i=e;n>e/4).toString(16):([1e7]+-[1e3]+-4e3+-8e3+-1e11).replace(/[018]/g,t)}()}function y(t){return!!t&&/^[0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(t)}function m(t,e){t.forEach((function(t){e[t]&&(e[t]=e[t].bind(e))}))}function x(t,e){return-1!==t.indexOf(e,t.length-e.length)}function b(t,e,r){var n={};for(var i in t)n[i]=e.call(r||this,t[i],i,t);return n}function _(t,e,r){var n={};for(var i in t)e.call(r||this,t[i],i,t)&&(n[i]=t[i]);return n}function w(t){return Array.isArray(t)?t.map(w):\"object\"==typeof t&&t?b(t,w):t}var T={};function k(t){T[t]||(\"undefined\"!=typeof console&&console.warn(t),T[t]=!0)}function A(t,e,r){return(r.y-t.y)*(e.x-t.x)>(e.y-t.y)*(r.x-t.x)}function M(t){for(var e=0,r=0,n=t.length,i=n-1,a=void 0,o=void 0;r@\\,;\\:\\\\\"\\/\\[\\]\\?\\=\\{\\}\\x7F]+)(?:\\=(?:([^\\x00-\\x20\\(\\)<>@\\,;\\:\\\\\"\\/\\[\\]\\?\\=\\{\\}\\x7F]+)|(?:\\\"((?:[^\"\\\\]|\\\\.)*)\\\")))?/g,(function(t,r,n,i){var a=n||i;return e[r]=!a||a.toLowerCase(),\"\"})),e[\"max-age\"]){var r=parseInt(e[\"max-age\"],10);isNaN(r)?delete e[\"max-age\"]:e[\"max-age\"]=r}return e}var L=null;function C(t){if(null==L){var e=t.navigator?t.navigator.userAgent:null;L=!!t.safari||!(!e||!(/\\b(iPad|iPhone|iPod)\\b/.test(e)||e.match(\"Safari\")&&!e.match(\"Chrome\")))}return L}function P(t){try{var e=s[t];return e.setItem(\"_mapbox_test_\",1),e.removeItem(\"_mapbox_test_\"),!0}catch(t){return!1}}var O,I,z,D,R=s.performance&&s.performance.now?s.performance.now.bind(s.performance):Date.now.bind(Date),F=s.requestAnimationFrame||s.mozRequestAnimationFrame||s.webkitRequestAnimationFrame||s.msRequestAnimationFrame,B=s.cancelAnimationFrame||s.mozCancelAnimationFrame||s.webkitCancelAnimationFrame||s.msCancelAnimationFrame,N={now:R,frame:function(t){var e=F(t);return{cancel:function(){return B(e)}}},getImageData:function(t,e){void 0===e&&(e=0);var r=s.document.createElement(\"canvas\"),n=r.getContext(\"2d\");if(!n)throw new Error(\"failed to create canvas 2d context\");return r.width=t.width,r.height=t.height,n.drawImage(t,0,0,t.width,t.height),n.getImageData(-e,-e,t.width+2*e,t.height+2*e)},resolveURL:function(t){return O||(O=s.document.createElement(\"a\")),O.href=t,O.href},hardwareConcurrency:s.navigator&&s.navigator.hardwareConcurrency||4,get devicePixelRatio(){return s.devicePixelRatio},get prefersReducedMotion(){return!!s.matchMedia&&(null==I&&(I=s.matchMedia(\"(prefers-reduced-motion: reduce)\")),I.matches)}},j={API_URL:\"https://api.mapbox.com\",get EVENTS_URL(){return this.API_URL?0===this.API_URL.indexOf(\"https://api.mapbox.cn\")?\"https://events.mapbox.cn/events/v2\":0===this.API_URL.indexOf(\"https://api.mapbox.com\")?\"https://events.mapbox.com/events/v2\":null:null},FEEDBACK_URL:\"https://apps.mapbox.com/feedback\",REQUIRE_ACCESS_TOKEN:!0,ACCESS_TOKEN:null,MAX_PARALLEL_IMAGE_REQUESTS:16},U={supported:!1,testSupport:function(t){!V&&D&&(q?H(t):z=t)}},V=!1,q=!1;function H(t){var e=t.createTexture();t.bindTexture(t.TEXTURE_2D,e);try{if(t.texImage2D(t.TEXTURE_2D,0,t.RGBA,t.RGBA,t.UNSIGNED_BYTE,D),t.isContextLost())return;U.supported=!0}catch(t){}t.deleteTexture(e),V=!0}s.document&&((D=s.document.createElement(\"img\")).onload=function(){z&&H(z),z=null,q=!0},D.onerror=function(){V=!0,z=null},D.src=\"data:image/webp;base64,UklGRh4AAABXRUJQVlA4TBEAAAAvAQAAAAfQ//73v/+BiOh/AAA=\");var G=\"01\";var W=function(t,e){this._transformRequestFn=t,this._customAccessToken=e,this._createSkuToken()};function Y(t){return 0===t.indexOf(\"mapbox:\")}W.prototype._createSkuToken=function(){var t=function(){for(var t=\"\",e=0;e<10;e++)t+=\"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\"[Math.floor(62*Math.random())];return{token:[\"1\",G,t].join(\"\"),tokenExpiresAt:Date.now()+432e5}}();this._skuToken=t.token,this._skuTokenExpiresAt=t.tokenExpiresAt},W.prototype._isSkuTokenExpired=function(){return Date.now()>this._skuTokenExpiresAt},W.prototype.transformRequest=function(t,e){return this._transformRequestFn&&this._transformRequestFn(t,e)||{url:t}},W.prototype.normalizeStyleURL=function(t,e){if(!Y(t))return t;var r=J(t);return r.path=\"/styles/v1\"+r.path,this._makeAPIURL(r,this._customAccessToken||e)},W.prototype.normalizeGlyphsURL=function(t,e){if(!Y(t))return t;var r=J(t);return r.path=\"/fonts/v1\"+r.path,this._makeAPIURL(r,this._customAccessToken||e)},W.prototype.normalizeSourceURL=function(t,e){if(!Y(t))return t;var r=J(t);return r.path=\"/v4/\"+r.authority+\".json\",r.params.push(\"secure\"),this._makeAPIURL(r,this._customAccessToken||e)},W.prototype.normalizeSpriteURL=function(t,e,r,n){var i=J(t);return Y(t)?(i.path=\"/styles/v1\"+i.path+\"/sprite\"+e+r,this._makeAPIURL(i,this._customAccessToken||n)):(i.path+=\"\"+e+r,$(i))},W.prototype.normalizeTileURL=function(t,e){if(this._isSkuTokenExpired()&&this._createSkuToken(),t&&!Y(t))return t;var r=J(t),n=N.devicePixelRatio>=2||512===e?\"@2x\":\"\",i=U.supported?\".webp\":\"$1\";r.path=r.path.replace(/(\\.(png|jpg)\\d*)(?=$)/,\"\"+n+i),r.path=r.path.replace(/^.+\\/v4\\//,\"/\"),r.path=\"/v4\"+r.path;var a=this._customAccessToken||function(t){for(var e=0,r=t;e=0&&t.params.splice(i,1)}if(\"/\"!==n.path&&(t.path=\"\"+n.path+t.path),!j.REQUIRE_ACCESS_TOKEN)return $(t);if(!(e=e||j.ACCESS_TOKEN))throw new Error(\"An API access token is required to use Mapbox GL. \"+r);if(\"s\"===e[0])throw new Error(\"Use a public access token (pk.*) with Mapbox GL, not a secret access token (sk.*). \"+r);return t.params=t.params.filter((function(t){return-1===t.indexOf(\"access_token\")})),t.params.push(\"access_token=\"+e),$(t)};var X=/^((https?:)?\\/\\/)?([^\\/]+\\.)?mapbox\\.c(n|om)(\\/|\\?|$)/i;function Z(t){return X.test(t)}var K=/^(\\w+):\\/\\/([^/?]*)(\\/[^?]+)?\\??(.+)?/;function J(t){var e=t.match(K);if(!e)throw new Error(\"Unable to parse URL object\");return{protocol:e[1],authority:e[2],path:e[3]||\"/\",params:e[4]?e[4].split(\"&\"):[]}}function $(t){var e=t.params.length?\"?\"+t.params.join(\"&\"):\"\";return t.protocol+\"://\"+t.authority+t.path+e}var Q=\"mapbox.eventData\";function tt(t){if(!t)return null;var e,r=t.split(\".\");if(!r||3!==r.length)return null;try{return JSON.parse((e=r[1],decodeURIComponent(s.atob(e).split(\"\").map((function(t){return\"%\"+(\"00\"+t.charCodeAt(0).toString(16)).slice(-2)})).join(\"\"))))}catch(t){return null}}var et=function(t){this.type=t,this.anonId=null,this.eventData={},this.queue=[],this.pendingRequest=null};et.prototype.getStorageKey=function(t){var e,r,n=tt(j.ACCESS_TOKEN);return e=n&&n.u?(r=n.u,s.btoa(encodeURIComponent(r).replace(/%([0-9A-F]{2})/g,(function(t,e){return String.fromCharCode(Number(\"0x\"+e))})))):j.ACCESS_TOKEN||\"\",t?Q+\".\"+t+\":\"+e:Q+\":\"+e},et.prototype.fetchEventData=function(){var t=P(\"localStorage\"),e=this.getStorageKey(),r=this.getStorageKey(\"uuid\");if(t)try{var n=s.localStorage.getItem(e);n&&(this.eventData=JSON.parse(n));var i=s.localStorage.getItem(r);i&&(this.anonId=i)}catch(t){k(\"Unable to read from LocalStorage\")}},et.prototype.saveEventData=function(){var t=P(\"localStorage\"),e=this.getStorageKey(),r=this.getStorageKey(\"uuid\");if(t)try{s.localStorage.setItem(r,this.anonId),Object.keys(this.eventData).length>=1&&s.localStorage.setItem(e,JSON.stringify(this.eventData))}catch(t){k(\"Unable to write to LocalStorage\")}},et.prototype.processRequests=function(t){},et.prototype.postEvent=function(t,e,n,i){var a=this;if(j.EVENTS_URL){var o=J(j.EVENTS_URL);o.params.push(\"access_token=\"+(i||j.ACCESS_TOKEN||\"\"));var s={event:this.type,created:new Date(t).toISOString(),sdkIdentifier:\"mapbox-gl-js\",sdkVersion:r,skuId:G,userId:this.anonId},l=e?p(s,e):s,u={url:$(o),headers:{\"Content-Type\":\"text/plain\"},body:JSON.stringify([l])};this.pendingRequest=St(u,(function(t){a.pendingRequest=null,n(t),a.saveEventData(),a.processRequests(i)}))}},et.prototype.queueRequest=function(t,e){this.queue.push(t),this.processRequests(e)};var rt,nt,it=function(t){function e(){t.call(this,\"map.load\"),this.success={},this.skuToken=\"\"}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.postMapLoadEvent=function(t,e,r,n){this.skuToken=r,(j.EVENTS_URL&&n||j.ACCESS_TOKEN&&Array.isArray(t)&&t.some((function(t){return Y(t)||Z(t)})))&&this.queueRequest({id:e,timestamp:Date.now()},n)},e.prototype.processRequests=function(t){var e=this;if(!this.pendingRequest&&0!==this.queue.length){var r=this.queue.shift(),n=r.id,i=r.timestamp;n&&this.success[n]||(this.anonId||this.fetchEventData(),y(this.anonId)||(this.anonId=g()),this.postEvent(i,{skuToken:this.skuToken},(function(t){t||n&&(e.success[n]=!0)}),t))}},e}(et),at=function(t){function e(e){t.call(this,\"appUserTurnstile\"),this._customAccessToken=e}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.postTurnstileEvent=function(t,e){j.EVENTS_URL&&j.ACCESS_TOKEN&&Array.isArray(t)&&t.some((function(t){return Y(t)||Z(t)}))&&this.queueRequest(Date.now(),e)},e.prototype.processRequests=function(t){var e=this;if(!this.pendingRequest&&0!==this.queue.length){this.anonId&&this.eventData.lastSuccess&&this.eventData.tokenU||this.fetchEventData();var r=tt(j.ACCESS_TOKEN),n=r?r.u:j.ACCESS_TOKEN,i=n!==this.eventData.tokenU;y(this.anonId)||(this.anonId=g(),i=!0);var a=this.queue.shift();if(this.eventData.lastSuccess){var o=new Date(this.eventData.lastSuccess),s=new Date(a),l=(a-this.eventData.lastSuccess)/864e5;i=i||l>=1||l<-1||o.getDate()!==s.getDate()}else i=!0;if(!i)return this.processRequests();this.postEvent(a,{\"enabled.telemetry\":!1},(function(t){t||(e.eventData.lastSuccess=a,e.eventData.tokenU=n)}),t)}},e}(et),ot=new at,st=ot.postTurnstileEvent.bind(ot),lt=new it,ut=lt.postMapLoadEvent.bind(lt),ct=\"mapbox-tiles\",ft=500,ht=50,pt=42e4;function dt(){s.caches&&!rt&&(rt=s.caches.open(ct))}function vt(t,e,r){if(dt(),rt){var n={status:e.status,statusText:e.statusText,headers:new s.Headers};e.headers.forEach((function(t,e){return n.headers.set(e,t)}));var i=E(e.headers.get(\"Cache-Control\")||\"\");i[\"no-store\"]||(i[\"max-age\"]&&n.headers.set(\"Expires\",new Date(r+1e3*i[\"max-age\"]).toUTCString()),new Date(n.headers.get(\"Expires\")).getTime()-rDate.now()&&!r[\"no-cache\"]}(n);t.delete(r),i&&t.put(r,n.clone()),e(null,n,i)})).catch(e)})).catch(e)}var mt,xt=1/0;function bt(){return null==mt&&(mt=s.OffscreenCanvas&&new s.OffscreenCanvas(1,1).getContext(\"2d\")&&\"function\"==typeof s.createImageBitmap),mt}var _t={Unknown:\"Unknown\",Style:\"Style\",Source:\"Source\",Tile:\"Tile\",Glyphs:\"Glyphs\",SpriteImage:\"SpriteImage\",SpriteJSON:\"SpriteJSON\",Image:\"Image\"};\"function\"==typeof Object.freeze&&Object.freeze(_t);var wt=function(t){function e(e,r,n){401===r&&Z(n)&&(e+=\": you may have provided an invalid Mapbox access token. See https://www.mapbox.com/api-documentation/#access-tokens-and-token-scopes\"),t.call(this,e),this.status=r,this.url=n,this.name=this.constructor.name,this.message=e}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.toString=function(){return this.name+\": \"+this.message+\" (\"+this.status+\"): \"+this.url},e}(Error),Tt=S()?function(){return self.worker&&self.worker.referrer}:function(){return(\"blob:\"===s.location.protocol?s.parent:s).location.href};function kt(t,e){var r,n=new s.AbortController,i=new s.Request(t.url,{method:t.method||\"GET\",body:t.body,credentials:t.credentials,headers:t.headers,referrer:Tt(),signal:n.signal}),a=!1,o=!1,l=(r=i.url).indexOf(\"sku=\")>0&&Z(r);\"json\"===t.type&&i.headers.set(\"Accept\",\"application/json\");var u=function(r,n,a){if(!o){if(r&&\"SecurityError\"!==r.message&&k(r),n&&a)return c(n);var u=Date.now();s.fetch(i).then((function(r){if(r.ok){var n=l?r.clone():null;return c(r,n,u)}return e(new wt(r.statusText,r.status,t.url))})).catch((function(t){20!==t.code&&e(new Error(t.message))}))}},c=function(r,n,s){(\"arrayBuffer\"===t.type?r.arrayBuffer():\"json\"===t.type?r.json():r.text()).then((function(t){o||(n&&s&&vt(i,n,s),a=!0,e(null,t,r.headers.get(\"Cache-Control\"),r.headers.get(\"Expires\")))})).catch((function(t){o||e(new Error(t.message))}))};return l?yt(i,u):u(null,null),{cancel:function(){o=!0,a||n.abort()}}}var At=function(t,e){if(r=t.url,!(/^file:/.test(r)||/^file:/.test(Tt())&&!/^\\w+:/.test(r))){if(s.fetch&&s.Request&&s.AbortController&&s.Request.prototype.hasOwnProperty(\"signal\"))return kt(t,e);if(S()&&self.worker&&self.worker.actor){return self.worker.actor.send(\"getResource\",t,e,void 0,!0)}}var r;return function(t,e){var r=new s.XMLHttpRequest;for(var n in r.open(t.method||\"GET\",t.url,!0),\"arrayBuffer\"===t.type&&(r.responseType=\"arraybuffer\"),t.headers)r.setRequestHeader(n,t.headers[n]);return\"json\"===t.type&&(r.responseType=\"text\",r.setRequestHeader(\"Accept\",\"application/json\")),r.withCredentials=\"include\"===t.credentials,r.onerror=function(){e(new Error(r.statusText))},r.onload=function(){if((r.status>=200&&r.status<300||0===r.status)&&null!==r.response){var n=r.response;if(\"json\"===t.type)try{n=JSON.parse(r.response)}catch(t){return e(t)}e(null,n,r.getResponseHeader(\"Cache-Control\"),r.getResponseHeader(\"Expires\"))}else e(new wt(r.statusText,r.status,t.url))},r.send(t.body),{cancel:function(){return r.abort()}}}(t,e)},Mt=function(t,e){return At(p(t,{type:\"arrayBuffer\"}),e)},St=function(t,e){return At(p(t,{method:\"POST\"}),e)};var Et,Lt,Ct=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII=\";Et=[],Lt=0;var Pt=function(t,e){if(U.supported&&(t.headers||(t.headers={}),t.headers.accept=\"image/webp,*/*\"),Lt>=j.MAX_PARALLEL_IMAGE_REQUESTS){var r={requestParameters:t,callback:e,cancelled:!1,cancel:function(){this.cancelled=!0}};return Et.push(r),r}Lt++;var n=!1,i=function(){if(!n)for(n=!0,Lt--;Et.length&&Lt0||this._oneTimeListeners&&this._oneTimeListeners[t]&&this._oneTimeListeners[t].length>0||this._eventedParent&&this._eventedParent.listens(t)},Rt.prototype.setEventedParent=function(t,e){return this._eventedParent=t,this._eventedParentData=e,this};var Ft={$version:8,$root:{version:{required:!0,type:\"enum\",values:[8]},name:{type:\"string\"},metadata:{type:\"*\"},center:{type:\"array\",value:\"number\"},zoom:{type:\"number\"},bearing:{type:\"number\",default:0,period:360,units:\"degrees\"},pitch:{type:\"number\",default:0,units:\"degrees\"},light:{type:\"light\"},sources:{required:!0,type:\"sources\"},sprite:{type:\"string\"},glyphs:{type:\"string\"},transition:{type:\"transition\"},layers:{required:!0,type:\"array\",value:\"layer\"}},sources:{\"*\":{type:\"source\"}},source:[\"source_vector\",\"source_raster\",\"source_raster_dem\",\"source_geojson\",\"source_video\",\"source_image\"],source_vector:{type:{required:!0,type:\"enum\",values:{vector:{}}},url:{type:\"string\"},tiles:{type:\"array\",value:\"string\"},bounds:{type:\"array\",value:\"number\",length:4,default:[-180,-85.051129,180,85.051129]},scheme:{type:\"enum\",values:{xyz:{},tms:{}},default:\"xyz\"},minzoom:{type:\"number\",default:0},maxzoom:{type:\"number\",default:22},attribution:{type:\"string\"},promoteId:{type:\"promoteId\"},volatile:{type:\"boolean\",default:!1},\"*\":{type:\"*\"}},source_raster:{type:{required:!0,type:\"enum\",values:{raster:{}}},url:{type:\"string\"},tiles:{type:\"array\",value:\"string\"},bounds:{type:\"array\",value:\"number\",length:4,default:[-180,-85.051129,180,85.051129]},minzoom:{type:\"number\",default:0},maxzoom:{type:\"number\",default:22},tileSize:{type:\"number\",default:512,units:\"pixels\"},scheme:{type:\"enum\",values:{xyz:{},tms:{}},default:\"xyz\"},attribution:{type:\"string\"},volatile:{type:\"boolean\",default:!1},\"*\":{type:\"*\"}},source_raster_dem:{type:{required:!0,type:\"enum\",values:{\"raster-dem\":{}}},url:{type:\"string\"},tiles:{type:\"array\",value:\"string\"},bounds:{type:\"array\",value:\"number\",length:4,default:[-180,-85.051129,180,85.051129]},minzoom:{type:\"number\",default:0},maxzoom:{type:\"number\",default:22},tileSize:{type:\"number\",default:512,units:\"pixels\"},attribution:{type:\"string\"},encoding:{type:\"enum\",values:{terrarium:{},mapbox:{}},default:\"mapbox\"},volatile:{type:\"boolean\",default:!1},\"*\":{type:\"*\"}},source_geojson:{type:{required:!0,type:\"enum\",values:{geojson:{}}},data:{type:\"*\"},maxzoom:{type:\"number\",default:18},attribution:{type:\"string\"},buffer:{type:\"number\",default:128,maximum:512,minimum:0},filter:{type:\"*\"},tolerance:{type:\"number\",default:.375},cluster:{type:\"boolean\",default:!1},clusterRadius:{type:\"number\",default:50,minimum:0},clusterMaxZoom:{type:\"number\"},clusterMinPoints:{type:\"number\"},clusterProperties:{type:\"*\"},lineMetrics:{type:\"boolean\",default:!1},generateId:{type:\"boolean\",default:!1},promoteId:{type:\"promoteId\"}},source_video:{type:{required:!0,type:\"enum\",values:{video:{}}},urls:{required:!0,type:\"array\",value:\"string\"},coordinates:{required:!0,type:\"array\",length:4,value:{type:\"array\",length:2,value:\"number\"}}},source_image:{type:{required:!0,type:\"enum\",values:{image:{}}},url:{required:!0,type:\"string\"},coordinates:{required:!0,type:\"array\",length:4,value:{type:\"array\",length:2,value:\"number\"}}},layer:{id:{type:\"string\",required:!0},type:{type:\"enum\",values:{fill:{},line:{},symbol:{},circle:{},heatmap:{},\"fill-extrusion\":{},raster:{},hillshade:{},background:{}},required:!0},metadata:{type:\"*\"},source:{type:\"string\"},\"source-layer\":{type:\"string\"},minzoom:{type:\"number\",minimum:0,maximum:24},maxzoom:{type:\"number\",minimum:0,maximum:24},filter:{type:\"filter\"},layout:{type:\"layout\"},paint:{type:\"paint\"}},layout:[\"layout_fill\",\"layout_line\",\"layout_circle\",\"layout_heatmap\",\"layout_fill-extrusion\",\"layout_symbol\",\"layout_raster\",\"layout_hillshade\",\"layout_background\"],layout_background:{visibility:{type:\"enum\",values:{visible:{},none:{}},default:\"visible\",\"property-type\":\"constant\"}},layout_fill:{\"fill-sort-key\":{type:\"number\",expression:{interpolated:!1,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},visibility:{type:\"enum\",values:{visible:{},none:{}},default:\"visible\",\"property-type\":\"constant\"}},layout_circle:{\"circle-sort-key\":{type:\"number\",expression:{interpolated:!1,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},visibility:{type:\"enum\",values:{visible:{},none:{}},default:\"visible\",\"property-type\":\"constant\"}},layout_heatmap:{visibility:{type:\"enum\",values:{visible:{},none:{}},default:\"visible\",\"property-type\":\"constant\"}},\"layout_fill-extrusion\":{visibility:{type:\"enum\",values:{visible:{},none:{}},default:\"visible\",\"property-type\":\"constant\"}},layout_line:{\"line-cap\":{type:\"enum\",values:{butt:{},round:{},square:{}},default:\"butt\",expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"line-join\":{type:\"enum\",values:{bevel:{},round:{},miter:{}},default:\"miter\",expression:{interpolated:!1,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"line-miter-limit\":{type:\"number\",default:2,requires:[{\"line-join\":\"miter\"}],expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"line-round-limit\":{type:\"number\",default:1.05,requires:[{\"line-join\":\"round\"}],expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"line-sort-key\":{type:\"number\",expression:{interpolated:!1,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},visibility:{type:\"enum\",values:{visible:{},none:{}},default:\"visible\",\"property-type\":\"constant\"}},layout_symbol:{\"symbol-placement\":{type:\"enum\",values:{point:{},line:{},\"line-center\":{}},default:\"point\",expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"symbol-spacing\":{type:\"number\",default:250,minimum:1,units:\"pixels\",requires:[{\"symbol-placement\":\"line\"}],expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"symbol-avoid-edges\":{type:\"boolean\",default:!1,expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"symbol-sort-key\":{type:\"number\",expression:{interpolated:!1,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"symbol-z-order\":{type:\"enum\",values:{auto:{},\"viewport-y\":{},source:{}},default:\"auto\",expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"icon-allow-overlap\":{type:\"boolean\",default:!1,requires:[\"icon-image\"],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"icon-ignore-placement\":{type:\"boolean\",default:!1,requires:[\"icon-image\"],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"icon-optional\":{type:\"boolean\",default:!1,requires:[\"icon-image\",\"text-field\"],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"icon-rotation-alignment\":{type:\"enum\",values:{map:{},viewport:{},auto:{}},default:\"auto\",requires:[\"icon-image\"],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"icon-size\":{type:\"number\",default:1,minimum:0,units:\"factor of the original icon size\",requires:[\"icon-image\"],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"icon-text-fit\":{type:\"enum\",values:{none:{},width:{},height:{},both:{}},default:\"none\",requires:[\"icon-image\",\"text-field\"],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"icon-text-fit-padding\":{type:\"array\",value:\"number\",length:4,default:[0,0,0,0],units:\"pixels\",requires:[\"icon-image\",\"text-field\",{\"icon-text-fit\":[\"both\",\"width\",\"height\"]}],expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"icon-image\":{type:\"resolvedImage\",tokens:!0,expression:{interpolated:!1,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"icon-rotate\":{type:\"number\",default:0,period:360,units:\"degrees\",requires:[\"icon-image\"],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"icon-padding\":{type:\"number\",default:2,minimum:0,units:\"pixels\",requires:[\"icon-image\"],expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"icon-keep-upright\":{type:\"boolean\",default:!1,requires:[\"icon-image\",{\"icon-rotation-alignment\":\"map\"},{\"symbol-placement\":[\"line\",\"line-center\"]}],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"icon-offset\":{type:\"array\",value:\"number\",length:2,default:[0,0],requires:[\"icon-image\"],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"icon-anchor\":{type:\"enum\",values:{center:{},left:{},right:{},top:{},bottom:{},\"top-left\":{},\"top-right\":{},\"bottom-left\":{},\"bottom-right\":{}},default:\"center\",requires:[\"icon-image\"],expression:{interpolated:!1,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"icon-pitch-alignment\":{type:\"enum\",values:{map:{},viewport:{},auto:{}},default:\"auto\",requires:[\"icon-image\"],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"text-pitch-alignment\":{type:\"enum\",values:{map:{},viewport:{},auto:{}},default:\"auto\",requires:[\"text-field\"],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"text-rotation-alignment\":{type:\"enum\",values:{map:{},viewport:{},auto:{}},default:\"auto\",requires:[\"text-field\"],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"text-field\":{type:\"formatted\",default:\"\",tokens:!0,expression:{interpolated:!1,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"text-font\":{type:\"array\",value:\"string\",default:[\"Open Sans Regular\",\"Arial Unicode MS Regular\"],requires:[\"text-field\"],expression:{interpolated:!1,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"text-size\":{type:\"number\",default:16,minimum:0,units:\"pixels\",requires:[\"text-field\"],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"text-max-width\":{type:\"number\",default:10,minimum:0,units:\"ems\",requires:[\"text-field\"],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"text-line-height\":{type:\"number\",default:1.2,units:\"ems\",requires:[\"text-field\"],expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"text-letter-spacing\":{type:\"number\",default:0,units:\"ems\",requires:[\"text-field\"],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"text-justify\":{type:\"enum\",values:{auto:{},left:{},center:{},right:{}},default:\"center\",requires:[\"text-field\"],expression:{interpolated:!1,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"text-radial-offset\":{type:\"number\",units:\"ems\",default:0,requires:[\"text-field\"],\"property-type\":\"data-driven\",expression:{interpolated:!0,parameters:[\"zoom\",\"feature\"]}},\"text-variable-anchor\":{type:\"array\",value:\"enum\",values:{center:{},left:{},right:{},top:{},bottom:{},\"top-left\":{},\"top-right\":{},\"bottom-left\":{},\"bottom-right\":{}},requires:[\"text-field\",{\"symbol-placement\":[\"point\"]}],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"text-anchor\":{type:\"enum\",values:{center:{},left:{},right:{},top:{},bottom:{},\"top-left\":{},\"top-right\":{},\"bottom-left\":{},\"bottom-right\":{}},default:\"center\",requires:[\"text-field\",{\"!\":\"text-variable-anchor\"}],expression:{interpolated:!1,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"text-max-angle\":{type:\"number\",default:45,units:\"degrees\",requires:[\"text-field\",{\"symbol-placement\":[\"line\",\"line-center\"]}],expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"text-writing-mode\":{type:\"array\",value:\"enum\",values:{horizontal:{},vertical:{}},requires:[\"text-field\",{\"symbol-placement\":[\"point\"]}],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"text-rotate\":{type:\"number\",default:0,period:360,units:\"degrees\",requires:[\"text-field\"],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"text-padding\":{type:\"number\",default:2,minimum:0,units:\"pixels\",requires:[\"text-field\"],expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"text-keep-upright\":{type:\"boolean\",default:!0,requires:[\"text-field\",{\"text-rotation-alignment\":\"map\"},{\"symbol-placement\":[\"line\",\"line-center\"]}],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"text-transform\":{type:\"enum\",values:{none:{},uppercase:{},lowercase:{}},default:\"none\",requires:[\"text-field\"],expression:{interpolated:!1,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"text-offset\":{type:\"array\",value:\"number\",units:\"ems\",length:2,default:[0,0],requires:[\"text-field\",{\"!\":\"text-radial-offset\"}],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"text-allow-overlap\":{type:\"boolean\",default:!1,requires:[\"text-field\"],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"text-ignore-placement\":{type:\"boolean\",default:!1,requires:[\"text-field\"],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"text-optional\":{type:\"boolean\",default:!1,requires:[\"text-field\",\"icon-image\"],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},visibility:{type:\"enum\",values:{visible:{},none:{}},default:\"visible\",\"property-type\":\"constant\"}},layout_raster:{visibility:{type:\"enum\",values:{visible:{},none:{}},default:\"visible\",\"property-type\":\"constant\"}},layout_hillshade:{visibility:{type:\"enum\",values:{visible:{},none:{}},default:\"visible\",\"property-type\":\"constant\"}},filter:{type:\"array\",value:\"*\"},filter_operator:{type:\"enum\",values:{\"==\":{},\"!=\":{},\">\":{},\">=\":{},\"<\":{},\"<=\":{},in:{},\"!in\":{},all:{},any:{},none:{},has:{},\"!has\":{},within:{}}},geometry_type:{type:\"enum\",values:{Point:{},LineString:{},Polygon:{}}},function:{expression:{type:\"expression\"},stops:{type:\"array\",value:\"function_stop\"},base:{type:\"number\",default:1,minimum:0},property:{type:\"string\",default:\"$zoom\"},type:{type:\"enum\",values:{identity:{},exponential:{},interval:{},categorical:{}},default:\"exponential\"},colorSpace:{type:\"enum\",values:{rgb:{},lab:{},hcl:{}},default:\"rgb\"},default:{type:\"*\",required:!1}},function_stop:{type:\"array\",minimum:0,maximum:24,value:[\"number\",\"color\"],length:2},expression:{type:\"array\",value:\"*\",minimum:1},light:{anchor:{type:\"enum\",default:\"viewport\",values:{map:{},viewport:{}},\"property-type\":\"data-constant\",transition:!1,expression:{interpolated:!1,parameters:[\"zoom\"]}},position:{type:\"array\",default:[1.15,210,30],length:3,value:\"number\",\"property-type\":\"data-constant\",transition:!0,expression:{interpolated:!0,parameters:[\"zoom\"]}},color:{type:\"color\",\"property-type\":\"data-constant\",default:\"#ffffff\",expression:{interpolated:!0,parameters:[\"zoom\"]},transition:!0},intensity:{type:\"number\",\"property-type\":\"data-constant\",default:.5,minimum:0,maximum:1,expression:{interpolated:!0,parameters:[\"zoom\"]},transition:!0}},paint:[\"paint_fill\",\"paint_line\",\"paint_circle\",\"paint_heatmap\",\"paint_fill-extrusion\",\"paint_symbol\",\"paint_raster\",\"paint_hillshade\",\"paint_background\"],paint_fill:{\"fill-antialias\":{type:\"boolean\",default:!0,expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"fill-opacity\":{type:\"number\",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"fill-color\":{type:\"color\",default:\"#000000\",transition:!0,requires:[{\"!\":\"fill-pattern\"}],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"fill-outline-color\":{type:\"color\",transition:!0,requires:[{\"!\":\"fill-pattern\"},{\"fill-antialias\":!0}],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"fill-translate\":{type:\"array\",value:\"number\",length:2,default:[0,0],transition:!0,units:\"pixels\",expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"fill-translate-anchor\":{type:\"enum\",values:{map:{},viewport:{}},default:\"map\",requires:[\"fill-translate\"],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"fill-pattern\":{type:\"resolvedImage\",transition:!0,expression:{interpolated:!1,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"cross-faded-data-driven\"}},\"paint_fill-extrusion\":{\"fill-extrusion-opacity\":{type:\"number\",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"fill-extrusion-color\":{type:\"color\",default:\"#000000\",transition:!0,requires:[{\"!\":\"fill-extrusion-pattern\"}],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"fill-extrusion-translate\":{type:\"array\",value:\"number\",length:2,default:[0,0],transition:!0,units:\"pixels\",expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"fill-extrusion-translate-anchor\":{type:\"enum\",values:{map:{},viewport:{}},default:\"map\",requires:[\"fill-extrusion-translate\"],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"fill-extrusion-pattern\":{type:\"resolvedImage\",transition:!0,expression:{interpolated:!1,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"cross-faded-data-driven\"},\"fill-extrusion-height\":{type:\"number\",default:0,minimum:0,units:\"meters\",transition:!0,expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"fill-extrusion-base\":{type:\"number\",default:0,minimum:0,units:\"meters\",transition:!0,requires:[\"fill-extrusion-height\"],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"fill-extrusion-vertical-gradient\":{type:\"boolean\",default:!0,transition:!1,expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"}},paint_line:{\"line-opacity\":{type:\"number\",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"line-color\":{type:\"color\",default:\"#000000\",transition:!0,requires:[{\"!\":\"line-pattern\"}],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"line-translate\":{type:\"array\",value:\"number\",length:2,default:[0,0],transition:!0,units:\"pixels\",expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"line-translate-anchor\":{type:\"enum\",values:{map:{},viewport:{}},default:\"map\",requires:[\"line-translate\"],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"line-width\":{type:\"number\",default:1,minimum:0,transition:!0,units:\"pixels\",expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"line-gap-width\":{type:\"number\",default:0,minimum:0,transition:!0,units:\"pixels\",expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"line-offset\":{type:\"number\",default:0,transition:!0,units:\"pixels\",expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"line-blur\":{type:\"number\",default:0,minimum:0,transition:!0,units:\"pixels\",expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"line-dasharray\":{type:\"array\",value:\"number\",minimum:0,transition:!0,units:\"line widths\",requires:[{\"!\":\"line-pattern\"}],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"cross-faded\"},\"line-pattern\":{type:\"resolvedImage\",transition:!0,expression:{interpolated:!1,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"cross-faded-data-driven\"},\"line-gradient\":{type:\"color\",transition:!1,requires:[{\"!\":\"line-dasharray\"},{\"!\":\"line-pattern\"},{source:\"geojson\",has:{lineMetrics:!0}}],expression:{interpolated:!0,parameters:[\"line-progress\"]},\"property-type\":\"color-ramp\"}},paint_circle:{\"circle-radius\":{type:\"number\",default:5,minimum:0,transition:!0,units:\"pixels\",expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"circle-color\":{type:\"color\",default:\"#000000\",transition:!0,expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"circle-blur\":{type:\"number\",default:0,transition:!0,expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"circle-opacity\":{type:\"number\",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"circle-translate\":{type:\"array\",value:\"number\",length:2,default:[0,0],transition:!0,units:\"pixels\",expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"circle-translate-anchor\":{type:\"enum\",values:{map:{},viewport:{}},default:\"map\",requires:[\"circle-translate\"],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"circle-pitch-scale\":{type:\"enum\",values:{map:{},viewport:{}},default:\"map\",expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"circle-pitch-alignment\":{type:\"enum\",values:{map:{},viewport:{}},default:\"viewport\",expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"circle-stroke-width\":{type:\"number\",default:0,minimum:0,transition:!0,units:\"pixels\",expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"circle-stroke-color\":{type:\"color\",default:\"#000000\",transition:!0,expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"circle-stroke-opacity\":{type:\"number\",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"}},paint_heatmap:{\"heatmap-radius\":{type:\"number\",default:30,minimum:1,transition:!0,units:\"pixels\",expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"heatmap-weight\":{type:\"number\",default:1,minimum:0,transition:!1,expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"heatmap-intensity\":{type:\"number\",default:1,minimum:0,transition:!0,expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"heatmap-color\":{type:\"color\",default:[\"interpolate\",[\"linear\"],[\"heatmap-density\"],0,\"rgba(0, 0, 255, 0)\",.1,\"royalblue\",.3,\"cyan\",.5,\"lime\",.7,\"yellow\",1,\"red\"],transition:!1,expression:{interpolated:!0,parameters:[\"heatmap-density\"]},\"property-type\":\"color-ramp\"},\"heatmap-opacity\":{type:\"number\",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"}},paint_symbol:{\"icon-opacity\":{type:\"number\",default:1,minimum:0,maximum:1,transition:!0,requires:[\"icon-image\"],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"icon-color\":{type:\"color\",default:\"#000000\",transition:!0,requires:[\"icon-image\"],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"icon-halo-color\":{type:\"color\",default:\"rgba(0, 0, 0, 0)\",transition:!0,requires:[\"icon-image\"],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"icon-halo-width\":{type:\"number\",default:0,minimum:0,transition:!0,units:\"pixels\",requires:[\"icon-image\"],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"icon-halo-blur\":{type:\"number\",default:0,minimum:0,transition:!0,units:\"pixels\",requires:[\"icon-image\"],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"icon-translate\":{type:\"array\",value:\"number\",length:2,default:[0,0],transition:!0,units:\"pixels\",requires:[\"icon-image\"],expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"icon-translate-anchor\":{type:\"enum\",values:{map:{},viewport:{}},default:\"map\",requires:[\"icon-image\",\"icon-translate\"],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"text-opacity\":{type:\"number\",default:1,minimum:0,maximum:1,transition:!0,requires:[\"text-field\"],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"text-color\":{type:\"color\",default:\"#000000\",transition:!0,overridable:!0,requires:[\"text-field\"],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"text-halo-color\":{type:\"color\",default:\"rgba(0, 0, 0, 0)\",transition:!0,requires:[\"text-field\"],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"text-halo-width\":{type:\"number\",default:0,minimum:0,transition:!0,units:\"pixels\",requires:[\"text-field\"],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"text-halo-blur\":{type:\"number\",default:0,minimum:0,transition:!0,units:\"pixels\",requires:[\"text-field\"],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"text-translate\":{type:\"array\",value:\"number\",length:2,default:[0,0],transition:!0,units:\"pixels\",requires:[\"text-field\"],expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"text-translate-anchor\":{type:\"enum\",values:{map:{},viewport:{}},default:\"map\",requires:[\"text-field\",\"text-translate\"],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"}},paint_raster:{\"raster-opacity\":{type:\"number\",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"raster-hue-rotate\":{type:\"number\",default:0,period:360,transition:!0,units:\"degrees\",expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"raster-brightness-min\":{type:\"number\",default:0,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"raster-brightness-max\":{type:\"number\",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"raster-saturation\":{type:\"number\",default:0,minimum:-1,maximum:1,transition:!0,expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"raster-contrast\":{type:\"number\",default:0,minimum:-1,maximum:1,transition:!0,expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"raster-resampling\":{type:\"enum\",values:{linear:{},nearest:{}},default:\"linear\",expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"raster-fade-duration\":{type:\"number\",default:300,minimum:0,transition:!1,units:\"milliseconds\",expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"}},paint_hillshade:{\"hillshade-illumination-direction\":{type:\"number\",default:335,minimum:0,maximum:359,transition:!1,expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"hillshade-illumination-anchor\":{type:\"enum\",values:{map:{},viewport:{}},default:\"viewport\",expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"hillshade-exaggeration\":{type:\"number\",default:.5,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"hillshade-shadow-color\":{type:\"color\",default:\"#000000\",transition:!0,expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"hillshade-highlight-color\":{type:\"color\",default:\"#FFFFFF\",transition:!0,expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"hillshade-accent-color\":{type:\"color\",default:\"#000000\",transition:!0,expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"}},paint_background:{\"background-color\":{type:\"color\",default:\"#000000\",transition:!0,requires:[{\"!\":\"background-pattern\"}],expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"background-pattern\":{type:\"resolvedImage\",transition:!0,expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"cross-faded\"},\"background-opacity\":{type:\"number\",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"}},transition:{duration:{type:\"number\",default:300,minimum:0,units:\"milliseconds\"},delay:{type:\"number\",default:0,minimum:0,units:\"milliseconds\"}},\"property-type\":{\"data-driven\":{type:\"property-type\"},\"cross-faded\":{type:\"property-type\"},\"cross-faded-data-driven\":{type:\"property-type\"},\"color-ramp\":{type:\"property-type\"},\"data-constant\":{type:\"property-type\"},constant:{type:\"property-type\"}},promoteId:{\"*\":{type:\"string\"}}},Bt=function(t,e,r,n){this.message=(t?t+\": \":\"\")+r,n&&(this.identifier=n),null!=e&&e.__line__&&(this.line=e.__line__)};function Nt(t){var e=t.key,r=t.value;return r?[new Bt(e,r,\"constants have been deprecated as of v8\")]:[]}function jt(t){for(var e=[],r=arguments.length-1;r-- >0;)e[r]=arguments[r+1];for(var n=0,i=e;n\":\"value\"===t.itemType.kind?\"array\":\"array<\"+e+\">\"}return t.kind}var ne=[Gt,Wt,Yt,Xt,Zt,Qt,Kt,ee(Jt),te];function ie(t,e){if(\"error\"===e.kind)return null;if(\"array\"===t.kind){if(\"array\"===e.kind&&(0===e.N&&\"value\"===e.itemType.kind||!ie(t.itemType,e.itemType))&&(\"number\"!=typeof t.N||t.N===e.N))return null}else{if(t.kind===e.kind)return null;if(\"value\"===t.kind)for(var r=0,n=ne;r255?255:t}function i(t){return t<0?0:t>1?1:t}function a(t){return\"%\"===t[t.length-1]?n(parseFloat(t)/100*255):n(parseInt(t))}function o(t){return\"%\"===t[t.length-1]?i(parseFloat(t)/100):i(parseFloat(t))}function s(t,e,r){return r<0?r+=1:r>1&&(r-=1),6*r<1?t+(e-t)*r*6:2*r<1?e:3*r<2?t+(e-t)*(2/3-r)*6:t}try{e.parseCSSColor=function(t){var e,i=t.replace(/ /g,\"\").toLowerCase();if(i in r)return r[i].slice();if(\"#\"===i[0])return 4===i.length?(e=parseInt(i.substr(1),16))>=0&&e<=4095?[(3840&e)>>4|(3840&e)>>8,240&e|(240&e)>>4,15&e|(15&e)<<4,1]:null:7===i.length&&(e=parseInt(i.substr(1),16))>=0&&e<=16777215?[(16711680&e)>>16,(65280&e)>>8,255&e,1]:null;var l=i.indexOf(\"(\"),u=i.indexOf(\")\");if(-1!==l&&u+1===i.length){var c=i.substr(0,l),f=i.substr(l+1,u-(l+1)).split(\",\"),h=1;switch(c){case\"rgba\":if(4!==f.length)return null;h=o(f.pop());case\"rgb\":return 3!==f.length?null:[a(f[0]),a(f[1]),a(f[2]),h];case\"hsla\":if(4!==f.length)return null;h=o(f.pop());case\"hsl\":if(3!==f.length)return null;var p=(parseFloat(f[0])%360+360)%360/360,d=o(f[1]),v=o(f[2]),g=v<=.5?v*(d+1):v+d-v*d,y=2*v-g;return[n(255*s(y,g,p+1/3)),n(255*s(y,g,p)),n(255*s(y,g,p-1/3)),h];default:return null}}return null}}catch(t){}})),le=se.parseCSSColor,ue=function(t,e,r,n){void 0===n&&(n=1),this.r=t,this.g=e,this.b=r,this.a=n};ue.parse=function(t){if(t){if(t instanceof ue)return t;if(\"string\"==typeof t){var e=le(t);if(e)return new ue(e[0]/255*e[3],e[1]/255*e[3],e[2]/255*e[3],e[3])}}},ue.prototype.toString=function(){var t=this.toArray(),e=t[0],r=t[1],n=t[2],i=t[3];return\"rgba(\"+Math.round(e)+\",\"+Math.round(r)+\",\"+Math.round(n)+\",\"+i+\")\"},ue.prototype.toArray=function(){var t=this,e=t.r,r=t.g,n=t.b,i=t.a;return 0===i?[0,0,0,0]:[255*e/i,255*r/i,255*n/i,i]},ue.black=new ue(0,0,0,1),ue.white=new ue(1,1,1,1),ue.transparent=new ue(0,0,0,0),ue.red=new ue(1,0,0,1);var ce=function(t,e,r){this.sensitivity=t?e?\"variant\":\"case\":e?\"accent\":\"base\",this.locale=r,this.collator=new Intl.Collator(this.locale?this.locale:[],{sensitivity:this.sensitivity,usage:\"search\"})};ce.prototype.compare=function(t,e){return this.collator.compare(t,e)},ce.prototype.resolvedLocale=function(){return new Intl.Collator(this.locale?this.locale:[]).resolvedOptions().locale};var fe=function(t,e,r,n,i){this.text=t,this.image=e,this.scale=r,this.fontStack=n,this.textColor=i},he=function(t){this.sections=t};he.fromString=function(t){return new he([new fe(t,null,null,null,null)])},he.prototype.isEmpty=function(){return 0===this.sections.length||!this.sections.some((function(t){return 0!==t.text.length||t.image&&0!==t.image.name.length}))},he.factory=function(t){return t instanceof he?t:he.fromString(t)},he.prototype.toString=function(){return 0===this.sections.length?\"\":this.sections.map((function(t){return t.text})).join(\"\")},he.prototype.serialize=function(){for(var t=[\"format\"],e=0,r=this.sections;e=0&&t<=255&&\"number\"==typeof e&&e>=0&&e<=255&&\"number\"==typeof r&&r>=0&&r<=255?void 0===n||\"number\"==typeof n&&n>=0&&n<=1?null:\"Invalid rgba value [\"+[t,e,r,n].join(\", \")+\"]: 'a' must be between 0 and 1.\":\"Invalid rgba value [\"+(\"number\"==typeof n?[t,e,r,n]:[t,e,r]).join(\", \")+\"]: 'r', 'g', and 'b' must be between 0 and 255.\"}function ve(t){if(null===t)return!0;if(\"string\"==typeof t)return!0;if(\"boolean\"==typeof t)return!0;if(\"number\"==typeof t)return!0;if(t instanceof ue)return!0;if(t instanceof ce)return!0;if(t instanceof he)return!0;if(t instanceof pe)return!0;if(Array.isArray(t)){for(var e=0,r=t;e2){var s=t[1];if(\"string\"!=typeof s||!(s in be)||\"object\"===s)return e.error('The item type argument of \"array\" must be one of string, number, boolean',1);a=be[s],n++}else a=Jt;if(t.length>3){if(null!==t[2]&&(\"number\"!=typeof t[2]||t[2]<0||t[2]!==Math.floor(t[2])))return e.error('The length argument to \"array\" must be a positive integer literal',2);o=t[2],n++}r=ee(a,o)}else r=be[i];for(var l=[];n1)&&e.push(n)}}return e.concat(this.args.map((function(t){return t.serialize()})))};var we=function(t){this.type=Qt,this.sections=t};we.parse=function(t,e){if(t.length<2)return e.error(\"Expected at least one argument.\");var r=t[1];if(!Array.isArray(r)&&\"object\"==typeof r)return e.error(\"First argument must be an image or text section.\");for(var n=[],i=!1,a=1;a<=t.length-1;++a){var o=t[a];if(i&&\"object\"==typeof o&&!Array.isArray(o)){i=!1;var s=null;if(o[\"font-scale\"]&&!(s=e.parse(o[\"font-scale\"],1,Wt)))return null;var l=null;if(o[\"text-font\"]&&!(l=e.parse(o[\"text-font\"],1,ee(Yt))))return null;var u=null;if(o[\"text-color\"]&&!(u=e.parse(o[\"text-color\"],1,Zt)))return null;var c=n[n.length-1];c.scale=s,c.font=l,c.textColor=u}else{var f=e.parse(t[a],1,Jt);if(!f)return null;var h=f.type.kind;if(\"string\"!==h&&\"value\"!==h&&\"null\"!==h&&\"resolvedImage\"!==h)return e.error(\"Formatted text type must be 'string', 'value', 'image' or 'null'.\");i=!0,n.push({content:f,scale:null,font:null,textColor:null})}}return new we(n)},we.prototype.evaluate=function(t){return new he(this.sections.map((function(e){var r=e.content.evaluate(t);return ge(r)===te?new fe(\"\",r,null,null,null):new fe(ye(r),null,e.scale?e.scale.evaluate(t):null,e.font?e.font.evaluate(t).join(\",\"):null,e.textColor?e.textColor.evaluate(t):null)})))},we.prototype.eachChild=function(t){for(var e=0,r=this.sections;e-1),r},Te.prototype.eachChild=function(t){t(this.input)},Te.prototype.outputDefined=function(){return!1},Te.prototype.serialize=function(){return[\"image\",this.input.serialize()]};var ke={\"to-boolean\":Xt,\"to-color\":Zt,\"to-number\":Wt,\"to-string\":Yt},Ae=function(t,e){this.type=t,this.args=e};Ae.parse=function(t,e){if(t.length<2)return e.error(\"Expected at least one argument.\");var r=t[0];if((\"to-boolean\"===r||\"to-string\"===r)&&2!==t.length)return e.error(\"Expected one argument.\");for(var n=ke[r],i=[],a=1;a4?\"Invalid rbga value \"+JSON.stringify(e)+\": expected an array containing either three or four numeric values.\":de(e[0],e[1],e[2],e[3])))return new ue(e[0]/255,e[1]/255,e[2]/255,e[3])}throw new xe(r||\"Could not parse color from value '\"+(\"string\"==typeof e?e:String(JSON.stringify(e)))+\"'\")}if(\"number\"===this.type.kind){for(var o=null,s=0,l=this.args;s=e[2]||t[1]<=e[1]||t[3]>=e[3])}function Ie(t,e){var r,n=(180+t[0])/360,i=(r=t[1],(180-180/Math.PI*Math.log(Math.tan(Math.PI/4+r*Math.PI/360)))/360),a=Math.pow(2,e.z);return[Math.round(n*a*Ce),Math.round(i*a*Ce)]}function ze(t,e,r){return e[1]>t[1]!=r[1]>t[1]&&t[0]<(r[0]-e[0])*(t[1]-e[1])/(r[1]-e[1])+e[0]}function De(t,e){for(var r=!1,n=0,i=e.length;n0&&f<0||c<0&&f>0}function Be(t,e,r){for(var n=0,i=r;nr[2]){var i=.5*n,a=t[0]-r[0]>i?-n:r[0]-t[0]>i?n:0;0===a&&(a=t[0]-r[2]>i?-n:r[2]-t[0]>i?n:0),t[0]+=a}Pe(e,t)}function He(t,e,r,n){for(var i=Math.pow(2,n.z)*Ce,a=[n.x*Ce,n.y*Ce],o=[],s=0,l=t;s=0)return!1;var r=!0;return t.eachChild((function(t){r&&!Ze(t,e)&&(r=!1)})),r}We.parse=function(t,e){if(2!==t.length)return e.error(\"'within' expression requires exactly one argument, but found \"+(t.length-1)+\" instead.\");if(ve(t[1])){var r=t[1];if(\"FeatureCollection\"===r.type)for(var n=0;ne))throw new xe(\"Input is not a number.\");o=s-1}return 0}Je.prototype.parse=function(t,e,r,n,i){return void 0===i&&(i={}),e?this.concat(e,r,n)._parse(t,i):this._parse(t,i)},Je.prototype._parse=function(t,e){function r(t,e,r){return\"assert\"===r?new _e(e,[t]):\"coerce\"===r?new Ae(e,[t]):t}if(null!==t&&\"string\"!=typeof t&&\"boolean\"!=typeof t&&\"number\"!=typeof t||(t=[\"literal\",t]),Array.isArray(t)){if(0===t.length)return this.error('Expected an array with at least one element. If you wanted a literal array, use [\"literal\", []].');var n=t[0];if(\"string\"!=typeof n)return this.error(\"Expression name must be a string, but found \"+typeof n+' instead. If you wanted a literal array, use [\"literal\", [...]].',0),null;var i=this.registry[n];if(i){var a=i.parse(t,this);if(!a)return null;if(this.expectedType){var o=this.expectedType,s=a.type;if(\"string\"!==o.kind&&\"number\"!==o.kind&&\"boolean\"!==o.kind&&\"object\"!==o.kind&&\"array\"!==o.kind||\"value\"!==s.kind)if(\"color\"!==o.kind&&\"formatted\"!==o.kind&&\"resolvedImage\"!==o.kind||\"value\"!==s.kind&&\"string\"!==s.kind){if(this.checkSubtype(o,s))return null}else a=r(a,o,e.typeAnnotation||\"coerce\");else a=r(a,o,e.typeAnnotation||\"assert\")}if(!(a instanceof me)&&\"resolvedImage\"!==a.type.kind&&$e(a)){var l=new Se;try{a=new me(a.type,a.evaluate(l))}catch(t){return this.error(t.message),null}}return a}return this.error('Unknown expression \"'+n+'\". If you wanted a literal array, use [\"literal\", [...]].',0)}return void 0===t?this.error(\"'undefined' value invalid. Use null instead.\"):\"object\"==typeof t?this.error('Bare objects invalid. Use [\"literal\", {...}] instead.'):this.error(\"Expected an array, but found \"+typeof t+\" instead.\")},Je.prototype.concat=function(t,e,r){var n=\"number\"==typeof t?this.path.concat(t):this.path,i=r?this.scope.concat(r):this.scope;return new Je(this.registry,n,e||null,i,this.errors)},Je.prototype.error=function(t){for(var e=[],r=arguments.length-1;r-- >0;)e[r]=arguments[r+1];var n=\"\"+this.key+e.map((function(t){return\"[\"+t+\"]\"})).join(\"\");this.errors.push(new qt(n,t))},Je.prototype.checkSubtype=function(t,e){var r=ie(t,e);return r&&this.error(r),r};var tr=function(t,e,r){this.type=t,this.input=e,this.labels=[],this.outputs=[];for(var n=0,i=r;n=o)return e.error('Input/output pairs for \"step\" expressions must be arranged with input values in strictly ascending order.',l);var c=e.parse(s,u,i);if(!c)return null;i=i||c.type,n.push([o,c])}return new tr(i,r,n)},tr.prototype.evaluate=function(t){var e=this.labels,r=this.outputs;if(1===e.length)return r[0].evaluate(t);var n=this.input.evaluate(t);if(n<=e[0])return r[0].evaluate(t);var i=e.length;return n>=e[i-1]?r[i-1].evaluate(t):r[Qe(e,n)].evaluate(t)},tr.prototype.eachChild=function(t){t(this.input);for(var e=0,r=this.outputs;e0&&t.push(this.labels[e]),t.push(this.outputs[e].serialize());return t};var rr=Object.freeze({__proto__:null,number:er,color:function(t,e,r){return new ue(er(t.r,e.r,r),er(t.g,e.g,r),er(t.b,e.b,r),er(t.a,e.a,r))},array:function(t,e,r){return t.map((function(t,n){return er(t,e[n],r)}))}}),nr=.95047,ir=1,ar=1.08883,or=4/29,sr=6/29,lr=3*sr*sr,ur=sr*sr*sr,cr=Math.PI/180,fr=180/Math.PI;function hr(t){return t>ur?Math.pow(t,1/3):t/lr+or}function pr(t){return t>sr?t*t*t:lr*(t-or)}function dr(t){return 255*(t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055)}function vr(t){return(t/=255)<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}function gr(t){var e=vr(t.r),r=vr(t.g),n=vr(t.b),i=hr((.4124564*e+.3575761*r+.1804375*n)/nr),a=hr((.2126729*e+.7151522*r+.072175*n)/ir);return{l:116*a-16,a:500*(i-a),b:200*(a-hr((.0193339*e+.119192*r+.9503041*n)/ar)),alpha:t.a}}function yr(t){var e=(t.l+16)/116,r=isNaN(t.a)?e:e+t.a/500,n=isNaN(t.b)?e:e-t.b/200;return e=ir*pr(e),r=nr*pr(r),n=ar*pr(n),new ue(dr(3.2404542*r-1.5371385*e-.4985314*n),dr(-.969266*r+1.8760108*e+.041556*n),dr(.0556434*r-.2040259*e+1.0572252*n),t.alpha)}function mr(t,e,r){var n=e-t;return t+r*(n>180||n<-180?n-360*Math.round(n/360):n)}var xr={forward:gr,reverse:yr,interpolate:function(t,e,r){return{l:er(t.l,e.l,r),a:er(t.a,e.a,r),b:er(t.b,e.b,r),alpha:er(t.alpha,e.alpha,r)}}},br={forward:function(t){var e=gr(t),r=e.l,n=e.a,i=e.b,a=Math.atan2(i,n)*fr;return{h:a<0?a+360:a,c:Math.sqrt(n*n+i*i),l:r,alpha:t.a}},reverse:function(t){var e=t.h*cr,r=t.c;return yr({l:t.l,a:Math.cos(e)*r,b:Math.sin(e)*r,alpha:t.alpha})},interpolate:function(t,e,r){return{h:mr(t.h,e.h,r),c:er(t.c,e.c,r),l:er(t.l,e.l,r),alpha:er(t.alpha,e.alpha,r)}}},_r=Object.freeze({__proto__:null,lab:xr,hcl:br}),wr=function(t,e,r,n,i){this.type=t,this.operator=e,this.interpolation=r,this.input=n,this.labels=[],this.outputs=[];for(var a=0,o=i;a1})))return e.error(\"Cubic bezier interpolation requires four numeric arguments with values between 0 and 1.\",1);n={name:\"cubic-bezier\",controlPoints:s}}if(t.length-1<4)return e.error(\"Expected at least 4 arguments, but found only \"+(t.length-1)+\".\");if((t.length-1)%2!=0)return e.error(\"Expected an even number of arguments.\");if(!(i=e.parse(i,2,Wt)))return null;var l=[],u=null;\"interpolate-hcl\"===r||\"interpolate-lab\"===r?u=Zt:e.expectedType&&\"value\"!==e.expectedType.kind&&(u=e.expectedType);for(var c=0;c=f)return e.error('Input/output pairs for \"interpolate\" expressions must be arranged with input values in strictly ascending order.',p);var v=e.parse(h,d,u);if(!v)return null;u=u||v.type,l.push([f,v])}return\"number\"===u.kind||\"color\"===u.kind||\"array\"===u.kind&&\"number\"===u.itemType.kind&&\"number\"==typeof u.N?new wr(u,r,n,i,l):e.error(\"Type \"+re(u)+\" is not interpolatable.\")},wr.prototype.evaluate=function(t){var e=this.labels,r=this.outputs;if(1===e.length)return r[0].evaluate(t);var n=this.input.evaluate(t);if(n<=e[0])return r[0].evaluate(t);var i=e.length;if(n>=e[i-1])return r[i-1].evaluate(t);var a=Qe(e,n),o=e[a],s=e[a+1],l=wr.interpolationFactor(this.interpolation,n,o,s),u=r[a].evaluate(t),c=r[a+1].evaluate(t);return\"interpolate\"===this.operator?rr[this.type.kind.toLowerCase()](u,c,l):\"interpolate-hcl\"===this.operator?br.reverse(br.interpolate(br.forward(u),br.forward(c),l)):xr.reverse(xr.interpolate(xr.forward(u),xr.forward(c),l))},wr.prototype.eachChild=function(t){t(this.input);for(var e=0,r=this.outputs;e=r.length)throw new xe(\"Array index out of bounds: \"+e+\" > \"+(r.length-1)+\".\");if(e!==Math.floor(e))throw new xe(\"Array index must be an integer, but found \"+e+\" instead.\");return r[e]},Mr.prototype.eachChild=function(t){t(this.index),t(this.input)},Mr.prototype.outputDefined=function(){return!1},Mr.prototype.serialize=function(){return[\"at\",this.index.serialize(),this.input.serialize()]};var Sr=function(t,e){this.type=Xt,this.needle=t,this.haystack=e};Sr.parse=function(t,e){if(3!==t.length)return e.error(\"Expected 2 arguments, but found \"+(t.length-1)+\" instead.\");var r=e.parse(t[1],1,Jt),n=e.parse(t[2],2,Jt);return r&&n?ae(r.type,[Xt,Yt,Wt,Gt,Jt])?new Sr(r,n):e.error(\"Expected first argument to be of type boolean, string, number or null, but found \"+re(r.type)+\" instead\"):null},Sr.prototype.evaluate=function(t){var e=this.needle.evaluate(t),r=this.haystack.evaluate(t);if(!r)return!1;if(!oe(e,[\"boolean\",\"string\",\"number\",\"null\"]))throw new xe(\"Expected first argument to be of type boolean, string, number or null, but found \"+re(ge(e))+\" instead.\");if(!oe(r,[\"string\",\"array\"]))throw new xe(\"Expected second argument to be of type array or string, but found \"+re(ge(r))+\" instead.\");return r.indexOf(e)>=0},Sr.prototype.eachChild=function(t){t(this.needle),t(this.haystack)},Sr.prototype.outputDefined=function(){return!0},Sr.prototype.serialize=function(){return[\"in\",this.needle.serialize(),this.haystack.serialize()]};var Er=function(t,e,r){this.type=Wt,this.needle=t,this.haystack=e,this.fromIndex=r};Er.parse=function(t,e){if(t.length<=2||t.length>=5)return e.error(\"Expected 3 or 4 arguments, but found \"+(t.length-1)+\" instead.\");var r=e.parse(t[1],1,Jt),n=e.parse(t[2],2,Jt);if(!r||!n)return null;if(!ae(r.type,[Xt,Yt,Wt,Gt,Jt]))return e.error(\"Expected first argument to be of type boolean, string, number or null, but found \"+re(r.type)+\" instead\");if(4===t.length){var i=e.parse(t[3],3,Wt);return i?new Er(r,n,i):null}return new Er(r,n)},Er.prototype.evaluate=function(t){var e=this.needle.evaluate(t),r=this.haystack.evaluate(t);if(!oe(e,[\"boolean\",\"string\",\"number\",\"null\"]))throw new xe(\"Expected first argument to be of type boolean, string, number or null, but found \"+re(ge(e))+\" instead.\");if(!oe(r,[\"string\",\"array\"]))throw new xe(\"Expected second argument to be of type array or string, but found \"+re(ge(r))+\" instead.\");if(this.fromIndex){var n=this.fromIndex.evaluate(t);return r.indexOf(e,n)}return r.indexOf(e)},Er.prototype.eachChild=function(t){t(this.needle),t(this.haystack),this.fromIndex&&t(this.fromIndex)},Er.prototype.outputDefined=function(){return!1},Er.prototype.serialize=function(){if(null!=this.fromIndex&&void 0!==this.fromIndex){var t=this.fromIndex.serialize();return[\"index-of\",this.needle.serialize(),this.haystack.serialize(),t]}return[\"index-of\",this.needle.serialize(),this.haystack.serialize()]};var Lr=function(t,e,r,n,i,a){this.inputType=t,this.type=e,this.input=r,this.cases=n,this.outputs=i,this.otherwise=a};Lr.parse=function(t,e){if(t.length<5)return e.error(\"Expected at least 4 arguments, but found only \"+(t.length-1)+\".\");if(t.length%2!=1)return e.error(\"Expected an even number of arguments.\");var r,n;e.expectedType&&\"value\"!==e.expectedType.kind&&(n=e.expectedType);for(var i={},a=[],o=2;oNumber.MAX_SAFE_INTEGER)return u.error(\"Branch labels must be integers no larger than \"+Number.MAX_SAFE_INTEGER+\".\");if(\"number\"==typeof h&&Math.floor(h)!==h)return u.error(\"Numeric branch labels must be integer values.\");if(r){if(u.checkSubtype(r,ge(h)))return null}else r=ge(h);if(void 0!==i[String(h)])return u.error(\"Branch labels must be unique.\");i[String(h)]=a.length}var p=e.parse(l,o,n);if(!p)return null;n=n||p.type,a.push(p)}var d=e.parse(t[1],1,Jt);if(!d)return null;var v=e.parse(t[t.length-1],t.length-1,n);return v?\"value\"!==d.type.kind&&e.concat(1).checkSubtype(r,d.type)?null:new Lr(r,n,d,i,a,v):null},Lr.prototype.evaluate=function(t){var e=this.input.evaluate(t);return(ge(e)===this.inputType&&this.outputs[this.cases[e]]||this.otherwise).evaluate(t)},Lr.prototype.eachChild=function(t){t(this.input),this.outputs.forEach(t),t(this.otherwise)},Lr.prototype.outputDefined=function(){return this.outputs.every((function(t){return t.outputDefined()}))&&this.otherwise.outputDefined()},Lr.prototype.serialize=function(){for(var t=this,e=[\"match\",this.input.serialize()],r=[],n={},i=0,a=Object.keys(this.cases).sort();i=5)return e.error(\"Expected 3 or 4 arguments, but found \"+(t.length-1)+\" instead.\");var r=e.parse(t[1],1,Jt),n=e.parse(t[2],2,Wt);if(!r||!n)return null;if(!ae(r.type,[ee(Jt),Yt,Jt]))return e.error(\"Expected first argument to be of type array or string, but found \"+re(r.type)+\" instead\");if(4===t.length){var i=e.parse(t[3],3,Wt);return i?new Pr(r.type,r,n,i):null}return new Pr(r.type,r,n)},Pr.prototype.evaluate=function(t){var e=this.input.evaluate(t),r=this.beginIndex.evaluate(t);if(!oe(e,[\"string\",\"array\"]))throw new xe(\"Expected first argument to be of type array or string, but found \"+re(ge(e))+\" instead.\");if(this.endIndex){var n=this.endIndex.evaluate(t);return e.slice(r,n)}return e.slice(r)},Pr.prototype.eachChild=function(t){t(this.input),t(this.beginIndex),this.endIndex&&t(this.endIndex)},Pr.prototype.outputDefined=function(){return!1},Pr.prototype.serialize=function(){if(null!=this.endIndex&&void 0!==this.endIndex){var t=this.endIndex.serialize();return[\"slice\",this.input.serialize(),this.beginIndex.serialize(),t]}return[\"slice\",this.input.serialize(),this.beginIndex.serialize()]};var Dr=zr(\"==\",(function(t,e,r){return e===r}),Ir),Rr=zr(\"!=\",(function(t,e,r){return e!==r}),(function(t,e,r,n){return!Ir(0,e,r,n)})),Fr=zr(\"<\",(function(t,e,r){return e\",(function(t,e,r){return e>r}),(function(t,e,r,n){return n.compare(e,r)>0})),Nr=zr(\"<=\",(function(t,e,r){return e<=r}),(function(t,e,r,n){return n.compare(e,r)<=0})),jr=zr(\">=\",(function(t,e,r){return e>=r}),(function(t,e,r,n){return n.compare(e,r)>=0})),Ur=function(t,e,r,n,i){this.type=Yt,this.number=t,this.locale=e,this.currency=r,this.minFractionDigits=n,this.maxFractionDigits=i};Ur.parse=function(t,e){if(3!==t.length)return e.error(\"Expected two arguments.\");var r=e.parse(t[1],1,Wt);if(!r)return null;var n=t[2];if(\"object\"!=typeof n||Array.isArray(n))return e.error(\"NumberFormat options argument must be an object.\");var i=null;if(n.locale&&!(i=e.parse(n.locale,1,Yt)))return null;var a=null;if(n.currency&&!(a=e.parse(n.currency,1,Yt)))return null;var o=null;if(n[\"min-fraction-digits\"]&&!(o=e.parse(n[\"min-fraction-digits\"],1,Wt)))return null;var s=null;return n[\"max-fraction-digits\"]&&!(s=e.parse(n[\"max-fraction-digits\"],1,Wt))?null:new Ur(r,i,a,o,s)},Ur.prototype.evaluate=function(t){return new Intl.NumberFormat(this.locale?this.locale.evaluate(t):[],{style:this.currency?\"currency\":\"decimal\",currency:this.currency?this.currency.evaluate(t):void 0,minimumFractionDigits:this.minFractionDigits?this.minFractionDigits.evaluate(t):void 0,maximumFractionDigits:this.maxFractionDigits?this.maxFractionDigits.evaluate(t):void 0}).format(this.number.evaluate(t))},Ur.prototype.eachChild=function(t){t(this.number),this.locale&&t(this.locale),this.currency&&t(this.currency),this.minFractionDigits&&t(this.minFractionDigits),this.maxFractionDigits&&t(this.maxFractionDigits)},Ur.prototype.outputDefined=function(){return!1},Ur.prototype.serialize=function(){var t={};return this.locale&&(t.locale=this.locale.serialize()),this.currency&&(t.currency=this.currency.serialize()),this.minFractionDigits&&(t[\"min-fraction-digits\"]=this.minFractionDigits.serialize()),this.maxFractionDigits&&(t[\"max-fraction-digits\"]=this.maxFractionDigits.serialize()),[\"number-format\",this.number.serialize(),t]};var Vr=function(t){this.type=Wt,this.input=t};Vr.parse=function(t,e){if(2!==t.length)return e.error(\"Expected 1 argument, but found \"+(t.length-1)+\" instead.\");var r=e.parse(t[1],1);return r?\"array\"!==r.type.kind&&\"string\"!==r.type.kind&&\"value\"!==r.type.kind?e.error(\"Expected argument of type string or array, but found \"+re(r.type)+\" instead.\"):new Vr(r):null},Vr.prototype.evaluate=function(t){var e=this.input.evaluate(t);if(\"string\"==typeof e)return e.length;if(Array.isArray(e))return e.length;throw new xe(\"Expected value to be of type string or array, but found \"+re(ge(e))+\" instead.\")},Vr.prototype.eachChild=function(t){t(this.input)},Vr.prototype.outputDefined=function(){return!1},Vr.prototype.serialize=function(){var t=[\"length\"];return this.eachChild((function(e){t.push(e.serialize())})),t};var qr={\"==\":Dr,\"!=\":Rr,\">\":Br,\"<\":Fr,\">=\":jr,\"<=\":Nr,array:_e,at:Mr,boolean:_e,case:Cr,coalesce:kr,collator:Le,format:we,image:Te,in:Sr,\"index-of\":Er,interpolate:wr,\"interpolate-hcl\":wr,\"interpolate-lab\":wr,length:Vr,let:Ar,literal:me,match:Lr,number:_e,\"number-format\":Ur,object:_e,slice:Pr,step:tr,string:_e,\"to-boolean\":Ae,\"to-color\":Ae,\"to-number\":Ae,\"to-string\":Ae,var:Ke,within:We};function Hr(t,e){var r=e[0],n=e[1],i=e[2],a=e[3];r=r.evaluate(t),n=n.evaluate(t),i=i.evaluate(t);var o=a?a.evaluate(t):1,s=de(r,n,i,o);if(s)throw new xe(s);return new ue(r/255*o,n/255*o,i/255*o,o)}function Gr(t,e){return t in e}function Wr(t,e){var r=e[t];return void 0===r?null:r}function Yr(t){return{type:t}}function Xr(t){return{result:\"success\",value:t}}function Zr(t){return{result:\"error\",value:t}}function Kr(t){return\"data-driven\"===t[\"property-type\"]||\"cross-faded-data-driven\"===t[\"property-type\"]}function Jr(t){return!!t.expression&&t.expression.parameters.indexOf(\"zoom\")>-1}function $r(t){return!!t.expression&&t.expression.interpolated}function Qr(t){return t instanceof Number?\"number\":t instanceof String?\"string\":t instanceof Boolean?\"boolean\":Array.isArray(t)?\"array\":null===t?\"null\":typeof t}function tn(t){return\"object\"==typeof t&&null!==t&&!Array.isArray(t)}function en(t){return t}function rn(t,e){var r,n,i,a=\"color\"===e.type,o=t.stops&&\"object\"==typeof t.stops[0][0],s=o||void 0!==t.property,l=o||!s,u=t.type||($r(e)?\"exponential\":\"interval\");if(a&&((t=jt({},t)).stops&&(t.stops=t.stops.map((function(t){return[t[0],ue.parse(t[1])]}))),t.default?t.default=ue.parse(t.default):t.default=ue.parse(e.default)),t.colorSpace&&\"rgb\"!==t.colorSpace&&!_r[t.colorSpace])throw new Error(\"Unknown color space: \"+t.colorSpace);if(\"exponential\"===u)r=sn;else if(\"interval\"===u)r=on;else if(\"categorical\"===u){r=an,n=Object.create(null);for(var c=0,f=t.stops;c=t.stops[n-1][0])return t.stops[n-1][1];var i=Qe(t.stops.map((function(t){return t[0]})),r);return t.stops[i][1]}function sn(t,e,r){var n=void 0!==t.base?t.base:1;if(\"number\"!==Qr(r))return nn(t.default,e.default);var i=t.stops.length;if(1===i)return t.stops[0][1];if(r<=t.stops[0][0])return t.stops[0][1];if(r>=t.stops[i-1][0])return t.stops[i-1][1];var a=Qe(t.stops.map((function(t){return t[0]})),r),o=function(t,e,r,n){var i=n-r,a=t-r;return 0===i?0:1===e?a/i:(Math.pow(e,a)-1)/(Math.pow(e,i)-1)}(r,n,t.stops[a][0],t.stops[a+1][0]),s=t.stops[a][1],l=t.stops[a+1][1],u=rr[e.type]||en;if(t.colorSpace&&\"rgb\"!==t.colorSpace){var c=_r[t.colorSpace];u=function(t,e){return c.reverse(c.interpolate(c.forward(t),c.forward(e),o))}}return\"function\"==typeof s.evaluate?{evaluate:function(){for(var t=[],e=arguments.length;e--;)t[e]=arguments[e];var r=s.evaluate.apply(void 0,t),n=l.evaluate.apply(void 0,t);if(void 0!==r&&void 0!==n)return u(r,n,o)}}:u(s,l,o)}function ln(t,e,r){return\"color\"===e.type?r=ue.parse(r):\"formatted\"===e.type?r=he.fromString(r.toString()):\"resolvedImage\"===e.type?r=pe.fromString(r.toString()):Qr(r)===e.type||\"enum\"===e.type&&e.values[r]||(r=void 0),nn(r,t.default,e.default)}Ee.register(qr,{error:[{kind:\"error\"},[Yt],function(t,e){var r=e[0];throw new xe(r.evaluate(t))}],typeof:[Yt,[Jt],function(t,e){return re(ge(e[0].evaluate(t)))}],\"to-rgba\":[ee(Wt,4),[Zt],function(t,e){return e[0].evaluate(t).toArray()}],rgb:[Zt,[Wt,Wt,Wt],Hr],rgba:[Zt,[Wt,Wt,Wt,Wt],Hr],has:{type:Xt,overloads:[[[Yt],function(t,e){return Gr(e[0].evaluate(t),t.properties())}],[[Yt,Kt],function(t,e){var r=e[0],n=e[1];return Gr(r.evaluate(t),n.evaluate(t))}]]},get:{type:Jt,overloads:[[[Yt],function(t,e){return Wr(e[0].evaluate(t),t.properties())}],[[Yt,Kt],function(t,e){var r=e[0],n=e[1];return Wr(r.evaluate(t),n.evaluate(t))}]]},\"feature-state\":[Jt,[Yt],function(t,e){return Wr(e[0].evaluate(t),t.featureState||{})}],properties:[Kt,[],function(t){return t.properties()}],\"geometry-type\":[Yt,[],function(t){return t.geometryType()}],id:[Jt,[],function(t){return t.id()}],zoom:[Wt,[],function(t){return t.globals.zoom}],\"heatmap-density\":[Wt,[],function(t){return t.globals.heatmapDensity||0}],\"line-progress\":[Wt,[],function(t){return t.globals.lineProgress||0}],accumulated:[Jt,[],function(t){return void 0===t.globals.accumulated?null:t.globals.accumulated}],\"+\":[Wt,Yr(Wt),function(t,e){for(var r=0,n=0,i=e;n\":[Xt,[Yt,Jt],function(t,e){var r=e[0],n=e[1],i=t.properties()[r.value],a=n.value;return typeof i==typeof a&&i>a}],\"filter-id->\":[Xt,[Jt],function(t,e){var r=e[0],n=t.id(),i=r.value;return typeof n==typeof i&&n>i}],\"filter-<=\":[Xt,[Yt,Jt],function(t,e){var r=e[0],n=e[1],i=t.properties()[r.value],a=n.value;return typeof i==typeof a&&i<=a}],\"filter-id-<=\":[Xt,[Jt],function(t,e){var r=e[0],n=t.id(),i=r.value;return typeof n==typeof i&&n<=i}],\"filter->=\":[Xt,[Yt,Jt],function(t,e){var r=e[0],n=e[1],i=t.properties()[r.value],a=n.value;return typeof i==typeof a&&i>=a}],\"filter-id->=\":[Xt,[Jt],function(t,e){var r=e[0],n=t.id(),i=r.value;return typeof n==typeof i&&n>=i}],\"filter-has\":[Xt,[Jt],function(t,e){return e[0].value in t.properties()}],\"filter-has-id\":[Xt,[],function(t){return null!==t.id()&&void 0!==t.id()}],\"filter-type-in\":[Xt,[ee(Yt)],function(t,e){return e[0].value.indexOf(t.geometryType())>=0}],\"filter-id-in\":[Xt,[ee(Jt)],function(t,e){return e[0].value.indexOf(t.id())>=0}],\"filter-in-small\":[Xt,[Yt,ee(Jt)],function(t,e){var r=e[0];return e[1].value.indexOf(t.properties()[r.value])>=0}],\"filter-in-large\":[Xt,[Yt,ee(Jt)],function(t,e){var r=e[0],n=e[1];return function(t,e,r,n){for(;r<=n;){var i=r+n>>1;if(e[i]===t)return!0;e[i]>t?n=i-1:r=i+1}return!1}(t.properties()[r.value],n.value,0,n.value.length-1)}],all:{type:Xt,overloads:[[[Xt,Xt],function(t,e){var r=e[0],n=e[1];return r.evaluate(t)&&n.evaluate(t)}],[Yr(Xt),function(t,e){for(var r=0,n=e;r0&&\"string\"==typeof t[0]&&t[0]in qr}function fn(t,e){var r=new Je(qr,[],e?function(t){var e={color:Zt,string:Yt,number:Wt,enum:Yt,boolean:Xt,formatted:Qt,resolvedImage:te};return\"array\"===t.type?ee(e[t.value]||Jt,t.length):e[t.type]}(e):void 0),n=r.parse(t,void 0,void 0,void 0,e&&\"string\"===e.type?{typeAnnotation:\"coerce\"}:void 0);return n?Xr(new un(n,e)):Zr(r.errors)}un.prototype.evaluateWithoutErrorHandling=function(t,e,r,n,i,a){return this._evaluator.globals=t,this._evaluator.feature=e,this._evaluator.featureState=r,this._evaluator.canonical=n,this._evaluator.availableImages=i||null,this._evaluator.formattedSection=a,this.expression.evaluate(this._evaluator)},un.prototype.evaluate=function(t,e,r,n,i,a){this._evaluator.globals=t,this._evaluator.feature=e||null,this._evaluator.featureState=r||null,this._evaluator.canonical=n,this._evaluator.availableImages=i||null,this._evaluator.formattedSection=a||null;try{var o=this.expression.evaluate(this._evaluator);if(null==o||\"number\"==typeof o&&o!=o)return this._defaultValue;if(this._enumValues&&!(o in this._enumValues))throw new xe(\"Expected value to be one of \"+Object.keys(this._enumValues).map((function(t){return JSON.stringify(t)})).join(\", \")+\", but found \"+JSON.stringify(o)+\" instead.\");return o}catch(t){return this._warningHistory[t.message]||(this._warningHistory[t.message]=!0,\"undefined\"!=typeof console&&console.warn(t.message)),this._defaultValue}};var hn=function(t,e){this.kind=t,this._styleExpression=e,this.isStateDependent=\"constant\"!==t&&!Xe(e.expression)};hn.prototype.evaluateWithoutErrorHandling=function(t,e,r,n,i,a){return this._styleExpression.evaluateWithoutErrorHandling(t,e,r,n,i,a)},hn.prototype.evaluate=function(t,e,r,n,i,a){return this._styleExpression.evaluate(t,e,r,n,i,a)};var pn=function(t,e,r,n){this.kind=t,this.zoomStops=r,this._styleExpression=e,this.isStateDependent=\"camera\"!==t&&!Xe(e.expression),this.interpolationType=n};function dn(t,e){if(\"error\"===(t=fn(t,e)).result)return t;var r=t.value.expression,n=Ye(r);if(!n&&!Kr(e))return Zr([new qt(\"\",\"data expressions not supported\")]);var i=Ze(r,[\"zoom\"]);if(!i&&!Jr(e))return Zr([new qt(\"\",\"zoom expressions not supported\")]);var a=gn(r);if(!a&&!i)return Zr([new qt(\"\",'\"zoom\" expression may only be used as input to a top-level \"step\" or \"interpolate\" expression.')]);if(a instanceof qt)return Zr([a]);if(a instanceof wr&&!$r(e))return Zr([new qt(\"\",'\"interpolate\" expressions cannot be used with this property')]);if(!a)return Xr(new hn(n?\"constant\":\"source\",t.value));var o=a instanceof wr?a.interpolation:void 0;return Xr(new pn(n?\"camera\":\"composite\",t.value,a.labels,o))}pn.prototype.evaluateWithoutErrorHandling=function(t,e,r,n,i,a){return this._styleExpression.evaluateWithoutErrorHandling(t,e,r,n,i,a)},pn.prototype.evaluate=function(t,e,r,n,i,a){return this._styleExpression.evaluate(t,e,r,n,i,a)},pn.prototype.interpolationFactor=function(t,e,r){return this.interpolationType?wr.interpolationFactor(this.interpolationType,t,e,r):0};var vn=function(t,e){this._parameters=t,this._specification=e,jt(this,rn(this._parameters,this._specification))};function gn(t){var e=null;if(t instanceof Ar)e=gn(t.result);else if(t instanceof kr)for(var r=0,n=t.args;rn.maximum?[new Bt(e,r,r+\" is greater than the maximum value \"+n.maximum)]:[]}function bn(t){var e,r,n,i=t.valueSpec,a=Ut(t.value.type),o={},s=\"categorical\"!==a&&void 0===t.value.property,l=!s,u=\"array\"===Qr(t.value.stops)&&\"array\"===Qr(t.value.stops[0])&&\"object\"===Qr(t.value.stops[0][0]),c=yn({key:t.key,value:t.value,valueSpec:t.styleSpec.function,style:t.style,styleSpec:t.styleSpec,objectElementValidators:{stops:function(t){if(\"identity\"===a)return[new Bt(t.key,t.value,'identity function may not have a \"stops\" property')];var e=[],r=t.value;return e=e.concat(mn({key:t.key,value:r,valueSpec:t.valueSpec,style:t.style,styleSpec:t.styleSpec,arrayElementValidator:f})),\"array\"===Qr(r)&&0===r.length&&e.push(new Bt(t.key,r,\"array must have at least one stop\")),e},default:function(t){return Hn({key:t.key,value:t.value,valueSpec:i,style:t.style,styleSpec:t.styleSpec})}}});return\"identity\"===a&&s&&c.push(new Bt(t.key,t.value,'missing required property \"property\"')),\"identity\"===a||t.value.stops||c.push(new Bt(t.key,t.value,'missing required property \"stops\"')),\"exponential\"===a&&t.valueSpec.expression&&!$r(t.valueSpec)&&c.push(new Bt(t.key,t.value,\"exponential functions not supported\")),t.styleSpec.$version>=8&&(l&&!Kr(t.valueSpec)?c.push(new Bt(t.key,t.value,\"property functions not supported\")):s&&!Jr(t.valueSpec)&&c.push(new Bt(t.key,t.value,\"zoom functions not supported\"))),\"categorical\"!==a&&!u||void 0!==t.value.property||c.push(new Bt(t.key,t.value,'\"property\" property is required')),c;function f(t){var e=[],a=t.value,s=t.key;if(\"array\"!==Qr(a))return[new Bt(s,a,\"array expected, \"+Qr(a)+\" found\")];if(2!==a.length)return[new Bt(s,a,\"array length 2 expected, length \"+a.length+\" found\")];if(u){if(\"object\"!==Qr(a[0]))return[new Bt(s,a,\"object expected, \"+Qr(a[0])+\" found\")];if(void 0===a[0].zoom)return[new Bt(s,a,\"object stop key must have zoom\")];if(void 0===a[0].value)return[new Bt(s,a,\"object stop key must have value\")];if(n&&n>Ut(a[0].zoom))return[new Bt(s,a[0].zoom,\"stop zoom values must appear in ascending order\")];Ut(a[0].zoom)!==n&&(n=Ut(a[0].zoom),r=void 0,o={}),e=e.concat(yn({key:s+\"[0]\",value:a[0],valueSpec:{zoom:{}},style:t.style,styleSpec:t.styleSpec,objectElementValidators:{zoom:xn,value:h}}))}else e=e.concat(h({key:s+\"[0]\",value:a[0],valueSpec:{},style:t.style,styleSpec:t.styleSpec},a));return cn(Vt(a[1]))?e.concat([new Bt(s+\"[1]\",a[1],\"expressions are not allowed in function stops.\")]):e.concat(Hn({key:s+\"[1]\",value:a[1],valueSpec:i,style:t.style,styleSpec:t.styleSpec}))}function h(t,n){var s=Qr(t.value),l=Ut(t.value),u=null!==t.value?t.value:n;if(e){if(s!==e)return[new Bt(t.key,u,s+\" stop domain type must match previous stop domain type \"+e)]}else e=s;if(\"number\"!==s&&\"string\"!==s&&\"boolean\"!==s)return[new Bt(t.key,u,\"stop domain value must be a number, string, or boolean\")];if(\"number\"!==s&&\"categorical\"!==a){var c=\"number expected, \"+s+\" found\";return Kr(i)&&void 0===a&&(c+='\\nIf you intended to use a categorical function, specify `\"type\": \"categorical\"`.'),[new Bt(t.key,u,c)]}return\"categorical\"!==a||\"number\"!==s||isFinite(l)&&Math.floor(l)===l?\"categorical\"!==a&&\"number\"===s&&void 0!==r&&l=2&&\"$id\"!==t[1]&&\"$type\"!==t[1];case\"in\":return t.length>=3&&(\"string\"!=typeof t[1]||Array.isArray(t[2]));case\"!in\":case\"!has\":case\"none\":return!1;case\"==\":case\"!=\":case\">\":case\">=\":case\"<\":case\"<=\":return 3!==t.length||Array.isArray(t[1])||Array.isArray(t[2]);case\"any\":case\"all\":for(var e=0,r=t.slice(1);ee?1:0}function Sn(t){if(!Array.isArray(t))return!1;if(\"within\"===t[0])return!0;for(var e=1;e\"===r||\"<=\"===r||\">=\"===r?Ln(t[1],t[2],r):\"any\"===r?(e=t.slice(1),[\"any\"].concat(e.map(En))):\"all\"===r?[\"all\"].concat(t.slice(1).map(En)):\"none\"===r?[\"all\"].concat(t.slice(1).map(En).map(On)):\"in\"===r?Cn(t[1],t.slice(2)):\"!in\"===r?On(Cn(t[1],t.slice(2))):\"has\"===r?Pn(t[1]):\"!has\"===r?On(Pn(t[1])):\"within\"!==r||t}function Ln(t,e,r){switch(t){case\"$type\":return[\"filter-type-\"+r,e];case\"$id\":return[\"filter-id-\"+r,e];default:return[\"filter-\"+r,t,e]}}function Cn(t,e){if(0===e.length)return!1;switch(t){case\"$type\":return[\"filter-type-in\",[\"literal\",e]];case\"$id\":return[\"filter-id-in\",[\"literal\",e]];default:return e.length>200&&!e.some((function(t){return typeof t!=typeof e[0]}))?[\"filter-in-large\",t,[\"literal\",e.sort(Mn)]]:[\"filter-in-small\",t,[\"literal\",e]]}}function Pn(t){switch(t){case\"$type\":return!0;case\"$id\":return[\"filter-has-id\"];default:return[\"filter-has\",t]}}function On(t){return[\"!\",t]}function In(t){return Tn(Vt(t.value))?_n(jt({},t,{expressionContext:\"filter\",valueSpec:{value:\"boolean\"}})):zn(t)}function zn(t){var e=t.value,r=t.key;if(\"array\"!==Qr(e))return[new Bt(r,e,\"array expected, \"+Qr(e)+\" found\")];var n,i=t.styleSpec,a=[];if(e.length<1)return[new Bt(r,e,\"filter array must have at least 1 element\")];switch(a=a.concat(wn({key:r+\"[0]\",value:e[0],valueSpec:i.filter_operator,style:t.style,styleSpec:t.styleSpec})),Ut(e[0])){case\"<\":case\"<=\":case\">\":case\">=\":e.length>=2&&\"$type\"===Ut(e[1])&&a.push(new Bt(r,e,'\"$type\" cannot be use with operator \"'+e[0]+'\"'));case\"==\":case\"!=\":3!==e.length&&a.push(new Bt(r,e,'filter array for operator \"'+e[0]+'\" must have 3 elements'));case\"in\":case\"!in\":e.length>=2&&\"string\"!==(n=Qr(e[1]))&&a.push(new Bt(r+\"[1]\",e[1],\"string expected, \"+n+\" found\"));for(var o=2;o=c[p+0]&&n>=c[p+1])?(o[h]=!0,a.push(u[h])):o[h]=!1}}},ri.prototype._forEachCell=function(t,e,r,n,i,a,o,s){for(var l=this._convertToCellCoord(t),u=this._convertToCellCoord(e),c=this._convertToCellCoord(r),f=this._convertToCellCoord(n),h=l;h<=c;h++)for(var p=u;p<=f;p++){var d=this.d*p+h;if((!s||s(this._convertFromCellCoord(h),this._convertFromCellCoord(p),this._convertFromCellCoord(h+1),this._convertFromCellCoord(p+1)))&&i.call(this,t,e,r,n,d,a,o,s))return}},ri.prototype._convertFromCellCoord=function(t){return(t-this.padding)/this.scale},ri.prototype._convertToCellCoord=function(t){return Math.max(0,Math.min(this.d-1,Math.floor(t*this.scale)+this.padding))},ri.prototype.toArrayBuffer=function(){if(this.arrayBuffer)return this.arrayBuffer;for(var t=this.cells,e=ei+this.cells.length+1+1,r=0,n=0;n=0)){var f=t[c];u[c]=ai[l].shallow.indexOf(c)>=0?f:ci(f,e)}t instanceof Error&&(u.message=t.message)}if(u.$name)throw new Error(\"$name property is reserved for worker serialization logic.\");return\"Object\"!==l&&(u.$name=l),u}throw new Error(\"can't serialize object of type \"+typeof t)}function fi(t){if(null==t||\"boolean\"==typeof t||\"number\"==typeof t||\"string\"==typeof t||t instanceof Boolean||t instanceof Number||t instanceof String||t instanceof Date||t instanceof RegExp||li(t)||ui(t)||ArrayBuffer.isView(t)||t instanceof ni)return t;if(Array.isArray(t))return t.map(fi);if(\"object\"==typeof t){var e=t.$name||\"Object\",r=ai[e].klass;if(!r)throw new Error(\"can't deserialize unregistered class \"+e);if(r.deserialize)return r.deserialize(t);for(var n=Object.create(r.prototype),i=0,a=Object.keys(t);i=0?s:fi(s)}}return n}throw new Error(\"can't deserialize object of type \"+typeof t)}var hi=function(){this.first=!0};hi.prototype.update=function(t,e){var r=Math.floor(t);return this.first?(this.first=!1,this.lastIntegerZoom=r,this.lastIntegerZoomTime=0,this.lastZoom=t,this.lastFloorZoom=r,!0):(this.lastFloorZoom>r?(this.lastIntegerZoom=r+1,this.lastIntegerZoomTime=e):this.lastFloorZoom=128&&t<=255},Arabic:function(t){return t>=1536&&t<=1791},\"Arabic Supplement\":function(t){return t>=1872&&t<=1919},\"Arabic Extended-A\":function(t){return t>=2208&&t<=2303},\"Hangul Jamo\":function(t){return t>=4352&&t<=4607},\"Unified Canadian Aboriginal Syllabics\":function(t){return t>=5120&&t<=5759},Khmer:function(t){return t>=6016&&t<=6143},\"Unified Canadian Aboriginal Syllabics Extended\":function(t){return t>=6320&&t<=6399},\"General Punctuation\":function(t){return t>=8192&&t<=8303},\"Letterlike Symbols\":function(t){return t>=8448&&t<=8527},\"Number Forms\":function(t){return t>=8528&&t<=8591},\"Miscellaneous Technical\":function(t){return t>=8960&&t<=9215},\"Control Pictures\":function(t){return t>=9216&&t<=9279},\"Optical Character Recognition\":function(t){return t>=9280&&t<=9311},\"Enclosed Alphanumerics\":function(t){return t>=9312&&t<=9471},\"Geometric Shapes\":function(t){return t>=9632&&t<=9727},\"Miscellaneous Symbols\":function(t){return t>=9728&&t<=9983},\"Miscellaneous Symbols and Arrows\":function(t){return t>=11008&&t<=11263},\"CJK Radicals Supplement\":function(t){return t>=11904&&t<=12031},\"Kangxi Radicals\":function(t){return t>=12032&&t<=12255},\"Ideographic Description Characters\":function(t){return t>=12272&&t<=12287},\"CJK Symbols and Punctuation\":function(t){return t>=12288&&t<=12351},Hiragana:function(t){return t>=12352&&t<=12447},Katakana:function(t){return t>=12448&&t<=12543},Bopomofo:function(t){return t>=12544&&t<=12591},\"Hangul Compatibility Jamo\":function(t){return t>=12592&&t<=12687},Kanbun:function(t){return t>=12688&&t<=12703},\"Bopomofo Extended\":function(t){return t>=12704&&t<=12735},\"CJK Strokes\":function(t){return t>=12736&&t<=12783},\"Katakana Phonetic Extensions\":function(t){return t>=12784&&t<=12799},\"Enclosed CJK Letters and Months\":function(t){return t>=12800&&t<=13055},\"CJK Compatibility\":function(t){return t>=13056&&t<=13311},\"CJK Unified Ideographs Extension A\":function(t){return t>=13312&&t<=19903},\"Yijing Hexagram Symbols\":function(t){return t>=19904&&t<=19967},\"CJK Unified Ideographs\":function(t){return t>=19968&&t<=40959},\"Yi Syllables\":function(t){return t>=40960&&t<=42127},\"Yi Radicals\":function(t){return t>=42128&&t<=42191},\"Hangul Jamo Extended-A\":function(t){return t>=43360&&t<=43391},\"Hangul Syllables\":function(t){return t>=44032&&t<=55215},\"Hangul Jamo Extended-B\":function(t){return t>=55216&&t<=55295},\"Private Use Area\":function(t){return t>=57344&&t<=63743},\"CJK Compatibility Ideographs\":function(t){return t>=63744&&t<=64255},\"Arabic Presentation Forms-A\":function(t){return t>=64336&&t<=65023},\"Vertical Forms\":function(t){return t>=65040&&t<=65055},\"CJK Compatibility Forms\":function(t){return t>=65072&&t<=65103},\"Small Form Variants\":function(t){return t>=65104&&t<=65135},\"Arabic Presentation Forms-B\":function(t){return t>=65136&&t<=65279},\"Halfwidth and Fullwidth Forms\":function(t){return t>=65280&&t<=65519}};function di(t){for(var e=0,r=t;e=65097&&t<=65103)||pi[\"CJK Compatibility Ideographs\"](t)||pi[\"CJK Compatibility\"](t)||pi[\"CJK Radicals Supplement\"](t)||pi[\"CJK Strokes\"](t)||!(!pi[\"CJK Symbols and Punctuation\"](t)||t>=12296&&t<=12305||t>=12308&&t<=12319||12336===t)||pi[\"CJK Unified Ideographs Extension A\"](t)||pi[\"CJK Unified Ideographs\"](t)||pi[\"Enclosed CJK Letters and Months\"](t)||pi[\"Hangul Compatibility Jamo\"](t)||pi[\"Hangul Jamo Extended-A\"](t)||pi[\"Hangul Jamo Extended-B\"](t)||pi[\"Hangul Jamo\"](t)||pi[\"Hangul Syllables\"](t)||pi.Hiragana(t)||pi[\"Ideographic Description Characters\"](t)||pi.Kanbun(t)||pi[\"Kangxi Radicals\"](t)||pi[\"Katakana Phonetic Extensions\"](t)||pi.Katakana(t)&&12540!==t||!(!pi[\"Halfwidth and Fullwidth Forms\"](t)||65288===t||65289===t||65293===t||t>=65306&&t<=65310||65339===t||65341===t||65343===t||t>=65371&&t<=65503||65507===t||t>=65512&&t<=65519)||!(!pi[\"Small Form Variants\"](t)||t>=65112&&t<=65118||t>=65123&&t<=65126)||pi[\"Unified Canadian Aboriginal Syllabics\"](t)||pi[\"Unified Canadian Aboriginal Syllabics Extended\"](t)||pi[\"Vertical Forms\"](t)||pi[\"Yijing Hexagram Symbols\"](t)||pi[\"Yi Syllables\"](t)||pi[\"Yi Radicals\"](t))))}function gi(t){return!(vi(t)||function(t){return!!(pi[\"Latin-1 Supplement\"](t)&&(167===t||169===t||174===t||177===t||188===t||189===t||190===t||215===t||247===t)||pi[\"General Punctuation\"](t)&&(8214===t||8224===t||8225===t||8240===t||8241===t||8251===t||8252===t||8258===t||8263===t||8264===t||8265===t||8273===t)||pi[\"Letterlike Symbols\"](t)||pi[\"Number Forms\"](t)||pi[\"Miscellaneous Technical\"](t)&&(t>=8960&&t<=8967||t>=8972&&t<=8991||t>=8996&&t<=9e3||9003===t||t>=9085&&t<=9114||t>=9150&&t<=9165||9167===t||t>=9169&&t<=9179||t>=9186&&t<=9215)||pi[\"Control Pictures\"](t)&&9251!==t||pi[\"Optical Character Recognition\"](t)||pi[\"Enclosed Alphanumerics\"](t)||pi[\"Geometric Shapes\"](t)||pi[\"Miscellaneous Symbols\"](t)&&!(t>=9754&&t<=9759)||pi[\"Miscellaneous Symbols and Arrows\"](t)&&(t>=11026&&t<=11055||t>=11088&&t<=11097||t>=11192&&t<=11243)||pi[\"CJK Symbols and Punctuation\"](t)||pi.Katakana(t)||pi[\"Private Use Area\"](t)||pi[\"CJK Compatibility Forms\"](t)||pi[\"Small Form Variants\"](t)||pi[\"Halfwidth and Fullwidth Forms\"](t)||8734===t||8756===t||8757===t||t>=9984&&t<=10087||t>=10102&&t<=10131||65532===t||65533===t)}(t))}function yi(t){return pi.Arabic(t)||pi[\"Arabic Supplement\"](t)||pi[\"Arabic Extended-A\"](t)||pi[\"Arabic Presentation Forms-A\"](t)||pi[\"Arabic Presentation Forms-B\"](t)}function mi(t){return t>=1424&&t<=2303||pi[\"Arabic Presentation Forms-A\"](t)||pi[\"Arabic Presentation Forms-B\"](t)}function xi(t,e){return!(!e&&mi(t)||t>=2304&&t<=3583||t>=3840&&t<=4255||pi.Khmer(t))}function bi(t){for(var e=0,r=t;e-1&&(Mi=ki),Ai&&Ai(t)};function Li(){Ci.fire(new zt(\"pluginStateChange\",{pluginStatus:Mi,pluginURL:Si}))}var Ci=new Rt,Pi=function(){return Mi},Oi=function(){if(Mi!==_i||!Si)throw new Error(\"rtl-text-plugin cannot be downloaded unless a pluginURL is specified\");Mi=wi,Li(),Si&&Mt({url:Si},(function(t){t?Ei(t):(Mi=Ti,Li())}))},Ii={applyArabicShaping:null,processBidirectionalText:null,processStyledBidirectionalText:null,isLoaded:function(){return Mi===Ti||null!=Ii.applyArabicShaping},isLoading:function(){return Mi===wi},setState:function(t){Mi=t.pluginStatus,Si=t.pluginURL},isParsed:function(){return null!=Ii.applyArabicShaping&&null!=Ii.processBidirectionalText&&null!=Ii.processStyledBidirectionalText},getPluginURL:function(){return Si}},zi=function(t,e){this.zoom=t,e?(this.now=e.now,this.fadeDuration=e.fadeDuration,this.zoomHistory=e.zoomHistory,this.transition=e.transition):(this.now=0,this.fadeDuration=0,this.zoomHistory=new hi,this.transition={})};zi.prototype.isSupportedScript=function(t){return function(t,e){for(var r=0,n=t;rthis.zoomHistory.lastIntegerZoom?{fromScale:2,toScale:1,t:e+(1-e)*r}:{fromScale:.5,toScale:1,t:1-(1-r)*e}};var Di=function(t,e){this.property=t,this.value=e,this.expression=function(t,e){if(tn(t))return new vn(t,e);if(cn(t)){var r=dn(t,e);if(\"error\"===r.result)throw new Error(r.value.map((function(t){return t.key+\": \"+t.message})).join(\", \"));return r.value}var n=t;return\"string\"==typeof t&&\"color\"===e.type&&(n=ue.parse(t)),{kind:\"constant\",evaluate:function(){return n}}}(void 0===e?t.specification.default:e,t.specification)};Di.prototype.isDataDriven=function(){return\"source\"===this.expression.kind||\"composite\"===this.expression.kind},Di.prototype.possiblyEvaluate=function(t,e,r){return this.property.possiblyEvaluate(this,t,e,r)};var Ri=function(t){this.property=t,this.value=new Di(t,void 0)};Ri.prototype.transitioned=function(t,e){return new Bi(this.property,this.value,e,p({},t.transition,this.transition),t.now)},Ri.prototype.untransitioned=function(){return new Bi(this.property,this.value,null,{},0)};var Fi=function(t){this._properties=t,this._values=Object.create(t.defaultTransitionablePropertyValues)};Fi.prototype.getValue=function(t){return w(this._values[t].value.value)},Fi.prototype.setValue=function(t,e){this._values.hasOwnProperty(t)||(this._values[t]=new Ri(this._values[t].property)),this._values[t].value=new Di(this._values[t].property,null===e?void 0:w(e))},Fi.prototype.getTransition=function(t){return w(this._values[t].transition)},Fi.prototype.setTransition=function(t,e){this._values.hasOwnProperty(t)||(this._values[t]=new Ri(this._values[t].property)),this._values[t].transition=w(e)||void 0},Fi.prototype.serialize=function(){for(var t={},e=0,r=Object.keys(this._values);ethis.end)return this.prior=null,i;if(this.value.isDataDriven())return this.prior=null,i;if(n=1)return 1;var e=t*t,r=e*t;return 4*(t<.5?r:3*(t-e)+r-.75)}(o))}return i};var Ni=function(t){this._properties=t,this._values=Object.create(t.defaultTransitioningPropertyValues)};Ni.prototype.possiblyEvaluate=function(t,e,r){for(var n=new Vi(this._properties),i=0,a=Object.keys(this._values);in.zoomHistory.lastIntegerZoom?{from:t,to:e}:{from:r,to:e}},e.prototype.interpolate=function(t){return t},e}(Hi),Wi=function(t){this.specification=t};Wi.prototype.possiblyEvaluate=function(t,e,r,n){if(void 0!==t.value){if(\"constant\"===t.expression.kind){var i=t.expression.evaluate(e,null,{},r,n);return this._calculate(i,i,i,e)}return this._calculate(t.expression.evaluate(new zi(Math.floor(e.zoom-1),e)),t.expression.evaluate(new zi(Math.floor(e.zoom),e)),t.expression.evaluate(new zi(Math.floor(e.zoom+1),e)),e)}},Wi.prototype._calculate=function(t,e,r,n){return n.zoom>n.zoomHistory.lastIntegerZoom?{from:t,to:e}:{from:r,to:e}},Wi.prototype.interpolate=function(t){return t};var Yi=function(t){this.specification=t};Yi.prototype.possiblyEvaluate=function(t,e,r,n){return!!t.expression.evaluate(e,null,{},r,n)},Yi.prototype.interpolate=function(){return!1};var Xi=function(t){for(var e in this.properties=t,this.defaultPropertyValues={},this.defaultTransitionablePropertyValues={},this.defaultTransitioningPropertyValues={},this.defaultPossiblyEvaluatedValues={},this.overridableProperties=[],t){var r=t[e];r.specification.overridable&&this.overridableProperties.push(e);var n=this.defaultPropertyValues[e]=new Di(r,void 0),i=this.defaultTransitionablePropertyValues[e]=new Ri(r);this.defaultTransitioningPropertyValues[e]=i.untransitioned(),this.defaultPossiblyEvaluatedValues[e]=n.possiblyEvaluate({})}};oi(\"DataDrivenProperty\",Hi),oi(\"DataConstantProperty\",qi),oi(\"CrossFadedDataDrivenProperty\",Gi),oi(\"CrossFadedProperty\",Wi),oi(\"ColorRampProperty\",Yi);var Zi=\"-transition\",Ki=function(t){function e(e,r){if(t.call(this),this.id=e.id,this.type=e.type,this._featureFilter={filter:function(){return!0},needGeometry:!1},\"custom\"!==e.type&&(this.metadata=e.metadata,this.minzoom=e.minzoom,this.maxzoom=e.maxzoom,\"background\"!==e.type&&(this.source=e.source,this.sourceLayer=e[\"source-layer\"],this.filter=e.filter),r.layout&&(this._unevaluatedLayout=new ji(r.layout)),r.paint)){for(var n in this._transitionablePaint=new Fi(r.paint),e.paint)this.setPaintProperty(n,e.paint[n],{validate:!1});for(var i in e.layout)this.setLayoutProperty(i,e.layout[i],{validate:!1});this._transitioningPaint=this._transitionablePaint.untransitioned(),this.paint=new Vi(r.paint)}}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.getCrossfadeParameters=function(){return this._crossfadeParameters},e.prototype.getLayoutProperty=function(t){return\"visibility\"===t?this.visibility:this._unevaluatedLayout.getValue(t)},e.prototype.setLayoutProperty=function(t,e,r){if(void 0===r&&(r={}),null!=e){var n=\"layers.\"+this.id+\".layout.\"+t;if(this._validate($n,n,t,e,r))return}\"visibility\"!==t?this._unevaluatedLayout.setValue(t,e):this.visibility=e},e.prototype.getPaintProperty=function(t){return x(t,Zi)?this._transitionablePaint.getTransition(t.slice(0,-11)):this._transitionablePaint.getValue(t)},e.prototype.setPaintProperty=function(t,e,r){if(void 0===r&&(r={}),null!=e){var n=\"layers.\"+this.id+\".paint.\"+t;if(this._validate(Jn,n,t,e,r))return!1}if(x(t,Zi))return this._transitionablePaint.setTransition(t.slice(0,-11),e||void 0),!1;var i=this._transitionablePaint._values[t],a=\"cross-faded-data-driven\"===i.property.specification[\"property-type\"],o=i.value.isDataDriven(),s=i.value;this._transitionablePaint.setValue(t,e),this._handleSpecialPaintPropertyUpdate(t);var l=this._transitionablePaint._values[t].value;return l.isDataDriven()||o||a||this._handleOverridablePaintPropertyUpdate(t,s,l)},e.prototype._handleSpecialPaintPropertyUpdate=function(t){},e.prototype._handleOverridablePaintPropertyUpdate=function(t,e,r){return!1},e.prototype.isHidden=function(t){return!!(this.minzoom&&t=this.maxzoom)||\"none\"===this.visibility},e.prototype.updateTransitions=function(t){this._transitioningPaint=this._transitionablePaint.transitioned(t,this._transitioningPaint)},e.prototype.hasTransition=function(){return this._transitioningPaint.hasTransition()},e.prototype.recalculate=function(t,e){t.getCrossfadeParameters&&(this._crossfadeParameters=t.getCrossfadeParameters()),this._unevaluatedLayout&&(this.layout=this._unevaluatedLayout.possiblyEvaluate(t,void 0,e)),this.paint=this._transitioningPaint.possiblyEvaluate(t,void 0,e)},e.prototype.serialize=function(){var t={id:this.id,type:this.type,source:this.source,\"source-layer\":this.sourceLayer,metadata:this.metadata,minzoom:this.minzoom,maxzoom:this.maxzoom,filter:this.filter,layout:this._unevaluatedLayout&&this._unevaluatedLayout.serialize(),paint:this._transitionablePaint&&this._transitionablePaint.serialize()};return this.visibility&&(t.layout=t.layout||{},t.layout.visibility=this.visibility),_(t,(function(t,e){return!(void 0===t||\"layout\"===e&&!Object.keys(t).length||\"paint\"===e&&!Object.keys(t).length)}))},e.prototype._validate=function(t,e,r,n,i){return void 0===i&&(i={}),(!i||!1!==i.validate)&&Qn(this,t.call(Zn,{key:e,layerType:this.type,objectKey:r,value:n,styleSpec:Ft,style:{glyphs:!0,sprite:!0}}))},e.prototype.is3D=function(){return!1},e.prototype.isTileClipped=function(){return!1},e.prototype.hasOffscreenPass=function(){return!1},e.prototype.resize=function(){},e.prototype.isStateDependent=function(){for(var t in this.paint._values){var e=this.paint.get(t);if(e instanceof Ui&&Kr(e.property.specification)&&(\"source\"===e.value.kind||\"composite\"===e.value.kind)&&e.value.isStateDependent)return!0}return!1},e}(Rt),Ji={Int8:Int8Array,Uint8:Uint8Array,Int16:Int16Array,Uint16:Uint16Array,Int32:Int32Array,Uint32:Uint32Array,Float32:Float32Array},$i=function(t,e){this._structArray=t,this._pos1=e*this.size,this._pos2=this._pos1/2,this._pos4=this._pos1/4,this._pos8=this._pos1/8},Qi=function(){this.isTransferred=!1,this.capacity=-1,this.resize(0)};function ta(t,e){void 0===e&&(e=1);var r=0,n=0;return{members:t.map((function(t){var i,a=(i=t.type,Ji[i].BYTES_PER_ELEMENT),o=r=ea(r,Math.max(e,a)),s=t.components||1;return n=Math.max(n,a),r+=a*s,{name:t.name,type:t.type,components:s,offset:o}})),size:ea(r,Math.max(n,e)),alignment:e}}function ea(t,e){return Math.ceil(t/e)*e}Qi.serialize=function(t,e){return t._trim(),e&&(t.isTransferred=!0,e.push(t.arrayBuffer)),{length:t.length,arrayBuffer:t.arrayBuffer}},Qi.deserialize=function(t){var e=Object.create(this.prototype);return e.arrayBuffer=t.arrayBuffer,e.length=t.length,e.capacity=t.arrayBuffer.byteLength/e.bytesPerElement,e._refreshViews(),e},Qi.prototype._trim=function(){this.length!==this.capacity&&(this.capacity=this.length,this.arrayBuffer=this.arrayBuffer.slice(0,this.length*this.bytesPerElement),this._refreshViews())},Qi.prototype.clear=function(){this.length=0},Qi.prototype.resize=function(t){this.reserve(t),this.length=t},Qi.prototype.reserve=function(t){if(t>this.capacity){this.capacity=Math.max(t,Math.floor(5*this.capacity),128),this.arrayBuffer=new ArrayBuffer(this.capacity*this.bytesPerElement);var e=this.uint8;this._refreshViews(),e&&this.uint8.set(e)}},Qi.prototype._refreshViews=function(){throw new Error(\"_refreshViews() must be implemented by each concrete StructArray layout\")};var ra=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e){var r=this.length;return this.resize(r+1),this.emplace(r,t,e)},e.prototype.emplace=function(t,e,r){var n=2*t;return this.int16[n+0]=e,this.int16[n+1]=r,t},e}(Qi);ra.prototype.bytesPerElement=4,oi(\"StructArrayLayout2i4\",ra);var na=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r,n){var i=this.length;return this.resize(i+1),this.emplace(i,t,e,r,n)},e.prototype.emplace=function(t,e,r,n,i){var a=4*t;return this.int16[a+0]=e,this.int16[a+1]=r,this.int16[a+2]=n,this.int16[a+3]=i,t},e}(Qi);na.prototype.bytesPerElement=8,oi(\"StructArrayLayout4i8\",na);var ia=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r,n,i,a){var o=this.length;return this.resize(o+1),this.emplace(o,t,e,r,n,i,a)},e.prototype.emplace=function(t,e,r,n,i,a,o){var s=6*t;return this.int16[s+0]=e,this.int16[s+1]=r,this.int16[s+2]=n,this.int16[s+3]=i,this.int16[s+4]=a,this.int16[s+5]=o,t},e}(Qi);ia.prototype.bytesPerElement=12,oi(\"StructArrayLayout2i4i12\",ia);var aa=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r,n,i,a){var o=this.length;return this.resize(o+1),this.emplace(o,t,e,r,n,i,a)},e.prototype.emplace=function(t,e,r,n,i,a,o){var s=4*t,l=8*t;return this.int16[s+0]=e,this.int16[s+1]=r,this.uint8[l+4]=n,this.uint8[l+5]=i,this.uint8[l+6]=a,this.uint8[l+7]=o,t},e}(Qi);aa.prototype.bytesPerElement=8,oi(\"StructArrayLayout2i4ub8\",aa);var oa=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e){var r=this.length;return this.resize(r+1),this.emplace(r,t,e)},e.prototype.emplace=function(t,e,r){var n=2*t;return this.float32[n+0]=e,this.float32[n+1]=r,t},e}(Qi);oa.prototype.bytesPerElement=8,oi(\"StructArrayLayout2f8\",oa);var sa=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r,n,i,a,o,s,l,u){var c=this.length;return this.resize(c+1),this.emplace(c,t,e,r,n,i,a,o,s,l,u)},e.prototype.emplace=function(t,e,r,n,i,a,o,s,l,u,c){var f=10*t;return this.uint16[f+0]=e,this.uint16[f+1]=r,this.uint16[f+2]=n,this.uint16[f+3]=i,this.uint16[f+4]=a,this.uint16[f+5]=o,this.uint16[f+6]=s,this.uint16[f+7]=l,this.uint16[f+8]=u,this.uint16[f+9]=c,t},e}(Qi);sa.prototype.bytesPerElement=20,oi(\"StructArrayLayout10ui20\",sa);var la=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r,n,i,a,o,s,l,u,c,f){var h=this.length;return this.resize(h+1),this.emplace(h,t,e,r,n,i,a,o,s,l,u,c,f)},e.prototype.emplace=function(t,e,r,n,i,a,o,s,l,u,c,f,h){var p=12*t;return this.int16[p+0]=e,this.int16[p+1]=r,this.int16[p+2]=n,this.int16[p+3]=i,this.uint16[p+4]=a,this.uint16[p+5]=o,this.uint16[p+6]=s,this.uint16[p+7]=l,this.int16[p+8]=u,this.int16[p+9]=c,this.int16[p+10]=f,this.int16[p+11]=h,t},e}(Qi);la.prototype.bytesPerElement=24,oi(\"StructArrayLayout4i4ui4i24\",la);var ua=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r){var n=this.length;return this.resize(n+1),this.emplace(n,t,e,r)},e.prototype.emplace=function(t,e,r,n){var i=3*t;return this.float32[i+0]=e,this.float32[i+1]=r,this.float32[i+2]=n,t},e}(Qi);ua.prototype.bytesPerElement=12,oi(\"StructArrayLayout3f12\",ua);var ca=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.uint32=new Uint32Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t){var e=this.length;return this.resize(e+1),this.emplace(e,t)},e.prototype.emplace=function(t,e){var r=1*t;return this.uint32[r+0]=e,t},e}(Qi);ca.prototype.bytesPerElement=4,oi(\"StructArrayLayout1ul4\",ca);var fa=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer),this.uint32=new Uint32Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r,n,i,a,o,s,l){var u=this.length;return this.resize(u+1),this.emplace(u,t,e,r,n,i,a,o,s,l)},e.prototype.emplace=function(t,e,r,n,i,a,o,s,l,u){var c=10*t,f=5*t;return this.int16[c+0]=e,this.int16[c+1]=r,this.int16[c+2]=n,this.int16[c+3]=i,this.int16[c+4]=a,this.int16[c+5]=o,this.uint32[f+3]=s,this.uint16[c+8]=l,this.uint16[c+9]=u,t},e}(Qi);fa.prototype.bytesPerElement=20,oi(\"StructArrayLayout6i1ul2ui20\",fa);var ha=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r,n,i,a){var o=this.length;return this.resize(o+1),this.emplace(o,t,e,r,n,i,a)},e.prototype.emplace=function(t,e,r,n,i,a,o){var s=6*t;return this.int16[s+0]=e,this.int16[s+1]=r,this.int16[s+2]=n,this.int16[s+3]=i,this.int16[s+4]=a,this.int16[s+5]=o,t},e}(Qi);ha.prototype.bytesPerElement=12,oi(\"StructArrayLayout2i2i2i12\",ha);var pa=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r,n,i){var a=this.length;return this.resize(a+1),this.emplace(a,t,e,r,n,i)},e.prototype.emplace=function(t,e,r,n,i,a){var o=4*t,s=8*t;return this.float32[o+0]=e,this.float32[o+1]=r,this.float32[o+2]=n,this.int16[s+6]=i,this.int16[s+7]=a,t},e}(Qi);pa.prototype.bytesPerElement=16,oi(\"StructArrayLayout2f1f2i16\",pa);var da=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r,n){var i=this.length;return this.resize(i+1),this.emplace(i,t,e,r,n)},e.prototype.emplace=function(t,e,r,n,i){var a=12*t,o=3*t;return this.uint8[a+0]=e,this.uint8[a+1]=r,this.float32[o+1]=n,this.float32[o+2]=i,t},e}(Qi);da.prototype.bytesPerElement=12,oi(\"StructArrayLayout2ub2f12\",da);var va=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r){var n=this.length;return this.resize(n+1),this.emplace(n,t,e,r)},e.prototype.emplace=function(t,e,r,n){var i=3*t;return this.uint16[i+0]=e,this.uint16[i+1]=r,this.uint16[i+2]=n,t},e}(Qi);va.prototype.bytesPerElement=6,oi(\"StructArrayLayout3ui6\",va);var ga=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer),this.uint32=new Uint32Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r,n,i,a,o,s,l,u,c,f,h,p,d,v,g){var y=this.length;return this.resize(y+1),this.emplace(y,t,e,r,n,i,a,o,s,l,u,c,f,h,p,d,v,g)},e.prototype.emplace=function(t,e,r,n,i,a,o,s,l,u,c,f,h,p,d,v,g,y){var m=24*t,x=12*t,b=48*t;return this.int16[m+0]=e,this.int16[m+1]=r,this.uint16[m+2]=n,this.uint16[m+3]=i,this.uint32[x+2]=a,this.uint32[x+3]=o,this.uint32[x+4]=s,this.uint16[m+10]=l,this.uint16[m+11]=u,this.uint16[m+12]=c,this.float32[x+7]=f,this.float32[x+8]=h,this.uint8[b+36]=p,this.uint8[b+37]=d,this.uint8[b+38]=v,this.uint32[x+10]=g,this.int16[m+22]=y,t},e}(Qi);ga.prototype.bytesPerElement=48,oi(\"StructArrayLayout2i2ui3ul3ui2f3ub1ul1i48\",ga);var ya=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer),this.uint32=new Uint32Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r,n,i,a,o,s,l,u,c,f,h,p,d,v,g,y,m,x,b,_,w,T,k,A,M,S){var E=this.length;return this.resize(E+1),this.emplace(E,t,e,r,n,i,a,o,s,l,u,c,f,h,p,d,v,g,y,m,x,b,_,w,T,k,A,M,S)},e.prototype.emplace=function(t,e,r,n,i,a,o,s,l,u,c,f,h,p,d,v,g,y,m,x,b,_,w,T,k,A,M,S,E){var L=34*t,C=17*t;return this.int16[L+0]=e,this.int16[L+1]=r,this.int16[L+2]=n,this.int16[L+3]=i,this.int16[L+4]=a,this.int16[L+5]=o,this.int16[L+6]=s,this.int16[L+7]=l,this.uint16[L+8]=u,this.uint16[L+9]=c,this.uint16[L+10]=f,this.uint16[L+11]=h,this.uint16[L+12]=p,this.uint16[L+13]=d,this.uint16[L+14]=v,this.uint16[L+15]=g,this.uint16[L+16]=y,this.uint16[L+17]=m,this.uint16[L+18]=x,this.uint16[L+19]=b,this.uint16[L+20]=_,this.uint16[L+21]=w,this.uint16[L+22]=T,this.uint32[C+12]=k,this.float32[C+13]=A,this.float32[C+14]=M,this.float32[C+15]=S,this.float32[C+16]=E,t},e}(Qi);ya.prototype.bytesPerElement=68,oi(\"StructArrayLayout8i15ui1ul4f68\",ya);var ma=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t){var e=this.length;return this.resize(e+1),this.emplace(e,t)},e.prototype.emplace=function(t,e){var r=1*t;return this.float32[r+0]=e,t},e}(Qi);ma.prototype.bytesPerElement=4,oi(\"StructArrayLayout1f4\",ma);var xa=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r){var n=this.length;return this.resize(n+1),this.emplace(n,t,e,r)},e.prototype.emplace=function(t,e,r,n){var i=3*t;return this.int16[i+0]=e,this.int16[i+1]=r,this.int16[i+2]=n,t},e}(Qi);xa.prototype.bytesPerElement=6,oi(\"StructArrayLayout3i6\",xa);var ba=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.uint32=new Uint32Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r){var n=this.length;return this.resize(n+1),this.emplace(n,t,e,r)},e.prototype.emplace=function(t,e,r,n){var i=2*t,a=4*t;return this.uint32[i+0]=e,this.uint16[a+2]=r,this.uint16[a+3]=n,t},e}(Qi);ba.prototype.bytesPerElement=8,oi(\"StructArrayLayout1ul2ui8\",ba);var _a=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e){var r=this.length;return this.resize(r+1),this.emplace(r,t,e)},e.prototype.emplace=function(t,e,r){var n=2*t;return this.uint16[n+0]=e,this.uint16[n+1]=r,t},e}(Qi);_a.prototype.bytesPerElement=4,oi(\"StructArrayLayout2ui4\",_a);var wa=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t){var e=this.length;return this.resize(e+1),this.emplace(e,t)},e.prototype.emplace=function(t,e){var r=1*t;return this.uint16[r+0]=e,t},e}(Qi);wa.prototype.bytesPerElement=2,oi(\"StructArrayLayout1ui2\",wa);var Ta=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r,n){var i=this.length;return this.resize(i+1),this.emplace(i,t,e,r,n)},e.prototype.emplace=function(t,e,r,n,i){var a=4*t;return this.float32[a+0]=e,this.float32[a+1]=r,this.float32[a+2]=n,this.float32[a+3]=i,t},e}(Qi);Ta.prototype.bytesPerElement=16,oi(\"StructArrayLayout4f16\",Ta);var ka=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var r={anchorPointX:{configurable:!0},anchorPointY:{configurable:!0},x1:{configurable:!0},y1:{configurable:!0},x2:{configurable:!0},y2:{configurable:!0},featureIndex:{configurable:!0},sourceLayerIndex:{configurable:!0},bucketIndex:{configurable:!0},anchorPoint:{configurable:!0}};return r.anchorPointX.get=function(){return this._structArray.int16[this._pos2+0]},r.anchorPointY.get=function(){return this._structArray.int16[this._pos2+1]},r.x1.get=function(){return this._structArray.int16[this._pos2+2]},r.y1.get=function(){return this._structArray.int16[this._pos2+3]},r.x2.get=function(){return this._structArray.int16[this._pos2+4]},r.y2.get=function(){return this._structArray.int16[this._pos2+5]},r.featureIndex.get=function(){return this._structArray.uint32[this._pos4+3]},r.sourceLayerIndex.get=function(){return this._structArray.uint16[this._pos2+8]},r.bucketIndex.get=function(){return this._structArray.uint16[this._pos2+9]},r.anchorPoint.get=function(){return new a(this.anchorPointX,this.anchorPointY)},Object.defineProperties(e.prototype,r),e}($i);ka.prototype.size=20;var Aa=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.get=function(t){return new ka(this,t)},e}(fa);oi(\"CollisionBoxArray\",Aa);var Ma=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var r={anchorX:{configurable:!0},anchorY:{configurable:!0},glyphStartIndex:{configurable:!0},numGlyphs:{configurable:!0},vertexStartIndex:{configurable:!0},lineStartIndex:{configurable:!0},lineLength:{configurable:!0},segment:{configurable:!0},lowerSize:{configurable:!0},upperSize:{configurable:!0},lineOffsetX:{configurable:!0},lineOffsetY:{configurable:!0},writingMode:{configurable:!0},placedOrientation:{configurable:!0},hidden:{configurable:!0},crossTileID:{configurable:!0},associatedIconIndex:{configurable:!0}};return r.anchorX.get=function(){return this._structArray.int16[this._pos2+0]},r.anchorY.get=function(){return this._structArray.int16[this._pos2+1]},r.glyphStartIndex.get=function(){return this._structArray.uint16[this._pos2+2]},r.numGlyphs.get=function(){return this._structArray.uint16[this._pos2+3]},r.vertexStartIndex.get=function(){return this._structArray.uint32[this._pos4+2]},r.lineStartIndex.get=function(){return this._structArray.uint32[this._pos4+3]},r.lineLength.get=function(){return this._structArray.uint32[this._pos4+4]},r.segment.get=function(){return this._structArray.uint16[this._pos2+10]},r.lowerSize.get=function(){return this._structArray.uint16[this._pos2+11]},r.upperSize.get=function(){return this._structArray.uint16[this._pos2+12]},r.lineOffsetX.get=function(){return this._structArray.float32[this._pos4+7]},r.lineOffsetY.get=function(){return this._structArray.float32[this._pos4+8]},r.writingMode.get=function(){return this._structArray.uint8[this._pos1+36]},r.placedOrientation.get=function(){return this._structArray.uint8[this._pos1+37]},r.placedOrientation.set=function(t){this._structArray.uint8[this._pos1+37]=t},r.hidden.get=function(){return this._structArray.uint8[this._pos1+38]},r.hidden.set=function(t){this._structArray.uint8[this._pos1+38]=t},r.crossTileID.get=function(){return this._structArray.uint32[this._pos4+10]},r.crossTileID.set=function(t){this._structArray.uint32[this._pos4+10]=t},r.associatedIconIndex.get=function(){return this._structArray.int16[this._pos2+22]},Object.defineProperties(e.prototype,r),e}($i);Ma.prototype.size=48;var Sa=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.get=function(t){return new Ma(this,t)},e}(ga);oi(\"PlacedSymbolArray\",Sa);var Ea=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var r={anchorX:{configurable:!0},anchorY:{configurable:!0},rightJustifiedTextSymbolIndex:{configurable:!0},centerJustifiedTextSymbolIndex:{configurable:!0},leftJustifiedTextSymbolIndex:{configurable:!0},verticalPlacedTextSymbolIndex:{configurable:!0},placedIconSymbolIndex:{configurable:!0},verticalPlacedIconSymbolIndex:{configurable:!0},key:{configurable:!0},textBoxStartIndex:{configurable:!0},textBoxEndIndex:{configurable:!0},verticalTextBoxStartIndex:{configurable:!0},verticalTextBoxEndIndex:{configurable:!0},iconBoxStartIndex:{configurable:!0},iconBoxEndIndex:{configurable:!0},verticalIconBoxStartIndex:{configurable:!0},verticalIconBoxEndIndex:{configurable:!0},featureIndex:{configurable:!0},numHorizontalGlyphVertices:{configurable:!0},numVerticalGlyphVertices:{configurable:!0},numIconVertices:{configurable:!0},numVerticalIconVertices:{configurable:!0},useRuntimeCollisionCircles:{configurable:!0},crossTileID:{configurable:!0},textBoxScale:{configurable:!0},textOffset0:{configurable:!0},textOffset1:{configurable:!0},collisionCircleDiameter:{configurable:!0}};return r.anchorX.get=function(){return this._structArray.int16[this._pos2+0]},r.anchorY.get=function(){return this._structArray.int16[this._pos2+1]},r.rightJustifiedTextSymbolIndex.get=function(){return this._structArray.int16[this._pos2+2]},r.centerJustifiedTextSymbolIndex.get=function(){return this._structArray.int16[this._pos2+3]},r.leftJustifiedTextSymbolIndex.get=function(){return this._structArray.int16[this._pos2+4]},r.verticalPlacedTextSymbolIndex.get=function(){return this._structArray.int16[this._pos2+5]},r.placedIconSymbolIndex.get=function(){return this._structArray.int16[this._pos2+6]},r.verticalPlacedIconSymbolIndex.get=function(){return this._structArray.int16[this._pos2+7]},r.key.get=function(){return this._structArray.uint16[this._pos2+8]},r.textBoxStartIndex.get=function(){return this._structArray.uint16[this._pos2+9]},r.textBoxEndIndex.get=function(){return this._structArray.uint16[this._pos2+10]},r.verticalTextBoxStartIndex.get=function(){return this._structArray.uint16[this._pos2+11]},r.verticalTextBoxEndIndex.get=function(){return this._structArray.uint16[this._pos2+12]},r.iconBoxStartIndex.get=function(){return this._structArray.uint16[this._pos2+13]},r.iconBoxEndIndex.get=function(){return this._structArray.uint16[this._pos2+14]},r.verticalIconBoxStartIndex.get=function(){return this._structArray.uint16[this._pos2+15]},r.verticalIconBoxEndIndex.get=function(){return this._structArray.uint16[this._pos2+16]},r.featureIndex.get=function(){return this._structArray.uint16[this._pos2+17]},r.numHorizontalGlyphVertices.get=function(){return this._structArray.uint16[this._pos2+18]},r.numVerticalGlyphVertices.get=function(){return this._structArray.uint16[this._pos2+19]},r.numIconVertices.get=function(){return this._structArray.uint16[this._pos2+20]},r.numVerticalIconVertices.get=function(){return this._structArray.uint16[this._pos2+21]},r.useRuntimeCollisionCircles.get=function(){return this._structArray.uint16[this._pos2+22]},r.crossTileID.get=function(){return this._structArray.uint32[this._pos4+12]},r.crossTileID.set=function(t){this._structArray.uint32[this._pos4+12]=t},r.textBoxScale.get=function(){return this._structArray.float32[this._pos4+13]},r.textOffset0.get=function(){return this._structArray.float32[this._pos4+14]},r.textOffset1.get=function(){return this._structArray.float32[this._pos4+15]},r.collisionCircleDiameter.get=function(){return this._structArray.float32[this._pos4+16]},Object.defineProperties(e.prototype,r),e}($i);Ea.prototype.size=68;var La=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.get=function(t){return new Ea(this,t)},e}(ya);oi(\"SymbolInstanceArray\",La);var Ca=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.getoffsetX=function(t){return this.float32[1*t+0]},e}(ma);oi(\"GlyphOffsetArray\",Ca);var Pa=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.getx=function(t){return this.int16[3*t+0]},e.prototype.gety=function(t){return this.int16[3*t+1]},e.prototype.gettileUnitDistanceFromAnchor=function(t){return this.int16[3*t+2]},e}(xa);oi(\"SymbolLineVertexArray\",Pa);var Oa=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var r={featureIndex:{configurable:!0},sourceLayerIndex:{configurable:!0},bucketIndex:{configurable:!0}};return r.featureIndex.get=function(){return this._structArray.uint32[this._pos4+0]},r.sourceLayerIndex.get=function(){return this._structArray.uint16[this._pos2+2]},r.bucketIndex.get=function(){return this._structArray.uint16[this._pos2+3]},Object.defineProperties(e.prototype,r),e}($i);Oa.prototype.size=8;var Ia=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.get=function(t){return new Oa(this,t)},e}(ba);oi(\"FeatureIndexArray\",Ia);var za=ta([{name:\"a_pos\",components:2,type:\"Int16\"}],4).members,Da=function(t){void 0===t&&(t=[]),this.segments=t};function Ra(t,e){return 256*(t=f(Math.floor(t),0,255))+f(Math.floor(e),0,255)}Da.prototype.prepareSegment=function(t,e,r,n){var i=this.segments[this.segments.length-1];return t>Da.MAX_VERTEX_ARRAY_LENGTH&&k(\"Max vertices per segment is \"+Da.MAX_VERTEX_ARRAY_LENGTH+\": bucket requested \"+t),(!i||i.vertexLength+t>Da.MAX_VERTEX_ARRAY_LENGTH||i.sortKey!==n)&&(i={vertexOffset:e.length,primitiveOffset:r.length,vertexLength:0,primitiveLength:0},void 0!==n&&(i.sortKey=n),this.segments.push(i)),i},Da.prototype.get=function(){return this.segments},Da.prototype.destroy=function(){for(var t=0,e=this.segments;t>>16)*o&65535)<<16)&4294967295)<<15|l>>>17))*s+(((l>>>16)*s&65535)<<16)&4294967295)<<13|i>>>19))+((5*(i>>>16)&65535)<<16)&4294967295))+((58964+(a>>>16)&65535)<<16);switch(l=0,r){case 3:l^=(255&t.charCodeAt(u+2))<<16;case 2:l^=(255&t.charCodeAt(u+1))<<8;case 1:i^=l=(65535&(l=(l=(65535&(l^=255&t.charCodeAt(u)))*o+(((l>>>16)*o&65535)<<16)&4294967295)<<15|l>>>17))*s+(((l>>>16)*s&65535)<<16)&4294967295}return i^=t.length,i=2246822507*(65535&(i^=i>>>16))+((2246822507*(i>>>16)&65535)<<16)&4294967295,i=3266489909*(65535&(i^=i>>>13))+((3266489909*(i>>>16)&65535)<<16)&4294967295,(i^=i>>>16)>>>0}})),Na=e((function(t){t.exports=function(t,e){for(var r,n=t.length,i=e^n,a=0;n>=4;)r=1540483477*(65535&(r=255&t.charCodeAt(a)|(255&t.charCodeAt(++a))<<8|(255&t.charCodeAt(++a))<<16|(255&t.charCodeAt(++a))<<24))+((1540483477*(r>>>16)&65535)<<16),i=1540483477*(65535&i)+((1540483477*(i>>>16)&65535)<<16)^(r=1540483477*(65535&(r^=r>>>24))+((1540483477*(r>>>16)&65535)<<16)),n-=4,++a;switch(n){case 3:i^=(255&t.charCodeAt(a+2))<<16;case 2:i^=(255&t.charCodeAt(a+1))<<8;case 1:i=1540483477*(65535&(i^=255&t.charCodeAt(a)))+((1540483477*(i>>>16)&65535)<<16)}return i=1540483477*(65535&(i^=i>>>13))+((1540483477*(i>>>16)&65535)<<16),(i^=i>>>15)>>>0}})),ja=Ba,Ua=Ba,Va=Na;ja.murmur3=Ua,ja.murmur2=Va;var qa=function(){this.ids=[],this.positions=[],this.indexed=!1};qa.prototype.add=function(t,e,r,n){this.ids.push(Ga(t)),this.positions.push(e,r,n)},qa.prototype.getPositions=function(t){for(var e=Ga(t),r=0,n=this.ids.length-1;r>1;this.ids[i]>=e?n=i:r=i+1}for(var a=[];this.ids[r]===e;){var o=this.positions[3*r],s=this.positions[3*r+1],l=this.positions[3*r+2];a.push({index:o,start:s,end:l}),r++}return a},qa.serialize=function(t,e){var r=new Float64Array(t.ids),n=new Uint32Array(t.positions);return Wa(r,n,0,r.length-1),e&&e.push(r.buffer,n.buffer),{ids:r,positions:n}},qa.deserialize=function(t){var e=new qa;return e.ids=t.ids,e.positions=t.positions,e.indexed=!0,e};var Ha=Math.pow(2,53)-1;function Ga(t){var e=+t;return!isNaN(e)&&e<=Ha?e:ja(String(t))}function Wa(t,e,r,n){for(;r>1],a=r-1,o=n+1;;){do{a++}while(t[a]i);if(a>=o)break;Ya(t,a,o),Ya(e,3*a,3*o),Ya(e,3*a+1,3*o+1),Ya(e,3*a+2,3*o+2)}o-ro.x+1||lo.y+1)&&k(\"Geometry exceeds allowed extent, reduce your vector tile buffer size\")}return r}function mo(t,e){return{type:t.type,id:t.id,properties:t.properties,geometry:e?yo(t):[]}}function xo(t,e,r,n,i){t.emplaceBack(2*e+(n+1)/2,2*r+(i+1)/2)}var bo=function(t){this.zoom=t.zoom,this.overscaling=t.overscaling,this.layers=t.layers,this.layerIds=this.layers.map((function(t){return t.id})),this.index=t.index,this.hasPattern=!1,this.layoutVertexArray=new ra,this.indexArray=new va,this.segments=new Da,this.programConfigurations=new co(t.layers,t.zoom),this.stateDependentLayerIds=this.layers.filter((function(t){return t.isStateDependent()})).map((function(t){return t.id}))};function _o(t,e){for(var r=0;r1){if(Ao(t,e))return!0;for(var n=0;n1?t.distSqr(r):t.distSqr(r.sub(e)._mult(i)._add(e))}function Lo(t,e){for(var r,n,i,a=!1,o=0;oe.y!=i.y>e.y&&e.x<(i.x-n.x)*(e.y-n.y)/(i.y-n.y)+n.x&&(a=!a);return a}function Co(t,e){for(var r=!1,n=0,i=t.length-1;ne.y!=o.y>e.y&&e.x<(o.x-a.x)*(e.y-a.y)/(o.y-a.y)+a.x&&(r=!r)}return r}function Po(t,e,r){var n=r[0],i=r[2];if(t.xi.x&&e.x>i.x||t.yi.y&&e.y>i.y)return!1;var a=A(t,e,r[0]);return a!==A(t,e,r[1])||a!==A(t,e,r[2])||a!==A(t,e,r[3])}function Oo(t,e,r){var n=e.paint.get(t).value;return\"constant\"===n.kind?n.value:r.programConfigurations.get(e.id).getMaxValue(t)}function Io(t){return Math.sqrt(t[0]*t[0]+t[1]*t[1])}function zo(t,e,r,n,i){if(!e[0]&&!e[1])return t;var o=a.convert(e)._mult(i);\"viewport\"===r&&o._rotate(-n);for(var s=[],l=0;l=po||c<0||c>=po)){var f=this.segments.prepareSegment(4,this.layoutVertexArray,this.indexArray,t.sortKey),h=f.vertexLength;xo(this.layoutVertexArray,u,c,-1,-1),xo(this.layoutVertexArray,u,c,1,-1),xo(this.layoutVertexArray,u,c,1,1),xo(this.layoutVertexArray,u,c,-1,1),this.indexArray.emplaceBack(h,h+1,h+2),this.indexArray.emplaceBack(h,h+3,h+2),f.vertexLength+=4,f.primitiveLength+=2}}this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length,t,r,{},n)},oi(\"CircleBucket\",bo,{omit:[\"layers\"]});var Do=new Xi({\"circle-sort-key\":new Hi(Ft.layout_circle[\"circle-sort-key\"])}),Ro={paint:new Xi({\"circle-radius\":new Hi(Ft.paint_circle[\"circle-radius\"]),\"circle-color\":new Hi(Ft.paint_circle[\"circle-color\"]),\"circle-blur\":new Hi(Ft.paint_circle[\"circle-blur\"]),\"circle-opacity\":new Hi(Ft.paint_circle[\"circle-opacity\"]),\"circle-translate\":new qi(Ft.paint_circle[\"circle-translate\"]),\"circle-translate-anchor\":new qi(Ft.paint_circle[\"circle-translate-anchor\"]),\"circle-pitch-scale\":new qi(Ft.paint_circle[\"circle-pitch-scale\"]),\"circle-pitch-alignment\":new qi(Ft.paint_circle[\"circle-pitch-alignment\"]),\"circle-stroke-width\":new Hi(Ft.paint_circle[\"circle-stroke-width\"]),\"circle-stroke-color\":new Hi(Ft.paint_circle[\"circle-stroke-color\"]),\"circle-stroke-opacity\":new Hi(Ft.paint_circle[\"circle-stroke-opacity\"])}),layout:Do},Fo=\"undefined\"!=typeof Float32Array?Float32Array:Array;function Bo(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}function No(t,e,r){var n=e[0],i=e[1],a=e[2],o=e[3],s=e[4],l=e[5],u=e[6],c=e[7],f=e[8],h=e[9],p=e[10],d=e[11],v=e[12],g=e[13],y=e[14],m=e[15],x=r[0],b=r[1],_=r[2],w=r[3];return t[0]=x*n+b*s+_*f+w*v,t[1]=x*i+b*l+_*h+w*g,t[2]=x*a+b*u+_*p+w*y,t[3]=x*o+b*c+_*d+w*m,x=r[4],b=r[5],_=r[6],w=r[7],t[4]=x*n+b*s+_*f+w*v,t[5]=x*i+b*l+_*h+w*g,t[6]=x*a+b*u+_*p+w*y,t[7]=x*o+b*c+_*d+w*m,x=r[8],b=r[9],_=r[10],w=r[11],t[8]=x*n+b*s+_*f+w*v,t[9]=x*i+b*l+_*h+w*g,t[10]=x*a+b*u+_*p+w*y,t[11]=x*o+b*c+_*d+w*m,x=r[12],b=r[13],_=r[14],w=r[15],t[12]=x*n+b*s+_*f+w*v,t[13]=x*i+b*l+_*h+w*g,t[14]=x*a+b*u+_*p+w*y,t[15]=x*o+b*c+_*d+w*m,t}Math.hypot||(Math.hypot=function(){for(var t=arguments,e=0,r=arguments.length;r--;)e+=t[r]*t[r];return Math.sqrt(e)});var jo=No;var Uo,Vo=function(t,e,r){return t[0]=e[0]-r[0],t[1]=e[1]-r[1],t[2]=e[2]-r[2],t};function qo(t,e,r){var n=e[0],i=e[1],a=e[2],o=e[3];return t[0]=r[0]*n+r[4]*i+r[8]*a+r[12]*o,t[1]=r[1]*n+r[5]*i+r[9]*a+r[13]*o,t[2]=r[2]*n+r[6]*i+r[10]*a+r[14]*o,t[3]=r[3]*n+r[7]*i+r[11]*a+r[15]*o,t}Uo=new Fo(3),Fo!=Float32Array&&(Uo[0]=0,Uo[1]=0,Uo[2]=0),function(){var t=new Fo(4);Fo!=Float32Array&&(t[0]=0,t[1]=0,t[2]=0,t[3]=0)}();var Ho=function(t){var e=t[0],r=t[1];return e*e+r*r},Go=(function(){var t=new Fo(2);Fo!=Float32Array&&(t[0]=0,t[1]=0)}(),function(t){function e(e){t.call(this,e,Ro)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.createBucket=function(t){return new bo(t)},e.prototype.queryRadius=function(t){var e=t;return Oo(\"circle-radius\",this,e)+Oo(\"circle-stroke-width\",this,e)+Io(this.paint.get(\"circle-translate\"))},e.prototype.queryIntersectsFeature=function(t,e,r,n,i,a,o,s){for(var l=zo(t,this.paint.get(\"circle-translate\"),this.paint.get(\"circle-translate-anchor\"),a.angle,o),u=this.paint.get(\"circle-radius\").evaluate(e,r)+this.paint.get(\"circle-stroke-width\").evaluate(e,r),c=\"map\"===this.paint.get(\"circle-pitch-alignment\"),f=c?l:function(t,e){return t.map((function(t){return Wo(t,e)}))}(l,s),h=c?u*o:u,p=0,d=n;pt.width||i.height>t.height||r.x>t.width-i.width||r.y>t.height-i.height)throw new RangeError(\"out of range source coordinates for image copy\");if(i.width>e.width||i.height>e.height||n.x>e.width-i.width||n.y>e.height-i.height)throw new RangeError(\"out of range destination coordinates for image copy\");for(var o=t.data,s=e.data,l=0;l80*r){n=a=t[0],i=o=t[1];for(var d=r;da&&(a=s),l>o&&(o=l);u=0!==(u=Math.max(a-n,o-i))?1/u:0}return cs(h,p,r,n,i,u),p}function ls(t,e,r,n,i){var a,o;if(i===Os(t,e,r,n)>0)for(a=e;a=e;a-=n)o=Ls(a,t[a],t[a+1],o);return o&&Ts(o,o.next)&&(Cs(o),o=o.next),o}function us(t,e){if(!t)return t;e||(e=t);var r,n=t;do{if(r=!1,n.steiner||!Ts(n,n.next)&&0!==ws(n.prev,n,n.next))n=n.next;else{if(Cs(n),(n=e=n.prev)===n.next)break;r=!0}}while(r||n!==e);return e}function cs(t,e,r,n,i,a,o){if(t){!o&&a&&function(t,e,r,n){var i=t;do{null===i.z&&(i.z=ms(i.x,i.y,e,r,n)),i.prevZ=i.prev,i.nextZ=i.next,i=i.next}while(i!==t);i.prevZ.nextZ=null,i.prevZ=null,function(t){var e,r,n,i,a,o,s,l,u=1;do{for(r=t,t=null,a=null,o=0;r;){for(o++,n=r,s=0,e=0;e0||l>0&&n;)0!==s&&(0===l||!n||r.z<=n.z)?(i=r,r=r.nextZ,s--):(i=n,n=n.nextZ,l--),a?a.nextZ=i:t=i,i.prevZ=a,a=i;r=n}a.nextZ=null,u*=2}while(o>1)}(i)}(t,n,i,a);for(var s,l,u=t;t.prev!==t.next;)if(s=t.prev,l=t.next,a?hs(t,n,i,a):fs(t))e.push(s.i/r),e.push(t.i/r),e.push(l.i/r),Cs(t),t=l.next,u=l.next;else if((t=l)===u){o?1===o?cs(t=ps(us(t),e,r),e,r,n,i,a,2):2===o&&ds(t,e,r,n,i,a):cs(us(t),e,r,n,i,a,1);break}}}function fs(t){var e=t.prev,r=t,n=t.next;if(ws(e,r,n)>=0)return!1;for(var i=t.next.next;i!==t.prev;){if(bs(e.x,e.y,r.x,r.y,n.x,n.y,i.x,i.y)&&ws(i.prev,i,i.next)>=0)return!1;i=i.next}return!0}function hs(t,e,r,n){var i=t.prev,a=t,o=t.next;if(ws(i,a,o)>=0)return!1;for(var s=i.xa.x?i.x>o.x?i.x:o.x:a.x>o.x?a.x:o.x,c=i.y>a.y?i.y>o.y?i.y:o.y:a.y>o.y?a.y:o.y,f=ms(s,l,e,r,n),h=ms(u,c,e,r,n),p=t.prevZ,d=t.nextZ;p&&p.z>=f&&d&&d.z<=h;){if(p!==t.prev&&p!==t.next&&bs(i.x,i.y,a.x,a.y,o.x,o.y,p.x,p.y)&&ws(p.prev,p,p.next)>=0)return!1;if(p=p.prevZ,d!==t.prev&&d!==t.next&&bs(i.x,i.y,a.x,a.y,o.x,o.y,d.x,d.y)&&ws(d.prev,d,d.next)>=0)return!1;d=d.nextZ}for(;p&&p.z>=f;){if(p!==t.prev&&p!==t.next&&bs(i.x,i.y,a.x,a.y,o.x,o.y,p.x,p.y)&&ws(p.prev,p,p.next)>=0)return!1;p=p.prevZ}for(;d&&d.z<=h;){if(d!==t.prev&&d!==t.next&&bs(i.x,i.y,a.x,a.y,o.x,o.y,d.x,d.y)&&ws(d.prev,d,d.next)>=0)return!1;d=d.nextZ}return!0}function ps(t,e,r){var n=t;do{var i=n.prev,a=n.next.next;!Ts(i,a)&&ks(i,n,n.next,a)&&Ss(i,a)&&Ss(a,i)&&(e.push(i.i/r),e.push(n.i/r),e.push(a.i/r),Cs(n),Cs(n.next),n=t=a),n=n.next}while(n!==t);return us(n)}function ds(t,e,r,n,i,a){var o=t;do{for(var s=o.next.next;s!==o.prev;){if(o.i!==s.i&&_s(o,s)){var l=Es(o,s);return o=us(o,o.next),l=us(l,l.next),cs(o,e,r,n,i,a),void cs(l,e,r,n,i,a)}s=s.next}o=o.next}while(o!==t)}function vs(t,e){return t.x-e.x}function gs(t,e){if(e=function(t,e){var r,n=e,i=t.x,a=t.y,o=-1/0;do{if(a<=n.y&&a>=n.next.y&&n.next.y!==n.y){var s=n.x+(a-n.y)*(n.next.x-n.x)/(n.next.y-n.y);if(s<=i&&s>o){if(o=s,s===i){if(a===n.y)return n;if(a===n.next.y)return n.next}r=n.x=n.x&&n.x>=c&&i!==n.x&&bs(ar.x||n.x===r.x&&ys(r,n)))&&(r=n,h=l)),n=n.next}while(n!==u);return r}(t,e)){var r=Es(e,t);us(e,e.next),us(r,r.next)}}function ys(t,e){return ws(t.prev,t,e.prev)<0&&ws(e.next,t,t.next)<0}function ms(t,e,r,n,i){return(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=32767*(t-r)*i)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=32767*(e-n)*i)|e<<8))|e<<4))|e<<2))|e<<1))<<1}function xs(t){var e=t,r=t;do{(e.x=0&&(t-o)*(n-s)-(r-o)*(e-s)>=0&&(r-o)*(a-s)-(i-o)*(n-s)>=0}function _s(t,e){return t.next.i!==e.i&&t.prev.i!==e.i&&!function(t,e){var r=t;do{if(r.i!==t.i&&r.next.i!==t.i&&r.i!==e.i&&r.next.i!==e.i&&ks(r,r.next,t,e))return!0;r=r.next}while(r!==t);return!1}(t,e)&&(Ss(t,e)&&Ss(e,t)&&function(t,e){var r=t,n=!1,i=(t.x+e.x)/2,a=(t.y+e.y)/2;do{r.y>a!=r.next.y>a&&r.next.y!==r.y&&i<(r.next.x-r.x)*(a-r.y)/(r.next.y-r.y)+r.x&&(n=!n),r=r.next}while(r!==t);return n}(t,e)&&(ws(t.prev,t,e.prev)||ws(t,e.prev,e))||Ts(t,e)&&ws(t.prev,t,t.next)>0&&ws(e.prev,e,e.next)>0)}function ws(t,e,r){return(e.y-t.y)*(r.x-e.x)-(e.x-t.x)*(r.y-e.y)}function Ts(t,e){return t.x===e.x&&t.y===e.y}function ks(t,e,r,n){var i=Ms(ws(t,e,r)),a=Ms(ws(t,e,n)),o=Ms(ws(r,n,t)),s=Ms(ws(r,n,e));return i!==a&&o!==s||!(0!==i||!As(t,r,e))||!(0!==a||!As(t,n,e))||!(0!==o||!As(r,t,n))||!(0!==s||!As(r,e,n))}function As(t,e,r){return e.x<=Math.max(t.x,r.x)&&e.x>=Math.min(t.x,r.x)&&e.y<=Math.max(t.y,r.y)&&e.y>=Math.min(t.y,r.y)}function Ms(t){return t>0?1:t<0?-1:0}function Ss(t,e){return ws(t.prev,t,t.next)<0?ws(t,e,t.next)>=0&&ws(t,t.prev,e)>=0:ws(t,e,t.prev)<0||ws(t,t.next,e)<0}function Es(t,e){var r=new Ps(t.i,t.x,t.y),n=new Ps(e.i,e.x,e.y),i=t.next,a=e.prev;return t.next=e,e.prev=t,r.next=i,i.prev=r,n.next=r,r.prev=n,a.next=n,n.prev=a,n}function Ls(t,e,r,n){var i=new Ps(t,e,r);return n?(i.next=n.next,i.prev=n,n.next.prev=i,n.next=i):(i.prev=i,i.next=i),i}function Cs(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ)}function Ps(t,e,r){this.i=t,this.x=e,this.y=r,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}function Os(t,e,r,n){for(var i=0,a=e,o=r-n;ar;){if(n-r>600){var a=n-r+1,o=e-r+1,s=Math.log(a),l=.5*Math.exp(2*s/3),u=.5*Math.sqrt(s*l*(a-l)/a)*(o-a/2<0?-1:1);zs(t,e,Math.max(r,Math.floor(e-o*l/a+u)),Math.min(n,Math.floor(e+(a-o)*l/a+u)),i)}var c=t[e],f=r,h=n;for(Ds(t,r,e),i(t[n],c)>0&&Ds(t,r,n);f0;)h--}0===i(t[r],c)?Ds(t,r,h):Ds(t,++h,n),h<=e&&(r=h+1),e<=h&&(n=h-1)}}function Ds(t,e,r){var n=t[e];t[e]=t[r],t[r]=n}function Rs(t,e){return te?1:0}function Fs(t,e){var r=t.length;if(r<=1)return[t];for(var n,i,a=[],o=0;o1)for(var l=0;l0&&(n+=t[i-1].length,r.holes.push(n))}return r},as.default=os;var Us=function(t){this.zoom=t.zoom,this.overscaling=t.overscaling,this.layers=t.layers,this.layerIds=this.layers.map((function(t){return t.id})),this.index=t.index,this.hasPattern=!1,this.patternFeatures=[],this.layoutVertexArray=new ra,this.indexArray=new va,this.indexArray2=new _a,this.programConfigurations=new co(t.layers,t.zoom),this.segments=new Da,this.segments2=new Da,this.stateDependentLayerIds=this.layers.filter((function(t){return t.isStateDependent()})).map((function(t){return t.id}))};Us.prototype.populate=function(t,e,r){this.hasPattern=Ns(\"fill\",this.layers,e);for(var n=this.layers[0].layout.get(\"fill-sort-key\"),i=[],a=0,o=t;a>3}if(i--,1===n||2===n)o+=t.readSVarint(),s+=t.readSVarint(),1===n&&(e&&l.push(e),e=[]),e.push(new a(o,s));else{if(7!==n)throw new Error(\"unknown command \"+n);e&&e.push(e[0].clone())}}return e&&l.push(e),l},Ys.prototype.bbox=function(){var t=this._pbf;t.pos=this._geometry;for(var e=t.readVarint()+t.pos,r=1,n=0,i=0,a=0,o=1/0,s=-1/0,l=1/0,u=-1/0;t.pos>3}if(n--,1===r||2===r)(i+=t.readSVarint())s&&(s=i),(a+=t.readSVarint())u&&(u=a);else if(7!==r)throw new Error(\"unknown command \"+r)}return[o,l,s,u]},Ys.prototype.toGeoJSON=function(t,e,r){var n,i,a=this.extent*Math.pow(2,r),o=this.extent*t,s=this.extent*e,l=this.loadGeometry(),u=Ys.types[this.type];function c(t){for(var e=0;e>3;e=1===n?t.readString():2===n?t.readFloat():3===n?t.readDouble():4===n?t.readVarint64():5===n?t.readVarint():6===n?t.readSVarint():7===n?t.readBoolean():null}return e}(r))}function Qs(t,e,r){if(3===t){var n=new Ks(r,r.readVarint()+r.pos);n.length&&(e[n.name]=n)}}Js.prototype.feature=function(t){if(t<0||t>=this._features.length)throw new Error(\"feature index out of bounds\");this._pbf.pos=this._features[t];var e=this._pbf.readVarint()+this._pbf.pos;return new Ws(this._pbf,e,this.extent,this._keys,this._values)};var tl={VectorTile:function(t,e){this.layers=t.readFields(Qs,{},e)},VectorTileFeature:Ws,VectorTileLayer:Ks},el=tl.VectorTileFeature.types,rl=Math.pow(2,13);function nl(t,e,r,n,i,a,o,s){t.emplaceBack(e,r,2*Math.floor(n*rl)+o,i*rl*2,a*rl*2,Math.round(s))}var il=function(t){this.zoom=t.zoom,this.overscaling=t.overscaling,this.layers=t.layers,this.layerIds=this.layers.map((function(t){return t.id})),this.index=t.index,this.hasPattern=!1,this.layoutVertexArray=new ia,this.indexArray=new va,this.programConfigurations=new co(t.layers,t.zoom),this.segments=new Da,this.stateDependentLayerIds=this.layers.filter((function(t){return t.isStateDependent()})).map((function(t){return t.id}))};function al(t,e){return t.x===e.x&&(t.x<0||t.x>po)||t.y===e.y&&(t.y<0||t.y>po)}il.prototype.populate=function(t,e,r){this.features=[],this.hasPattern=Ns(\"fill-extrusion\",this.layers,e);for(var n=0,i=t;npo}))||O.every((function(t){return t.y<0}))||O.every((function(t){return t.y>po}))))for(var v=0,g=0;g=1){var m=d[g-1];if(!al(y,m)){f.vertexLength+4>Da.MAX_VERTEX_ARRAY_LENGTH&&(f=this.segments.prepareSegment(4,this.layoutVertexArray,this.indexArray));var x=y.sub(m)._perp()._unit(),b=m.dist(y);v+b>32768&&(v=0),nl(this.layoutVertexArray,y.x,y.y,x.x,x.y,0,0,v),nl(this.layoutVertexArray,y.x,y.y,x.x,x.y,0,1,v),v+=b,nl(this.layoutVertexArray,m.x,m.y,x.x,x.y,0,0,v),nl(this.layoutVertexArray,m.x,m.y,x.x,x.y,0,1,v);var _=f.vertexLength;this.indexArray.emplaceBack(_,_+2,_+1),this.indexArray.emplaceBack(_+1,_+2,_+3),f.vertexLength+=4,f.primitiveLength+=2}}}}if(f.vertexLength+l>Da.MAX_VERTEX_ARRAY_LENGTH&&(f=this.segments.prepareSegment(l,this.layoutVertexArray,this.indexArray)),\"Polygon\"===el[t.type]){for(var w=[],T=[],k=f.vertexLength,A=0,M=s;A=2&&t[l-1].equals(t[l-2]);)l--;for(var u=0;u0;if(T&&y>u){var A=c.dist(p);if(A>2*f){var M=c.sub(c.sub(p)._mult(f/A)._round());this.updateDistance(p,M),this.addCurrentVertex(M,v,0,0,h),p=M}}var S=p&&d,E=S?r:s?\"butt\":n;if(S&&\"round\"===E&&(_i&&(E=\"bevel\"),\"bevel\"===E&&(_>2&&(E=\"flipbevel\"),_100)m=g.mult(-1);else{var L=_*v.add(g).mag()/v.sub(g).mag();m._perp()._mult(L*(k?-1:1))}this.addCurrentVertex(c,m,0,0,h),this.addCurrentVertex(c,m.mult(-1),0,0,h)}else if(\"bevel\"===E||\"fakeround\"===E){var C=-Math.sqrt(_*_-1),P=k?C:0,O=k?0:C;if(p&&this.addCurrentVertex(c,v,P,O,h),\"fakeround\"===E)for(var I=Math.round(180*w/Math.PI/20),z=1;z2*f){var j=c.add(d.sub(c)._mult(f/N)._round());this.updateDistance(c,j),this.addCurrentVertex(j,g,0,0,h),c=j}}}}},vl.prototype.addCurrentVertex=function(t,e,r,n,i,a){void 0===a&&(a=!1);var o=e.x+e.y*r,s=e.y-e.x*r,l=-e.x+e.y*n,u=-e.y-e.x*n;this.addHalfVertex(t,o,s,a,!1,r,i),this.addHalfVertex(t,l,u,a,!0,-n,i),this.distance>dl/2&&0===this.totalDistance&&(this.distance=0,this.addCurrentVertex(t,e,r,n,i,a))},vl.prototype.addHalfVertex=function(t,e,r,n,i,a,o){var s=t.x,l=t.y,u=.5*(this.lineClips?this.scaledDistance*(dl-1):this.scaledDistance);if(this.layoutVertexArray.emplaceBack((s<<1)+(n?1:0),(l<<1)+(i?1:0),Math.round(63*e)+128,Math.round(63*r)+128,1+(0===a?0:a<0?-1:1)|(63&u)<<2,u>>6),this.lineClips){var c=(this.scaledDistance-this.lineClips.start)/(this.lineClips.end-this.lineClips.start);this.layoutVertexArray2.emplaceBack(c,this.lineClipsArray.length)}var f=o.vertexLength++;this.e1>=0&&this.e2>=0&&(this.indexArray.emplaceBack(this.e1,this.e2,f),o.primitiveLength++),i?this.e2=f:this.e1=f},vl.prototype.updateScaledDistance=function(){this.scaledDistance=this.lineClips?this.lineClips.start+(this.lineClips.end-this.lineClips.start)*this.distance/this.totalDistance:this.distance},vl.prototype.updateDistance=function(t,e){this.distance+=t.dist(e),this.updateScaledDistance()},oi(\"LineBucket\",vl,{omit:[\"layers\",\"patternFeatures\"]});var gl=new Xi({\"line-cap\":new qi(Ft.layout_line[\"line-cap\"]),\"line-join\":new Hi(Ft.layout_line[\"line-join\"]),\"line-miter-limit\":new qi(Ft.layout_line[\"line-miter-limit\"]),\"line-round-limit\":new qi(Ft.layout_line[\"line-round-limit\"]),\"line-sort-key\":new Hi(Ft.layout_line[\"line-sort-key\"])}),yl={paint:new Xi({\"line-opacity\":new Hi(Ft.paint_line[\"line-opacity\"]),\"line-color\":new Hi(Ft.paint_line[\"line-color\"]),\"line-translate\":new qi(Ft.paint_line[\"line-translate\"]),\"line-translate-anchor\":new qi(Ft.paint_line[\"line-translate-anchor\"]),\"line-width\":new Hi(Ft.paint_line[\"line-width\"]),\"line-gap-width\":new Hi(Ft.paint_line[\"line-gap-width\"]),\"line-offset\":new Hi(Ft.paint_line[\"line-offset\"]),\"line-blur\":new Hi(Ft.paint_line[\"line-blur\"]),\"line-dasharray\":new Wi(Ft.paint_line[\"line-dasharray\"]),\"line-pattern\":new Gi(Ft.paint_line[\"line-pattern\"]),\"line-gradient\":new Yi(Ft.paint_line[\"line-gradient\"])}),layout:gl},ml=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.possiblyEvaluate=function(e,r){return r=new zi(Math.floor(r.zoom),{now:r.now,fadeDuration:r.fadeDuration,zoomHistory:r.zoomHistory,transition:r.transition}),t.prototype.possiblyEvaluate.call(this,e,r)},e.prototype.evaluate=function(e,r,n,i){return r=p({},r,{zoom:Math.floor(r.zoom)}),t.prototype.evaluate.call(this,e,r,n,i)},e}(Hi),xl=new ml(yl.paint.properties[\"line-width\"].specification);xl.useIntegerZoom=!0;var bl=function(t){function e(e){t.call(this,e,yl),this.gradientVersion=0}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._handleSpecialPaintPropertyUpdate=function(t){if(\"line-gradient\"===t){var e=this._transitionablePaint._values[\"line-gradient\"].value.expression;this.stepInterpolant=e._styleExpression.expression instanceof tr,this.gradientVersion=(this.gradientVersion+1)%l}},e.prototype.gradientExpression=function(){return this._transitionablePaint._values[\"line-gradient\"].value.expression},e.prototype.recalculate=function(e,r){t.prototype.recalculate.call(this,e,r),this.paint._values[\"line-floorwidth\"]=xl.possiblyEvaluate(this._transitioningPaint._values[\"line-width\"].value,e)},e.prototype.createBucket=function(t){return new vl(t)},e.prototype.queryRadius=function(t){var e=t,r=_l(Oo(\"line-width\",this,e),Oo(\"line-gap-width\",this,e)),n=Oo(\"line-offset\",this,e);return r/2+Math.abs(n)+Io(this.paint.get(\"line-translate\"))},e.prototype.queryIntersectsFeature=function(t,e,r,n,i,o,s){var l=zo(t,this.paint.get(\"line-translate\"),this.paint.get(\"line-translate-anchor\"),o.angle,s),u=s/2*_l(this.paint.get(\"line-width\").evaluate(e,r),this.paint.get(\"line-gap-width\").evaluate(e,r)),c=this.paint.get(\"line-offset\").evaluate(e,r);return c&&(n=function(t,e){for(var r=[],n=new a(0,0),i=0;i=3)for(var a=0;a0?e+2*t:t}var wl=ta([{name:\"a_pos_offset\",components:4,type:\"Int16\"},{name:\"a_data\",components:4,type:\"Uint16\"},{name:\"a_pixeloffset\",components:4,type:\"Int16\"}],4),Tl=ta([{name:\"a_projected_pos\",components:3,type:\"Float32\"}],4),kl=(ta([{name:\"a_fade_opacity\",components:1,type:\"Uint32\"}],4),ta([{name:\"a_placed\",components:2,type:\"Uint8\"},{name:\"a_shift\",components:2,type:\"Float32\"}])),Al=(ta([{type:\"Int16\",name:\"anchorPointX\"},{type:\"Int16\",name:\"anchorPointY\"},{type:\"Int16\",name:\"x1\"},{type:\"Int16\",name:\"y1\"},{type:\"Int16\",name:\"x2\"},{type:\"Int16\",name:\"y2\"},{type:\"Uint32\",name:\"featureIndex\"},{type:\"Uint16\",name:\"sourceLayerIndex\"},{type:\"Uint16\",name:\"bucketIndex\"}]),ta([{name:\"a_pos\",components:2,type:\"Int16\"},{name:\"a_anchor_pos\",components:2,type:\"Int16\"},{name:\"a_extrude\",components:2,type:\"Int16\"}],4)),Ml=ta([{name:\"a_pos\",components:2,type:\"Float32\"},{name:\"a_radius\",components:1,type:\"Float32\"},{name:\"a_flags\",components:2,type:\"Int16\"}],4);function Sl(t,e,r){return t.sections.forEach((function(t){t.text=function(t,e,r){var n=e.layout.get(\"text-transform\").evaluate(r,{});return\"uppercase\"===n?t=t.toLocaleUpperCase():\"lowercase\"===n&&(t=t.toLocaleLowerCase()),Ii.applyArabicShaping&&(t=Ii.applyArabicShaping(t)),t}(t.text,e,r)})),t}ta([{name:\"triangle\",components:3,type:\"Uint16\"}]),ta([{type:\"Int16\",name:\"anchorX\"},{type:\"Int16\",name:\"anchorY\"},{type:\"Uint16\",name:\"glyphStartIndex\"},{type:\"Uint16\",name:\"numGlyphs\"},{type:\"Uint32\",name:\"vertexStartIndex\"},{type:\"Uint32\",name:\"lineStartIndex\"},{type:\"Uint32\",name:\"lineLength\"},{type:\"Uint16\",name:\"segment\"},{type:\"Uint16\",name:\"lowerSize\"},{type:\"Uint16\",name:\"upperSize\"},{type:\"Float32\",name:\"lineOffsetX\"},{type:\"Float32\",name:\"lineOffsetY\"},{type:\"Uint8\",name:\"writingMode\"},{type:\"Uint8\",name:\"placedOrientation\"},{type:\"Uint8\",name:\"hidden\"},{type:\"Uint32\",name:\"crossTileID\"},{type:\"Int16\",name:\"associatedIconIndex\"}]),ta([{type:\"Int16\",name:\"anchorX\"},{type:\"Int16\",name:\"anchorY\"},{type:\"Int16\",name:\"rightJustifiedTextSymbolIndex\"},{type:\"Int16\",name:\"centerJustifiedTextSymbolIndex\"},{type:\"Int16\",name:\"leftJustifiedTextSymbolIndex\"},{type:\"Int16\",name:\"verticalPlacedTextSymbolIndex\"},{type:\"Int16\",name:\"placedIconSymbolIndex\"},{type:\"Int16\",name:\"verticalPlacedIconSymbolIndex\"},{type:\"Uint16\",name:\"key\"},{type:\"Uint16\",name:\"textBoxStartIndex\"},{type:\"Uint16\",name:\"textBoxEndIndex\"},{type:\"Uint16\",name:\"verticalTextBoxStartIndex\"},{type:\"Uint16\",name:\"verticalTextBoxEndIndex\"},{type:\"Uint16\",name:\"iconBoxStartIndex\"},{type:\"Uint16\",name:\"iconBoxEndIndex\"},{type:\"Uint16\",name:\"verticalIconBoxStartIndex\"},{type:\"Uint16\",name:\"verticalIconBoxEndIndex\"},{type:\"Uint16\",name:\"featureIndex\"},{type:\"Uint16\",name:\"numHorizontalGlyphVertices\"},{type:\"Uint16\",name:\"numVerticalGlyphVertices\"},{type:\"Uint16\",name:\"numIconVertices\"},{type:\"Uint16\",name:\"numVerticalIconVertices\"},{type:\"Uint16\",name:\"useRuntimeCollisionCircles\"},{type:\"Uint32\",name:\"crossTileID\"},{type:\"Float32\",name:\"textBoxScale\"},{type:\"Float32\",components:2,name:\"textOffset\"},{type:\"Float32\",name:\"collisionCircleDiameter\"}]),ta([{type:\"Float32\",name:\"offsetX\"}]),ta([{type:\"Int16\",name:\"x\"},{type:\"Int16\",name:\"y\"},{type:\"Int16\",name:\"tileUnitDistanceFromAnchor\"}]);var El={\"!\":\"︕\",\"#\":\"#\",$:\"$\",\"%\":\"%\",\"&\":\"&\",\"(\":\"︵\",\")\":\"︶\",\"*\":\"*\",\"+\":\"+\",\",\":\"︐\",\"-\":\"︲\",\".\":\"・\",\"/\":\"/\",\":\":\"︓\",\";\":\"︔\",\"<\":\"︿\",\"=\":\"=\",\">\":\"﹀\",\"?\":\"︖\",\"@\":\"@\",\"[\":\"﹇\",\"\\\\\":\"\\",\"]\":\"﹈\",\"^\":\"^\",_:\"︳\",\"`\":\"`\",\"{\":\"︷\",\"|\":\"―\",\"}\":\"︸\",\"~\":\"~\",\"¢\":\"¢\",\"£\":\"£\",\"¥\":\"¥\",\"¦\":\"¦\",\"¬\":\"¬\",\"¯\":\" ̄\",\"–\":\"︲\",\"—\":\"︱\",\"‘\":\"﹃\",\"’\":\"﹄\",\"“\":\"﹁\",\"”\":\"﹂\",\"…\":\"︙\",\"‧\":\"・\",\"₩\":\"₩\",\"、\":\"︑\",\"。\":\"︒\",\"〈\":\"︿\",\"〉\":\"﹀\",\"《\":\"︽\",\"》\":\"︾\",\"「\":\"﹁\",\"」\":\"﹂\",\"『\":\"﹃\",\"』\":\"﹄\",\"【\":\"︻\",\"】\":\"︼\",\"〔\":\"︹\",\"〕\":\"︺\",\"〖\":\"︗\",\"〗\":\"︘\",\"!\":\"︕\",\"(\":\"︵\",\")\":\"︶\",\",\":\"︐\",\"-\":\"︲\",\".\":\"・\",\":\":\"︓\",\";\":\"︔\",\"<\":\"︿\",\">\":\"﹀\",\"?\":\"︖\",\"[\":\"﹇\",\"]\":\"﹈\",\"_\":\"︳\",\"{\":\"︷\",\"|\":\"―\",\"}\":\"︸\",\"⦅\":\"︵\",\"⦆\":\"︶\",\"。\":\"︒\",\"「\":\"﹁\",\"」\":\"﹂\"};var Ll=24,Cl=function(t,e,r,n,i){var a,o,s=8*i-n-1,l=(1<>1,c=-7,f=r?i-1:0,h=r?-1:1,p=t[e+f];for(f+=h,a=p&(1<<-c)-1,p>>=-c,c+=s;c>0;a=256*a+t[e+f],f+=h,c-=8);for(o=a&(1<<-c)-1,a>>=-c,c+=n;c>0;o=256*o+t[e+f],f+=h,c-=8);if(0===a)a=1-u;else{if(a===l)return o?NaN:1/0*(p?-1:1);o+=Math.pow(2,n),a-=u}return(p?-1:1)*o*Math.pow(2,a-n)},Pl=function(t,e,r,n,i,a){var o,s,l,u=8*a-i-1,c=(1<>1,h=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,p=n?0:a-1,d=n?1:-1,v=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(s=isNaN(e)?1:0,o=c):(o=Math.floor(Math.log(e)/Math.LN2),e*(l=Math.pow(2,-o))<1&&(o--,l*=2),(e+=o+f>=1?h/l:h*Math.pow(2,1-f))*l>=2&&(o++,l/=2),o+f>=c?(s=0,o=c):o+f>=1?(s=(e*l-1)*Math.pow(2,i),o+=f):(s=e*Math.pow(2,f-1)*Math.pow(2,i),o=0));i>=8;t[r+p]=255&s,p+=d,s/=256,i-=8);for(o=o<0;t[r+p]=255&o,p+=d,o/=256,u-=8);t[r+p-d]|=128*v},Ol=Il;function Il(t){this.buf=ArrayBuffer.isView&&ArrayBuffer.isView(t)?t:new Uint8Array(t||0),this.pos=0,this.type=0,this.length=this.buf.length}Il.Varint=0,Il.Fixed64=1,Il.Bytes=2,Il.Fixed32=5;var zl=4294967296,Dl=1/zl,Rl=\"undefined\"==typeof TextDecoder?null:new TextDecoder(\"utf8\");function Fl(t){return t.type===Il.Bytes?t.readVarint()+t.pos:t.pos+1}function Bl(t,e,r){return r?4294967296*e+(t>>>0):4294967296*(e>>>0)+(t>>>0)}function Nl(t,e,r){var n=e<=16383?1:e<=2097151?2:e<=268435455?3:Math.floor(Math.log(e)/(7*Math.LN2));r.realloc(n);for(var i=r.pos-1;i>=t;i--)r.buf[i+n]=r.buf[i]}function jl(t,e){for(var r=0;r>>8,t[r+2]=e>>>16,t[r+3]=e>>>24}function Jl(t,e){return(t[e]|t[e+1]<<8|t[e+2]<<16)+(t[e+3]<<24)}Il.prototype={destroy:function(){this.buf=null},readFields:function(t,e,r){for(r=r||this.length;this.pos>3,a=this.pos;this.type=7&n,t(i,e,this),this.pos===a&&this.skip(n)}return e},readMessage:function(t,e){return this.readFields(t,e,this.readVarint()+this.pos)},readFixed32:function(){var t=Zl(this.buf,this.pos);return this.pos+=4,t},readSFixed32:function(){var t=Jl(this.buf,this.pos);return this.pos+=4,t},readFixed64:function(){var t=Zl(this.buf,this.pos)+Zl(this.buf,this.pos+4)*zl;return this.pos+=8,t},readSFixed64:function(){var t=Zl(this.buf,this.pos)+Jl(this.buf,this.pos+4)*zl;return this.pos+=8,t},readFloat:function(){var t=Cl(this.buf,this.pos,!0,23,4);return this.pos+=4,t},readDouble:function(){var t=Cl(this.buf,this.pos,!0,52,8);return this.pos+=8,t},readVarint:function(t){var e,r,n=this.buf;return e=127&(r=n[this.pos++]),r<128?e:(e|=(127&(r=n[this.pos++]))<<7,r<128?e:(e|=(127&(r=n[this.pos++]))<<14,r<128?e:(e|=(127&(r=n[this.pos++]))<<21,r<128?e:function(t,e,r){var n,i,a=r.buf;if(n=(112&(i=a[r.pos++]))>>4,i<128)return Bl(t,n,e);if(n|=(127&(i=a[r.pos++]))<<3,i<128)return Bl(t,n,e);if(n|=(127&(i=a[r.pos++]))<<10,i<128)return Bl(t,n,e);if(n|=(127&(i=a[r.pos++]))<<17,i<128)return Bl(t,n,e);if(n|=(127&(i=a[r.pos++]))<<24,i<128)return Bl(t,n,e);if(n|=(1&(i=a[r.pos++]))<<31,i<128)return Bl(t,n,e);throw new Error(\"Expected varint not more than 10 bytes\")}(e|=(15&(r=n[this.pos]))<<28,t,this))))},readVarint64:function(){return this.readVarint(!0)},readSVarint:function(){var t=this.readVarint();return t%2==1?(t+1)/-2:t/2},readBoolean:function(){return Boolean(this.readVarint())},readString:function(){var t=this.readVarint()+this.pos,e=this.pos;return this.pos=t,t-e>=12&&Rl?function(t,e,r){return Rl.decode(t.subarray(e,r))}(this.buf,e,t):function(t,e,r){for(var n=\"\",i=e;i239?4:l>223?3:l>191?2:1;if(i+c>r)break;1===c?l<128&&(u=l):2===c?128==(192&(a=t[i+1]))&&(u=(31&l)<<6|63&a)<=127&&(u=null):3===c?(a=t[i+1],o=t[i+2],128==(192&a)&&128==(192&o)&&((u=(15&l)<<12|(63&a)<<6|63&o)<=2047||u>=55296&&u<=57343)&&(u=null)):4===c&&(a=t[i+1],o=t[i+2],s=t[i+3],128==(192&a)&&128==(192&o)&&128==(192&s)&&((u=(15&l)<<18|(63&a)<<12|(63&o)<<6|63&s)<=65535||u>=1114112)&&(u=null)),null===u?(u=65533,c=1):u>65535&&(u-=65536,n+=String.fromCharCode(u>>>10&1023|55296),u=56320|1023&u),n+=String.fromCharCode(u),i+=c}return n}(this.buf,e,t)},readBytes:function(){var t=this.readVarint()+this.pos,e=this.buf.subarray(this.pos,t);return this.pos=t,e},readPackedVarint:function(t,e){if(this.type!==Il.Bytes)return t.push(this.readVarint(e));var r=Fl(this);for(t=t||[];this.pos127;);else if(e===Il.Bytes)this.pos=this.readVarint()+this.pos;else if(e===Il.Fixed32)this.pos+=4;else{if(e!==Il.Fixed64)throw new Error(\"Unimplemented type: \"+e);this.pos+=8}},writeTag:function(t,e){this.writeVarint(t<<3|e)},realloc:function(t){for(var e=this.length||16;e268435455||t<0?function(t,e){var r,n;if(t>=0?(r=t%4294967296|0,n=t/4294967296|0):(n=~(-t/4294967296),4294967295^(r=~(-t%4294967296))?r=r+1|0:(r=0,n=n+1|0)),t>=0x10000000000000000||t<-0x10000000000000000)throw new Error(\"Given varint doesn't fit into 10 bytes\");e.realloc(10),function(t,e,r){r.buf[r.pos++]=127&t|128,t>>>=7,r.buf[r.pos++]=127&t|128,t>>>=7,r.buf[r.pos++]=127&t|128,t>>>=7,r.buf[r.pos++]=127&t|128,t>>>=7,r.buf[r.pos]=127&t}(r,0,e),function(t,e){var r=(7&t)<<4;e.buf[e.pos++]|=r|((t>>>=3)?128:0),t&&(e.buf[e.pos++]=127&t|((t>>>=7)?128:0),t&&(e.buf[e.pos++]=127&t|((t>>>=7)?128:0),t&&(e.buf[e.pos++]=127&t|((t>>>=7)?128:0),t&&(e.buf[e.pos++]=127&t|((t>>>=7)?128:0),t&&(e.buf[e.pos++]=127&t)))))}(n,e)}(t,this):(this.realloc(4),this.buf[this.pos++]=127&t|(t>127?128:0),t<=127||(this.buf[this.pos++]=127&(t>>>=7)|(t>127?128:0),t<=127||(this.buf[this.pos++]=127&(t>>>=7)|(t>127?128:0),t<=127||(this.buf[this.pos++]=t>>>7&127))))},writeSVarint:function(t){this.writeVarint(t<0?2*-t-1:2*t)},writeBoolean:function(t){this.writeVarint(Boolean(t))},writeString:function(t){t=String(t),this.realloc(4*t.length),this.pos++;var e=this.pos;this.pos=function(t,e,r){for(var n,i,a=0;a55295&&n<57344){if(!i){n>56319||a+1===e.length?(t[r++]=239,t[r++]=191,t[r++]=189):i=n;continue}if(n<56320){t[r++]=239,t[r++]=191,t[r++]=189,i=n;continue}n=i-55296<<10|n-56320|65536,i=null}else i&&(t[r++]=239,t[r++]=191,t[r++]=189,i=null);n<128?t[r++]=n:(n<2048?t[r++]=n>>6|192:(n<65536?t[r++]=n>>12|224:(t[r++]=n>>18|240,t[r++]=n>>12&63|128),t[r++]=n>>6&63|128),t[r++]=63&n|128)}return r}(this.buf,t,this.pos);var r=this.pos-e;r>=128&&Nl(e,r,this),this.pos=e-1,this.writeVarint(r),this.pos+=r},writeFloat:function(t){this.realloc(4),Pl(this.buf,t,this.pos,!0,23,4),this.pos+=4},writeDouble:function(t){this.realloc(8),Pl(this.buf,t,this.pos,!0,52,8),this.pos+=8},writeBytes:function(t){var e=t.length;this.writeVarint(e),this.realloc(e);for(var r=0;r=128&&Nl(r,n,this),this.pos=r-1,this.writeVarint(n),this.pos+=n},writeMessage:function(t,e,r){this.writeTag(t,Il.Bytes),this.writeRawMessage(e,r)},writePackedVarint:function(t,e){e.length&&this.writeMessage(t,jl,e)},writePackedSVarint:function(t,e){e.length&&this.writeMessage(t,Ul,e)},writePackedBoolean:function(t,e){e.length&&this.writeMessage(t,Hl,e)},writePackedFloat:function(t,e){e.length&&this.writeMessage(t,Vl,e)},writePackedDouble:function(t,e){e.length&&this.writeMessage(t,ql,e)},writePackedFixed32:function(t,e){e.length&&this.writeMessage(t,Gl,e)},writePackedSFixed32:function(t,e){e.length&&this.writeMessage(t,Wl,e)},writePackedFixed64:function(t,e){e.length&&this.writeMessage(t,Yl,e)},writePackedSFixed64:function(t,e){e.length&&this.writeMessage(t,Xl,e)},writeBytesField:function(t,e){this.writeTag(t,Il.Bytes),this.writeBytes(e)},writeFixed32Field:function(t,e){this.writeTag(t,Il.Fixed32),this.writeFixed32(e)},writeSFixed32Field:function(t,e){this.writeTag(t,Il.Fixed32),this.writeSFixed32(e)},writeFixed64Field:function(t,e){this.writeTag(t,Il.Fixed64),this.writeFixed64(e)},writeSFixed64Field:function(t,e){this.writeTag(t,Il.Fixed64),this.writeSFixed64(e)},writeVarintField:function(t,e){this.writeTag(t,Il.Varint),this.writeVarint(e)},writeSVarintField:function(t,e){this.writeTag(t,Il.Varint),this.writeSVarint(e)},writeStringField:function(t,e){this.writeTag(t,Il.Bytes),this.writeString(e)},writeFloatField:function(t,e){this.writeTag(t,Il.Fixed32),this.writeFloat(e)},writeDoubleField:function(t,e){this.writeTag(t,Il.Fixed64),this.writeDouble(e)},writeBooleanField:function(t,e){this.writeVarintField(t,Boolean(e))}};var $l=3;function Ql(t,e,r){1===t&&r.readMessage(tu,e)}function tu(t,e,r){if(3===t){var n=r.readMessage(eu,{}),i=n.id,a=n.bitmap,o=n.width,s=n.height,l=n.left,u=n.top,c=n.advance;e.push({id:i,bitmap:new Jo({width:o+2*$l,height:s+2*$l},a),metrics:{width:o,height:s,left:l,top:u,advance:c}})}}function eu(t,e,r){1===t?e.id=r.readVarint():2===t?e.bitmap=r.readBytes():3===t?e.width=r.readVarint():4===t?e.height=r.readVarint():5===t?e.left=r.readSVarint():6===t?e.top=r.readSVarint():7===t&&(e.advance=r.readVarint())}var ru=$l;function nu(t){for(var e=0,r=0,n=0,i=t;n=0;h--){var p=o[h];if(!(f.w>p.w||f.h>p.h)){if(f.x=p.x,f.y=p.y,l=Math.max(l,f.y+f.h),s=Math.max(s,f.x+f.w),f.w===p.w&&f.h===p.h){var d=o.pop();h0&&B>A&&(A=B)}else{var N=r[S.fontStack],j=N&&N[L];if(j&&j.rect)O=j.rect,P=j.metrics;else{var U=e[S.fontStack],V=U&&U[L];if(!V)continue;P=V.metrics}C=(_-S.scale)*Ll}D?(t.verticalizable=!0,k.push({glyph:L,imageName:I,x:h,y:p+C,vertical:D,scale:S.scale,fontStack:S.fontStack,sectionIndex:E,metrics:P,rect:O}),h+=z*S.scale+u):(k.push({glyph:L,imageName:I,x:h,y:p+C,vertical:D,scale:S.scale,fontStack:S.fontStack,sectionIndex:E,metrics:P,rect:O}),h+=P.advance*S.scale+u)}if(0!==k.length){var q=h-u;d=Math.max(q,d),wu(k,0,k.length-1,g,A)}h=0;var H=a*_+A;T.lineOffset=Math.max(A,w),p+=H,v=Math.max(H,v),++y}else p+=a,++y}var G=p-uu,W=_u(o),Y=W.horizontalAlign,X=W.verticalAlign;(function(t,e,r,n,i,a,o,s,l){var u=(e-r)*i,c=0;c=a!==o?-s*n-uu:(-n*l+.5)*o;for(var f=0,h=t;f=0&&n>=t&&pu[this.text.charCodeAt(n)];n--)r--;this.text=this.text.substring(t,r),this.sectionIndex=this.sectionIndex.slice(t,r)},fu.prototype.substring=function(t,e){var r=new fu;return r.text=this.text.substring(t,e),r.sectionIndex=this.sectionIndex.slice(t,e),r.sections=this.sections,r},fu.prototype.toString=function(){return this.text},fu.prototype.getMaxScale=function(){var t=this;return this.sectionIndex.reduce((function(e,r){return Math.max(e,t.sections[r].scale)}),0)},fu.prototype.addTextSection=function(t,e){this.text+=t.text,this.sections.push(cu.forText(t.scale,t.fontStack||e));for(var r=this.sections.length-1,n=0;n=63743?null:++this.imageSectionID:(this.imageSectionID=57344,this.imageSectionID)};var pu={9:!0,10:!0,11:!0,12:!0,13:!0,32:!0},du={};function vu(t,e,r,n,i,a){if(e.imageName){var o=n[e.imageName];return o?o.displaySize[0]*e.scale*Ll/a+i:0}var s=r[e.fontStack],l=s&&s[t];return l?l.metrics.advance*e.scale+i:0}function gu(t,e,r,n){var i=Math.pow(t-e,2);return n?t=0,c=0,f=0;f-r/2;){if(--o<0)return!1;s-=t[o].dist(a),a=t[o]}s+=t[o].dist(t[o+1]),o++;for(var l=[],u=0;sn;)u-=l.shift().angleDelta;if(u>i)return!1;o++,s+=f.dist(h)}return!0}function Pu(t){for(var e=0,r=0;ru){var d=(u-l)/p,v=er(f.x,h.x,d),g=er(f.y,h.y,d),y=new ku(v,g,h.angleTo(f),c);return y._round(),!o||Cu(t,y,s,o,e)?y:void 0}l+=p}}function Du(t,e,r,n,i,a,o,s,l){var u=Ou(n,a,o),c=Iu(n,i),f=c*o,h=0===t[0].x||t[0].x===l||0===t[0].y||t[0].y===l;return e-f=0&&b=0&&_=0&&h+u<=c){var w=new ku(b,_,m,d);w._round(),n&&!Cu(t,w,a,n,i)||p.push(w)}}f+=y}return s||p.length||o||(p=Ru(t,f/2,r,n,i,a,o,!0,l)),p}function Fu(t,e,r,n,i){for(var o=[],s=0;s=n&&h.x>=n||(f.x>=n?f=new a(n,f.y+(h.y-f.y)*((n-f.x)/(h.x-f.x)))._round():h.x>=n&&(h=new a(n,f.y+(h.y-f.y)*((n-f.x)/(h.x-f.x)))._round()),f.y>=i&&h.y>=i||(f.y>=i?f=new a(f.x+(h.x-f.x)*((i-f.y)/(h.y-f.y)),i)._round():h.y>=i&&(h=new a(f.x+(h.x-f.x)*((i-f.y)/(h.y-f.y)),i)._round()),u&&f.equals(u[u.length-1])||(u=[f],o.push(u)),u.push(h)))))}return o}var Bu=iu;function Nu(t,e,r,n){var i=[],o=t.image,s=o.pixelRatio,l=o.paddedRect.w-2*Bu,u=o.paddedRect.h-2*Bu,c=t.right-t.left,f=t.bottom-t.top,h=o.stretchX||[[0,l]],p=o.stretchY||[[0,u]],d=function(t,e){return t+e[1]-e[0]},v=h.reduce(d,0),g=p.reduce(d,0),y=l-v,m=u-g,x=0,b=v,_=0,w=g,T=0,k=y,A=0,M=m;if(o.content&&n){var S=o.content;x=ju(h,0,S[0]),_=ju(p,0,S[1]),b=ju(h,S[0],S[2]),w=ju(p,S[1],S[3]),T=S[0]-x,A=S[1]-_,k=S[2]-S[0]-b,M=S[3]-S[1]-w}var E=function(n,i,l,u){var h=Vu(n.stretch-x,b,c,t.left),p=qu(n.fixed-T,k,n.stretch,v),d=Vu(i.stretch-_,w,f,t.top),y=qu(i.fixed-A,M,i.stretch,g),m=Vu(l.stretch-x,b,c,t.left),S=qu(l.fixed-T,k,l.stretch,v),E=Vu(u.stretch-_,w,f,t.top),L=qu(u.fixed-A,M,u.stretch,g),C=new a(h,d),P=new a(m,d),O=new a(m,E),I=new a(h,E),z=new a(p/s,y/s),D=new a(S/s,L/s),R=e*Math.PI/180;if(R){var F=Math.sin(R),B=Math.cos(R),N=[B,-F,F,B];C._matMult(N),P._matMult(N),I._matMult(N),O._matMult(N)}var j=n.stretch+n.fixed,U=l.stretch+l.fixed,V=i.stretch+i.fixed,q=u.stretch+u.fixed;return{tl:C,tr:P,bl:I,br:O,tex:{x:o.paddedRect.x+Bu+j,y:o.paddedRect.y+Bu+V,w:U-j,h:q-V},writingMode:void 0,glyphOffset:[0,0],sectionIndex:0,pixelOffsetTL:z,pixelOffsetBR:D,minFontScaleX:k/s/c,minFontScaleY:M/s/f,isSDF:r}};if(n&&(o.stretchX||o.stretchY))for(var L=Uu(h,y,v),C=Uu(p,m,g),P=0;P0&&(d=Math.max(10,d),this.circleDiameter=d)}else{var v=o.top*s-l,g=o.bottom*s+l,y=o.left*s-l,m=o.right*s+l,x=o.collisionPadding;if(x&&(y-=x[0]*s,v-=x[1]*s,m+=x[2]*s,g+=x[3]*s),c){var b=new a(y,v),_=new a(m,v),w=new a(y,g),T=new a(m,g),k=c*Math.PI/180;b._rotate(k),_._rotate(k),w._rotate(k),T._rotate(k),y=Math.min(b.x,_.x,w.x,T.x),m=Math.max(b.x,_.x,w.x,T.x),v=Math.min(b.y,_.y,w.y,T.y),g=Math.max(b.y,_.y,w.y,T.y)}t.emplaceBack(e.x,e.y,y,v,m,g,r,n,i)}this.boxEndIndex=t.length},Gu=function(t,e){if(void 0===t&&(t=[]),void 0===e&&(e=Wu),this.data=t,this.length=this.data.length,this.compare=e,this.length>0)for(var r=(this.length>>1)-1;r>=0;r--)this._down(r)};function Wu(t,e){return te?1:0}function Yu(t,e,r){void 0===e&&(e=1),void 0===r&&(r=!1);for(var n=1/0,i=1/0,o=-1/0,s=-1/0,l=t[0],u=0;uo)&&(o=c.x),(!u||c.y>s)&&(s=c.y)}var f=o-n,h=s-i,p=Math.min(f,h),d=p/2,v=new Gu([],Xu);if(0===p)return new a(n,i);for(var g=n;gm.d||!m.d)&&(m=b,r&&console.log(\"found best %d after %d probes\",Math.round(1e4*b.d)/1e4,x)),b.max-m.d<=e||(d=b.h/2,v.push(new Zu(b.p.x-d,b.p.y-d,d,t)),v.push(new Zu(b.p.x+d,b.p.y-d,d,t)),v.push(new Zu(b.p.x-d,b.p.y+d,d,t)),v.push(new Zu(b.p.x+d,b.p.y+d,d,t)),x+=4)}return r&&(console.log(\"num probes: \"+x),console.log(\"best distance: \"+m.d)),m.p}function Xu(t,e){return e.max-t.max}function Zu(t,e,r,n){this.p=new a(t,e),this.h=r,this.d=function(t,e){for(var r=!1,n=1/0,i=0;it.y!=c.y>t.y&&t.x<(c.x-u.x)*(t.y-u.y)/(c.y-u.y)+u.x&&(r=!r),n=Math.min(n,Eo(t,u,c))}return(r?1:-1)*Math.sqrt(n)}(this.p,n),this.max=this.d+this.h*Math.SQRT2}Gu.prototype.push=function(t){this.data.push(t),this.length++,this._up(this.length-1)},Gu.prototype.pop=function(){if(0!==this.length){var t=this.data[0],e=this.data.pop();return this.length--,this.length>0&&(this.data[0]=e,this._down(0)),t}},Gu.prototype.peek=function(){return this.data[0]},Gu.prototype._up=function(t){for(var e=this.data,r=this.compare,n=e[t];t>0;){var i=t-1>>1,a=e[i];if(r(n,a)>=0)break;e[t]=a,t=i}e[t]=n},Gu.prototype._down=function(t){for(var e=this.data,r=this.compare,n=this.length>>1,i=e[t];t=0)break;e[t]=o,t=a}e[t]=i};var Ku=7,Ju=Number.POSITIVE_INFINITY;function $u(t,e){return e[1]!==Ju?function(t,e,r){var n=0,i=0;switch(e=Math.abs(e),r=Math.abs(r),t){case\"top-right\":case\"top-left\":case\"top\":i=r-Ku;break;case\"bottom-right\":case\"bottom-left\":case\"bottom\":i=-r+Ku}switch(t){case\"top-right\":case\"bottom-right\":case\"right\":n=-e;break;case\"top-left\":case\"bottom-left\":case\"left\":n=e}return[n,i]}(t,e[0],e[1]):function(t,e){var r=0,n=0;e<0&&(e=0);var i=e/Math.sqrt(2);switch(t){case\"top-right\":case\"top-left\":n=i-Ku;break;case\"bottom-right\":case\"bottom-left\":n=-i+Ku;break;case\"bottom\":n=-e+Ku;break;case\"top\":n=e-Ku}switch(t){case\"top-right\":case\"bottom-right\":r=-i;break;case\"top-left\":case\"bottom-left\":r=i;break;case\"left\":r=e;break;case\"right\":r=-e}return[r,n]}(t,e[0])}function Qu(t){switch(t){case\"right\":case\"top-right\":case\"bottom-right\":return\"right\";case\"left\":case\"top-left\":case\"bottom-left\":return\"left\"}return\"center\"}var tc=255,ec=tc*Au;function rc(t,e,r,n,i,o,s,l,u,c,f,h,p,d,v){var g=function(t,e,r,n,i,o,s,l){for(var u=n.layout.get(\"text-rotate\").evaluate(o,{})*Math.PI/180,c=[],f=0,h=e.positionedLines;fec&&k(t.layerIds[0]+': Value for \"text-size\" is >= '+tc+'. Reduce your \"text-size\".'):\"composite\"===y.kind&&((m=[Au*d.compositeTextSizes[0].evaluate(s,{},v),Au*d.compositeTextSizes[1].evaluate(s,{},v)])[0]>ec||m[1]>ec)&&k(t.layerIds[0]+': Value for \"text-size\" is >= '+tc+'. Reduce your \"text-size\".'),t.addSymbols(t.text,g,m,l,o,s,c,e,u.lineStartIndex,u.lineLength,p,v);for(var x=0,b=f;x=0;o--)if(n.dist(a[o])0)&&(\"constant\"!==a.value.kind||a.value.value.length>0),u=\"constant\"!==s.value.kind||!!s.value.value||Object.keys(s.parameters).length>0,c=i.get(\"symbol-sort-key\");if(this.features=[],l||u){for(var f=e.iconDependencies,h=e.glyphDependencies,p=e.availableImages,d=new zi(this.zoom),v=0,g=t;v=0;for(var I=0,z=k.sections;I=0;s--)a[s]={x:e[s].x,y:e[s].y,tileUnitDistanceFromAnchor:i},s>0&&(i+=e[s-1].dist(e[s]));for(var l=0;l0},hc.prototype.hasIconData=function(){return this.icon.segments.get().length>0},hc.prototype.hasDebugData=function(){return this.textCollisionBox&&this.iconCollisionBox},hc.prototype.hasTextCollisionBoxData=function(){return this.hasDebugData()&&this.textCollisionBox.segments.get().length>0},hc.prototype.hasIconCollisionBoxData=function(){return this.hasDebugData()&&this.iconCollisionBox.segments.get().length>0},hc.prototype.addIndicesForPlacedSymbol=function(t,e){for(var r=t.placedSymbolArray.get(e),n=r.vertexStartIndex+4*r.numGlyphs,i=r.vertexStartIndex;i1||this.icon.segments.get().length>1)){this.symbolInstanceIndexes=this.getSortedSymbolIndexes(t),this.sortedAngle=t,this.text.indexArray.clear(),this.icon.indexArray.clear(),this.featureSortOrder=[];for(var r=0,n=this.symbolInstanceIndexes;r=0&&n.indexOf(t)===r&&e.addIndicesForPlacedSymbol(e.text,t)})),a.verticalPlacedTextSymbolIndex>=0&&this.addIndicesForPlacedSymbol(this.text,a.verticalPlacedTextSymbolIndex),a.placedIconSymbolIndex>=0&&this.addIndicesForPlacedSymbol(this.icon,a.placedIconSymbolIndex),a.verticalPlacedIconSymbolIndex>=0&&this.addIndicesForPlacedSymbol(this.icon,a.verticalPlacedIconSymbolIndex)}this.text.indexBuffer&&this.text.indexBuffer.updateData(this.text.indexArray),this.icon.indexBuffer&&this.icon.indexBuffer.updateData(this.icon.indexArray)}},oi(\"SymbolBucket\",hc,{omit:[\"layers\",\"collisionBoxArray\",\"features\",\"compareText\"]}),hc.MAX_GLYPHS=65535,hc.addDynamicAttributes=lc;var pc=new Xi({\"symbol-placement\":new qi(Ft.layout_symbol[\"symbol-placement\"]),\"symbol-spacing\":new qi(Ft.layout_symbol[\"symbol-spacing\"]),\"symbol-avoid-edges\":new qi(Ft.layout_symbol[\"symbol-avoid-edges\"]),\"symbol-sort-key\":new Hi(Ft.layout_symbol[\"symbol-sort-key\"]),\"symbol-z-order\":new qi(Ft.layout_symbol[\"symbol-z-order\"]),\"icon-allow-overlap\":new qi(Ft.layout_symbol[\"icon-allow-overlap\"]),\"icon-ignore-placement\":new qi(Ft.layout_symbol[\"icon-ignore-placement\"]),\"icon-optional\":new qi(Ft.layout_symbol[\"icon-optional\"]),\"icon-rotation-alignment\":new qi(Ft.layout_symbol[\"icon-rotation-alignment\"]),\"icon-size\":new Hi(Ft.layout_symbol[\"icon-size\"]),\"icon-text-fit\":new qi(Ft.layout_symbol[\"icon-text-fit\"]),\"icon-text-fit-padding\":new qi(Ft.layout_symbol[\"icon-text-fit-padding\"]),\"icon-image\":new Hi(Ft.layout_symbol[\"icon-image\"]),\"icon-rotate\":new Hi(Ft.layout_symbol[\"icon-rotate\"]),\"icon-padding\":new qi(Ft.layout_symbol[\"icon-padding\"]),\"icon-keep-upright\":new qi(Ft.layout_symbol[\"icon-keep-upright\"]),\"icon-offset\":new Hi(Ft.layout_symbol[\"icon-offset\"]),\"icon-anchor\":new Hi(Ft.layout_symbol[\"icon-anchor\"]),\"icon-pitch-alignment\":new qi(Ft.layout_symbol[\"icon-pitch-alignment\"]),\"text-pitch-alignment\":new qi(Ft.layout_symbol[\"text-pitch-alignment\"]),\"text-rotation-alignment\":new qi(Ft.layout_symbol[\"text-rotation-alignment\"]),\"text-field\":new Hi(Ft.layout_symbol[\"text-field\"]),\"text-font\":new Hi(Ft.layout_symbol[\"text-font\"]),\"text-size\":new Hi(Ft.layout_symbol[\"text-size\"]),\"text-max-width\":new Hi(Ft.layout_symbol[\"text-max-width\"]),\"text-line-height\":new qi(Ft.layout_symbol[\"text-line-height\"]),\"text-letter-spacing\":new Hi(Ft.layout_symbol[\"text-letter-spacing\"]),\"text-justify\":new Hi(Ft.layout_symbol[\"text-justify\"]),\"text-radial-offset\":new Hi(Ft.layout_symbol[\"text-radial-offset\"]),\"text-variable-anchor\":new qi(Ft.layout_symbol[\"text-variable-anchor\"]),\"text-anchor\":new Hi(Ft.layout_symbol[\"text-anchor\"]),\"text-max-angle\":new qi(Ft.layout_symbol[\"text-max-angle\"]),\"text-writing-mode\":new qi(Ft.layout_symbol[\"text-writing-mode\"]),\"text-rotate\":new Hi(Ft.layout_symbol[\"text-rotate\"]),\"text-padding\":new qi(Ft.layout_symbol[\"text-padding\"]),\"text-keep-upright\":new qi(Ft.layout_symbol[\"text-keep-upright\"]),\"text-transform\":new Hi(Ft.layout_symbol[\"text-transform\"]),\"text-offset\":new Hi(Ft.layout_symbol[\"text-offset\"]),\"text-allow-overlap\":new qi(Ft.layout_symbol[\"text-allow-overlap\"]),\"text-ignore-placement\":new qi(Ft.layout_symbol[\"text-ignore-placement\"]),\"text-optional\":new qi(Ft.layout_symbol[\"text-optional\"])}),dc={paint:new Xi({\"icon-opacity\":new Hi(Ft.paint_symbol[\"icon-opacity\"]),\"icon-color\":new Hi(Ft.paint_symbol[\"icon-color\"]),\"icon-halo-color\":new Hi(Ft.paint_symbol[\"icon-halo-color\"]),\"icon-halo-width\":new Hi(Ft.paint_symbol[\"icon-halo-width\"]),\"icon-halo-blur\":new Hi(Ft.paint_symbol[\"icon-halo-blur\"]),\"icon-translate\":new qi(Ft.paint_symbol[\"icon-translate\"]),\"icon-translate-anchor\":new qi(Ft.paint_symbol[\"icon-translate-anchor\"]),\"text-opacity\":new Hi(Ft.paint_symbol[\"text-opacity\"]),\"text-color\":new Hi(Ft.paint_symbol[\"text-color\"],{runtimeType:Zt,getOverride:function(t){return t.textColor},hasOverride:function(t){return!!t.textColor}}),\"text-halo-color\":new Hi(Ft.paint_symbol[\"text-halo-color\"]),\"text-halo-width\":new Hi(Ft.paint_symbol[\"text-halo-width\"]),\"text-halo-blur\":new Hi(Ft.paint_symbol[\"text-halo-blur\"]),\"text-translate\":new qi(Ft.paint_symbol[\"text-translate\"]),\"text-translate-anchor\":new qi(Ft.paint_symbol[\"text-translate-anchor\"])}),layout:pc},vc=function(t){this.type=t.property.overrides?t.property.overrides.runtimeType:Gt,this.defaultValue=t};vc.prototype.evaluate=function(t){if(t.formattedSection){var e=this.defaultValue.property.overrides;if(e&&e.hasOverride(t.formattedSection))return e.getOverride(t.formattedSection)}return t.feature&&t.featureState?this.defaultValue.evaluate(t.feature,t.featureState):this.defaultValue.property.specification.default},vc.prototype.eachChild=function(t){this.defaultValue.isConstant()||t(this.defaultValue.value._styleExpression.expression)},vc.prototype.outputDefined=function(){return!1},vc.prototype.serialize=function(){return null},oi(\"FormatSectionOverride\",vc,{omit:[\"defaultValue\"]});var gc=function(t){function e(e){t.call(this,e,dc)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.recalculate=function(e,r){if(t.prototype.recalculate.call(this,e,r),\"auto\"===this.layout.get(\"icon-rotation-alignment\")&&(\"point\"!==this.layout.get(\"symbol-placement\")?this.layout._values[\"icon-rotation-alignment\"]=\"map\":this.layout._values[\"icon-rotation-alignment\"]=\"viewport\"),\"auto\"===this.layout.get(\"text-rotation-alignment\")&&(\"point\"!==this.layout.get(\"symbol-placement\")?this.layout._values[\"text-rotation-alignment\"]=\"map\":this.layout._values[\"text-rotation-alignment\"]=\"viewport\"),\"auto\"===this.layout.get(\"text-pitch-alignment\")&&(this.layout._values[\"text-pitch-alignment\"]=this.layout.get(\"text-rotation-alignment\")),\"auto\"===this.layout.get(\"icon-pitch-alignment\")&&(this.layout._values[\"icon-pitch-alignment\"]=this.layout.get(\"icon-rotation-alignment\")),\"point\"===this.layout.get(\"symbol-placement\")){var n=this.layout.get(\"text-writing-mode\");if(n){for(var i=[],a=0,o=n;a\",targetMapId:n,sourceMapId:a.mapId})}}},Cc.prototype.receive=function(t){var e=t.data,r=e.id;if(r&&(!e.targetMapId||this.mapId===e.targetMapId))if(\"\"===e.type){delete this.tasks[r];var n=this.cancelCallbacks[r];delete this.cancelCallbacks[r],n&&n()}else S()||e.mustQueue?(this.tasks[r]=e,this.taskQueue.push(r),this.invoker.trigger()):this.processTask(r,e)},Cc.prototype.process=function(){if(this.taskQueue.length){var t=this.taskQueue.shift(),e=this.tasks[t];delete this.tasks[t],this.taskQueue.length&&this.invoker.trigger(),e&&this.processTask(t,e)}},Cc.prototype.processTask=function(t,e){var r=this;if(\"\"===e.type){var n=this.callbacks[t];delete this.callbacks[t],n&&(e.error?n(fi(e.error)):n(null,fi(e.data)))}else{var i=!1,a=C(this.globalScope)?void 0:[],o=e.hasCallback?function(e,n){i=!0,delete r.cancelCallbacks[t],r.target.postMessage({id:t,type:\"\",sourceMapId:r.mapId,error:e?ci(e):null,data:ci(n,a)},a)}:function(t){i=!0},s=null,l=fi(e.data);if(this.parent[e.type])s=this.parent[e.type](e.sourceMapId,l,o);else if(this.parent.getWorkerSource){var u=e.type.split(\".\");s=this.parent.getWorkerSource(e.sourceMapId,u[0],l.source)[u[1]](l,o)}else o(new Error(\"Could not find function \"+e.type));!i&&s&&s.cancel&&(this.cancelCallbacks[t]=s.cancel)}},Cc.prototype.remove=function(){this.invoker.remove(),this.target.removeEventListener(\"message\",this.receive,!1)};var Oc=function(t,e){t&&(e?this.setSouthWest(t).setNorthEast(e):4===t.length?this.setSouthWest([t[0],t[1]]).setNorthEast([t[2],t[3]]):this.setSouthWest(t[0]).setNorthEast(t[1]))};Oc.prototype.setNorthEast=function(t){return this._ne=t instanceof zc?new zc(t.lng,t.lat):zc.convert(t),this},Oc.prototype.setSouthWest=function(t){return this._sw=t instanceof zc?new zc(t.lng,t.lat):zc.convert(t),this},Oc.prototype.extend=function(t){var e,r,n=this._sw,i=this._ne;if(t instanceof zc)e=t,r=t;else{if(!(t instanceof Oc)){if(Array.isArray(t)){if(4===t.length||t.every(Array.isArray)){var a=t;return this.extend(Oc.convert(a))}var o=t;return this.extend(zc.convert(o))}return this}if(e=t._sw,r=t._ne,!e||!r)return this}return n||i?(n.lng=Math.min(e.lng,n.lng),n.lat=Math.min(e.lat,n.lat),i.lng=Math.max(r.lng,i.lng),i.lat=Math.max(r.lat,i.lat)):(this._sw=new zc(e.lng,e.lat),this._ne=new zc(r.lng,r.lat)),this},Oc.prototype.getCenter=function(){return new zc((this._sw.lng+this._ne.lng)/2,(this._sw.lat+this._ne.lat)/2)},Oc.prototype.getSouthWest=function(){return this._sw},Oc.prototype.getNorthEast=function(){return this._ne},Oc.prototype.getNorthWest=function(){return new zc(this.getWest(),this.getNorth())},Oc.prototype.getSouthEast=function(){return new zc(this.getEast(),this.getSouth())},Oc.prototype.getWest=function(){return this._sw.lng},Oc.prototype.getSouth=function(){return this._sw.lat},Oc.prototype.getEast=function(){return this._ne.lng},Oc.prototype.getNorth=function(){return this._ne.lat},Oc.prototype.toArray=function(){return[this._sw.toArray(),this._ne.toArray()]},Oc.prototype.toString=function(){return\"LngLatBounds(\"+this._sw.toString()+\", \"+this._ne.toString()+\")\"},Oc.prototype.isEmpty=function(){return!(this._sw&&this._ne)},Oc.prototype.contains=function(t){var e=zc.convert(t),r=e.lng,n=e.lat,i=this._sw.lat<=n&&n<=this._ne.lat,a=this._sw.lng<=r&&r<=this._ne.lng;return this._sw.lng>this._ne.lng&&(a=this._sw.lng>=r&&r>=this._ne.lng),i&&a},Oc.convert=function(t){return!t||t instanceof Oc?t:new Oc(t)};var Ic=6371008.8,zc=function(t,e){if(isNaN(t)||isNaN(e))throw new Error(\"Invalid LngLat object: (\"+t+\", \"+e+\")\");if(this.lng=+t,this.lat=+e,this.lat>90||this.lat<-90)throw new Error(\"Invalid LngLat latitude value: must be between -90 and 90\")};zc.prototype.wrap=function(){return new zc(h(this.lng,-180,180),this.lat)},zc.prototype.toArray=function(){return[this.lng,this.lat]},zc.prototype.toString=function(){return\"LngLat(\"+this.lng+\", \"+this.lat+\")\"},zc.prototype.distanceTo=function(t){var e=Math.PI/180,r=this.lat*e,n=t.lat*e,i=Math.sin(r)*Math.sin(n)+Math.cos(r)*Math.cos(n)*Math.cos((t.lng-this.lng)*e);return Ic*Math.acos(Math.min(i,1))},zc.prototype.toBounds=function(t){void 0===t&&(t=0);var e=360*t/40075017,r=e/Math.cos(Math.PI/180*this.lat);return new Oc(new zc(this.lng-r,this.lat-e),new zc(this.lng+r,this.lat+e))},zc.convert=function(t){if(t instanceof zc)return t;if(Array.isArray(t)&&(2===t.length||3===t.length))return new zc(Number(t[0]),Number(t[1]));if(!Array.isArray(t)&&\"object\"==typeof t&&null!==t)return new zc(Number(\"lng\"in t?t.lng:t.lon),Number(t.lat));throw new Error(\"`LngLatLike` argument must be specified as a LngLat instance, an object {lng: , lat: }, an object {lon: , lat: }, or an array of [, ]\")};var Dc=2*Math.PI*Ic;function Rc(t){return Dc*Math.cos(t*Math.PI/180)}function Fc(t){return(180+t)/360}function Bc(t){return(180-180/Math.PI*Math.log(Math.tan(Math.PI/4+t*Math.PI/360)))/360}function Nc(t,e){return t/Rc(e)}function jc(t){var e=180-360*t;return 360/Math.PI*Math.atan(Math.exp(e*Math.PI/180))-90}var Uc=function(t,e,r){void 0===r&&(r=0),this.x=+t,this.y=+e,this.z=+r};Uc.fromLngLat=function(t,e){void 0===e&&(e=0);var r=zc.convert(t);return new Uc(Fc(r.lng),Bc(r.lat),Nc(e,r.lat))},Uc.prototype.toLngLat=function(){return new zc(360*this.x-180,jc(this.y))},Uc.prototype.toAltitude=function(){return t=this.z,e=this.y,t*Rc(jc(e));var t,e},Uc.prototype.meterInMercatorCoordinateUnits=function(){return 1/Dc*(t=jc(this.y),1/Math.cos(t*Math.PI/180));var t};var Vc=function(t,e,r){this.z=t,this.x=e,this.y=r,this.key=Gc(0,t,t,e,r)};Vc.prototype.equals=function(t){return this.z===t.z&&this.x===t.x&&this.y===t.y},Vc.prototype.url=function(t,e){var r,n,i,a,o,s=(r=this.x,n=this.y,i=this.z,a=Pc(256*r,256*(n=Math.pow(2,i)-n-1),i),o=Pc(256*(r+1),256*(n+1),i),a[0]+\",\"+a[1]+\",\"+o[0]+\",\"+o[1]),l=function(t,e,r){for(var n,i=\"\",a=t;a>0;a--)i+=(e&(n=1<this.canonical.z?new Hc(t,this.wrap,this.canonical.z,this.canonical.x,this.canonical.y):new Hc(t,this.wrap,t,this.canonical.x>>e,this.canonical.y>>e)},Hc.prototype.calculateScaledKey=function(t,e){var r=this.canonical.z-t;return t>this.canonical.z?Gc(this.wrap*+e,t,this.canonical.z,this.canonical.x,this.canonical.y):Gc(this.wrap*+e,t,t,this.canonical.x>>r,this.canonical.y>>r)},Hc.prototype.isChildOf=function(t){if(t.wrap!==this.wrap)return!1;var e=this.canonical.z-t.canonical.z;return 0===t.overscaledZ||t.overscaledZ>e&&t.canonical.y===this.canonical.y>>e},Hc.prototype.children=function(t){if(this.overscaledZ>=t)return[new Hc(this.overscaledZ+1,this.wrap,this.canonical.z,this.canonical.x,this.canonical.y)];var e=this.canonical.z+1,r=2*this.canonical.x,n=2*this.canonical.y;return[new Hc(e,this.wrap,e,r,n),new Hc(e,this.wrap,e,r+1,n),new Hc(e,this.wrap,e,r,n+1),new Hc(e,this.wrap,e,r+1,n+1)]},Hc.prototype.isLessThan=function(t){return this.wrapt.wrap)&&(this.overscaledZt.overscaledZ)&&(this.canonical.xt.canonical.x)&&this.canonical.y=this.dim+1||e<-1||e>=this.dim+1)throw new RangeError(\"out of range source coordinates for DEM data\");return(e+1)*this.stride+(t+1)},Wc.prototype._unpackMapbox=function(t,e,r){return(256*t*256+256*e+r)/10-1e4},Wc.prototype._unpackTerrarium=function(t,e,r){return 256*t+e+r/256-32768},Wc.prototype.getPixels=function(){return new $o({width:this.stride,height:this.stride},new Uint8Array(this.data.buffer))},Wc.prototype.backfillBorder=function(t,e,r){if(this.dim!==t.dim)throw new Error(\"dem dimension mismatch\");var n=e*this.dim,i=e*this.dim+this.dim,a=r*this.dim,o=r*this.dim+this.dim;switch(e){case-1:n=i-1;break;case 1:i=n+1}switch(r){case-1:a=o-1;break;case 1:o=a+1}for(var s=-e*this.dim,l=-r*this.dim,u=a;u=0&&c[3]>=0&&s.insert(o,c[0],c[1],c[2],c[3])}},Jc.prototype.loadVTLayers=function(){return this.vtLayers||(this.vtLayers=new tl.VectorTile(new Ol(this.rawTileData)).layers,this.sourceLayerCoder=new Yc(this.vtLayers?Object.keys(this.vtLayers).sort():[\"_geojsonTileLayer\"])),this.vtLayers},Jc.prototype.query=function(t,e,r,n){var i=this;this.loadVTLayers();for(var o=t.params||{},s=po/t.tileSize/t.scale,l=An(o.filter),u=t.queryGeometry,c=t.queryPadding*s,f=Qc(u),h=this.grid.query(f.minX-c,f.minY-c,f.maxX+c,f.maxY+c),p=Qc(t.cameraQueryGeometry),d=0,v=this.grid3D.query(p.minX-c,p.minY-c,p.maxX+c,p.maxY+c,(function(e,r,n,i){return function(t,e,r,n,i){for(var o=0,s=t;o=l.x&&i>=l.y)return!0}var u=[new a(e,r),new a(e,i),new a(n,i),new a(n,r)];if(t.length>2)for(var c=0,f=u;c=0)return!0;return!1}(a,f)){var h=this.sourceLayerCoder.decode(r),d=this.vtLayers[h].feature(n);if(i.needGeometry){var v=mo(d,!0);if(!i.filter(new zi(this.tileID.overscaledZ),v,this.tileID.canonical))return}else if(!i.filter(new zi(this.tileID.overscaledZ),d))return;for(var g=this.getId(d,h),y=0;yn)i=!1;else if(e)if(this.expirationTimeht&&(t.getActor().send(\"enforceCacheSizeLimit\",ft),xt=0)},t.clamp=f,t.clearTileCache=function(t){var e=s.caches.delete(ct);t&&e.catch(t).then((function(){return t()}))},t.clipLine=Fu,t.clone=function(t){var e=new Fo(16);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e[9]=t[9],e[10]=t[10],e[11]=t[11],e[12]=t[12],e[13]=t[13],e[14]=t[14],e[15]=t[15],e},t.clone$1=w,t.clone$2=function(t){var e=new Fo(3);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e},t.collisionCircleLayout=Ml,t.config=j,t.create=function(){var t=new Fo(16);return Fo!=Float32Array&&(t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[11]=0,t[12]=0,t[13]=0,t[14]=0),t[0]=1,t[5]=1,t[10]=1,t[15]=1,t},t.create$1=function(){var t=new Fo(9);return Fo!=Float32Array&&(t[1]=0,t[2]=0,t[3]=0,t[5]=0,t[6]=0,t[7]=0),t[0]=1,t[4]=1,t[8]=1,t},t.create$2=function(){var t=new Fo(4);return Fo!=Float32Array&&(t[1]=0,t[2]=0),t[0]=1,t[3]=1,t},t.createCommonjsModule=e,t.createExpression=fn,t.createLayout=ta,t.createStyleLayer=function(t){return\"custom\"===t.type?new _c(t):new wc[t.type](t)},t.cross=function(t,e,r){var n=e[0],i=e[1],a=e[2],o=r[0],s=r[1],l=r[2];return t[0]=i*l-a*s,t[1]=a*o-n*l,t[2]=n*s-i*o,t},t.deepEqual=function t(e,r){if(Array.isArray(e)){if(!Array.isArray(r)||e.length!==r.length)return!1;for(var n=0;n0&&(a=1/Math.sqrt(a)),t[0]=e[0]*a,t[1]=e[1]*a,t[2]=e[2]*a,t},t.number=er,t.offscreenCanvasSupported=bt,t.ortho=function(t,e,r,n,i,a,o){var s=1/(e-r),l=1/(n-i),u=1/(a-o);return t[0]=-2*s,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=-2*l,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=2*u,t[11]=0,t[12]=(e+r)*s,t[13]=(i+n)*l,t[14]=(o+a)*u,t[15]=1,t},t.parseGlyphPBF=function(t){return new Ol(t).readFields(Ql,[])},t.pbf=Ol,t.performSymbolLayout=function(t,e,r,n,i,a,o){t.createArrays();var s=512*t.overscaling;t.tilePixelRatio=po/s,t.compareText={},t.iconsNeedLinear=!1;var l=t.layers[0].layout,u=t.layers[0]._unevaluatedLayout._values,c={};if(\"composite\"===t.textSizeData.kind){var f=t.textSizeData,h=f.minZoom,p=f.maxZoom;c.compositeTextSizes=[u[\"text-size\"].possiblyEvaluate(new zi(h),o),u[\"text-size\"].possiblyEvaluate(new zi(p),o)]}if(\"composite\"===t.iconSizeData.kind){var d=t.iconSizeData,v=d.minZoom,g=d.maxZoom;c.compositeIconSizes=[u[\"icon-size\"].possiblyEvaluate(new zi(v),o),u[\"icon-size\"].possiblyEvaluate(new zi(g),o)]}c.layoutTextSize=u[\"text-size\"].possiblyEvaluate(new zi(t.zoom+1),o),c.layoutIconSize=u[\"icon-size\"].possiblyEvaluate(new zi(t.zoom+1),o),c.textMaxSize=u[\"text-size\"].possiblyEvaluate(new zi(18));for(var y=l.get(\"text-line-height\")*Ll,m=\"map\"===l.get(\"text-rotation-alignment\")&&\"point\"!==l.get(\"symbol-placement\"),x=l.get(\"text-keep-upright\"),b=l.get(\"text-size\"),_=function(){var a=T[w],s=l.get(\"text-font\").evaluate(a,{},o).join(\",\"),u=b.evaluate(a,{},o),f=c.layoutTextSize.evaluate(a,{},o),h=c.layoutIconSize.evaluate(a,{},o),p={horizontal:{},vertical:void 0},d=a.text,v=[0,0];if(d){var g=d.toString(),_=l.get(\"text-letter-spacing\").evaluate(a,{},o)*Ll,A=function(t){for(var e=0,r=t;e=po||f.y<0||f.y>=po||function(t,e,r,n,i,a,o,s,l,u,c,f,h,p,d,v,g,y,m,x,b,_,w,T,A){var M,S,E,L,C,P=t.addToLineVertexArray(e,r),O=0,I=0,z=0,D=0,R=-1,F=-1,B={},N=ja(\"\"),j=0,U=0;if(void 0===s._unevaluatedLayout.getValue(\"text-radial-offset\")?(j=(M=s.layout.get(\"text-offset\").evaluate(b,{},T).map((function(t){return t*Ll})))[0],U=M[1]):(j=s.layout.get(\"text-radial-offset\").evaluate(b,{},T)*Ll,U=Ju),t.allowVerticalPlacement&&n.vertical){var V=s.layout.get(\"text-rotate\").evaluate(b,{},T)+90,q=n.vertical;L=new Hu(l,e,u,c,f,q,h,p,d,V),o&&(C=new Hu(l,e,u,c,f,o,g,y,d,V))}if(i){var H=s.layout.get(\"icon-rotate\").evaluate(b,{}),G=\"none\"!==s.layout.get(\"icon-text-fit\"),W=Nu(i,H,w,G),Y=o?Nu(o,H,w,G):void 0;E=new Hu(l,e,u,c,f,i,g,y,!1,H),O=4*W.length;var X=t.iconSizeData,Z=null;\"source\"===X.kind?(Z=[Au*s.layout.get(\"icon-size\").evaluate(b,{})])[0]>ec&&k(t.layerIds[0]+': Value for \"icon-size\" is >= '+tc+'. Reduce your \"icon-size\".'):\"composite\"===X.kind&&((Z=[Au*_.compositeIconSizes[0].evaluate(b,{},T),Au*_.compositeIconSizes[1].evaluate(b,{},T)])[0]>ec||Z[1]>ec)&&k(t.layerIds[0]+': Value for \"icon-size\" is >= '+tc+'. Reduce your \"icon-size\".'),t.addSymbols(t.icon,W,Z,x,m,b,!1,e,P.lineStartIndex,P.lineLength,-1,T),R=t.icon.placedSymbolArray.length-1,Y&&(I=4*Y.length,t.addSymbols(t.icon,Y,Z,x,m,b,lu.vertical,e,P.lineStartIndex,P.lineLength,-1,T),F=t.icon.placedSymbolArray.length-1)}for(var K in n.horizontal){var J=n.horizontal[K];if(!S){N=ja(J.text);var $=s.layout.get(\"text-rotate\").evaluate(b,{},T);S=new Hu(l,e,u,c,f,J,h,p,d,$)}var Q=1===J.positionedLines.length;if(z+=rc(t,e,J,a,s,d,b,v,P,n.vertical?lu.horizontal:lu.horizontalOnly,Q?Object.keys(n.horizontal):[K],B,R,_,T),Q)break}n.vertical&&(D+=rc(t,e,n.vertical,a,s,d,b,v,P,lu.vertical,[\"vertical\"],B,F,_,T));var tt=S?S.boxStartIndex:t.collisionBoxArray.length,et=S?S.boxEndIndex:t.collisionBoxArray.length,rt=L?L.boxStartIndex:t.collisionBoxArray.length,nt=L?L.boxEndIndex:t.collisionBoxArray.length,it=E?E.boxStartIndex:t.collisionBoxArray.length,at=E?E.boxEndIndex:t.collisionBoxArray.length,ot=C?C.boxStartIndex:t.collisionBoxArray.length,st=C?C.boxEndIndex:t.collisionBoxArray.length,lt=-1,ut=function(t,e){return t&&t.circleDiameter?Math.max(t.circleDiameter,e):e};lt=ut(S,lt),lt=ut(L,lt),lt=ut(E,lt);var ct=(lt=ut(C,lt))>-1?1:0;ct&&(lt*=A/Ll),t.glyphOffsetArray.length>=hc.MAX_GLYPHS&&k(\"Too many glyphs being rendered in a tile. See https://github.com/mapbox/mapbox-gl-js/issues/2907\"),void 0!==b.sortKey&&t.addToSortKeyRanges(t.symbolInstances.length,b.sortKey),t.symbolInstances.emplaceBack(e.x,e.y,B.right>=0?B.right:-1,B.center>=0?B.center:-1,B.left>=0?B.left:-1,B.vertical||-1,R,F,N,tt,et,rt,nt,it,at,ot,st,u,z,D,O,I,ct,0,h,j,U,lt)}(t,f,s,r,n,i,h,t.layers[0],t.collisionBoxArray,e.index,e.sourceLayerIndex,t.index,m,w,M,l,b,T,S,d,e,a,u,c,o)};if(\"line\"===E)for(var O=0,I=Fu(e.geometry,0,0,po,po);O1){var U=zu(j,A,r.vertical||v,n,g,x);U&&P(j,U)}}else if(\"Polygon\"===e.type)for(var V=0,q=Fs(e.geometry,0);V=E.maxzoom||\"none\"!==E.visibility&&(o(S,this.zoom,n),(v[E.id]=E.createBucket({index:c.bucketLayerIDs.length,layers:S,zoom:this.zoom,pixelRatio:this.pixelRatio,overscaling:this.overscaling,collisionBoxArray:this.collisionBoxArray,sourceLayerIndex:b,sourceID:this.source})).populate(_,g,this.tileID.canonical),c.bucketLayerIDs.push(S.map((function(t){return t.id}))))}}}var L=t.mapObject(g.glyphDependencies,(function(t){return Object.keys(t).map(Number)}));Object.keys(L).length?a.send(\"getGlyphs\",{uid:this.uid,stacks:L},(function(t,e){f||(f=t,h=e,O.call(l))})):h={};var C=Object.keys(g.iconDependencies);C.length?a.send(\"getImages\",{icons:C,source:this.source,tileID:this.tileID,type:\"icons\"},(function(t,e){f||(f=t,p=e,O.call(l))})):p={};var P=Object.keys(g.patternDependencies);function O(){if(f)return s(f);if(h&&p&&d){var e=new i(h),r=new t.ImageAtlas(p,d);for(var a in v){var l=v[a];l instanceof t.SymbolBucket?(o(l.layers,this.zoom,n),t.performSymbolLayout(l,h,e.positions,p,r.iconPositions,this.showCollisionBoxes,this.tileID.canonical)):l.hasPattern&&(l instanceof t.LineBucket||l instanceof t.FillBucket||l instanceof t.FillExtrusionBucket)&&(o(l.layers,this.zoom,n),l.addFeatures(g,this.tileID.canonical,r.patternPositions))}this.status=\"done\",s(null,{buckets:t.values(v).filter((function(t){return!t.isEmpty()})),featureIndex:c,collisionBoxArray:this.collisionBoxArray,glyphAtlasImage:e.image,imageAtlas:r,glyphMap:this.returnDependencies?h:null,iconMap:this.returnDependencies?p:null,glyphPositions:this.returnDependencies?e.positions:null})}}P.length?a.send(\"getImages\",{icons:P,source:this.source,tileID:this.tileID,type:\"patterns\"},(function(t,e){f||(f=t,d=e,O.call(l))})):d={},O.call(this)};var l=function(t,e,r,n){this.actor=t,this.layerIndex=e,this.availableImages=r,this.loadVectorData=n||s,this.loading={},this.loaded={}};l.prototype.loadTile=function(e,r){var n=this,i=e.uid;this.loading||(this.loading={});var o=!!(e&&e.request&&e.request.collectResourceTiming)&&new t.RequestPerformance(e.request),s=this.loading[i]=new a(e);s.abort=this.loadVectorData(e,(function(e,a){if(delete n.loading[i],e||!a)return s.status=\"done\",n.loaded[i]=s,r(e);var l=a.rawData,u={};a.expires&&(u.expires=a.expires),a.cacheControl&&(u.cacheControl=a.cacheControl);var c={};if(o){var f=o.finish();f&&(c.resourceTiming=JSON.parse(JSON.stringify(f)))}s.vectorTile=a.vectorTile,s.parse(a.vectorTile,n.layerIndex,n.availableImages,n.actor,(function(e,n){if(e||!n)return r(e);r(null,t.extend({rawTileData:l.slice(0)},n,u,c))})),n.loaded=n.loaded||{},n.loaded[i]=s}))},l.prototype.reloadTile=function(t,e){var r=this,n=this.loaded,i=t.uid,a=this;if(n&&n[i]){var o=n[i];o.showCollisionBoxes=t.showCollisionBoxes;var s=function(t,n){var i=o.reloadCallback;i&&(delete o.reloadCallback,o.parse(o.vectorTile,a.layerIndex,r.availableImages,a.actor,i)),e(t,n)};\"parsing\"===o.status?o.reloadCallback=s:\"done\"===o.status&&(o.vectorTile?o.parse(o.vectorTile,this.layerIndex,this.availableImages,this.actor,s):s())}},l.prototype.abortTile=function(t,e){var r=this.loading,n=t.uid;r&&r[n]&&r[n].abort&&(r[n].abort(),delete r[n]),e()},l.prototype.removeTile=function(t,e){var r=this.loaded,n=t.uid;r&&r[n]&&delete r[n],e()};var u=t.window.ImageBitmap,c=function(){this.loaded={}};c.prototype.loadTile=function(e,r){var n=e.uid,i=e.encoding,a=e.rawImageData,o=u&&a instanceof u?this.getImageData(a):a,s=new t.DEMData(n,o,i);this.loaded=this.loaded||{},this.loaded[n]=s,r(null,s)},c.prototype.getImageData=function(e){this.offscreenCanvas&&this.offscreenCanvasContext||(this.offscreenCanvas=new OffscreenCanvas(e.width,e.height),this.offscreenCanvasContext=this.offscreenCanvas.getContext(\"2d\")),this.offscreenCanvas.width=e.width,this.offscreenCanvas.height=e.height,this.offscreenCanvasContext.drawImage(e,0,0,e.width,e.height);var r=this.offscreenCanvasContext.getImageData(-1,-1,e.width+2,e.height+2);return this.offscreenCanvasContext.clearRect(0,0,this.offscreenCanvas.width,this.offscreenCanvas.height),new t.RGBAImage({width:r.width,height:r.height},r.data)},c.prototype.removeTile=function(t){var e=this.loaded,r=t.uid;e&&e[r]&&delete e[r]};var f=function t(e,r){var n,i=e&&e.type;if(\"FeatureCollection\"===i)for(n=0;n=0!=!!e&&t.reverse()}var d=t.vectorTile.VectorTileFeature.prototype.toGeoJSON,v=function(e){this._feature=e,this.extent=t.EXTENT,this.type=e.type,this.properties=e.tags,\"id\"in e&&!isNaN(e.id)&&(this.id=parseInt(e.id,10))};v.prototype.loadGeometry=function(){if(1===this._feature.type){for(var e=[],r=0,n=this._feature.geometry;r>31}function P(t,e){for(var r=t.loadGeometry(),n=t.type,i=0,a=0,o=r.length,s=0;s>1;z(t,e,o,n,i,a%2),I(t,e,r,n,o-1,a+1),I(t,e,r,o+1,i,a+1)}}function z(t,e,r,n,i,a){for(;i>n;){if(i-n>600){var o=i-n+1,s=r-n+1,l=Math.log(o),u=.5*Math.exp(2*l/3),c=.5*Math.sqrt(l*u*(o-u)/o)*(s-o/2<0?-1:1);z(t,e,r,Math.max(n,Math.floor(r-s*u/o+c)),Math.min(i,Math.floor(r+(o-s)*u/o+c)),a)}var f=e[2*r+a],h=n,p=i;for(D(t,e,n,r),e[2*i+a]>f&&D(t,e,n,i);hf;)p--}e[2*n+a]===f?D(t,e,n,p):D(t,e,++p,i),p<=r&&(n=p+1),r<=p&&(i=p-1)}}function D(t,e,r,n){R(t,r,n),R(e,2*r,2*n),R(e,2*r+1,2*n+1)}function R(t,e,r){var n=t[e];t[e]=t[r],t[r]=n}function F(t,e,r,n){var i=t-r,a=e-n;return i*i+a*a}_.fromVectorTileJs=w,_.fromGeojsonVt=T,_.GeoJSONWrapper=k;var B=function(t){return t[0]},N=function(t){return t[1]},j=function(t,e,r,n,i){void 0===e&&(e=B),void 0===r&&(r=N),void 0===n&&(n=64),void 0===i&&(i=Float64Array),this.nodeSize=n,this.points=t;for(var a=t.length<65536?Uint16Array:Uint32Array,o=this.ids=new a(t.length),s=this.coords=new i(2*t.length),l=0;l=r&&s<=i&&l>=n&&l<=a&&c.push(t[d]);else{var v=Math.floor((p+h)/2);s=e[2*v],l=e[2*v+1],s>=r&&s<=i&&l>=n&&l<=a&&c.push(t[v]);var g=(f+1)%2;(0===f?r<=s:n<=l)&&(u.push(p),u.push(v-1),u.push(g)),(0===f?i>=s:a>=l)&&(u.push(v+1),u.push(h),u.push(g))}}return c}(this.ids,this.coords,t,e,r,n,this.nodeSize)},j.prototype.within=function(t,e,r){return function(t,e,r,n,i,a){for(var o=[0,t.length-1,0],s=[],l=i*i;o.length;){var u=o.pop(),c=o.pop(),f=o.pop();if(c-f<=a)for(var h=f;h<=c;h++)F(e[2*h],e[2*h+1],r,n)<=l&&s.push(t[h]);else{var p=Math.floor((f+c)/2),d=e[2*p],v=e[2*p+1];F(d,v,r,n)<=l&&s.push(t[p]);var g=(u+1)%2;(0===u?r-i<=d:n-i<=v)&&(o.push(f),o.push(p-1),o.push(g)),(0===u?r+i>=d:n+i>=v)&&(o.push(p+1),o.push(c),o.push(g))}}return s}(this.ids,this.coords,t,e,r,this.nodeSize)};var U={minZoom:0,maxZoom:16,minPoints:2,radius:40,extent:512,nodeSize:64,log:!1,generateId:!1,reduce:null,map:function(t){return t}},V=function(t){this.options=Z(Object.create(U),t),this.trees=new Array(this.options.maxZoom+1)};function q(t,e,r,n,i){return{x:t,y:e,zoom:1/0,id:r,parentId:-1,numPoints:n,properties:i}}function H(t,e){var r=t.geometry.coordinates,n=r[0],i=r[1];return{x:Y(n),y:X(i),zoom:1/0,index:e,parentId:-1}}function G(t){return{type:\"Feature\",id:t.id,properties:W(t),geometry:{type:\"Point\",coordinates:[(n=t.x,360*(n-.5)),(e=t.y,r=(180-360*e)*Math.PI/180,360*Math.atan(Math.exp(r))/Math.PI-90)]}};var e,r,n}function W(t){var e=t.numPoints,r=e>=1e4?Math.round(e/1e3)+\"k\":e>=1e3?Math.round(e/100)/10+\"k\":e;return Z(Z({},t.properties),{cluster:!0,cluster_id:t.id,point_count:e,point_count_abbreviated:r})}function Y(t){return t/360+.5}function X(t){var e=Math.sin(t*Math.PI/180),r=.5-.25*Math.log((1+e)/(1-e))/Math.PI;return r<0?0:r>1?1:r}function Z(t,e){for(var r in e)t[r]=e[r];return t}function K(t){return t.x}function J(t){return t.y}function $(t,e,r,n){for(var i,a=n,o=r-e>>1,s=r-e,l=t[e],u=t[e+1],c=t[r],f=t[r+1],h=e+3;ha)i=h,a=p;else if(p===a){var d=Math.abs(h-o);dn&&(i-e>3&&$(t,e,i,n),t[i+2]=a,r-i>3&&$(t,i,r,n))}function Q(t,e,r,n,i,a){var o=i-r,s=a-n;if(0!==o||0!==s){var l=((t-r)*o+(e-n)*s)/(o*o+s*s);l>1?(r=i,n=a):l>0&&(r+=o*l,n+=s*l)}return(o=t-r)*o+(s=e-n)*s}function tt(t,e,r,n){var i={id:void 0===t?null:t,type:e,geometry:r,tags:n,minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0};return function(t){var e=t.geometry,r=t.type;if(\"Point\"===r||\"MultiPoint\"===r||\"LineString\"===r)et(t,e);else if(\"Polygon\"===r||\"MultiLineString\"===r)for(var n=0;n0&&(o+=n?(i*u-l*a)/2:Math.sqrt(Math.pow(l-i,2)+Math.pow(u-a,2))),i=l,a=u}var c=e.length-3;e[2]=1,$(e,0,c,r),e[c+2]=1,e.size=Math.abs(o),e.start=0,e.end=e.size}function at(t,e,r,n){for(var i=0;i1?1:r}function lt(t,e,r,n,i,a,o,s){if(n/=e,a>=(r/=e)&&o=n)return null;for(var l=[],u=0;u=r&&d=n)){var v=[];if(\"Point\"===h||\"MultiPoint\"===h)ut(f,v,r,n,i);else if(\"LineString\"===h)ct(f,v,r,n,i,!1,s.lineMetrics);else if(\"MultiLineString\"===h)ht(f,v,r,n,i,!1);else if(\"Polygon\"===h)ht(f,v,r,n,i,!0);else if(\"MultiPolygon\"===h)for(var g=0;g=r&&o<=n&&(e.push(t[a]),e.push(t[a+1]),e.push(t[a+2]))}}function ct(t,e,r,n,i,a,o){for(var s,l,u=ft(t),c=0===i?dt:vt,f=t.start,h=0;hr&&(l=c(u,p,d,g,y,r),o&&(u.start=f+s*l)):m>n?x=r&&(l=c(u,p,d,g,y,r),b=!0),x>n&&m<=n&&(l=c(u,p,d,g,y,n),b=!0),!a&&b&&(o&&(u.end=f+s*l),e.push(u),u=ft(t)),o&&(f+=s)}var _=t.length-3;p=t[_],d=t[_+1],v=t[_+2],(m=0===i?p:d)>=r&&m<=n&&pt(u,p,d,v),_=u.length-3,a&&_>=3&&(u[_]!==u[0]||u[_+1]!==u[1])&&pt(u,u[0],u[1],u[2]),u.length&&e.push(u)}function ft(t){var e=[];return e.size=t.size,e.start=t.start,e.end=t.end,e}function ht(t,e,r,n,i,a){for(var o=0;oo.maxX&&(o.maxX=c),f>o.maxY&&(o.maxY=f)}return o}function _t(t,e,r,n){var i=e.geometry,a=e.type,o=[];if(\"Point\"===a||\"MultiPoint\"===a)for(var s=0;s0&&e.size<(i?o:n))r.numPoints+=e.length/3;else{for(var s=[],l=0;lo)&&(r.numSimplified++,s.push(e[l]),s.push(e[l+1])),r.numPoints++;i&&function(t,e){for(var r=0,n=0,i=t.length,a=i-2;n0===e)for(n=0,i=t.length;n24)throw new Error(\"maxZoom should be in the 0-24 range\");if(e.promoteId&&e.generateId)throw new Error(\"promoteId and generateId cannot be used together.\");var n=function(t,e){var r=[];if(\"FeatureCollection\"===t.type)for(var n=0;n=n;u--){var c=+Date.now();s=this._cluster(s,u),this.trees[u]=new j(s,K,J,a,Float32Array),r&&console.log(\"z%d: %d clusters in %dms\",u,s.length,+Date.now()-c)}return r&&console.timeEnd(\"total time\"),this},V.prototype.getClusters=function(t,e){var r=((t[0]+180)%360+360)%360-180,n=Math.max(-90,Math.min(90,t[1])),i=180===t[2]?180:((t[2]+180)%360+360)%360-180,a=Math.max(-90,Math.min(90,t[3]));if(t[2]-t[0]>=360)r=-180,i=180;else if(r>i){var o=this.getClusters([r,n,180,a],e),s=this.getClusters([-180,n,i,a],e);return o.concat(s)}for(var l=this.trees[this._limitZoom(e)],u=[],c=0,f=l.range(Y(r),X(a),Y(i),X(n));ce&&(d+=m.numPoints||1)}if(d>=s){for(var x=c.x*p,b=c.y*p,_=o&&p>1?this._map(c,!0):null,w=(u<<5)+(e+1)+this.points.length,T=0,k=h;T1)for(var E=0,L=h;E>5},V.prototype._getOriginZoom=function(t){return(t-this.points.length)%32},V.prototype._map=function(t,e){if(t.numPoints)return e?Z({},t.properties):t.properties;var r=this.points[t.index].properties,n=this.options.map(r);return e&&n===r?Z({},n):n},Tt.prototype.options={maxZoom:14,indexMaxZoom:5,indexMaxPoints:1e5,tolerance:3,extent:4096,buffer:64,lineMetrics:!1,promoteId:null,generateId:!1,debug:0},Tt.prototype.splitTile=function(t,e,r,n,i,a,o){for(var s=[t,e,r,n],l=this.options,u=l.debug;s.length;){n=s.pop(),r=s.pop(),e=s.pop(),t=s.pop();var c=1<1&&console.time(\"creation\"),h=this.tiles[f]=bt(t,e,r,n,l),this.tileCoords.push({z:e,x:r,y:n}),u)){u>1&&(console.log(\"tile z%d-%d-%d (features: %d, points: %d, simplified: %d)\",e,r,n,h.numFeatures,h.numPoints,h.numSimplified),console.timeEnd(\"creation\"));var p=\"z\"+e;this.stats[p]=(this.stats[p]||0)+1,this.total++}if(h.source=t,i){if(e===l.maxZoom||e===i)continue;var d=1<1&&console.time(\"clipping\");var v,g,y,m,x,b,_=.5*l.buffer/l.extent,w=.5-_,T=.5+_,k=1+_;v=g=y=m=null,x=lt(t,c,r-_,r+T,0,h.minX,h.maxX,l),b=lt(t,c,r+w,r+k,0,h.minX,h.maxX,l),t=null,x&&(v=lt(x,c,n-_,n+T,1,h.minY,h.maxY,l),g=lt(x,c,n+w,n+k,1,h.minY,h.maxY,l),x=null),b&&(y=lt(b,c,n-_,n+T,1,h.minY,h.maxY,l),m=lt(b,c,n+w,n+k,1,h.minY,h.maxY,l),b=null),u>1&&console.timeEnd(\"clipping\"),s.push(v||[],e+1,2*r,2*n),s.push(g||[],e+1,2*r,2*n+1),s.push(y||[],e+1,2*r+1,2*n),s.push(m||[],e+1,2*r+1,2*n+1)}}},Tt.prototype.getTile=function(t,e,r){var n=this.options,i=n.extent,a=n.debug;if(t<0||t>24)return null;var o=1<1&&console.log(\"drilling down to z%d-%d-%d\",t,e,r);for(var l,u=t,c=e,f=r;!l&&u>0;)u--,c=Math.floor(c/2),f=Math.floor(f/2),l=this.tiles[kt(u,c,f)];return l&&l.source?(a>1&&console.log(\"found parent tile z%d-%d-%d\",u,c,f),a>1&&console.time(\"drilling down\"),this.splitTile(l.source,u,c,f,t,e,r),a>1&&console.timeEnd(\"drilling down\"),this.tiles[s]?mt(this.tiles[s],i):null):null};var Mt=function(e){function r(t,r,n,i){e.call(this,t,r,n,At),i&&(this.loadGeoJSON=i)}return e&&(r.__proto__=e),r.prototype=Object.create(e&&e.prototype),r.prototype.constructor=r,r.prototype.loadData=function(t,e){this._pendingCallback&&this._pendingCallback(null,{abandoned:!0}),this._pendingCallback=e,this._pendingLoadDataParams=t,this._state&&\"Idle\"!==this._state?this._state=\"NeedsLoadData\":(this._state=\"Coalescing\",this._loadData())},r.prototype._loadData=function(){var e=this;if(this._pendingCallback&&this._pendingLoadDataParams){var r=this._pendingCallback,n=this._pendingLoadDataParams;delete this._pendingCallback,delete this._pendingLoadDataParams;var i=!!(n&&n.request&&n.request.collectResourceTiming)&&new t.RequestPerformance(n.request);this.loadGeoJSON(n,(function(a,o){if(a||!o)return r(a);if(\"object\"!=typeof o)return r(new Error(\"Input data given to '\"+n.source+\"' is not a valid GeoJSON object.\"));f(o,!0);try{if(n.filter){var s=t.createExpression(n.filter,{type:\"boolean\",\"property-type\":\"data-driven\",overridable:!1,transition:!1});if(\"error\"===s.result)throw new Error(s.value.map((function(t){return t.key+\": \"+t.message})).join(\", \"));var l=o.features.filter((function(t){return s.value.evaluate({zoom:0},t)}));o={type:\"FeatureCollection\",features:l}}e._geoJSONIndex=n.cluster?new V(function(e){var r=e.superclusterOptions,n=e.clusterProperties;if(!n||!r)return r;for(var i={},a={},o={accumulated:null,zoom:0},s={properties:null},l=Object.keys(n),u=0,c=l;u=0?0:e.button},r.remove=function(t){t.parentNode&&t.parentNode.removeChild(t)};var h=function(e){function r(){e.call(this),this.images={},this.updatedImages={},this.callbackDispatchedThisFrame={},this.loaded=!1,this.requestors=[],this.patterns={},this.atlasImage=new t.RGBAImage({width:1,height:1}),this.dirty=!0}return e&&(r.__proto__=e),r.prototype=Object.create(e&&e.prototype),r.prototype.constructor=r,r.prototype.isLoaded=function(){return this.loaded},r.prototype.setLoaded=function(t){if(this.loaded!==t&&(this.loaded=t,t)){for(var e=0,r=this.requestors;e=0?1.2:1))}function y(t,e,r,n,i,a,o){for(var s=0;s65535)e(new Error(\"glyphs > 65535 not supported\"));else if(a.ranges[s])e(null,{stack:r,id:i,glyph:o});else{var l=a.requests[s];l||(l=a.requests[s]=[],x.loadGlyphRange(r,s,n.url,n.requestManager,(function(t,e){if(e){for(var r in e)n._doesCharSupportLocalGlyph(+r)||(a.glyphs[+r]=e[+r]);a.ranges[s]=!0}for(var i=0,o=l;i1&&(l=t[++s]);var c=Math.abs(u-l.left),f=Math.abs(u-l.right),h=Math.min(c,f),p=void 0,d=i/r*(n+1);if(l.isDash){var v=n-Math.abs(d);p=Math.sqrt(h*h+v*v)}else p=n-Math.sqrt(h*h+d*d);this.data[o+u]=Math.max(0,Math.min(255,p+128))}},k.prototype.addRegularDash=function(t){for(var e=t.length-1;e>=0;--e){var r=t[e],n=t[e+1];r.zeroLength?t.splice(e,1):n&&n.isDash===r.isDash&&(n.left=r.left,t.splice(e,1))}var i=t[0],a=t[t.length-1];i.isDash===a.isDash&&(i.left=a.left-this.width,a.right=i.right+this.width);for(var o=this.width*this.nextRow,s=0,l=t[s],u=0;u1&&(l=t[++s]);var c=Math.abs(u-l.left),f=Math.abs(u-l.right),h=Math.min(c,f),p=l.isDash?h:-h;this.data[o+u]=Math.max(0,Math.min(255,p+128))}},k.prototype.addDash=function(e,r){var n=r?7:0,i=2*n+1;if(this.nextRow+i>this.height)return t.warnOnce(\"LineAtlas out of space\"),null;for(var a=0,o=0;o=n&&e.x=i&&e.y0&&(l[new t.OverscaledTileID(e.overscaledZ,a,r.z,i,r.y-1).key]={backfilled:!1},l[new t.OverscaledTileID(e.overscaledZ,e.wrap,r.z,r.x,r.y-1).key]={backfilled:!1},l[new t.OverscaledTileID(e.overscaledZ,s,r.z,o,r.y-1).key]={backfilled:!1}),r.y+10&&(n.resourceTiming=e._resourceTiming,e._resourceTiming=[]),e.fire(new t.Event(\"data\",n))}}))},r.prototype.onAdd=function(t){this.map=t,this.load()},r.prototype.setData=function(e){var r=this;return this._data=e,this.fire(new t.Event(\"dataloading\",{dataType:\"source\"})),this._updateWorkerData((function(e){if(e)r.fire(new t.ErrorEvent(e));else{var n={dataType:\"source\",sourceDataType:\"content\"};r._collectResourceTiming&&r._resourceTiming&&r._resourceTiming.length>0&&(n.resourceTiming=r._resourceTiming,r._resourceTiming=[]),r.fire(new t.Event(\"data\",n))}})),this},r.prototype.getClusterExpansionZoom=function(t,e){return this.actor.send(\"geojson.getClusterExpansionZoom\",{clusterId:t,source:this.id},e),this},r.prototype.getClusterChildren=function(t,e){return this.actor.send(\"geojson.getClusterChildren\",{clusterId:t,source:this.id},e),this},r.prototype.getClusterLeaves=function(t,e,r,n){return this.actor.send(\"geojson.getClusterLeaves\",{source:this.id,clusterId:t,limit:e,offset:r},n),this},r.prototype._updateWorkerData=function(e){var r=this;this._loaded=!1;var n=t.extend({},this.workerOptions),i=this._data;\"string\"==typeof i?(n.request=this.map._requestManager.transformRequest(t.browser.resolveURL(i),t.ResourceType.Source),n.request.collectResourceTiming=this._collectResourceTiming):n.data=JSON.stringify(i),this.actor.send(this.type+\".loadData\",n,(function(t,i){r._removed||i&&i.abandoned||(r._loaded=!0,i&&i.resourceTiming&&i.resourceTiming[r.id]&&(r._resourceTiming=i.resourceTiming[r.id].slice(0)),r.actor.send(r.type+\".coalesce\",{source:n.source},null),e(t))}))},r.prototype.loaded=function(){return this._loaded},r.prototype.loadTile=function(e,r){var n=this,i=e.actor?\"reloadTile\":\"loadTile\";e.actor=this.actor;var a={type:this.type,uid:e.uid,tileID:e.tileID,zoom:e.tileID.overscaledZ,maxZoom:this.maxzoom,tileSize:this.tileSize,source:this.id,pixelRatio:t.browser.devicePixelRatio,showCollisionBoxes:this.map.showCollisionBoxes,promoteId:this.promoteId};e.request=this.actor.send(i,a,(function(t,a){return delete e.request,e.unloadVectorData(),e.aborted?r(null):t?r(t):(e.loadVectorData(a,n.map.painter,\"reloadTile\"===i),r(null))}))},r.prototype.abortTile=function(t){t.request&&(t.request.cancel(),delete t.request),t.aborted=!0},r.prototype.unloadTile=function(t){t.unloadVectorData(),this.actor.send(\"removeTile\",{uid:t.uid,type:this.type,source:this.id})},r.prototype.onRemove=function(){this._removed=!0,this.actor.send(\"removeSource\",{type:this.type,source:this.id})},r.prototype.serialize=function(){return t.extend({},this._options,{type:this.type,data:this._data})},r.prototype.hasTransition=function(){return!1},r}(t.Evented),O=t.createLayout([{name:\"a_pos\",type:\"Int16\",components:2},{name:\"a_texture_pos\",type:\"Int16\",components:2}]),I=function(e){function r(t,r,n,i){e.call(this),this.id=t,this.dispatcher=n,this.coordinates=r.coordinates,this.type=\"image\",this.minzoom=0,this.maxzoom=22,this.tileSize=512,this.tiles={},this._loaded=!1,this.setEventedParent(i),this.options=r}return e&&(r.__proto__=e),r.prototype=Object.create(e&&e.prototype),r.prototype.constructor=r,r.prototype.load=function(e,r){var n=this;this._loaded=!1,this.fire(new t.Event(\"dataloading\",{dataType:\"source\"})),this.url=this.options.url,t.getImage(this.map._requestManager.transformRequest(this.url,t.ResourceType.Image),(function(i,a){n._loaded=!0,i?n.fire(new t.ErrorEvent(i)):a&&(n.image=a,e&&(n.coordinates=e),r&&r(),n._finishLoading())}))},r.prototype.loaded=function(){return this._loaded},r.prototype.updateImage=function(t){var e=this;return this.image&&t.url?(this.options.url=t.url,this.load(t.coordinates,(function(){e.texture=null})),this):this},r.prototype._finishLoading=function(){this.map&&(this.setCoordinates(this.coordinates),this.fire(new t.Event(\"data\",{dataType:\"source\",sourceDataType:\"metadata\"})))},r.prototype.onAdd=function(t){this.map=t,this.load()},r.prototype.setCoordinates=function(e){var r=this;this.coordinates=e;var n=e.map(t.MercatorCoordinate.fromLngLat);this.tileID=function(e){for(var r=1/0,n=1/0,i=-1/0,a=-1/0,o=0,s=e;or.end(0)?this.fire(new t.ErrorEvent(new t.ValidationError(\"sources.\"+this.id,null,\"Playback for this video can be set only between the \"+r.start(0)+\" and \"+r.end(0)+\"-second mark.\"))):this.video.currentTime=e}},r.prototype.getVideo=function(){return this.video},r.prototype.onAdd=function(t){this.map||(this.map=t,this.load(),this.video&&(this.video.play(),this.setCoordinates(this.coordinates)))},r.prototype.prepare=function(){if(!(0===Object.keys(this.tiles).length||this.video.readyState<2)){var e=this.map.painter.context,r=e.gl;for(var n in this.boundsBuffer||(this.boundsBuffer=e.createVertexBuffer(this._boundsArray,O.members)),this.boundsSegments||(this.boundsSegments=t.SegmentVector.simpleSegment(0,0,4,2)),this.texture?this.video.paused||(this.texture.bind(r.LINEAR,r.CLAMP_TO_EDGE),r.texSubImage2D(r.TEXTURE_2D,0,0,0,r.RGBA,r.UNSIGNED_BYTE,this.video)):(this.texture=new t.Texture(e,this.video,r.RGBA),this.texture.bind(r.LINEAR,r.CLAMP_TO_EDGE)),this.tiles){var i=this.tiles[n];\"loaded\"!==i.state&&(i.state=\"loaded\",i.texture=this.texture)}}},r.prototype.serialize=function(){return{type:\"video\",urls:this.urls,coordinates:this.coordinates}},r.prototype.hasTransition=function(){return this.video&&!this.video.paused},r}(I),D=function(e){function r(r,n,i,a){e.call(this,r,n,i,a),n.coordinates?Array.isArray(n.coordinates)&&4===n.coordinates.length&&!n.coordinates.some((function(t){return!Array.isArray(t)||2!==t.length||t.some((function(t){return\"number\"!=typeof t}))}))||this.fire(new t.ErrorEvent(new t.ValidationError(\"sources.\"+r,null,'\"coordinates\" property must be an array of 4 longitude/latitude array pairs'))):this.fire(new t.ErrorEvent(new t.ValidationError(\"sources.\"+r,null,'missing required property \"coordinates\"'))),n.animate&&\"boolean\"!=typeof n.animate&&this.fire(new t.ErrorEvent(new t.ValidationError(\"sources.\"+r,null,'optional \"animate\" property must be a boolean value'))),n.canvas?\"string\"==typeof n.canvas||n.canvas instanceof t.window.HTMLCanvasElement||this.fire(new t.ErrorEvent(new t.ValidationError(\"sources.\"+r,null,'\"canvas\" must be either a string representing the ID of the canvas element from which to read, or an HTMLCanvasElement instance'))):this.fire(new t.ErrorEvent(new t.ValidationError(\"sources.\"+r,null,'missing required property \"canvas\"'))),this.options=n,this.animate=void 0===n.animate||n.animate}return e&&(r.__proto__=e),r.prototype=Object.create(e&&e.prototype),r.prototype.constructor=r,r.prototype.load=function(){this._loaded=!0,this.canvas||(this.canvas=this.options.canvas instanceof t.window.HTMLCanvasElement?this.options.canvas:t.window.document.getElementById(this.options.canvas)),this.width=this.canvas.width,this.height=this.canvas.height,this._hasInvalidDimensions()?this.fire(new t.ErrorEvent(new Error(\"Canvas dimensions cannot be less than or equal to zero.\"))):(this.play=function(){this._playing=!0,this.map.triggerRepaint()},this.pause=function(){this._playing&&(this.prepare(),this._playing=!1)},this._finishLoading())},r.prototype.getCanvas=function(){return this.canvas},r.prototype.onAdd=function(t){this.map=t,this.load(),this.canvas&&this.animate&&this.play()},r.prototype.onRemove=function(){this.pause()},r.prototype.prepare=function(){var e=!1;if(this.canvas.width!==this.width&&(this.width=this.canvas.width,e=!0),this.canvas.height!==this.height&&(this.height=this.canvas.height,e=!0),!this._hasInvalidDimensions()&&0!==Object.keys(this.tiles).length){var r=this.map.painter.context,n=r.gl;for(var i in this.boundsBuffer||(this.boundsBuffer=r.createVertexBuffer(this._boundsArray,O.members)),this.boundsSegments||(this.boundsSegments=t.SegmentVector.simpleSegment(0,0,4,2)),this.texture?(e||this._playing)&&this.texture.update(this.canvas,{premultiply:!0}):this.texture=new t.Texture(r,this.canvas,n.RGBA,{premultiply:!0}),this.tiles){var a=this.tiles[i];\"loaded\"!==a.state&&(a.state=\"loaded\",a.texture=this.texture)}}},r.prototype.serialize=function(){return{type:\"canvas\",coordinates:this.coordinates}},r.prototype.hasTransition=function(){return this._playing},r.prototype._hasInvalidDimensions=function(){for(var t=0,e=[this.canvas.width,this.canvas.height];tthis.max){var o=this._getAndRemoveByKey(this.order[0]);o&&this.onRemove(o)}return this},j.prototype.has=function(t){return t.wrapped().key in this.data},j.prototype.getAndRemove=function(t){return this.has(t)?this._getAndRemoveByKey(t.wrapped().key):null},j.prototype._getAndRemoveByKey=function(t){var e=this.data[t].shift();return e.timeout&&clearTimeout(e.timeout),0===this.data[t].length&&delete this.data[t],this.order.splice(this.order.indexOf(t),1),e.value},j.prototype.getByKey=function(t){var e=this.data[t];return e?e[0].value:null},j.prototype.get=function(t){return this.has(t)?this.data[t.wrapped().key][0].value:null},j.prototype.remove=function(t,e){if(!this.has(t))return this;var r=t.wrapped().key,n=void 0===e?0:this.data[r].indexOf(e),i=this.data[r][n];return this.data[r].splice(n,1),i.timeout&&clearTimeout(i.timeout),0===this.data[r].length&&delete this.data[r],this.onRemove(i.value),this.order.splice(this.order.indexOf(r),1),this},j.prototype.setMaxSize=function(t){for(this.max=t;this.order.length>this.max;){var e=this._getAndRemoveByKey(this.order[0]);e&&this.onRemove(e)}return this},j.prototype.filter=function(t){var e=[];for(var r in this.data)for(var n=0,i=this.data[r];n1||(Math.abs(r)>1&&(1===Math.abs(r+i)?r+=i:1===Math.abs(r-i)&&(r-=i)),e.dem&&t.dem&&(t.dem.backfillBorder(e.dem,r,n),t.neighboringTiles&&t.neighboringTiles[a]&&(t.neighboringTiles[a].backfilled=!0)))}},r.prototype.getTile=function(t){return this.getTileByID(t.key)},r.prototype.getTileByID=function(t){return this._tiles[t]},r.prototype._retainLoadedChildren=function(t,e,r,n){for(var i in this._tiles){var a=this._tiles[i];if(!(n[i]||!a.hasData()||a.tileID.overscaledZ<=e||a.tileID.overscaledZ>r)){for(var o=a.tileID;a&&a.tileID.overscaledZ>e+1;){var s=a.tileID.scaledTo(a.tileID.overscaledZ-1);(a=this._tiles[s.key])&&a.hasData()&&(o=s)}for(var l=o;l.overscaledZ>e;)if(t[(l=l.scaledTo(l.overscaledZ-1)).key]){n[o.key]=o;break}}}},r.prototype.findLoadedParent=function(t,e){if(t.key in this._loadedParentTiles){var r=this._loadedParentTiles[t.key];return r&&r.tileID.overscaledZ>=e?r:null}for(var n=t.overscaledZ-1;n>=e;n--){var i=t.scaledTo(n),a=this._getLoadedTile(i);if(a)return a}},r.prototype._getLoadedTile=function(t){var e=this._tiles[t.key];return e&&e.hasData()?e:this._cache.getByKey(t.wrapped().key)},r.prototype.updateCacheSize=function(t){var e=(Math.ceil(t.width/this._source.tileSize)+1)*(Math.ceil(t.height/this._source.tileSize)+1),r=Math.floor(5*e),n=\"number\"==typeof this._maxTileCacheSize?Math.min(this._maxTileCacheSize,r):r;this._cache.setMaxSize(n)},r.prototype.handleWrapJump=function(t){var e=(t-(void 0===this._prevLng?t:this._prevLng))/360,r=Math.round(e);if(this._prevLng=t,r){var n={};for(var i in this._tiles){var a=this._tiles[i];a.tileID=a.tileID.unwrapTo(a.tileID.wrap+r),n[a.tileID.key]=a}for(var o in this._tiles=n,this._timers)clearTimeout(this._timers[o]),delete this._timers[o];for(var s in this._tiles){var l=this._tiles[s];this._setTileReloadTimer(s,l)}}},r.prototype.update=function(e){var n=this;if(this.transform=e,this._sourceLoaded&&!this._paused){var i;this.updateCacheSize(e),this.handleWrapJump(this.transform.center.lng),this._coveredTiles={},this.used?this._source.tileID?i=e.getVisibleUnwrappedCoordinates(this._source.tileID).map((function(e){return new t.OverscaledTileID(e.canonical.z,e.wrap,e.canonical.z,e.canonical.x,e.canonical.y)})):(i=e.coveringTiles({tileSize:this._source.tileSize,minzoom:this._source.minzoom,maxzoom:this._source.maxzoom,roundZoom:this._source.roundZoom,reparseOverscaled:this._source.reparseOverscaled}),this._source.hasTile&&(i=i.filter((function(t){return n._source.hasTile(t)})))):i=[];var a=e.coveringZoomLevel(this._source),o=Math.max(a-r.maxOverzooming,this._source.minzoom),s=Math.max(a+r.maxUnderzooming,this._source.minzoom),l=this._updateRetainedTiles(i,a);if(zt(this._source.type)){for(var u={},c={},f=0,h=Object.keys(l);fthis._source.maxzoom){var g=d.children(this._source.maxzoom)[0],y=this.getTile(g);if(y&&y.hasData()){n[g.key]=g;continue}}else{var m=d.children(this._source.maxzoom);if(n[m[0].key]&&n[m[1].key]&&n[m[2].key]&&n[m[3].key])continue}for(var x=v.wasRequested(),b=d.overscaledZ-1;b>=a;--b){var _=d.scaledTo(b);if(i[_.key])break;if(i[_.key]=!0,!(v=this.getTile(_))&&x&&(v=this._addTile(_)),v&&(n[_.key]=_,x=v.wasRequested(),v.hasData()))break}}}return n},r.prototype._updateLoadedParentTileCache=function(){for(var t in this._loadedParentTiles={},this._tiles){for(var e=[],r=void 0,n=this._tiles[t].tileID;n.overscaledZ>0;){if(n.key in this._loadedParentTiles){r=this._loadedParentTiles[n.key];break}e.push(n.key);var i=n.scaledTo(n.overscaledZ-1);if(r=this._getLoadedTile(i))break;n=i}for(var a=0,o=e;a0||(e.hasData()&&\"reloading\"!==e.state?this._cache.add(e.tileID,e,e.getExpiryTimeout()):(e.aborted=!0,this._abortTile(e),this._unloadTile(e))))},r.prototype.clearTiles=function(){for(var t in this._shouldReloadOnResume=!1,this._paused=!1,this._tiles)this._removeTile(t);this._cache.reset()},r.prototype.tilesIn=function(e,r,n){var i=this,a=[],o=this.transform;if(!o)return a;for(var s=n?o.getCameraQueryGeometry(e):e,l=e.map((function(t){return o.pointCoordinate(t)})),u=s.map((function(t){return o.pointCoordinate(t)})),c=this.getIds(),f=1/0,h=1/0,p=-1/0,d=-1/0,v=0,g=u;v=0&&y[1].y+g>=0){var m=l.map((function(t){return s.getTilePoint(t)})),x=u.map((function(t){return s.getTilePoint(t)}));a.push({tile:n,tileID:s,queryGeometry:m,cameraQueryGeometry:x,scale:v})}}},x=0;x=t.browser.now())return!0}return!1},r.prototype.setFeatureState=function(t,e,r){t=t||\"_geojsonTileLayer\",this._state.updateState(t,e,r)},r.prototype.removeFeatureState=function(t,e,r){t=t||\"_geojsonTileLayer\",this._state.removeFeatureState(t,e,r)},r.prototype.getFeatureState=function(t,e){return t=t||\"_geojsonTileLayer\",this._state.getState(t,e)},r.prototype.setDependencies=function(t,e,r){var n=this._tiles[t];n&&n.setDependencies(e,r)},r.prototype.reloadTilesForDependencies=function(t,e){for(var r in this._tiles)this._tiles[r].hasDependency(t,e)&&this._reloadTile(r,\"reloading\");this._cache.filter((function(r){return!r.hasDependency(t,e)}))},r}(t.Evented);function It(t,e){var r=Math.abs(2*t.wrap)-+(t.wrap<0),n=Math.abs(2*e.wrap)-+(e.wrap<0);return t.overscaledZ-e.overscaledZ||n-r||e.canonical.y-t.canonical.y||e.canonical.x-t.canonical.x}function zt(t){return\"raster\"===t||\"image\"===t||\"video\"===t}function Dt(){return new t.window.Worker(oa.workerUrl)}Ot.maxOverzooming=10,Ot.maxUnderzooming=3;var Rt=\"mapboxgl_preloaded_worker_pool\",Ft=function(){this.active={}};Ft.prototype.acquire=function(t){if(!this.workers)for(this.workers=[];this.workers.length0?(i-o)/s:0;return this.points[a].mult(1-l).add(this.points[r].mult(l))};var Qt=function(t,e,r){var n=this.boxCells=[],i=this.circleCells=[];this.xCellCount=Math.ceil(t/r),this.yCellCount=Math.ceil(e/r);for(var a=0;a=-e[0]&&r<=e[0]&&n>=-e[1]&&n<=e[1]}function ae(e,r,n,i,a,o,s,l){var u=i?e.textSizeData:e.iconSizeData,c=t.evaluateSizeForZoom(u,n.transform.zoom),f=[256/n.width*2+1,256/n.height*2+1],h=i?e.text.dynamicLayoutVertexArray:e.icon.dynamicLayoutVertexArray;h.clear();for(var p=e.lineVertexArray,d=i?e.text.placedSymbolArray:e.icon.placedSymbolArray,v=n.transform.width/n.transform.height,g=!1,y=0;yMath.abs(n.x-r.x)*i?{useVertical:!0}:(e===t.WritingMode.vertical?r.yn.x)?{needsFlipping:!0}:null}function le(e,r,n,i,a,o,s,l,u,c,f,h,p,d){var v,g=r/24,y=e.lineOffsetX*g,m=e.lineOffsetY*g;if(e.numGlyphs>1){var x=e.glyphStartIndex+e.numGlyphs,b=e.lineStartIndex,_=e.lineStartIndex+e.lineLength,w=oe(g,l,y,m,n,f,h,e,u,o,p);if(!w)return{notEnoughRoom:!0};var T=re(w.first.point,s).point,k=re(w.last.point,s).point;if(i&&!n){var A=se(e.writingMode,T,k,d);if(A)return A}v=[w.first];for(var M=e.glyphStartIndex+1;M0?C.point:ue(h,L,S,1,a),O=se(e.writingMode,S,P,d);if(O)return O}var I=ce(g*l.getoffsetX(e.glyphStartIndex),y,m,n,f,h,e.segment,e.lineStartIndex,e.lineStartIndex+e.lineLength,u,o,p);if(!I)return{notEnoughRoom:!0};v=[I]}for(var z=0,D=v;z0?1:-1,v=0;i&&(d*=-1,v=Math.PI),d<0&&(v+=Math.PI);for(var g=d>0?l+s:l+s+1,y=a,m=a,x=0,b=0,_=Math.abs(p),w=[];x+b<=_;){if((g+=d)=u)return null;if(m=y,w.push(y),void 0===(y=h[g])){var T=new t.Point(c.getx(g),c.gety(g)),k=re(T,f);if(k.signedDistanceFromCamera>0)y=h[g]=k.point;else{var A=g-d;y=ue(0===x?o:new t.Point(c.getx(A),c.gety(A)),T,m,_-x+1,f)}}x+=b,b=m.dist(y)}var M=(_-x)/b,S=y.sub(m),E=S.mult(M)._add(m);E._add(S._unit()._perp()._mult(n*d));var L=v+Math.atan2(y.y-m.y,y.x-m.x);return w.push(E),{point:E,angle:L,path:w}}Qt.prototype.keysLength=function(){return this.boxKeys.length+this.circleKeys.length},Qt.prototype.insert=function(t,e,r,n,i){this._forEachCell(e,r,n,i,this._insertBoxCell,this.boxUid++),this.boxKeys.push(t),this.bboxes.push(e),this.bboxes.push(r),this.bboxes.push(n),this.bboxes.push(i)},Qt.prototype.insertCircle=function(t,e,r,n){this._forEachCell(e-n,r-n,e+n,r+n,this._insertCircleCell,this.circleUid++),this.circleKeys.push(t),this.circles.push(e),this.circles.push(r),this.circles.push(n)},Qt.prototype._insertBoxCell=function(t,e,r,n,i,a){this.boxCells[i].push(a)},Qt.prototype._insertCircleCell=function(t,e,r,n,i,a){this.circleCells[i].push(a)},Qt.prototype._query=function(t,e,r,n,i,a){if(r<0||t>this.width||n<0||e>this.height)return!i&&[];var o=[];if(t<=0&&e<=0&&this.width<=r&&this.height<=n){if(i)return!0;for(var s=0;s0:o},Qt.prototype._queryCircle=function(t,e,r,n,i){var a=t-r,o=t+r,s=e-r,l=e+r;if(o<0||a>this.width||l<0||s>this.height)return!n&&[];var u=[],c={hitTest:n,circle:{x:t,y:e,radius:r},seenUids:{box:{},circle:{}}};return this._forEachCell(a,s,o,l,this._queryCellCircle,u,c,i),n?u.length>0:u},Qt.prototype.query=function(t,e,r,n,i){return this._query(t,e,r,n,!1,i)},Qt.prototype.hitTest=function(t,e,r,n,i){return this._query(t,e,r,n,!0,i)},Qt.prototype.hitTestCircle=function(t,e,r,n){return this._queryCircle(t,e,r,!0,n)},Qt.prototype._queryCell=function(t,e,r,n,i,a,o,s){var l=o.seenUids,u=this.boxCells[i];if(null!==u)for(var c=this.bboxes,f=0,h=u;f=c[d+0]&&n>=c[d+1]&&(!s||s(this.boxKeys[p]))){if(o.hitTest)return a.push(!0),!0;a.push({key:this.boxKeys[p],x1:c[d],y1:c[d+1],x2:c[d+2],y2:c[d+3]})}}}var v=this.circleCells[i];if(null!==v)for(var g=this.circles,y=0,m=v;yo*o+s*s},Qt.prototype._circleAndRectCollide=function(t,e,r,n,i,a,o){var s=(a-n)/2,l=Math.abs(t-(n+s));if(l>s+r)return!1;var u=(o-i)/2,c=Math.abs(e-(i+u));if(c>u+r)return!1;if(l<=s||c<=u)return!0;var f=l-s,h=c-u;return f*f+h*h<=r*r};var fe=new Float32Array([-1/0,-1/0,0,-1/0,-1/0,0,-1/0,-1/0,0,-1/0,-1/0,0]);function he(t,e){for(var r=0;r=1;P--)C.push(E.path[P]);for(var O=1;O0){for(var R=C[0].clone(),F=C[0].clone(),B=1;B=A.x&&F.x<=M.x&&R.y>=A.y&&F.y<=M.y?[C]:F.xM.x||F.yM.y?[]:t.clipLine([C],A.x,A.y,M.x,M.y)}for(var N=0,j=D;N=this.screenRightBoundary||nthis.screenBottomBoundary},ve.prototype.isInsideGrid=function(t,e,r,n){return r>=0&&t=0&&e0?(this.prevPlacement&&this.prevPlacement.variableOffsets[f.crossTileID]&&this.prevPlacement.placements[f.crossTileID]&&this.prevPlacement.placements[f.crossTileID].text&&(v=this.prevPlacement.variableOffsets[f.crossTileID].anchor),this.variableOffsets[f.crossTileID]={textOffset:g,width:r,height:n,anchor:t,textBoxScale:i,prevAnchor:v},this.markUsedJustification(h,t,f,p),h.allowVerticalPlacement&&(this.markUsedOrientation(h,p,f),this.placedOrientations[f.crossTileID]=p),{shift:y,placedGlyphBoxes:m}):void 0},Ae.prototype.placeLayerBucketPart=function(e,r,n){var i=this,a=e.parameters,o=a.bucket,s=a.layout,l=a.posMatrix,u=a.textLabelPlaneMatrix,c=a.labelToScreenMatrix,f=a.textPixelRatio,h=a.holdingForFade,p=a.collisionBoxArray,d=a.partiallyEvaluatedTextSize,v=a.collisionGroup,g=s.get(\"text-optional\"),y=s.get(\"icon-optional\"),m=s.get(\"text-allow-overlap\"),x=s.get(\"icon-allow-overlap\"),b=\"map\"===s.get(\"text-rotation-alignment\"),_=\"map\"===s.get(\"text-pitch-alignment\"),w=\"none\"!==s.get(\"icon-text-fit\"),T=\"viewport-y\"===s.get(\"symbol-z-order\"),k=m&&(x||!o.hasIconData()||y),A=x&&(m||!o.hasTextData()||g);!o.collisionArrays&&p&&o.deserializeCollisionBoxes(p);var M=function(e,a){if(!r[e.crossTileID])if(h)i.placements[e.crossTileID]=new xe(!1,!1,!1);else{var p,T=!1,M=!1,S=!0,E=null,L={box:null,offscreen:null},C={box:null,offscreen:null},P=null,O=null,I=0,z=0,D=0;a.textFeatureIndex?I=a.textFeatureIndex:e.useRuntimeCollisionCircles&&(I=e.featureIndex),a.verticalTextFeatureIndex&&(z=a.verticalTextFeatureIndex);var R=a.textBox;if(R){var F=function(r){var n=t.WritingMode.horizontal;if(o.allowVerticalPlacement&&!r&&i.prevPlacement){var a=i.prevPlacement.placedOrientations[e.crossTileID];a&&(i.placedOrientations[e.crossTileID]=a,n=a,i.markUsedOrientation(o,n,e))}return n},B=function(r,n){if(o.allowVerticalPlacement&&e.numVerticalGlyphVertices>0&&a.verticalTextBox)for(var i=0,s=o.writingModes;i0&&(N=N.filter((function(t){return t!==j.anchor}))).unshift(j.anchor)}var U=function(t,r,n){for(var a=t.x2-t.x1,s=t.y2-t.y1,u=e.textBoxScale,c=w&&!x?r:null,h={box:[],offscreen:!1},p=m?2*N.length:N.length,d=0;d=N.length,k=i.attemptAnchorPlacement(g,t,a,s,u,b,_,f,l,v,y,e,o,n,c);if(k&&(h=k.placedGlyphBoxes)&&h.box&&h.box.length){T=!0,E=k.shift;break}}return h};B((function(){return U(R,a.iconBox,t.WritingMode.horizontal)}),(function(){var r=a.verticalTextBox,n=L&&L.box&&L.box.length;return o.allowVerticalPlacement&&!n&&e.numVerticalGlyphVertices>0&&r?U(r,a.verticalIconBox,t.WritingMode.vertical):{box:null,offscreen:null}})),L&&(T=L.box,S=L.offscreen);var V=F(L&&L.box);if(!T&&i.prevPlacement){var q=i.prevPlacement.variableOffsets[e.crossTileID];q&&(i.variableOffsets[e.crossTileID]=q,i.markUsedJustification(o,q.anchor,e,V))}}else{var H=function(t,r){var n=i.collisionIndex.placeCollisionBox(t,m,f,l,v.predicate);return n&&n.box&&n.box.length&&(i.markUsedOrientation(o,r,e),i.placedOrientations[e.crossTileID]=r),n};B((function(){return H(R,t.WritingMode.horizontal)}),(function(){var r=a.verticalTextBox;return o.allowVerticalPlacement&&e.numVerticalGlyphVertices>0&&r?H(r,t.WritingMode.vertical):{box:null,offscreen:null}})),F(L&&L.box&&L.box.length)}}if(T=(p=L)&&p.box&&p.box.length>0,S=p&&p.offscreen,e.useRuntimeCollisionCircles){var G=o.text.placedSymbolArray.get(e.centerJustifiedTextSymbolIndex),W=t.evaluateSizeForFeature(o.textSizeData,d,G),Y=s.get(\"text-padding\"),X=e.collisionCircleDiameter;P=i.collisionIndex.placeCollisionCircles(m,G,o.lineVertexArray,o.glyphOffsetArray,W,l,u,c,n,_,v.predicate,X,Y),T=m||P.circles.length>0&&!P.collisionDetected,S=S&&P.offscreen}if(a.iconFeatureIndex&&(D=a.iconFeatureIndex),a.iconBox){var Z=function(t){var e=w&&E?ke(t,E.x,E.y,b,_,i.transform.angle):t;return i.collisionIndex.placeCollisionBox(e,x,f,l,v.predicate)};M=C&&C.box&&C.box.length&&a.verticalIconBox?(O=Z(a.verticalIconBox)).box.length>0:(O=Z(a.iconBox)).box.length>0,S=S&&O.offscreen}var K=g||0===e.numHorizontalGlyphVertices&&0===e.numVerticalGlyphVertices,J=y||0===e.numIconVertices;if(K||J?J?K||(M=M&&T):T=M&&T:M=T=M&&T,T&&p&&p.box&&(C&&C.box&&z?i.collisionIndex.insertCollisionBox(p.box,s.get(\"text-ignore-placement\"),o.bucketInstanceId,z,v.ID):i.collisionIndex.insertCollisionBox(p.box,s.get(\"text-ignore-placement\"),o.bucketInstanceId,I,v.ID)),M&&O&&i.collisionIndex.insertCollisionBox(O.box,s.get(\"icon-ignore-placement\"),o.bucketInstanceId,D,v.ID),P&&(T&&i.collisionIndex.insertCollisionCircles(P.circles,s.get(\"text-ignore-placement\"),o.bucketInstanceId,I,v.ID),n)){var $=o.bucketInstanceId,Q=i.collisionCircleArrays[$];void 0===Q&&(Q=i.collisionCircleArrays[$]=new be);for(var tt=0;tt=0;--E){var L=S[E];M(o.symbolInstances.get(L),o.collisionArrays[L])}else for(var C=e.symbolInstanceStart;C=0&&(e.text.placedSymbolArray.get(u).crossTileID=a>=0&&u!==a?0:n.crossTileID)}},Ae.prototype.markUsedOrientation=function(e,r,n){for(var i=r===t.WritingMode.horizontal||r===t.WritingMode.horizontalOnly?r:0,a=r===t.WritingMode.vertical?r:0,o=0,s=[n.leftJustifiedTextSymbolIndex,n.centerJustifiedTextSymbolIndex,n.rightJustifiedTextSymbolIndex];o0||l>0,x=a.numIconVertices>0,b=i.placedOrientations[a.crossTileID],_=b===t.WritingMode.vertical,w=b===t.WritingMode.horizontal||b===t.WritingMode.horizontalOnly;if(m){var T=ze(y.text),k=_?De:T;d(e.text,s,k);var A=w?De:T;d(e.text,l,A);var M=y.text.isHidden();[a.rightJustifiedTextSymbolIndex,a.centerJustifiedTextSymbolIndex,a.leftJustifiedTextSymbolIndex].forEach((function(t){t>=0&&(e.text.placedSymbolArray.get(t).hidden=M||_?1:0)})),a.verticalPlacedTextSymbolIndex>=0&&(e.text.placedSymbolArray.get(a.verticalPlacedTextSymbolIndex).hidden=M||w?1:0);var S=i.variableOffsets[a.crossTileID];S&&i.markUsedJustification(e,S.anchor,a,b);var E=i.placedOrientations[a.crossTileID];E&&(i.markUsedJustification(e,\"left\",a,E),i.markUsedOrientation(e,E,a))}if(x){var L=ze(y.icon),C=!(h&&a.verticalPlacedIconSymbolIndex&&_);if(a.placedIconSymbolIndex>=0){var P=C?L:De;d(e.icon,a.numIconVertices,P),e.icon.placedSymbolArray.get(a.placedIconSymbolIndex).hidden=y.icon.isHidden()}if(a.verticalPlacedIconSymbolIndex>=0){var O=C?De:L;d(e.icon,a.numVerticalIconVertices,O),e.icon.placedSymbolArray.get(a.verticalPlacedIconSymbolIndex).hidden=y.icon.isHidden()}}if(e.hasIconCollisionBoxData()||e.hasTextCollisionBoxData()){var I=e.collisionArrays[n];if(I){var z=new t.Point(0,0);if(I.textBox||I.verticalTextBox){var D=!0;if(u){var R=i.variableOffsets[v];R?(z=Te(R.anchor,R.width,R.height,R.textOffset,R.textBoxScale),c&&z._rotate(f?i.transform.angle:-i.transform.angle)):D=!1}I.textBox&&Me(e.textCollisionBox.collisionVertexArray,y.text.placed,!D||_,z.x,z.y),I.verticalTextBox&&Me(e.textCollisionBox.collisionVertexArray,y.text.placed,!D||w,z.x,z.y)}var F=Boolean(!w&&I.verticalIconBox);I.iconBox&&Me(e.iconCollisionBox.collisionVertexArray,y.icon.placed,F,h?z.x:0,h?z.y:0),I.verticalIconBox&&Me(e.iconCollisionBox.collisionVertexArray,y.icon.placed,!F,h?z.x:0,h?z.y:0)}}},g=0;gt},Ae.prototype.setStale=function(){this.stale=!0};var Se=Math.pow(2,25),Ee=Math.pow(2,24),Le=Math.pow(2,17),Ce=Math.pow(2,16),Pe=Math.pow(2,9),Oe=Math.pow(2,8),Ie=Math.pow(2,1);function ze(t){if(0===t.opacity&&!t.placed)return 0;if(1===t.opacity&&t.placed)return 4294967295;var e=t.placed?1:0,r=Math.floor(127*t.opacity);return r*Se+e*Ee+r*Le+e*Ce+r*Pe+e*Oe+r*Ie+e}var De=0,Re=function(t){this._sortAcrossTiles=\"viewport-y\"!==t.layout.get(\"symbol-z-order\")&&void 0!==t.layout.get(\"symbol-sort-key\").constantOr(1),this._currentTileIndex=0,this._currentPartIndex=0,this._seenCrossTileIDs={},this._bucketParts=[]};Re.prototype.continuePlacement=function(t,e,r,n,i){for(var a=this._bucketParts;this._currentTileIndex2};this._currentPlacementIndex>=0;){var s=r[e[this._currentPlacementIndex]],l=this.placement.collisionIndex.transform.zoom;if(\"symbol\"===s.type&&(!s.minzoom||s.minzoom<=l)&&(!s.maxzoom||s.maxzoom>l)){if(this._inProgressLayer||(this._inProgressLayer=new Re(s)),this._inProgressLayer.continuePlacement(n[s.source],this.placement,this._showCollisionBoxes,s,o))return;delete this._inProgressLayer}this._currentPlacementIndex--}this._done=!0},Fe.prototype.commit=function(t){return this.placement.commit(t),this.placement};var Be=512/t.EXTENT/2,Ne=function(t,e,r){this.tileID=t,this.indexedSymbolInstances={},this.bucketInstanceId=r;for(var n=0;nt.overscaledZ)for(var s in o){var l=o[s];l.tileID.isChildOf(t)&&l.findMatches(e.symbolInstances,t,i)}else{var u=o[t.scaledTo(Number(a)).key];u&&u.findMatches(e.symbolInstances,t,i)}}for(var c=0;c1?\"@2x\":\"\",l=t.getJSON(r.transformRequest(r.normalizeSpriteURL(e,s,\".json\"),t.ResourceType.SpriteJSON),(function(t,e){l=null,o||(o=t,i=e,c())})),u=t.getImage(r.transformRequest(r.normalizeSpriteURL(e,s,\".png\"),t.ResourceType.SpriteImage),(function(t,e){u=null,o||(o=t,a=e,c())}));function c(){if(o)n(o);else if(i&&a){var e=t.browser.getImageData(a),r={};for(var s in i){var l=i[s],u=l.width,c=l.height,f=l.x,h=l.y,p=l.sdf,d=l.pixelRatio,v=l.stretchX,g=l.stretchY,y=l.content,m=new t.RGBAImage({width:u,height:c});t.RGBAImage.copy(e,m,{x:f,y:h},{x:0,y:0},{width:u,height:c}),r[s]={data:m,pixelRatio:d,sdf:p,stretchX:v,stretchY:g,content:y}}n(null,r)}}return{cancel:function(){l&&(l.cancel(),l=null),u&&(u.cancel(),u=null)}}}(e,this.map._requestManager,(function(e,n){if(r._spriteRequest=null,e)r.fire(new t.ErrorEvent(e));else if(n)for(var i in n)r.imageManager.addImage(i,n[i]);r.imageManager.setLoaded(!0),r._availableImages=r.imageManager.listImages(),r.dispatcher.broadcast(\"setImages\",r._availableImages),r.fire(new t.Event(\"data\",{dataType:\"style\"}))}))},r.prototype._validateLayer=function(e){var r=this.sourceCaches[e.source];if(r){var n=e.sourceLayer;if(n){var i=r.getSource();(\"geojson\"===i.type||i.vectorLayerIds&&-1===i.vectorLayerIds.indexOf(n))&&this.fire(new t.ErrorEvent(new Error('Source layer \"'+n+'\" does not exist on source \"'+i.id+'\" as specified by style layer \"'+e.id+'\"')))}}},r.prototype.loaded=function(){if(!this._loaded)return!1;if(Object.keys(this._updatedSources).length)return!1;for(var t in this.sourceCaches)if(!this.sourceCaches[t].loaded())return!1;return!!this.imageManager.isLoaded()},r.prototype._serializeLayers=function(t){for(var e=[],r=0,n=t;r0)throw new Error(\"Unimplemented: \"+i.map((function(t){return t.command})).join(\", \")+\".\");return n.forEach((function(t){\"setTransition\"!==t.command&&r[t.command].apply(r,t.args)})),this.stylesheet=e,!0},r.prototype.addImage=function(e,r){if(this.getImage(e))return this.fire(new t.ErrorEvent(new Error(\"An image with this name already exists.\")));this.imageManager.addImage(e,r),this._afterImageUpdated(e)},r.prototype.updateImage=function(t,e){this.imageManager.updateImage(t,e)},r.prototype.getImage=function(t){return this.imageManager.getImage(t)},r.prototype.removeImage=function(e){if(!this.getImage(e))return this.fire(new t.ErrorEvent(new Error(\"No image with this name exists.\")));this.imageManager.removeImage(e),this._afterImageUpdated(e)},r.prototype._afterImageUpdated=function(e){this._availableImages=this.imageManager.listImages(),this._changedImages[e]=!0,this._changed=!0,this.dispatcher.broadcast(\"setImages\",this._availableImages),this.fire(new t.Event(\"data\",{dataType:\"style\"}))},r.prototype.listImages=function(){return this._checkLoaded(),this.imageManager.listImages()},r.prototype.addSource=function(e,r,n){var i=this;if(void 0===n&&(n={}),this._checkLoaded(),void 0!==this.sourceCaches[e])throw new Error(\"There is already a source with this ID\");if(!r.type)throw new Error(\"The type property must be defined, but only the following properties were given: \"+Object.keys(r).join(\", \")+\".\");if(!([\"vector\",\"raster\",\"geojson\",\"video\",\"image\"].indexOf(r.type)>=0&&this._validate(t.validateStyle.source,\"sources.\"+e,r,null,n))){this.map&&this.map._collectResourceTiming&&(r.collectResourceTiming=!0);var a=this.sourceCaches[e]=new Ot(e,r,this.dispatcher);a.style=this,a.setEventedParent(this,(function(){return{isSourceLoaded:i.loaded(),source:a.serialize(),sourceId:e}})),a.onAdd(this.map),this._changed=!0}},r.prototype.removeSource=function(e){if(this._checkLoaded(),void 0===this.sourceCaches[e])throw new Error(\"There is no source with this ID\");for(var r in this._layers)if(this._layers[r].source===e)return this.fire(new t.ErrorEvent(new Error('Source \"'+e+'\" cannot be removed while layer \"'+r+'\" is using it.')));var n=this.sourceCaches[e];delete this.sourceCaches[e],delete this._updatedSources[e],n.fire(new t.Event(\"data\",{sourceDataType:\"metadata\",dataType:\"source\",sourceId:e})),n.setEventedParent(null),n.clearTiles(),n.onRemove&&n.onRemove(this.map),this._changed=!0},r.prototype.setGeoJSONSourceData=function(t,e){this._checkLoaded(),this.sourceCaches[t].getSource().setData(e),this._changed=!0},r.prototype.getSource=function(t){return this.sourceCaches[t]&&this.sourceCaches[t].getSource()},r.prototype.addLayer=function(e,r,n){void 0===n&&(n={}),this._checkLoaded();var i=e.id;if(this.getLayer(i))this.fire(new t.ErrorEvent(new Error('Layer with id \"'+i+'\" already exists on this map')));else{var a;if(\"custom\"===e.type){if(qe(this,t.validateCustomStyleLayer(e)))return;a=t.createStyleLayer(e)}else{if(\"object\"==typeof e.source&&(this.addSource(i,e.source),e=t.clone$1(e),e=t.extend(e,{source:i})),this._validate(t.validateStyle.layer,\"layers.\"+i,e,{arrayIndex:-1},n))return;a=t.createStyleLayer(e),this._validateLayer(a),a.setEventedParent(this,{layer:{id:i}}),this._serializedLayers[a.id]=a.serialize()}var o=r?this._order.indexOf(r):this._order.length;if(r&&-1===o)this.fire(new t.ErrorEvent(new Error('Layer with id \"'+r+'\" does not exist on this map.')));else{if(this._order.splice(o,0,i),this._layerOrderChanged=!0,this._layers[i]=a,this._removedLayers[i]&&a.source&&\"custom\"!==a.type){var s=this._removedLayers[i];delete this._removedLayers[i],s.type!==a.type?this._updatedSources[a.source]=\"clear\":(this._updatedSources[a.source]=\"reload\",this.sourceCaches[a.source].pause())}this._updateLayer(a),a.onAdd&&a.onAdd(this.map)}}},r.prototype.moveLayer=function(e,r){if(this._checkLoaded(),this._changed=!0,this._layers[e]){if(e!==r){var n=this._order.indexOf(e);this._order.splice(n,1);var i=r?this._order.indexOf(r):this._order.length;r&&-1===i?this.fire(new t.ErrorEvent(new Error('Layer with id \"'+r+'\" does not exist on this map.'))):(this._order.splice(i,0,e),this._layerOrderChanged=!0)}}else this.fire(new t.ErrorEvent(new Error(\"The layer '\"+e+\"' does not exist in the map's style and cannot be moved.\")))},r.prototype.removeLayer=function(e){this._checkLoaded();var r=this._layers[e];if(r){r.setEventedParent(null);var n=this._order.indexOf(e);this._order.splice(n,1),this._layerOrderChanged=!0,this._changed=!0,this._removedLayers[e]=r,delete this._layers[e],delete this._serializedLayers[e],delete this._updatedLayers[e],delete this._updatedPaintProps[e],r.onRemove&&r.onRemove(this.map)}else this.fire(new t.ErrorEvent(new Error(\"The layer '\"+e+\"' does not exist in the map's style and cannot be removed.\")))},r.prototype.getLayer=function(t){return this._layers[t]},r.prototype.hasLayer=function(t){return t in this._layers},r.prototype.setLayerZoomRange=function(e,r,n){this._checkLoaded();var i=this.getLayer(e);i?i.minzoom===r&&i.maxzoom===n||(null!=r&&(i.minzoom=r),null!=n&&(i.maxzoom=n),this._updateLayer(i)):this.fire(new t.ErrorEvent(new Error(\"The layer '\"+e+\"' does not exist in the map's style and cannot have zoom extent.\")))},r.prototype.setFilter=function(e,r,n){void 0===n&&(n={}),this._checkLoaded();var i=this.getLayer(e);if(i){if(!t.deepEqual(i.filter,r))return null==r?(i.filter=void 0,void this._updateLayer(i)):void(this._validate(t.validateStyle.filter,\"layers.\"+i.id+\".filter\",r,null,n)||(i.filter=t.clone$1(r),this._updateLayer(i)))}else this.fire(new t.ErrorEvent(new Error(\"The layer '\"+e+\"' does not exist in the map's style and cannot be filtered.\")))},r.prototype.getFilter=function(e){return t.clone$1(this.getLayer(e).filter)},r.prototype.setLayoutProperty=function(e,r,n,i){void 0===i&&(i={}),this._checkLoaded();var a=this.getLayer(e);a?t.deepEqual(a.getLayoutProperty(r),n)||(a.setLayoutProperty(r,n,i),this._updateLayer(a)):this.fire(new t.ErrorEvent(new Error(\"The layer '\"+e+\"' does not exist in the map's style and cannot be styled.\")))},r.prototype.getLayoutProperty=function(e,r){var n=this.getLayer(e);if(n)return n.getLayoutProperty(r);this.fire(new t.ErrorEvent(new Error(\"The layer '\"+e+\"' does not exist in the map's style.\")))},r.prototype.setPaintProperty=function(e,r,n,i){void 0===i&&(i={}),this._checkLoaded();var a=this.getLayer(e);a?t.deepEqual(a.getPaintProperty(r),n)||(a.setPaintProperty(r,n,i)&&this._updateLayer(a),this._changed=!0,this._updatedPaintProps[e]=!0):this.fire(new t.ErrorEvent(new Error(\"The layer '\"+e+\"' does not exist in the map's style and cannot be styled.\")))},r.prototype.getPaintProperty=function(t,e){return this.getLayer(t).getPaintProperty(e)},r.prototype.setFeatureState=function(e,r){this._checkLoaded();var n=e.source,i=e.sourceLayer,a=this.sourceCaches[n];if(void 0!==a){var o=a.getSource().type;\"geojson\"===o&&i?this.fire(new t.ErrorEvent(new Error(\"GeoJSON sources cannot have a sourceLayer parameter.\"))):\"vector\"!==o||i?(void 0===e.id&&this.fire(new t.ErrorEvent(new Error(\"The feature id parameter must be provided.\"))),a.setFeatureState(i,e.id,r)):this.fire(new t.ErrorEvent(new Error(\"The sourceLayer parameter must be provided for vector source types.\")))}else this.fire(new t.ErrorEvent(new Error(\"The source '\"+n+\"' does not exist in the map's style.\")))},r.prototype.removeFeatureState=function(e,r){this._checkLoaded();var n=e.source,i=this.sourceCaches[n];if(void 0!==i){var a=i.getSource().type,o=\"vector\"===a?e.sourceLayer:void 0;\"vector\"!==a||o?r&&\"string\"!=typeof e.id&&\"number\"!=typeof e.id?this.fire(new t.ErrorEvent(new Error(\"A feature id is required to remove its specific state property.\"))):i.removeFeatureState(o,e.id,r):this.fire(new t.ErrorEvent(new Error(\"The sourceLayer parameter must be provided for vector source types.\")))}else this.fire(new t.ErrorEvent(new Error(\"The source '\"+n+\"' does not exist in the map's style.\")))},r.prototype.getFeatureState=function(e){this._checkLoaded();var r=e.source,n=e.sourceLayer,i=this.sourceCaches[r];if(void 0!==i){if(\"vector\"!==i.getSource().type||n)return void 0===e.id&&this.fire(new t.ErrorEvent(new Error(\"The feature id parameter must be provided.\"))),i.getFeatureState(n,e.id);this.fire(new t.ErrorEvent(new Error(\"The sourceLayer parameter must be provided for vector source types.\")))}else this.fire(new t.ErrorEvent(new Error(\"The source '\"+r+\"' does not exist in the map's style.\")))},r.prototype.getTransition=function(){return t.extend({duration:300,delay:0},this.stylesheet&&this.stylesheet.transition)},r.prototype.serialize=function(){return t.filterObject({version:this.stylesheet.version,name:this.stylesheet.name,metadata:this.stylesheet.metadata,light:this.stylesheet.light,center:this.stylesheet.center,zoom:this.stylesheet.zoom,bearing:this.stylesheet.bearing,pitch:this.stylesheet.pitch,sprite:this.stylesheet.sprite,glyphs:this.stylesheet.glyphs,transition:this.stylesheet.transition,sources:t.mapObject(this.sourceCaches,(function(t){return t.serialize()})),layers:this._serializeLayers(this._order)},(function(t){return void 0!==t}))},r.prototype._updateLayer=function(t){this._updatedLayers[t.id]=!0,t.source&&!this._updatedSources[t.source]&&\"raster\"!==this.sourceCaches[t.source].getSource().type&&(this._updatedSources[t.source]=\"reload\",this.sourceCaches[t.source].pause()),this._changed=!0},r.prototype._flattenAndSortRenderedFeatures=function(t){for(var e=this,r=function(t){return\"fill-extrusion\"===e._layers[t].type},n={},i=[],a=this._order.length-1;a>=0;a--){var o=this._order[a];if(r(o)){n[o]=a;for(var s=0,l=t;s=0;d--){var v=this._order[d];if(r(v))for(var g=i.length-1;g>=0;g--){var y=i[g].feature;if(n[y.layer.id] 0.5) {gl_FragColor=vec4(0.0,0.0,1.0,0.5)*alpha;}if (v_notUsed > 0.5) {gl_FragColor*=.1;}}\",\"attribute vec2 a_pos;attribute vec2 a_anchor_pos;attribute vec2 a_extrude;attribute vec2 a_placed;attribute vec2 a_shift;uniform mat4 u_matrix;uniform vec2 u_extrude_scale;uniform float u_camera_to_center_distance;varying float v_placed;varying float v_notUsed;void main() {vec4 projectedPoint=u_matrix*vec4(a_anchor_pos,0,1);highp float camera_to_anchor_distance=projectedPoint.w;highp float collision_perspective_ratio=clamp(0.5+0.5*(u_camera_to_center_distance/camera_to_anchor_distance),0.0,4.0);gl_Position=u_matrix*vec4(a_pos,0.0,1.0);gl_Position.xy+=(a_extrude+a_shift)*u_extrude_scale*gl_Position.w*collision_perspective_ratio;v_placed=a_placed.x;v_notUsed=a_placed.y;}\"),nr=_r(\"varying float v_radius;varying vec2 v_extrude;varying float v_perspective_ratio;varying float v_collision;void main() {float alpha=0.5*min(v_perspective_ratio,1.0);float stroke_radius=0.9*max(v_perspective_ratio,1.0);float distance_to_center=length(v_extrude);float distance_to_edge=abs(distance_to_center-v_radius);float opacity_t=smoothstep(-stroke_radius,0.0,-distance_to_edge);vec4 color=mix(vec4(0.0,0.0,1.0,0.5),vec4(1.0,0.0,0.0,1.0),v_collision);gl_FragColor=color*alpha*opacity_t;}\",\"attribute vec2 a_pos;attribute float a_radius;attribute vec2 a_flags;uniform mat4 u_matrix;uniform mat4 u_inv_matrix;uniform vec2 u_viewport_size;uniform float u_camera_to_center_distance;varying float v_radius;varying vec2 v_extrude;varying float v_perspective_ratio;varying float v_collision;vec3 toTilePosition(vec2 screenPos) {vec4 rayStart=u_inv_matrix*vec4(screenPos,-1.0,1.0);vec4 rayEnd =u_inv_matrix*vec4(screenPos, 1.0,1.0);rayStart.xyz/=rayStart.w;rayEnd.xyz /=rayEnd.w;highp float t=(0.0-rayStart.z)/(rayEnd.z-rayStart.z);return mix(rayStart.xyz,rayEnd.xyz,t);}void main() {vec2 quadCenterPos=a_pos;float radius=a_radius;float collision=a_flags.x;float vertexIdx=a_flags.y;vec2 quadVertexOffset=vec2(mix(-1.0,1.0,float(vertexIdx >=2.0)),mix(-1.0,1.0,float(vertexIdx >=1.0 && vertexIdx <=2.0)));vec2 quadVertexExtent=quadVertexOffset*radius;vec3 tilePos=toTilePosition(quadCenterPos);vec4 clipPos=u_matrix*vec4(tilePos,1.0);highp float camera_to_anchor_distance=clipPos.w;highp float collision_perspective_ratio=clamp(0.5+0.5*(u_camera_to_center_distance/camera_to_anchor_distance),0.0,4.0);float padding_factor=1.2;v_radius=radius;v_extrude=quadVertexExtent*padding_factor;v_perspective_ratio=collision_perspective_ratio;v_collision=collision;gl_Position=vec4(clipPos.xyz/clipPos.w,1.0)+vec4(quadVertexExtent*padding_factor/u_viewport_size*2.0,0.0,0.0);}\"),ir=_r(\"uniform highp vec4 u_color;uniform sampler2D u_overlay;varying vec2 v_uv;void main() {vec4 overlay_color=texture2D(u_overlay,v_uv);gl_FragColor=mix(u_color,overlay_color,overlay_color.a);}\",\"attribute vec2 a_pos;varying vec2 v_uv;uniform mat4 u_matrix;uniform float u_overlay_scale;void main() {v_uv=a_pos/8192.0;gl_Position=u_matrix*vec4(a_pos*u_overlay_scale,0,1);}\"),ar=_r(\"#pragma mapbox: define highp vec4 color\\n#pragma mapbox: define lowp float opacity\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 color\\n#pragma mapbox: initialize lowp float opacity\\ngl_FragColor=color*opacity;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"attribute vec2 a_pos;uniform mat4 u_matrix;\\n#pragma mapbox: define highp vec4 color\\n#pragma mapbox: define lowp float opacity\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 color\\n#pragma mapbox: initialize lowp float opacity\\ngl_Position=u_matrix*vec4(a_pos,0,1);}\"),or=_r(\"varying vec2 v_pos;\\n#pragma mapbox: define highp vec4 outline_color\\n#pragma mapbox: define lowp float opacity\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 outline_color\\n#pragma mapbox: initialize lowp float opacity\\nfloat dist=length(v_pos-gl_FragCoord.xy);float alpha=1.0-smoothstep(0.0,1.0,dist);gl_FragColor=outline_color*(alpha*opacity);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"attribute vec2 a_pos;uniform mat4 u_matrix;uniform vec2 u_world;varying vec2 v_pos;\\n#pragma mapbox: define highp vec4 outline_color\\n#pragma mapbox: define lowp float opacity\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 outline_color\\n#pragma mapbox: initialize lowp float opacity\\ngl_Position=u_matrix*vec4(a_pos,0,1);v_pos=(gl_Position.xy/gl_Position.w+1.0)/2.0*u_world;}\"),sr=_r(\"uniform vec2 u_texsize;uniform sampler2D u_image;uniform float u_fade;varying vec2 v_pos_a;varying vec2 v_pos_b;varying vec2 v_pos;\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define lowp vec4 pattern_from\\n#pragma mapbox: define lowp vec4 pattern_to\\nvoid main() {\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize mediump vec4 pattern_from\\n#pragma mapbox: initialize mediump vec4 pattern_to\\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;vec2 imagecoord=mod(v_pos_a,1.0);vec2 pos=mix(pattern_tl_a/u_texsize,pattern_br_a/u_texsize,imagecoord);vec4 color1=texture2D(u_image,pos);vec2 imagecoord_b=mod(v_pos_b,1.0);vec2 pos2=mix(pattern_tl_b/u_texsize,pattern_br_b/u_texsize,imagecoord_b);vec4 color2=texture2D(u_image,pos2);float dist=length(v_pos-gl_FragCoord.xy);float alpha=1.0-smoothstep(0.0,1.0,dist);gl_FragColor=mix(color1,color2,u_fade)*alpha*opacity;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"uniform mat4 u_matrix;uniform vec2 u_world;uniform vec2 u_pixel_coord_upper;uniform vec2 u_pixel_coord_lower;uniform vec3 u_scale;attribute vec2 a_pos;varying vec2 v_pos_a;varying vec2 v_pos_b;varying vec2 v_pos;\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define lowp vec4 pattern_from\\n#pragma mapbox: define lowp vec4 pattern_to\\n#pragma mapbox: define lowp float pixel_ratio_from\\n#pragma mapbox: define lowp float pixel_ratio_to\\nvoid main() {\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize mediump vec4 pattern_from\\n#pragma mapbox: initialize mediump vec4 pattern_to\\n#pragma mapbox: initialize lowp float pixel_ratio_from\\n#pragma mapbox: initialize lowp float pixel_ratio_to\\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;float tileRatio=u_scale.x;float fromScale=u_scale.y;float toScale=u_scale.z;gl_Position=u_matrix*vec4(a_pos,0,1);vec2 display_size_a=(pattern_br_a-pattern_tl_a)/pixel_ratio_from;vec2 display_size_b=(pattern_br_b-pattern_tl_b)/pixel_ratio_to;v_pos_a=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,fromScale*display_size_a,tileRatio,a_pos);v_pos_b=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,toScale*display_size_b,tileRatio,a_pos);v_pos=(gl_Position.xy/gl_Position.w+1.0)/2.0*u_world;}\"),lr=_r(\"uniform vec2 u_texsize;uniform float u_fade;uniform sampler2D u_image;varying vec2 v_pos_a;varying vec2 v_pos_b;\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define lowp vec4 pattern_from\\n#pragma mapbox: define lowp vec4 pattern_to\\nvoid main() {\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize mediump vec4 pattern_from\\n#pragma mapbox: initialize mediump vec4 pattern_to\\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;vec2 imagecoord=mod(v_pos_a,1.0);vec2 pos=mix(pattern_tl_a/u_texsize,pattern_br_a/u_texsize,imagecoord);vec4 color1=texture2D(u_image,pos);vec2 imagecoord_b=mod(v_pos_b,1.0);vec2 pos2=mix(pattern_tl_b/u_texsize,pattern_br_b/u_texsize,imagecoord_b);vec4 color2=texture2D(u_image,pos2);gl_FragColor=mix(color1,color2,u_fade)*opacity;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"uniform mat4 u_matrix;uniform vec2 u_pixel_coord_upper;uniform vec2 u_pixel_coord_lower;uniform vec3 u_scale;attribute vec2 a_pos;varying vec2 v_pos_a;varying vec2 v_pos_b;\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define lowp vec4 pattern_from\\n#pragma mapbox: define lowp vec4 pattern_to\\n#pragma mapbox: define lowp float pixel_ratio_from\\n#pragma mapbox: define lowp float pixel_ratio_to\\nvoid main() {\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize mediump vec4 pattern_from\\n#pragma mapbox: initialize mediump vec4 pattern_to\\n#pragma mapbox: initialize lowp float pixel_ratio_from\\n#pragma mapbox: initialize lowp float pixel_ratio_to\\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;float tileZoomRatio=u_scale.x;float fromScale=u_scale.y;float toScale=u_scale.z;vec2 display_size_a=(pattern_br_a-pattern_tl_a)/pixel_ratio_from;vec2 display_size_b=(pattern_br_b-pattern_tl_b)/pixel_ratio_to;gl_Position=u_matrix*vec4(a_pos,0,1);v_pos_a=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,fromScale*display_size_a,tileZoomRatio,a_pos);v_pos_b=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,toScale*display_size_b,tileZoomRatio,a_pos);}\"),ur=_r(\"varying vec4 v_color;void main() {gl_FragColor=v_color;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"uniform mat4 u_matrix;uniform vec3 u_lightcolor;uniform lowp vec3 u_lightpos;uniform lowp float u_lightintensity;uniform float u_vertical_gradient;uniform lowp float u_opacity;attribute vec2 a_pos;attribute vec4 a_normal_ed;varying vec4 v_color;\\n#pragma mapbox: define highp float base\\n#pragma mapbox: define highp float height\\n#pragma mapbox: define highp vec4 color\\nvoid main() {\\n#pragma mapbox: initialize highp float base\\n#pragma mapbox: initialize highp float height\\n#pragma mapbox: initialize highp vec4 color\\nvec3 normal=a_normal_ed.xyz;base=max(0.0,base);height=max(0.0,height);float t=mod(normal.x,2.0);gl_Position=u_matrix*vec4(a_pos,t > 0.0 ? height : base,1);float colorvalue=color.r*0.2126+color.g*0.7152+color.b*0.0722;v_color=vec4(0.0,0.0,0.0,1.0);vec4 ambientlight=vec4(0.03,0.03,0.03,1.0);color+=ambientlight;float directional=clamp(dot(normal/16384.0,u_lightpos),0.0,1.0);directional=mix((1.0-u_lightintensity),max((1.0-colorvalue+u_lightintensity),1.0),directional);if (normal.y !=0.0) {directional*=((1.0-u_vertical_gradient)+(u_vertical_gradient*clamp((t+base)*pow(height/150.0,0.5),mix(0.7,0.98,1.0-u_lightintensity),1.0)));}v_color.r+=clamp(color.r*directional*u_lightcolor.r,mix(0.0,0.3,1.0-u_lightcolor.r),1.0);v_color.g+=clamp(color.g*directional*u_lightcolor.g,mix(0.0,0.3,1.0-u_lightcolor.g),1.0);v_color.b+=clamp(color.b*directional*u_lightcolor.b,mix(0.0,0.3,1.0-u_lightcolor.b),1.0);v_color*=u_opacity;}\"),cr=_r(\"uniform vec2 u_texsize;uniform float u_fade;uniform sampler2D u_image;varying vec2 v_pos_a;varying vec2 v_pos_b;varying vec4 v_lighting;\\n#pragma mapbox: define lowp float base\\n#pragma mapbox: define lowp float height\\n#pragma mapbox: define lowp vec4 pattern_from\\n#pragma mapbox: define lowp vec4 pattern_to\\n#pragma mapbox: define lowp float pixel_ratio_from\\n#pragma mapbox: define lowp float pixel_ratio_to\\nvoid main() {\\n#pragma mapbox: initialize lowp float base\\n#pragma mapbox: initialize lowp float height\\n#pragma mapbox: initialize mediump vec4 pattern_from\\n#pragma mapbox: initialize mediump vec4 pattern_to\\n#pragma mapbox: initialize lowp float pixel_ratio_from\\n#pragma mapbox: initialize lowp float pixel_ratio_to\\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;vec2 imagecoord=mod(v_pos_a,1.0);vec2 pos=mix(pattern_tl_a/u_texsize,pattern_br_a/u_texsize,imagecoord);vec4 color1=texture2D(u_image,pos);vec2 imagecoord_b=mod(v_pos_b,1.0);vec2 pos2=mix(pattern_tl_b/u_texsize,pattern_br_b/u_texsize,imagecoord_b);vec4 color2=texture2D(u_image,pos2);vec4 mixedColor=mix(color1,color2,u_fade);gl_FragColor=mixedColor*v_lighting;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"uniform mat4 u_matrix;uniform vec2 u_pixel_coord_upper;uniform vec2 u_pixel_coord_lower;uniform float u_height_factor;uniform vec3 u_scale;uniform float u_vertical_gradient;uniform lowp float u_opacity;uniform vec3 u_lightcolor;uniform lowp vec3 u_lightpos;uniform lowp float u_lightintensity;attribute vec2 a_pos;attribute vec4 a_normal_ed;varying vec2 v_pos_a;varying vec2 v_pos_b;varying vec4 v_lighting;\\n#pragma mapbox: define lowp float base\\n#pragma mapbox: define lowp float height\\n#pragma mapbox: define lowp vec4 pattern_from\\n#pragma mapbox: define lowp vec4 pattern_to\\n#pragma mapbox: define lowp float pixel_ratio_from\\n#pragma mapbox: define lowp float pixel_ratio_to\\nvoid main() {\\n#pragma mapbox: initialize lowp float base\\n#pragma mapbox: initialize lowp float height\\n#pragma mapbox: initialize mediump vec4 pattern_from\\n#pragma mapbox: initialize mediump vec4 pattern_to\\n#pragma mapbox: initialize lowp float pixel_ratio_from\\n#pragma mapbox: initialize lowp float pixel_ratio_to\\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;float tileRatio=u_scale.x;float fromScale=u_scale.y;float toScale=u_scale.z;vec3 normal=a_normal_ed.xyz;float edgedistance=a_normal_ed.w;vec2 display_size_a=(pattern_br_a-pattern_tl_a)/pixel_ratio_from;vec2 display_size_b=(pattern_br_b-pattern_tl_b)/pixel_ratio_to;base=max(0.0,base);height=max(0.0,height);float t=mod(normal.x,2.0);float z=t > 0.0 ? height : base;gl_Position=u_matrix*vec4(a_pos,z,1);vec2 pos=normal.x==1.0 && normal.y==0.0 && normal.z==16384.0\\n? a_pos\\n: vec2(edgedistance,z*u_height_factor);v_pos_a=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,fromScale*display_size_a,tileRatio,pos);v_pos_b=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,toScale*display_size_b,tileRatio,pos);v_lighting=vec4(0.0,0.0,0.0,1.0);float directional=clamp(dot(normal/16383.0,u_lightpos),0.0,1.0);directional=mix((1.0-u_lightintensity),max((0.5+u_lightintensity),1.0),directional);if (normal.y !=0.0) {directional*=((1.0-u_vertical_gradient)+(u_vertical_gradient*clamp((t+base)*pow(height/150.0,0.5),mix(0.7,0.98,1.0-u_lightintensity),1.0)));}v_lighting.rgb+=clamp(directional*u_lightcolor,mix(vec3(0.0),vec3(0.3),1.0-u_lightcolor),vec3(1.0));v_lighting*=u_opacity;}\"),fr=_r(\"#ifdef GL_ES\\nprecision highp float;\\n#endif\\nuniform sampler2D u_image;varying vec2 v_pos;uniform vec2 u_dimension;uniform float u_zoom;uniform vec4 u_unpack;float getElevation(vec2 coord,float bias) {vec4 data=texture2D(u_image,coord)*255.0;data.a=-1.0;return dot(data,u_unpack)/4.0;}void main() {vec2 epsilon=1.0/u_dimension;float a=getElevation(v_pos+vec2(-epsilon.x,-epsilon.y),0.0);float b=getElevation(v_pos+vec2(0,-epsilon.y),0.0);float c=getElevation(v_pos+vec2(epsilon.x,-epsilon.y),0.0);float d=getElevation(v_pos+vec2(-epsilon.x,0),0.0);float e=getElevation(v_pos,0.0);float f=getElevation(v_pos+vec2(epsilon.x,0),0.0);float g=getElevation(v_pos+vec2(-epsilon.x,epsilon.y),0.0);float h=getElevation(v_pos+vec2(0,epsilon.y),0.0);float i=getElevation(v_pos+vec2(epsilon.x,epsilon.y),0.0);float exaggerationFactor=u_zoom < 2.0 ? 0.4 : u_zoom < 4.5 ? 0.35 : 0.3;float exaggeration=u_zoom < 15.0 ? (u_zoom-15.0)*exaggerationFactor : 0.0;vec2 deriv=vec2((c+f+f+i)-(a+d+d+g),(g+h+h+i)-(a+b+b+c))/pow(2.0,exaggeration+(19.2562-u_zoom));gl_FragColor=clamp(vec4(deriv.x/2.0+0.5,deriv.y/2.0+0.5,1.0,1.0),0.0,1.0);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"uniform mat4 u_matrix;uniform vec2 u_dimension;attribute vec2 a_pos;attribute vec2 a_texture_pos;varying vec2 v_pos;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);highp vec2 epsilon=1.0/u_dimension;float scale=(u_dimension.x-2.0)/u_dimension.x;v_pos=(a_texture_pos/8192.0)*scale+epsilon;}\"),hr=_r(\"uniform sampler2D u_image;varying vec2 v_pos;uniform vec2 u_latrange;uniform vec2 u_light;uniform vec4 u_shadow;uniform vec4 u_highlight;uniform vec4 u_accent;\\n#define PI 3.141592653589793\\nvoid main() {vec4 pixel=texture2D(u_image,v_pos);vec2 deriv=((pixel.rg*2.0)-1.0);float scaleFactor=cos(radians((u_latrange[0]-u_latrange[1])*(1.0-v_pos.y)+u_latrange[1]));float slope=atan(1.25*length(deriv)/scaleFactor);float aspect=deriv.x !=0.0 ? atan(deriv.y,-deriv.x) : PI/2.0*(deriv.y > 0.0 ? 1.0 :-1.0);float intensity=u_light.x;float azimuth=u_light.y+PI;float base=1.875-intensity*1.75;float maxValue=0.5*PI;float scaledSlope=intensity !=0.5 ? ((pow(base,slope)-1.0)/(pow(base,maxValue)-1.0))*maxValue : slope;float accent=cos(scaledSlope);vec4 accent_color=(1.0-accent)*u_accent*clamp(intensity*2.0,0.0,1.0);float shade=abs(mod((aspect+azimuth)/PI+0.5,2.0)-1.0);vec4 shade_color=mix(u_shadow,u_highlight,shade)*sin(scaledSlope)*clamp(intensity*2.0,0.0,1.0);gl_FragColor=accent_color*(1.0-shade_color.a)+shade_color;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"uniform mat4 u_matrix;attribute vec2 a_pos;attribute vec2 a_texture_pos;varying vec2 v_pos;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);v_pos=a_texture_pos/8192.0;}\"),pr=_r(\"uniform lowp float u_device_pixel_ratio;varying vec2 v_width2;varying vec2 v_normal;varying float v_gamma_scale;\\n#pragma mapbox: define highp vec4 color\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 color\\n#pragma mapbox: initialize lowp float blur\\n#pragma mapbox: initialize lowp float opacity\\nfloat dist=length(v_normal)*v_width2.s;float blur2=(blur+1.0/u_device_pixel_ratio)*v_gamma_scale;float alpha=clamp(min(dist-(v_width2.t-blur2),v_width2.s-dist)/blur2,0.0,1.0);gl_FragColor=color*(alpha*opacity);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"\\n#define scale 0.015873016\\nattribute vec2 a_pos_normal;attribute vec4 a_data;uniform mat4 u_matrix;uniform mediump float u_ratio;uniform vec2 u_units_to_pixels;uniform lowp float u_device_pixel_ratio;varying vec2 v_normal;varying vec2 v_width2;varying float v_gamma_scale;varying highp float v_linesofar;\\n#pragma mapbox: define highp vec4 color\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define mediump float gapwidth\\n#pragma mapbox: define lowp float offset\\n#pragma mapbox: define mediump float width\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 color\\n#pragma mapbox: initialize lowp float blur\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize mediump float gapwidth\\n#pragma mapbox: initialize lowp float offset\\n#pragma mapbox: initialize mediump float width\\nfloat ANTIALIASING=1.0/u_device_pixel_ratio/2.0;vec2 a_extrude=a_data.xy-128.0;float a_direction=mod(a_data.z,4.0)-1.0;v_linesofar=(floor(a_data.z/4.0)+a_data.w*64.0)*2.0;vec2 pos=floor(a_pos_normal*0.5);mediump vec2 normal=a_pos_normal-2.0*pos;normal.y=normal.y*2.0-1.0;v_normal=normal;gapwidth=gapwidth/2.0;float halfwidth=width/2.0;offset=-1.0*offset;float inset=gapwidth+(gapwidth > 0.0 ? ANTIALIASING : 0.0);float outset=gapwidth+halfwidth*(gapwidth > 0.0 ? 2.0 : 1.0)+(halfwidth==0.0 ? 0.0 : ANTIALIASING);mediump vec2 dist=outset*a_extrude*scale;mediump float u=0.5*a_direction;mediump float t=1.0-abs(u);mediump vec2 offset2=offset*a_extrude*scale*normal.y*mat2(t,-u,u,t);vec4 projected_extrude=u_matrix*vec4(dist/u_ratio,0.0,0.0);gl_Position=u_matrix*vec4(pos+offset2/u_ratio,0.0,1.0)+projected_extrude;float extrude_length_without_perspective=length(dist);float extrude_length_with_perspective=length(projected_extrude.xy/gl_Position.w*u_units_to_pixels);v_gamma_scale=extrude_length_without_perspective/extrude_length_with_perspective;v_width2=vec2(outset,inset);}\"),dr=_r(\"uniform lowp float u_device_pixel_ratio;uniform sampler2D u_image;varying vec2 v_width2;varying vec2 v_normal;varying float v_gamma_scale;varying highp vec2 v_uv;\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\nvoid main() {\\n#pragma mapbox: initialize lowp float blur\\n#pragma mapbox: initialize lowp float opacity\\nfloat dist=length(v_normal)*v_width2.s;float blur2=(blur+1.0/u_device_pixel_ratio)*v_gamma_scale;float alpha=clamp(min(dist-(v_width2.t-blur2),v_width2.s-dist)/blur2,0.0,1.0);vec4 color=texture2D(u_image,v_uv);gl_FragColor=color*(alpha*opacity);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"\\n#define scale 0.015873016\\nattribute vec2 a_pos_normal;attribute vec4 a_data;attribute float a_uv_x;attribute float a_split_index;uniform mat4 u_matrix;uniform mediump float u_ratio;uniform lowp float u_device_pixel_ratio;uniform vec2 u_units_to_pixels;uniform float u_image_height;varying vec2 v_normal;varying vec2 v_width2;varying float v_gamma_scale;varying highp vec2 v_uv;\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define mediump float gapwidth\\n#pragma mapbox: define lowp float offset\\n#pragma mapbox: define mediump float width\\nvoid main() {\\n#pragma mapbox: initialize lowp float blur\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize mediump float gapwidth\\n#pragma mapbox: initialize lowp float offset\\n#pragma mapbox: initialize mediump float width\\nfloat ANTIALIASING=1.0/u_device_pixel_ratio/2.0;vec2 a_extrude=a_data.xy-128.0;float a_direction=mod(a_data.z,4.0)-1.0;highp float texel_height=1.0/u_image_height;highp float half_texel_height=0.5*texel_height;v_uv=vec2(a_uv_x,a_split_index*texel_height-half_texel_height);vec2 pos=floor(a_pos_normal*0.5);mediump vec2 normal=a_pos_normal-2.0*pos;normal.y=normal.y*2.0-1.0;v_normal=normal;gapwidth=gapwidth/2.0;float halfwidth=width/2.0;offset=-1.0*offset;float inset=gapwidth+(gapwidth > 0.0 ? ANTIALIASING : 0.0);float outset=gapwidth+halfwidth*(gapwidth > 0.0 ? 2.0 : 1.0)+(halfwidth==0.0 ? 0.0 : ANTIALIASING);mediump vec2 dist=outset*a_extrude*scale;mediump float u=0.5*a_direction;mediump float t=1.0-abs(u);mediump vec2 offset2=offset*a_extrude*scale*normal.y*mat2(t,-u,u,t);vec4 projected_extrude=u_matrix*vec4(dist/u_ratio,0.0,0.0);gl_Position=u_matrix*vec4(pos+offset2/u_ratio,0.0,1.0)+projected_extrude;float extrude_length_without_perspective=length(dist);float extrude_length_with_perspective=length(projected_extrude.xy/gl_Position.w*u_units_to_pixels);v_gamma_scale=extrude_length_without_perspective/extrude_length_with_perspective;v_width2=vec2(outset,inset);}\"),vr=_r(\"uniform lowp float u_device_pixel_ratio;uniform vec2 u_texsize;uniform float u_fade;uniform mediump vec3 u_scale;uniform sampler2D u_image;varying vec2 v_normal;varying vec2 v_width2;varying float v_linesofar;varying float v_gamma_scale;varying float v_width;\\n#pragma mapbox: define lowp vec4 pattern_from\\n#pragma mapbox: define lowp vec4 pattern_to\\n#pragma mapbox: define lowp float pixel_ratio_from\\n#pragma mapbox: define lowp float pixel_ratio_to\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\nvoid main() {\\n#pragma mapbox: initialize mediump vec4 pattern_from\\n#pragma mapbox: initialize mediump vec4 pattern_to\\n#pragma mapbox: initialize lowp float pixel_ratio_from\\n#pragma mapbox: initialize lowp float pixel_ratio_to\\n#pragma mapbox: initialize lowp float blur\\n#pragma mapbox: initialize lowp float opacity\\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;float tileZoomRatio=u_scale.x;float fromScale=u_scale.y;float toScale=u_scale.z;vec2 display_size_a=(pattern_br_a-pattern_tl_a)/pixel_ratio_from;vec2 display_size_b=(pattern_br_b-pattern_tl_b)/pixel_ratio_to;vec2 pattern_size_a=vec2(display_size_a.x*fromScale/tileZoomRatio,display_size_a.y);vec2 pattern_size_b=vec2(display_size_b.x*toScale/tileZoomRatio,display_size_b.y);float aspect_a=display_size_a.y/v_width;float aspect_b=display_size_b.y/v_width;float dist=length(v_normal)*v_width2.s;float blur2=(blur+1.0/u_device_pixel_ratio)*v_gamma_scale;float alpha=clamp(min(dist-(v_width2.t-blur2),v_width2.s-dist)/blur2,0.0,1.0);float x_a=mod(v_linesofar/pattern_size_a.x*aspect_a,1.0);float x_b=mod(v_linesofar/pattern_size_b.x*aspect_b,1.0);float y=0.5*v_normal.y+0.5;vec2 texel_size=1.0/u_texsize;vec2 pos_a=mix(pattern_tl_a*texel_size-texel_size,pattern_br_a*texel_size+texel_size,vec2(x_a,y));vec2 pos_b=mix(pattern_tl_b*texel_size-texel_size,pattern_br_b*texel_size+texel_size,vec2(x_b,y));vec4 color=mix(texture2D(u_image,pos_a),texture2D(u_image,pos_b),u_fade);gl_FragColor=color*alpha*opacity;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"\\n#define scale 0.015873016\\n#define LINE_DISTANCE_SCALE 2.0\\nattribute vec2 a_pos_normal;attribute vec4 a_data;uniform mat4 u_matrix;uniform vec2 u_units_to_pixels;uniform mediump float u_ratio;uniform lowp float u_device_pixel_ratio;varying vec2 v_normal;varying vec2 v_width2;varying float v_linesofar;varying float v_gamma_scale;varying float v_width;\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define lowp float offset\\n#pragma mapbox: define mediump float gapwidth\\n#pragma mapbox: define mediump float width\\n#pragma mapbox: define lowp float floorwidth\\n#pragma mapbox: define lowp vec4 pattern_from\\n#pragma mapbox: define lowp vec4 pattern_to\\n#pragma mapbox: define lowp float pixel_ratio_from\\n#pragma mapbox: define lowp float pixel_ratio_to\\nvoid main() {\\n#pragma mapbox: initialize lowp float blur\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize lowp float offset\\n#pragma mapbox: initialize mediump float gapwidth\\n#pragma mapbox: initialize mediump float width\\n#pragma mapbox: initialize lowp float floorwidth\\n#pragma mapbox: initialize mediump vec4 pattern_from\\n#pragma mapbox: initialize mediump vec4 pattern_to\\n#pragma mapbox: initialize lowp float pixel_ratio_from\\n#pragma mapbox: initialize lowp float pixel_ratio_to\\nfloat ANTIALIASING=1.0/u_device_pixel_ratio/2.0;vec2 a_extrude=a_data.xy-128.0;float a_direction=mod(a_data.z,4.0)-1.0;float a_linesofar=(floor(a_data.z/4.0)+a_data.w*64.0)*LINE_DISTANCE_SCALE;vec2 pos=floor(a_pos_normal*0.5);mediump vec2 normal=a_pos_normal-2.0*pos;normal.y=normal.y*2.0-1.0;v_normal=normal;gapwidth=gapwidth/2.0;float halfwidth=width/2.0;offset=-1.0*offset;float inset=gapwidth+(gapwidth > 0.0 ? ANTIALIASING : 0.0);float outset=gapwidth+halfwidth*(gapwidth > 0.0 ? 2.0 : 1.0)+(halfwidth==0.0 ? 0.0 : ANTIALIASING);mediump vec2 dist=outset*a_extrude*scale;mediump float u=0.5*a_direction;mediump float t=1.0-abs(u);mediump vec2 offset2=offset*a_extrude*scale*normal.y*mat2(t,-u,u,t);vec4 projected_extrude=u_matrix*vec4(dist/u_ratio,0.0,0.0);gl_Position=u_matrix*vec4(pos+offset2/u_ratio,0.0,1.0)+projected_extrude;float extrude_length_without_perspective=length(dist);float extrude_length_with_perspective=length(projected_extrude.xy/gl_Position.w*u_units_to_pixels);v_gamma_scale=extrude_length_without_perspective/extrude_length_with_perspective;v_linesofar=a_linesofar;v_width2=vec2(outset,inset);v_width=floorwidth;}\"),gr=_r(\"uniform lowp float u_device_pixel_ratio;uniform sampler2D u_image;uniform float u_sdfgamma;uniform float u_mix;varying vec2 v_normal;varying vec2 v_width2;varying vec2 v_tex_a;varying vec2 v_tex_b;varying float v_gamma_scale;\\n#pragma mapbox: define highp vec4 color\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define mediump float width\\n#pragma mapbox: define lowp float floorwidth\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 color\\n#pragma mapbox: initialize lowp float blur\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize mediump float width\\n#pragma mapbox: initialize lowp float floorwidth\\nfloat dist=length(v_normal)*v_width2.s;float blur2=(blur+1.0/u_device_pixel_ratio)*v_gamma_scale;float alpha=clamp(min(dist-(v_width2.t-blur2),v_width2.s-dist)/blur2,0.0,1.0);float sdfdist_a=texture2D(u_image,v_tex_a).a;float sdfdist_b=texture2D(u_image,v_tex_b).a;float sdfdist=mix(sdfdist_a,sdfdist_b,u_mix);alpha*=smoothstep(0.5-u_sdfgamma/floorwidth,0.5+u_sdfgamma/floorwidth,sdfdist);gl_FragColor=color*(alpha*opacity);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"\\n#define scale 0.015873016\\n#define LINE_DISTANCE_SCALE 2.0\\nattribute vec2 a_pos_normal;attribute vec4 a_data;uniform mat4 u_matrix;uniform mediump float u_ratio;uniform lowp float u_device_pixel_ratio;uniform vec2 u_patternscale_a;uniform float u_tex_y_a;uniform vec2 u_patternscale_b;uniform float u_tex_y_b;uniform vec2 u_units_to_pixels;varying vec2 v_normal;varying vec2 v_width2;varying vec2 v_tex_a;varying vec2 v_tex_b;varying float v_gamma_scale;\\n#pragma mapbox: define highp vec4 color\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define mediump float gapwidth\\n#pragma mapbox: define lowp float offset\\n#pragma mapbox: define mediump float width\\n#pragma mapbox: define lowp float floorwidth\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 color\\n#pragma mapbox: initialize lowp float blur\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize mediump float gapwidth\\n#pragma mapbox: initialize lowp float offset\\n#pragma mapbox: initialize mediump float width\\n#pragma mapbox: initialize lowp float floorwidth\\nfloat ANTIALIASING=1.0/u_device_pixel_ratio/2.0;vec2 a_extrude=a_data.xy-128.0;float a_direction=mod(a_data.z,4.0)-1.0;float a_linesofar=(floor(a_data.z/4.0)+a_data.w*64.0)*LINE_DISTANCE_SCALE;vec2 pos=floor(a_pos_normal*0.5);mediump vec2 normal=a_pos_normal-2.0*pos;normal.y=normal.y*2.0-1.0;v_normal=normal;gapwidth=gapwidth/2.0;float halfwidth=width/2.0;offset=-1.0*offset;float inset=gapwidth+(gapwidth > 0.0 ? ANTIALIASING : 0.0);float outset=gapwidth+halfwidth*(gapwidth > 0.0 ? 2.0 : 1.0)+(halfwidth==0.0 ? 0.0 : ANTIALIASING);mediump vec2 dist=outset*a_extrude*scale;mediump float u=0.5*a_direction;mediump float t=1.0-abs(u);mediump vec2 offset2=offset*a_extrude*scale*normal.y*mat2(t,-u,u,t);vec4 projected_extrude=u_matrix*vec4(dist/u_ratio,0.0,0.0);gl_Position=u_matrix*vec4(pos+offset2/u_ratio,0.0,1.0)+projected_extrude;float extrude_length_without_perspective=length(dist);float extrude_length_with_perspective=length(projected_extrude.xy/gl_Position.w*u_units_to_pixels);v_gamma_scale=extrude_length_without_perspective/extrude_length_with_perspective;v_tex_a=vec2(a_linesofar*u_patternscale_a.x/floorwidth,normal.y*u_patternscale_a.y+u_tex_y_a);v_tex_b=vec2(a_linesofar*u_patternscale_b.x/floorwidth,normal.y*u_patternscale_b.y+u_tex_y_b);v_width2=vec2(outset,inset);}\"),yr=_r(\"uniform float u_fade_t;uniform float u_opacity;uniform sampler2D u_image0;uniform sampler2D u_image1;varying vec2 v_pos0;varying vec2 v_pos1;uniform float u_brightness_low;uniform float u_brightness_high;uniform float u_saturation_factor;uniform float u_contrast_factor;uniform vec3 u_spin_weights;void main() {vec4 color0=texture2D(u_image0,v_pos0);vec4 color1=texture2D(u_image1,v_pos1);if (color0.a > 0.0) {color0.rgb=color0.rgb/color0.a;}if (color1.a > 0.0) {color1.rgb=color1.rgb/color1.a;}vec4 color=mix(color0,color1,u_fade_t);color.a*=u_opacity;vec3 rgb=color.rgb;rgb=vec3(dot(rgb,u_spin_weights.xyz),dot(rgb,u_spin_weights.zxy),dot(rgb,u_spin_weights.yzx));float average=(color.r+color.g+color.b)/3.0;rgb+=(average-rgb)*u_saturation_factor;rgb=(rgb-0.5)*u_contrast_factor+0.5;vec3 u_high_vec=vec3(u_brightness_low,u_brightness_low,u_brightness_low);vec3 u_low_vec=vec3(u_brightness_high,u_brightness_high,u_brightness_high);gl_FragColor=vec4(mix(u_high_vec,u_low_vec,rgb)*color.a,color.a);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"uniform mat4 u_matrix;uniform vec2 u_tl_parent;uniform float u_scale_parent;uniform float u_buffer_scale;attribute vec2 a_pos;attribute vec2 a_texture_pos;varying vec2 v_pos0;varying vec2 v_pos1;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);v_pos0=(((a_texture_pos/8192.0)-0.5)/u_buffer_scale )+0.5;v_pos1=(v_pos0*u_scale_parent)+u_tl_parent;}\"),mr=_r(\"uniform sampler2D u_texture;varying vec2 v_tex;varying float v_fade_opacity;\\n#pragma mapbox: define lowp float opacity\\nvoid main() {\\n#pragma mapbox: initialize lowp float opacity\\nlowp float alpha=opacity*v_fade_opacity;gl_FragColor=texture2D(u_texture,v_tex)*alpha;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"const float PI=3.141592653589793;attribute vec4 a_pos_offset;attribute vec4 a_data;attribute vec4 a_pixeloffset;attribute vec3 a_projected_pos;attribute float a_fade_opacity;uniform bool u_is_size_zoom_constant;uniform bool u_is_size_feature_constant;uniform highp float u_size_t;uniform highp float u_size;uniform highp float u_camera_to_center_distance;uniform highp float u_pitch;uniform bool u_rotate_symbol;uniform highp float u_aspect_ratio;uniform float u_fade_change;uniform mat4 u_matrix;uniform mat4 u_label_plane_matrix;uniform mat4 u_coord_matrix;uniform bool u_is_text;uniform bool u_pitch_with_map;uniform vec2 u_texsize;varying vec2 v_tex;varying float v_fade_opacity;\\n#pragma mapbox: define lowp float opacity\\nvoid main() {\\n#pragma mapbox: initialize lowp float opacity\\nvec2 a_pos=a_pos_offset.xy;vec2 a_offset=a_pos_offset.zw;vec2 a_tex=a_data.xy;vec2 a_size=a_data.zw;float a_size_min=floor(a_size[0]*0.5);vec2 a_pxoffset=a_pixeloffset.xy;vec2 a_minFontScale=a_pixeloffset.zw/256.0;highp float segment_angle=-a_projected_pos[2];float size;if (!u_is_size_zoom_constant && !u_is_size_feature_constant) {size=mix(a_size_min,a_size[1],u_size_t)/128.0;} else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {size=a_size_min/128.0;} else {size=u_size;}vec4 projectedPoint=u_matrix*vec4(a_pos,0,1);highp float camera_to_anchor_distance=projectedPoint.w;highp float distance_ratio=u_pitch_with_map ?\\ncamera_to_anchor_distance/u_camera_to_center_distance :\\nu_camera_to_center_distance/camera_to_anchor_distance;highp float perspective_ratio=clamp(0.5+0.5*distance_ratio,0.0,4.0);size*=perspective_ratio;float fontScale=u_is_text ? size/24.0 : size;highp float symbol_rotation=0.0;if (u_rotate_symbol) {vec4 offsetProjectedPoint=u_matrix*vec4(a_pos+vec2(1,0),0,1);vec2 a=projectedPoint.xy/projectedPoint.w;vec2 b=offsetProjectedPoint.xy/offsetProjectedPoint.w;symbol_rotation=atan((b.y-a.y)/u_aspect_ratio,b.x-a.x);}highp float angle_sin=sin(segment_angle+symbol_rotation);highp float angle_cos=cos(segment_angle+symbol_rotation);mat2 rotation_matrix=mat2(angle_cos,-1.0*angle_sin,angle_sin,angle_cos);vec4 projected_pos=u_label_plane_matrix*vec4(a_projected_pos.xy,0.0,1.0);gl_Position=u_coord_matrix*vec4(projected_pos.xy/projected_pos.w+rotation_matrix*(a_offset/32.0*max(a_minFontScale,fontScale)+a_pxoffset/16.0),0.0,1.0);v_tex=a_tex/u_texsize;vec2 fade_opacity=unpack_opacity(a_fade_opacity);float fade_change=fade_opacity[1] > 0.5 ? u_fade_change :-u_fade_change;v_fade_opacity=max(0.0,min(1.0,fade_opacity[0]+fade_change));}\"),xr=_r(\"#define SDF_PX 8.0\\nuniform bool u_is_halo;uniform sampler2D u_texture;uniform highp float u_gamma_scale;uniform lowp float u_device_pixel_ratio;uniform bool u_is_text;varying vec2 v_data0;varying vec3 v_data1;\\n#pragma mapbox: define highp vec4 fill_color\\n#pragma mapbox: define highp vec4 halo_color\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define lowp float halo_width\\n#pragma mapbox: define lowp float halo_blur\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 fill_color\\n#pragma mapbox: initialize highp vec4 halo_color\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize lowp float halo_width\\n#pragma mapbox: initialize lowp float halo_blur\\nfloat EDGE_GAMMA=0.105/u_device_pixel_ratio;vec2 tex=v_data0.xy;float gamma_scale=v_data1.x;float size=v_data1.y;float fade_opacity=v_data1[2];float fontScale=u_is_text ? size/24.0 : size;lowp vec4 color=fill_color;highp float gamma=EDGE_GAMMA/(fontScale*u_gamma_scale);lowp float buff=(256.0-64.0)/256.0;if (u_is_halo) {color=halo_color;gamma=(halo_blur*1.19/SDF_PX+EDGE_GAMMA)/(fontScale*u_gamma_scale);buff=(6.0-halo_width/fontScale)/SDF_PX;}lowp float dist=texture2D(u_texture,tex).a;highp float gamma_scaled=gamma*gamma_scale;highp float alpha=smoothstep(buff-gamma_scaled,buff+gamma_scaled,dist);gl_FragColor=color*(alpha*opacity*fade_opacity);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"const float PI=3.141592653589793;attribute vec4 a_pos_offset;attribute vec4 a_data;attribute vec4 a_pixeloffset;attribute vec3 a_projected_pos;attribute float a_fade_opacity;uniform bool u_is_size_zoom_constant;uniform bool u_is_size_feature_constant;uniform highp float u_size_t;uniform highp float u_size;uniform mat4 u_matrix;uniform mat4 u_label_plane_matrix;uniform mat4 u_coord_matrix;uniform bool u_is_text;uniform bool u_pitch_with_map;uniform highp float u_pitch;uniform bool u_rotate_symbol;uniform highp float u_aspect_ratio;uniform highp float u_camera_to_center_distance;uniform float u_fade_change;uniform vec2 u_texsize;varying vec2 v_data0;varying vec3 v_data1;\\n#pragma mapbox: define highp vec4 fill_color\\n#pragma mapbox: define highp vec4 halo_color\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define lowp float halo_width\\n#pragma mapbox: define lowp float halo_blur\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 fill_color\\n#pragma mapbox: initialize highp vec4 halo_color\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize lowp float halo_width\\n#pragma mapbox: initialize lowp float halo_blur\\nvec2 a_pos=a_pos_offset.xy;vec2 a_offset=a_pos_offset.zw;vec2 a_tex=a_data.xy;vec2 a_size=a_data.zw;float a_size_min=floor(a_size[0]*0.5);vec2 a_pxoffset=a_pixeloffset.xy;highp float segment_angle=-a_projected_pos[2];float size;if (!u_is_size_zoom_constant && !u_is_size_feature_constant) {size=mix(a_size_min,a_size[1],u_size_t)/128.0;} else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {size=a_size_min/128.0;} else {size=u_size;}vec4 projectedPoint=u_matrix*vec4(a_pos,0,1);highp float camera_to_anchor_distance=projectedPoint.w;highp float distance_ratio=u_pitch_with_map ?\\ncamera_to_anchor_distance/u_camera_to_center_distance :\\nu_camera_to_center_distance/camera_to_anchor_distance;highp float perspective_ratio=clamp(0.5+0.5*distance_ratio,0.0,4.0);size*=perspective_ratio;float fontScale=u_is_text ? size/24.0 : size;highp float symbol_rotation=0.0;if (u_rotate_symbol) {vec4 offsetProjectedPoint=u_matrix*vec4(a_pos+vec2(1,0),0,1);vec2 a=projectedPoint.xy/projectedPoint.w;vec2 b=offsetProjectedPoint.xy/offsetProjectedPoint.w;symbol_rotation=atan((b.y-a.y)/u_aspect_ratio,b.x-a.x);}highp float angle_sin=sin(segment_angle+symbol_rotation);highp float angle_cos=cos(segment_angle+symbol_rotation);mat2 rotation_matrix=mat2(angle_cos,-1.0*angle_sin,angle_sin,angle_cos);vec4 projected_pos=u_label_plane_matrix*vec4(a_projected_pos.xy,0.0,1.0);gl_Position=u_coord_matrix*vec4(projected_pos.xy/projected_pos.w+rotation_matrix*(a_offset/32.0*fontScale+a_pxoffset),0.0,1.0);float gamma_scale=gl_Position.w;vec2 fade_opacity=unpack_opacity(a_fade_opacity);float fade_change=fade_opacity[1] > 0.5 ? u_fade_change :-u_fade_change;float interpolated_fade_opacity=max(0.0,min(1.0,fade_opacity[0]+fade_change));v_data0=a_tex/u_texsize;v_data1=vec3(gamma_scale,size,interpolated_fade_opacity);}\"),br=_r(\"#define SDF_PX 8.0\\n#define SDF 1.0\\n#define ICON 0.0\\nuniform bool u_is_halo;uniform sampler2D u_texture;uniform sampler2D u_texture_icon;uniform highp float u_gamma_scale;uniform lowp float u_device_pixel_ratio;varying vec4 v_data0;varying vec4 v_data1;\\n#pragma mapbox: define highp vec4 fill_color\\n#pragma mapbox: define highp vec4 halo_color\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define lowp float halo_width\\n#pragma mapbox: define lowp float halo_blur\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 fill_color\\n#pragma mapbox: initialize highp vec4 halo_color\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize lowp float halo_width\\n#pragma mapbox: initialize lowp float halo_blur\\nfloat fade_opacity=v_data1[2];if (v_data1.w==ICON) {vec2 tex_icon=v_data0.zw;lowp float alpha=opacity*fade_opacity;gl_FragColor=texture2D(u_texture_icon,tex_icon)*alpha;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\nreturn;}vec2 tex=v_data0.xy;float EDGE_GAMMA=0.105/u_device_pixel_ratio;float gamma_scale=v_data1.x;float size=v_data1.y;float fontScale=size/24.0;lowp vec4 color=fill_color;highp float gamma=EDGE_GAMMA/(fontScale*u_gamma_scale);lowp float buff=(256.0-64.0)/256.0;if (u_is_halo) {color=halo_color;gamma=(halo_blur*1.19/SDF_PX+EDGE_GAMMA)/(fontScale*u_gamma_scale);buff=(6.0-halo_width/fontScale)/SDF_PX;}lowp float dist=texture2D(u_texture,tex).a;highp float gamma_scaled=gamma*gamma_scale;highp float alpha=smoothstep(buff-gamma_scaled,buff+gamma_scaled,dist);gl_FragColor=color*(alpha*opacity*fade_opacity);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"const float PI=3.141592653589793;attribute vec4 a_pos_offset;attribute vec4 a_data;attribute vec3 a_projected_pos;attribute float a_fade_opacity;uniform bool u_is_size_zoom_constant;uniform bool u_is_size_feature_constant;uniform highp float u_size_t;uniform highp float u_size;uniform mat4 u_matrix;uniform mat4 u_label_plane_matrix;uniform mat4 u_coord_matrix;uniform bool u_is_text;uniform bool u_pitch_with_map;uniform highp float u_pitch;uniform bool u_rotate_symbol;uniform highp float u_aspect_ratio;uniform highp float u_camera_to_center_distance;uniform float u_fade_change;uniform vec2 u_texsize;uniform vec2 u_texsize_icon;varying vec4 v_data0;varying vec4 v_data1;\\n#pragma mapbox: define highp vec4 fill_color\\n#pragma mapbox: define highp vec4 halo_color\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define lowp float halo_width\\n#pragma mapbox: define lowp float halo_blur\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 fill_color\\n#pragma mapbox: initialize highp vec4 halo_color\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize lowp float halo_width\\n#pragma mapbox: initialize lowp float halo_blur\\nvec2 a_pos=a_pos_offset.xy;vec2 a_offset=a_pos_offset.zw;vec2 a_tex=a_data.xy;vec2 a_size=a_data.zw;float a_size_min=floor(a_size[0]*0.5);float is_sdf=a_size[0]-2.0*a_size_min;highp float segment_angle=-a_projected_pos[2];float size;if (!u_is_size_zoom_constant && !u_is_size_feature_constant) {size=mix(a_size_min,a_size[1],u_size_t)/128.0;} else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {size=a_size_min/128.0;} else {size=u_size;}vec4 projectedPoint=u_matrix*vec4(a_pos,0,1);highp float camera_to_anchor_distance=projectedPoint.w;highp float distance_ratio=u_pitch_with_map ?\\ncamera_to_anchor_distance/u_camera_to_center_distance :\\nu_camera_to_center_distance/camera_to_anchor_distance;highp float perspective_ratio=clamp(0.5+0.5*distance_ratio,0.0,4.0);size*=perspective_ratio;float fontScale=size/24.0;highp float symbol_rotation=0.0;if (u_rotate_symbol) {vec4 offsetProjectedPoint=u_matrix*vec4(a_pos+vec2(1,0),0,1);vec2 a=projectedPoint.xy/projectedPoint.w;vec2 b=offsetProjectedPoint.xy/offsetProjectedPoint.w;symbol_rotation=atan((b.y-a.y)/u_aspect_ratio,b.x-a.x);}highp float angle_sin=sin(segment_angle+symbol_rotation);highp float angle_cos=cos(segment_angle+symbol_rotation);mat2 rotation_matrix=mat2(angle_cos,-1.0*angle_sin,angle_sin,angle_cos);vec4 projected_pos=u_label_plane_matrix*vec4(a_projected_pos.xy,0.0,1.0);gl_Position=u_coord_matrix*vec4(projected_pos.xy/projected_pos.w+rotation_matrix*(a_offset/32.0*fontScale),0.0,1.0);float gamma_scale=gl_Position.w;vec2 fade_opacity=unpack_opacity(a_fade_opacity);float fade_change=fade_opacity[1] > 0.5 ? u_fade_change :-u_fade_change;float interpolated_fade_opacity=max(0.0,min(1.0,fade_opacity[0]+fade_change));v_data0.xy=a_tex/u_texsize;v_data0.zw=a_tex/u_texsize_icon;v_data1=vec4(gamma_scale,size,interpolated_fade_opacity,is_sdf);}\");function _r(t,e){var r=/#pragma mapbox: ([\\w]+) ([\\w]+) ([\\w]+) ([\\w]+)/g,n=e.match(/attribute ([\\w]+) ([\\w]+)/g),i=t.match(/uniform ([\\w]+) ([\\w]+)([\\s]*)([\\w]*)/g),a=e.match(/uniform ([\\w]+) ([\\w]+)([\\s]*)([\\w]*)/g),o=a?a.concat(i):i,s={};return{fragmentSource:t=t.replace(r,(function(t,e,r,n,i){return s[i]=!0,\"define\"===e?\"\\n#ifndef HAS_UNIFORM_u_\"+i+\"\\nvarying \"+r+\" \"+n+\" \"+i+\";\\n#else\\nuniform \"+r+\" \"+n+\" u_\"+i+\";\\n#endif\\n\":\"\\n#ifdef HAS_UNIFORM_u_\"+i+\"\\n \"+r+\" \"+n+\" \"+i+\" = u_\"+i+\";\\n#endif\\n\"})),vertexSource:e=e.replace(r,(function(t,e,r,n,i){var a=\"float\"===n?\"vec2\":\"vec4\",o=i.match(/color/)?\"color\":a;return s[i]?\"define\"===e?\"\\n#ifndef HAS_UNIFORM_u_\"+i+\"\\nuniform lowp float u_\"+i+\"_t;\\nattribute \"+r+\" \"+a+\" a_\"+i+\";\\nvarying \"+r+\" \"+n+\" \"+i+\";\\n#else\\nuniform \"+r+\" \"+n+\" u_\"+i+\";\\n#endif\\n\":\"vec4\"===o?\"\\n#ifndef HAS_UNIFORM_u_\"+i+\"\\n \"+i+\" = a_\"+i+\";\\n#else\\n \"+r+\" \"+n+\" \"+i+\" = u_\"+i+\";\\n#endif\\n\":\"\\n#ifndef HAS_UNIFORM_u_\"+i+\"\\n \"+i+\" = unpack_mix_\"+o+\"(a_\"+i+\", u_\"+i+\"_t);\\n#else\\n \"+r+\" \"+n+\" \"+i+\" = u_\"+i+\";\\n#endif\\n\":\"define\"===e?\"\\n#ifndef HAS_UNIFORM_u_\"+i+\"\\nuniform lowp float u_\"+i+\"_t;\\nattribute \"+r+\" \"+a+\" a_\"+i+\";\\n#else\\nuniform \"+r+\" \"+n+\" u_\"+i+\";\\n#endif\\n\":\"vec4\"===o?\"\\n#ifndef HAS_UNIFORM_u_\"+i+\"\\n \"+r+\" \"+n+\" \"+i+\" = a_\"+i+\";\\n#else\\n \"+r+\" \"+n+\" \"+i+\" = u_\"+i+\";\\n#endif\\n\":\"\\n#ifndef HAS_UNIFORM_u_\"+i+\"\\n \"+r+\" \"+n+\" \"+i+\" = unpack_mix_\"+o+\"(a_\"+i+\", u_\"+i+\"_t);\\n#else\\n \"+r+\" \"+n+\" \"+i+\" = u_\"+i+\";\\n#endif\\n\"})),staticAttributes:n,staticUniforms:o}}var wr=Object.freeze({__proto__:null,prelude:Ze,background:Ke,backgroundPattern:Je,circle:$e,clippingMask:Qe,heatmap:tr,heatmapTexture:er,collisionBox:rr,collisionCircle:nr,debug:ir,fill:ar,fillOutline:or,fillOutlinePattern:sr,fillPattern:lr,fillExtrusion:ur,fillExtrusionPattern:cr,hillshadePrepare:fr,hillshade:hr,line:pr,lineGradient:dr,linePattern:vr,lineSDF:gr,raster:yr,symbolIcon:mr,symbolSDF:xr,symbolTextAndIcon:br}),Tr=function(){this.boundProgram=null,this.boundLayoutVertexBuffer=null,this.boundPaintVertexBuffers=[],this.boundIndexBuffer=null,this.boundVertexOffset=null,this.boundDynamicVertexBuffer=null,this.vao=null};function kr(t){for(var e=[],r=0;r>16,s>>16],u_pixel_coord_lower:[65535&o,65535&s]}}Ar.prototype.draw=function(t,e,r,n,i,a,o,s,l,u,c,f,h,p,d,v){var g,y=t.gl;if(!this.failedToCreate){for(var m in t.program.set(this.program),t.setDepthMode(r),t.setStencilMode(n),t.setColorMode(i),t.setCullFace(a),this.fixedUniforms)this.fixedUniforms[m].set(o[m]);p&&p.setUniforms(t,this.binderUniforms,f,{zoom:h});for(var x=(g={},g[y.LINES]=2,g[y.TRIANGLES]=3,g[y.LINE_STRIP]=1,g)[e],b=0,_=c.get();b<_.length;b+=1){var w=_[b],T=w.vaos||(w.vaos={});(T[s]||(T[s]=new Tr)).bind(t,this,l,p?p.getPaintVertexBuffers():[],u,w.vertexOffset,d,v),y.drawElements(e,w.primitiveLength*x,y.UNSIGNED_SHORT,w.primitiveOffset*x*2)}}};var Sr=function(e,r,n,i){var a=r.style.light,o=a.properties.get(\"position\"),s=[o.x,o.y,o.z],l=t.create$1();\"viewport\"===a.properties.get(\"anchor\")&&t.fromRotation(l,-r.transform.angle),t.transformMat3(s,s,l);var u=a.properties.get(\"color\");return{u_matrix:e,u_lightpos:s,u_lightintensity:a.properties.get(\"intensity\"),u_lightcolor:[u.r,u.g,u.b],u_vertical_gradient:+n,u_opacity:i}},Er=function(e,r,n,i,a,o,s){return t.extend(Sr(e,r,n,i),Mr(o,r,s),{u_height_factor:-Math.pow(2,a.overscaledZ)/s.tileSize/8})},Lr=function(t){return{u_matrix:t}},Cr=function(e,r,n,i){return t.extend(Lr(e),Mr(n,r,i))},Pr=function(t,e){return{u_matrix:t,u_world:e}},Or=function(e,r,n,i,a){return t.extend(Cr(e,r,n,i),{u_world:a})},Ir=function(e,r,n,i){var a,o,s=e.transform;if(\"map\"===i.paint.get(\"circle-pitch-alignment\")){var l=ge(n,1,s.zoom);a=!0,o=[l,l]}else a=!1,o=s.pixelsToGLUnits;return{u_camera_to_center_distance:s.cameraToCenterDistance,u_scale_with_map:+(\"map\"===i.paint.get(\"circle-pitch-scale\")),u_matrix:e.translatePosMatrix(r.posMatrix,n,i.paint.get(\"circle-translate\"),i.paint.get(\"circle-translate-anchor\")),u_pitch_with_map:+a,u_device_pixel_ratio:t.browser.devicePixelRatio,u_extrude_scale:o}},zr=function(t,e,r){var n=ge(r,1,e.zoom),i=Math.pow(2,e.zoom-r.tileID.overscaledZ),a=r.tileID.overscaleFactor();return{u_matrix:t,u_camera_to_center_distance:e.cameraToCenterDistance,u_pixels_to_tile_units:n,u_extrude_scale:[e.pixelsToGLUnits[0]/(n*i),e.pixelsToGLUnits[1]/(n*i)],u_overscale_factor:a}},Dr=function(t,e,r){return{u_matrix:t,u_inv_matrix:e,u_camera_to_center_distance:r.cameraToCenterDistance,u_viewport_size:[r.width,r.height]}},Rr=function(t,e,r){return void 0===r&&(r=1),{u_matrix:t,u_color:e,u_overlay:0,u_overlay_scale:r}},Fr=function(t){return{u_matrix:t}},Br=function(t,e,r,n){return{u_matrix:t,u_extrude_scale:ge(e,1,r),u_intensity:n}},Nr=function(e,r,n,i){var a=t.create();t.ortho(a,0,e.width,e.height,0,0,1);var o=e.context.gl;return{u_matrix:a,u_world:[o.drawingBufferWidth,o.drawingBufferHeight],u_image:n,u_color_ramp:i,u_opacity:r.paint.get(\"heatmap-opacity\")}},jr=function(e,r,n){var i=n.paint.get(\"hillshade-shadow-color\"),a=n.paint.get(\"hillshade-highlight-color\"),o=n.paint.get(\"hillshade-accent-color\"),s=n.paint.get(\"hillshade-illumination-direction\")*(Math.PI/180);\"viewport\"===n.paint.get(\"hillshade-illumination-anchor\")&&(s-=e.transform.angle);var l,u,c,f=!e.options.moving;return{u_matrix:e.transform.calculatePosMatrix(r.tileID.toUnwrapped(),f),u_image:0,u_latrange:(l=r.tileID,u=Math.pow(2,l.canonical.z),c=l.canonical.y,[new t.MercatorCoordinate(0,c/u).toLngLat().lat,new t.MercatorCoordinate(0,(c+1)/u).toLngLat().lat]),u_light:[n.paint.get(\"hillshade-exaggeration\"),s],u_shadow:i,u_highlight:a,u_accent:o}},Ur=function(e,r){var n=r.stride,i=t.create();return t.ortho(i,0,t.EXTENT,-t.EXTENT,0,0,1),t.translate(i,i,[0,-t.EXTENT,0]),{u_matrix:i,u_image:1,u_dimension:[n,n],u_zoom:e.overscaledZ,u_unpack:r.getUnpackVector()}};var Vr=function(e,r,n){var i=e.transform;return{u_matrix:Yr(e,r,n),u_ratio:1/ge(r,1,i.zoom),u_device_pixel_ratio:t.browser.devicePixelRatio,u_units_to_pixels:[1/i.pixelsToGLUnits[0],1/i.pixelsToGLUnits[1]]}},qr=function(e,r,n,i){return t.extend(Vr(e,r,n),{u_image:0,u_image_height:i})},Hr=function(e,r,n,i){var a=e.transform,o=Wr(r,a);return{u_matrix:Yr(e,r,n),u_texsize:r.imageAtlasTexture.size,u_ratio:1/ge(r,1,a.zoom),u_device_pixel_ratio:t.browser.devicePixelRatio,u_image:0,u_scale:[o,i.fromScale,i.toScale],u_fade:i.t,u_units_to_pixels:[1/a.pixelsToGLUnits[0],1/a.pixelsToGLUnits[1]]}},Gr=function(e,r,n,i,a){var o=e.transform,s=e.lineAtlas,l=Wr(r,o),u=\"round\"===n.layout.get(\"line-cap\"),c=s.getDash(i.from,u),f=s.getDash(i.to,u),h=c.width*a.fromScale,p=f.width*a.toScale;return t.extend(Vr(e,r,n),{u_patternscale_a:[l/h,-c.height/2],u_patternscale_b:[l/p,-f.height/2],u_sdfgamma:s.width/(256*Math.min(h,p)*t.browser.devicePixelRatio)/2,u_image:0,u_tex_y_a:c.y,u_tex_y_b:f.y,u_mix:a.t})};function Wr(t,e){return 1/ge(t,1,e.tileZoom)}function Yr(t,e,r){return t.translatePosMatrix(e.tileID.posMatrix,e,r.paint.get(\"line-translate\"),r.paint.get(\"line-translate-anchor\"))}var Xr=function(t,e,r,n,i){return{u_matrix:t,u_tl_parent:e,u_scale_parent:r,u_buffer_scale:1,u_fade_t:n.mix,u_opacity:n.opacity*i.paint.get(\"raster-opacity\"),u_image0:0,u_image1:1,u_brightness_low:i.paint.get(\"raster-brightness-min\"),u_brightness_high:i.paint.get(\"raster-brightness-max\"),u_saturation_factor:(o=i.paint.get(\"raster-saturation\"),o>0?1-1/(1.001-o):-o),u_contrast_factor:(a=i.paint.get(\"raster-contrast\"),a>0?1/(1-a):1+a),u_spin_weights:Zr(i.paint.get(\"raster-hue-rotate\"))};var a,o};function Zr(t){t*=Math.PI/180;var e=Math.sin(t),r=Math.cos(t);return[(2*r+1)/3,(-Math.sqrt(3)*e-r+1)/3,(Math.sqrt(3)*e-r+1)/3]}var Kr,Jr=function(t,e,r,n,i,a,o,s,l,u){var c=i.transform;return{u_is_size_zoom_constant:+(\"constant\"===t||\"source\"===t),u_is_size_feature_constant:+(\"constant\"===t||\"camera\"===t),u_size_t:e?e.uSizeT:0,u_size:e?e.uSize:0,u_camera_to_center_distance:c.cameraToCenterDistance,u_pitch:c.pitch/360*2*Math.PI,u_rotate_symbol:+r,u_aspect_ratio:c.width/c.height,u_fade_change:i.options.fadeDuration?i.symbolFadeChange:1,u_matrix:a,u_label_plane_matrix:o,u_coord_matrix:s,u_is_text:+l,u_pitch_with_map:+n,u_texsize:u,u_texture:0}},$r=function(e,r,n,i,a,o,s,l,u,c,f){var h=a.transform;return t.extend(Jr(e,r,n,i,a,o,s,l,u,c),{u_gamma_scale:i?Math.cos(h._pitch)*h.cameraToCenterDistance:1,u_device_pixel_ratio:t.browser.devicePixelRatio,u_is_halo:+f})},Qr=function(e,r,n,i,a,o,s,l,u,c){return t.extend($r(e,r,n,i,a,o,s,l,!0,u,!0),{u_texsize_icon:c,u_texture_icon:1})},tn=function(t,e,r){return{u_matrix:t,u_opacity:e,u_color:r}},en=function(e,r,n,i,a,o){return t.extend(function(t,e,r,n){var i=r.imageManager.getPattern(t.from.toString()),a=r.imageManager.getPattern(t.to.toString()),o=r.imageManager.getPixelSize(),s=o.width,l=o.height,u=Math.pow(2,n.tileID.overscaledZ),c=n.tileSize*Math.pow(2,r.transform.tileZoom)/u,f=c*(n.tileID.canonical.x+n.tileID.wrap*u),h=c*n.tileID.canonical.y;return{u_image:0,u_pattern_tl_a:i.tl,u_pattern_br_a:i.br,u_pattern_tl_b:a.tl,u_pattern_br_b:a.br,u_texsize:[s,l],u_mix:e.t,u_pattern_size_a:i.displaySize,u_pattern_size_b:a.displaySize,u_scale_a:e.fromScale,u_scale_b:e.toScale,u_tile_units_to_pixels:1/ge(n,1,r.transform.tileZoom),u_pixel_coord_upper:[f>>16,h>>16],u_pixel_coord_lower:[65535&f,65535&h]}}(i,o,n,a),{u_matrix:e,u_opacity:r})},rn={fillExtrusion:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_lightpos:new t.Uniform3f(e,r.u_lightpos),u_lightintensity:new t.Uniform1f(e,r.u_lightintensity),u_lightcolor:new t.Uniform3f(e,r.u_lightcolor),u_vertical_gradient:new t.Uniform1f(e,r.u_vertical_gradient),u_opacity:new t.Uniform1f(e,r.u_opacity)}},fillExtrusionPattern:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_lightpos:new t.Uniform3f(e,r.u_lightpos),u_lightintensity:new t.Uniform1f(e,r.u_lightintensity),u_lightcolor:new t.Uniform3f(e,r.u_lightcolor),u_vertical_gradient:new t.Uniform1f(e,r.u_vertical_gradient),u_height_factor:new t.Uniform1f(e,r.u_height_factor),u_image:new t.Uniform1i(e,r.u_image),u_texsize:new t.Uniform2f(e,r.u_texsize),u_pixel_coord_upper:new t.Uniform2f(e,r.u_pixel_coord_upper),u_pixel_coord_lower:new t.Uniform2f(e,r.u_pixel_coord_lower),u_scale:new t.Uniform3f(e,r.u_scale),u_fade:new t.Uniform1f(e,r.u_fade),u_opacity:new t.Uniform1f(e,r.u_opacity)}},fill:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix)}},fillPattern:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_image:new t.Uniform1i(e,r.u_image),u_texsize:new t.Uniform2f(e,r.u_texsize),u_pixel_coord_upper:new t.Uniform2f(e,r.u_pixel_coord_upper),u_pixel_coord_lower:new t.Uniform2f(e,r.u_pixel_coord_lower),u_scale:new t.Uniform3f(e,r.u_scale),u_fade:new t.Uniform1f(e,r.u_fade)}},fillOutline:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_world:new t.Uniform2f(e,r.u_world)}},fillOutlinePattern:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_world:new t.Uniform2f(e,r.u_world),u_image:new t.Uniform1i(e,r.u_image),u_texsize:new t.Uniform2f(e,r.u_texsize),u_pixel_coord_upper:new t.Uniform2f(e,r.u_pixel_coord_upper),u_pixel_coord_lower:new t.Uniform2f(e,r.u_pixel_coord_lower),u_scale:new t.Uniform3f(e,r.u_scale),u_fade:new t.Uniform1f(e,r.u_fade)}},circle:function(e,r){return{u_camera_to_center_distance:new t.Uniform1f(e,r.u_camera_to_center_distance),u_scale_with_map:new t.Uniform1i(e,r.u_scale_with_map),u_pitch_with_map:new t.Uniform1i(e,r.u_pitch_with_map),u_extrude_scale:new t.Uniform2f(e,r.u_extrude_scale),u_device_pixel_ratio:new t.Uniform1f(e,r.u_device_pixel_ratio),u_matrix:new t.UniformMatrix4f(e,r.u_matrix)}},collisionBox:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_camera_to_center_distance:new t.Uniform1f(e,r.u_camera_to_center_distance),u_pixels_to_tile_units:new t.Uniform1f(e,r.u_pixels_to_tile_units),u_extrude_scale:new t.Uniform2f(e,r.u_extrude_scale),u_overscale_factor:new t.Uniform1f(e,r.u_overscale_factor)}},collisionCircle:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_inv_matrix:new t.UniformMatrix4f(e,r.u_inv_matrix),u_camera_to_center_distance:new t.Uniform1f(e,r.u_camera_to_center_distance),u_viewport_size:new t.Uniform2f(e,r.u_viewport_size)}},debug:function(e,r){return{u_color:new t.UniformColor(e,r.u_color),u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_overlay:new t.Uniform1i(e,r.u_overlay),u_overlay_scale:new t.Uniform1f(e,r.u_overlay_scale)}},clippingMask:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix)}},heatmap:function(e,r){return{u_extrude_scale:new t.Uniform1f(e,r.u_extrude_scale),u_intensity:new t.Uniform1f(e,r.u_intensity),u_matrix:new t.UniformMatrix4f(e,r.u_matrix)}},heatmapTexture:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_world:new t.Uniform2f(e,r.u_world),u_image:new t.Uniform1i(e,r.u_image),u_color_ramp:new t.Uniform1i(e,r.u_color_ramp),u_opacity:new t.Uniform1f(e,r.u_opacity)}},hillshade:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_image:new t.Uniform1i(e,r.u_image),u_latrange:new t.Uniform2f(e,r.u_latrange),u_light:new t.Uniform2f(e,r.u_light),u_shadow:new t.UniformColor(e,r.u_shadow),u_highlight:new t.UniformColor(e,r.u_highlight),u_accent:new t.UniformColor(e,r.u_accent)}},hillshadePrepare:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_image:new t.Uniform1i(e,r.u_image),u_dimension:new t.Uniform2f(e,r.u_dimension),u_zoom:new t.Uniform1f(e,r.u_zoom),u_unpack:new t.Uniform4f(e,r.u_unpack)}},line:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_ratio:new t.Uniform1f(e,r.u_ratio),u_device_pixel_ratio:new t.Uniform1f(e,r.u_device_pixel_ratio),u_units_to_pixels:new t.Uniform2f(e,r.u_units_to_pixels)}},lineGradient:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_ratio:new t.Uniform1f(e,r.u_ratio),u_device_pixel_ratio:new t.Uniform1f(e,r.u_device_pixel_ratio),u_units_to_pixels:new t.Uniform2f(e,r.u_units_to_pixels),u_image:new t.Uniform1i(e,r.u_image),u_image_height:new t.Uniform1f(e,r.u_image_height)}},linePattern:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_texsize:new t.Uniform2f(e,r.u_texsize),u_ratio:new t.Uniform1f(e,r.u_ratio),u_device_pixel_ratio:new t.Uniform1f(e,r.u_device_pixel_ratio),u_image:new t.Uniform1i(e,r.u_image),u_units_to_pixels:new t.Uniform2f(e,r.u_units_to_pixels),u_scale:new t.Uniform3f(e,r.u_scale),u_fade:new t.Uniform1f(e,r.u_fade)}},lineSDF:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_ratio:new t.Uniform1f(e,r.u_ratio),u_device_pixel_ratio:new t.Uniform1f(e,r.u_device_pixel_ratio),u_units_to_pixels:new t.Uniform2f(e,r.u_units_to_pixels),u_patternscale_a:new t.Uniform2f(e,r.u_patternscale_a),u_patternscale_b:new t.Uniform2f(e,r.u_patternscale_b),u_sdfgamma:new t.Uniform1f(e,r.u_sdfgamma),u_image:new t.Uniform1i(e,r.u_image),u_tex_y_a:new t.Uniform1f(e,r.u_tex_y_a),u_tex_y_b:new t.Uniform1f(e,r.u_tex_y_b),u_mix:new t.Uniform1f(e,r.u_mix)}},raster:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_tl_parent:new t.Uniform2f(e,r.u_tl_parent),u_scale_parent:new t.Uniform1f(e,r.u_scale_parent),u_buffer_scale:new t.Uniform1f(e,r.u_buffer_scale),u_fade_t:new t.Uniform1f(e,r.u_fade_t),u_opacity:new t.Uniform1f(e,r.u_opacity),u_image0:new t.Uniform1i(e,r.u_image0),u_image1:new t.Uniform1i(e,r.u_image1),u_brightness_low:new t.Uniform1f(e,r.u_brightness_low),u_brightness_high:new t.Uniform1f(e,r.u_brightness_high),u_saturation_factor:new t.Uniform1f(e,r.u_saturation_factor),u_contrast_factor:new t.Uniform1f(e,r.u_contrast_factor),u_spin_weights:new t.Uniform3f(e,r.u_spin_weights)}},symbolIcon:function(e,r){return{u_is_size_zoom_constant:new t.Uniform1i(e,r.u_is_size_zoom_constant),u_is_size_feature_constant:new t.Uniform1i(e,r.u_is_size_feature_constant),u_size_t:new t.Uniform1f(e,r.u_size_t),u_size:new t.Uniform1f(e,r.u_size),u_camera_to_center_distance:new t.Uniform1f(e,r.u_camera_to_center_distance),u_pitch:new t.Uniform1f(e,r.u_pitch),u_rotate_symbol:new t.Uniform1i(e,r.u_rotate_symbol),u_aspect_ratio:new t.Uniform1f(e,r.u_aspect_ratio),u_fade_change:new t.Uniform1f(e,r.u_fade_change),u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_label_plane_matrix:new t.UniformMatrix4f(e,r.u_label_plane_matrix),u_coord_matrix:new t.UniformMatrix4f(e,r.u_coord_matrix),u_is_text:new t.Uniform1i(e,r.u_is_text),u_pitch_with_map:new t.Uniform1i(e,r.u_pitch_with_map),u_texsize:new t.Uniform2f(e,r.u_texsize),u_texture:new t.Uniform1i(e,r.u_texture)}},symbolSDF:function(e,r){return{u_is_size_zoom_constant:new t.Uniform1i(e,r.u_is_size_zoom_constant),u_is_size_feature_constant:new t.Uniform1i(e,r.u_is_size_feature_constant),u_size_t:new t.Uniform1f(e,r.u_size_t),u_size:new t.Uniform1f(e,r.u_size),u_camera_to_center_distance:new t.Uniform1f(e,r.u_camera_to_center_distance),u_pitch:new t.Uniform1f(e,r.u_pitch),u_rotate_symbol:new t.Uniform1i(e,r.u_rotate_symbol),u_aspect_ratio:new t.Uniform1f(e,r.u_aspect_ratio),u_fade_change:new t.Uniform1f(e,r.u_fade_change),u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_label_plane_matrix:new t.UniformMatrix4f(e,r.u_label_plane_matrix),u_coord_matrix:new t.UniformMatrix4f(e,r.u_coord_matrix),u_is_text:new t.Uniform1i(e,r.u_is_text),u_pitch_with_map:new t.Uniform1i(e,r.u_pitch_with_map),u_texsize:new t.Uniform2f(e,r.u_texsize),u_texture:new t.Uniform1i(e,r.u_texture),u_gamma_scale:new t.Uniform1f(e,r.u_gamma_scale),u_device_pixel_ratio:new t.Uniform1f(e,r.u_device_pixel_ratio),u_is_halo:new t.Uniform1i(e,r.u_is_halo)}},symbolTextAndIcon:function(e,r){return{u_is_size_zoom_constant:new t.Uniform1i(e,r.u_is_size_zoom_constant),u_is_size_feature_constant:new t.Uniform1i(e,r.u_is_size_feature_constant),u_size_t:new t.Uniform1f(e,r.u_size_t),u_size:new t.Uniform1f(e,r.u_size),u_camera_to_center_distance:new t.Uniform1f(e,r.u_camera_to_center_distance),u_pitch:new t.Uniform1f(e,r.u_pitch),u_rotate_symbol:new t.Uniform1i(e,r.u_rotate_symbol),u_aspect_ratio:new t.Uniform1f(e,r.u_aspect_ratio),u_fade_change:new t.Uniform1f(e,r.u_fade_change),u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_label_plane_matrix:new t.UniformMatrix4f(e,r.u_label_plane_matrix),u_coord_matrix:new t.UniformMatrix4f(e,r.u_coord_matrix),u_is_text:new t.Uniform1i(e,r.u_is_text),u_pitch_with_map:new t.Uniform1i(e,r.u_pitch_with_map),u_texsize:new t.Uniform2f(e,r.u_texsize),u_texsize_icon:new t.Uniform2f(e,r.u_texsize_icon),u_texture:new t.Uniform1i(e,r.u_texture),u_texture_icon:new t.Uniform1i(e,r.u_texture_icon),u_gamma_scale:new t.Uniform1f(e,r.u_gamma_scale),u_device_pixel_ratio:new t.Uniform1f(e,r.u_device_pixel_ratio),u_is_halo:new t.Uniform1i(e,r.u_is_halo)}},background:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_opacity:new t.Uniform1f(e,r.u_opacity),u_color:new t.UniformColor(e,r.u_color)}},backgroundPattern:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_opacity:new t.Uniform1f(e,r.u_opacity),u_image:new t.Uniform1i(e,r.u_image),u_pattern_tl_a:new t.Uniform2f(e,r.u_pattern_tl_a),u_pattern_br_a:new t.Uniform2f(e,r.u_pattern_br_a),u_pattern_tl_b:new t.Uniform2f(e,r.u_pattern_tl_b),u_pattern_br_b:new t.Uniform2f(e,r.u_pattern_br_b),u_texsize:new t.Uniform2f(e,r.u_texsize),u_mix:new t.Uniform1f(e,r.u_mix),u_pattern_size_a:new t.Uniform2f(e,r.u_pattern_size_a),u_pattern_size_b:new t.Uniform2f(e,r.u_pattern_size_b),u_scale_a:new t.Uniform1f(e,r.u_scale_a),u_scale_b:new t.Uniform1f(e,r.u_scale_b),u_pixel_coord_upper:new t.Uniform2f(e,r.u_pixel_coord_upper),u_pixel_coord_lower:new t.Uniform2f(e,r.u_pixel_coord_lower),u_tile_units_to_pixels:new t.Uniform1f(e,r.u_tile_units_to_pixels)}}};function nn(e,r,n,i,a,o,s){for(var l=e.context,u=l.gl,c=e.useProgram(\"collisionBox\"),f=[],h=0,p=0,d=0;d0){var _=t.create(),w=m;t.mul(_,y.placementInvProjMatrix,e.transform.glCoordMatrix),t.mul(_,_,y.placementViewportMatrix),f.push({circleArray:b,circleOffset:p,transform:w,invTransform:_}),p=h+=b.length/4}x&&c.draw(l,u.LINES,Mt.disabled,Et.disabled,e.colorModeForRenderPass(),Ct.disabled,zr(m,e.transform,g),n.id,x.layoutVertexBuffer,x.indexBuffer,x.segments,null,e.transform.zoom,null,null,x.collisionVertexBuffer)}}if(s&&f.length){var T=e.useProgram(\"collisionCircle\"),k=new t.StructArrayLayout2f1f2i16;k.resize(4*h),k._trim();for(var A=0,M=0,S=f;M=0&&(v[y.associatedIconIndex]={shiftedAnchor:S,angle:E})}else he(y.numGlyphs,p)}if(f){d.clear();for(var C=e.icon.placedSymbolArray,P=0;P0){var s=t.browser.now(),l=(s-e.timeAdded)/o,u=r?(s-r.timeAdded)/o:-1,c=n.getSource(),f=a.coveringZoomLevel({tileSize:c.tileSize,roundZoom:c.roundZoom}),h=!r||Math.abs(r.tileID.overscaledZ-f)>Math.abs(e.tileID.overscaledZ-f),p=h&&e.refreshedUponExpiration?1:t.clamp(h?l:1-u,0,1);return e.refreshedUponExpiration&&l>=1&&(e.refreshedUponExpiration=!1),r?{opacity:1,mix:1-p}:{opacity:p,mix:0}}return{opacity:1,mix:0}}var gn=new t.Color(1,0,0,1),yn=new t.Color(0,1,0,1),mn=new t.Color(0,0,1,1),xn=new t.Color(1,0,1,1),bn=new t.Color(0,1,1,1);function _n(t){var e=t.transform.padding;wn(t,t.transform.height-(e.top||0),3,gn),wn(t,e.bottom||0,3,yn),Tn(t,e.left||0,3,mn),Tn(t,t.transform.width-(e.right||0),3,xn);var r=t.transform.centerPoint;!function(t,e,r,n){var i=20,a=2;kn(t,e-a/2,r-i/2,a,i,n),kn(t,e-i/2,r-a/2,i,a,n)}(t,r.x,t.transform.height-r.y,bn)}function wn(t,e,r,n){kn(t,0,e+r/2,t.transform.width,r,n)}function Tn(t,e,r,n){kn(t,e-r/2,0,r,t.transform.height,n)}function kn(e,r,n,i,a,o){var s=e.context,l=s.gl;l.enable(l.SCISSOR_TEST),l.scissor(r*t.browser.devicePixelRatio,n*t.browser.devicePixelRatio,i*t.browser.devicePixelRatio,a*t.browser.devicePixelRatio),s.clear({color:o}),l.disable(l.SCISSOR_TEST)}function An(e,r,n){var i=e.context,a=i.gl,o=n.posMatrix,s=e.useProgram(\"debug\"),l=Mt.disabled,u=Et.disabled,c=e.colorModeForRenderPass(),f=\"$debug\";i.activeTexture.set(a.TEXTURE0),e.emptyTexture.bind(a.LINEAR,a.CLAMP_TO_EDGE),s.draw(i,a.LINE_STRIP,l,u,c,Ct.disabled,Rr(o,t.Color.red),f,e.debugBuffer,e.tileBorderIndexBuffer,e.debugSegments);var h=r.getTileByID(n.key).latestRawTileData,p=h&&h.byteLength||0,d=Math.floor(p/1024),v=r.getTile(n).tileSize,g=512/Math.min(v,512)*(n.overscaledZ/e.transform.zoom)*.5,y=n.canonical.toString();n.overscaledZ!==n.canonical.z&&(y+=\" => \"+n.overscaledZ),function(t,e){t.initDebugOverlayCanvas();var r=t.debugOverlayCanvas,n=t.context.gl,i=t.debugOverlayCanvas.getContext(\"2d\");i.clearRect(0,0,r.width,r.height),i.shadowColor=\"white\",i.shadowBlur=2,i.lineWidth=1.5,i.strokeStyle=\"white\",i.textBaseline=\"top\",i.font=\"bold 36px Open Sans, sans-serif\",i.fillText(e,5,5),i.strokeText(e,5,5),t.debugOverlayTexture.update(r),t.debugOverlayTexture.bind(n.LINEAR,n.CLAMP_TO_EDGE)}(e,y+\" \"+d+\"kb\"),s.draw(i,a.TRIANGLES,l,u,Lt.alphaBlended,Ct.disabled,Rr(o,t.Color.transparent,g),f,e.debugBuffer,e.quadTriangleIndexBuffer,e.debugSegments)}var Mn={symbol:function(e,r,n,i,a){if(\"translucent\"===e.renderPass){var o=Et.disabled,s=e.colorModeForRenderPass();n.layout.get(\"text-variable-anchor\")&&function(e,r,n,i,a,o,s){for(var l=r.transform,u=\"map\"===a,c=\"map\"===o,f=0,h=e;f256&&this.clearStencil(),r.setColorMode(Lt.disabled),r.setDepthMode(Mt.disabled);var i=this.useProgram(\"clippingMask\");this._tileClippingMaskIDs={};for(var a=0,o=e;a256&&this.clearStencil();var t=this.nextStencilID++,e=this.context.gl;return new Et({func:e.NOTEQUAL,mask:255},t,255,e.KEEP,e.KEEP,e.REPLACE)},Sn.prototype.stencilModeForClipping=function(t){var e=this.context.gl;return new Et({func:e.EQUAL,mask:255},this._tileClippingMaskIDs[t.key],0,e.KEEP,e.KEEP,e.REPLACE)},Sn.prototype.stencilConfigForOverlap=function(t){var e,r=this.context.gl,n=t.sort((function(t,e){return e.overscaledZ-t.overscaledZ})),i=n[n.length-1].overscaledZ,a=n[0].overscaledZ-i+1;if(a>1){this.currentStencilSource=void 0,this.nextStencilID+a>256&&this.clearStencil();for(var o={},s=0;s=0;this.currentLayer--){var w=this.style._layers[i[this.currentLayer]],T=a[w.source],k=c[w.source];this._renderTileClippingMasks(w,k),this.renderLayer(this,T,w,k)}for(this.renderPass=\"translucent\",this.currentLayer=0;this.currentLayer0?e.pop():null},Sn.prototype.isPatternMissing=function(t){if(!t)return!1;if(!t.from||!t.to)return!0;var e=this.imageManager.getPattern(t.from.toString()),r=this.imageManager.getPattern(t.to.toString());return!e||!r},Sn.prototype.useProgram=function(t,e){this.cache=this.cache||{};var r=\"\"+t+(e?e.cacheKey:\"\")+(this._showOverdrawInspector?\"/overdraw\":\"\");return this.cache[r]||(this.cache[r]=new Ar(this.context,t,wr[t],e,rn[t],this._showOverdrawInspector)),this.cache[r]},Sn.prototype.setCustomLayerDefaults=function(){this.context.unbindVAO(),this.context.cullFace.setDefault(),this.context.activeTexture.setDefault(),this.context.pixelStoreUnpack.setDefault(),this.context.pixelStoreUnpackPremultiplyAlpha.setDefault(),this.context.pixelStoreUnpackFlipY.setDefault()},Sn.prototype.setBaseState=function(){var t=this.context.gl;this.context.cullFace.set(!1),this.context.viewport.set([0,0,this.width,this.height]),this.context.blendEquation.set(t.FUNC_ADD)},Sn.prototype.initDebugOverlayCanvas=function(){if(null==this.debugOverlayCanvas){this.debugOverlayCanvas=t.window.document.createElement(\"canvas\"),this.debugOverlayCanvas.width=512,this.debugOverlayCanvas.height=512;var e=this.context.gl;this.debugOverlayTexture=new t.Texture(this.context,this.debugOverlayCanvas,e.RGBA)}},Sn.prototype.destroy=function(){this.emptyTexture.destroy(),this.debugOverlayTexture&&this.debugOverlayTexture.destroy()};var En=function(t,e){this.points=t,this.planes=e};En.fromInvProjectionMatrix=function(e,r,n){var i=Math.pow(2,n),a=[[-1,1,-1,1],[1,1,-1,1],[1,-1,-1,1],[-1,-1,-1,1],[-1,1,1,1],[1,1,1,1],[1,-1,1,1],[-1,-1,1,1]].map((function(r){return t.transformMat4([],r,e)})).map((function(e){return t.scale$1([],e,1/e[3]/r*i)})),o=[[0,1,2],[6,5,4],[0,3,7],[2,1,5],[3,2,6],[0,4,5]].map((function(e){var r=t.sub([],a[e[0]],a[e[1]]),n=t.sub([],a[e[2]],a[e[1]]),i=t.normalize([],t.cross([],r,n)),o=-t.dot(i,a[e[1]]);return i.concat(o)}));return new En(a,o)};var Ln=function(e,r){this.min=e,this.max=r,this.center=t.scale$2([],t.add([],this.min,this.max),.5)};Ln.prototype.quadrant=function(e){for(var r=[e%2==0,e<2],n=t.clone$2(this.min),i=t.clone$2(this.max),a=0;a=0;if(0===o)return 0;o!==r.length&&(n=!1)}if(n)return 2;for(var l=0;l<3;l++){for(var u=Number.MAX_VALUE,c=-Number.MAX_VALUE,f=0;fthis.max[l]-this.min[l])return 0}return 1};var Cn=function(t,e,r,n){if(void 0===t&&(t=0),void 0===e&&(e=0),void 0===r&&(r=0),void 0===n&&(n=0),isNaN(t)||t<0||isNaN(e)||e<0||isNaN(r)||r<0||isNaN(n)||n<0)throw new Error(\"Invalid value for edge-insets, top, bottom, left and right must all be numbers\");this.top=t,this.bottom=e,this.left=r,this.right=n};Cn.prototype.interpolate=function(e,r,n){return null!=r.top&&null!=e.top&&(this.top=t.number(e.top,r.top,n)),null!=r.bottom&&null!=e.bottom&&(this.bottom=t.number(e.bottom,r.bottom,n)),null!=r.left&&null!=e.left&&(this.left=t.number(e.left,r.left,n)),null!=r.right&&null!=e.right&&(this.right=t.number(e.right,r.right,n)),this},Cn.prototype.getCenter=function(e,r){var n=t.clamp((this.left+e-this.right)/2,0,e),i=t.clamp((this.top+r-this.bottom)/2,0,r);return new t.Point(n,i)},Cn.prototype.equals=function(t){return this.top===t.top&&this.bottom===t.bottom&&this.left===t.left&&this.right===t.right},Cn.prototype.clone=function(){return new Cn(this.top,this.bottom,this.left,this.right)},Cn.prototype.toJSON=function(){return{top:this.top,bottom:this.bottom,left:this.left,right:this.right}};var Pn=function(e,r,n,i,a){this.tileSize=512,this.maxValidLatitude=85.051129,this._renderWorldCopies=void 0===a||a,this._minZoom=e||0,this._maxZoom=r||22,this._minPitch=null==n?0:n,this._maxPitch=null==i?60:i,this.setMaxBounds(),this.width=0,this.height=0,this._center=new t.LngLat(0,0),this.zoom=0,this.angle=0,this._fov=.6435011087932844,this._pitch=0,this._unmodified=!0,this._edgeInsets=new Cn,this._posMatrixCache={},this._alignedPosMatrixCache={}},On={minZoom:{configurable:!0},maxZoom:{configurable:!0},minPitch:{configurable:!0},maxPitch:{configurable:!0},renderWorldCopies:{configurable:!0},worldSize:{configurable:!0},centerOffset:{configurable:!0},size:{configurable:!0},bearing:{configurable:!0},pitch:{configurable:!0},fov:{configurable:!0},zoom:{configurable:!0},center:{configurable:!0},padding:{configurable:!0},centerPoint:{configurable:!0},unmodified:{configurable:!0},point:{configurable:!0}};Pn.prototype.clone=function(){var t=new Pn(this._minZoom,this._maxZoom,this._minPitch,this.maxPitch,this._renderWorldCopies);return t.tileSize=this.tileSize,t.latRange=this.latRange,t.width=this.width,t.height=this.height,t._center=this._center,t.zoom=this.zoom,t.angle=this.angle,t._fov=this._fov,t._pitch=this._pitch,t._unmodified=this._unmodified,t._edgeInsets=this._edgeInsets.clone(),t._calcMatrices(),t},On.minZoom.get=function(){return this._minZoom},On.minZoom.set=function(t){this._minZoom!==t&&(this._minZoom=t,this.zoom=Math.max(this.zoom,t))},On.maxZoom.get=function(){return this._maxZoom},On.maxZoom.set=function(t){this._maxZoom!==t&&(this._maxZoom=t,this.zoom=Math.min(this.zoom,t))},On.minPitch.get=function(){return this._minPitch},On.minPitch.set=function(t){this._minPitch!==t&&(this._minPitch=t,this.pitch=Math.max(this.pitch,t))},On.maxPitch.get=function(){return this._maxPitch},On.maxPitch.set=function(t){this._maxPitch!==t&&(this._maxPitch=t,this.pitch=Math.min(this.pitch,t))},On.renderWorldCopies.get=function(){return this._renderWorldCopies},On.renderWorldCopies.set=function(t){void 0===t?t=!0:null===t&&(t=!1),this._renderWorldCopies=t},On.worldSize.get=function(){return this.tileSize*this.scale},On.centerOffset.get=function(){return this.centerPoint._sub(this.size._div(2))},On.size.get=function(){return new t.Point(this.width,this.height)},On.bearing.get=function(){return-this.angle/Math.PI*180},On.bearing.set=function(e){var r=-t.wrap(e,-180,180)*Math.PI/180;this.angle!==r&&(this._unmodified=!1,this.angle=r,this._calcMatrices(),this.rotationMatrix=t.create$2(),t.rotate(this.rotationMatrix,this.rotationMatrix,this.angle))},On.pitch.get=function(){return this._pitch/Math.PI*180},On.pitch.set=function(e){var r=t.clamp(e,this.minPitch,this.maxPitch)/180*Math.PI;this._pitch!==r&&(this._unmodified=!1,this._pitch=r,this._calcMatrices())},On.fov.get=function(){return this._fov/Math.PI*180},On.fov.set=function(t){t=Math.max(.01,Math.min(60,t)),this._fov!==t&&(this._unmodified=!1,this._fov=t/180*Math.PI,this._calcMatrices())},On.zoom.get=function(){return this._zoom},On.zoom.set=function(t){var e=Math.min(Math.max(t,this.minZoom),this.maxZoom);this._zoom!==e&&(this._unmodified=!1,this._zoom=e,this.scale=this.zoomScale(e),this.tileZoom=Math.floor(e),this.zoomFraction=e-this.tileZoom,this._constrain(),this._calcMatrices())},On.center.get=function(){return this._center},On.center.set=function(t){t.lat===this._center.lat&&t.lng===this._center.lng||(this._unmodified=!1,this._center=t,this._constrain(),this._calcMatrices())},On.padding.get=function(){return this._edgeInsets.toJSON()},On.padding.set=function(t){this._edgeInsets.equals(t)||(this._unmodified=!1,this._edgeInsets.interpolate(this._edgeInsets,t,1),this._calcMatrices())},On.centerPoint.get=function(){return this._edgeInsets.getCenter(this.width,this.height)},Pn.prototype.isPaddingEqual=function(t){return this._edgeInsets.equals(t)},Pn.prototype.interpolatePadding=function(t,e,r){this._unmodified=!1,this._edgeInsets.interpolate(t,e,r),this._constrain(),this._calcMatrices()},Pn.prototype.coveringZoomLevel=function(t){var e=(t.roundZoom?Math.round:Math.floor)(this.zoom+this.scaleZoom(this.tileSize/t.tileSize));return Math.max(0,e)},Pn.prototype.getVisibleUnwrappedCoordinates=function(e){var r=[new t.UnwrappedTileID(0,e)];if(this._renderWorldCopies)for(var n=this.pointCoordinate(new t.Point(0,0)),i=this.pointCoordinate(new t.Point(this.width,0)),a=this.pointCoordinate(new t.Point(this.width,this.height)),o=this.pointCoordinate(new t.Point(0,this.height)),s=Math.floor(Math.min(n.x,i.x,a.x,o.x)),l=Math.floor(Math.max(n.x,i.x,a.x,o.x)),u=s-1;u<=l+1;u++)0!==u&&r.push(new t.UnwrappedTileID(u,e));return r},Pn.prototype.coveringTiles=function(e){var r=this.coveringZoomLevel(e),n=r;if(void 0!==e.minzoom&&re.maxzoom&&(r=e.maxzoom);var i=t.MercatorCoordinate.fromLngLat(this.center),a=Math.pow(2,r),o=[a*i.x,a*i.y,0],s=En.fromInvProjectionMatrix(this.invProjMatrix,this.worldSize,r),l=e.minzoom||0;this.pitch<=60&&this._edgeInsets.top<.1&&(l=r);var u=function(t){return{aabb:new Ln([t*a,0,0],[(t+1)*a,a,0]),zoom:0,x:0,y:0,wrap:t,fullyVisible:!1}},c=[],f=[],h=r,p=e.reparseOverscaled?n:r;if(this._renderWorldCopies)for(var d=1;d<=3;d++)c.push(u(-d)),c.push(u(d));for(c.push(u(0));c.length>0;){var v=c.pop(),g=v.x,y=v.y,m=v.fullyVisible;if(!m){var x=v.aabb.intersects(s);if(0===x)continue;m=2===x}var b=v.aabb.distanceX(o),_=v.aabb.distanceY(o),w=Math.max(Math.abs(b),Math.abs(_)),T=3+(1<T&&v.zoom>=l)f.push({tileID:new t.OverscaledTileID(v.zoom===h?p:v.zoom,v.wrap,v.zoom,g,y),distanceSq:t.sqrLen([o[0]-.5-g,o[1]-.5-y])});else for(var k=0;k<4;k++){var A=(g<<1)+k%2,M=(y<<1)+(k>>1);c.push({aabb:v.aabb.quadrant(k),zoom:v.zoom+1,x:A,y:M,wrap:v.wrap,fullyVisible:m})}}return f.sort((function(t,e){return t.distanceSq-e.distanceSq})).map((function(t){return t.tileID}))},Pn.prototype.resize=function(t,e){this.width=t,this.height=e,this.pixelsToGLUnits=[2/t,-2/e],this._constrain(),this._calcMatrices()},On.unmodified.get=function(){return this._unmodified},Pn.prototype.zoomScale=function(t){return Math.pow(2,t)},Pn.prototype.scaleZoom=function(t){return Math.log(t)/Math.LN2},Pn.prototype.project=function(e){var r=t.clamp(e.lat,-this.maxValidLatitude,this.maxValidLatitude);return new t.Point(t.mercatorXfromLng(e.lng)*this.worldSize,t.mercatorYfromLat(r)*this.worldSize)},Pn.prototype.unproject=function(e){return new t.MercatorCoordinate(e.x/this.worldSize,e.y/this.worldSize).toLngLat()},On.point.get=function(){return this.project(this.center)},Pn.prototype.setLocationAtPoint=function(e,r){var n=this.pointCoordinate(r),i=this.pointCoordinate(this.centerPoint),a=this.locationCoordinate(e),o=new t.MercatorCoordinate(a.x-(n.x-i.x),a.y-(n.y-i.y));this.center=this.coordinateLocation(o),this._renderWorldCopies&&(this.center=this.center.wrap())},Pn.prototype.locationPoint=function(t){return this.coordinatePoint(this.locationCoordinate(t))},Pn.prototype.pointLocation=function(t){return this.coordinateLocation(this.pointCoordinate(t))},Pn.prototype.locationCoordinate=function(e){return t.MercatorCoordinate.fromLngLat(e)},Pn.prototype.coordinateLocation=function(t){return t.toLngLat()},Pn.prototype.pointCoordinate=function(e){var r=[e.x,e.y,0,1],n=[e.x,e.y,1,1];t.transformMat4(r,r,this.pixelMatrixInverse),t.transformMat4(n,n,this.pixelMatrixInverse);var i=r[3],a=n[3],o=r[0]/i,s=n[0]/a,l=r[1]/i,u=n[1]/a,c=r[2]/i,f=n[2]/a,h=c===f?0:(0-c)/(f-c);return new t.MercatorCoordinate(t.number(o,s,h)/this.worldSize,t.number(l,u,h)/this.worldSize)},Pn.prototype.coordinatePoint=function(e){var r=[e.x*this.worldSize,e.y*this.worldSize,0,1];return t.transformMat4(r,r,this.pixelMatrix),new t.Point(r[0]/r[3],r[1]/r[3])},Pn.prototype.getBounds=function(){return(new t.LngLatBounds).extend(this.pointLocation(new t.Point(0,0))).extend(this.pointLocation(new t.Point(this.width,0))).extend(this.pointLocation(new t.Point(this.width,this.height))).extend(this.pointLocation(new t.Point(0,this.height)))},Pn.prototype.getMaxBounds=function(){return this.latRange&&2===this.latRange.length&&this.lngRange&&2===this.lngRange.length?new t.LngLatBounds([this.lngRange[0],this.latRange[0]],[this.lngRange[1],this.latRange[1]]):null},Pn.prototype.setMaxBounds=function(t){t?(this.lngRange=[t.getWest(),t.getEast()],this.latRange=[t.getSouth(),t.getNorth()],this._constrain()):(this.lngRange=null,this.latRange=[-this.maxValidLatitude,this.maxValidLatitude])},Pn.prototype.calculatePosMatrix=function(e,r){void 0===r&&(r=!1);var n=e.key,i=r?this._alignedPosMatrixCache:this._posMatrixCache;if(i[n])return i[n];var a=e.canonical,o=this.worldSize/this.zoomScale(a.z),s=a.x+Math.pow(2,a.z)*e.wrap,l=t.identity(new Float64Array(16));return t.translate(l,l,[s*o,a.y*o,0]),t.scale(l,l,[o/t.EXTENT,o/t.EXTENT,1]),t.multiply(l,r?this.alignedProjMatrix:this.projMatrix,l),i[n]=new Float32Array(l),i[n]},Pn.prototype.customLayerMatrix=function(){return this.mercatorMatrix.slice()},Pn.prototype._constrain=function(){if(this.center&&this.width&&this.height&&!this._constraining){this._constraining=!0;var e,r,n,i,a=-90,o=90,s=-180,l=180,u=this.size,c=this._unmodified;if(this.latRange){var f=this.latRange;a=t.mercatorYfromLat(f[1])*this.worldSize,e=(o=t.mercatorYfromLat(f[0])*this.worldSize)-ao&&(i=o-g)}if(this.lngRange){var y=p.x,m=u.x/2;y-ml&&(n=l-m)}void 0===n&&void 0===i||(this.center=this.unproject(new t.Point(void 0!==n?n:p.x,void 0!==i?i:p.y))),this._unmodified=c,this._constraining=!1}},Pn.prototype._calcMatrices=function(){if(this.height){var e=this._fov/2,r=this.centerOffset;this.cameraToCenterDistance=.5/Math.tan(e)*this.height;var n=Math.PI/2+this._pitch,i=this._fov*(.5+r.y/this.height),a=Math.sin(i)*this.cameraToCenterDistance/Math.sin(t.clamp(Math.PI-n-i,.01,Math.PI-.01)),o=this.point,s=o.x,l=o.y,u=1.01*(Math.cos(Math.PI/2-this._pitch)*a+this.cameraToCenterDistance),c=this.height/50,f=new Float64Array(16);t.perspective(f,this._fov,this.width/this.height,c,u),f[8]=2*-r.x/this.width,f[9]=2*r.y/this.height,t.scale(f,f,[1,-1,1]),t.translate(f,f,[0,0,-this.cameraToCenterDistance]),t.rotateX(f,f,this._pitch),t.rotateZ(f,f,this.angle),t.translate(f,f,[-s,-l,0]),this.mercatorMatrix=t.scale([],f,[this.worldSize,this.worldSize,this.worldSize]),t.scale(f,f,[1,1,t.mercatorZfromAltitude(1,this.center.lat)*this.worldSize,1]),this.projMatrix=f,this.invProjMatrix=t.invert([],this.projMatrix);var h=this.width%2/2,p=this.height%2/2,d=Math.cos(this.angle),v=Math.sin(this.angle),g=s-Math.round(s)+d*h+v*p,y=l-Math.round(l)+d*p+v*h,m=new Float64Array(f);if(t.translate(m,m,[g>.5?g-1:g,y>.5?y-1:y,0]),this.alignedProjMatrix=m,f=t.create(),t.scale(f,f,[this.width/2,-this.height/2,1]),t.translate(f,f,[1,-1,0]),this.labelPlaneMatrix=f,f=t.create(),t.scale(f,f,[1,-1,1]),t.translate(f,f,[-1,-1,0]),t.scale(f,f,[2/this.width,2/this.height,1]),this.glCoordMatrix=f,this.pixelMatrix=t.multiply(new Float64Array(16),this.labelPlaneMatrix,this.projMatrix),!(f=t.invert(new Float64Array(16),this.pixelMatrix)))throw new Error(\"failed to invert matrix\");this.pixelMatrixInverse=f,this._posMatrixCache={},this._alignedPosMatrixCache={}}},Pn.prototype.maxPitchScaleFactor=function(){if(!this.pixelMatrixInverse)return 1;var e=this.pointCoordinate(new t.Point(0,0)),r=[e.x*this.worldSize,e.y*this.worldSize,0,1];return t.transformMat4(r,r,this.pixelMatrix)[3]/this.cameraToCenterDistance},Pn.prototype.getCameraPoint=function(){var e=this._pitch,r=Math.tan(e)*(this.cameraToCenterDistance||1);return this.centerPoint.add(new t.Point(0,r))},Pn.prototype.getCameraQueryGeometry=function(e){var r=this.getCameraPoint();if(1===e.length)return[e[0],r];for(var n=r.x,i=r.y,a=r.x,o=r.y,s=0,l=e;s=3&&!t.some((function(t){return isNaN(t)}))){var e=this._map.dragRotate.isEnabled()&&this._map.touchZoomRotate.isEnabled()?+(t[3]||0):this._map.getBearing();return this._map.jumpTo({center:[+t[2],+t[1]],zoom:+t[0],bearing:e,pitch:+(t[4]||0)}),!0}return!1},In.prototype._updateHashUnthrottled=function(){var e=t.window.location.href.replace(/(#.+)?$/,this.getHashString());try{t.window.history.replaceState(t.window.history.state,null,e)}catch(t){}};var zn={linearity:.3,easing:t.bezier(0,0,.3,1)},Dn=t.extend({deceleration:2500,maxSpeed:1400},zn),Rn=t.extend({deceleration:20,maxSpeed:1400},zn),Fn=t.extend({deceleration:1e3,maxSpeed:360},zn),Bn=t.extend({deceleration:1e3,maxSpeed:90},zn),Nn=function(t){this._map=t,this.clear()};function jn(t,e){(!t.duration||t.duration0&&r-e[0].time>160;)e.shift()},Nn.prototype._onMoveEnd=function(e){if(this._drainInertiaBuffer(),!(this._inertiaBuffer.length<2)){for(var r={zoom:0,bearing:0,pitch:0,pan:new t.Point(0,0),pinchAround:void 0,around:void 0},n=0,i=this._inertiaBuffer;n=this._clickTolerance||this._map.fire(new Vn(t.type,this._map,t))},Gn.prototype.dblclick=function(t){return this._firePreventable(new Vn(t.type,this._map,t))},Gn.prototype.mouseover=function(t){this._map.fire(new Vn(t.type,this._map,t))},Gn.prototype.mouseout=function(t){this._map.fire(new Vn(t.type,this._map,t))},Gn.prototype.touchstart=function(t){return this._firePreventable(new qn(t.type,this._map,t))},Gn.prototype.touchmove=function(t){this._map.fire(new qn(t.type,this._map,t))},Gn.prototype.touchend=function(t){this._map.fire(new qn(t.type,this._map,t))},Gn.prototype.touchcancel=function(t){this._map.fire(new qn(t.type,this._map,t))},Gn.prototype._firePreventable=function(t){if(this._map.fire(t),t.defaultPrevented)return{}},Gn.prototype.isEnabled=function(){return!0},Gn.prototype.isActive=function(){return!1},Gn.prototype.enable=function(){},Gn.prototype.disable=function(){};var Wn=function(t){this._map=t};Wn.prototype.reset=function(){this._delayContextMenu=!1,delete this._contextMenuEvent},Wn.prototype.mousemove=function(t){this._map.fire(new Vn(t.type,this._map,t))},Wn.prototype.mousedown=function(){this._delayContextMenu=!0},Wn.prototype.mouseup=function(){this._delayContextMenu=!1,this._contextMenuEvent&&(this._map.fire(new Vn(\"contextmenu\",this._map,this._contextMenuEvent)),delete this._contextMenuEvent)},Wn.prototype.contextmenu=function(t){this._delayContextMenu?this._contextMenuEvent=t:this._map.fire(new Vn(t.type,this._map,t)),this._map.listens(\"contextmenu\")&&t.preventDefault()},Wn.prototype.isEnabled=function(){return!0},Wn.prototype.isActive=function(){return!1},Wn.prototype.enable=function(){},Wn.prototype.disable=function(){};var Yn=function(t,e){this._map=t,this._el=t.getCanvasContainer(),this._container=t.getContainer(),this._clickTolerance=e.clickTolerance||1};function Xn(t,e){for(var r={},n=0;nthis.numTouches)&&(this.aborted=!0),this.aborted||(void 0===this.startTime&&(this.startTime=e.timeStamp),n.length===this.numTouches&&(this.centroid=function(e){for(var r=new t.Point(0,0),n=0,i=e;n30)&&(this.aborted=!0)}}},Zn.prototype.touchend=function(t,e,r){if((!this.centroid||t.timeStamp-this.startTime>500)&&(this.aborted=!0),0===r.length){var n=!this.aborted&&this.centroid;if(this.reset(),n)return n}};var Kn=function(t){this.singleTap=new Zn(t),this.numTaps=t.numTaps,this.reset()};Kn.prototype.reset=function(){this.lastTime=1/0,delete this.lastTap,this.count=0,this.singleTap.reset()},Kn.prototype.touchstart=function(t,e,r){this.singleTap.touchstart(t,e,r)},Kn.prototype.touchmove=function(t,e,r){this.singleTap.touchmove(t,e,r)},Kn.prototype.touchend=function(t,e,r){var n=this.singleTap.touchend(t,e,r);if(n){var i=t.timeStamp-this.lastTime<500,a=!this.lastTap||this.lastTap.dist(n)<30;if(i&&a||this.reset(),this.count++,this.lastTime=t.timeStamp,this.lastTap=n,this.count===this.numTaps)return this.reset(),n}};var Jn=function(){this._zoomIn=new Kn({numTouches:1,numTaps:2}),this._zoomOut=new Kn({numTouches:2,numTaps:1}),this.reset()};Jn.prototype.reset=function(){this._active=!1,this._zoomIn.reset(),this._zoomOut.reset()},Jn.prototype.touchstart=function(t,e,r){this._zoomIn.touchstart(t,e,r),this._zoomOut.touchstart(t,e,r)},Jn.prototype.touchmove=function(t,e,r){this._zoomIn.touchmove(t,e,r),this._zoomOut.touchmove(t,e,r)},Jn.prototype.touchend=function(t,e,r){var n=this,i=this._zoomIn.touchend(t,e,r),a=this._zoomOut.touchend(t,e,r);return i?(this._active=!0,t.preventDefault(),setTimeout((function(){return n.reset()}),0),{cameraAnimation:function(e){return e.easeTo({duration:300,zoom:e.getZoom()+1,around:e.unproject(i)},{originalEvent:t})}}):a?(this._active=!0,t.preventDefault(),setTimeout((function(){return n.reset()}),0),{cameraAnimation:function(e){return e.easeTo({duration:300,zoom:e.getZoom()-1,around:e.unproject(a)},{originalEvent:t})}}):void 0},Jn.prototype.touchcancel=function(){this.reset()},Jn.prototype.enable=function(){this._enabled=!0},Jn.prototype.disable=function(){this._enabled=!1,this.reset()},Jn.prototype.isEnabled=function(){return this._enabled},Jn.prototype.isActive=function(){return this._active};var $n={};$n[0]=1,$n[2]=2;var Qn=function(t){this.reset(),this._clickTolerance=t.clickTolerance||1};Qn.prototype.reset=function(){this._active=!1,this._moved=!1,delete this._lastPoint,delete this._eventButton},Qn.prototype._correctButton=function(t,e){return!1},Qn.prototype._move=function(t,e){return{}},Qn.prototype.mousedown=function(t,e){if(!this._lastPoint){var n=r.mouseButton(t);this._correctButton(t,n)&&(this._lastPoint=e,this._eventButton=n)}},Qn.prototype.mousemoveWindow=function(t,e){var r=this._lastPoint;if(r)if(t.preventDefault(),function(t,e){var r=$n[e];return void 0===t.buttons||(t.buttons&r)!==r}(t,this._eventButton))this.reset();else if(this._moved||!(e.dist(r)0&&(this._active=!0);var i=Xn(n,r),a=new t.Point(0,0),o=new t.Point(0,0),s=0;for(var l in i){var u=i[l],c=this._touches[l];c&&(a._add(u),o._add(u.sub(c)),s++,i[l]=u)}if(this._touches=i,!(sMath.abs(t.x)}var fi=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.reset=function(){t.prototype.reset.call(this),this._valid=void 0,delete this._firstMove,delete this._lastPoints},e.prototype._start=function(t){this._lastPoints=t,ci(t[0].sub(t[1]))&&(this._valid=!1)},e.prototype._move=function(t,e,r){var n=t[0].sub(this._lastPoints[0]),i=t[1].sub(this._lastPoints[1]);if(this._valid=this.gestureBeginsVertically(n,i,r.timeStamp),this._valid)return this._lastPoints=t,this._active=!0,{pitchDelta:(n.y+i.y)/2*-.5}},e.prototype.gestureBeginsVertically=function(t,e,r){if(void 0!==this._valid)return this._valid;var n=t.mag()>=2,i=e.mag()>=2;if(n||i){if(!n||!i)return void 0===this._firstMove&&(this._firstMove=r),r-this._firstMove<100&&void 0;var a=t.y>0==e.y>0;return ci(t)&&ci(e)&&a}},e}(ii),hi={panStep:100,bearingStep:15,pitchStep:10},pi=function(){var t=hi;this._panStep=t.panStep,this._bearingStep=t.bearingStep,this._pitchStep=t.pitchStep,this._rotationDisabled=!1};function di(t){return t*(2-t)}pi.prototype.reset=function(){this._active=!1},pi.prototype.keydown=function(t){var e=this;if(!(t.altKey||t.ctrlKey||t.metaKey)){var r=0,n=0,i=0,a=0,o=0;switch(t.keyCode){case 61:case 107:case 171:case 187:r=1;break;case 189:case 109:case 173:r=-1;break;case 37:t.shiftKey?n=-1:(t.preventDefault(),a=-1);break;case 39:t.shiftKey?n=1:(t.preventDefault(),a=1);break;case 38:t.shiftKey?i=1:(t.preventDefault(),o=-1);break;case 40:t.shiftKey?i=-1:(t.preventDefault(),o=1);break;default:return}return this._rotationDisabled&&(n=0,i=0),{cameraAnimation:function(s){var l=s.getZoom();s.easeTo({duration:300,easeId:\"keyboardHandler\",easing:di,zoom:r?Math.round(l)+r*(t.shiftKey?2:1):l,bearing:s.getBearing()+n*e._bearingStep,pitch:s.getPitch()+i*e._pitchStep,offset:[-a*e._panStep,-o*e._panStep],center:s.getCenter()},{originalEvent:t})}}}},pi.prototype.enable=function(){this._enabled=!0},pi.prototype.disable=function(){this._enabled=!1,this.reset()},pi.prototype.isEnabled=function(){return this._enabled},pi.prototype.isActive=function(){return this._active},pi.prototype.disableRotation=function(){this._rotationDisabled=!0},pi.prototype.enableRotation=function(){this._rotationDisabled=!1};var vi=4.000244140625,gi=function(e,r){this._map=e,this._el=e.getCanvasContainer(),this._handler=r,this._delta=0,this._defaultZoomRate=.01,this._wheelZoomRate=.0022222222222222222,t.bindAll([\"_onTimeout\"],this)};gi.prototype.setZoomRate=function(t){this._defaultZoomRate=t},gi.prototype.setWheelZoomRate=function(t){this._wheelZoomRate=t},gi.prototype.isEnabled=function(){return!!this._enabled},gi.prototype.isActive=function(){return!!this._active||void 0!==this._finishTimeout},gi.prototype.isZooming=function(){return!!this._zooming},gi.prototype.enable=function(t){this.isEnabled()||(this._enabled=!0,this._aroundCenter=t&&\"center\"===t.around)},gi.prototype.disable=function(){this.isEnabled()&&(this._enabled=!1)},gi.prototype.wheel=function(e){if(this.isEnabled()){var r=e.deltaMode===t.window.WheelEvent.DOM_DELTA_LINE?40*e.deltaY:e.deltaY,n=t.browser.now(),i=n-(this._lastWheelEventTime||0);this._lastWheelEventTime=n,0!==r&&r%vi==0?this._type=\"wheel\":0!==r&&Math.abs(r)<4?this._type=\"trackpad\":i>400?(this._type=null,this._lastValue=r,this._timeout=setTimeout(this._onTimeout,40,e)):this._type||(this._type=Math.abs(i*r)<200?\"trackpad\":\"wheel\",this._timeout&&(clearTimeout(this._timeout),this._timeout=null,r+=this._lastValue)),e.shiftKey&&r&&(r/=4),this._type&&(this._lastWheelEvent=e,this._delta-=r,this._active||this._start(e)),e.preventDefault()}},gi.prototype._onTimeout=function(t){this._type=\"wheel\",this._delta-=this._lastValue,this._active||this._start(t)},gi.prototype._start=function(e){if(this._delta){this._frameId&&(this._frameId=null),this._active=!0,this.isZooming()||(this._zooming=!0),this._finishTimeout&&(clearTimeout(this._finishTimeout),delete this._finishTimeout);var n=r.mousePos(this._el,e);this._around=t.LngLat.convert(this._aroundCenter?this._map.getCenter():this._map.unproject(n)),this._aroundPoint=this._map.transform.locationPoint(this._around),this._frameId||(this._frameId=!0,this._handler._triggerRenderFrame())}},gi.prototype.renderFrame=function(){var e=this;if(this._frameId&&(this._frameId=null,this.isActive())){var r=this._map.transform;if(0!==this._delta){var n=\"wheel\"===this._type&&Math.abs(this._delta)>vi?this._wheelZoomRate:this._defaultZoomRate,i=2/(1+Math.exp(-Math.abs(this._delta*n)));this._delta<0&&0!==i&&(i=1/i);var a=\"number\"==typeof this._targetZoom?r.zoomScale(this._targetZoom):r.scale;this._targetZoom=Math.min(r.maxZoom,Math.max(r.minZoom,r.scaleZoom(a*i))),\"wheel\"===this._type&&(this._startZoom=r.zoom,this._easing=this._smoothOutEasing(200)),this._delta=0}var o,s=\"number\"==typeof this._targetZoom?this._targetZoom:r.zoom,l=this._startZoom,u=this._easing,c=!1;if(\"wheel\"===this._type&&l&&u){var f=Math.min((t.browser.now()-this._lastWheelEventTime)/200,1),h=u(f);o=t.number(l,s,h),f<1?this._frameId||(this._frameId=!0):c=!0}else o=s,c=!0;return this._active=!0,c&&(this._active=!1,this._finishTimeout=setTimeout((function(){e._zooming=!1,e._handler._triggerRenderFrame(),delete e._targetZoom,delete e._finishTimeout}),200)),{noInertia:!0,needsRenderFrame:!c,zoomDelta:o-r.zoom,around:this._aroundPoint,originalEvent:this._lastWheelEvent}}},gi.prototype._smoothOutEasing=function(e){var r=t.ease;if(this._prevEase){var n=this._prevEase,i=(t.browser.now()-n.start)/n.duration,a=n.easing(i+.01)-n.easing(i),o=.27/Math.sqrt(a*a+1e-4)*.01,s=Math.sqrt(.0729-o*o);r=t.bezier(o,s,.25,1)}return this._prevEase={start:t.browser.now(),duration:e,easing:r},r},gi.prototype.reset=function(){this._active=!1};var yi=function(t,e){this._clickZoom=t,this._tapZoom=e};yi.prototype.enable=function(){this._clickZoom.enable(),this._tapZoom.enable()},yi.prototype.disable=function(){this._clickZoom.disable(),this._tapZoom.disable()},yi.prototype.isEnabled=function(){return this._clickZoom.isEnabled()&&this._tapZoom.isEnabled()},yi.prototype.isActive=function(){return this._clickZoom.isActive()||this._tapZoom.isActive()};var mi=function(){this.reset()};mi.prototype.reset=function(){this._active=!1},mi.prototype.dblclick=function(t,e){return t.preventDefault(),{cameraAnimation:function(r){r.easeTo({duration:300,zoom:r.getZoom()+(t.shiftKey?-1:1),around:r.unproject(e)},{originalEvent:t})}}},mi.prototype.enable=function(){this._enabled=!0},mi.prototype.disable=function(){this._enabled=!1,this.reset()},mi.prototype.isEnabled=function(){return this._enabled},mi.prototype.isActive=function(){return this._active};var xi=function(){this._tap=new Kn({numTouches:1,numTaps:1}),this.reset()};xi.prototype.reset=function(){this._active=!1,delete this._swipePoint,delete this._swipeTouch,delete this._tapTime,this._tap.reset()},xi.prototype.touchstart=function(t,e,r){this._swipePoint||(this._tapTime&&t.timeStamp-this._tapTime>500&&this.reset(),this._tapTime?r.length>0&&(this._swipePoint=e[0],this._swipeTouch=r[0].identifier):this._tap.touchstart(t,e,r))},xi.prototype.touchmove=function(t,e,r){if(this._tapTime){if(this._swipePoint){if(r[0].identifier!==this._swipeTouch)return;var n=e[0],i=n.y-this._swipePoint.y;return this._swipePoint=n,t.preventDefault(),this._active=!0,{zoomDelta:i/128}}}else this._tap.touchmove(t,e,r)},xi.prototype.touchend=function(t,e,r){this._tapTime?this._swipePoint&&0===r.length&&this.reset():this._tap.touchend(t,e,r)&&(this._tapTime=t.timeStamp)},xi.prototype.touchcancel=function(){this.reset()},xi.prototype.enable=function(){this._enabled=!0},xi.prototype.disable=function(){this._enabled=!1,this.reset()},xi.prototype.isEnabled=function(){return this._enabled},xi.prototype.isActive=function(){return this._active};var bi=function(t,e,r){this._el=t,this._mousePan=e,this._touchPan=r};bi.prototype.enable=function(t){this._inertiaOptions=t||{},this._mousePan.enable(),this._touchPan.enable(),this._el.classList.add(\"mapboxgl-touch-drag-pan\")},bi.prototype.disable=function(){this._mousePan.disable(),this._touchPan.disable(),this._el.classList.remove(\"mapboxgl-touch-drag-pan\")},bi.prototype.isEnabled=function(){return this._mousePan.isEnabled()&&this._touchPan.isEnabled()},bi.prototype.isActive=function(){return this._mousePan.isActive()||this._touchPan.isActive()};var _i=function(t,e,r){this._pitchWithRotate=t.pitchWithRotate,this._mouseRotate=e,this._mousePitch=r};_i.prototype.enable=function(){this._mouseRotate.enable(),this._pitchWithRotate&&this._mousePitch.enable()},_i.prototype.disable=function(){this._mouseRotate.disable(),this._mousePitch.disable()},_i.prototype.isEnabled=function(){return this._mouseRotate.isEnabled()&&(!this._pitchWithRotate||this._mousePitch.isEnabled())},_i.prototype.isActive=function(){return this._mouseRotate.isActive()||this._mousePitch.isActive()};var wi=function(t,e,r,n){this._el=t,this._touchZoom=e,this._touchRotate=r,this._tapDragZoom=n,this._rotationDisabled=!1,this._enabled=!0};wi.prototype.enable=function(t){this._touchZoom.enable(t),this._rotationDisabled||this._touchRotate.enable(t),this._tapDragZoom.enable(),this._el.classList.add(\"mapboxgl-touch-zoom-rotate\")},wi.prototype.disable=function(){this._touchZoom.disable(),this._touchRotate.disable(),this._tapDragZoom.disable(),this._el.classList.remove(\"mapboxgl-touch-zoom-rotate\")},wi.prototype.isEnabled=function(){return this._touchZoom.isEnabled()&&(this._rotationDisabled||this._touchRotate.isEnabled())&&this._tapDragZoom.isEnabled()},wi.prototype.isActive=function(){return this._touchZoom.isActive()||this._touchRotate.isActive()||this._tapDragZoom.isActive()},wi.prototype.disableRotation=function(){this._rotationDisabled=!0,this._touchRotate.disable()},wi.prototype.enableRotation=function(){this._rotationDisabled=!1,this._touchZoom.isEnabled()&&this._touchRotate.enable()};var Ti=function(t){return t.zoom||t.drag||t.pitch||t.rotate},ki=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e}(t.Event);function Ai(t){return t.panDelta&&t.panDelta.mag()||t.zoomDelta||t.bearingDelta||t.pitchDelta}var Mi=function(e,n){this._map=e,this._el=this._map.getCanvasContainer(),this._handlers=[],this._handlersById={},this._changes=[],this._inertia=new Nn(e),this._bearingSnap=n.bearingSnap,this._previousActiveHandlers={},this._eventsInProgress={},this._addDefaultHandlers(n),t.bindAll([\"handleEvent\",\"handleWindowEvent\"],this);var i=this._el;this._listeners=[[i,\"touchstart\",{passive:!0}],[i,\"touchmove\",{passive:!1}],[i,\"touchend\",void 0],[i,\"touchcancel\",void 0],[i,\"mousedown\",void 0],[i,\"mousemove\",void 0],[i,\"mouseup\",void 0],[t.window.document,\"mousemove\",{capture:!0}],[t.window.document,\"mouseup\",void 0],[i,\"mouseover\",void 0],[i,\"mouseout\",void 0],[i,\"dblclick\",void 0],[i,\"click\",void 0],[i,\"keydown\",{capture:!1}],[i,\"keyup\",void 0],[i,\"wheel\",{passive:!1}],[i,\"contextmenu\",void 0],[t.window,\"blur\",void 0]];for(var a=0,o=this._listeners;aa?Math.min(2,_):Math.max(.5,_),w=Math.pow(g,1-e),T=i.unproject(x.add(b.mult(e*w)).mult(v));i.setLocationAtPoint(i.renderWorldCopies?T.wrap():T,d)}n._fireMoveEvents(r)}),(function(t){n._afterEase(r,t)}),e),this},r.prototype._prepareEase=function(e,r,n){void 0===n&&(n={}),this._moving=!0,r||n.moving||this.fire(new t.Event(\"movestart\",e)),this._zooming&&!n.zooming&&this.fire(new t.Event(\"zoomstart\",e)),this._rotating&&!n.rotating&&this.fire(new t.Event(\"rotatestart\",e)),this._pitching&&!n.pitching&&this.fire(new t.Event(\"pitchstart\",e))},r.prototype._fireMoveEvents=function(e){this.fire(new t.Event(\"move\",e)),this._zooming&&this.fire(new t.Event(\"zoom\",e)),this._rotating&&this.fire(new t.Event(\"rotate\",e)),this._pitching&&this.fire(new t.Event(\"pitch\",e))},r.prototype._afterEase=function(e,r){if(!this._easeId||!r||this._easeId!==r){delete this._easeId;var n=this._zooming,i=this._rotating,a=this._pitching;this._moving=!1,this._zooming=!1,this._rotating=!1,this._pitching=!1,this._padding=!1,n&&this.fire(new t.Event(\"zoomend\",e)),i&&this.fire(new t.Event(\"rotateend\",e)),a&&this.fire(new t.Event(\"pitchend\",e)),this.fire(new t.Event(\"moveend\",e))}},r.prototype.flyTo=function(e,r){var n=this;if(!e.essential&&t.browser.prefersReducedMotion){var i=t.pick(e,[\"center\",\"zoom\",\"bearing\",\"pitch\",\"around\"]);return this.jumpTo(i,r)}this.stop(),e=t.extend({offset:[0,0],speed:1.2,curve:1.42,easing:t.ease},e);var a=this.transform,o=this.getZoom(),s=this.getBearing(),l=this.getPitch(),u=this.getPadding(),c=\"zoom\"in e?t.clamp(+e.zoom,a.minZoom,a.maxZoom):o,f=\"bearing\"in e?this._normalizeBearing(e.bearing,s):s,h=\"pitch\"in e?+e.pitch:l,p=\"padding\"in e?e.padding:a.padding,d=a.zoomScale(c-o),v=t.Point.convert(e.offset),g=a.centerPoint.add(v),y=a.pointLocation(g),m=t.LngLat.convert(e.center||y);this._normalizeCenter(m);var x=a.project(y),b=a.project(m).sub(x),_=e.curve,w=Math.max(a.width,a.height),T=w/d,k=b.mag();if(\"minZoom\"in e){var A=t.clamp(Math.min(e.minZoom,o,c),a.minZoom,a.maxZoom),M=w/a.zoomScale(A-o);_=Math.sqrt(M/k*2)}var S=_*_;function E(t){var e=(T*T-w*w+(t?-1:1)*S*S*k*k)/(2*(t?T:w)*S*k);return Math.log(Math.sqrt(e*e+1)-e)}function L(t){return(Math.exp(t)-Math.exp(-t))/2}function C(t){return(Math.exp(t)+Math.exp(-t))/2}var P=E(0),O=function(t){return C(P)/C(P+_*t)},I=function(t){return w*((C(P)*(L(e=P+_*t)/C(e))-L(P))/S)/k;var e},z=(E(1)-P)/_;if(Math.abs(k)<1e-6||!isFinite(z)){if(Math.abs(w-T)<1e-6)return this.easeTo(e,r);var D=Te.maxDuration&&(e.duration=0),this._zooming=!0,this._rotating=s!==f,this._pitching=h!==l,this._padding=!a.isPaddingEqual(p),this._prepareEase(r,!1),this._ease((function(e){var i=e*z,d=1/O(i);a.zoom=1===e?c:o+a.scaleZoom(d),n._rotating&&(a.bearing=t.number(s,f,e)),n._pitching&&(a.pitch=t.number(l,h,e)),n._padding&&(a.interpolatePadding(u,p,e),g=a.centerPoint.add(v));var y=1===e?m:a.unproject(x.add(b.mult(I(i))).mult(d));a.setLocationAtPoint(a.renderWorldCopies?y.wrap():y,g),n._fireMoveEvents(r)}),(function(){return n._afterEase(r)}),e),this},r.prototype.isEasing=function(){return!!this._easeFrameId},r.prototype.stop=function(){return this._stop()},r.prototype._stop=function(t,e){if(this._easeFrameId&&(this._cancelRenderFrame(this._easeFrameId),delete this._easeFrameId,delete this._onEaseFrame),this._onEaseEnd){var r=this._onEaseEnd;delete this._onEaseEnd,r.call(this,e)}if(!t){var n=this.handlers;n&&n.stop(!1)}return this},r.prototype._ease=function(e,r,n){!1===n.animate||0===n.duration?(e(1),r()):(this._easeStart=t.browser.now(),this._easeOptions=n,this._onEaseFrame=e,this._onEaseEnd=r,this._easeFrameId=this._requestRenderFrame(this._renderFrameCallback))},r.prototype._renderFrameCallback=function(){var e=Math.min((t.browser.now()-this._easeStart)/this._easeOptions.duration,1);this._onEaseFrame(this._easeOptions.easing(e)),e<1?this._easeFrameId=this._requestRenderFrame(this._renderFrameCallback):this.stop()},r.prototype._normalizeBearing=function(e,r){e=t.wrap(e,-180,180);var n=Math.abs(e-r);return Math.abs(e-360-r)180?-360:r<-180?360:0}},r}(t.Evented),Ei=function(e){void 0===e&&(e={}),this.options=e,t.bindAll([\"_toggleAttribution\",\"_updateEditLink\",\"_updateData\",\"_updateCompact\"],this)};Ei.prototype.getDefaultPosition=function(){return\"bottom-right\"},Ei.prototype.onAdd=function(t){var e=this.options&&this.options.compact;return this._map=t,this._container=r.create(\"div\",\"mapboxgl-ctrl mapboxgl-ctrl-attrib\"),this._compactButton=r.create(\"button\",\"mapboxgl-ctrl-attrib-button\",this._container),this._compactButton.addEventListener(\"click\",this._toggleAttribution),this._setElementTitle(this._compactButton,\"ToggleAttribution\"),this._innerContainer=r.create(\"div\",\"mapboxgl-ctrl-attrib-inner\",this._container),this._innerContainer.setAttribute(\"role\",\"list\"),e&&this._container.classList.add(\"mapboxgl-compact\"),this._updateAttributions(),this._updateEditLink(),this._map.on(\"styledata\",this._updateData),this._map.on(\"sourcedata\",this._updateData),this._map.on(\"moveend\",this._updateEditLink),void 0===e&&(this._map.on(\"resize\",this._updateCompact),this._updateCompact()),this._container},Ei.prototype.onRemove=function(){r.remove(this._container),this._map.off(\"styledata\",this._updateData),this._map.off(\"sourcedata\",this._updateData),this._map.off(\"moveend\",this._updateEditLink),this._map.off(\"resize\",this._updateCompact),this._map=void 0,this._attribHTML=void 0},Ei.prototype._setElementTitle=function(t,e){var r=this._map._getUIString(\"AttributionControl.\"+e);t.title=r,t.setAttribute(\"aria-label\",r)},Ei.prototype._toggleAttribution=function(){this._container.classList.contains(\"mapboxgl-compact-show\")?(this._container.classList.remove(\"mapboxgl-compact-show\"),this._compactButton.setAttribute(\"aria-pressed\",\"false\")):(this._container.classList.add(\"mapboxgl-compact-show\"),this._compactButton.setAttribute(\"aria-pressed\",\"true\"))},Ei.prototype._updateEditLink=function(){var e=this._editLink;e||(e=this._editLink=this._container.querySelector(\".mapbox-improve-map\"));var r=[{key:\"owner\",value:this.styleOwner},{key:\"id\",value:this.styleId},{key:\"access_token\",value:this._map._requestManager._customAccessToken||t.config.ACCESS_TOKEN}];if(e){var n=r.reduce((function(t,e,n){return e.value&&(t+=e.key+\"=\"+e.value+(n=0)return!1;return!0}))).join(\" | \");o!==this._attribHTML&&(this._attribHTML=o,t.length?(this._innerContainer.innerHTML=o,this._container.classList.remove(\"mapboxgl-attrib-empty\")):this._container.classList.add(\"mapboxgl-attrib-empty\"),this._editLink=null)}},Ei.prototype._updateCompact=function(){this._map.getCanvasContainer().offsetWidth<=640?this._container.classList.add(\"mapboxgl-compact\"):this._container.classList.remove(\"mapboxgl-compact\",\"mapboxgl-compact-show\")};var Li=function(){t.bindAll([\"_updateLogo\"],this),t.bindAll([\"_updateCompact\"],this)};Li.prototype.onAdd=function(t){this._map=t,this._container=r.create(\"div\",\"mapboxgl-ctrl\");var e=r.create(\"a\",\"mapboxgl-ctrl-logo\");return e.target=\"_blank\",e.rel=\"noopener nofollow\",e.href=\"https://www.mapbox.com/\",e.setAttribute(\"aria-label\",this._map._getUIString(\"LogoControl.Title\")),e.setAttribute(\"rel\",\"noopener nofollow\"),this._container.appendChild(e),this._container.style.display=\"none\",this._map.on(\"sourcedata\",this._updateLogo),this._updateLogo(),this._map.on(\"resize\",this._updateCompact),this._updateCompact(),this._container},Li.prototype.onRemove=function(){r.remove(this._container),this._map.off(\"sourcedata\",this._updateLogo),this._map.off(\"resize\",this._updateCompact)},Li.prototype.getDefaultPosition=function(){return\"bottom-left\"},Li.prototype._updateLogo=function(t){t&&\"metadata\"!==t.sourceDataType||(this._container.style.display=this._logoRequired()?\"block\":\"none\")},Li.prototype._logoRequired=function(){if(this._map.style){var t=this._map.style.sourceCaches;for(var e in t)if(t[e].getSource().mapbox_logo)return!0;return!1}},Li.prototype._updateCompact=function(){var t=this._container.children;if(t.length){var e=t[0];this._map.getCanvasContainer().offsetWidth<250?e.classList.add(\"mapboxgl-compact\"):e.classList.remove(\"mapboxgl-compact\")}};var Ci=function(){this._queue=[],this._id=0,this._cleared=!1,this._currentlyRunning=!1};Ci.prototype.add=function(t){var e=++this._id;return this._queue.push({callback:t,id:e,cancelled:!1}),e},Ci.prototype.remove=function(t){for(var e=this._currentlyRunning,r=0,n=e?this._queue.concat(e):this._queue;re.maxZoom)throw new Error(\"maxZoom must be greater than or equal to minZoom\");if(null!=e.minPitch&&null!=e.maxPitch&&e.minPitch>e.maxPitch)throw new Error(\"maxPitch must be greater than or equal to minPitch\");if(null!=e.minPitch&&e.minPitch<0)throw new Error(\"minPitch must be greater than or equal to 0\");if(null!=e.maxPitch&&e.maxPitch>Di)throw new Error(\"maxPitch must be less than or equal to 60\");var i=new Pn(e.minZoom,e.maxZoom,e.minPitch,e.maxPitch,e.renderWorldCopies);if(n.call(this,i,e),this._interactive=e.interactive,this._maxTileCacheSize=e.maxTileCacheSize,this._failIfMajorPerformanceCaveat=e.failIfMajorPerformanceCaveat,this._preserveDrawingBuffer=e.preserveDrawingBuffer,this._antialias=e.antialias,this._trackResize=e.trackResize,this._bearingSnap=e.bearingSnap,this._refreshExpiredTiles=e.refreshExpiredTiles,this._fadeDuration=e.fadeDuration,this._crossSourceCollisions=e.crossSourceCollisions,this._crossFadingFactor=1,this._collectResourceTiming=e.collectResourceTiming,this._renderTaskQueue=new Ci,this._controls=[],this._mapId=t.uniqueId(),this._locale=t.extend({},Pi,e.locale),this._clickTolerance=e.clickTolerance,this._requestManager=new t.RequestManager(e.transformRequest,e.accessToken),\"string\"==typeof e.container){if(this._container=t.window.document.getElementById(e.container),!this._container)throw new Error(\"Container '\"+e.container+\"' not found.\")}else{if(!(e.container instanceof Ii))throw new Error(\"Invalid type: 'container' must be a String or HTMLElement.\");this._container=e.container}if(e.maxBounds&&this.setMaxBounds(e.maxBounds),t.bindAll([\"_onWindowOnline\",\"_onWindowResize\",\"_onMapScroll\",\"_contextLost\",\"_contextRestored\"],this),this._setupContainer(),this._setupPainter(),void 0===this.painter)throw new Error(\"Failed to initialize WebGL.\");this.on(\"move\",(function(){return r._update(!1)})),this.on(\"moveend\",(function(){return r._update(!1)})),this.on(\"zoom\",(function(){return r._update(!0)})),void 0!==t.window&&(t.window.addEventListener(\"online\",this._onWindowOnline,!1),t.window.addEventListener(\"resize\",this._onWindowResize,!1),t.window.addEventListener(\"orientationchange\",this._onWindowResize,!1)),this.handlers=new Mi(this,e);var a=\"string\"==typeof e.hash&&e.hash||void 0;this._hash=e.hash&&new In(a).addTo(this),this._hash&&this._hash._onHashChange()||(this.jumpTo({center:e.center,zoom:e.zoom,bearing:e.bearing,pitch:e.pitch}),e.bounds&&(this.resize(),this.fitBounds(e.bounds,t.extend({},e.fitBoundsOptions,{duration:0})))),this.resize(),this._localIdeographFontFamily=e.localIdeographFontFamily,e.style&&this.setStyle(e.style,{localIdeographFontFamily:e.localIdeographFontFamily}),e.attributionControl&&this.addControl(new Ei({customAttribution:e.customAttribution})),this.addControl(new Li,e.logoPosition),this.on(\"style.load\",(function(){r.transform.unmodified&&r.jumpTo(r.style.stylesheet)})),this.on(\"data\",(function(e){r._update(\"style\"===e.dataType),r.fire(new t.Event(e.dataType+\"data\",e))})),this.on(\"dataloading\",(function(e){r.fire(new t.Event(e.dataType+\"dataloading\",e))}))}n&&(i.__proto__=n),i.prototype=Object.create(n&&n.prototype),i.prototype.constructor=i;var a={showTileBoundaries:{configurable:!0},showPadding:{configurable:!0},showCollisionBoxes:{configurable:!0},showOverdrawInspector:{configurable:!0},repaint:{configurable:!0},vertices:{configurable:!0},version:{configurable:!0}};return i.prototype._getMapId=function(){return this._mapId},i.prototype.addControl=function(e,r){if(void 0===r&&(r=e.getDefaultPosition?e.getDefaultPosition():\"top-right\"),!e||!e.onAdd)return this.fire(new t.ErrorEvent(new Error(\"Invalid argument to map.addControl(). Argument must be a control with onAdd and onRemove methods.\")));var n=e.onAdd(this);this._controls.push(e);var i=this._controlPositions[r];return-1!==r.indexOf(\"bottom\")?i.insertBefore(n,i.firstChild):i.appendChild(n),this},i.prototype.removeControl=function(e){if(!e||!e.onRemove)return this.fire(new t.ErrorEvent(new Error(\"Invalid argument to map.removeControl(). Argument must be a control with onAdd and onRemove methods.\")));var r=this._controls.indexOf(e);return r>-1&&this._controls.splice(r,1),e.onRemove(this),this},i.prototype.hasControl=function(t){return this._controls.indexOf(t)>-1},i.prototype.resize=function(e){var r=this._containerDimensions(),n=r[0],i=r[1];this._resizeCanvas(n,i),this.transform.resize(n,i),this.painter.resize(n,i);var a=!this._moving;return a&&(this.stop(),this.fire(new t.Event(\"movestart\",e)).fire(new t.Event(\"move\",e))),this.fire(new t.Event(\"resize\",e)),a&&this.fire(new t.Event(\"moveend\",e)),this},i.prototype.getBounds=function(){return this.transform.getBounds()},i.prototype.getMaxBounds=function(){return this.transform.getMaxBounds()},i.prototype.setMaxBounds=function(e){return this.transform.setMaxBounds(t.LngLatBounds.convert(e)),this._update()},i.prototype.setMinZoom=function(t){if((t=null==t?-2:t)>=-2&&t<=this.transform.maxZoom)return this.transform.minZoom=t,this._update(),this.getZoom()=this.transform.minZoom)return this.transform.maxZoom=t,this._update(),this.getZoom()>t&&this.setZoom(t),this;throw new Error(\"maxZoom must be greater than the current minZoom\")},i.prototype.getMaxZoom=function(){return this.transform.maxZoom},i.prototype.setMinPitch=function(t){if((t=null==t?0:t)<0)throw new Error(\"minPitch must be greater than or equal to 0\");if(t>=0&&t<=this.transform.maxPitch)return this.transform.minPitch=t,this._update(),this.getPitch()Di)throw new Error(\"maxPitch must be less than or equal to 60\");if(t>=this.transform.minPitch)return this.transform.maxPitch=t,this._update(),this.getPitch()>t&&this.setPitch(t),this;throw new Error(\"maxPitch must be greater than the current minPitch\")},i.prototype.getMaxPitch=function(){return this.transform.maxPitch},i.prototype.getRenderWorldCopies=function(){return this.transform.renderWorldCopies},i.prototype.setRenderWorldCopies=function(t){return this.transform.renderWorldCopies=t,this._update()},i.prototype.project=function(e){return this.transform.locationPoint(t.LngLat.convert(e))},i.prototype.unproject=function(e){return this.transform.pointLocation(t.Point.convert(e))},i.prototype.isMoving=function(){return this._moving||this.handlers.isMoving()},i.prototype.isZooming=function(){return this._zooming||this.handlers.isZooming()},i.prototype.isRotating=function(){return this._rotating||this.handlers.isRotating()},i.prototype._createDelegatedListener=function(t,e,r){var n,i=this;if(\"mouseenter\"===t||\"mouseover\"===t){var a=!1;return{layer:e,listener:r,delegates:{mousemove:function(n){var o=i.getLayer(e)?i.queryRenderedFeatures(n.point,{layers:[e]}):[];o.length?a||(a=!0,r.call(i,new Vn(t,i,n.originalEvent,{features:o}))):a=!1},mouseout:function(){a=!1}}}}if(\"mouseleave\"===t||\"mouseout\"===t){var o=!1;return{layer:e,listener:r,delegates:{mousemove:function(n){(i.getLayer(e)?i.queryRenderedFeatures(n.point,{layers:[e]}):[]).length?o=!0:o&&(o=!1,r.call(i,new Vn(t,i,n.originalEvent)))},mouseout:function(e){o&&(o=!1,r.call(i,new Vn(t,i,e.originalEvent)))}}}}return{layer:e,listener:r,delegates:(n={},n[t]=function(t){var n=i.getLayer(e)?i.queryRenderedFeatures(t.point,{layers:[e]}):[];n.length&&(t.features=n,r.call(i,t),delete t.features)},n)}},i.prototype.on=function(t,e,r){if(void 0===r)return n.prototype.on.call(this,t,e);var i=this._createDelegatedListener(t,e,r);for(var a in this._delegatedListeners=this._delegatedListeners||{},this._delegatedListeners[t]=this._delegatedListeners[t]||[],this._delegatedListeners[t].push(i),i.delegates)this.on(a,i.delegates[a]);return this},i.prototype.once=function(t,e,r){if(void 0===r)return n.prototype.once.call(this,t,e);var i=this._createDelegatedListener(t,e,r);for(var a in i.delegates)this.once(a,i.delegates[a]);return this},i.prototype.off=function(t,e,r){var i=this;if(void 0===r)return n.prototype.off.call(this,t,e);return this._delegatedListeners&&this._delegatedListeners[t]&&function(n){for(var a=n[t],o=0;o180;){var s=n.locationPoint(e);if(s.x>=0&&s.y>=0&&s.x<=n.width&&s.y<=n.height)break;e.lng>n.center.lng?e.lng-=360:e.lng+=360}return e}Ui.prototype.down=function(t,e){this.mouseRotate.mousedown(t,e),this.mousePitch&&this.mousePitch.mousedown(t,e),r.disableDrag()},Ui.prototype.move=function(t,e){var r=this.map,n=this.mouseRotate.mousemoveWindow(t,e);if(n&&n.bearingDelta&&r.setBearing(r.getBearing()+n.bearingDelta),this.mousePitch){var i=this.mousePitch.mousemoveWindow(t,e);i&&i.pitchDelta&&r.setPitch(r.getPitch()+i.pitchDelta)}},Ui.prototype.off=function(){var t=this.element;r.removeEventListener(t,\"mousedown\",this.mousedown),r.removeEventListener(t,\"touchstart\",this.touchstart,{passive:!1}),r.removeEventListener(t,\"touchmove\",this.touchmove),r.removeEventListener(t,\"touchend\",this.touchend),r.removeEventListener(t,\"touchcancel\",this.reset),this.offTemp()},Ui.prototype.offTemp=function(){r.enableDrag(),r.removeEventListener(t.window,\"mousemove\",this.mousemove),r.removeEventListener(t.window,\"mouseup\",this.mouseup)},Ui.prototype.mousedown=function(e){this.down(t.extend({},e,{ctrlKey:!0,preventDefault:function(){return e.preventDefault()}}),r.mousePos(this.element,e)),r.addEventListener(t.window,\"mousemove\",this.mousemove),r.addEventListener(t.window,\"mouseup\",this.mouseup)},Ui.prototype.mousemove=function(t){this.move(t,r.mousePos(this.element,t))},Ui.prototype.mouseup=function(t){this.mouseRotate.mouseupWindow(t),this.mousePitch&&this.mousePitch.mouseupWindow(t),this.offTemp()},Ui.prototype.touchstart=function(t){1!==t.targetTouches.length?this.reset():(this._startPos=this._lastPos=r.touchPos(this.element,t.targetTouches)[0],this.down({type:\"mousedown\",button:0,ctrlKey:!0,preventDefault:function(){return t.preventDefault()}},this._startPos))},Ui.prototype.touchmove=function(t){1!==t.targetTouches.length?this.reset():(this._lastPos=r.touchPos(this.element,t.targetTouches)[0],this.move({preventDefault:function(){return t.preventDefault()}},this._lastPos))},Ui.prototype.touchend=function(t){0===t.targetTouches.length&&this._startPos&&this._lastPos&&this._startPos.dist(this._lastPos)=r}this._isDragging&&(this._pos=e.point.sub(this._positionDelta),this._lngLat=this._map.unproject(this._pos),this.setLngLat(this._lngLat),this._element.style.pointerEvents=\"none\",\"pending\"===this._state&&(this._state=\"active\",this.fire(new t.Event(\"dragstart\"))),this.fire(new t.Event(\"drag\")))},n.prototype._onUp=function(){this._element.style.pointerEvents=\"auto\",this._positionDelta=null,this._pointerdownPos=null,this._isDragging=!1,this._map.off(\"mousemove\",this._onMove),this._map.off(\"touchmove\",this._onMove),\"active\"===this._state&&this.fire(new t.Event(\"dragend\")),this._state=\"inactive\"},n.prototype._addDragHandler=function(t){this._element.contains(t.originalEvent.target)&&(t.preventDefault(),this._positionDelta=t.point.sub(this._pos).add(this._offset),this._pointerdownPos=t.point,this._state=\"pending\",this._map.on(\"mousemove\",this._onMove),this._map.on(\"touchmove\",this._onMove),this._map.once(\"mouseup\",this._onUp),this._map.once(\"touchend\",this._onUp))},n.prototype.setDraggable=function(t){return this._draggable=!!t,this._map&&(t?(this._map.on(\"mousedown\",this._addDragHandler),this._map.on(\"touchstart\",this._addDragHandler)):(this._map.off(\"mousedown\",this._addDragHandler),this._map.off(\"touchstart\",this._addDragHandler))),this},n.prototype.isDraggable=function(){return this._draggable},n.prototype.setRotation=function(t){return this._rotation=t||0,this._update(),this},n.prototype.getRotation=function(){return this._rotation},n.prototype.setRotationAlignment=function(t){return this._rotationAlignment=t||\"auto\",this._update(),this},n.prototype.getRotationAlignment=function(){return this._rotationAlignment},n.prototype.setPitchAlignment=function(t){return this._pitchAlignment=t&&\"auto\"!==t?t:this._rotationAlignment,this._update(),this},n.prototype.getPitchAlignment=function(){return this._pitchAlignment},n}(t.Evented),Yi={positionOptions:{enableHighAccuracy:!1,maximumAge:0,timeout:6e3},fitBoundsOptions:{maxZoom:15},trackUserLocation:!1,showAccuracyCircle:!0,showUserLocation:!0};var Xi=0,Zi=!1,Ki=function(e){function n(r){e.call(this),this.options=t.extend({},Yi,r),t.bindAll([\"_onSuccess\",\"_onError\",\"_onZoom\",\"_finish\",\"_setupUI\",\"_updateCamera\",\"_updateMarker\"],this)}return e&&(n.__proto__=e),n.prototype=Object.create(e&&e.prototype),n.prototype.constructor=n,n.prototype.onAdd=function(e){return this._map=e,this._container=r.create(\"div\",\"mapboxgl-ctrl mapboxgl-ctrl-group\"),n=this._setupUI,void 0!==Gi?n(Gi):void 0!==t.window.navigator.permissions?t.window.navigator.permissions.query({name:\"geolocation\"}).then((function(t){Gi=\"denied\"!==t.state,n(Gi)})):(Gi=!!t.window.navigator.geolocation,n(Gi)),this._container;var n},n.prototype.onRemove=function(){void 0!==this._geolocationWatchID&&(t.window.navigator.geolocation.clearWatch(this._geolocationWatchID),this._geolocationWatchID=void 0),this.options.showUserLocation&&this._userLocationDotMarker&&this._userLocationDotMarker.remove(),this.options.showAccuracyCircle&&this._accuracyCircleMarker&&this._accuracyCircleMarker.remove(),r.remove(this._container),this._map.off(\"zoom\",this._onZoom),this._map=void 0,Xi=0,Zi=!1},n.prototype._isOutOfMapMaxBounds=function(t){var e=this._map.getMaxBounds(),r=t.coords;return e&&(r.longitudee.getEast()||r.latitudee.getNorth())},n.prototype._setErrorState=function(){switch(this._watchState){case\"WAITING_ACTIVE\":this._watchState=\"ACTIVE_ERROR\",this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-active\"),this._geolocateButton.classList.add(\"mapboxgl-ctrl-geolocate-active-error\");break;case\"ACTIVE_LOCK\":this._watchState=\"ACTIVE_ERROR\",this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-active\"),this._geolocateButton.classList.add(\"mapboxgl-ctrl-geolocate-active-error\"),this._geolocateButton.classList.add(\"mapboxgl-ctrl-geolocate-waiting\");break;case\"BACKGROUND\":this._watchState=\"BACKGROUND_ERROR\",this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-background\"),this._geolocateButton.classList.add(\"mapboxgl-ctrl-geolocate-background-error\"),this._geolocateButton.classList.add(\"mapboxgl-ctrl-geolocate-waiting\")}},n.prototype._onSuccess=function(e){if(this._map){if(this._isOutOfMapMaxBounds(e))return this._setErrorState(),this.fire(new t.Event(\"outofmaxbounds\",e)),this._updateMarker(),void this._finish();if(this.options.trackUserLocation)switch(this._lastKnownPosition=e,this._watchState){case\"WAITING_ACTIVE\":case\"ACTIVE_LOCK\":case\"ACTIVE_ERROR\":this._watchState=\"ACTIVE_LOCK\",this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-waiting\"),this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-active-error\"),this._geolocateButton.classList.add(\"mapboxgl-ctrl-geolocate-active\");break;case\"BACKGROUND\":case\"BACKGROUND_ERROR\":this._watchState=\"BACKGROUND\",this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-waiting\"),this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-background-error\"),this._geolocateButton.classList.add(\"mapboxgl-ctrl-geolocate-background\")}this.options.showUserLocation&&\"OFF\"!==this._watchState&&this._updateMarker(e),this.options.trackUserLocation&&\"ACTIVE_LOCK\"!==this._watchState||this._updateCamera(e),this.options.showUserLocation&&this._dotElement.classList.remove(\"mapboxgl-user-location-dot-stale\"),this.fire(new t.Event(\"geolocate\",e)),this._finish()}},n.prototype._updateCamera=function(e){var r=new t.LngLat(e.coords.longitude,e.coords.latitude),n=e.coords.accuracy,i=this._map.getBearing(),a=t.extend({bearing:i},this.options.fitBoundsOptions);this._map.fitBounds(r.toBounds(n),a,{geolocateSource:!0})},n.prototype._updateMarker=function(e){if(e){var r=new t.LngLat(e.coords.longitude,e.coords.latitude);this._accuracyCircleMarker.setLngLat(r).addTo(this._map),this._userLocationDotMarker.setLngLat(r).addTo(this._map),this._accuracy=e.coords.accuracy,this.options.showUserLocation&&this.options.showAccuracyCircle&&this._updateCircleRadius()}else this._userLocationDotMarker.remove(),this._accuracyCircleMarker.remove()},n.prototype._updateCircleRadius=function(){var t=this._map._container.clientHeight/2,e=this._map.unproject([0,t]),r=this._map.unproject([1,t]),n=e.distanceTo(r),i=Math.ceil(2*this._accuracy/n);this._circleElement.style.width=i+\"px\",this._circleElement.style.height=i+\"px\"},n.prototype._onZoom=function(){this.options.showUserLocation&&this.options.showAccuracyCircle&&this._updateCircleRadius()},n.prototype._onError=function(e){if(this._map){if(this.options.trackUserLocation)if(1===e.code){this._watchState=\"OFF\",this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-waiting\"),this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-active\"),this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-active-error\"),this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-background\"),this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-background-error\"),this._geolocateButton.disabled=!0;var r=this._map._getUIString(\"GeolocateControl.LocationNotAvailable\");this._geolocateButton.title=r,this._geolocateButton.setAttribute(\"aria-label\",r),void 0!==this._geolocationWatchID&&this._clearWatch()}else{if(3===e.code&&Zi)return;this._setErrorState()}\"OFF\"!==this._watchState&&this.options.showUserLocation&&this._dotElement.classList.add(\"mapboxgl-user-location-dot-stale\"),this.fire(new t.Event(\"error\",e)),this._finish()}},n.prototype._finish=function(){this._timeoutId&&clearTimeout(this._timeoutId),this._timeoutId=void 0},n.prototype._setupUI=function(e){var n=this;if(this._container.addEventListener(\"contextmenu\",(function(t){return t.preventDefault()})),this._geolocateButton=r.create(\"button\",\"mapboxgl-ctrl-geolocate\",this._container),r.create(\"span\",\"mapboxgl-ctrl-icon\",this._geolocateButton).setAttribute(\"aria-hidden\",!0),this._geolocateButton.type=\"button\",!1===e){t.warnOnce(\"Geolocation support is not available so the GeolocateControl will be disabled.\");var i=this._map._getUIString(\"GeolocateControl.LocationNotAvailable\");this._geolocateButton.disabled=!0,this._geolocateButton.title=i,this._geolocateButton.setAttribute(\"aria-label\",i)}else{var a=this._map._getUIString(\"GeolocateControl.FindMyLocation\");this._geolocateButton.title=a,this._geolocateButton.setAttribute(\"aria-label\",a)}this.options.trackUserLocation&&(this._geolocateButton.setAttribute(\"aria-pressed\",\"false\"),this._watchState=\"OFF\"),this.options.showUserLocation&&(this._dotElement=r.create(\"div\",\"mapboxgl-user-location-dot\"),this._userLocationDotMarker=new Wi(this._dotElement),this._circleElement=r.create(\"div\",\"mapboxgl-user-location-accuracy-circle\"),this._accuracyCircleMarker=new Wi({element:this._circleElement,pitchAlignment:\"map\"}),this.options.trackUserLocation&&(this._watchState=\"OFF\"),this._map.on(\"zoom\",this._onZoom)),this._geolocateButton.addEventListener(\"click\",this.trigger.bind(this)),this._setup=!0,this.options.trackUserLocation&&this._map.on(\"movestart\",(function(e){var r=e.originalEvent&&\"resize\"===e.originalEvent.type;e.geolocateSource||\"ACTIVE_LOCK\"!==n._watchState||r||(n._watchState=\"BACKGROUND\",n._geolocateButton.classList.add(\"mapboxgl-ctrl-geolocate-background\"),n._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-active\"),n.fire(new t.Event(\"trackuserlocationend\")))}))},n.prototype.trigger=function(){if(!this._setup)return t.warnOnce(\"Geolocate control triggered before added to a map\"),!1;if(this.options.trackUserLocation){switch(this._watchState){case\"OFF\":this._watchState=\"WAITING_ACTIVE\",this.fire(new t.Event(\"trackuserlocationstart\"));break;case\"WAITING_ACTIVE\":case\"ACTIVE_LOCK\":case\"ACTIVE_ERROR\":case\"BACKGROUND_ERROR\":Xi--,Zi=!1,this._watchState=\"OFF\",this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-waiting\"),this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-active\"),this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-active-error\"),this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-background\"),this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-background-error\"),this.fire(new t.Event(\"trackuserlocationend\"));break;case\"BACKGROUND\":this._watchState=\"ACTIVE_LOCK\",this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-background\"),this._lastKnownPosition&&this._updateCamera(this._lastKnownPosition),this.fire(new t.Event(\"trackuserlocationstart\"))}switch(this._watchState){case\"WAITING_ACTIVE\":this._geolocateButton.classList.add(\"mapboxgl-ctrl-geolocate-waiting\"),this._geolocateButton.classList.add(\"mapboxgl-ctrl-geolocate-active\");break;case\"ACTIVE_LOCK\":this._geolocateButton.classList.add(\"mapboxgl-ctrl-geolocate-active\");break;case\"ACTIVE_ERROR\":this._geolocateButton.classList.add(\"mapboxgl-ctrl-geolocate-waiting\"),this._geolocateButton.classList.add(\"mapboxgl-ctrl-geolocate-active-error\");break;case\"BACKGROUND\":this._geolocateButton.classList.add(\"mapboxgl-ctrl-geolocate-background\");break;case\"BACKGROUND_ERROR\":this._geolocateButton.classList.add(\"mapboxgl-ctrl-geolocate-waiting\"),this._geolocateButton.classList.add(\"mapboxgl-ctrl-geolocate-background-error\")}if(\"OFF\"===this._watchState&&void 0!==this._geolocationWatchID)this._clearWatch();else if(void 0===this._geolocationWatchID){var e;this._geolocateButton.classList.add(\"mapboxgl-ctrl-geolocate-waiting\"),this._geolocateButton.setAttribute(\"aria-pressed\",\"true\"),++Xi>1?(e={maximumAge:6e5,timeout:0},Zi=!0):(e=this.options.positionOptions,Zi=!1),this._geolocationWatchID=t.window.navigator.geolocation.watchPosition(this._onSuccess,this._onError,e)}}else t.window.navigator.geolocation.getCurrentPosition(this._onSuccess,this._onError,this.options.positionOptions),this._timeoutId=setTimeout(this._finish,1e4);return!0},n.prototype._clearWatch=function(){t.window.navigator.geolocation.clearWatch(this._geolocationWatchID),this._geolocationWatchID=void 0,this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-waiting\"),this._geolocateButton.setAttribute(\"aria-pressed\",\"false\"),this.options.showUserLocation&&this._updateMarker(null)},n}(t.Evented),Ji={maxWidth:100,unit:\"metric\"},$i=function(e){this.options=t.extend({},Ji,e),t.bindAll([\"_onMove\",\"setUnit\"],this)};function Qi(t,e,r){var n=r&&r.maxWidth||100,i=t._container.clientHeight/2,a=t.unproject([0,i]),o=t.unproject([n,i]),s=a.distanceTo(o);if(r&&\"imperial\"===r.unit){var l=3.2808*s;l>5280?ta(e,n,l/5280,t._getUIString(\"ScaleControl.Miles\")):ta(e,n,l,t._getUIString(\"ScaleControl.Feet\"))}else r&&\"nautical\"===r.unit?ta(e,n,s/1852,t._getUIString(\"ScaleControl.NauticalMiles\")):s>=1e3?ta(e,n,s/1e3,t._getUIString(\"ScaleControl.Kilometers\")):ta(e,n,s,t._getUIString(\"ScaleControl.Meters\"))}function ta(t,e,r,n){var i,a,o,s=(i=r,(a=Math.pow(10,(\"\"+Math.floor(i)).length-1))*((o=i/a)>=10?10:o>=5?5:o>=3?3:o>=2?2:o>=1?1:function(t){var e=Math.pow(10,Math.ceil(-Math.log(t)/Math.LN10));return Math.round(t*e)/e}(o))),l=s/r;t.style.width=e*l+\"px\",t.innerHTML=s+\" \"+n}$i.prototype.getDefaultPosition=function(){return\"bottom-left\"},$i.prototype._onMove=function(){Qi(this._map,this._container,this.options)},$i.prototype.onAdd=function(t){return this._map=t,this._container=r.create(\"div\",\"mapboxgl-ctrl mapboxgl-ctrl-scale\",t.getContainer()),this._map.on(\"move\",this._onMove),this._onMove(),this._container},$i.prototype.onRemove=function(){r.remove(this._container),this._map.off(\"move\",this._onMove),this._map=void 0},$i.prototype.setUnit=function(t){this.options.unit=t,Qi(this._map,this._container,this.options)};var ea=function(e){this._fullscreen=!1,e&&e.container&&(e.container instanceof t.window.HTMLElement?this._container=e.container:t.warnOnce(\"Full screen control 'container' must be a DOM element.\")),t.bindAll([\"_onClickFullscreen\",\"_changeIcon\"],this),\"onfullscreenchange\"in t.window.document?this._fullscreenchange=\"fullscreenchange\":\"onmozfullscreenchange\"in t.window.document?this._fullscreenchange=\"mozfullscreenchange\":\"onwebkitfullscreenchange\"in t.window.document?this._fullscreenchange=\"webkitfullscreenchange\":\"onmsfullscreenchange\"in t.window.document&&(this._fullscreenchange=\"MSFullscreenChange\")};ea.prototype.onAdd=function(e){return this._map=e,this._container||(this._container=this._map.getContainer()),this._controlContainer=r.create(\"div\",\"mapboxgl-ctrl mapboxgl-ctrl-group\"),this._checkFullscreenSupport()?this._setupUI():(this._controlContainer.style.display=\"none\",t.warnOnce(\"This device does not support fullscreen mode.\")),this._controlContainer},ea.prototype.onRemove=function(){r.remove(this._controlContainer),this._map=null,t.window.document.removeEventListener(this._fullscreenchange,this._changeIcon)},ea.prototype._checkFullscreenSupport=function(){return!!(t.window.document.fullscreenEnabled||t.window.document.mozFullScreenEnabled||t.window.document.msFullscreenEnabled||t.window.document.webkitFullscreenEnabled)},ea.prototype._setupUI=function(){var e=this._fullscreenButton=r.create(\"button\",\"mapboxgl-ctrl-fullscreen\",this._controlContainer);r.create(\"span\",\"mapboxgl-ctrl-icon\",e).setAttribute(\"aria-hidden\",!0),e.type=\"button\",this._updateTitle(),this._fullscreenButton.addEventListener(\"click\",this._onClickFullscreen),t.window.document.addEventListener(this._fullscreenchange,this._changeIcon)},ea.prototype._updateTitle=function(){var t=this._getTitle();this._fullscreenButton.setAttribute(\"aria-label\",t),this._fullscreenButton.title=t},ea.prototype._getTitle=function(){return this._map._getUIString(this._isFullscreen()?\"FullscreenControl.Exit\":\"FullscreenControl.Enter\")},ea.prototype._isFullscreen=function(){return this._fullscreen},ea.prototype._changeIcon=function(){(t.window.document.fullscreenElement||t.window.document.mozFullScreenElement||t.window.document.webkitFullscreenElement||t.window.document.msFullscreenElement)===this._container!==this._fullscreen&&(this._fullscreen=!this._fullscreen,this._fullscreenButton.classList.toggle(\"mapboxgl-ctrl-shrink\"),this._fullscreenButton.classList.toggle(\"mapboxgl-ctrl-fullscreen\"),this._updateTitle())},ea.prototype._onClickFullscreen=function(){this._isFullscreen()?t.window.document.exitFullscreen?t.window.document.exitFullscreen():t.window.document.mozCancelFullScreen?t.window.document.mozCancelFullScreen():t.window.document.msExitFullscreen?t.window.document.msExitFullscreen():t.window.document.webkitCancelFullScreen&&t.window.document.webkitCancelFullScreen():this._container.requestFullscreen?this._container.requestFullscreen():this._container.mozRequestFullScreen?this._container.mozRequestFullScreen():this._container.msRequestFullscreen?this._container.msRequestFullscreen():this._container.webkitRequestFullscreen&&this._container.webkitRequestFullscreen()};var ra={closeButton:!0,closeOnClick:!0,focusAfterOpen:!0,className:\"\",maxWidth:\"240px\"},na=[\"a[href]\",\"[tabindex]:not([tabindex='-1'])\",\"[contenteditable]:not([contenteditable='false'])\",\"button:not([disabled])\",\"input:not([disabled])\",\"select:not([disabled])\",\"textarea:not([disabled])\"].join(\", \"),ia=function(e){function n(r){e.call(this),this.options=t.extend(Object.create(ra),r),t.bindAll([\"_update\",\"_onClose\",\"remove\",\"_onMouseMove\",\"_onMouseUp\",\"_onDrag\"],this)}return e&&(n.__proto__=e),n.prototype=Object.create(e&&e.prototype),n.prototype.constructor=n,n.prototype.addTo=function(e){return this._map&&this.remove(),this._map=e,this.options.closeOnClick&&this._map.on(\"click\",this._onClose),this.options.closeOnMove&&this._map.on(\"move\",this._onClose),this._map.on(\"remove\",this.remove),this._update(),this._focusFirstElement(),this._trackPointer?(this._map.on(\"mousemove\",this._onMouseMove),this._map.on(\"mouseup\",this._onMouseUp),this._container&&this._container.classList.add(\"mapboxgl-popup-track-pointer\"),this._map._canvasContainer.classList.add(\"mapboxgl-track-pointer\")):this._map.on(\"move\",this._update),this.fire(new t.Event(\"open\")),this},n.prototype.isOpen=function(){return!!this._map},n.prototype.remove=function(){return this._content&&r.remove(this._content),this._container&&(r.remove(this._container),delete this._container),this._map&&(this._map.off(\"move\",this._update),this._map.off(\"move\",this._onClose),this._map.off(\"click\",this._onClose),this._map.off(\"remove\",this.remove),this._map.off(\"mousemove\",this._onMouseMove),this._map.off(\"mouseup\",this._onMouseUp),this._map.off(\"drag\",this._onDrag),delete this._map),this.fire(new t.Event(\"close\")),this},n.prototype.getLngLat=function(){return this._lngLat},n.prototype.setLngLat=function(e){return this._lngLat=t.LngLat.convert(e),this._pos=null,this._trackPointer=!1,this._update(),this._map&&(this._map.on(\"move\",this._update),this._map.off(\"mousemove\",this._onMouseMove),this._container&&this._container.classList.remove(\"mapboxgl-popup-track-pointer\"),this._map._canvasContainer.classList.remove(\"mapboxgl-track-pointer\")),this},n.prototype.trackPointer=function(){return this._trackPointer=!0,this._pos=null,this._update(),this._map&&(this._map.off(\"move\",this._update),this._map.on(\"mousemove\",this._onMouseMove),this._map.on(\"drag\",this._onDrag),this._container&&this._container.classList.add(\"mapboxgl-popup-track-pointer\"),this._map._canvasContainer.classList.add(\"mapboxgl-track-pointer\")),this},n.prototype.getElement=function(){return this._container},n.prototype.setText=function(e){return this.setDOMContent(t.window.document.createTextNode(e))},n.prototype.setHTML=function(e){var r,n=t.window.document.createDocumentFragment(),i=t.window.document.createElement(\"body\");for(i.innerHTML=e;r=i.firstChild;)n.appendChild(r);return this.setDOMContent(n)},n.prototype.getMaxWidth=function(){return this._container&&this._container.style.maxWidth},n.prototype.setMaxWidth=function(t){return this.options.maxWidth=t,this._update(),this},n.prototype.setDOMContent=function(t){if(this._content)for(;this._content.hasChildNodes();)this._content.firstChild&&this._content.removeChild(this._content.firstChild);else this._content=r.create(\"div\",\"mapboxgl-popup-content\",this._container);return this._content.appendChild(t),this._createCloseButton(),this._update(),this._focusFirstElement(),this},n.prototype.addClassName=function(t){this._container&&this._container.classList.add(t)},n.prototype.removeClassName=function(t){this._container&&this._container.classList.remove(t)},n.prototype.setOffset=function(t){return this.options.offset=t,this._update(),this},n.prototype.toggleClassName=function(t){if(this._container)return this._container.classList.toggle(t)},n.prototype._createCloseButton=function(){this.options.closeButton&&(this._closeButton=r.create(\"button\",\"mapboxgl-popup-close-button\",this._content),this._closeButton.type=\"button\",this._closeButton.setAttribute(\"aria-label\",\"Close popup\"),this._closeButton.innerHTML=\"×\",this._closeButton.addEventListener(\"click\",this._onClose))},n.prototype._onMouseUp=function(t){this._update(t.point)},n.prototype._onMouseMove=function(t){this._update(t.point)},n.prototype._onDrag=function(t){this._update(t.point)},n.prototype._update=function(t){var e=this,n=this._lngLat||this._trackPointer;if(this._map&&n&&this._content&&(this._container||(this._container=r.create(\"div\",\"mapboxgl-popup\",this._map.getContainer()),this._tip=r.create(\"div\",\"mapboxgl-popup-tip\",this._container),this._container.appendChild(this._content),this.options.className&&this.options.className.split(\" \").forEach((function(t){return e._container.classList.add(t)})),this._trackPointer&&this._container.classList.add(\"mapboxgl-popup-track-pointer\")),this.options.maxWidth&&this._container.style.maxWidth!==this.options.maxWidth&&(this._container.style.maxWidth=this.options.maxWidth),this._map.transform.renderWorldCopies&&!this._trackPointer&&(this._lngLat=Vi(this._lngLat,this._pos,this._map.transform)),!this._trackPointer||t)){var i=this._pos=this._trackPointer&&t?t:this._map.project(this._lngLat),a=this.options.anchor,o=aa(this.options.offset);if(!a){var s,l=this._container.offsetWidth,u=this._container.offsetHeight;s=i.y+o.bottom.ythis._map.transform.height-u?[\"bottom\"]:[],i.xthis._map.transform.width-l/2&&s.push(\"right\"),a=0===s.length?\"bottom\":s.join(\"-\")}var c=i.add(o[a]).round();r.setTransform(this._container,qi[a]+\" translate(\"+c.x+\"px,\"+c.y+\"px)\"),Hi(this._container,a,\"popup\")}},n.prototype._focusFirstElement=function(){if(this.options.focusAfterOpen&&this._container){var t=this._container.querySelector(na);t&&t.focus()}},n.prototype._onClose=function(){this.remove()},n}(t.Evented);function aa(e){if(e){if(\"number\"==typeof e){var r=Math.round(Math.sqrt(.5*Math.pow(e,2)));return{center:new t.Point(0,0),top:new t.Point(0,e),\"top-left\":new t.Point(r,r),\"top-right\":new t.Point(-r,r),bottom:new t.Point(0,-e),\"bottom-left\":new t.Point(r,-r),\"bottom-right\":new t.Point(-r,-r),left:new t.Point(e,0),right:new t.Point(-e,0)}}if(e instanceof t.Point||Array.isArray(e)){var n=t.Point.convert(e);return{center:n,top:n,\"top-left\":n,\"top-right\":n,bottom:n,\"bottom-left\":n,\"bottom-right\":n,left:n,right:n}}return{center:t.Point.convert(e.center||[0,0]),top:t.Point.convert(e.top||[0,0]),\"top-left\":t.Point.convert(e[\"top-left\"]||[0,0]),\"top-right\":t.Point.convert(e[\"top-right\"]||[0,0]),bottom:t.Point.convert(e.bottom||[0,0]),\"bottom-left\":t.Point.convert(e[\"bottom-left\"]||[0,0]),\"bottom-right\":t.Point.convert(e[\"bottom-right\"]||[0,0]),left:t.Point.convert(e.left||[0,0]),right:t.Point.convert(e.right||[0,0])}}return aa(new t.Point(0,0))}var oa={version:t.version,supported:e,setRTLTextPlugin:t.setRTLTextPlugin,getRTLTextPluginStatus:t.getRTLTextPluginStatus,Map:Fi,NavigationControl:ji,GeolocateControl:Ki,AttributionControl:Ei,ScaleControl:$i,FullscreenControl:ea,Popup:ia,Marker:Wi,Style:Ye,LngLat:t.LngLat,LngLatBounds:t.LngLatBounds,Point:t.Point,MercatorCoordinate:t.MercatorCoordinate,Evented:t.Evented,config:t.config,prewarm:function(){jt().acquire(Rt)},clearPrewarmedResources:function(){var t=Bt;t&&(t.isPreloaded()&&1===t.numActive()?(t.release(Rt),Bt=null):console.warn(\"Could not clear WebWorkers since there are active Map instances that still reference it. The pre-warmed WebWorker pool can only be cleared when all map instances have been removed with map.remove()\"))},get accessToken(){return t.config.ACCESS_TOKEN},set accessToken(e){t.config.ACCESS_TOKEN=e},get baseApiUrl(){return t.config.API_URL},set baseApiUrl(e){t.config.API_URL=e},get workerCount(){return Ft.workerCount},set workerCount(t){Ft.workerCount=t},get maxParallelImageRequests(){return t.config.MAX_PARALLEL_IMAGE_REQUESTS},set maxParallelImageRequests(e){t.config.MAX_PARALLEL_IMAGE_REQUESTS=e},clearStorage:function(e){t.clearTileCache(e)},workerUrl:\"\"};return oa})),r}()},3108:function(t,e,r){\"use strict\";t.exports=r(26099)},26099:function(t,e,r){\"use strict\";var n=r(64928),i=r(32420),a=r(51160),o=r(76752),s=r(55616),l=r(31264),u=r(47520),c=r(18400),f=r(72512),h=r(76244);function p(t,e){for(var r=e[0],n=e[1],a=1/(e[2]-r),o=1/(e[3]-n),s=new Array(t.length),l=0,u=t.length/2;l>>1;e.dtype||(e.dtype=\"array\"),\"string\"==typeof e.dtype?d=new(f(e.dtype))(g):e.dtype&&(d=e.dtype,Array.isArray(d)&&(d.length=g));for(var y=0;yr||s>1073741824){for(var h=0;hr+i||M>n+i||S=C||o===s)){var l=m[a];void 0===s&&(s=l.length);for(var u=o;u=g&&f<=w&&h>=y&&h<=T&&P.push(c)}var p=x[a],d=p[4*o+0],v=p[4*o+1],b=p[4*o+2],_=p[4*o+3],k=function(t,e){for(var r=null,n=0;null===r;)if(r=t[4*e+n],++n>t.length)return null;return r}(p,o+1),E=.5*i,O=a+1;e(r,n,E,O,d,v||b||_||k),e(r,n+E,E,O,v,b||_||k),e(r+E,n,E,O,b,_||k),e(r+E,n+E,E,O,_,k)}}(0,0,1,0,0,1),P},d;function E(t,e,r){for(var n=1,i=.5,a=.5,o=.5,s=0;s0){e+=Math.abs(o(t[0]));for(var r=1;r2){for(l=0;l=0))throw new Error(\"precision must be a positive number\");var r=Math.pow(10,e||0);return Math.round(t*r)/r},e.radiansToLength=c,e.lengthToRadians=f,e.lengthToDegrees=function(t,e){return h(f(t,e))},e.bearingToAzimuth=function(t){var e=t%360;return e<0&&(e+=360),e},e.radiansToDegrees=h,e.degreesToRadians=function(t){return t%360*Math.PI/180},e.convertLength=function(t,e,r){if(void 0===e&&(e=\"kilometers\"),void 0===r&&(r=\"kilometers\"),!(t>=0))throw new Error(\"length must be a positive number\");return c(f(t,e),r)},e.convertArea=function(t,r,n){if(void 0===r&&(r=\"meters\"),void 0===n&&(n=\"kilometers\"),!(t>=0))throw new Error(\"area must be a positive number\");var i=e.areaFactors[r];if(!i)throw new Error(\"invalid original units\");var a=e.areaFactors[n];if(!a)throw new Error(\"invalid final units\");return t/i*a},e.isNumber=p,e.isObject=function(t){return!!t&&t.constructor===Object},e.validateBBox=function(t){if(!t)throw new Error(\"bbox is required\");if(!Array.isArray(t))throw new Error(\"bbox must be an Array\");if(4!==t.length&&6!==t.length)throw new Error(\"bbox must be an Array of 4 or 6 numbers\");t.forEach((function(t){if(!p(t))throw new Error(\"bbox must only contain numbers\")}))},e.validateId=function(t){if(!t)throw new Error(\"id is required\");if(-1===[\"string\",\"number\"].indexOf(typeof t))throw new Error(\"id must be a number or a string\")}},3256:function(t,e,r){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var n=r(46284);function i(t,e,r){if(null!==t)for(var n,a,o,s,l,u,c,f,h=0,p=0,d=t.type,v=\"FeatureCollection\"===d,g=\"Feature\"===d,y=v?t.features.length:1,m=0;mu||p>c||d>f)return l=i,u=r,c=p,f=d,void(o=0);var v=n.lineString([l,i],t.properties);if(!1===e(v,r,a,d,o))return!1;o++,l=i}))&&void 0}}}))}function c(t,e){if(!t)throw new Error(\"geojson is required\");l(t,(function(t,r,i){if(null!==t.geometry){var a=t.geometry.type,o=t.geometry.coordinates;switch(a){case\"LineString\":if(!1===e(t,r,i,0,0))return!1;break;case\"Polygon\":for(var s=0;st[0]&&(e[0]=t[0]),e[1]>t[1]&&(e[1]=t[1]),e[2]=0))throw new Error(\"precision must be a positive number\");var r=Math.pow(10,e||0);return Math.round(t*r)/r},e.radiansToLength=c,e.lengthToRadians=f,e.lengthToDegrees=function(t,e){return h(f(t,e))},e.bearingToAzimuth=function(t){var e=t%360;return e<0&&(e+=360),e},e.radiansToDegrees=h,e.degreesToRadians=function(t){return t%360*Math.PI/180},e.convertLength=function(t,e,r){if(void 0===e&&(e=\"kilometers\"),void 0===r&&(r=\"kilometers\"),!(t>=0))throw new Error(\"length must be a positive number\");return c(f(t,e),r)},e.convertArea=function(t,r,n){if(void 0===r&&(r=\"meters\"),void 0===n&&(n=\"kilometers\"),!(t>=0))throw new Error(\"area must be a positive number\");var i=e.areaFactors[r];if(!i)throw new Error(\"invalid original units\");var a=e.areaFactors[n];if(!a)throw new Error(\"invalid final units\");return t/i*a},e.isNumber=p,e.isObject=function(t){return!!t&&t.constructor===Object},e.validateBBox=function(t){if(!t)throw new Error(\"bbox is required\");if(!Array.isArray(t))throw new Error(\"bbox must be an Array\");if(4!==t.length&&6!==t.length)throw new Error(\"bbox must be an Array of 4 or 6 numbers\");t.forEach((function(t){if(!p(t))throw new Error(\"bbox must only contain numbers\")}))},e.validateId=function(t){if(!t)throw new Error(\"id is required\");if(-1===[\"string\",\"number\"].indexOf(typeof t))throw new Error(\"id must be a number or a string\")}},84880:function(t,e,r){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var n=r(76796);function i(t,e,r){if(null!==t)for(var n,a,o,s,l,u,c,f,h=0,p=0,d=t.type,v=\"FeatureCollection\"===d,g=\"Feature\"===d,y=v?t.features.length:1,m=0;mu||p>c||d>f)return l=i,u=r,c=p,f=d,void(o=0);var v=n.lineString([l,i],t.properties);if(!1===e(v,r,a,d,o))return!1;o++,l=i}))&&void 0}}}))}function c(t,e){if(!t)throw new Error(\"geojson is required\");l(t,(function(t,r,i){if(null!==t.geometry){var a=t.geometry.type,o=t.geometry.coordinates;switch(a){case\"LineString\":if(!1===e(t,r,i,0,0))return!1;break;case\"Polygon\":for(var s=0;s=0))throw new Error(\"precision must be a positive number\");var r=Math.pow(10,e||0);return Math.round(t*r)/r},e.radiansToLength=c,e.lengthToRadians=f,e.lengthToDegrees=function(t,e){return h(f(t,e))},e.bearingToAzimuth=function(t){var e=t%360;return e<0&&(e+=360),e},e.radiansToDegrees=h,e.degreesToRadians=function(t){return t%360*Math.PI/180},e.convertLength=function(t,e,r){if(void 0===e&&(e=\"kilometers\"),void 0===r&&(r=\"kilometers\"),!(t>=0))throw new Error(\"length must be a positive number\");return c(f(t,e),r)},e.convertArea=function(t,r,n){if(void 0===r&&(r=\"meters\"),void 0===n&&(n=\"kilometers\"),!(t>=0))throw new Error(\"area must be a positive number\");var i=e.areaFactors[r];if(!i)throw new Error(\"invalid original units\");var a=e.areaFactors[n];if(!a)throw new Error(\"invalid final units\");return t/i*a},e.isNumber=p,e.isObject=function(t){return!!t&&t.constructor===Object},e.validateBBox=function(t){if(!t)throw new Error(\"bbox is required\");if(!Array.isArray(t))throw new Error(\"bbox must be an Array\");if(4!==t.length&&6!==t.length)throw new Error(\"bbox must be an Array of 4 or 6 numbers\");t.forEach((function(t){if(!p(t))throw new Error(\"bbox must only contain numbers\")}))},e.validateId=function(t){if(!t)throw new Error(\"id is required\");if(-1===[\"string\",\"number\"].indexOf(typeof t))throw new Error(\"id must be a number or a string\")},e.radians2degrees=function(){throw new Error(\"method has been renamed to `radiansToDegrees`\")},e.degrees2radians=function(){throw new Error(\"method has been renamed to `degreesToRadians`\")},e.distanceToDegrees=function(){throw new Error(\"method has been renamed to `lengthToDegrees`\")},e.distanceToRadians=function(){throw new Error(\"method has been renamed to `lengthToRadians`\")},e.radiansToDistance=function(){throw new Error(\"method has been renamed to `radiansToLength`\")},e.bearingToAngle=function(){throw new Error(\"method has been renamed to `bearingToAzimuth`\")},e.convertDistance=function(){throw new Error(\"method has been renamed to `convertLength`\")}},43752:function(t,e,r){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var n=r(49840);function i(t,e,r){if(null!==t)for(var n,a,o,s,l,u,c,f,h=0,p=0,d=t.type,v=\"FeatureCollection\"===d,g=\"Feature\"===d,y=v?t.features.length:1,m=0;mu||p>c||d>f)return l=i,u=r,c=p,f=d,void(o=0);var v=n.lineString([l,i],t.properties);if(!1===e(v,r,a,d,o))return!1;o++,l=i}))&&void 0}}}))}function c(t,e){if(!t)throw new Error(\"geojson is required\");l(t,(function(t,r,i){if(null!==t.geometry){var a=t.geometry.type,o=t.geometry.coordinates;switch(a){case\"LineString\":if(!1===e(t,r,i,0,0))return!1;break;case\"Polygon\":for(var s=0;si&&(i=t[o]),t[o]1?r-1:0),i=1;i1?r-1:0),i=1;i1?r-1:0),i=1;i1?r-1:0),i=1;it.length)&&(r=t.length),t.substring(r-e.length,r)===e}var g=\"\",y=\"\",m=\"\",x=\"\",b={deepStrictEqual:\"Expected values to be strictly deep-equal:\",strictEqual:\"Expected values to be strictly equal:\",strictEqualObject:'Expected \"actual\" to be reference-equal to \"expected\":',deepEqual:\"Expected values to be loosely deep-equal:\",equal:\"Expected values to be loosely equal:\",notDeepStrictEqual:'Expected \"actual\" not to be strictly deep-equal to:',notStrictEqual:'Expected \"actual\" to be strictly unequal to:',notStrictEqualObject:'Expected \"actual\" not to be reference-equal to \"expected\":',notDeepEqual:'Expected \"actual\" not to be loosely deep-equal to:',notEqual:'Expected \"actual\" to be loosely unequal to:',notIdentical:\"Values identical but not reference-equal:\"};function _(t){var e=Object.keys(t),r=Object.create(Object.getPrototypeOf(t));return e.forEach((function(e){r[e]=t[e]})),Object.defineProperty(r,\"message\",{value:t.message}),r}function w(t){return p(t,{compact:!1,customInspect:!1,depth:1e3,maxArrayLength:1/0,showHidden:!1,breakLength:1/0,showProxy:!1,sorted:!0,getters:!0})}var T=function(t){function e(t){var r;if(function(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}(this,e),\"object\"!==h(t)||null===t)throw new d(\"options\",\"Object\",t);var i=t.message,a=t.operator,l=t.stackStartFn,u=t.actual,c=t.expected,p=Error.stackTraceLimit;if(Error.stackTraceLimit=0,null!=i)r=o(this,f(e).call(this,String(i)));else if(n.stderr&&n.stderr.isTTY&&(n.stderr&&n.stderr.getColorDepth&&1!==n.stderr.getColorDepth()?(g=\"\u001b[34m\",y=\"\u001b[32m\",x=\"\u001b[39m\",m=\"\u001b[31m\"):(g=\"\",y=\"\",x=\"\",m=\"\")),\"object\"===h(u)&&null!==u&&\"object\"===h(c)&&null!==c&&\"stack\"in u&&u instanceof Error&&\"stack\"in c&&c instanceof Error&&(u=_(u),c=_(c)),\"deepStrictEqual\"===a||\"strictEqual\"===a)r=o(this,f(e).call(this,function(t,e,r){var i=\"\",a=\"\",o=0,s=\"\",l=!1,u=w(t),c=u.split(\"\\n\"),f=w(e).split(\"\\n\"),p=0,d=\"\";if(\"strictEqual\"===r&&\"object\"===h(t)&&\"object\"===h(e)&&null!==t&&null!==e&&(r=\"strictEqualObject\"),1===c.length&&1===f.length&&c[0]!==f[0]){var _=c[0].length+f[0].length;if(_<=10){if(!(\"object\"===h(t)&&null!==t||\"object\"===h(e)&&null!==e||0===t&&0===e))return\"\".concat(b[r],\"\\n\\n\")+\"\".concat(c[0],\" !== \").concat(f[0],\"\\n\")}else if(\"strictEqualObject\"!==r&&_<(n.stderr&&n.stderr.isTTY?n.stderr.columns:80)){for(;c[0][p]===f[0][p];)p++;p>2&&(d=\"\\n \".concat(function(t,e){if(e=Math.floor(e),0==t.length||0==e)return\"\";var r=t.length*e;for(e=Math.floor(Math.log(e)/Math.log(2));e;)t+=t,e--;return t+t.substring(0,r-t.length)}(\" \",p),\"^\"),p=0)}}for(var T=c[c.length-1],k=f[f.length-1];T===k&&(p++<2?s=\"\\n \".concat(T).concat(s):i=T,c.pop(),f.pop(),0!==c.length&&0!==f.length);)T=c[c.length-1],k=f[f.length-1];var A=Math.max(c.length,f.length);if(0===A){var M=u.split(\"\\n\");if(M.length>30)for(M[26]=\"\".concat(g,\"...\").concat(x);M.length>27;)M.pop();return\"\".concat(b.notIdentical,\"\\n\\n\").concat(M.join(\"\\n\"),\"\\n\")}p>3&&(s=\"\\n\".concat(g,\"...\").concat(x).concat(s),l=!0),\"\"!==i&&(s=\"\\n \".concat(i).concat(s),i=\"\");var S=0,E=b[r]+\"\\n\".concat(y,\"+ actual\").concat(x,\" \").concat(m,\"- expected\").concat(x),L=\" \".concat(g,\"...\").concat(x,\" Lines skipped\");for(p=0;p1&&p>2&&(C>4?(a+=\"\\n\".concat(g,\"...\").concat(x),l=!0):C>3&&(a+=\"\\n \".concat(f[p-2]),S++),a+=\"\\n \".concat(f[p-1]),S++),o=p,i+=\"\\n\".concat(m,\"-\").concat(x,\" \").concat(f[p]),S++;else if(f.length1&&p>2&&(C>4?(a+=\"\\n\".concat(g,\"...\").concat(x),l=!0):C>3&&(a+=\"\\n \".concat(c[p-2]),S++),a+=\"\\n \".concat(c[p-1]),S++),o=p,a+=\"\\n\".concat(y,\"+\").concat(x,\" \").concat(c[p]),S++;else{var P=f[p],O=c[p],I=O!==P&&(!v(O,\",\")||O.slice(0,-1)!==P);I&&v(P,\",\")&&P.slice(0,-1)===O&&(I=!1,O+=\",\"),I?(C>1&&p>2&&(C>4?(a+=\"\\n\".concat(g,\"...\").concat(x),l=!0):C>3&&(a+=\"\\n \".concat(c[p-2]),S++),a+=\"\\n \".concat(c[p-1]),S++),o=p,a+=\"\\n\".concat(y,\"+\").concat(x,\" \").concat(O),i+=\"\\n\".concat(m,\"-\").concat(x,\" \").concat(P),S+=2):(a+=i,i=\"\",1!==C&&0!==p||(a+=\"\\n \".concat(O),S++))}if(S>20&&p30)for(k[26]=\"\".concat(g,\"...\").concat(x);k.length>27;)k.pop();r=1===k.length?o(this,f(e).call(this,\"\".concat(T,\" \").concat(k[0]))):o(this,f(e).call(this,\"\".concat(T,\"\\n\\n\").concat(k.join(\"\\n\"),\"\\n\")))}else{var A=w(u),M=\"\",S=b[a];\"notDeepEqual\"===a||\"notEqual\"===a?(A=\"\".concat(b[a],\"\\n\\n\").concat(A)).length>1024&&(A=\"\".concat(A.slice(0,1021),\"...\")):(M=\"\".concat(w(c)),A.length>512&&(A=\"\".concat(A.slice(0,509),\"...\")),M.length>512&&(M=\"\".concat(M.slice(0,509),\"...\")),\"deepEqual\"===a||\"equal\"===a?A=\"\".concat(S,\"\\n\\n\").concat(A,\"\\n\\nshould equal\\n\\n\"):M=\" \".concat(a,\" \").concat(M)),r=o(this,f(e).call(this,\"\".concat(A).concat(M)))}return Error.stackTraceLimit=p,r.generatedMessage=!i,Object.defineProperty(s(r),\"name\",{value:\"AssertionError [ERR_ASSERTION]\",enumerable:!1,writable:!0,configurable:!0}),r.code=\"ERR_ASSERTION\",r.actual=u,r.expected=c,r.operator=a,Error.captureStackTrace&&Error.captureStackTrace(s(r),l),r.stack,r.name=\"AssertionError\",o(r)}var r,l;return function(t,e){if(\"function\"!=typeof e&&null!==e)throw new TypeError(\"Super expression must either be null or a function\");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),e&&c(t,e)}(e,t),r=e,l=[{key:\"toString\",value:function(){return\"\".concat(this.name,\" [\").concat(this.code,\"]: \").concat(this.message)}},{key:p.custom,value:function(t,e){return p(this,function(t){for(var e=1;e2?\"one of \".concat(e,\" \").concat(t.slice(0,r-1).join(\", \"),\", or \")+t[r-1]:2===r?\"one of \".concat(e,\" \").concat(t[0],\" or \").concat(t[1]):\"of \".concat(e,\" \").concat(t[0])}return\"of \".concat(e,\" \").concat(String(t))}u(\"ERR_AMBIGUOUS_ARGUMENT\",'The \"%s\" argument is ambiguous. %s',TypeError),u(\"ERR_INVALID_ARG_TYPE\",(function(t,e,i){var a,s,l,u,f;if(void 0===o&&(o=r(45408)),o(\"string\"==typeof t,\"'name' must be a string\"),\"string\"==typeof e&&(s=\"not \",e.substr(0,4)===s)?(a=\"must not be\",e=e.replace(/^not /,\"\")):a=\"must be\",function(t,e,r){return(void 0===r||r>t.length)&&(r=t.length),t.substring(r-9,r)===e}(t,\" argument\"))l=\"The \".concat(t,\" \").concat(a,\" \").concat(c(e,\"type\"));else{var h=(\"number\"!=typeof f&&(f=0),f+1>(u=t).length||-1===u.indexOf(\".\",f)?\"argument\":\"property\");l='The \"'.concat(t,'\" ').concat(h,\" \").concat(a,\" \").concat(c(e,\"type\"))}return l+\". Received type \".concat(n(i))}),TypeError),u(\"ERR_INVALID_ARG_VALUE\",(function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"is invalid\";void 0===s&&(s=r(35840));var i=s.inspect(e);return i.length>128&&(i=\"\".concat(i.slice(0,128),\"...\")),\"The argument '\".concat(t,\"' \").concat(n,\". Received \").concat(i)}),TypeError,RangeError),u(\"ERR_INVALID_RETURN_VALUE\",(function(t,e,r){var i;return i=r&&r.constructor&&r.constructor.name?\"instance of \".concat(r.constructor.name):\"type \".concat(n(r)),\"Expected \".concat(t,' to be returned from the \"').concat(e,'\"')+\" function but got \".concat(i,\".\")}),TypeError),u(\"ERR_MISSING_ARGS\",(function(){for(var t=arguments.length,e=new Array(t),n=0;n0,\"At least one arg needs to be specified\");var i=\"The \",a=e.length;switch(e=e.map((function(t){return'\"'.concat(t,'\"')})),a){case 1:i+=\"\".concat(e[0],\" argument\");break;case 2:i+=\"\".concat(e[0],\" and \").concat(e[1],\" arguments\");break;default:i+=e.slice(0,a-1).join(\", \"),i+=\", and \".concat(e[a-1],\" arguments\")}return\"\".concat(i,\" must be specified\")}),TypeError),t.exports.codes=l},25116:function(t,e,r){\"use strict\";function n(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var r=[],n=!0,i=!1,a=void 0;try{for(var o,s=t[Symbol.iterator]();!(n=(o=s.next()).done)&&(r.push(o.value),!e||r.length!==e);n=!0);}catch(t){i=!0,a=t}finally{try{n||null==s.return||s.return()}finally{if(i)throw a}}return r}(t,e)||function(){throw new TypeError(\"Invalid attempt to destructure non-iterable instance\")}()}function i(t){return i=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\"function\"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?\"symbol\":typeof t},i(t)}var a=void 0!==/a/g.flags,o=function(t){var e=[];return t.forEach((function(t){return e.push(t)})),e},s=function(t){var e=[];return t.forEach((function(t,r){return e.push([r,t])})),e},l=Object.is?Object.is:r(39896),u=Object.getOwnPropertySymbols?Object.getOwnPropertySymbols:function(){return[]},c=Number.isNaN?Number.isNaN:r(1560);function f(t){return t.call.bind(t)}var h=f(Object.prototype.hasOwnProperty),p=f(Object.prototype.propertyIsEnumerable),d=f(Object.prototype.toString),v=r(35840).types,g=v.isAnyArrayBuffer,y=v.isArrayBufferView,m=v.isDate,x=v.isMap,b=v.isRegExp,_=v.isSet,w=v.isNativeError,T=v.isBoxedPrimitive,k=v.isNumberObject,A=v.isStringObject,M=v.isBooleanObject,S=v.isBigIntObject,E=v.isSymbolObject,L=v.isFloat32Array,C=v.isFloat64Array;function P(t){if(0===t.length||t.length>10)return!0;for(var e=0;e57)return!0}return 10===t.length&&t>=Math.pow(2,32)}function O(t){return Object.keys(t).filter(P).concat(u(t).filter(Object.prototype.propertyIsEnumerable.bind(t)))}function I(t,e){if(t===e)return 0;for(var r=t.length,n=e.length,i=0,a=Math.min(r,n);i>2],a+=n[(3&r[e])<<4|r[e+1]>>4],a+=n[(15&r[e+1])<<2|r[e+2]>>6],a+=n[63&r[e+2]];return i%3==2?a=a.substring(0,a.length-1)+\"=\":i%3==1&&(a=a.substring(0,a.length-2)+\"==\"),a},s=function(t){var e,r,n,a,o,s=.75*t.length,l=t.length,u=0;\"=\"===t[t.length-1]&&(s--,\"=\"===t[t.length-2]&&s--);var c=new ArrayBuffer(s),f=new Uint8Array(c);for(e=0;e>4,f[u++]=(15&n)<<4|a>>2,f[u++]=(3&a)<<6|63&o;return c}},59968:function(t,e){\"use strict\";e.byteLength=function(t){var e=s(t),r=e[0],n=e[1];return 3*(r+n)/4-n},e.toByteArray=function(t){var e,r,a=s(t),o=a[0],l=a[1],u=new i(function(t,e,r){return 3*(e+r)/4-r}(0,o,l)),c=0,f=l>0?o-4:o;for(r=0;r>16&255,u[c++]=e>>8&255,u[c++]=255&e;return 2===l&&(e=n[t.charCodeAt(r)]<<2|n[t.charCodeAt(r+1)]>>4,u[c++]=255&e),1===l&&(e=n[t.charCodeAt(r)]<<10|n[t.charCodeAt(r+1)]<<4|n[t.charCodeAt(r+2)]>>2,u[c++]=e>>8&255,u[c++]=255&e),u},e.fromByteArray=function(t){for(var e,n=t.length,i=n%3,a=[],o=16383,s=0,u=n-i;su?u:s+o));return 1===i?(e=t[n-1],a.push(r[e>>2]+r[e<<4&63]+\"==\")):2===i&&(e=(t[n-2]<<8)+t[n-1],a.push(r[e>>10]+r[e>>4&63]+r[e<<2&63]+\"=\")),a.join(\"\")};for(var r=[],n=[],i=\"undefined\"!=typeof Uint8Array?Uint8Array:Array,a=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\",o=0;o<64;++o)r[o]=a[o],n[a.charCodeAt(o)]=o;function s(t){var e=t.length;if(e%4>0)throw new Error(\"Invalid string. Length must be a multiple of 4\");var r=t.indexOf(\"=\");return-1===r&&(r=e),[r,r===e?0:4-r%4]}function l(t,e,n){for(var i,a,o=[],s=e;s>18&63]+r[a>>12&63]+r[a>>6&63]+r[63&a]);return o.join(\"\")}n[\"-\".charCodeAt(0)]=62,n[\"_\".charCodeAt(0)]=63},64928:function(t){\"use strict\";function e(t,e,r,n,i){for(var a=i+1;n<=i;){var o=n+i>>>1,s=t[o];(void 0!==r?r(s,e):s-e)>=0?(a=o,i=o-1):n=o+1}return a}function r(t,e,r,n,i){for(var a=i+1;n<=i;){var o=n+i>>>1,s=t[o];(void 0!==r?r(s,e):s-e)>0?(a=o,i=o-1):n=o+1}return a}function n(t,e,r,n,i){for(var a=n-1;n<=i;){var o=n+i>>>1,s=t[o];(void 0!==r?r(s,e):s-e)<0?(a=o,n=o+1):i=o-1}return a}function i(t,e,r,n,i){for(var a=n-1;n<=i;){var o=n+i>>>1,s=t[o];(void 0!==r?r(s,e):s-e)<=0?(a=o,n=o+1):i=o-1}return a}function a(t,e,r,n,i){for(;n<=i;){var a=n+i>>>1,o=t[a],s=void 0!==r?r(o,e):o-e;if(0===s)return a;s<=0?n=a+1:i=a-1}return-1}function o(t,e,r,n,i,a){return\"function\"==typeof r?a(t,e,r,void 0===n?0:0|n,void 0===i?t.length-1:0|i):a(t,e,void 0,void 0===r?0:0|r,void 0===n?t.length-1:0|n)}t.exports={ge:function(t,r,n,i,a){return o(t,r,n,i,a,e)},gt:function(t,e,n,i,a){return o(t,e,n,i,a,r)},lt:function(t,e,r,i,a){return o(t,e,r,i,a,n)},le:function(t,e,r,n,a){return o(t,e,r,n,a,i)},eq:function(t,e,r,n,i){return o(t,e,r,n,i,a)}}},308:function(t,e){\"use strict\";function r(t){var e=32;return(t&=-t)&&e--,65535&t&&(e-=16),16711935&t&&(e-=8),252645135&t&&(e-=4),858993459&t&&(e-=2),1431655765&t&&(e-=1),e}e.INT_BITS=32,e.INT_MAX=2147483647,e.INT_MIN=-1<<31,e.sign=function(t){return(t>0)-(t<0)},e.abs=function(t){var e=t>>31;return(t^e)-e},e.min=function(t,e){return e^(t^e)&-(t65535)<<4,e|=r=((t>>>=e)>255)<<3,e|=r=((t>>>=r)>15)<<2,(e|=r=((t>>>=r)>3)<<1)|(t>>>=r)>>1},e.log10=function(t){return t>=1e9?9:t>=1e8?8:t>=1e7?7:t>=1e6?6:t>=1e5?5:t>=1e4?4:t>=1e3?3:t>=100?2:t>=10?1:0},e.popCount=function(t){return 16843009*((t=(858993459&(t-=t>>>1&1431655765))+(t>>>2&858993459))+(t>>>4)&252645135)>>>24},e.countTrailingZeros=r,e.nextPow2=function(t){return t+=0===t,--t,t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,1+(t|=t>>>16)},e.prevPow2=function(t){return t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,(t|=t>>>16)-(t>>>1)},e.parity=function(t){return t^=t>>>16,t^=t>>>8,t^=t>>>4,27030>>>(t&=15)&1};var n=new Array(256);!function(t){for(var e=0;e<256;++e){var r=e,n=e,i=7;for(r>>>=1;r;r>>>=1)n<<=1,n|=1&r,--i;t[e]=n<>>8&255]<<16|n[t>>>16&255]<<8|n[t>>>24&255]},e.interleave2=function(t,e){return(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t&=65535)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e&=65535)|e<<8))|e<<4))|e<<2))|e<<1))<<1},e.deinterleave2=function(t,e){return(t=65535&((t=16711935&((t=252645135&((t=858993459&((t=t>>>e&1431655765)|t>>>1))|t>>>2))|t>>>4))|t>>>16))<<16>>16},e.interleave3=function(t,e,r){return t=1227133513&((t=3272356035&((t=251719695&((t=4278190335&((t&=1023)|t<<16))|t<<8))|t<<4))|t<<2),(t|=(e=1227133513&((e=3272356035&((e=251719695&((e=4278190335&((e&=1023)|e<<16))|e<<8))|e<<4))|e<<2))<<1)|(r=1227133513&((r=3272356035&((r=251719695&((r=4278190335&((r&=1023)|r<<16))|r<<8))|r<<4))|r<<2))<<2},e.deinterleave3=function(t,e){return(t=1023&((t=4278190335&((t=251719695&((t=3272356035&((t=t>>>e&1227133513)|t>>>2))|t>>>4))|t>>>8))|t>>>16))<<22>>22},e.nextCombination=function(t){var e=t|t-1;return e+1|(~e&-~e)-1>>>r(t)+1}},29620:function(t,e,r){\"use strict\";var n=r(32420);t.exports=function(t,e){e||(e={});var r,o,s,l,u,c,f,h,p,d,v,g=null==e.cutoff?.25:e.cutoff,y=null==e.radius?8:e.radius,m=e.channel||0;if(ArrayBuffer.isView(t)||Array.isArray(t)){if(!e.width||!e.height)throw Error(\"For raw data width and height should be provided by options\");r=e.width,o=e.height,l=t,c=e.stride?e.stride:Math.floor(t.length/r/o)}else window.HTMLCanvasElement&&t instanceof window.HTMLCanvasElement?(f=(h=t).getContext(\"2d\"),r=h.width,o=h.height,l=(p=f.getImageData(0,0,r,o)).data,c=4):window.CanvasRenderingContext2D&&t instanceof window.CanvasRenderingContext2D?(f=t,r=(h=t.canvas).width,o=h.height,l=(p=f.getImageData(0,0,r,o)).data,c=4):window.ImageData&&t instanceof window.ImageData&&(p=t,r=t.width,o=t.height,l=p.data,c=4);if(s=Math.max(r,o),window.Uint8ClampedArray&&l instanceof window.Uint8ClampedArray||window.Uint8Array&&l instanceof window.Uint8Array)for(u=l,l=Array(r*o),d=0,v=u.length;d-1?i(r):r}},57916:function(t,e,r){\"use strict\";var n=r(8844),i=r(53664),a=r(14500),o=i(\"%TypeError%\"),s=i(\"%Function.prototype.apply%\"),l=i(\"%Function.prototype.call%\"),u=i(\"%Reflect.apply%\",!0)||n.call(l,s),c=i(\"%Object.defineProperty%\",!0),f=i(\"%Math.max%\");if(c)try{c({},\"a\",{value:1})}catch(t){c=null}t.exports=function(t){if(\"function\"!=typeof t)throw new o(\"a function is required\");var e=u(n,l,arguments);return a(e,1+f(0,t.length-(arguments.length-1)),!0)};var h=function(){return u(n,s,arguments)};c?c(t.exports,\"apply\",{value:h}):t.exports.apply=h},32420:function(t){t.exports=function(t,e,r){return er?r:t:te?e:t}},3808:function(t,e,r){\"use strict\";var n=r(32420);function i(t,e){null==e&&(e=!0);var r=t[0],i=t[1],a=t[2],o=t[3];return null==o&&(o=e?1:255),e&&(r*=255,i*=255,a*=255,o*=255),16777216*(r=255&n(r,0,255))+((i=255&n(i,0,255))<<16)+((a=255&n(a,0,255))<<8)+(255&n(o,0,255))}t.exports=i,t.exports.to=i,t.exports.from=function(t,e){var r=(t=+t)>>>24,n=(16711680&t)>>>16,i=(65280&t)>>>8,a=255&t;return!1===e?[r,n,i,a]:[r/255,n/255,i/255,a/255]}},17592:function(t){\"use strict\";t.exports={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}},72160:function(t,e,r){\"use strict\";var n=r(96824),i=r(32420),a=r(72512);t.exports=function(t,e){\"float\"!==e&&e||(e=\"array\"),\"uint\"===e&&(e=\"uint8\"),\"uint_clamped\"===e&&(e=\"uint8_clamped\");var r=new(a(e))(4),o=\"uint8\"!==e&&\"uint8_clamped\"!==e;return t.length&&\"string\"!=typeof t||((t=n(t))[0]/=255,t[1]/=255,t[2]/=255),function(t){return t instanceof Uint8Array||t instanceof Uint8ClampedArray||!!(Array.isArray(t)&&(t[0]>1||0===t[0])&&(t[1]>1||0===t[1])&&(t[2]>1||0===t[2])&&(!t[3]||t[3]>1))}(t)?(r[0]=t[0],r[1]=t[1],r[2]=t[2],r[3]=null!=t[3]?t[3]:255,o&&(r[0]/=255,r[1]/=255,r[2]/=255,r[3]/=255),r):(o?(r[0]=t[0],r[1]=t[1],r[2]=t[2],r[3]=null!=t[3]?t[3]:1):(r[0]=i(Math.floor(255*t[0]),0,255),r[1]=i(Math.floor(255*t[1]),0,255),r[2]=i(Math.floor(255*t[2]),0,255),r[3]=null==t[3]?255:i(Math.floor(255*t[3]),0,255)),r)}},96824:function(t,e,r){\"use strict\";var n=r(95532),i=r(53576),a=r(32420);t.exports=function(t){var e,r=n(t);return r.space?((e=Array(3))[0]=a(r.values[0],0,255),e[1]=a(r.values[1],0,255),e[2]=a(r.values[2],0,255),\"h\"===r.space[0]&&(e=i.rgb(e)),e.push(a(r.alpha,0,1)),e):[]}},95532:function(t,e,r){\"use strict\";var n=r(17592);t.exports=function(t){var e,r,a=[],o=1;if(\"string\"==typeof t)if(t=t.toLowerCase(),n[t])a=n[t].slice(),r=\"rgb\";else if(\"transparent\"===t)o=0,r=\"rgb\",a=[0,0,0];else if(/^#[A-Fa-f0-9]+$/.test(t)){var s=t.slice(1);o=1,(c=s.length)<=4?(a=[parseInt(s[0]+s[0],16),parseInt(s[1]+s[1],16),parseInt(s[2]+s[2],16)],4===c&&(o=parseInt(s[3]+s[3],16)/255)):(a=[parseInt(s[0]+s[1],16),parseInt(s[2]+s[3],16),parseInt(s[4]+s[5],16)],8===c&&(o=parseInt(s[6]+s[7],16)/255)),a[0]||(a[0]=0),a[1]||(a[1]=0),a[2]||(a[2]=0),r=\"rgb\"}else if(e=/^((?:rgb|hs[lvb]|hwb|cmyk?|xy[zy]|gray|lab|lchu?v?|[ly]uv|lms)a?)\\s*\\(([^\\)]*)\\)/.exec(t)){var l=e[1],u=\"rgb\"===l;r=s=l.replace(/a$/,\"\");var c=\"cmyk\"===s?4:\"gray\"===s?1:3;a=e[2].trim().split(/\\s*[,\\/]\\s*|\\s+/).map((function(t,e){if(/%$/.test(t))return e===c?parseFloat(t)/100:\"rgb\"===s?255*parseFloat(t)/100:parseFloat(t);if(\"h\"===s[e]){if(/deg$/.test(t))return parseFloat(t);if(void 0!==i[t])return i[t]}return parseFloat(t)})),l===s&&a.push(1),o=u||void 0===a[c]?1:a[c],a=a.slice(0,c)}else t.length>10&&/[0-9](?:\\s|\\/)/.test(t)&&(a=t.match(/([0-9]+)/g).map((function(t){return parseFloat(t)})),r=t.match(/([a-z])/gi).join(\"\").toLowerCase());else isNaN(t)?Array.isArray(t)||t.length?(a=[t[0],t[1],t[2]],r=\"rgb\",o=4===t.length?t[3]:1):t instanceof Object&&(null!=t.r||null!=t.red||null!=t.R?(r=\"rgb\",a=[t.r||t.red||t.R||0,t.g||t.green||t.G||0,t.b||t.blue||t.B||0]):(r=\"hsl\",a=[t.h||t.hue||t.H||0,t.s||t.saturation||t.S||0,t.l||t.lightness||t.L||t.b||t.brightness]),o=t.a||t.alpha||t.opacity||1,null!=t.opacity&&(o/=100)):(r=\"rgb\",a=[t>>>16,(65280&t)>>>8,255&t]);return{space:r,values:a,alpha:o}};var i={red:0,orange:60,yellow:120,green:180,blue:240,purple:300}},53576:function(t,e,r){\"use strict\";var n=r(19336);t.exports={name:\"hsl\",min:[0,0,0],max:[360,100,100],channel:[\"hue\",\"saturation\",\"lightness\"],alias:[\"HSL\"],rgb:function(t){var e,r,n,i,a,o=t[0]/360,s=t[1]/100,l=t[2]/100;if(0===s)return[a=255*l,a,a];e=2*l-(r=l<.5?l*(1+s):l+s-l*s),i=[0,0,0];for(var u=0;u<3;u++)(n=o+1/3*-(u-1))<0?n++:n>1&&n--,a=6*n<1?e+6*(r-e)*n:2*n<1?r:3*n<2?e+(r-e)*(2/3-n)*6:e,i[u]=255*a;return i}},n.hsl=function(t){var e,r,n=t[0]/255,i=t[1]/255,a=t[2]/255,o=Math.min(n,i,a),s=Math.max(n,i,a),l=s-o;return s===o?e=0:n===s?e=(i-a)/l:i===s?e=2+(a-n)/l:a===s&&(e=4+(n-i)/l),(e=Math.min(60*e,360))<0&&(e+=360),r=(o+s)/2,[e,100*(s===o?0:r<=.5?l/(s+o):l/(2-s-o)),100*r]}},19336:function(t){\"use strict\";t.exports={name:\"rgb\",min:[0,0,0],max:[255,255,255],channel:[\"red\",\"green\",\"blue\"],alias:[\"RGB\"]}},36116:function(t){t.exports={AFG:\"afghan\",ALA:\"\\\\b\\\\wland\",ALB:\"albania\",DZA:\"algeria\",ASM:\"^(?=.*americ).*samoa\",AND:\"andorra\",AGO:\"angola\",AIA:\"anguill?a\",ATA:\"antarctica\",ATG:\"antigua\",ARG:\"argentin\",ARM:\"armenia\",ABW:\"^(?!.*bonaire).*\\\\baruba\",AUS:\"australia\",AUT:\"^(?!.*hungary).*austria|\\\\baustri.*\\\\bemp\",AZE:\"azerbaijan\",BHS:\"bahamas\",BHR:\"bahrain\",BGD:\"bangladesh|^(?=.*east).*paki?stan\",BRB:\"barbados\",BLR:\"belarus|byelo\",BEL:\"^(?!.*luxem).*belgium\",BLZ:\"belize|^(?=.*british).*honduras\",BEN:\"benin|dahome\",BMU:\"bermuda\",BTN:\"bhutan\",BOL:\"bolivia\",BES:\"^(?=.*bonaire).*eustatius|^(?=.*carib).*netherlands|\\\\bbes.?islands\",BIH:\"herzegovina|bosnia\",BWA:\"botswana|bechuana\",BVT:\"bouvet\",BRA:\"brazil\",IOT:\"british.?indian.?ocean\",BRN:\"brunei\",BGR:\"bulgaria\",BFA:\"burkina|\\\\bfaso|upper.?volta\",BDI:\"burundi\",CPV:\"verde\",KHM:\"cambodia|kampuchea|khmer\",CMR:\"cameroon\",CAN:\"canada\",CYM:\"cayman\",CAF:\"\\\\bcentral.african.republic\",TCD:\"\\\\bchad\",CHL:\"\\\\bchile\",CHN:\"^(?!.*\\\\bmac)(?!.*\\\\bhong)(?!.*\\\\btai)(?!.*\\\\brep).*china|^(?=.*peo)(?=.*rep).*china\",CXR:\"christmas\",CCK:\"\\\\bcocos|keeling\",COL:\"colombia\",COM:\"comoro\",COG:\"^(?!.*\\\\bdem)(?!.*\\\\bd[\\\\.]?r)(?!.*kinshasa)(?!.*zaire)(?!.*belg)(?!.*l.opoldville)(?!.*free).*\\\\bcongo\",COK:\"\\\\bcook\",CRI:\"costa.?rica\",CIV:\"ivoire|ivory\",HRV:\"croatia\",CUB:\"\\\\bcuba\",CUW:\"^(?!.*bonaire).*\\\\bcura(c|ç)ao\",CYP:\"cyprus\",CSK:\"czechoslovakia\",CZE:\"^(?=.*rep).*czech|czechia|bohemia\",COD:\"\\\\bdem.*congo|congo.*\\\\bdem|congo.*\\\\bd[\\\\.]?r|\\\\bd[\\\\.]?r.*congo|belgian.?congo|congo.?free.?state|kinshasa|zaire|l.opoldville|drc|droc|rdc\",DNK:\"denmark\",DJI:\"djibouti\",DMA:\"dominica(?!n)\",DOM:\"dominican.rep\",ECU:\"ecuador\",EGY:\"egypt\",SLV:\"el.?salvador\",GNQ:\"guine.*eq|eq.*guine|^(?=.*span).*guinea\",ERI:\"eritrea\",EST:\"estonia\",ETH:\"ethiopia|abyssinia\",FLK:\"falkland|malvinas\",FRO:\"faroe|faeroe\",FJI:\"fiji\",FIN:\"finland\",FRA:\"^(?!.*\\\\bdep)(?!.*martinique).*france|french.?republic|\\\\bgaul\",GUF:\"^(?=.*french).*guiana\",PYF:\"french.?polynesia|tahiti\",ATF:\"french.?southern\",GAB:\"gabon\",GMB:\"gambia\",GEO:\"^(?!.*south).*georgia\",DDR:\"german.?democratic.?republic|democratic.?republic.*germany|east.germany\",DEU:\"^(?!.*east).*germany|^(?=.*\\\\bfed.*\\\\brep).*german\",GHA:\"ghana|gold.?coast\",GIB:\"gibraltar\",GRC:\"greece|hellenic|hellas\",GRL:\"greenland\",GRD:\"grenada\",GLP:\"guadeloupe\",GUM:\"\\\\bguam\",GTM:\"guatemala\",GGY:\"guernsey\",GIN:\"^(?!.*eq)(?!.*span)(?!.*bissau)(?!.*portu)(?!.*new).*guinea\",GNB:\"bissau|^(?=.*portu).*guinea\",GUY:\"guyana|british.?guiana\",HTI:\"haiti\",HMD:\"heard.*mcdonald\",VAT:\"holy.?see|vatican|papal.?st\",HND:\"^(?!.*brit).*honduras\",HKG:\"hong.?kong\",HUN:\"^(?!.*austr).*hungary\",ISL:\"iceland\",IND:\"india(?!.*ocea)\",IDN:\"indonesia\",IRN:\"\\\\biran|persia\",IRQ:\"\\\\biraq|mesopotamia\",IRL:\"(^ireland)|(^republic.*ireland)\",IMN:\"^(?=.*isle).*\\\\bman\",ISR:\"israel\",ITA:\"italy\",JAM:\"jamaica\",JPN:\"japan\",JEY:\"jersey\",JOR:\"jordan\",KAZ:\"kazak\",KEN:\"kenya|british.?east.?africa|east.?africa.?prot\",KIR:\"kiribati\",PRK:\"^(?=.*democrat|people|north|d.*p.*.r).*\\\\bkorea|dprk|korea.*(d.*p.*r)\",KWT:\"kuwait\",KGZ:\"kyrgyz|kirghiz\",LAO:\"\\\\blaos?\\\\b\",LVA:\"latvia\",LBN:\"lebanon\",LSO:\"lesotho|basuto\",LBR:\"liberia\",LBY:\"libya\",LIE:\"liechtenstein\",LTU:\"lithuania\",LUX:\"^(?!.*belg).*luxem\",MAC:\"maca(o|u)\",MDG:\"madagascar|malagasy\",MWI:\"malawi|nyasa\",MYS:\"malaysia\",MDV:\"maldive\",MLI:\"\\\\bmali\\\\b\",MLT:\"\\\\bmalta\",MHL:\"marshall\",MTQ:\"martinique\",MRT:\"mauritania\",MUS:\"mauritius\",MYT:\"\\\\bmayotte\",MEX:\"\\\\bmexic\",FSM:\"fed.*micronesia|micronesia.*fed\",MCO:\"monaco\",MNG:\"mongolia\",MNE:\"^(?!.*serbia).*montenegro\",MSR:\"montserrat\",MAR:\"morocco|\\\\bmaroc\",MOZ:\"mozambique\",MMR:\"myanmar|burma\",NAM:\"namibia\",NRU:\"nauru\",NPL:\"nepal\",NLD:\"^(?!.*\\\\bant)(?!.*\\\\bcarib).*netherlands\",ANT:\"^(?=.*\\\\bant).*(nether|dutch)\",NCL:\"new.?caledonia\",NZL:\"new.?zealand\",NIC:\"nicaragua\",NER:\"\\\\bniger(?!ia)\",NGA:\"nigeria\",NIU:\"niue\",NFK:\"norfolk\",MNP:\"mariana\",NOR:\"norway\",OMN:\"\\\\boman|trucial\",PAK:\"^(?!.*east).*paki?stan\",PLW:\"palau\",PSE:\"palestin|\\\\bgaza|west.?bank\",PAN:\"panama\",PNG:\"papua|new.?guinea\",PRY:\"paraguay\",PER:\"peru\",PHL:\"philippines\",PCN:\"pitcairn\",POL:\"poland\",PRT:\"portugal\",PRI:\"puerto.?rico\",QAT:\"qatar\",KOR:\"^(?!.*d.*p.*r)(?!.*democrat)(?!.*people)(?!.*north).*\\\\bkorea(?!.*d.*p.*r)\",MDA:\"moldov|b(a|e)ssarabia\",REU:\"r(e|é)union\",ROU:\"r(o|u|ou)mania\",RUS:\"\\\\brussia|soviet.?union|u\\\\.?s\\\\.?s\\\\.?r|socialist.?republics\",RWA:\"rwanda\",BLM:\"barth(e|é)lemy\",SHN:\"helena\",KNA:\"kitts|\\\\bnevis\",LCA:\"\\\\blucia\",MAF:\"^(?=.*collectivity).*martin|^(?=.*france).*martin(?!ique)|^(?=.*french).*martin(?!ique)\",SPM:\"miquelon\",VCT:\"vincent\",WSM:\"^(?!.*amer).*samoa\",SMR:\"san.?marino\",STP:\"\\\\bs(a|ã)o.?tom(e|é)\",SAU:\"\\\\bsa\\\\w*.?arabia\",SEN:\"senegal\",SRB:\"^(?!.*monte).*serbia\",SYC:\"seychell\",SLE:\"sierra\",SGP:\"singapore\",SXM:\"^(?!.*martin)(?!.*saba).*maarten\",SVK:\"^(?!.*cze).*slovak\",SVN:\"slovenia\",SLB:\"solomon\",SOM:\"somali\",ZAF:\"south.africa|s\\\\\\\\..?africa\",SGS:\"south.?georgia|sandwich\",SSD:\"\\\\bs\\\\w*.?sudan\",ESP:\"spain\",LKA:\"sri.?lanka|ceylon\",SDN:\"^(?!.*\\\\bs(?!u)).*sudan\",SUR:\"surinam|dutch.?guiana\",SJM:\"svalbard\",SWZ:\"swaziland\",SWE:\"sweden\",CHE:\"switz|swiss\",SYR:\"syria\",TWN:\"taiwan|taipei|formosa|^(?!.*peo)(?=.*rep).*china\",TJK:\"tajik\",THA:\"thailand|\\\\bsiam\",MKD:\"macedonia|fyrom\",TLS:\"^(?=.*leste).*timor|^(?=.*east).*timor\",TGO:\"togo\",TKL:\"tokelau\",TON:\"tonga\",TTO:\"trinidad|tobago\",TUN:\"tunisia\",TUR:\"turkey\",TKM:\"turkmen\",TCA:\"turks\",TUV:\"tuvalu\",UGA:\"uganda\",UKR:\"ukrain\",ARE:\"emirates|^u\\\\.?a\\\\.?e\\\\.?$|united.?arab.?em\",GBR:\"united.?kingdom|britain|^u\\\\.?k\\\\.?$\",TZA:\"tanzania\",USA:\"united.?states\\\\b(?!.*islands)|\\\\bu\\\\.?s\\\\.?a\\\\.?\\\\b|^\\\\s*u\\\\.?s\\\\.?\\\\b(?!.*islands)\",UMI:\"minor.?outlying.?is\",URY:\"uruguay\",UZB:\"uzbek\",VUT:\"vanuatu|new.?hebrides\",VEN:\"venezuela\",VNM:\"^(?!.*republic).*viet.?nam|^(?=.*socialist).*viet.?nam\",VGB:\"^(?=.*\\\\bu\\\\.?\\\\s?k).*virgin|^(?=.*brit).*virgin|^(?=.*kingdom).*virgin\",VIR:\"^(?=.*\\\\bu\\\\.?\\\\s?s).*virgin|^(?=.*states).*virgin\",WLF:\"futuna|wallis\",ESH:\"western.sahara\",YEM:\"^(?!.*arab)(?!.*north)(?!.*sana)(?!.*peo)(?!.*dem)(?!.*south)(?!.*aden)(?!.*\\\\bp\\\\.?d\\\\.?r).*yemen\",YMD:\"^(?=.*peo).*yemen|^(?!.*rep)(?=.*dem).*yemen|^(?=.*south).*yemen|^(?=.*aden).*yemen|^(?=.*\\\\bp\\\\.?d\\\\.?r).*yemen\",YUG:\"yugoslavia\",ZMB:\"zambia|northern.?rhodesia\",EAZ:\"zanzibar\",ZWE:\"zimbabwe|^(?!.*northern).*rhodesia\"}},42771:function(t,e,r){\"use strict\";t.exports={parse:r(46416),stringify:r(49395)}},8744:function(t,e,r){\"use strict\";var n=r(30584);t.exports={isSize:function(t){return/^[\\d\\.]/.test(t)||-1!==t.indexOf(\"/\")||-1!==n.indexOf(t)}}},46416:function(t,e,r){\"use strict\";var n=r(92384),i=r(68194),a=r(3748),o=r(2904),s=r(47916),l=r(7294),u=r(39956),c=r(8744).isSize;t.exports=h;var f=h.cache={};function h(t){if(\"string\"!=typeof t)throw new Error(\"Font argument must be a string.\");if(f[t])return f[t];if(\"\"===t)throw new Error(\"Cannot parse an empty string.\");if(-1!==a.indexOf(t))return f[t]={system:t};for(var e,r={style:\"normal\",variant:\"normal\",weight:\"normal\",stretch:\"normal\",lineHeight:\"normal\",size:\"1rem\",family:[\"serif\"]},h=u(t,/\\s+/);e=h.shift();){if(-1!==i.indexOf(e))return[\"style\",\"variant\",\"weight\",\"stretch\"].forEach((function(t){r[t]=e})),f[t]=r;if(-1===s.indexOf(e))if(\"normal\"!==e&&\"small-caps\"!==e)if(-1===l.indexOf(e)){if(-1===o.indexOf(e)){if(c(e)){var d=u(e,\"/\");if(r.size=d[0],null!=d[1]?r.lineHeight=p(d[1]):\"/\"===h[0]&&(h.shift(),r.lineHeight=p(h.shift())),!h.length)throw new Error(\"Missing required font-family.\");return r.family=u(h.join(\" \"),/\\s*,\\s*/).map(n),f[t]=r}throw new Error(\"Unknown or unsupported font token: \"+e)}r.weight=e}else r.stretch=e;else r.variant=e;else r.style=e}throw new Error(\"Missing required font-size.\")}function p(t){var e=parseFloat(t);return e.toString()===t?e:t}},49395:function(t,e,r){\"use strict\";var n=r(55616),i=r(8744).isSize,a=d(r(68194)),o=d(r(3748)),s=d(r(2904)),l=d(r(47916)),u=d(r(7294)),c={normal:1,\"small-caps\":1},f={serif:1,\"sans-serif\":1,monospace:1,cursive:1,fantasy:1,\"system-ui\":1},h=\"serif\";function p(t,e){if(t&&!e[t]&&!a[t])throw Error(\"Unknown keyword `\"+t+\"`\");return t}function d(t){for(var e={},r=0;re?1:t>=e?0:NaN}r.d(e,{XE:function(){return n},kv:function(){return s},mo:function(){return u},Uf:function(){return c},SY:function(){return f},ik:function(){return h},oh:function(){return p}}),1===(i=n).length&&(a=i,i=function(t,e){return n(a(t),e)});var i,a,o=Array.prototype;function s(t,e){var r,n,i=t.length,a=-1;if(null==e){for(;++a=r)for(n=r;++an&&(n=r)}else for(;++a=r)for(n=r;++an&&(n=r);return n}function l(t){return null===t?NaN:+t}function u(t,e){var r,n=t.length,i=n,a=-1,o=0;if(null==e)for(;++a=0;)for(e=(n=t[i]).length;--e>=0;)r[--o]=n[e];return r}function f(t,e){var r,n,i=t.length,a=-1;if(null==e){for(;++a=r)for(n=r;++ar&&(n=r)}else for(;++a=r)for(n=r;++ar&&(n=r);return n}function h(t,e,r){t=+t,e=+e,r=(i=arguments.length)<2?(e=t,t=0,1):i<3?1:+r;for(var n=-1,i=0|Math.max(0,Math.ceil((e-t)/r)),a=new Array(i);++n=n.length)return null!=t&&r.sort(t),null!=e?e(r):r;for(var u,c,f,h=-1,p=r.length,d=n[i++],v=o(),g=s();++hn.length)return t;var a,o=i[r-1];return null!=e&&r>=n.length?a=t.entries():(a=[],t.each((function(t,e){a.push({key:e,values:s(t,r)})}))),null!=o?a.sort((function(t,e){return o(t.key,e.key)})):a}return r={object:function(t){return a(t,0,l,u)},map:function(t){return a(t,0,c,f)},entries:function(t){return s(a(t,0,c,f),0)},key:function(t){return n.push(t),r},sortKeys:function(t){return i[n.length-1]=t,r},sortValues:function(e){return t=e,r},rollup:function(t){return e=t,r}}}function l(){return{}}function u(t,e,r){t[e]=r}function c(){return o()}function f(t,e,r){t.set(e,r)}function h(){}var p=o.prototype;h.prototype=function(t,e){var r=new h;if(t instanceof h)t.each((function(t){r.add(t)}));else if(t){var n=-1,i=t.length;if(null==e)for(;++n=(a=(v+y)/2))?v=a:y=a,(c=r>=(o=(g+m)/2))?g=o:m=o,i=p,!(p=p[f=c<<1|u]))return i[f]=d,t;if(s=+t._x.call(null,p.data),l=+t._y.call(null,p.data),e===s&&r===l)return d.next=p,i?i[f]=d:t._root=d,t;do{i=i?i[f]=new Array(4):t._root=new Array(4),(u=e>=(a=(v+y)/2))?v=a:y=a,(c=r>=(o=(g+m)/2))?g=o:m=o}while((f=c<<1|u)==(h=(l>=o)<<1|s>=a));return i[h]=p,i[f]=d,t}function s(t,e,r,n,i){this.node=t,this.x0=e,this.y0=r,this.x1=n,this.y1=i}function l(t){return t[0]}function u(t){return t[1]}function c(t,e,r){var n=new f(null==e?l:e,null==r?u:r,NaN,NaN,NaN,NaN);return null==t?n:n.addAll(t)}function f(t,e,r,n,i,a){this._x=t,this._y=e,this._x0=r,this._y0=n,this._x1=i,this._y1=a,this._root=void 0}function h(t){for(var e={data:t.data},r=e;t=t.next;)r=r.next={data:t.data};return e}r.r(e),r.d(e,{forceCenter:function(){return n},forceCollide:function(){return g},forceLink:function(){return b},forceManyBody:function(){return K},forceRadial:function(){return J},forceSimulation:function(){return Z},forceX:function(){return $},forceY:function(){return Q}});var p=c.prototype=f.prototype;function d(t){return t.x+t.vx}function v(t){return t.y+t.vy}function g(t){var e,r,n=1,o=1;function s(){for(var t,i,s,u,f,h,p,g=e.length,y=0;yu+d||if+d||os.index){var v=u-l.x-l.vx,g=f-l.y-l.vy,y=v*v+g*g;yt.r&&(t.r=t[e].r)}function u(){if(e){var n,i,a=e.length;for(r=new Array(a),n=0;nf&&(f=n),ih&&(h=i));if(u>f||c>h)return this;for(this.cover(u,c).cover(f,h),r=0;rt||t>=i||n>e||e>=a;)switch(s=(ep||(a=u.y0)>d||(o=u.x1)=m)<<1|t>=y)&&(u=v[v.length-1],v[v.length-1]=v[v.length-1-c],v[v.length-1-c]=u)}else{var x=t-+this._x.call(null,g.data),b=e-+this._y.call(null,g.data),_=x*x+b*b;if(_=(s=(d+g)/2))?d=s:g=s,(c=o>=(l=(v+y)/2))?v=l:y=l,e=p,!(p=p[f=c<<1|u]))return this;if(!p.length)break;(e[f+1&3]||e[f+2&3]||e[f+3&3])&&(r=e,h=f)}for(;p.data!==t;)if(n=p,!(p=p.next))return this;return(i=p.next)&&delete p.next,n?(i?n.next=i:delete n.next,this):e?(i?e[f]=i:delete e[f],(p=e[0]||e[1]||e[2]||e[3])&&p===(e[3]||e[2]||e[1]||e[0])&&!p.length&&(r?r[h]=p:this._root=p),this):(this._root=i,this)},p.removeAll=function(t){for(var e=0,r=t.length;e=0&&(e=t.slice(r+1),t=t.slice(0,r)),t&&!n.hasOwnProperty(t))throw new Error(\"unknown type: \"+t);return{type:t,name:e}}))),o=-1,s=a.length;if(!(arguments.length<2)){if(null!=e&&\"function\"!=typeof e)throw new Error(\"invalid callback: \"+e);for(;++o0)for(var r,n,i=new Array(r),a=0;a=0&&e._call.call(null,t),e=e._next;--L}()}finally{L=0,function(){for(var t,e,r=M,n=1/0;r;)r._call?(n>r._time&&(n=r._time),t=r,r=r._next):(e=r._next,r._next=null,r=t?t._next=e:M=e);S=t,H(n)}(),z=0}}function q(){var t=R.now(),e=t-I;e>O&&(D-=e,I=t)}function H(t){L||(C&&(C=clearTimeout(C)),t-z>24?(t<1/0&&(C=setTimeout(V,t-R.now()-D)),P&&(P=clearInterval(P))):(P||(I=R.now(),P=setInterval(q,O)),L=1,F(V)))}function G(t){return t.x}function W(t){return t.y}j.prototype=U.prototype={constructor:j,restart:function(t,e,r){if(\"function\"!=typeof t)throw new TypeError(\"callback is not a function\");r=(null==r?B():+r)+(null==e?0:+e),this._next||S===this||(S?S._next=this:M=this,S=this),this._call=t,this._time=r,H()},stop:function(){this._call&&(this._call=null,this._time=1/0,H())}};var Y=10,X=Math.PI*(3-Math.sqrt(5));function Z(t){var e,r=1,n=.001,i=1-Math.pow(n,1/300),a=0,o=.6,s=(0,y.kH)(),l=U(c),u=E(\"tick\",\"end\");function c(){f(),u.call(\"tick\",e),r1?(null==r?s.remove(t):s.set(t,p(r)),e):s.get(t)},find:function(e,r,n){var i,a,o,s,l,u=0,c=t.length;for(null==n?n=1/0:n*=n,u=0;u1?(u.on(t,r),e):u.on(t)}}}function K(){var t,e,r,n,o=i(-30),s=1,l=1/0,u=.81;function f(n){var i,a=t.length,o=c(t,G,W).visitAfter(p);for(r=n,i=0;i=l)){(t.data!==e||t.next)&&(0===f&&(d+=(f=a())*f),0===h&&(d+=(h=a())*h),d1?n[0]+n.slice(2):n,+t.slice(r+1)]}r.d(e,{E9:function(){return h},SO:function(){return v}});var i,a=/^(?:(.)?([<>=^]))?([+\\-( ])?([$#])?(0)?(\\d+)?(,)?(\\.\\d+)?(~)?([a-z%])?$/i;function o(t){if(!(e=a.exec(t)))throw new Error(\"invalid format: \"+t);var e;return new s({fill:e[1],align:e[2],sign:e[3],symbol:e[4],zero:e[5],width:e[6],comma:e[7],precision:e[8]&&e[8].slice(1),trim:e[9],type:e[10]})}function s(t){this.fill=void 0===t.fill?\" \":t.fill+\"\",this.align=void 0===t.align?\">\":t.align+\"\",this.sign=void 0===t.sign?\"-\":t.sign+\"\",this.symbol=void 0===t.symbol?\"\":t.symbol+\"\",this.zero=!!t.zero,this.width=void 0===t.width?void 0:+t.width,this.comma=!!t.comma,this.precision=void 0===t.precision?void 0:+t.precision,this.trim=!!t.trim,this.type=void 0===t.type?\"\":t.type+\"\"}function l(t,e){var r=n(t,e);if(!r)return t+\"\";var i=r[0],a=r[1];return a<0?\"0.\"+new Array(-a).join(\"0\")+i:i.length>a+1?i.slice(0,a+1)+\".\"+i.slice(a+1):i+new Array(a-i.length+2).join(\"0\")}o.prototype=s.prototype,s.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?\"0\":\"\")+(void 0===this.width?\"\":Math.max(1,0|this.width))+(this.comma?\",\":\"\")+(void 0===this.precision?\"\":\".\"+Math.max(0,0|this.precision))+(this.trim?\"~\":\"\")+this.type};var u={\"%\":function(t,e){return(100*t).toFixed(e)},b:function(t){return Math.round(t).toString(2)},c:function(t){return t+\"\"},d:function(t){return Math.abs(t=Math.round(t))>=1e21?t.toLocaleString(\"en\").replace(/,/g,\"\"):t.toString(10)},e:function(t,e){return t.toExponential(e)},f:function(t,e){return t.toFixed(e)},g:function(t,e){return t.toPrecision(e)},o:function(t){return Math.round(t).toString(8)},p:function(t,e){return l(100*t,e)},r:l,s:function(t,e){var r=n(t,e);if(!r)return t+\"\";var a=r[0],o=r[1],s=o-(i=3*Math.max(-8,Math.min(8,Math.floor(o/3))))+1,l=a.length;return s===l?a:s>l?a+new Array(s-l+1).join(\"0\"):s>0?a.slice(0,s)+\".\"+a.slice(s):\"0.\"+new Array(1-s).join(\"0\")+n(t,Math.max(0,e+s-1))[0]},X:function(t){return Math.round(t).toString(16).toUpperCase()},x:function(t){return Math.round(t).toString(16)}};function c(t){return t}var f,h,p=Array.prototype.map,d=[\"y\",\"z\",\"a\",\"f\",\"p\",\"n\",\"µ\",\"m\",\"\",\"k\",\"M\",\"G\",\"T\",\"P\",\"E\",\"Z\",\"Y\"];function v(t){var e,r,a=void 0===t.grouping||void 0===t.thousands?c:(e=p.call(t.grouping,Number),r=t.thousands+\"\",function(t,n){for(var i=t.length,a=[],o=0,s=e[0],l=0;i>0&&s>0&&(l+s+1>n&&(s=Math.max(1,n-l)),a.push(t.substring(i-=s,i+s)),!((l+=s+1)>n));)s=e[o=(o+1)%e.length];return a.reverse().join(r)}),s=void 0===t.currency?\"\":t.currency[0]+\"\",l=void 0===t.currency?\"\":t.currency[1]+\"\",f=void 0===t.decimal?\".\":t.decimal+\"\",h=void 0===t.numerals?c:function(t){return function(e){return e.replace(/[0-9]/g,(function(e){return t[+e]}))}}(p.call(t.numerals,String)),v=void 0===t.percent?\"%\":t.percent+\"\",g=void 0===t.minus?\"-\":t.minus+\"\",y=void 0===t.nan?\"NaN\":t.nan+\"\";function m(t){var e=(t=o(t)).fill,r=t.align,n=t.sign,c=t.symbol,p=t.zero,m=t.width,x=t.comma,b=t.precision,_=t.trim,w=t.type;\"n\"===w?(x=!0,w=\"g\"):u[w]||(void 0===b&&(b=12),_=!0,w=\"g\"),(p||\"0\"===e&&\"=\"===r)&&(p=!0,e=\"0\",r=\"=\");var T=\"$\"===c?s:\"#\"===c&&/[boxX]/.test(w)?\"0\"+w.toLowerCase():\"\",k=\"$\"===c?l:/[%p]/.test(w)?v:\"\",A=u[w],M=/[defgprs%]/.test(w);function S(t){var o,s,l,u=T,c=k;if(\"c\"===w)c=A(t)+c,t=\"\";else{var v=(t=+t)<0||1/t<0;if(t=isNaN(t)?y:A(Math.abs(t),b),_&&(t=function(t){t:for(var e,r=t.length,n=1,i=-1;n0&&(i=0)}return i>0?t.slice(0,i)+t.slice(e+1):t}(t)),v&&0==+t&&\"+\"!==n&&(v=!1),u=(v?\"(\"===n?n:g:\"-\"===n||\"(\"===n?\"\":n)+u,c=(\"s\"===w?d[8+i/3]:\"\")+c+(v&&\"(\"===n?\")\":\"\"),M)for(o=-1,s=t.length;++o(l=t.charCodeAt(o))||l>57){c=(46===l?f+t.slice(o+1):t.slice(o))+c,t=t.slice(0,o);break}}x&&!p&&(t=a(t,1/0));var S=u.length+t.length+c.length,E=S>1)+u+t+c+E.slice(S);break;default:t=E+u+t+c}return h(t)}return b=void 0===b?6:/[gprs]/.test(w)?Math.max(1,Math.min(21,b)):Math.max(0,Math.min(20,b)),S.toString=function(){return t+\"\"},S}return{format:m,formatPrefix:function(t,e){var r,i=m(((t=o(t)).type=\"f\",t)),a=3*Math.max(-8,Math.min(8,Math.floor((r=e,((r=n(Math.abs(r)))?r[1]:NaN)/3)))),s=Math.pow(10,-a),l=d[8+a/3];return function(t){return i(s*t)+l}}}}f=v({decimal:\".\",thousands:\",\",grouping:[3],currency:[\"$\",\"\"],minus:\"-\"}),h=f.format,f.formatPrefix},87108:function(t,e,r){\"use strict\";r.r(e),r.d(e,{geoAiry:function(){return D},geoAiryRaw:function(){return z},geoAitoff:function(){return F},geoAitoffRaw:function(){return R},geoArmadillo:function(){return N},geoArmadilloRaw:function(){return B},geoAugust:function(){return U},geoAugustRaw:function(){return j},geoBaker:function(){return G},geoBakerRaw:function(){return H},geoBerghaus:function(){return X},geoBerghausRaw:function(){return Y},geoBertin1953:function(){return rt},geoBertin1953Raw:function(){return et},geoBoggs:function(){return ct},geoBoggsRaw:function(){return ut},geoBonne:function(){return vt},geoBonneRaw:function(){return dt},geoBottomley:function(){return yt},geoBottomleyRaw:function(){return gt},geoBromley:function(){return xt},geoBromleyRaw:function(){return mt},geoChamberlin:function(){return Et},geoChamberlinAfrica:function(){return St},geoChamberlinRaw:function(){return At},geoCollignon:function(){return Ct},geoCollignonRaw:function(){return Lt},geoCraig:function(){return Ot},geoCraigRaw:function(){return Pt},geoCraster:function(){return Dt},geoCrasterRaw:function(){return zt},geoCylindricalEqualArea:function(){return Ft},geoCylindricalEqualAreaRaw:function(){return Rt},geoCylindricalStereographic:function(){return Nt},geoCylindricalStereographicRaw:function(){return Bt},geoEckert1:function(){return Ut},geoEckert1Raw:function(){return jt},geoEckert2:function(){return qt},geoEckert2Raw:function(){return Vt},geoEckert3:function(){return Gt},geoEckert3Raw:function(){return Ht},geoEckert4:function(){return Yt},geoEckert4Raw:function(){return Wt},geoEckert5:function(){return Zt},geoEckert5Raw:function(){return Xt},geoEckert6:function(){return Jt},geoEckert6Raw:function(){return Kt},geoEisenlohr:function(){return te},geoEisenlohrRaw:function(){return Qt},geoFahey:function(){return ne},geoFaheyRaw:function(){return re},geoFoucaut:function(){return ae},geoFoucautRaw:function(){return ie},geoFoucautSinusoidal:function(){return se},geoFoucautSinusoidalRaw:function(){return oe},geoGilbert:function(){return he},geoGingery:function(){return ge},geoGingeryRaw:function(){return pe},geoGinzburg4:function(){return xe},geoGinzburg4Raw:function(){return me},geoGinzburg5:function(){return _e},geoGinzburg5Raw:function(){return be},geoGinzburg6:function(){return Te},geoGinzburg6Raw:function(){return we},geoGinzburg8:function(){return Ae},geoGinzburg8Raw:function(){return ke},geoGinzburg9:function(){return Se},geoGinzburg9Raw:function(){return Me},geoGringorten:function(){return Ce},geoGringortenQuincuncial:function(){return ii},geoGringortenRaw:function(){return Le},geoGuyou:function(){return ze},geoGuyouRaw:function(){return Ie},geoHammer:function(){return $},geoHammerRaw:function(){return K},geoHammerRetroazimuthal:function(){return Be},geoHammerRetroazimuthalRaw:function(){return Re},geoHealpix:function(){return Ye},geoHealpixRaw:function(){return qe},geoHill:function(){return Ze},geoHillRaw:function(){return Xe},geoHomolosine:function(){return er},geoHomolosineRaw:function(){return tr},geoHufnagel:function(){return nr},geoHufnagelRaw:function(){return rr},geoHyperelliptical:function(){return sr},geoHyperellipticalRaw:function(){return or},geoInterrupt:function(){return cr},geoInterruptedBoggs:function(){return hr},geoInterruptedHomolosine:function(){return dr},geoInterruptedMollweide:function(){return gr},geoInterruptedMollweideHemispheres:function(){return mr},geoInterruptedQuarticAuthalic:function(){return fn},geoInterruptedSinuMollweide:function(){return br},geoInterruptedSinusoidal:function(){return wr},geoKavrayskiy7:function(){return kr},geoKavrayskiy7Raw:function(){return Tr},geoLagrange:function(){return Mr},geoLagrangeRaw:function(){return Ar},geoLarrivee:function(){return Lr},geoLarriveeRaw:function(){return Er},geoLaskowski:function(){return Pr},geoLaskowskiRaw:function(){return Cr},geoLittrow:function(){return Ir},geoLittrowRaw:function(){return Or},geoLoximuthal:function(){return Dr},geoLoximuthalRaw:function(){return zr},geoMiller:function(){return Fr},geoMillerRaw:function(){return Rr},geoModifiedStereographic:function(){return Zr},geoModifiedStereographicAlaska:function(){return Hr},geoModifiedStereographicGs48:function(){return Gr},geoModifiedStereographicGs50:function(){return Wr},geoModifiedStereographicLee:function(){return Xr},geoModifiedStereographicMiller:function(){return Yr},geoModifiedStereographicRaw:function(){return Br},geoMollweide:function(){return ot},geoMollweideRaw:function(){return at},geoMtFlatPolarParabolic:function(){return Qr},geoMtFlatPolarParabolicRaw:function(){return $r},geoMtFlatPolarQuartic:function(){return en},geoMtFlatPolarQuarticRaw:function(){return tn},geoMtFlatPolarSinusoidal:function(){return nn},geoMtFlatPolarSinusoidalRaw:function(){return rn},geoNaturalEarth:function(){return an.c},geoNaturalEarth2:function(){return sn},geoNaturalEarth2Raw:function(){return on},geoNaturalEarthRaw:function(){return an.g},geoNellHammer:function(){return un},geoNellHammerRaw:function(){return ln},geoNicolosi:function(){return pn},geoNicolosiRaw:function(){return hn},geoPatterson:function(){return kn},geoPattersonRaw:function(){return Tn},geoPeirceQuincuncial:function(){return ai},geoPierceQuincuncial:function(){return ai},geoPolyconic:function(){return Mn},geoPolyconicRaw:function(){return An},geoPolyhedral:function(){return On},geoPolyhedralButterfly:function(){return Nn},geoPolyhedralCollignon:function(){return Vn},geoPolyhedralWaterman:function(){return qn},geoProject:function(){return Xn},geoQuantize:function(){return oi},geoQuincuncial:function(){return ni},geoRectangularPolyconic:function(){return li},geoRectangularPolyconicRaw:function(){return si},geoRobinson:function(){return fi},geoRobinsonRaw:function(){return ci},geoSatellite:function(){return pi},geoSatelliteRaw:function(){return hi},geoSinuMollweide:function(){return Qe},geoSinuMollweideRaw:function(){return $e},geoSinusoidal:function(){return pt},geoSinusoidalRaw:function(){return ht},geoStitch:function(){return Oi},geoTimes:function(){return zi},geoTimesRaw:function(){return Ii},geoTwoPointAzimuthal:function(){return Bi},geoTwoPointAzimuthalRaw:function(){return Ri},geoTwoPointAzimuthalUsa:function(){return Fi},geoTwoPointEquidistant:function(){return Ui},geoTwoPointEquidistantRaw:function(){return Ni},geoTwoPointEquidistantUsa:function(){return ji},geoVanDerGrinten:function(){return qi},geoVanDerGrinten2:function(){return Gi},geoVanDerGrinten2Raw:function(){return Hi},geoVanDerGrinten3:function(){return Yi},geoVanDerGrinten3Raw:function(){return Wi},geoVanDerGrinten4:function(){return Zi},geoVanDerGrinten4Raw:function(){return Xi},geoVanDerGrintenRaw:function(){return Vi},geoWagner:function(){return Ji},geoWagner4:function(){return ra},geoWagner4Raw:function(){return ea},geoWagner6:function(){return ia},geoWagner6Raw:function(){return na},geoWagner7:function(){return $i},geoWagnerRaw:function(){return Ki},geoWiechel:function(){return oa},geoWiechelRaw:function(){return aa},geoWinkel3:function(){return la},geoWinkel3Raw:function(){return sa}});var n=r(87952),i=Math.abs,a=Math.atan,o=Math.atan2,s=(Math.ceil,Math.cos),l=Math.exp,u=Math.floor,c=Math.log,f=Math.max,h=Math.min,p=Math.pow,d=Math.round,v=Math.sign||function(t){return t>0?1:t<0?-1:0},g=Math.sin,y=Math.tan,m=1e-6,x=1e-12,b=Math.PI,_=b/2,w=b/4,T=Math.SQRT1_2,k=P(2),A=P(b),M=2*b,S=180/b,E=b/180;function L(t){return t>1?_:t<-1?-_:Math.asin(t)}function C(t){return t>1?0:t<-1?b:Math.acos(t)}function P(t){return t>0?Math.sqrt(t):0}function O(t){return(l(t)-l(-t))/2}function I(t){return(l(t)+l(-t))/2}function z(t){var e=y(t/2),r=2*c(s(t/2))/(e*e);function n(t,e){var n=s(t),i=s(e),a=g(e),o=i*n,l=-((1-o?c((1+o)/2)/(1-o):-.5)+r/(1+o));return[l*i*g(t),l*a]}return n.invert=function(e,n){var a,l=P(e*e+n*n),u=-t/2,f=50;if(!l)return[0,0];do{var h=u/2,p=s(h),d=g(h),v=d/p,y=-c(i(p));u-=a=(2/v*y-r*v-l)/(-y/(d*d)+1-r/(2*p*p))*(p<0?.7:1)}while(i(a)>m&&--f>0);var x=g(u);return[o(e*x,l*s(u)),L(n*x/l)]},n}function D(){var t=_,e=(0,n.U)(z),r=e(t);return r.radius=function(r){return arguments.length?e(t=r*E):t*S},r.scale(179.976).clipAngle(147)}function R(t,e){var r=s(e),n=function(t){return t?t/Math.sin(t):1}(C(r*s(t/=2)));return[2*r*g(t)*n,g(e)*n]}function F(){return(0,n.c)(R).scale(152.63)}function B(t){var e=g(t),r=s(t),n=t>=0?1:-1,a=y(n*t),l=(1+e-r)/2;function u(t,i){var u=s(i),c=s(t/=2);return[(1+u)*g(t),(n*i>-o(c,a)-.001?0:10*-n)+l+g(i)*r-(1+u)*e*c]}return u.invert=function(t,u){var c=0,f=0,h=50;do{var p=s(c),d=g(c),v=s(f),y=g(f),x=1+v,b=x*d-t,_=l+y*r-x*e*p-u,w=x*p/2,T=-d*y,k=e*x*d/2,A=r*v+e*p*y,M=T*k-A*w,S=(_*T-b*A)/M/2,E=(b*k-_*w)/M;i(E)>2&&(E/=2),c-=S,f-=E}while((i(S)>m||i(E)>m)&&--h>0);return n*f>-o(s(c),a)-.001?[2*c,f]:null},u}function N(){var t=20*E,e=t>=0?1:-1,r=y(e*t),i=(0,n.U)(B),a=i(t),l=a.stream;return a.parallel=function(n){return arguments.length?(r=y((e=(t=n*E)>=0?1:-1)*t),i(t)):t*S},a.stream=function(n){var i=a.rotate(),u=l(n),c=(a.rotate([0,0]),l(n)),f=a.precision();return a.rotate(i),u.sphere=function(){c.polygonStart(),c.lineStart();for(var n=-180*e;e*n<180;n+=90*e)c.point(n,90*e);if(t)for(;e*(n-=3*e*f)>=-180;)c.point(n,e*-o(s(n*E/2),r)*S);c.lineEnd(),c.polygonEnd()},u},a.scale(218.695).center([0,28.0974])}function j(t,e){var r=y(e/2),n=P(1-r*r),i=1+n*s(t/=2),a=g(t)*n/i,o=r/i,l=a*a,u=o*o;return[4/3*a*(3+l-3*u),4/3*o*(3+3*l-u)]}function U(){return(0,n.c)(j).scale(66.1603)}R.invert=function(t,e){if(!(t*t+4*e*e>b*b+m)){var r=t,n=e,a=25;do{var o,l=g(r),u=g(r/2),c=s(r/2),f=g(n),h=s(n),p=g(2*n),d=f*f,v=h*h,y=u*u,x=1-v*c*c,_=x?C(h*c)*P(o=1/x):o=0,w=2*_*h*u-t,T=_*f-e,k=o*(v*y+_*h*c*d),A=o*(.5*l*p-2*_*f*u),M=.25*o*(p*u-_*f*v*l),S=o*(d*c+_*y*h),E=A*M-S*k;if(!E)break;var L=(T*A-w*S)/E,O=(w*M-T*k)/E;r-=L,n-=O}while((i(L)>m||i(O)>m)&&--a>0);return[r,n]}},j.invert=function(t,e){if(e*=3/8,!(t*=3/8)&&i(e)>1)return null;var r=1+t*t+e*e,n=P((r-P(r*r-4*e*e))/2),a=L(n)/3,l=n?function(t){return c(t+P(t*t-1))}(i(e/n))/3:function(t){return c(t+P(t*t+1))}(i(t))/3,u=s(a),f=I(l),h=f*f-u*u;return[2*v(t)*o(O(l)*u,.25-h),2*v(e)*o(f*g(a),.25+h)]};var V=P(8),q=c(1+k);function H(t,e){var r=i(e);return rx&&--u>0);return[t/(s(o)*(V-1/g(o))),v(e)*o]};var W=r(69020);function Y(t){var e=2*b/t;function r(t,r){var n=(0,W.O)(t,r);if(i(t)>_){var a=o(n[1],n[0]),l=P(n[0]*n[0]+n[1]*n[1]),u=e*d((a-_)/e)+_,c=o(g(a-=u),2-s(a));a=u+L(b/l*g(c))-c,n[0]=l*s(a),n[1]=l*g(a)}return n}return r.invert=function(t,r){var n=P(t*t+r*r);if(n>_){var i=o(r,t),l=e*d((i-_)/e)+_,u=i>l?-1:1,c=n*s(l-i),f=1/y(u*C((c-b)/P(b*(b-2*c)+n*n)));i=l+2*a((f+u*P(f*f-3))/3),t=n*s(i),r=n*g(i)}return W.O.invert(t,r)},r}function X(){var t=5,e=(0,n.U)(Y),r=e(t),i=r.stream,a=.01,l=-s(a*E),u=g(a*E);return r.lobes=function(r){return arguments.length?e(t=+r):t},r.stream=function(e){var n=r.rotate(),c=i(e),f=(r.rotate([0,0]),i(e));return r.rotate(n),c.sphere=function(){f.polygonStart(),f.lineStart();for(var e=0,r=360/t,n=2*b/t,i=90-180/t,c=_;e0&&i(n)>m);return s<0?NaN:r}function tt(t,e,r){return void 0===e&&(e=40),void 0===r&&(r=x),function(n,a,o,s){var l,u,c;o=void 0===o?0:+o,s=void 0===s?0:+s;for(var f=0;fl)o-=u/=2,s-=c/=2;else{l=v;var g=(o>0?-1:1)*r,y=(s>0?-1:1)*r,m=t(o+g,s),x=t(o,s+y),b=(m[0]-h[0])/g,_=(m[1]-h[1])/g,w=(x[0]-h[0])/y,T=(x[1]-h[1])/y,k=T*b-_*w,A=(i(k)<.5?.5:1)/k;if(o+=u=(d*w-p*T)*A,s+=c=(p*_-d*b)*A,i(u)0&&(i[1]*=1+a/1.5*i[0]*i[0]),i}return e.invert=tt(e),e}function rt(){return(0,n.c)(et()).rotate([-16.5,-42]).scale(176.57).center([7.93,.09])}function nt(t,e){var r,n=t*g(e),a=30;do{e-=r=(e+g(e)-n)/(1+s(e))}while(i(r)>m&&--a>0);return e/2}function it(t,e,r){function n(n,i){return[t*n*s(i=nt(r,i)),e*g(i)]}return n.invert=function(n,i){return i=L(i/e),[n/(t*s(i)),L((2*i+g(2*i))/r)]},n}J.invert=function(t,e){var r=2*L(e/2);return[t*s(r/2)/s(r),r]};var at=it(k/_,k,b);function ot(){return(0,n.c)(at).scale(169.529)}var st=2.00276,lt=1.11072;function ut(t,e){var r=nt(b,e);return[st*t/(1/s(e)+lt/s(r)),(e+k*g(r))/st]}function ct(){return(0,n.c)(ut).scale(160.857)}function ft(t){var e=0,r=(0,n.U)(t),i=r(e);return i.parallel=function(t){return arguments.length?r(e=t*E):e*S},i}function ht(t,e){return[t*s(e),e]}function pt(){return(0,n.c)(ht).scale(152.63)}function dt(t){if(!t)return ht;var e=1/y(t);function r(r,n){var i=e+t-n,a=i?r*s(n)/i:i;return[i*g(a),e-i*s(a)]}return r.invert=function(r,n){var i=P(r*r+(n=e-n)*n),a=e+t-i;return[i/s(a)*o(r,n),a]},r}function vt(){return ft(dt).scale(123.082).center([0,26.1441]).parallel(45)}function gt(t){function e(e,r){var n=_-r,i=n?e*t*g(n)/n:n;return[n*g(i)/t,_-n*s(i)]}return e.invert=function(e,r){var n=e*t,i=_-r,a=P(n*n+i*i),s=o(n,i);return[(a?a/g(a):1)*s/t,_-a]},e}function yt(){var t=.5,e=(0,n.U)(gt),r=e(t);return r.fraction=function(r){return arguments.length?e(t=+r):t},r.scale(158.837)}ut.invert=function(t,e){var r,n,a=st*e,o=e<0?-w:w,l=25;do{n=a-k*g(o),o-=r=(g(2*o)+2*o-b*g(n))/(2*s(2*o)+2+b*s(n)*k*s(o))}while(i(r)>m&&--l>0);return n=a-k*g(o),[t*(1/s(n)+lt/s(o))/st,n]},ht.invert=function(t,e){return[t/s(e),e]};var mt=it(1,4/b,b);function xt(){return(0,n.c)(mt).scale(152.63)}var bt=r(24052),_t=r(92992);function wt(t,e,r,n,a,l){var u,c=s(l);if(i(t)>1||i(l)>1)u=C(r*a+e*n*c);else{var f=g(t/2),h=g(l/2);u=2*L(P(f*f+e*n*h*h))}return i(u)>m?[u,o(n*g(l),e*a-r*n*c)]:[0,0]}function Tt(t,e,r){return C((t*t+e*e-r*r)/(2*t*e))}function kt(t){return t-2*b*u((t+b)/(2*b))}function At(t,e,r){for(var n,i=[[t[0],t[1],g(t[1]),s(t[1])],[e[0],e[1],g(e[1]),s(e[1])],[r[0],r[1],g(r[1]),s(r[1])]],a=i[2],o=0;o<3;++o,a=n)n=i[o],a.v=wt(n[1]-a[1],a[3],a[2],n[3],n[2],n[0]-a[0]),a.point=[0,0];var l=Tt(i[0].v[0],i[2].v[0],i[1].v[0]),u=Tt(i[0].v[0],i[1].v[0],i[2].v[0]),c=b-l;i[2].point[1]=0,i[0].point[0]=-(i[1].point[0]=i[0].v[0]/2);var f=[i[2].point[0]=i[0].point[0]+i[2].v[0]*s(l),2*(i[0].point[1]=i[1].point[1]=i[2].v[0]*g(l))];return function(t,e){var r,n=g(e),a=s(e),o=new Array(3);for(r=0;r<3;++r){var l=i[r];if(o[r]=wt(e-l[1],l[3],l[2],a,n,t-l[0]),!o[r][0])return l.point;o[r][1]=kt(o[r][1]-l.v[1])}var h=f.slice();for(r=0;r<3;++r){var p=2==r?0:r+1,d=Tt(i[r].v[0],o[r][0],o[p][0]);o[r][1]<0&&(d=-d),r?1==r?(d=u-d,h[0]-=o[r][0]*s(d),h[1]-=o[r][0]*g(d)):(d=c-d,h[0]+=o[r][0]*s(d),h[1]+=o[r][0]*g(d)):(h[0]+=o[r][0]*s(d),h[1]-=o[r][0]*g(d))}return h[0]/=3,h[1]/=3,h}}function Mt(t){return t[0]*=E,t[1]*=E,t}function St(){return Et([0,22],[45,22],[22.5,-22]).scale(380).center([22.5,2])}function Et(t,e,r){var i=(0,bt.c)({type:\"MultiPoint\",coordinates:[t,e,r]}),a=[-i[0],-i[1]],o=(0,_t.c)(a),s=At(Mt(o(t)),Mt(o(e)),Mt(o(r)));s.invert=tt(s);var l=(0,n.c)(s).rotate(a),u=l.center;return delete l.rotate,l.center=function(t){return arguments.length?u(o(t)):o.invert(u())},l.clipAngle(90)}function Lt(t,e){var r=P(1-g(e));return[2/A*t*r,A*(1-r)]}function Ct(){return(0,n.c)(Lt).scale(95.6464).center([0,30])}function Pt(t){var e=y(t);function r(t,r){return[t,(t?t/g(t):1)*(g(r)*s(t)-e*s(r))]}return r.invert=e?function(t,r){t&&(r*=g(t)/t);var n=s(t);return[t,2*o(P(n*n+e*e-r*r)-n,e-r)]}:function(t,e){return[t,L(t?e*y(t)/t:e)]},r}function Ot(){return ft(Pt).scale(249.828).clipAngle(90)}Lt.invert=function(t,e){var r=(r=e/A-1)*r;return[r>0?t*P(b/r)/2:0,L(1-r)]};var It=P(3);function zt(t,e){return[It*t*(2*s(2*e/3)-1)/A,It*A*g(e/3)]}function Dt(){return(0,n.c)(zt).scale(156.19)}function Rt(t){var e=s(t);function r(t,r){return[t*e,g(r)/e]}return r.invert=function(t,r){return[t/e,L(r*e)]},r}function Ft(){return ft(Rt).parallel(38.58).scale(195.044)}function Bt(t){var e=s(t);function r(t,r){return[t*e,(1+e)*y(r/2)]}return r.invert=function(t,r){return[t/e,2*a(r/(1+e))]},r}function Nt(){return ft(Bt).scale(124.75)}function jt(t,e){var r=P(8/(3*b));return[r*t*(1-i(e)/b),r*e]}function Ut(){return(0,n.c)(jt).scale(165.664)}function Vt(t,e){var r=P(4-3*g(i(e)));return[2/P(6*b)*t*r,v(e)*P(2*b/3)*(2-r)]}function qt(){return(0,n.c)(Vt).scale(165.664)}function Ht(t,e){var r=P(b*(4+b));return[2/r*t*(1+P(1-4*e*e/(b*b))),4/r*e]}function Gt(){return(0,n.c)(Ht).scale(180.739)}function Wt(t,e){var r=(2+_)*g(e);e/=2;for(var n=0,a=1/0;n<10&&i(a)>m;n++){var o=s(e);e-=a=(e+g(e)*(o+2)-r)/(2*o*(1+o))}return[2/P(b*(4+b))*t*(1+s(e)),2*P(b/(4+b))*g(e)]}function Yt(){return(0,n.c)(Wt).scale(180.739)}function Xt(t,e){return[t*(1+s(e))/P(2+b),2*e/P(2+b)]}function Zt(){return(0,n.c)(Xt).scale(173.044)}function Kt(t,e){for(var r=(1+_)*g(e),n=0,a=1/0;n<10&&i(a)>m;n++)e-=a=(e+g(e)-r)/(1+s(e));return r=P(2+b),[t*(1+s(e))/r,2*e/r]}function Jt(){return(0,n.c)(Kt).scale(173.044)}zt.invert=function(t,e){var r=3*L(e/(It*A));return[A*t/(It*(2*s(2*r/3)-1)),r]},jt.invert=function(t,e){var r=P(8/(3*b)),n=e/r;return[t/(r*(1-i(n)/b)),n]},Vt.invert=function(t,e){var r=2-i(e)/P(2*b/3);return[t*P(6*b)/(2*r),v(e)*L((4-r*r)/3)]},Ht.invert=function(t,e){var r=P(b*(4+b))/2;return[t*r/(1+P(1-e*e*(4+b)/(4*b))),e*r/2]},Wt.invert=function(t,e){var r=e*P((4+b)/b)/2,n=L(r),i=s(n);return[t/(2/P(b*(4+b))*(1+i)),L((n+r*(i+2))/(2+_))]},Xt.invert=function(t,e){var r=P(2+b),n=e*r/2;return[r*t/(1+s(n)),n]},Kt.invert=function(t,e){var r=1+_,n=P(r/2);return[2*t*n/(1+s(e*=n)),L((e+g(e))/r)]};var $t=3+2*k;function Qt(t,e){var r=g(t/=2),n=s(t),i=P(s(e)),o=s(e/=2),l=g(e)/(o+k*n*i),u=P(2/(1+l*l)),f=P((k*o+(n+r)*i)/(k*o+(n-r)*i));return[$t*(u*(f-1/f)-2*c(f)),$t*(u*l*(f+1/f)-2*a(l))]}function te(){return(0,n.c)(Qt).scale(62.5271)}Qt.invert=function(t,e){if(!(r=j.invert(t/1.2,1.065*e)))return null;var r,n=r[0],o=r[1],l=20;t/=$t,e/=$t;do{var u=n/2,p=o/2,d=g(u),v=s(u),y=g(p),x=s(p),b=s(o),w=P(b),A=y/(x+k*v*w),M=A*A,S=P(2/(1+M)),E=(k*x+(v+d)*w)/(k*x+(v-d)*w),L=P(E),C=L-1/L,O=L+1/L,I=S*C-2*c(L)-t,z=S*A*O-2*a(A)-e,D=y&&T*w*d*M/y,R=(k*v*x+w)/(2*(x+k*v*w)*(x+k*v*w)*w),F=-.5*A*S*S*S,B=F*D,N=F*R,U=(U=2*x+k*w*(v-d))*U*L,V=(k*v*x*w+b)/U,q=-k*d*y/(w*U),H=C*B-2*V/L+S*(V+V/E),G=C*N-2*q/L+S*(q+q/E),W=A*O*B-2*D/(1+M)+S*O*D+S*A*(V-V/E),Y=A*O*N-2*R/(1+M)+S*O*R+S*A*(q-q/E),X=G*W-Y*H;if(!X)break;var Z=(z*G-I*Y)/X,K=(I*W-z*H)/X;n-=Z,o=f(-_,h(_,o-K))}while((i(Z)>m||i(K)>m)&&--l>0);return i(i(o)-_)n){var h=P(f),p=o(c,u),v=r*d(p/r),y=p-v,x=t*s(y),w=(t*g(y)-y*g(x))/(_-x),T=de(y,w),k=(b-t)/ve(T,x,b);u=h;var A,M=50;do{u-=A=(t+ve(T,x,u)*k-h)/(T(u)*k)}while(i(A)>m&&--M>0);c=y*g(u),u<_&&(c-=w*(u-_));var S=g(v),E=s(v);l[0]=u*E-c*S,l[1]=u*S+c*E}return l}return a.invert=function(e,a){var l=e*e+a*a;if(l>n){var u=P(l),c=o(a,e),f=r*d(c/r),h=c-f;e=u*s(h),a=u*g(h);for(var p=e-_,v=g(e),y=a/v,m=e<_?1/0:0,w=10;;){var T=t*g(y),k=t*s(y),A=g(k),M=_-k,S=(T-y*A)/M,E=de(y,S);if(i(m)m||i(p)>m)&&--y>0);return[d,v]},c}var me=ye(2.8284,-1.6988,.75432,-.18071,1.76003,-.38914,.042555);function xe(){return(0,n.c)(me).scale(149.995)}var be=ye(2.583819,-.835827,.170354,-.038094,1.543313,-.411435,.082742);function _e(){return(0,n.c)(be).scale(153.93)}var we=ye(5/6*b,-.62636,-.0344,0,1.3493,-.05524,0,.045);function Te(){return(0,n.c)(we).scale(130.945)}function ke(t,e){var r=t*t,n=e*e;return[t*(1-.162388*n)*(.87-952426e-9*r*r),e*(1+n/12)]}function Ae(){return(0,n.c)(ke).scale(131.747)}ke.invert=function(t,e){var r,n=t,a=e,o=50;do{var s=a*a;a-=r=(a*(1+s/12)-e)/(1+s/4)}while(i(r)>m&&--o>0);o=50,t/=1-.162388*s;do{var l=(l=n*n)*l;n-=r=(n*(.87-952426e-9*l)-t)/(.87-.00476213*l)}while(i(r)>m&&--o>0);return[n,a]};var Me=ye(2.6516,-.76534,.19123,-.047094,1.36289,-.13965,.031762);function Se(){return(0,n.c)(Me).scale(131.087)}function Ee(t){var e=t(_,0)[0]-t(-_,0)[0];function r(r,n){var i=r>0?-.5:.5,a=t(r+i*b,n);return a[0]-=i*e,a}return t.invert&&(r.invert=function(r,n){var i=r>0?-.5:.5,a=t.invert(r+i*e,n),o=a[0]-i*b;return o<-b?o+=2*b:o>b&&(o-=2*b),a[0]=o,a}),r}function Le(t,e){var r=v(t),n=v(e),a=s(e),l=s(t)*a,u=g(t)*a,c=g(n*e);t=i(o(u,c)),e=L(l),i(t-_)>m&&(t%=_);var f=function(t,e){if(e===_)return[0,0];var r,n,a=g(e),o=a*a,l=o*o,u=1+l,c=1+3*l,f=1-l,h=L(1/P(u)),p=f+o*u*h,d=(1-a)/p,v=P(d),y=d*u,x=P(y),w=v*f;if(0===t)return[0,-(w+o*x)];var T,k=s(e),A=1/k,M=2*a*k,S=(-p*k-(1-a)*((-3*o+h*c)*M))/(p*p),E=-A*M,C=-A*(o*u*S+d*c*M),O=-2*A*(f*(.5*S/v)-2*o*v*M),I=4*t/b;if(t>.222*b||e.175*b){if(r=(w+o*P(y*(1+l)-w*w))/(1+l),t>b/4)return[r,r];var z=r,D=.5*r;r=.5*(D+z),n=50;do{var R=r*(O+E*P(y-r*r))+C*L(r/x)-I;if(!R)break;R<0?D=r:z=r,r=.5*(D+z)}while(i(z-D)>m&&--n>0)}else{r=m,n=25;do{var F=r*r,B=P(y-F),N=O+E*B,j=r*N+C*L(r/x)-I;r-=T=B?j/(N+(C-E*F)/B):0}while(i(T)>m&&--n>0)}return[r,-w-o*P(y-r*r)]}(t>b/4?_-t:t,e);return t>b/4&&(c=f[0],f[0]=-f[1],f[1]=-c),f[0]*=r,f[1]*=-n,f}function Ce(){return(0,n.c)(Ee(Le)).scale(239.75)}function Pe(t,e){var r,n,o,u,c,f;if(e=1-m)return r=(1-e)/4,o=1/(n=I(t)),[(u=((f=l(2*(f=t)))-1)/(f+1))+r*((c=n*O(t))-t)/(n*n),o-r*u*o*(c-t),o+r*u*o*(c+t),2*a(l(t))-_+r*(c-t)/n];var h=[1,0,0,0,0,0,0,0,0],p=[P(e),0,0,0,0,0,0,0,0],d=0;for(n=P(1-e),c=1;i(p[d]/h[d])>m&&d<8;)r=h[d++],p[d]=(r-n)/2,h[d]=(r+n)/2,n=P(r*n),c*=2;o=c*h[d]*t;do{o=(L(u=p[d]*g(n=o)/h[d])+o)/2}while(--d);return[g(o),u=s(o),u/s(o-n),o]}function Oe(t,e){if(!e)return t;if(1===e)return c(y(t/2+w));for(var r=1,n=P(1-e),o=P(e),s=0;i(o)>m;s++){if(t%b){var l=a(n*y(t)/r);l<0&&(l+=b),t+=l+~~(t/b)*b}else t+=t;o=(r+n)/2,n=P(r*n),o=((r=o)-n)/2}return t/(p(2,s)*r)}function Ie(t,e){var r=(k-1)/(k+1),n=P(1-r*r),u=Oe(_,n*n),f=c(y(b/4+i(e)/2)),h=l(-1*f)/P(r),p=function(t,e){var r=t*t,n=e+1,i=1-r-e*e;return[.5*((t>=0?_:-_)-o(i,2*t)),-.25*c(i*i+4*r)+.5*c(n*n+r)]}(h*s(-1*t),h*g(-1*t)),d=function(t,e,r){var n=i(t),o=O(i(e));if(n){var s=1/g(n),l=1/(y(n)*y(n)),u=-(l+r*(o*o*s*s)-1+r),c=(-u+P(u*u-(r-1)*l*4))/2;return[Oe(a(1/P(c)),r)*v(t),Oe(a(P((c/l-1)/r)),1-r)*v(e)]}return[0,Oe(a(o),1-r)*v(e)]}(p[0],p[1],n*n);return[-d[1],(e>=0?1:-1)*(.5*u-d[0])]}function ze(){return(0,n.c)(Ee(Ie)).scale(151.496)}Le.invert=function(t,e){i(t)>1&&(t=2*v(t)-t),i(e)>1&&(e=2*v(e)-e);var r=v(t),n=v(e),a=-r*t,l=-n*e,u=l/a<1,c=function(t,e){for(var r=0,n=1,a=.5,o=50;;){var l=a*a,u=P(a),c=L(1/P(1+l)),f=1-l+a*(1+l)*c,h=(1-u)/f,p=P(h),d=h*(1+l),v=p*(1-l),g=P(d-t*t),y=e+v+a*g;if(i(n-r)0?r=a:n=a,a=.5*(r+n)}if(!o)return null;var m=L(u),_=s(m),w=1/_,T=2*u*_,k=(-f*_-(-3*a+c*(1+3*l))*T*(1-u))/(f*f);return[b/4*(t*(-2*w*((1-l)*(.5*k/p)-2*a*p*T)+-w*T*g)+-w*(a*(1+l)*k+h*(1+3*l)*T)*L(t/P(d))),m]}(u?l:a,u?a:l),f=c[0],h=c[1],p=s(h);return u&&(f=-_-f),[r*(o(g(f)*p,-g(h))+b),n*L(s(f)*p)]},Ie.invert=function(t,e){var r,n,i,s,u,f,h=(k-1)/(k+1),p=P(1-h*h),d=(n=-t,i=p*p,(r=.5*Oe(_,p*p)-e)?(s=Pe(r,i),n?(f=(u=Pe(n,1-i))[1]*u[1]+i*s[0]*s[0]*u[0]*u[0],[[s[0]*u[2]/f,s[1]*s[2]*u[0]*u[1]/f],[s[1]*u[1]/f,-s[0]*s[2]*u[0]*u[2]/f],[s[2]*u[1]*u[2]/f,-i*s[0]*s[1]*u[0]/f]]):[[s[0],0],[s[1],0],[s[2],0]]):[[0,(u=Pe(n,1-i))[0]/u[1]],[1/u[1],0],[u[2]/u[1],0]]),v=function(t,e){var r=e[0]*e[0]+e[1]*e[1];return[(t[0]*e[0]+t[1]*e[1])/r,(t[1]*e[0]-t[0]*e[1])/r]}(d[0],d[1]);return[o(v[1],v[0])/-1,2*a(l(-.5*c(h*v[0]*v[0]+h*v[1]*v[1])))-_]};var De=r(61780);function Re(t){var e=g(t),r=s(t),n=Fe(t);function a(t,a){var o=n(t,a);t=o[0],a=o[1];var l=g(a),u=s(a),c=s(t),f=C(e*l+r*u*c),h=g(f),p=i(h)>m?f/h:1;return[p*r*g(t),(i(t)>_?p:-p)*(e*u-r*l*c)]}return n.invert=Fe(-t),a.invert=function(t,r){var i=P(t*t+r*r),a=-g(i),l=s(i),u=i*l,c=-r*a,f=i*e,h=P(u*u+c*c-f*f),p=o(u*f+c*h,c*f-u*h),d=(i>_?-1:1)*o(t*a,i*s(p)*l+r*g(p)*a);return n.invert(d,p)},a}function Fe(t){var e=g(t),r=s(t);return function(t,n){var i=s(n),a=s(t)*i,l=g(t)*i,u=g(n);return[o(l,a*r-u*e),L(u*r+a*e)]}}function Be(){var t=0,e=(0,n.U)(Re),r=e(t),i=r.rotate,a=r.stream,o=(0,De.c)();return r.parallel=function(n){if(!arguments.length)return t*S;var i=r.rotate();return e(t=n*E).rotate(i)},r.rotate=function(e){return arguments.length?(i.call(r,[e[0],e[1]-t*S]),o.center([-e[0],-e[1]]),r):((e=i.call(r))[1]+=t*S,e)},r.stream=function(t){return(t=a(t)).sphere=function(){t.polygonStart();var e,r=o.radius(89.99)().coordinates[0],n=r.length-1,i=-1;for(t.lineStart();++i=0;)t.point((e=r[i])[0],e[1]);t.lineEnd(),t.polygonEnd()},t},r.scale(79.4187).parallel(45).clipAngle(179.999)}var Ne=r(84706),je=r(16016),Ue=L(1-1/3)*S,Ve=Rt(0);function qe(t){var e=Ue*E,r=Lt(b,e)[0]-Lt(-b,e)[0],n=Ve(0,e)[1],a=Lt(0,e)[1],o=A-a,s=M/t,l=4/M,c=n+o*o*4/M;function p(p,d){var v,g=i(d);if(g>e){var y=h(t-1,f(0,u((p+b)/s)));(v=Lt(p+=b*(t-1)/t-y*s,g))[0]=v[0]*M/r-M*(t-1)/(2*t)+y*M/t,v[1]=n+4*(v[1]-a)*o/M,d<0&&(v[1]=-v[1])}else v=Ve(p,d);return v[0]*=l,v[1]/=c,v}return p.invert=function(e,p){e/=l;var d=i(p*=c);if(d>n){var v=h(t-1,f(0,u((e+b)/s)));e=(e+b*(t-1)/t-v*s)*r/M;var g=Lt.invert(e,.25*(d-n)*M/o+a);return g[0]-=b*(t-1)/t-v*s,p<0&&(g[1]=-g[1]),g}return Ve.invert(e,p)},p}function He(t,e){return[t,1&e?90-m:Ue]}function Ge(t,e){return[t,1&e?-90+m:-Ue]}function We(t){return[t[0]*(1-m),t[1]]}function Ye(){var t=4,e=(0,n.U)(qe),r=e(t),i=r.stream;return r.lobes=function(r){return arguments.length?e(t=+r):t},r.stream=function(e){var n=r.rotate(),a=i(e),o=(r.rotate([0,0]),i(e));return r.rotate(n),a.sphere=function(){var e,r;(0,je.c)((e=180/t,r=[].concat((0,Ne.ik)(-180,180+e/2,e).map(He),(0,Ne.ik)(180,-180-e/2,-e).map(Ge)),{type:\"Polygon\",coordinates:[180===e?r.map(We):r]}),o)},a},r.scale(239.75)}function Xe(t){var e,r=1+t,n=L(g(1/r)),a=2*P(b/(e=b+4*n*r)),l=.5*a*(r+P(t*(2+t))),u=t*t,c=r*r;function f(f,h){var p,d,v=1-g(h);if(v&&v<2){var y,m=_-h,w=25;do{var T=g(m),k=s(m),A=n+o(T,r-k),M=1+c-2*r*k;m-=y=(m-u*n-r*T+M*A-.5*v*e)/(2*r*T*A)}while(i(y)>x&&--w>0);p=a*P(M),d=f*A/b}else p=a*(t+v),d=f*n/b;return[p*g(d),l-p*s(d)]}return f.invert=function(t,i){var s=t*t+(i-=l)*i,f=(1+c-s/(a*a))/(2*r),h=C(f),p=g(h),d=n+o(p,r-f);return[L(t/P(s))*b/d,L(1-2*(h-u*n-r*p+(1+c-2*r*f)*d)/e)]},f}function Ze(){var t=1,e=(0,n.U)(Xe),r=e(t);return r.ratio=function(r){return arguments.length?e(t=+r):t},r.scale(167.774).center([0,18.67])}var Ke=.7109889596207567,Je=.0528035274542;function $e(t,e){return e>-Ke?((t=at(t,e))[1]+=Je,t):ht(t,e)}function Qe(){return(0,n.c)($e).rotate([-20,-55]).scale(164.263).center([0,-5.4036])}function tr(t,e){return i(e)>Ke?((t=at(t,e))[1]-=e>0?Je:-Je,t):ht(t,e)}function er(){return(0,n.c)(tr).scale(152.63)}function rr(t,e,r,n){var i=P(4*b/(2*r+(1+t-e/2)*g(2*r)+(t+e)/2*g(4*r)+e/2*g(6*r))),a=P(n*g(r)*P((1+t*s(2*r)+e*s(4*r))/(1+t+e))),o=r*u(1);function l(r){return P(1+t*s(2*r)+e*s(4*r))}function u(n){var i=n*r;return(2*i+(1+t-e/2)*g(2*i)+(t+e)/2*g(4*i)+e/2*g(6*i))/r}function c(t){return l(t)*g(t)}var f=function(t,e){var n=r*Q(u,o*g(e)/r,e/b);isNaN(n)&&(n=r*v(e));var c=i*l(n);return[c*a*t/b*s(n),c/a*g(n)]};return f.invert=function(t,e){var n=Q(c,e*a/i);return[t*b/(s(n)*i*a*l(n)),L(r*u(n/r)/o)]},0===r&&(i=P(n/b),(f=function(t,e){return[t*i,g(e)/i]}).invert=function(t,e){return[t/i,L(e*i)]}),f}function nr(){var t=1,e=0,r=45*E,i=2,a=(0,n.U)(rr),o=a(t,e,r,i);return o.a=function(n){return arguments.length?a(t=+n,e,r,i):t},o.b=function(n){return arguments.length?a(t,e=+n,r,i):e},o.psiMax=function(n){return arguments.length?a(t,e,r=+n*E,i):r*S},o.ratio=function(n){return arguments.length?a(t,e,r,i=+n):i},o.scale(180.739)}function ir(t,e,r,n,i,a,o,s,l,u,c){if(c.nanEncountered)return NaN;var f,h,p,d,v,g,y,m,x,b;if(h=t(e+.25*(f=r-e)),p=t(r-.25*f),isNaN(h))c.nanEncountered=!0;else{if(!isNaN(p))return b=((g=(d=f*(n+4*h+i)/12)+(v=f*(i+4*p+a)/12))-o)/15,u>l?(c.maxDepthCount++,g+b):Math.abs(b)t?r=n:e=n,n=e+r>>1}while(n>e);var i=u[n+1]-u[n];return i&&(i=(t-u[n+1])/i),(n+1+i)/s}var h=2*f(1)/b*o/r,d=function(t,e){var r=f(i(g(e))),a=n(r)*t;return r/=h,[a,e>=0?r:-r]};return d.invert=function(t,e){var r;return i(e*=h)<1&&(r=v(e)*L(a(i(e))*o)),[t/n(i(e)),r]},d}function sr(){var t=0,e=2.5,r=1.183136,i=(0,n.U)(or),a=i(t,e,r);return a.alpha=function(n){return arguments.length?i(t=+n,e,r):t},a.k=function(n){return arguments.length?i(t,e=+n,r):e},a.gamma=function(n){return arguments.length?i(t,e,r=+n):r},a.scale(152.63)}function lr(t,e){return i(t[0]-e[0])a[o][2][0];++o);var l=t(r-a[o][1][0],n);return l[0]+=t(a[o][1][0],i*n>i*a[o][0][1]?a[o][0][1]:n)[0],l}r?o.invert=r(o):t.invert&&(o.invert=function(r,n){for(var i=a[+(n<0)],s=e[+(n<0)],l=0,u=i.length;l=0;--s)r=(e=t[1][s])[0][0],n=e[0][1],i=e[1][1],a=e[2][0],o=e[2][1],l.push(ur([[a-m,o-m],[a-m,i+m],[r+m,i+m],[r+m,n-m]],30));return{type:\"Polygon\",coordinates:[(0,Ne.Uf)(l)]}}(r),e=r.map((function(t){return t.map((function(t){return[[t[0][0]*E,t[0][1]*E],[t[1][0]*E,t[1][1]*E],[t[2][0]*E,t[2][1]*E]]}))})),a=e.map((function(e){return e.map((function(e){var r,n=t(e[0][0],e[0][1])[0],i=t(e[2][0],e[2][1])[0],a=t(e[1][0],e[0][1])[1],o=t(e[1][0],e[1][1])[1];return a>o&&(r=a,a=o,o=r),[[n,a],[i,o]]}))})),s):e.map((function(t){return t.map((function(t){return[[t[0][0]*S,t[0][1]*S],[t[1][0]*S,t[1][1]*S],[t[2][0]*S,t[2][1]*S]]}))}))},null!=e&&s.lobes(e),s}$e.invert=function(t,e){return e>-Ke?at.invert(t,e-Je):ht.invert(t,e)},tr.invert=function(t,e){return i(e)>Ke?at.invert(t,e+(e>0?Je:-Je)):ht.invert(t,e)};var fr=[[[[-180,0],[-100,90],[-40,0]],[[-40,0],[30,90],[180,0]]],[[[-180,0],[-160,-90],[-100,0]],[[-100,0],[-60,-90],[-20,0]],[[-20,0],[20,-90],[80,0]],[[80,0],[140,-90],[180,0]]]];function hr(){return cr(ut,fr).scale(160.857)}var pr=[[[[-180,0],[-100,90],[-40,0]],[[-40,0],[30,90],[180,0]]],[[[-180,0],[-160,-90],[-100,0]],[[-100,0],[-60,-90],[-20,0]],[[-20,0],[20,-90],[80,0]],[[80,0],[140,-90],[180,0]]]];function dr(){return cr(tr,pr).scale(152.63)}var vr=[[[[-180,0],[-100,90],[-40,0]],[[-40,0],[30,90],[180,0]]],[[[-180,0],[-160,-90],[-100,0]],[[-100,0],[-60,-90],[-20,0]],[[-20,0],[20,-90],[80,0]],[[80,0],[140,-90],[180,0]]]];function gr(){return cr(at,vr).scale(169.529)}var yr=[[[[-180,0],[-90,90],[0,0]],[[0,0],[90,90],[180,0]]],[[[-180,0],[-90,-90],[0,0]],[[0,0],[90,-90],[180,0]]]];function mr(){return cr(at,yr).scale(169.529).rotate([20,0])}var xr=[[[[-180,35],[-30,90],[0,35]],[[0,35],[30,90],[180,35]]],[[[-180,-10],[-102,-90],[-65,-10]],[[-65,-10],[5,-90],[77,-10]],[[77,-10],[103,-90],[180,-10]]]];function br(){return cr($e,xr,tt).rotate([-20,-55]).scale(164.263).center([0,-5.4036])}var _r=[[[[-180,0],[-110,90],[-40,0]],[[-40,0],[0,90],[40,0]],[[40,0],[110,90],[180,0]]],[[[-180,0],[-110,-90],[-40,0]],[[-40,0],[0,-90],[40,0]],[[40,0],[110,-90],[180,0]]]];function wr(){return cr(ht,_r).scale(152.63).rotate([-20,0])}function Tr(t,e){return[3/M*t*P(b*b/3-e*e),e]}function kr(){return(0,n.c)(Tr).scale(158.837)}function Ar(t){function e(e,r){if(i(i(r)-_)2)return null;var a=(e/=2)*e,s=(r/=2)*r,l=2*r/(1+a+s);return l=p((1+l)/(1-l),1/t),[o(2*e,1-a-s)/t,L((l-1)/(l+1))]},e}function Mr(){var t=.5,e=(0,n.U)(Ar),r=e(t);return r.spacing=function(r){return arguments.length?e(t=+r):t},r.scale(124.75)}Tr.invert=function(t,e){return[M/3*t/P(b*b/3-e*e),e]};var Sr=b/k;function Er(t,e){return[t*(1+P(s(e)))/2,e/(s(e/2)*s(t/6))]}function Lr(){return(0,n.c)(Er).scale(97.2672)}function Cr(t,e){var r=t*t,n=e*e;return[t*(.975534+n*(-.0143059*r-.119161+-.0547009*n)),e*(1.00384+r*(.0802894+-.02855*n+199025e-9*r)+n*(.0998909+-.0491032*n))]}function Pr(){return(0,n.c)(Cr).scale(139.98)}function Or(t,e){return[g(t)/s(e),y(e)*s(t)]}function Ir(){return(0,n.c)(Or).scale(144.049).clipAngle(89.999)}function zr(t){var e=s(t),r=y(w+t/2);function n(n,a){var o=a-t,s=i(o)=0;)h=(f=t[c])[0]+l*(i=h)-u*p,p=f[1]+l*p+u*i;return[h=l*(i=h)-u*p,p=l*p+u*i]}return r.invert=function(r,n){var l=20,u=r,c=n;do{for(var f,h=e,p=t[h],d=p[0],v=p[1],y=0,x=0;--h>=0;)y=d+u*(f=y)-c*x,x=v+u*x+c*f,d=(p=t[h])[0]+u*(f=d)-c*v,v=p[1]+u*v+c*f;var b,_,w=(y=d+u*(f=y)-c*x)*y+(x=v+u*x+c*f)*x;u-=b=((d=u*(f=d)-c*v-r)*y+(v=u*v+c*f-n)*x)/w,c-=_=(v*y-d*x)/w}while(i(b)+i(_)>m*m&&--l>0);if(l){var T=P(u*u+c*c),k=2*a(.5*T),A=g(k);return[o(u*A,T*s(k)),T?L(c*A/T):0]}},r}Er.invert=function(t,e){var r=i(t),n=i(e),a=m,o=_;nm||i(x)>m)&&--a>0);return a&&[r,n]},Or.invert=function(t,e){var r=t*t,n=e*e+1,i=r+n,a=t?T*P((i-P(i*i-4*r))/r):1/P(n);return[L(t*a),v(e)*C(a)]},Rr.invert=function(t,e){return[t,2.5*a(l(.8*e))-.625*b]};var Nr=[[.9972523,0],[.0052513,-.0041175],[.0074606,.0048125],[-.0153783,-.1968253],[.0636871,-.1408027],[.3660976,-.2937382]],jr=[[.98879,0],[0,0],[-.050909,0],[0,0],[.075528,0]],Ur=[[.984299,0],[.0211642,.0037608],[-.1036018,-.0575102],[-.0329095,-.0320119],[.0499471,.1223335],[.026046,.0899805],[7388e-7,-.1435792],[.0075848,-.1334108],[-.0216473,.0776645],[-.0225161,.0853673]],Vr=[[.9245,0],[0,0],[.01943,0]],qr=[[.721316,0],[0,0],[-.00881625,-.00617325]];function Hr(){return Zr(Nr,[152,-64]).scale(1400).center([-160.908,62.4864]).clipAngle(30).angle(7.8)}function Gr(){return Zr(jr,[95,-38]).scale(1e3).clipAngle(55).center([-96.5563,38.8675])}function Wr(){return Zr(Ur,[120,-45]).scale(359.513).clipAngle(55).center([-117.474,53.0628])}function Yr(){return Zr(Vr,[-20,-18]).scale(209.091).center([20,16.7214]).clipAngle(82)}function Xr(){return Zr(qr,[165,10]).scale(250).clipAngle(130).center([-165,-10])}function Zr(t,e){var r=(0,n.c)(Br(t)).rotate(e).clipAngle(90),i=(0,_t.c)(e),a=r.center;return delete r.rotate,r.center=function(t){return arguments.length?a(i(t)):i.invert(a())},r}var Kr=P(6),Jr=P(7);function $r(t,e){var r=L(7*g(e)/(3*Kr));return[Kr*t*(2*s(2*r/3)-1)/Jr,9*g(r/3)/Jr]}function Qr(){return(0,n.c)($r).scale(164.859)}function tn(t,e){for(var r,n=(1+T)*g(e),a=e,o=0;o<25&&(a-=r=(g(a/2)+g(a)-n)/(.5*s(a/2)+s(a)),!(i(r)x&&--l>0);return[t/(.84719-.13063*(n=s*s)+(o=n*(a=n*n))*o*(.05494*n-.04515-.02326*a+.00331*o)),s]},ln.invert=function(t,e){for(var r=e/2,n=0,a=1/0;n<10&&i(a)>m;++n){var o=s(e/2);e-=a=(e-y(e/2)-r)/(1-.5/(o*o))}return[2*t/(1+s(e)),e]};var cn=[[[[-180,0],[-90,90],[0,0]],[[0,0],[90,90],[180,0]]],[[[-180,0],[-90,-90],[0,0]],[[0,0],[90,-90],[180,0]]]];function fn(){return cr(K(1/0),cn).rotate([20,0]).scale(152.63)}function hn(t,e){var r=g(e),n=s(e),a=v(t);if(0===t||i(e)===_)return[0,e];if(0===e)return[t,0];if(i(t)===_)return[t*n,_*r];var o=b/(2*t)-2*t/b,l=2*e/b,u=(1-l*l)/(r-l),c=o*o,f=u*u,h=1+c/f,p=1+f/c,d=(o*r/u-o/2)/h,y=(f*r/c+u/2)/p,m=y*y-(f*r*r/c+u*r-1)/p;return[_*(d+P(d*d+n*n/h)*a),_*(y+P(m<0?0:m)*v(-e*o)*a)]}function pn(){return(0,n.c)(hn).scale(127.267)}hn.invert=function(t,e){var r=(t/=_)*t,n=r+(e/=_)*e,i=b*b;return[t?(n-1+P((1-n)*(1-n)+4*r))/(2*t)*_:0,Q((function(t){return n*(b*g(t)-2*t)*b+4*t*t*(e-g(t))+2*b*t-i*e}),0)]};var dn=1.0148,vn=.23185,gn=-.14499,yn=.02406,mn=dn,xn=5*vn,bn=7*gn,_n=9*yn,wn=1.790857183;function Tn(t,e){var r=e*e;return[t,e*(dn+r*r*(vn+r*(gn+yn*r)))]}function kn(){return(0,n.c)(Tn).scale(139.319)}function An(t,e){if(i(e)wn?e=wn:e<-1.790857183&&(e=-1.790857183);var r,n=e;do{var a=n*n;n-=r=(n*(dn+a*a*(vn+a*(gn+yn*a)))-e)/(mn+a*a*(xn+a*(bn+_n*a)))}while(i(r)>m);return[t,n]},An.invert=function(t,e){if(i(e)m&&--o>0);return l=y(a),[(i(e)=0;)if(n=e[s],r[0]===n[0]&&r[1]===n[1]){if(a)return[a,r];a=r}}}(e.face,r.face),i=(c=n.map(r.project),f=n.map(e.project),h=Cn(c[1],c[0]),p=Cn(f[1],f[0]),d=function(t,e){return o(t[0]*e[1]-t[1]*e[0],t[0]*e[0]+t[1]*e[1])}(h,p),v=Pn(h)/Pn(p),Ln([1,0,c[0][0],0,1,c[0][1]],Ln([v,0,0,0,v,0],Ln([s(d),g(d),0,-g(d),s(d),0],[1,0,-f[0][0],0,1,-f[0][1]]))));e.transform=r.transform?Ln(r.transform,i):i;for(var a=r.edges,l=0,u=a.length;l0?[-e[0],0]:[180-e[0],180])};var e=Bn.map((function(e){return{face:e,project:t(e)}}));return[-1,0,0,1,0,1,4,5].forEach((function(t,r){var n=e[t];n&&(n.children||(n.children=[])).push(e[r])})),On(e[0],(function(t,r){return e[t<-b/2?r<0?6:4:t<0?r<0?2:0:tn^p>n&&r<(h-u)*(n-c)/(p-c)+u&&(i=!i)}return i}(t[0],r))return t.push(e),!0}))||t.push([e])})),Qn=[],t.length?t.length>1?{type:\"MultiPolygon\",coordinates:t}:{type:\"Polygon\",coordinates:t[0]}:null}};function ni(t){var e=t(_,0)[0]-t(-_,0)[0];function r(r,n){var a=i(r)<_,o=t(a?r:r>0?r-b:r+b,n),s=(o[0]-o[1])*T,l=(o[0]+o[1])*T;if(a)return[s,l];var u=e*T,c=s>0^l>0?-1:1;return[c*s-v(l)*u,c*l-v(s)*u]}return t.invert&&(r.invert=function(r,n){var a=(r+n)*T,o=(n-r)*T,s=i(a)<.5*e&&i(o)<.5*e;if(!s){var l=e*T,u=a>0^o>0?-1:1,c=-u*r+(o>0?1:-1)*l,f=-u*n+(a>0?1:-1)*l;a=(-c-f)*T,o=(c-f)*T}var h=t.invert(a,o);return s||(h[0]+=a>0?b:-b),h}),(0,n.c)(r).rotate([-90,-90,45]).clipAngle(179.999)}function ii(){return ni(Le).scale(176.423)}function ai(){return ni(Ie).scale(111.48)}function oi(t,e){if(!(0<=(e=+e)&&e<=20))throw new Error(\"invalid digits\");function r(t){var r=t.length,n=2,i=new Array(r);for(i[0]=+t[0].toFixed(e),i[1]=+t[1].toFixed(e);n2||a[0]!=e[0]||a[1]!=e[1])&&(n.push(a),e=a)}return 1===n.length&&t.length>1&&n.push(r(t[t.length-1])),n}function a(t){return t.map(i)}function o(t){if(null==t)return t;var e;switch(t.type){case\"GeometryCollection\":e={type:\"GeometryCollection\",geometries:t.geometries.map(o)};break;case\"Point\":e={type:\"Point\",coordinates:r(t.coordinates)};break;case\"MultiPoint\":e={type:t.type,coordinates:n(t.coordinates)};break;case\"LineString\":e={type:t.type,coordinates:i(t.coordinates)};break;case\"MultiLineString\":case\"Polygon\":e={type:t.type,coordinates:a(t.coordinates)};break;case\"MultiPolygon\":e={type:\"MultiPolygon\",coordinates:t.coordinates.map(a)};break;default:return t}return null!=t.bbox&&(e.bbox=t.bbox),e}function s(t){var e={type:\"Feature\",properties:t.properties,geometry:o(t.geometry)};return null!=t.id&&(e.id=t.id),null!=t.bbox&&(e.bbox=t.bbox),e}if(null!=t)switch(t.type){case\"Feature\":return s(t);case\"FeatureCollection\":var l={type:\"FeatureCollection\",features:t.features.map(s)};return null!=t.bbox&&(l.bbox=t.bbox),l;default:return o(t)}return t}function si(t){var e=g(t);function r(r,n){var i=e?y(r*e/2)/e:r/2;if(!n)return[2*i,-t];var o=2*a(i*g(n)),l=1/y(n);return[g(o)*l,n+(1-s(o))*l-t]}return r.invert=function(r,n){if(i(n+=t)m&&--c>0);var d=r*(f=y(u)),v=y(i(n)0?_:-_)*(f+o*(d-l)/2+o*o*(d-2*f+l)/2)]}function fi(){return(0,n.c)(ci).scale(152.63)}function hi(t,e){var r=function(t){function e(e,r){var n=s(r),i=(t-1)/(t-n*s(e));return[i*n*g(e),i*g(r)]}return e.invert=function(e,r){var n=e*e+r*r,i=P(n),a=(t-P(1-n*(t+1)/(t-1)))/((t-1)/i+i/(t-1));return[o(e*a,i*P(1-a*a)),i?L(r*a/i):0]},e}(t);if(!e)return r;var n=s(e),i=g(e);function a(e,a){var o=r(e,a),s=o[1],l=s*i/(t-1)+n;return[o[0]*n/l,s/l]}return a.invert=function(e,a){var o=(t-1)/(t-1-a*i);return r.invert(o*e,o*a*n)},a}function pi(){var t=2,e=0,r=(0,n.U)(hi),i=r(t,e);return i.distance=function(n){return arguments.length?r(t=+n,e):t},i.tilt=function(n){return arguments.length?r(t,e=n*E):e*S},i.scale(432.147).clipAngle(C(1/t)*S-1e-6)}ui.forEach((function(t){t[1]*=1.0144})),ci.invert=function(t,e){var r=e/_,n=90*r,a=h(18,i(n/5)),o=f(0,u(a));do{var s=ui[o][1],l=ui[o+1][1],c=ui[h(19,o+2)][1],p=c-s,d=c-2*l+s,v=2*(i(r)-l)/p,g=d/p,y=v*(1-g*v*(1-2*g*v));if(y>=0||1===o){n=(e>=0?5:-5)*(y+a);var m,b=50;do{y=(a=h(18,i(n)/5))-(o=u(a)),s=ui[o][1],l=ui[o+1][1],c=ui[h(19,o+2)][1],n-=(m=(e>=0?_:-_)*(l+y*(c-s)/2+y*y*(c-2*l+s)/2)-e)*S}while(i(m)>x&&--b>0);break}}while(--o>=0);var w=ui[o][0],T=ui[o+1][0],k=ui[h(19,o+2)][0];return[t/(T+y*(k-w)/2+y*y*(k-2*T+w)/2),n*E]};var di=1e-4,vi=1e4,gi=-180,yi=gi+di,mi=180,xi=mi-di,bi=-90,_i=bi+di,wi=90,Ti=wi-di;function ki(t){return t.length>0}function Ai(t){return t===bi||t===wi?[0,t]:[gi,(e=t,Math.floor(e*vi)/vi)];var e}function Mi(t){var e=t[0],r=t[1],n=!1;return e<=yi?(e=gi,n=!0):e>=xi&&(e=mi,n=!0),r<=_i?(r=bi,n=!0):r>=Ti&&(r=wi,n=!0),n?[e,r]:t}function Si(t){return t.map(Mi)}function Ei(t,e,r){for(var n=0,i=t.length;n=xi||c<=_i||c>=Ti){a[o]=Mi(l);for(var f=o+1;fyi&&p_i&&d=s)break;r.push({index:-1,polygon:e,ring:a=a.slice(f-1)}),a[0]=Ai(a[0][1]),o=-1,s=a.length}}}}function Li(t){var e,r,n,i,a,o,s=t.length,l={},u={};for(e=0;e0?b-l:l)*S],c=(0,n.c)(t(s)).rotate(u),f=(0,_t.c)(u),h=c.center;return delete c.rotate,c.center=function(t){return arguments.length?h(f(t)):f.invert(h())},c.clipAngle(90)}function Ri(t){var e=s(t);function r(t,r){var n=(0,Rn.Y)(t,r);return n[0]*=e,n}return r.invert=function(t,r){return Rn.Y.invert(t/e,r)},r}function Fi(){return Bi([-158,21.5],[-77,39]).clipAngle(60).scale(400)}function Bi(t,e){return Di(Ri,t,e)}function Ni(t){if(!(t*=2))return W.O;var e=-t/2,r=-e,n=t*t,i=y(r),a=.5/g(r);function l(i,a){var o=C(s(a)*s(i-e)),l=C(s(a)*s(i-r));return[((o*=o)-(l*=l))/(2*t),(a<0?-1:1)*P(4*n*l-(n-o+l)*(n-o+l))/(2*t)]}return l.invert=function(t,n){var l,u,c=n*n,f=s(P(c+(l=t+e)*l)),h=s(P(c+(l=t+r)*l));return[o(u=f-h,l=(f+h)*i),(n<0?-1:1)*C(P(l*l+u*u)*a)]},l}function ji(){return Ui([-158,21.5],[-77,39]).clipAngle(130).scale(122.571)}function Ui(t,e){return Di(Ni,t,e)}function Vi(t,e){if(i(e)m&&--l>0);return[v(t)*(P(a*a+4)+a)*b/4,_*s]};var Qi=4*b+3*P(3),ta=2*P(2*b*P(3)/Qi),ea=it(ta*P(3)/b,ta,Qi/6);function ra(){return(0,n.c)(ea).scale(176.84)}function na(t,e){return[t*P(1-3*e*e/(b*b)),e]}function ia(){return(0,n.c)(na).scale(152.63)}function aa(t,e){var r=s(e),n=s(t)*r,i=1-n,a=s(t=o(g(t)*r,-g(e))),l=g(t);return[l*(r=P(1-n*n))-a*i,-a*r-l*i]}function oa(){return(0,n.c)(aa).rotate([0,-90,45]).scale(124.75).clipAngle(179.999)}function sa(t,e){var r=R(t,e);return[(r[0]+t/_)/2,(r[1]+e)/2]}function la(){return(0,n.c)(sa).scale(158.837)}na.invert=function(t,e){return[t/P(1-3*e*e/(b*b)),e]},aa.invert=function(t,e){var r=(t*t+e*e)/-2,n=P(-r*(2+r)),i=e*r+t*n,a=t*r-e*n,s=P(a*a+i*i);return[o(n*i,s*(1+r)),s?-L(n*a/s):0]},sa.invert=function(t,e){var r=t,n=e,a=25;do{var o,l=s(n),u=g(n),c=g(2*n),f=u*u,h=l*l,p=g(r),d=s(r/2),v=g(r/2),y=v*v,x=1-h*d*d,b=x?C(l*d)*P(o=1/x):o=0,w=.5*(2*b*l*v+r/_)-t,T=.5*(b*u+n)-e,k=.5*o*(h*y+b*l*d*f)+.5/_,A=o*(p*c/4-b*u*v),M=.125*o*(c*v-b*u*h*p),S=.5*o*(f*d+b*y*l)+.5,E=A*M-S*k,L=(T*A-w*S)/E,O=(w*M-T*k)/E;r-=L,n-=O}while((i(L)>m||i(O)>m)&&--a>0);return[r,n]}},88728:function(t,e,r){\"use strict\";function n(){return new i}function i(){this.reset()}r.d(e,{c:function(){return n}}),i.prototype={constructor:i,reset:function(){this.s=this.t=0},add:function(t){o(a,t,this.t),o(this,a.s,this.s),this.s?this.t+=a.t:this.s=a.t},valueOf:function(){return this.s}};var a=new i;function o(t,e,r){var n=t.s=e+r,i=n-e,a=n-i;t.t=e-a+(r-i)}},95384:function(t,e,r){\"use strict\";r.d(e,{cp:function(){return x},mQ:function(){return h},oB:function(){return d}});var n,i,a,o,s,l=r(88728),u=r(64528),c=r(70932),f=r(16016),h=(0,l.c)(),p=(0,l.c)(),d={point:c.c,lineStart:c.c,lineEnd:c.c,polygonStart:function(){h.reset(),d.lineStart=v,d.lineEnd=g},polygonEnd:function(){var t=+h;p.add(t<0?u.kD+t:t),this.lineStart=this.lineEnd=this.point=c.c},sphere:function(){p.add(u.kD)}};function v(){d.point=y}function g(){m(n,i)}function y(t,e){d.point=m,n=t,i=e,t*=u.qw,e*=u.qw,a=t,o=(0,u.W8)(e=e/2+u.wL),s=(0,u.g$)(e)}function m(t,e){t*=u.qw,e=(e*=u.qw)/2+u.wL;var r=t-a,n=r>=0?1:-1,i=n*r,l=(0,u.W8)(e),c=(0,u.g$)(e),f=s*c,p=o*l+f*(0,u.W8)(i),d=f*n*(0,u.g$)(i);h.add((0,u.WE)(d,p)),a=t,o=l,s=c}function x(t){return p.reset(),(0,f.c)(t,d),2*p}},13696:function(t,e,r){\"use strict\";r.d(e,{c:function(){return C}});var n,i,a,o,s,l,u,c,f,h,p=r(88728),d=r(95384),v=r(84220),g=r(64528),y=r(16016),m=(0,p.c)(),x={point:b,lineStart:w,lineEnd:T,polygonStart:function(){x.point=k,x.lineStart=A,x.lineEnd=M,m.reset(),d.oB.polygonStart()},polygonEnd:function(){d.oB.polygonEnd(),x.point=b,x.lineStart=w,x.lineEnd=T,d.mQ<0?(n=-(a=180),i=-(o=90)):m>g.Gg?o=90:m<-g.Gg&&(i=-90),h[0]=n,h[1]=a},sphere:function(){n=-(a=180),i=-(o=90)}};function b(t,e){f.push(h=[n=t,a=t]),eo&&(o=e)}function _(t,e){var r=(0,v.ux)([t*g.qw,e*g.qw]);if(c){var l=(0,v.CW)(c,r),u=[l[1],-l[0],0],p=(0,v.CW)(u,l);(0,v.cJ)(p),p=(0,v.G)(p);var d,y=t-s,m=y>0?1:-1,x=p[0]*g.oh*m,b=(0,g.a2)(y)>180;b^(m*so&&(o=d):b^(m*s<(x=(x+360)%360-180)&&xo&&(o=e)),b?tS(n,a)&&(a=t):S(t,a)>S(n,a)&&(n=t):a>=n?(ta&&(a=t)):t>s?S(n,t)>S(n,a)&&(a=t):S(t,a)>S(n,a)&&(n=t)}else f.push(h=[n=t,a=t]);eo&&(o=e),c=r,s=t}function w(){x.point=_}function T(){h[0]=n,h[1]=a,x.point=b,c=null}function k(t,e){if(c){var r=t-s;m.add((0,g.a2)(r)>180?r+(r>0?360:-360):r)}else l=t,u=e;d.oB.point(t,e),_(t,e)}function A(){d.oB.lineStart()}function M(){k(l,u),d.oB.lineEnd(),(0,g.a2)(m)>g.Gg&&(n=-(a=180)),h[0]=n,h[1]=a,c=null}function S(t,e){return(e-=t)<0?e+360:e}function E(t,e){return t[0]-e[0]}function L(t,e){return t[0]<=t[1]?t[0]<=e&&e<=t[1]:eS(s[0],s[1])&&(s[1]=l[1]),S(l[0],s[1])>S(s[0],s[1])&&(s[0]=l[0])):u.push(s=l);for(c=-1/0,e=0,s=u[r=u.length-1];e<=r;s=l,++e)l=u[e],(p=S(s[1],l[0]))>c&&(c=p,n=l[0],a=s[1])}return f=h=null,n===1/0||i===1/0?[[NaN,NaN],[NaN,NaN]]:[[n,i],[a,o]]}},84220:function(t,e,r){\"use strict\";r.d(e,{CW:function(){return s},Ez:function(){return o},G:function(){return i},cJ:function(){return c},mg:function(){return l},ux:function(){return a},wx:function(){return u}});var n=r(64528);function i(t){return[(0,n.WE)(t[1],t[0]),(0,n.qR)(t[2])]}function a(t){var e=t[0],r=t[1],i=(0,n.W8)(r);return[i*(0,n.W8)(e),i*(0,n.g$)(e),(0,n.g$)(r)]}function o(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]}function s(t,e){return[t[1]*e[2]-t[2]*e[1],t[2]*e[0]-t[0]*e[2],t[0]*e[1]-t[1]*e[0]]}function l(t,e){t[0]+=e[0],t[1]+=e[1],t[2]+=e[2]}function u(t,e){return[t[0]*e,t[1]*e,t[2]*e]}function c(t){var e=(0,n._I)(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]);t[0]/=e,t[1]/=e,t[2]/=e}},24052:function(t,e,r){\"use strict\";r.d(e,{c:function(){return I}});var n,i,a,o,s,l,u,c,f,h,p,d,v,g,y,m,x=r(64528),b=r(70932),_=r(16016),w={sphere:b.c,point:T,lineStart:A,lineEnd:E,polygonStart:function(){w.lineStart=L,w.lineEnd=C},polygonEnd:function(){w.lineStart=A,w.lineEnd=E}};function T(t,e){t*=x.qw,e*=x.qw;var r=(0,x.W8)(e);k(r*(0,x.W8)(t),r*(0,x.g$)(t),(0,x.g$)(e))}function k(t,e,r){++n,a+=(t-a)/n,o+=(e-o)/n,s+=(r-s)/n}function A(){w.point=M}function M(t,e){t*=x.qw,e*=x.qw;var r=(0,x.W8)(e);g=r*(0,x.W8)(t),y=r*(0,x.g$)(t),m=(0,x.g$)(e),w.point=S,k(g,y,m)}function S(t,e){t*=x.qw,e*=x.qw;var r=(0,x.W8)(e),n=r*(0,x.W8)(t),a=r*(0,x.g$)(t),o=(0,x.g$)(e),s=(0,x.WE)((0,x._I)((s=y*o-m*a)*s+(s=m*n-g*o)*s+(s=g*a-y*n)*s),g*n+y*a+m*o);i+=s,l+=s*(g+(g=n)),u+=s*(y+(y=a)),c+=s*(m+(m=o)),k(g,y,m)}function E(){w.point=T}function L(){w.point=P}function C(){O(d,v),w.point=T}function P(t,e){d=t,v=e,t*=x.qw,e*=x.qw,w.point=O;var r=(0,x.W8)(e);g=r*(0,x.W8)(t),y=r*(0,x.g$)(t),m=(0,x.g$)(e),k(g,y,m)}function O(t,e){t*=x.qw,e*=x.qw;var r=(0,x.W8)(e),n=r*(0,x.W8)(t),a=r*(0,x.g$)(t),o=(0,x.g$)(e),s=y*o-m*a,d=m*n-g*o,v=g*a-y*n,b=(0,x._I)(s*s+d*d+v*v),_=(0,x.qR)(b),w=b&&-_/b;f+=w*s,h+=w*d,p+=w*v,i+=_,l+=_*(g+(g=n)),u+=_*(y+(y=a)),c+=_*(m+(m=o)),k(g,y,m)}function I(t){n=i=a=o=s=l=u=c=f=h=p=0,(0,_.c)(t,w);var e=f,r=h,d=p,v=e*e+r*r+d*d;return v0?os)&&(o+=i*a.kD));for(var h,p=o;i>0?p>s:p0?i.pi:-i.pi,u=(0,i.a2)(o-r);(0,i.a2)(u-i.pi)0?i.or:-i.or),t.point(a,n),t.lineEnd(),t.lineStart(),t.point(l,n),t.point(o,n),e=0):a!==l&&u>=i.pi&&((0,i.a2)(r-a)i.Gg?(0,i.MQ)(((0,i.g$)(e)*(o=(0,i.W8)(n))*(0,i.g$)(r)-(0,i.g$)(n)*(a=(0,i.W8)(e))*(0,i.g$)(t))/(a*o*s)):(e+n)/2}(r,n,o,s),t.point(a,n),t.lineEnd(),t.lineStart(),t.point(l,n),e=0),t.point(r=o,n=s),a=l},lineEnd:function(){t.lineEnd(),r=n=NaN},clean:function(){return 2-e}}}),(function(t,e,r,n){var a;if(null==t)a=r*i.or,n.point(-i.pi,a),n.point(0,a),n.point(i.pi,a),n.point(i.pi,0),n.point(i.pi,-a),n.point(0,-a),n.point(-i.pi,-a),n.point(-i.pi,0),n.point(-i.pi,a);else if((0,i.a2)(t[0]-e[0])>i.Gg){var o=t[0]1&&e.push(e.pop().concat(e.shift()))},result:function(){var r=e;return e=[],t=null,r}}}},2728:function(t,e,r){\"use strict\";r.d(e,{c:function(){return l}});var n=r(84220),i=r(61780),a=r(64528),o=r(41860),s=r(14229);function l(t){var e=(0,a.W8)(t),r=6*a.qw,l=e>0,u=(0,a.a2)(e)>a.Gg;function c(t,r){return(0,a.W8)(t)*(0,a.W8)(r)>e}function f(t,r,i){var o=(0,n.ux)(t),s=(0,n.ux)(r),l=[1,0,0],u=(0,n.CW)(o,s),c=(0,n.Ez)(u,u),f=u[0],h=c-f*f;if(!h)return!i&&t;var p=e*c/h,d=-e*f/h,v=(0,n.CW)(l,u),g=(0,n.wx)(l,p),y=(0,n.wx)(u,d);(0,n.mg)(g,y);var m=v,x=(0,n.Ez)(g,m),b=(0,n.Ez)(m,m),_=x*x-b*((0,n.Ez)(g,g)-1);if(!(_<0)){var w=(0,a._I)(_),T=(0,n.wx)(m,(-x-w)/b);if((0,n.mg)(T,g),T=(0,n.G)(T),!i)return T;var k,A=t[0],M=r[0],S=t[1],E=r[1];M0^T[1]<((0,a.a2)(T[0]-A)a.pi^(A<=T[0]&&T[0]<=M)){var P=(0,n.wx)(m,(-x+w)/b);return(0,n.mg)(P,g),[T,(0,n.G)(P)]}}}function h(e,r){var n=l?t:a.pi-t,i=0;return e<-n?i|=1:e>n&&(i|=2),r<-n?i|=4:r>n&&(i|=8),i}return(0,s.c)(c,(function(t){var e,r,n,i,s;return{lineStart:function(){i=n=!1,s=1},point:function(p,d){var v,g=[p,d],y=c(p,d),m=l?y?0:h(p,d):y?h(p+(p<0?a.pi:-a.pi),d):0;if(!e&&(i=n=y)&&t.lineStart(),y!==n&&(!(v=f(e,g))||(0,o.c)(e,v)||(0,o.c)(g,v))&&(g[2]=1),y!==n)s=0,y?(t.lineStart(),v=f(g,e),t.point(v[0],v[1])):(v=f(e,g),t.point(v[0],v[1],2),t.lineEnd()),e=v;else if(u&&e&&l^y){var x;m&r||!(x=f(g,e,!0))||(s=0,l?(t.lineStart(),t.point(x[0][0],x[0][1]),t.point(x[1][0],x[1][1]),t.lineEnd()):(t.point(x[1][0],x[1][1]),t.lineEnd(),t.lineStart(),t.point(x[0][0],x[0][1],3)))}!y||e&&(0,o.c)(e,g)||t.point(g[0],g[1]),e=g,n=y,r=m},lineEnd:function(){n&&t.lineEnd(),e=null},clean:function(){return s|(i&&n)<<1}}}),(function(e,n,a,o){(0,i.Q)(o,t,r,a,e,n)}),l?[0,-t]:[-a.pi,t-a.pi])}},14229:function(t,e,r){\"use strict\";r.d(e,{c:function(){return l}});var n=r(97208),i=r(32232),a=r(64528),o=r(58196),s=r(84706);function l(t,e,r,a){return function(l){var f,h,p,d=e(l),v=(0,n.c)(),g=e(v),y=!1,m={point:x,lineStart:_,lineEnd:w,polygonStart:function(){m.point=T,m.lineStart=k,m.lineEnd=A,h=[],f=[]},polygonEnd:function(){m.point=x,m.lineStart=_,m.lineEnd=w,h=(0,s.Uf)(h);var t=(0,o.c)(f,a);h.length?(y||(l.polygonStart(),y=!0),(0,i.c)(h,c,t,r,l)):t&&(y||(l.polygonStart(),y=!0),l.lineStart(),r(null,null,1,l),l.lineEnd()),y&&(l.polygonEnd(),y=!1),h=f=null},sphere:function(){l.polygonStart(),l.lineStart(),r(null,null,1,l),l.lineEnd(),l.polygonEnd()}};function x(e,r){t(e,r)&&l.point(e,r)}function b(t,e){d.point(t,e)}function _(){m.point=b,d.lineStart()}function w(){m.point=x,d.lineEnd()}function T(t,e){p.push([t,e]),g.point(t,e)}function k(){g.lineStart(),p=[]}function A(){T(p[0][0],p[0][1]),g.lineEnd();var t,e,r,n,i=g.clean(),a=v.result(),o=a.length;if(p.pop(),f.push(p),p=null,o)if(1&i){if((e=(r=a[0]).length-1)>0){for(y||(l.polygonStart(),y=!0),l.lineStart(),t=0;t1&&2&i&&a.push(a.pop().concat(a.shift())),h.push(a.filter(u))}return m}}function u(t){return t.length>1}function c(t,e){return((t=t.x)[0]<0?t[1]-a.or-a.Gg:a.or-t[1])-((e=e.x)[0]<0?e[1]-a.or-a.Gg:a.or-e[1])}},21676:function(t,e,r){\"use strict\";r.d(e,{c:function(){return u}});var n=r(64528),i=r(97208),a=r(32232),o=r(84706),s=1e9,l=-s;function u(t,e,r,u){function c(n,i){return t<=n&&n<=r&&e<=i&&i<=u}function f(n,i,a,o){var s=0,l=0;if(null==n||(s=h(n,a))!==(l=h(i,a))||d(n,i)<0^a>0)do{o.point(0===s||3===s?t:r,s>1?u:e)}while((s=(s+a+4)%4)!==l);else o.point(i[0],i[1])}function h(i,a){return(0,n.a2)(i[0]-t)0?0:3:(0,n.a2)(i[0]-r)0?2:1:(0,n.a2)(i[1]-e)0?1:0:a>0?3:2}function p(t,e){return d(t.x,e.x)}function d(t,e){var r=h(t,1),n=h(e,1);return r!==n?r-n:0===r?e[1]-t[1]:1===r?t[0]-e[0]:2===r?t[1]-e[1]:e[0]-t[0]}return function(n){var h,d,v,g,y,m,x,b,_,w,T,k=n,A=(0,i.c)(),M={point:S,lineStart:function(){M.point=E,d&&d.push(v=[]),w=!0,_=!1,x=b=NaN},lineEnd:function(){h&&(E(g,y),m&&_&&A.rejoin(),h.push(A.result())),M.point=S,_&&k.lineEnd()},polygonStart:function(){k=A,h=[],d=[],T=!0},polygonEnd:function(){var e=function(){for(var e=0,r=0,n=d.length;ru&&(f-i)*(u-a)>(h-a)*(t-i)&&++e:h<=u&&(f-i)*(u-a)<(h-a)*(t-i)&&--e;return e}(),r=T&&e,i=(h=(0,o.Uf)(h)).length;(r||i)&&(n.polygonStart(),r&&(n.lineStart(),f(null,null,1,n),n.lineEnd()),i&&(0,a.c)(h,p,e,f,n),n.polygonEnd()),k=n,h=d=v=null}};function S(t,e){c(t,e)&&k.point(t,e)}function E(n,i){var a=c(n,i);if(d&&v.push([n,i]),w)g=n,y=i,m=a,w=!1,a&&(k.lineStart(),k.point(n,i));else if(a&&_)k.point(n,i);else{var o=[x=Math.max(l,Math.min(s,x)),b=Math.max(l,Math.min(s,b))],f=[n=Math.max(l,Math.min(s,n)),i=Math.max(l,Math.min(s,i))];!function(t,e,r,n,i,a){var o,s=t[0],l=t[1],u=0,c=1,f=e[0]-s,h=e[1]-l;if(o=r-s,f||!(o>0)){if(o/=f,f<0){if(o0){if(o>c)return;o>u&&(u=o)}if(o=i-s,f||!(o<0)){if(o/=f,f<0){if(o>c)return;o>u&&(u=o)}else if(f>0){if(o0)){if(o/=h,h<0){if(o0){if(o>c)return;o>u&&(u=o)}if(o=a-l,h||!(o<0)){if(o/=h,h<0){if(o>c)return;o>u&&(u=o)}else if(h>0){if(o0&&(t[0]=s+u*f,t[1]=l+u*h),c<1&&(e[0]=s+c*f,e[1]=l+c*h),!0}}}}}(o,f,t,e,r,u)?a&&(k.lineStart(),k.point(n,i),T=!1):(_||(k.lineStart(),k.point(o[0],o[1])),k.point(f[0],f[1]),a||k.lineEnd(),T=!1)}x=n,b=i,_=a}return M}}},32232:function(t,e,r){\"use strict\";r.d(e,{c:function(){return o}});var n=r(41860),i=r(64528);function a(t,e,r,n){this.x=t,this.z=e,this.o=r,this.e=n,this.v=!1,this.n=this.p=null}function o(t,e,r,o,l){var u,c,f=[],h=[];if(t.forEach((function(t){if(!((e=t.length-1)<=0)){var e,r,o=t[0],s=t[e];if((0,n.c)(o,s)){if(!o[2]&&!s[2]){for(l.lineStart(),u=0;u=0;--u)l.point((d=p[u])[0],d[1]);else o(g.x,g.p.x,-1,l);g=g.p}p=(g=g.o).z,y=!y}while(!g.v);l.lineEnd()}}}function s(t){if(e=t.length){for(var e,r,n=0,i=t[0];++n0&&(i=S(t[a],t[a-1]))>0&&r<=i&&n<=i&&(r+n-i)*(1-Math.pow((r-n)/i,2))g.Gg})).map(l)).concat((0,F.ik)((0,g.Km)(a/p)*p,i,p).filter((function(t){return(0,g.a2)(t%v)>g.Gg})).map(u))}return m.lines=function(){return x().map((function(t){return{type:\"LineString\",coordinates:t}}))},m.outline=function(){return{type:\"Polygon\",coordinates:[c(n).concat(f(o).slice(1),c(r).reverse().slice(1),f(s).reverse().slice(1))]}},m.extent=function(t){return arguments.length?m.extentMajor(t).extentMinor(t):m.extentMinor()},m.extentMajor=function(t){return arguments.length?(n=+t[0][0],r=+t[1][0],s=+t[0][1],o=+t[1][1],n>r&&(t=n,n=r,r=t),s>o&&(t=s,s=o,o=t),m.precision(y)):[[n,s],[r,o]]},m.extentMinor=function(r){return arguments.length?(e=+r[0][0],t=+r[1][0],a=+r[0][1],i=+r[1][1],e>t&&(r=e,e=t,t=r),a>i&&(r=a,a=i,i=r),m.precision(y)):[[e,a],[t,i]]},m.step=function(t){return arguments.length?m.stepMajor(t).stepMinor(t):m.stepMinor()},m.stepMajor=function(t){return arguments.length?(d=+t[0],v=+t[1],m):[d,v]},m.stepMinor=function(t){return arguments.length?(h=+t[0],p=+t[1],m):[h,p]},m.precision=function(h){return arguments.length?(y=+h,l=B(a,i,90),u=N(e,t,y),c=B(s,o,90),f=N(n,r,y),m):y},m.extentMajor([[-180,-90+g.Gg],[180,90-g.Gg]]).extentMinor([[-180,-80-g.Gg],[180,80+g.Gg]])}function U(){return j()()}var V,q,H,G,W=r(27284),Y=r(7376),X=(0,v.c)(),Z=(0,v.c)(),K={point:y.c,lineStart:y.c,lineEnd:y.c,polygonStart:function(){K.lineStart=J,K.lineEnd=tt},polygonEnd:function(){K.lineStart=K.lineEnd=K.point=y.c,X.add((0,g.a2)(Z)),Z.reset()},result:function(){var t=X/2;return X.reset(),t}};function J(){K.point=$}function $(t,e){K.point=Q,V=H=t,q=G=e}function Q(t,e){Z.add(G*t-H*e),H=t,G=e}function tt(){Q(V,q)}var et,rt,nt,it,at=K,ot=r(73784),st=0,lt=0,ut=0,ct=0,ft=0,ht=0,pt=0,dt=0,vt=0,gt={point:yt,lineStart:mt,lineEnd:_t,polygonStart:function(){gt.lineStart=wt,gt.lineEnd=Tt},polygonEnd:function(){gt.point=yt,gt.lineStart=mt,gt.lineEnd=_t},result:function(){var t=vt?[pt/vt,dt/vt]:ht?[ct/ht,ft/ht]:ut?[st/ut,lt/ut]:[NaN,NaN];return st=lt=ut=ct=ft=ht=pt=dt=vt=0,t}};function yt(t,e){st+=t,lt+=e,++ut}function mt(){gt.point=xt}function xt(t,e){gt.point=bt,yt(nt=t,it=e)}function bt(t,e){var r=t-nt,n=e-it,i=(0,g._I)(r*r+n*n);ct+=i*(nt+t)/2,ft+=i*(it+e)/2,ht+=i,yt(nt=t,it=e)}function _t(){gt.point=yt}function wt(){gt.point=kt}function Tt(){At(et,rt)}function kt(t,e){gt.point=At,yt(et=nt=t,rt=it=e)}function At(t,e){var r=t-nt,n=e-it,i=(0,g._I)(r*r+n*n);ct+=i*(nt+t)/2,ft+=i*(it+e)/2,ht+=i,pt+=(i=it*t-nt*e)*(nt+t),dt+=i*(it+e),vt+=3*i,yt(nt=t,it=e)}var Mt=gt;function St(t){this._context=t}St.prototype={_radius:4.5,pointRadius:function(t){return this._radius=t,this},polygonStart:function(){this._line=0},polygonEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){0===this._line&&this._context.closePath(),this._point=NaN},point:function(t,e){switch(this._point){case 0:this._context.moveTo(t,e),this._point=1;break;case 1:this._context.lineTo(t,e);break;default:this._context.moveTo(t+this._radius,e),this._context.arc(t,e,this._radius,0,g.kD)}},result:y.c};var Et,Lt,Ct,Pt,Ot,It=(0,v.c)(),zt={point:y.c,lineStart:function(){zt.point=Dt},lineEnd:function(){Et&&Rt(Lt,Ct),zt.point=y.c},polygonStart:function(){Et=!0},polygonEnd:function(){Et=null},result:function(){var t=+It;return It.reset(),t}};function Dt(t,e){zt.point=Rt,Lt=Pt=t,Ct=Ot=e}function Rt(t,e){Pt-=t,Ot-=e,It.add((0,g._I)(Pt*Pt+Ot*Ot)),Pt=t,Ot=e}var Ft=zt;function Bt(){this._string=[]}function Nt(t){return\"m0,\"+t+\"a\"+t+\",\"+t+\" 0 1,1 0,\"+-2*t+\"a\"+t+\",\"+t+\" 0 1,1 0,\"+2*t+\"z\"}function jt(t,e){var r,n,i=4.5;function a(t){return t&&(\"function\"==typeof i&&n.pointRadius(+i.apply(this,arguments)),(0,m.c)(t,r(n))),n.result()}return a.area=function(t){return(0,m.c)(t,r(at)),at.result()},a.measure=function(t){return(0,m.c)(t,r(Ft)),Ft.result()},a.bounds=function(t){return(0,m.c)(t,r(ot.c)),ot.c.result()},a.centroid=function(t){return(0,m.c)(t,r(Mt)),Mt.result()},a.projection=function(e){return arguments.length?(r=null==e?(t=null,Y.c):(t=e).stream,a):t},a.context=function(t){return arguments.length?(n=null==t?(e=null,new Bt):new St(e=t),\"function\"!=typeof i&&n.pointRadius(i),a):e},a.pointRadius=function(t){return arguments.length?(i=\"function\"==typeof t?t:(n.pointRadius(+t),+t),a):i},a.projection(t).context(e)}Bt.prototype={_radius:4.5,_circle:Nt(4.5),pointRadius:function(t){return(t=+t)!==this._radius&&(this._radius=t,this._circle=null),this},polygonStart:function(){this._line=0},polygonEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){0===this._line&&this._string.push(\"Z\"),this._point=NaN},point:function(t,e){switch(this._point){case 0:this._string.push(\"M\",t,\",\",e),this._point=1;break;case 1:this._string.push(\"L\",t,\",\",e);break;default:null==this._circle&&(this._circle=Nt(this._radius)),this._string.push(\"M\",t,\",\",e,this._circle)}},result:function(){if(this._string.length){var t=this._string.join(\"\");return this._string=[],t}return null}};var Ut=r(87952);function Vt(t){var e=0,r=g.pi/3,n=(0,Ut.U)(t),i=n(e,r);return i.parallels=function(t){return arguments.length?n(e=t[0]*g.qw,r=t[1]*g.qw):[e*g.oh,r*g.oh]},i}function qt(t,e){var r=(0,g.g$)(t),n=(r+(0,g.g$)(e))/2;if((0,g.a2)(n)=.12&&i<.234&&n>=-.425&&n<-.214?s:i>=.166&&i<.234&&n>=-.214&&n<-.115?l:o).invert(t)},c.stream=function(r){return t&&e===r?t:(n=[o.stream(e=r),s.stream(r),l.stream(r)],i=n.length,t={point:function(t,e){for(var r=-1;++r0?e<-g.or+g.Gg&&(e=-g.or+g.Gg):e>g.or-g.Gg&&(e=g.or-g.Gg);var r=i/(0,g.g3)(te(e),n);return[r*(0,g.g$)(n*t),i-r*(0,g.W8)(n*t)]}return a.invert=function(t,e){var r=i-e,a=(0,g.kq)(n)*(0,g._I)(t*t+r*r),o=(0,g.WE)(t,(0,g.a2)(r))*(0,g.kq)(r);return r*n<0&&(o-=g.pi*(0,g.kq)(t)*(0,g.kq)(r)),[o/n,2*(0,g.MQ)((0,g.g3)(i/a,1/n))-g.or]},a}function re(){return Vt(ee).scale(109.5).parallels([30,30])}Jt.invert=function(t,e){return[t,2*(0,g.MQ)((0,g.oN)(e))-g.or]};var ne=r(69604);function ie(t,e){var r=(0,g.W8)(t),n=t===e?(0,g.g$)(t):(r-(0,g.W8)(e))/(e-t),i=r/n+t;if((0,g.a2)(n)2?t[2]+90:90]):[(t=r())[0],t[1],t[2]-90]},r([0,0,90]).scale(159.155)}xe.invert=(0,me.g)((function(t){return 2*(0,g.MQ)(t)})),_e.invert=function(t,e){return[-e,2*(0,g.MQ)((0,g.oN)(t))-g.or]}},27284:function(t,e,r){\"use strict\";r.d(e,{c:function(){return i}});var n=r(64528);function i(t,e){var r=t[0]*n.qw,i=t[1]*n.qw,a=e[0]*n.qw,o=e[1]*n.qw,s=(0,n.W8)(i),l=(0,n.g$)(i),u=(0,n.W8)(o),c=(0,n.g$)(o),f=s*(0,n.W8)(r),h=s*(0,n.g$)(r),p=u*(0,n.W8)(a),d=u*(0,n.g$)(a),v=2*(0,n.qR)((0,n._I)((0,n.SD)(o-i)+s*u*(0,n.SD)(a-r))),g=(0,n.g$)(v),y=v?function(t){var e=(0,n.g$)(t*=v)/g,r=(0,n.g$)(v-t)/g,i=r*f+e*p,a=r*h+e*d,o=r*l+e*c;return[(0,n.WE)(a,i)*n.oh,(0,n.WE)(o,(0,n._I)(i*i+a*a))*n.oh]}:function(){return[r*n.oh,i*n.oh]};return y.distance=v,y}},64528:function(t,e,r){\"use strict\";r.d(e,{Gg:function(){return n},Km:function(){return v},MQ:function(){return h},SD:function(){return A},W8:function(){return d},WE:function(){return p},Yz:function(){return y},_I:function(){return _},a2:function(){return f},a6:function(){return w},a8:function(){return i},g$:function(){return x},g3:function(){return m},kD:function(){return l},kq:function(){return b},mE:function(){return T},oN:function(){return g},oh:function(){return u},or:function(){return o},pi:function(){return a},qR:function(){return k},qw:function(){return c},wL:function(){return s}});var n=1e-6,i=1e-12,a=Math.PI,o=a/2,s=a/4,l=2*a,u=180/a,c=a/180,f=Math.abs,h=Math.atan,p=Math.atan2,d=Math.cos,v=Math.ceil,g=Math.exp,y=(Math.floor,Math.log),m=Math.pow,x=Math.sin,b=Math.sign||function(t){return t>0?1:t<0?-1:0},_=Math.sqrt,w=Math.tan;function T(t){return t>1?0:t<-1?a:Math.acos(t)}function k(t){return t>1?o:t<-1?-o:Math.asin(t)}function A(t){return(t=x(t/2))*t}},70932:function(t,e,r){\"use strict\";function n(){}r.d(e,{c:function(){return n}})},73784:function(t,e,r){\"use strict\";var n=r(70932),i=1/0,a=i,o=-i,s=o,l={point:function(t,e){to&&(o=t),es&&(s=e)},lineStart:n.c,lineEnd:n.c,polygonStart:n.c,polygonEnd:n.c,result:function(){var t=[[i,a],[o,s]];return o=s=-(a=i=1/0),t}};e.c=l},41860:function(t,e,r){\"use strict\";r.d(e,{c:function(){return i}});var n=r(64528);function i(t,e){return(0,n.a2)(t[0]-e[0])=0?1:-1,L=E*S,C=L>a.pi,P=x*A;if(o.add((0,a.WE)(P*E*(0,a.g$)(L),b*M+P*(0,a.W8)(L))),c+=C?S+E*a.kD:S,C^y>=r^T>=r){var O=(0,i.CW)((0,i.ux)(g),(0,i.ux)(w));(0,i.cJ)(O);var I=(0,i.CW)(u,O);(0,i.cJ)(I);var z=(C^S>=0?-1:1)*(0,a.qR)(I[2]);(n>z||n===z&&(O[0]||O[1]))&&(f+=C^S>=0?1:-1)}}return(c<-a.Gg||c4*e&&y--){var w=o+p,T=s+v,k=u+g,A=(0,l._I)(w*w+T*T+k*k),M=(0,l.qR)(k/=A),S=(0,l.a2)((0,l.a2)(k)-1)e||(0,l.a2)((x*P+b*O)/_-.5)>.3||o*p+s*v+u*g2?t[2]%360*l.qw:0,V()):[L*l.oh,C*l.oh,P*l.oh]},j.angle=function(t){return arguments.length?(O=t%360*l.qw,V()):O*l.oh},j.reflectX=function(t){return arguments.length?(I=t?-1:1,V()):I<0},j.reflectY=function(t){return arguments.length?(z=t?-1:1,V()):z<0},j.precision=function(t){return arguments.length?(x=v(b,N=t*t),q()):(0,l._I)(N)},j.fitExtent=function(t,e){return(0,f.QX)(j,t,e)},j.fitSize=function(t,e){return(0,f.UV)(j,t,e)},j.fitWidth=function(t,e){return(0,f.Qx)(j,t,e)},j.fitHeight=function(t,e){return(0,f.OW)(j,t,e)},function(){return e=t.apply(this,arguments),j.invert=e.invert&&U,V()}}},47984:function(t,e,r){\"use strict\";r.d(e,{c:function(){return o},g:function(){return a}});var n=r(87952),i=r(64528);function a(t,e){var r=e*e,n=r*r;return[t*(.8707-.131979*r+n*(n*(.003971*r-.001529*n)-.013791)),e*(1.007226+r*(.015085+n*(.028874*r-.044475-.005916*n)))]}function o(){return(0,n.c)(a).scale(175.295)}a.invert=function(t,e){var r,n=e,a=25;do{var o=n*n,s=o*o;n-=r=(n*(1.007226+o*(.015085+s*(.028874*o-.044475-.005916*s)))-e)/(1.007226+o*(.045255+s*(.259866*o-.311325-.005916*11*s)))}while((0,i.a2)(r)>i.Gg&&--a>0);return[t/(.8707+(o=n*n)*(o*(o*o*o*(.003971-.001529*o)-.013791)-.131979)),n]}},4888:function(t,e,r){\"use strict\";r.d(e,{c:function(){return s},t:function(){return o}});var n=r(64528),i=r(62280),a=r(87952);function o(t,e){return[(0,n.W8)(e)*(0,n.g$)(t),(0,n.g$)(e)]}function s(){return(0,a.c)(o).scale(249.5).clipAngle(90+n.Gg)}o.invert=(0,i.g)(n.qR)},92992:function(t,e,r){\"use strict\";r.d(e,{O:function(){return o},c:function(){return c}});var n=r(68120),i=r(64528);function a(t,e){return[(0,i.a2)(t)>i.pi?t+Math.round(-t/i.kD)*i.kD:t,e]}function o(t,e,r){return(t%=i.kD)?e||r?(0,n.c)(l(t),u(e,r)):l(t):e||r?u(e,r):a}function s(t){return function(e,r){return[(e+=t)>i.pi?e-i.kD:e<-i.pi?e+i.kD:e,r]}}function l(t){var e=s(t);return e.invert=s(-t),e}function u(t,e){var r=(0,i.W8)(t),n=(0,i.g$)(t),a=(0,i.W8)(e),o=(0,i.g$)(e);function s(t,e){var s=(0,i.W8)(e),l=(0,i.W8)(t)*s,u=(0,i.g$)(t)*s,c=(0,i.g$)(e),f=c*r+l*n;return[(0,i.WE)(u*a-f*o,l*r-c*n),(0,i.qR)(f*a+u*o)]}return s.invert=function(t,e){var s=(0,i.W8)(e),l=(0,i.W8)(t)*s,u=(0,i.g$)(t)*s,c=(0,i.g$)(e),f=c*a-u*o;return[(0,i.WE)(u*a+c*o,l*r+f*n),(0,i.qR)(f*r-l*n)]},s}function c(t){function e(e){return(e=t(e[0]*i.qw,e[1]*i.qw))[0]*=i.oh,e[1]*=i.oh,e}return t=o(t[0]*i.qw,t[1]*i.qw,t.length>2?t[2]*i.qw:0),e.invert=function(e){return(e=t.invert(e[0]*i.qw,e[1]*i.qw))[0]*=i.oh,e[1]*=i.oh,e},e}a.invert=a},16016:function(t,e,r){\"use strict\";function n(t,e){t&&a.hasOwnProperty(t.type)&&a[t.type](t,e)}r.d(e,{c:function(){return l}});var i={Feature:function(t,e){n(t.geometry,e)},FeatureCollection:function(t,e){for(var r=t.features,i=-1,a=r.length;++i=0;)e+=r[n].value;else e=1;t.value=e}function l(t,e){var r,n,i,a,o,s=new h(t),l=+t.value&&(s.value=t.value),c=[s];for(null==e&&(e=u);r=c.pop();)if(l&&(r.value=+r.data.value),(i=e(r.data))&&(o=i.length))for(r.children=new Array(o),a=o-1;a>=0;--a)c.push(n=r.children[a]=new h(i[a])),n.parent=r,n.depth=r.depth+1;return s.eachBefore(f)}function u(t){return t.children}function c(t){t.data=t.data.data}function f(t){var e=0;do{t.height=e}while((t=t.parent)&&t.height<++e)}function h(t){this.data=t,this.depth=this.height=0,this.parent=null}r.r(e),r.d(e,{cluster:function(){return o},hierarchy:function(){return l},pack:function(){return O},packEnclose:function(){return d},packSiblings:function(){return S},partition:function(){return B},stratify:function(){return H},tree:function(){return J},treemap:function(){return rt},treemapBinary:function(){return nt},treemapDice:function(){return F},treemapResquarify:function(){return at},treemapSlice:function(){return $},treemapSliceDice:function(){return it},treemapSquarify:function(){return et}}),h.prototype=l.prototype={constructor:h,count:function(){return this.eachAfter(s)},each:function(t){var e,r,n,i,a=this,o=[a];do{for(e=o.reverse(),o=[];a=e.pop();)if(t(a),r=a.children)for(n=0,i=r.length;n=0;--r)i.push(e[r]);return this},sum:function(t){return this.eachAfter((function(e){for(var r=+t(e.data)||0,n=e.children,i=n&&n.length;--i>=0;)r+=n[i].value;e.value=r}))},sort:function(t){return this.eachBefore((function(e){e.children&&e.children.sort(t)}))},path:function(t){for(var e=this,r=function(t,e){if(t===e)return t;var r=t.ancestors(),n=e.ancestors(),i=null;for(t=r.pop(),e=n.pop();t===e;)i=t,t=r.pop(),e=n.pop();return i}(e,t),n=[e];e!==r;)e=e.parent,n.push(e);for(var i=n.length;t!==r;)n.splice(i,0,t),t=t.parent;return n},ancestors:function(){for(var t=this,e=[t];t=t.parent;)e.push(t);return e},descendants:function(){var t=[];return this.each((function(e){t.push(e)})),t},leaves:function(){var t=[];return this.eachBefore((function(e){e.children||t.push(e)})),t},links:function(){var t=this,e=[];return t.each((function(r){r!==t&&e.push({source:r.parent,target:r})})),e},copy:function(){return l(this).eachBefore(c)}};var p=Array.prototype.slice;function d(t){for(var e,r,n=0,i=(t=function(t){for(var e,r,n=t.length;n;)r=Math.random()*n--|0,e=t[n],t[n]=t[r],t[r]=e;return t}(p.call(t))).length,a=[];n0&&r*r>n*n+i*i}function m(t,e){for(var r=0;r(o*=o)?(n=(u+o-i)/(2*u),a=Math.sqrt(Math.max(0,o/u-n*n)),r.x=t.x-n*s-a*l,r.y=t.y-n*l+a*s):(n=(u+i-o)/(2*u),a=Math.sqrt(Math.max(0,i/u-n*n)),r.x=e.x+n*s-a*l,r.y=e.y+n*l+a*s)):(r.x=e.x+r.r,r.y=e.y)}function T(t,e){var r=t.r+e.r-1e-6,n=e.x-t.x,i=e.y-t.y;return r>0&&r*r>n*n+i*i}function k(t){var e=t._,r=t.next._,n=e.r+r.r,i=(e.x*r.r+r.x*e.r)/n,a=(e.y*r.r+r.y*e.r)/n;return i*i+a*a}function A(t){this._=t,this.next=null,this.previous=null}function M(t){if(!(i=t.length))return 0;var e,r,n,i,a,o,s,l,u,c,f;if((e=t[0]).x=0,e.y=0,!(i>1))return e.r;if(r=t[1],e.x=-r.r,r.x=e.r,r.y=0,!(i>2))return e.r+r.r;w(r,e,n=t[2]),e=new A(e),r=new A(r),n=new A(n),e.next=n.previous=r,r.next=e.previous=n,n.next=r.previous=e;t:for(s=3;s0)throw new Error(\"cycle\");return a}return r.id=function(e){return arguments.length?(t=E(e),r):t},r.parentId=function(t){return arguments.length?(e=E(t),r):e},r}function G(t,e){return t.parent===e.parent?1:2}function W(t){var e=t.children;return e?e[0]:t.t}function Y(t){var e=t.children;return e?e[e.length-1]:t.t}function X(t,e,r){var n=r/(e.i-t.i);e.c-=n,e.s+=r,t.c+=n,e.z+=r,e.m+=r}function Z(t,e,r){return t.a.parent===e.parent?t.a:r}function K(t,e){this._=t,this.parent=null,this.children=null,this.A=null,this.a=this,this.z=0,this.m=0,this.c=0,this.s=0,this.t=null,this.i=e}function J(){var t=G,e=1,r=1,n=null;function i(i){var l=function(t){for(var e,r,n,i,a,o=new K(t,0),s=[o];e=s.pop();)if(n=e._.children)for(e.children=new Array(a=n.length),i=a-1;i>=0;--i)s.push(r=e.children[i]=new K(n[i],i)),r.parent=e;return(o.parent=new K(null,0)).children=[o],o}(i);if(l.eachAfter(a),l.parent.m=-l.z,l.eachBefore(o),n)i.eachBefore(s);else{var u=i,c=i,f=i;i.eachBefore((function(t){t.xc.x&&(c=t),t.depth>f.depth&&(f=t)}));var h=u===c?1:t(u,c)/2,p=h-u.x,d=e/(c.x+h+p),v=r/(f.depth||1);i.eachBefore((function(t){t.x=(t.x+p)*d,t.y=t.depth*v}))}return i}function a(e){var r=e.children,n=e.parent.children,i=e.i?n[e.i-1]:null;if(r){!function(t){for(var e,r=0,n=0,i=t.children,a=i.length;--a>=0;)(e=i[a]).z+=r,e.m+=r,r+=e.s+(n+=e.c)}(e);var a=(r[0].z+r[r.length-1].z)/2;i?(e.z=i.z+t(e._,i._),e.m=e.z-a):e.z=a}else i&&(e.z=i.z+t(e._,i._));e.parent.A=function(e,r,n){if(r){for(var i,a=e,o=e,s=r,l=a.parent.children[0],u=a.m,c=o.m,f=s.m,h=l.m;s=Y(s),a=W(a),s&&a;)l=W(l),(o=Y(o)).a=e,(i=s.z+f-a.z-u+t(s._,a._))>0&&(X(Z(s,e,n),e,i),u+=i,c+=i),f+=s.m,u+=a.m,h+=l.m,c+=o.m;s&&!Y(o)&&(o.t=s,o.m+=f-c),a&&!W(l)&&(l.t=a,l.m+=u-h,n=e)}return n}(e,i,e.parent.A||n[0])}function o(t){t._.x=t.z+t.parent.m,t.m+=t.parent.m}function s(t){t.x*=e,t.y=t.depth*r}return i.separation=function(e){return arguments.length?(t=e,i):t},i.size=function(t){return arguments.length?(n=!1,e=+t[0],r=+t[1],i):n?null:[e,r]},i.nodeSize=function(t){return arguments.length?(n=!0,e=+t[0],r=+t[1],i):n?[e,r]:null},i}function $(t,e,r,n,i){for(var a,o=t.children,s=-1,l=o.length,u=t.value&&(i-r)/t.value;++sh&&(h=s),g=c*c*v,(p=Math.max(h/g,g/f))>d){c-=s;break}d=p}y.push(o={value:c,dice:l1?e:1)},r}(Q);function rt(){var t=et,e=!1,r=1,n=1,i=[0],a=L,o=L,s=L,l=L,u=L;function c(t){return t.x0=t.y0=0,t.x1=r,t.y1=n,t.eachBefore(f),i=[0],e&&t.eachBefore(R),t}function f(e){var r=i[e.depth],n=e.x0+r,c=e.y0+r,f=e.x1-r,h=e.y1-r;f=r-1){var c=s[e];return c.x0=i,c.y0=a,c.x1=o,void(c.y1=l)}for(var f=u[e],h=n/2+f,p=e+1,d=r-1;p>>1;u[v]l-a){var m=(i*y+o*g)/n;t(e,p,g,i,a,m,l),t(p,r,y,m,a,o,l)}else{var x=(a*y+l*g)/n;t(e,p,g,i,a,o,x),t(p,r,y,i,x,o,l)}}(0,l,t.value,e,r,n,i)}function it(t,e,r,n,i){(1&t.depth?$:F)(t,e,r,n,i)}var at=function t(e){function r(t,r,n,i,a){if((o=t._squarify)&&o.ratio===e)for(var o,s,l,u,c,f=-1,h=o.length,p=t.value;++f1?e:1)},r}(Q)},10132:function(t,e,r){\"use strict\";r.d(e,{ak:function(){return y}});var n=Math.PI,i=2*n,a=1e-6,o=i-a;function s(){this._x0=this._y0=this._x1=this._y1=null,this._=\"\"}function l(){return new s}s.prototype=l.prototype={constructor:s,moveTo:function(t,e){this._+=\"M\"+(this._x0=this._x1=+t)+\",\"+(this._y0=this._y1=+e)},closePath:function(){null!==this._x1&&(this._x1=this._x0,this._y1=this._y0,this._+=\"Z\")},lineTo:function(t,e){this._+=\"L\"+(this._x1=+t)+\",\"+(this._y1=+e)},quadraticCurveTo:function(t,e,r,n){this._+=\"Q\"+ +t+\",\"+ +e+\",\"+(this._x1=+r)+\",\"+(this._y1=+n)},bezierCurveTo:function(t,e,r,n,i,a){this._+=\"C\"+ +t+\",\"+ +e+\",\"+ +r+\",\"+ +n+\",\"+(this._x1=+i)+\",\"+(this._y1=+a)},arcTo:function(t,e,r,i,o){t=+t,e=+e,r=+r,i=+i,o=+o;var s=this._x1,l=this._y1,u=r-t,c=i-e,f=s-t,h=l-e,p=f*f+h*h;if(o<0)throw new Error(\"negative radius: \"+o);if(null===this._x1)this._+=\"M\"+(this._x1=t)+\",\"+(this._y1=e);else if(p>a)if(Math.abs(h*u-c*f)>a&&o){var d=r-s,v=i-l,g=u*u+c*c,y=d*d+v*v,m=Math.sqrt(g),x=Math.sqrt(p),b=o*Math.tan((n-Math.acos((g+p-y)/(2*m*x)))/2),_=b/x,w=b/m;Math.abs(_-1)>a&&(this._+=\"L\"+(t+_*f)+\",\"+(e+_*h)),this._+=\"A\"+o+\",\"+o+\",0,0,\"+ +(h*d>f*v)+\",\"+(this._x1=t+w*u)+\",\"+(this._y1=e+w*c)}else this._+=\"L\"+(this._x1=t)+\",\"+(this._y1=e)},arc:function(t,e,r,s,l,u){t=+t,e=+e,u=!!u;var c=(r=+r)*Math.cos(s),f=r*Math.sin(s),h=t+c,p=e+f,d=1^u,v=u?s-l:l-s;if(r<0)throw new Error(\"negative radius: \"+r);null===this._x1?this._+=\"M\"+h+\",\"+p:(Math.abs(this._x1-h)>a||Math.abs(this._y1-p)>a)&&(this._+=\"L\"+h+\",\"+p),r&&(v<0&&(v=v%i+i),v>o?this._+=\"A\"+r+\",\"+r+\",0,1,\"+d+\",\"+(t-c)+\",\"+(e-f)+\"A\"+r+\",\"+r+\",0,1,\"+d+\",\"+(this._x1=h)+\",\"+(this._y1=p):v>a&&(this._+=\"A\"+r+\",\"+r+\",0,\"+ +(v>=n)+\",\"+d+\",\"+(this._x1=t+r*Math.cos(l))+\",\"+(this._y1=e+r*Math.sin(l))))},rect:function(t,e,r,n){this._+=\"M\"+(this._x0=this._x1=+t)+\",\"+(this._y0=this._y1=+e)+\"h\"+ +r+\"v\"+ +n+\"h\"+-r+\"Z\"},toString:function(){return this._}};var u=l,c=Array.prototype.slice;function f(t){return function(){return t}}function h(t){return t[0]}function p(t){return t[1]}function d(t){return t.source}function v(t){return t.target}function g(t,e,r,n,i){t.moveTo(e,r),t.bezierCurveTo(e=(e+n)/2,r,e,i,n,i)}function y(){return function(t){var e=d,r=v,n=h,i=p,a=null;function o(){var o,s=c.call(arguments),l=e.apply(this,s),f=r.apply(this,s);if(a||(a=o=u()),t(a,+n.apply(this,(s[0]=l,s)),+i.apply(this,s),+n.apply(this,(s[0]=f,s)),+i.apply(this,s)),o)return a=null,o+\"\"||null}return o.source=function(t){return arguments.length?(e=t,o):e},o.target=function(t){return arguments.length?(r=t,o):r},o.x=function(t){return arguments.length?(n=\"function\"==typeof t?t:f(+t),o):n},o.y=function(t){return arguments.length?(i=\"function\"==typeof t?t:f(+t),o):i},o.context=function(t){return arguments.length?(a=null==t?null:t,o):a},o}(g)}},94336:function(t,e,r){\"use strict\";r.d(e,{Yn:function(){return d},m_:function(){return h},E9:function(){return v}});var n=r(8208),i=r(58931),a=r(46192),o=r(68936),s=r(32171),l=r(53528);function u(t){if(0<=t.y&&t.y<100){var e=new Date(-1,t.m,t.d,t.H,t.M,t.S,t.L);return e.setFullYear(t.y),e}return new Date(t.y,t.m,t.d,t.H,t.M,t.S,t.L)}function c(t){if(0<=t.y&&t.y<100){var e=new Date(Date.UTC(-1,t.m,t.d,t.H,t.M,t.S,t.L));return e.setUTCFullYear(t.y),e}return new Date(Date.UTC(t.y,t.m,t.d,t.H,t.M,t.S,t.L))}function f(t,e,r){return{y:t,m:e,d:r,H:0,M:0,S:0,L:0}}function h(t){var e=t.dateTime,r=t.date,s=t.time,l=t.periods,h=t.days,p=t.shortDays,d=t.months,v=t.shortMonths,y=w(l),m=T(l),x=w(h),b=T(h),_=w(p),St=T(p),Et=w(d),Lt=T(d),Ct=w(v),Pt=T(v),Ot={a:function(t){return p[t.getDay()]},A:function(t){return h[t.getDay()]},b:function(t){return v[t.getMonth()]},B:function(t){return d[t.getMonth()]},c:null,d:H,e:H,f:Z,H:G,I:W,j:Y,L:X,m:K,M:J,p:function(t){return l[+(t.getHours()>=12)]},q:function(t){return 1+~~(t.getMonth()/3)},Q:At,s:Mt,S:$,u:Q,U:tt,V:et,w:rt,W:nt,x:null,X:null,y:it,Y:at,Z:ot,\"%\":kt},It={a:function(t){return p[t.getUTCDay()]},A:function(t){return h[t.getUTCDay()]},b:function(t){return v[t.getUTCMonth()]},B:function(t){return d[t.getUTCMonth()]},c:null,d:st,e:st,f:ht,H:lt,I:ut,j:ct,L:ft,m:pt,M:dt,p:function(t){return l[+(t.getUTCHours()>=12)]},q:function(t){return 1+~~(t.getUTCMonth()/3)},Q:At,s:Mt,S:vt,u:gt,U:yt,V:mt,w:xt,W:bt,x:null,X:null,y:_t,Y:wt,Z:Tt,\"%\":kt},zt={a:function(t,e,r){var n=_.exec(e.slice(r));return n?(t.w=St[n[0].toLowerCase()],r+n[0].length):-1},A:function(t,e,r){var n=x.exec(e.slice(r));return n?(t.w=b[n[0].toLowerCase()],r+n[0].length):-1},b:function(t,e,r){var n=Ct.exec(e.slice(r));return n?(t.m=Pt[n[0].toLowerCase()],r+n[0].length):-1},B:function(t,e,r){var n=Et.exec(e.slice(r));return n?(t.m=Lt[n[0].toLowerCase()],r+n[0].length):-1},c:function(t,r,n){return Ft(t,e,r,n)},d:z,e:z,f:j,H:R,I:R,j:D,L:N,m:I,M:F,p:function(t,e,r){var n=y.exec(e.slice(r));return n?(t.p=m[n[0].toLowerCase()],r+n[0].length):-1},q:O,Q:V,s:q,S:B,u:A,U:M,V:S,w:k,W:E,x:function(t,e,n){return Ft(t,r,e,n)},X:function(t,e,r){return Ft(t,s,e,r)},y:C,Y:L,Z:P,\"%\":U};function Dt(t,e){return function(r){var n,i,a,o=[],s=-1,l=0,u=t.length;for(r instanceof Date||(r=new Date(+r));++s53)return null;\"w\"in h||(h.w=1),\"Z\"in h?(l=(s=c(f(h.y,0,1))).getUTCDay(),s=l>4||0===l?n.ot.ceil(s):(0,n.ot)(s),s=i.c.offset(s,7*(h.V-1)),h.y=s.getUTCFullYear(),h.m=s.getUTCMonth(),h.d=s.getUTCDate()+(h.w+6)%7):(l=(s=u(f(h.y,0,1))).getDay(),s=l>4||0===l?a.qT.ceil(s):(0,a.qT)(s),s=o.c.offset(s,7*(h.V-1)),h.y=s.getFullYear(),h.m=s.getMonth(),h.d=s.getDate()+(h.w+6)%7)}else(\"W\"in h||\"U\"in h)&&(\"w\"in h||(h.w=\"u\"in h?h.u%7:\"W\"in h?1:0),l=\"Z\"in h?c(f(h.y,0,1)).getUTCDay():u(f(h.y,0,1)).getDay(),h.m=0,h.d=\"W\"in h?(h.w+6)%7+7*h.W-(l+5)%7:h.w+7*h.U-(l+6)%7);return\"Z\"in h?(h.H+=h.Z/100|0,h.M+=h.Z%100,c(h)):u(h)}}function Ft(t,e,r,n){for(var i,a,o=0,s=e.length,l=r.length;o=l)return-1;if(37===(i=e.charCodeAt(o++))){if(i=e.charAt(o++),!(a=zt[i in g?e.charAt(o++):i])||(n=a(t,r,n))<0)return-1}else if(i!=r.charCodeAt(n++))return-1}return n}return Ot.x=Dt(r,Ot),Ot.X=Dt(s,Ot),Ot.c=Dt(e,Ot),It.x=Dt(r,It),It.X=Dt(s,It),It.c=Dt(e,It),{format:function(t){var e=Dt(t+=\"\",Ot);return e.toString=function(){return t},e},parse:function(t){var e=Rt(t+=\"\",!1);return e.toString=function(){return t},e},utcFormat:function(t){var e=Dt(t+=\"\",It);return e.toString=function(){return t},e},utcParse:function(t){var e=Rt(t+=\"\",!0);return e.toString=function(){return t},e}}}var p,d,v,g={\"-\":\"\",_:\" \",0:\"0\"},y=/^\\s*\\d+/,m=/^%/,x=/[\\\\^$*+?|[\\]().{}]/g;function b(t,e,r){var n=t<0?\"-\":\"\",i=(n?-t:t)+\"\",a=i.length;return n+(a68?1900:2e3),r+n[0].length):-1}function P(t,e,r){var n=/^(Z)|([+-]\\d\\d)(?::?(\\d\\d))?/.exec(e.slice(r,r+6));return n?(t.Z=n[1]?0:-(n[2]+(n[3]||\"00\")),r+n[0].length):-1}function O(t,e,r){var n=y.exec(e.slice(r,r+1));return n?(t.q=3*n[0]-3,r+n[0].length):-1}function I(t,e,r){var n=y.exec(e.slice(r,r+2));return n?(t.m=n[0]-1,r+n[0].length):-1}function z(t,e,r){var n=y.exec(e.slice(r,r+2));return n?(t.d=+n[0],r+n[0].length):-1}function D(t,e,r){var n=y.exec(e.slice(r,r+3));return n?(t.m=0,t.d=+n[0],r+n[0].length):-1}function R(t,e,r){var n=y.exec(e.slice(r,r+2));return n?(t.H=+n[0],r+n[0].length):-1}function F(t,e,r){var n=y.exec(e.slice(r,r+2));return n?(t.M=+n[0],r+n[0].length):-1}function B(t,e,r){var n=y.exec(e.slice(r,r+2));return n?(t.S=+n[0],r+n[0].length):-1}function N(t,e,r){var n=y.exec(e.slice(r,r+3));return n?(t.L=+n[0],r+n[0].length):-1}function j(t,e,r){var n=y.exec(e.slice(r,r+6));return n?(t.L=Math.floor(n[0]/1e3),r+n[0].length):-1}function U(t,e,r){var n=m.exec(e.slice(r,r+1));return n?r+n[0].length:-1}function V(t,e,r){var n=y.exec(e.slice(r));return n?(t.Q=+n[0],r+n[0].length):-1}function q(t,e,r){var n=y.exec(e.slice(r));return n?(t.s=+n[0],r+n[0].length):-1}function H(t,e){return b(t.getDate(),e,2)}function G(t,e){return b(t.getHours(),e,2)}function W(t,e){return b(t.getHours()%12||12,e,2)}function Y(t,e){return b(1+o.c.count((0,s.c)(t),t),e,3)}function X(t,e){return b(t.getMilliseconds(),e,3)}function Z(t,e){return X(t,e)+\"000\"}function K(t,e){return b(t.getMonth()+1,e,2)}function J(t,e){return b(t.getMinutes(),e,2)}function $(t,e){return b(t.getSeconds(),e,2)}function Q(t){var e=t.getDay();return 0===e?7:e}function tt(t,e){return b(a.uU.count((0,s.c)(t)-1,t),e,2)}function et(t,e){var r=t.getDay();return t=r>=4||0===r?(0,a.kD)(t):a.kD.ceil(t),b(a.kD.count((0,s.c)(t),t)+(4===(0,s.c)(t).getDay()),e,2)}function rt(t){return t.getDay()}function nt(t,e){return b(a.qT.count((0,s.c)(t)-1,t),e,2)}function it(t,e){return b(t.getFullYear()%100,e,2)}function at(t,e){return b(t.getFullYear()%1e4,e,4)}function ot(t){var e=t.getTimezoneOffset();return(e>0?\"-\":(e*=-1,\"+\"))+b(e/60|0,\"0\",2)+b(e%60,\"0\",2)}function st(t,e){return b(t.getUTCDate(),e,2)}function lt(t,e){return b(t.getUTCHours(),e,2)}function ut(t,e){return b(t.getUTCHours()%12||12,e,2)}function ct(t,e){return b(1+i.c.count((0,l.c)(t),t),e,3)}function ft(t,e){return b(t.getUTCMilliseconds(),e,3)}function ht(t,e){return ft(t,e)+\"000\"}function pt(t,e){return b(t.getUTCMonth()+1,e,2)}function dt(t,e){return b(t.getUTCMinutes(),e,2)}function vt(t,e){return b(t.getUTCSeconds(),e,2)}function gt(t){var e=t.getUTCDay();return 0===e?7:e}function yt(t,e){return b(n.EV.count((0,l.c)(t)-1,t),e,2)}function mt(t,e){var r=t.getUTCDay();return t=r>=4||0===r?(0,n.yA)(t):n.yA.ceil(t),b(n.yA.count((0,l.c)(t),t)+(4===(0,l.c)(t).getUTCDay()),e,2)}function xt(t){return t.getUTCDay()}function bt(t,e){return b(n.ot.count((0,l.c)(t)-1,t),e,2)}function _t(t,e){return b(t.getUTCFullYear()%100,e,2)}function wt(t,e){return b(t.getUTCFullYear()%1e4,e,4)}function Tt(){return\"+0000\"}function kt(){return\"%\"}function At(t){return+t}function Mt(t){return Math.floor(+t/1e3)}p=h({dateTime:\"%x, %X\",date:\"%-m/%-d/%Y\",time:\"%-I:%M:%S %p\",periods:[\"AM\",\"PM\"],days:[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],shortDays:[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],months:[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"],shortMonths:[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"]}),d=p.format,p.parse,v=p.utcFormat,p.utcParse},68936:function(t,e,r){\"use strict\";r.d(e,{m:function(){return o}});var n=r(81628),i=r(69792),a=(0,n.c)((function(t){t.setHours(0,0,0,0)}),(function(t,e){t.setDate(t.getDate()+e)}),(function(t,e){return(e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*i.iy)/i.SK}),(function(t){return t.getDate()-1}));e.c=a;var o=a.range},69792:function(t,e,r){\"use strict\";r.d(e,{KK:function(){return s},SK:function(){return o},cg:function(){return a},iy:function(){return i},yc:function(){return n}});var n=1e3,i=6e4,a=36e5,o=864e5,s=6048e5},73220:function(t,e,r){\"use strict\";r.r(e),r.d(e,{timeDay:function(){return y.c},timeDays:function(){return y.m},timeFriday:function(){return m.iB},timeFridays:function(){return m.sJ},timeHour:function(){return v},timeHours:function(){return g},timeInterval:function(){return n.c},timeMillisecond:function(){return a},timeMilliseconds:function(){return o},timeMinute:function(){return h},timeMinutes:function(){return p},timeMonday:function(){return m.qT},timeMondays:function(){return m.QP},timeMonth:function(){return b},timeMonths:function(){return _},timeSaturday:function(){return m.Wc},timeSaturdays:function(){return m.aI},timeSecond:function(){return u},timeSeconds:function(){return c},timeSunday:function(){return m.uU},timeSundays:function(){return m.Ab},timeThursday:function(){return m.kD},timeThursdays:function(){return m.eC},timeTuesday:function(){return m.Mf},timeTuesdays:function(){return m.Oc},timeWednesday:function(){return m.eg},timeWednesdays:function(){return m.sn},timeWeek:function(){return m.uU},timeWeeks:function(){return m.Ab},timeYear:function(){return w.c},timeYears:function(){return w.Q},utcDay:function(){return L.c},utcDays:function(){return L.o},utcFriday:function(){return C.od},utcFridays:function(){return C.iG},utcHour:function(){return S},utcHours:function(){return E},utcMillisecond:function(){return a},utcMilliseconds:function(){return o},utcMinute:function(){return k},utcMinutes:function(){return A},utcMonday:function(){return C.ot},utcMondays:function(){return C.iO},utcMonth:function(){return O},utcMonths:function(){return I},utcSaturday:function(){return C.Ad},utcSaturdays:function(){return C.K8},utcSecond:function(){return u},utcSeconds:function(){return c},utcSunday:function(){return C.EV},utcSundays:function(){return C.Wq},utcThursday:function(){return C.yA},utcThursdays:function(){return C.ob},utcTuesday:function(){return C.sG},utcTuesdays:function(){return C.kl},utcWednesday:function(){return C._6},utcWednesdays:function(){return C.W_},utcWeek:function(){return C.EV},utcWeeks:function(){return C.Wq},utcYear:function(){return z.c},utcYears:function(){return z.i}});var n=r(81628),i=(0,n.c)((function(){}),(function(t,e){t.setTime(+t+e)}),(function(t,e){return e-t}));i.every=function(t){return t=Math.floor(t),isFinite(t)&&t>0?t>1?(0,n.c)((function(e){e.setTime(Math.floor(e/t)*t)}),(function(e,r){e.setTime(+e+r*t)}),(function(e,r){return(r-e)/t})):i:null};var a=i,o=i.range,s=r(69792),l=(0,n.c)((function(t){t.setTime(t-t.getMilliseconds())}),(function(t,e){t.setTime(+t+e*s.yc)}),(function(t,e){return(e-t)/s.yc}),(function(t){return t.getUTCSeconds()})),u=l,c=l.range,f=(0,n.c)((function(t){t.setTime(t-t.getMilliseconds()-t.getSeconds()*s.yc)}),(function(t,e){t.setTime(+t+e*s.iy)}),(function(t,e){return(e-t)/s.iy}),(function(t){return t.getMinutes()})),h=f,p=f.range,d=(0,n.c)((function(t){t.setTime(t-t.getMilliseconds()-t.getSeconds()*s.yc-t.getMinutes()*s.iy)}),(function(t,e){t.setTime(+t+e*s.cg)}),(function(t,e){return(e-t)/s.cg}),(function(t){return t.getHours()})),v=d,g=d.range,y=r(68936),m=r(46192),x=(0,n.c)((function(t){t.setDate(1),t.setHours(0,0,0,0)}),(function(t,e){t.setMonth(t.getMonth()+e)}),(function(t,e){return e.getMonth()-t.getMonth()+12*(e.getFullYear()-t.getFullYear())}),(function(t){return t.getMonth()})),b=x,_=x.range,w=r(32171),T=(0,n.c)((function(t){t.setUTCSeconds(0,0)}),(function(t,e){t.setTime(+t+e*s.iy)}),(function(t,e){return(e-t)/s.iy}),(function(t){return t.getUTCMinutes()})),k=T,A=T.range,M=(0,n.c)((function(t){t.setUTCMinutes(0,0,0)}),(function(t,e){t.setTime(+t+e*s.cg)}),(function(t,e){return(e-t)/s.cg}),(function(t){return t.getUTCHours()})),S=M,E=M.range,L=r(58931),C=r(8208),P=(0,n.c)((function(t){t.setUTCDate(1),t.setUTCHours(0,0,0,0)}),(function(t,e){t.setUTCMonth(t.getUTCMonth()+e)}),(function(t,e){return e.getUTCMonth()-t.getUTCMonth()+12*(e.getUTCFullYear()-t.getUTCFullYear())}),(function(t){return t.getUTCMonth()})),O=P,I=P.range,z=r(53528)},81628:function(t,e,r){\"use strict\";r.d(e,{c:function(){return a}});var n=new Date,i=new Date;function a(t,e,r,o){function s(e){return t(e=0===arguments.length?new Date:new Date(+e)),e}return s.floor=function(e){return t(e=new Date(+e)),e},s.ceil=function(r){return t(r=new Date(r-1)),e(r,1),t(r),r},s.round=function(t){var e=s(t),r=s.ceil(t);return t-e0))return o;do{o.push(a=new Date(+r)),e(r,i),t(r)}while(a=e)for(;t(e),!r(e);)e.setTime(e-1)}),(function(t,n){if(t>=t)if(n<0)for(;++n<=0;)for(;e(t,-1),!r(t););else for(;--n>=0;)for(;e(t,1),!r(t););}))},r&&(s.count=function(e,a){return n.setTime(+e),i.setTime(+a),t(n),t(i),Math.floor(r(n,i))},s.every=function(t){return t=Math.floor(t),isFinite(t)&&t>0?t>1?s.filter(o?function(e){return o(e)%t==0}:function(e){return s.count(0,e)%t==0}):s:null}),s}},58931:function(t,e,r){\"use strict\";r.d(e,{o:function(){return o}});var n=r(81628),i=r(69792),a=(0,n.c)((function(t){t.setUTCHours(0,0,0,0)}),(function(t,e){t.setUTCDate(t.getUTCDate()+e)}),(function(t,e){return(e-t)/i.SK}),(function(t){return t.getUTCDate()-1}));e.c=a;var o=a.range},8208:function(t,e,r){\"use strict\";r.d(e,{Ad:function(){return h},EV:function(){return o},K8:function(){return x},W_:function(){return g},Wq:function(){return p},_6:function(){return u},iG:function(){return m},iO:function(){return d},kl:function(){return v},ob:function(){return y},od:function(){return f},ot:function(){return s},sG:function(){return l},yA:function(){return c}});var n=r(81628),i=r(69792);function a(t){return(0,n.c)((function(e){e.setUTCDate(e.getUTCDate()-(e.getUTCDay()+7-t)%7),e.setUTCHours(0,0,0,0)}),(function(t,e){t.setUTCDate(t.getUTCDate()+7*e)}),(function(t,e){return(e-t)/i.KK}))}var o=a(0),s=a(1),l=a(2),u=a(3),c=a(4),f=a(5),h=a(6),p=o.range,d=s.range,v=l.range,g=u.range,y=c.range,m=f.range,x=h.range},53528:function(t,e,r){\"use strict\";r.d(e,{i:function(){return a}});var n=r(81628),i=(0,n.c)((function(t){t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0)}),(function(t,e){t.setUTCFullYear(t.getUTCFullYear()+e)}),(function(t,e){return e.getUTCFullYear()-t.getUTCFullYear()}),(function(t){return t.getUTCFullYear()}));i.every=function(t){return isFinite(t=Math.floor(t))&&t>0?(0,n.c)((function(e){e.setUTCFullYear(Math.floor(e.getUTCFullYear()/t)*t),e.setUTCMonth(0,1),e.setUTCHours(0,0,0,0)}),(function(e,r){e.setUTCFullYear(e.getUTCFullYear()+r*t)})):null},e.c=i;var a=i.range},46192:function(t,e,r){\"use strict\";r.d(e,{Ab:function(){return p},Mf:function(){return l},Oc:function(){return v},QP:function(){return d},Wc:function(){return h},aI:function(){return x},eC:function(){return y},eg:function(){return u},iB:function(){return f},kD:function(){return c},qT:function(){return s},sJ:function(){return m},sn:function(){return g},uU:function(){return o}});var n=r(81628),i=r(69792);function a(t){return(0,n.c)((function(e){e.setDate(e.getDate()-(e.getDay()+7-t)%7),e.setHours(0,0,0,0)}),(function(t,e){t.setDate(t.getDate()+7*e)}),(function(t,e){return(e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*i.iy)/i.KK}))}var o=a(0),s=a(1),l=a(2),u=a(3),c=a(4),f=a(5),h=a(6),p=o.range,d=s.range,v=l.range,g=u.range,y=c.range,m=f.range,x=h.range},32171:function(t,e,r){\"use strict\";r.d(e,{Q:function(){return a}});var n=r(81628),i=(0,n.c)((function(t){t.setMonth(0,1),t.setHours(0,0,0,0)}),(function(t,e){t.setFullYear(t.getFullYear()+e)}),(function(t,e){return e.getFullYear()-t.getFullYear()}),(function(t){return t.getFullYear()}));i.every=function(t){return isFinite(t=Math.floor(t))&&t>0?(0,n.c)((function(e){e.setFullYear(Math.floor(e.getFullYear()/t)*t),e.setMonth(0,1),e.setHours(0,0,0,0)}),(function(e,r){e.setFullYear(e.getFullYear()+r*t)})):null},e.c=i;var a=i.range},64348:function(t,e,r){\"use strict\";var n=r(39640)(),i=r(53664),a=n&&i(\"%Object.defineProperty%\",!0);if(a)try{a({},\"a\",{value:1})}catch(t){a=!1}var o=i(\"%SyntaxError%\"),s=i(\"%TypeError%\"),l=r(2304);t.exports=function(t,e,r){if(!t||\"object\"!=typeof t&&\"function\"!=typeof t)throw new s(\"`obj` must be an object or a function`\");if(\"string\"!=typeof e&&\"symbol\"!=typeof e)throw new s(\"`property` must be a string or a symbol`\");if(arguments.length>3&&\"boolean\"!=typeof arguments[3]&&null!==arguments[3])throw new s(\"`nonEnumerable`, if provided, must be a boolean or null\");if(arguments.length>4&&\"boolean\"!=typeof arguments[4]&&null!==arguments[4])throw new s(\"`nonWritable`, if provided, must be a boolean or null\");if(arguments.length>5&&\"boolean\"!=typeof arguments[5]&&null!==arguments[5])throw new s(\"`nonConfigurable`, if provided, must be a boolean or null\");if(arguments.length>6&&\"boolean\"!=typeof arguments[6])throw new s(\"`loose`, if provided, must be a boolean\");var n=arguments.length>3?arguments[3]:null,i=arguments.length>4?arguments[4]:null,u=arguments.length>5?arguments[5]:null,c=arguments.length>6&&arguments[6],f=!!l&&l(t,e);if(a)a(t,e,{configurable:null===u&&f?f.configurable:!u,enumerable:null===n&&f?f.enumerable:!n,value:r,writable:null===i&&f?f.writable:!i});else{if(!c&&(n||i||u))throw new o(\"This environment does not support defining a property as non-configurable, non-writable, or non-enumerable.\");t[e]=r}}},81288:function(t,e,r){\"use strict\";var n=r(41820),i=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol(\"foo\"),a=Object.prototype.toString,o=Array.prototype.concat,s=Object.defineProperty,l=r(39640)(),u=s&&l,c=function(t,e,r,n){if(e in t)if(!0===n){if(t[e]===r)return}else if(\"function\"!=typeof(i=n)||\"[object Function]\"!==a.call(i)||!n())return;var i;u?s(t,e,{configurable:!0,enumerable:!1,value:r,writable:!0}):t[e]=r},f=function(t,e){var r=arguments.length>2?arguments[2]:{},a=n(e);i&&(a=o.call(a,Object.getOwnPropertySymbols(e)));for(var s=0;ss*l){var p=(h-f)/s;o[c]=1e3*p}}return o}function i(t){for(var e=[],r=t[0];r<=t[1];r++)for(var n=String.fromCharCode(r),i=t[0];i0)return function(t,e){var r,n;for(r=new Array(t),n=0;n80*a){o=l=t[0],s=f=t[1];for(var b=a;bl&&(l=h),d>f&&(f=d);v=0!==(v=Math.max(l-o,f-s))?1/v:0}return i(m,x,a,o,s,v),x}function r(t,e,r,n,i){var a,o;if(i===M(t,e,r,n)>0)for(a=e;a=e;a-=n)o=T(a,t[a],t[a+1],o);return o&&y(o,o.next)&&(k(o),o=o.next),o}function n(t,e){if(!t)return t;e||(e=t);var r,n=t;do{if(r=!1,n.steiner||!y(n,n.next)&&0!==g(n.prev,n,n.next))n=n.next;else{if(k(n),(n=e=n.prev)===n.next)break;r=!0}}while(r||n!==e);return e}function i(t,e,r,u,c,f,p){if(t){!p&&f&&function(t,e,r,n){var i=t;do{null===i.z&&(i.z=h(i.x,i.y,e,r,n)),i.prevZ=i.prev,i.nextZ=i.next,i=i.next}while(i!==t);i.prevZ.nextZ=null,i.prevZ=null,function(t){var e,r,n,i,a,o,s,l,u=1;do{for(r=t,t=null,a=null,o=0;r;){for(o++,n=r,s=0,e=0;e0||l>0&&n;)0!==s&&(0===l||!n||r.z<=n.z)?(i=r,r=r.nextZ,s--):(i=n,n=n.nextZ,l--),a?a.nextZ=i:t=i,i.prevZ=a,a=i;r=n}a.nextZ=null,u*=2}while(o>1)}(i)}(t,u,c,f);for(var d,v,g=t;t.prev!==t.next;)if(d=t.prev,v=t.next,f?o(t,u,c,f):a(t))e.push(d.i/r),e.push(t.i/r),e.push(v.i/r),k(t),t=v.next,g=v.next;else if((t=v)===g){p?1===p?i(t=s(n(t),e,r),e,r,u,c,f,2):2===p&&l(t,e,r,u,c,f):i(n(t),e,r,u,c,f,1);break}}}function a(t){var e=t.prev,r=t,n=t.next;if(g(e,r,n)>=0)return!1;for(var i=t.next.next;i!==t.prev;){if(d(e.x,e.y,r.x,r.y,n.x,n.y,i.x,i.y)&&g(i.prev,i,i.next)>=0)return!1;i=i.next}return!0}function o(t,e,r,n){var i=t.prev,a=t,o=t.next;if(g(i,a,o)>=0)return!1;for(var s=i.xa.x?i.x>o.x?i.x:o.x:a.x>o.x?a.x:o.x,c=i.y>a.y?i.y>o.y?i.y:o.y:a.y>o.y?a.y:o.y,f=h(s,l,e,r,n),p=h(u,c,e,r,n),v=t.prevZ,y=t.nextZ;v&&v.z>=f&&y&&y.z<=p;){if(v!==t.prev&&v!==t.next&&d(i.x,i.y,a.x,a.y,o.x,o.y,v.x,v.y)&&g(v.prev,v,v.next)>=0)return!1;if(v=v.prevZ,y!==t.prev&&y!==t.next&&d(i.x,i.y,a.x,a.y,o.x,o.y,y.x,y.y)&&g(y.prev,y,y.next)>=0)return!1;y=y.nextZ}for(;v&&v.z>=f;){if(v!==t.prev&&v!==t.next&&d(i.x,i.y,a.x,a.y,o.x,o.y,v.x,v.y)&&g(v.prev,v,v.next)>=0)return!1;v=v.prevZ}for(;y&&y.z<=p;){if(y!==t.prev&&y!==t.next&&d(i.x,i.y,a.x,a.y,o.x,o.y,y.x,y.y)&&g(y.prev,y,y.next)>=0)return!1;y=y.nextZ}return!0}function s(t,e,r){var i=t;do{var a=i.prev,o=i.next.next;!y(a,o)&&m(a,i,i.next,o)&&_(a,o)&&_(o,a)&&(e.push(a.i/r),e.push(i.i/r),e.push(o.i/r),k(i),k(i.next),i=t=o),i=i.next}while(i!==t);return n(i)}function l(t,e,r,a,o,s){var l=t;do{for(var u=l.next.next;u!==l.prev;){if(l.i!==u.i&&v(l,u)){var c=w(l,u);return l=n(l,l.next),c=n(c,c.next),i(l,e,r,a,o,s),void i(c,e,r,a,o,s)}u=u.next}l=l.next}while(l!==t)}function u(t,e){return t.x-e.x}function c(t,e){if(e=function(t,e){var r,n=e,i=t.x,a=t.y,o=-1/0;do{if(a<=n.y&&a>=n.next.y&&n.next.y!==n.y){var s=n.x+(a-n.y)*(n.next.x-n.x)/(n.next.y-n.y);if(s<=i&&s>o){if(o=s,s===i){if(a===n.y)return n;if(a===n.next.y)return n.next}r=n.x=n.x&&n.x>=c&&i!==n.x&&d(ar.x||n.x===r.x&&f(r,n)))&&(r=n,p=l)),n=n.next}while(n!==u);return r}(t,e),e){var r=w(e,t);n(e,e.next),n(r,r.next)}}function f(t,e){return g(t.prev,t,e.prev)<0&&g(e.next,t,t.next)<0}function h(t,e,r,n,i){return(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=32767*(t-r)*i)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=32767*(e-n)*i)|e<<8))|e<<4))|e<<2))|e<<1))<<1}function p(t){var e=t,r=t;do{(e.x=0&&(t-o)*(n-s)-(r-o)*(e-s)>=0&&(r-o)*(a-s)-(i-o)*(n-s)>=0}function v(t,e){return t.next.i!==e.i&&t.prev.i!==e.i&&!function(t,e){var r=t;do{if(r.i!==t.i&&r.next.i!==t.i&&r.i!==e.i&&r.next.i!==e.i&&m(r,r.next,t,e))return!0;r=r.next}while(r!==t);return!1}(t,e)&&(_(t,e)&&_(e,t)&&function(t,e){var r=t,n=!1,i=(t.x+e.x)/2,a=(t.y+e.y)/2;do{r.y>a!=r.next.y>a&&r.next.y!==r.y&&i<(r.next.x-r.x)*(a-r.y)/(r.next.y-r.y)+r.x&&(n=!n),r=r.next}while(r!==t);return n}(t,e)&&(g(t.prev,t,e.prev)||g(t,e.prev,e))||y(t,e)&&g(t.prev,t,t.next)>0&&g(e.prev,e,e.next)>0)}function g(t,e,r){return(e.y-t.y)*(r.x-e.x)-(e.x-t.x)*(r.y-e.y)}function y(t,e){return t.x===e.x&&t.y===e.y}function m(t,e,r,n){var i=b(g(t,e,r)),a=b(g(t,e,n)),o=b(g(r,n,t)),s=b(g(r,n,e));return i!==a&&o!==s||!(0!==i||!x(t,r,e))||!(0!==a||!x(t,n,e))||!(0!==o||!x(r,t,n))||!(0!==s||!x(r,e,n))}function x(t,e,r){return e.x<=Math.max(t.x,r.x)&&e.x>=Math.min(t.x,r.x)&&e.y<=Math.max(t.y,r.y)&&e.y>=Math.min(t.y,r.y)}function b(t){return t>0?1:t<0?-1:0}function _(t,e){return g(t.prev,t,t.next)<0?g(t,e,t.next)>=0&&g(t,t.prev,e)>=0:g(t,e,t.prev)<0||g(t,t.next,e)<0}function w(t,e){var r=new A(t.i,t.x,t.y),n=new A(e.i,e.x,e.y),i=t.next,a=e.prev;return t.next=e,e.prev=t,r.next=i,i.prev=r,n.next=r,r.prev=n,a.next=n,n.prev=a,n}function T(t,e,r,n){var i=new A(t,e,r);return n?(i.next=n.next,i.prev=n,n.next.prev=i,n.next=i):(i.prev=i,i.next=i),i}function k(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ)}function A(t,e,r){this.i=t,this.x=e,this.y=r,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}function M(t,e,r,n){for(var i=0,a=e,o=r-n;a0&&(n+=t[i-1].length,r.holes.push(n))}return r}},6688:function(t,e,r){var n=r(78484);t.exports=function(t,e){var r,i=[],a=[],o=[],s={},l=[];function u(t){o[t]=!1,s.hasOwnProperty(t)&&Object.keys(s[t]).forEach((function(e){delete s[t][e],o[e]&&u(e)}))}function c(t){var e,n,i=!1;for(a.push(t),o[t]=!0,e=0;e=e}))}(e);for(var r,i=n(t).components.filter((function(t){return t.length>1})),a=1/0,o=0;o=55296&&m<=56319&&(w+=t[++r]),w=T?h.call(T,k,w,v):w,e?(p.value=w,d(g,v,p)):g[v]=w,++v;y=v}if(void 0===y)for(y=o(t.length),e&&(g=new e(y)),r=0;r0?1:-1}},96936:function(t,e,r){\"use strict\";var n=r(85608),i=Math.abs,a=Math.floor;t.exports=function(t){return isNaN(t)?0:0!==(t=Number(t))&&isFinite(t)?n(t)*a(i(t)):t}},81304:function(t,e,r){\"use strict\";var n=r(96936),i=Math.max;t.exports=function(t){return i(0,n(t))}},14428:function(t,e,r){\"use strict\";var n=r(34044),i=r(9252),a=Function.prototype.bind,o=Function.prototype.call,s=Object.keys,l=Object.prototype.propertyIsEnumerable;t.exports=function(t,e){return function(r,u){var c,f=arguments[2],h=arguments[3];return r=Object(i(r)),n(u),c=s(r),h&&c.sort(\"function\"==typeof h?a.call(h,r):void 0),\"function\"!=typeof t&&(t=c[t]),o.call(t,c,(function(t,n){return l.call(r,t)?o.call(u,f,r[t],t,r,n):e}))}}},38452:function(t,e,r){\"use strict\";t.exports=r(96276)()?Object.assign:r(81892)},96276:function(t){\"use strict\";t.exports=function(){var t,e=Object.assign;return\"function\"==typeof e&&(e(t={foo:\"raz\"},{bar:\"dwa\"},{trzy:\"trzy\"}),t.foo+t.bar+t.trzy===\"razdwatrzy\")}},81892:function(t,e,r){\"use strict\";var n=r(54768),i=r(9252),a=Math.max;t.exports=function(t,e){var r,o,s,l=a(arguments.length,2);for(t=Object(i(t)),s=function(n){try{t[n]=e[n]}catch(t){r||(r=t)}},o=1;o-1}},29768:function(t){\"use strict\";var e=Object.prototype.toString,r=e.call(\"\");t.exports=function(t){return\"string\"==typeof t||t&&\"object\"==typeof t&&(t instanceof String||e.call(t)===r)||!1}},82252:function(t){\"use strict\";var e=Object.create(null),r=Math.random;t.exports=function(){var t;do{t=r().toString(36).slice(2)}while(e[t]);return t}},52104:function(t,e,r){\"use strict\";var n,i=r(69932),a=r(71056),o=r(21092),s=r(92664),l=r(85512),u=Object.defineProperty;n=t.exports=function(t,e){if(!(this instanceof n))throw new TypeError(\"Constructor requires 'new'\");l.call(this,t),e=e?a.call(e,\"key+value\")?\"key+value\":a.call(e,\"key\")?\"key\":\"value\":\"value\",u(this,\"__kind__\",o(\"\",e))},i&&i(n,l),delete n.prototype.constructor,n.prototype=Object.create(l.prototype,{_resolve:o((function(t){return\"value\"===this.__kind__?this.__list__[t]:\"key+value\"===this.__kind__?[t,this.__list__[t]]:t}))}),u(n.prototype,s.toStringTag,o(\"c\",\"Array Iterator\"))},76024:function(t,e,r){\"use strict\";var n=r(60948),i=r(34044),a=r(29768),o=r(76252),s=Array.isArray,l=Function.prototype.call,u=Array.prototype.some;t.exports=function(t,e){var r,c,f,h,p,d,v,g,y=arguments[2];if(s(t)||n(t)?r=\"array\":a(t)?r=\"string\":t=o(t),i(e),f=function(){h=!0},\"array\"!==r)if(\"string\"!==r)for(c=t.next();!c.done;){if(l.call(e,y,c.value,f),h)return;c=t.next()}else for(d=t.length,p=0;p=55296&&g<=56319&&(v+=t[++p]),l.call(e,y,v,f),!h);++p);else u.call(t,(function(t){return l.call(e,y,t,f),h}))}},76252:function(t,e,r){\"use strict\";var n=r(60948),i=r(29768),a=r(52104),o=r(80940),s=r(52891),l=r(92664).iterator;t.exports=function(t){return\"function\"==typeof s(t)[l]?t[l]():n(t)?new a(t):i(t)?new o(t):new a(t)}},85512:function(t,e,r){\"use strict\";var n,i=r(41476),a=r(38452),o=r(34044),s=r(9252),l=r(21092),u=r(27940),c=r(92664),f=Object.defineProperty,h=Object.defineProperties;t.exports=n=function(t,e){if(!(this instanceof n))throw new TypeError(\"Constructor requires 'new'\");h(this,{__list__:l(\"w\",s(t)),__context__:l(\"w\",e),__nextIndex__:l(\"w\",0)}),e&&(o(e.on),e.on(\"_add\",this._onAdd),e.on(\"_delete\",this._onDelete),e.on(\"_clear\",this._onClear))},delete n.prototype.constructor,h(n.prototype,a({_next:l((function(){var t;if(this.__list__)return this.__redo__&&void 0!==(t=this.__redo__.shift())?t:this.__nextIndex__=this.__nextIndex__||(++this.__nextIndex__,this.__redo__?(this.__redo__.forEach((function(e,r){e>=t&&(this.__redo__[r]=++e)}),this),this.__redo__.push(t)):f(this,\"__redo__\",l(\"c\",[t])))})),_onDelete:l((function(t){var e;t>=this.__nextIndex__||(--this.__nextIndex__,this.__redo__&&(-1!==(e=this.__redo__.indexOf(t))&&this.__redo__.splice(e,1),this.__redo__.forEach((function(e,r){e>t&&(this.__redo__[r]=--e)}),this)))})),_onClear:l((function(){this.__redo__&&i.call(this.__redo__),this.__nextIndex__=0}))}))),f(n.prototype,c.iterator,l((function(){return this})))},76368:function(t,e,r){\"use strict\";var n=r(60948),i=r(42584),a=r(29768),o=r(92664).iterator,s=Array.isArray;t.exports=function(t){return!(!i(t)||!s(t)&&!a(t)&&!n(t)&&\"function\"!=typeof t[o])}},80940:function(t,e,r){\"use strict\";var n,i=r(69932),a=r(21092),o=r(92664),s=r(85512),l=Object.defineProperty;n=t.exports=function(t){if(!(this instanceof n))throw new TypeError(\"Constructor requires 'new'\");t=String(t),s.call(this,t),l(this,\"__length__\",a(\"\",t.length))},i&&i(n,s),delete n.prototype.constructor,n.prototype=Object.create(s.prototype,{_next:a((function(){if(this.__list__)return this.__nextIndex__=55296&&e<=56319?r+this.__list__[this.__nextIndex__++]:r}))}),l(n.prototype,o.toStringTag,a(\"c\",\"String Iterator\"))},52891:function(t,e,r){\"use strict\";var n=r(76368);t.exports=function(t){if(!n(t))throw new TypeError(t+\" is not iterable\");return t}},60964:function(t){\"use strict\";function e(t,e){if(null==t)throw new TypeError(\"Cannot convert first argument to object\");for(var r=Object(t),n=1;n0&&o.length>i&&!o.warned){o.warned=!0;var c=new Error(\"Possible EventEmitter memory leak detected. \"+o.length+\" \"+String(e)+\" listeners added. Use emitter.setMaxListeners() to increase limit\");c.name=\"MaxListenersExceededWarning\",c.emitter=t,c.type=e,c.count=o.length,u=c,console&&console.warn&&console.warn(u)}return t}function c(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,0===arguments.length?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function f(t,e,r){var n={fired:!1,wrapFn:void 0,target:t,type:e,listener:r},i=c.bind(n);return i.listener=r,n.wrapFn=i,i}function h(t,e,r){var n=t._events;if(void 0===n)return[];var i=n[e];return void 0===i?[]:\"function\"==typeof i?r?[i.listener||i]:[i]:r?function(t){for(var e=new Array(t.length),r=0;r0&&(o=e[0]),o instanceof Error)throw o;var s=new Error(\"Unhandled error.\"+(o?\" (\"+o.message+\")\":\"\"));throw s.context=o,s}var l=a[t];if(void 0===l)return!1;if(\"function\"==typeof l)n(l,this,e);else{var u=l.length,c=d(l,u);for(r=0;r=0;a--)if(r[a]===e||r[a].listener===e){o=r[a].listener,i=a;break}if(i<0)return this;0===i?r.shift():function(t,e){for(;e+1=0;n--)this.removeListener(t,e[n]);return this},a.prototype.listeners=function(t){return h(this,t,!0)},a.prototype.rawListeners=function(t){return h(this,t,!1)},a.listenerCount=function(t,e){return\"function\"==typeof t.listenerCount?t.listenerCount(e):p.call(t,e)},a.prototype.listenerCount=p,a.prototype.eventNames=function(){return this._eventsCount>0?e(this._events):[]}},39072:function(t){var e=function(){if(\"object\"==typeof self&&self)return self;if(\"object\"==typeof window&&window)return window;throw new Error(\"Unable to resolve global `this`\")};t.exports=function(){if(this)return this;try{Object.defineProperty(Object.prototype,\"__global__\",{get:function(){return this},configurable:!0})}catch(t){return e()}try{return __global__||e()}finally{delete Object.prototype.__global__}}()},12296:function(t,e,r){\"use strict\";t.exports=r(45072)()?globalThis:r(39072)},45072:function(t){\"use strict\";t.exports=function(){return\"object\"==typeof globalThis&&!!globalThis&&globalThis.Array===Array}},38248:function(t,e,r){\"use strict\";var n=r(94576);t.exports=function(t){var e=typeof t;if(\"string\"===e){var r=t;if(0==(t=+t)&&n(r))return!1}else if(\"number\"!==e)return!1;return t-t<1}},47520:function(t,e,r){var n=r(72512);t.exports=function(t,e,r){if(!t)throw new TypeError(\"must specify data as first parameter\");if(r=0|+(r||0),Array.isArray(t)&&t[0]&&\"number\"==typeof t[0][0]){var i,a,o,s,l=t[0].length,u=t.length*l;e&&\"string\"!=typeof e||(e=new(n(e||\"float32\"))(u+r));var c=e.length-r;if(u!==c)throw new Error(\"source length \"+u+\" (\"+l+\"x\"+t.length+\") does not match destination length \"+c);for(i=0,o=r;ie[0]-o[0]/2&&(h=o[0]/2,p+=o[1]);return r}},71920:function(t){\"use strict\";function e(t,a){a||(a={}),(\"string\"==typeof t||Array.isArray(t))&&(a.family=t);var o=Array.isArray(a.family)?a.family.join(\", \"):a.family;if(!o)throw Error(\"`family` must be defined\");var s=a.size||a.fontSize||a.em||48,l=a.weight||a.fontWeight||\"\",u=(t=[a.style||a.fontStyle||\"\",l,s].join(\" \")+\"px \"+o,a.origin||\"top\");if(e.cache[o]&&s<=e.cache[o].em)return r(e.cache[o],u);var c=a.canvas||e.canvas,f=c.getContext(\"2d\"),h={upper:void 0!==a.upper?a.upper:\"H\",lower:void 0!==a.lower?a.lower:\"x\",descent:void 0!==a.descent?a.descent:\"p\",ascent:void 0!==a.ascent?a.ascent:\"h\",tittle:void 0!==a.tittle?a.tittle:\"i\",overshoot:void 0!==a.overshoot?a.overshoot:\"O\"},p=Math.ceil(1.5*s);c.height=p,c.width=.5*p,f.font=t;var d=\"H\",v={top:0};f.clearRect(0,0,p,p),f.textBaseline=\"top\",f.fillStyle=\"black\",f.fillText(d,0,0);var g=n(f.getImageData(0,0,p,p));f.clearRect(0,0,p,p),f.textBaseline=\"bottom\",f.fillText(d,0,p);var y=n(f.getImageData(0,0,p,p));v.lineHeight=v.bottom=p-y+g,f.clearRect(0,0,p,p),f.textBaseline=\"alphabetic\",f.fillText(d,0,p);var m=p-n(f.getImageData(0,0,p,p))-1+g;v.baseline=v.alphabetic=m,f.clearRect(0,0,p,p),f.textBaseline=\"middle\",f.fillText(d,0,.5*p);var x=n(f.getImageData(0,0,p,p));v.median=v.middle=p-x-1+g-.5*p,f.clearRect(0,0,p,p),f.textBaseline=\"hanging\",f.fillText(d,0,.5*p);var b=n(f.getImageData(0,0,p,p));v.hanging=p-b-1+g-.5*p,f.clearRect(0,0,p,p),f.textBaseline=\"ideographic\",f.fillText(d,0,p);var _=n(f.getImageData(0,0,p,p));if(v.ideographic=p-_-1+g,h.upper&&(f.clearRect(0,0,p,p),f.textBaseline=\"top\",f.fillText(h.upper,0,0),v.upper=n(f.getImageData(0,0,p,p)),v.capHeight=v.baseline-v.upper),h.lower&&(f.clearRect(0,0,p,p),f.textBaseline=\"top\",f.fillText(h.lower,0,0),v.lower=n(f.getImageData(0,0,p,p)),v.xHeight=v.baseline-v.lower),h.tittle&&(f.clearRect(0,0,p,p),f.textBaseline=\"top\",f.fillText(h.tittle,0,0),v.tittle=n(f.getImageData(0,0,p,p))),h.ascent&&(f.clearRect(0,0,p,p),f.textBaseline=\"top\",f.fillText(h.ascent,0,0),v.ascent=n(f.getImageData(0,0,p,p))),h.descent&&(f.clearRect(0,0,p,p),f.textBaseline=\"top\",f.fillText(h.descent,0,0),v.descent=i(f.getImageData(0,0,p,p))),h.overshoot){f.clearRect(0,0,p,p),f.textBaseline=\"top\",f.fillText(h.overshoot,0,0);var w=i(f.getImageData(0,0,p,p));v.overshoot=w-m}for(var T in v)v[T]/=s;return v.em=s,e.cache[o]=v,r(v,u)}function r(t,e){var r={};for(var n in\"string\"==typeof e&&(e=t[e]),t)\"em\"!==n&&(r[n]=t[n]-e);return r}function n(t){for(var e=t.height,r=t.data,n=3;n0;n-=4)if(0!==r[n])return Math.floor(.25*(n-3)/e)}t.exports=e,e.canvas=document.createElement(\"canvas\"),e.cache={}},46492:function(t,e,r){\"use strict\";var n=r(90720),i=Object.prototype.toString,a=Object.prototype.hasOwnProperty;t.exports=function(t,e,r){if(!n(e))throw new TypeError(\"iterator must be a function\");var o;arguments.length>=3&&(o=r),\"[object Array]\"===i.call(t)?function(t,e,r){for(var n=0,i=t.length;n1&&\"boolean\"!=typeof e)throw new o('\"allowMissing\" argument must be a boolean');if(null===M(/^%?[^%]*%?$/,t))throw new i(\"`%` may not be present anywhere but at the beginning and end of the intrinsic name\");var r=function(t){var e=A(t,0,1),r=A(t,-1);if(\"%\"===e&&\"%\"!==r)throw new i(\"invalid intrinsic syntax, expected closing `%`\");if(\"%\"===r&&\"%\"!==e)throw new i(\"invalid intrinsic syntax, expected opening `%`\");var n=[];return k(t,S,(function(t,e,r,i){n[n.length]=r?k(i,E,\"$1\"):e||t})),n}(t),n=r.length>0?r[0]:\"\",a=L(\"%\"+n+\"%\",e),s=a.name,u=a.value,c=!1,f=a.alias;f&&(n=f[0],T(r,w([0,1],f)));for(var h=1,p=!0;h=r.length){var m=l(u,d);u=(p=!!m)&&\"get\"in m&&!(\"originalValue\"in m.get)?m.get:u[d]}else p=_(u,d),u=u[d];p&&!c&&(g[s]=u)}}return u}},12408:function(t){t.exports=function(t,e){var r=e[0],n=e[1],i=e[2],a=e[3],o=e[4],s=e[5],l=e[6],u=e[7],c=e[8],f=e[9],h=e[10],p=e[11],d=e[12],v=e[13],g=e[14],y=e[15];return t[0]=s*(h*y-p*g)-f*(l*y-u*g)+v*(l*p-u*h),t[1]=-(n*(h*y-p*g)-f*(i*y-a*g)+v*(i*p-a*h)),t[2]=n*(l*y-u*g)-s*(i*y-a*g)+v*(i*u-a*l),t[3]=-(n*(l*p-u*h)-s*(i*p-a*h)+f*(i*u-a*l)),t[4]=-(o*(h*y-p*g)-c*(l*y-u*g)+d*(l*p-u*h)),t[5]=r*(h*y-p*g)-c*(i*y-a*g)+d*(i*p-a*h),t[6]=-(r*(l*y-u*g)-o*(i*y-a*g)+d*(i*u-a*l)),t[7]=r*(l*p-u*h)-o*(i*p-a*h)+c*(i*u-a*l),t[8]=o*(f*y-p*v)-c*(s*y-u*v)+d*(s*p-u*f),t[9]=-(r*(f*y-p*v)-c*(n*y-a*v)+d*(n*p-a*f)),t[10]=r*(s*y-u*v)-o*(n*y-a*v)+d*(n*u-a*s),t[11]=-(r*(s*p-u*f)-o*(n*p-a*f)+c*(n*u-a*s)),t[12]=-(o*(f*g-h*v)-c*(s*g-l*v)+d*(s*h-l*f)),t[13]=r*(f*g-h*v)-c*(n*g-i*v)+d*(n*h-i*f),t[14]=-(r*(s*g-l*v)-o*(n*g-i*v)+d*(n*l-i*s)),t[15]=r*(s*h-l*f)-o*(n*h-i*f)+c*(n*l-i*s),t}},76860:function(t){t.exports=function(t){var e=new Float32Array(16);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e[9]=t[9],e[10]=t[10],e[11]=t[11],e[12]=t[12],e[13]=t[13],e[14]=t[14],e[15]=t[15],e}},64492:function(t){t.exports=function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t[6]=e[6],t[7]=e[7],t[8]=e[8],t[9]=e[9],t[10]=e[10],t[11]=e[11],t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15],t}},54212:function(t){t.exports=function(){var t=new Float32Array(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}},70800:function(t){t.exports=function(t){var e=t[0],r=t[1],n=t[2],i=t[3],a=t[4],o=t[5],s=t[6],l=t[7],u=t[8],c=t[9],f=t[10],h=t[11],p=t[12],d=t[13],v=t[14],g=t[15];return(e*o-r*a)*(f*g-h*v)-(e*s-n*a)*(c*g-h*d)+(e*l-i*a)*(c*v-f*d)+(r*s-n*o)*(u*g-h*p)-(r*l-i*o)*(u*v-f*p)+(n*l-i*s)*(u*d-c*p)}},61784:function(t){t.exports=function(t,e){var r=e[0],n=e[1],i=e[2],a=e[3],o=r+r,s=n+n,l=i+i,u=r*o,c=n*o,f=n*s,h=i*o,p=i*s,d=i*l,v=a*o,g=a*s,y=a*l;return t[0]=1-f-d,t[1]=c+y,t[2]=h-g,t[3]=0,t[4]=c-y,t[5]=1-u-d,t[6]=p+v,t[7]=0,t[8]=h+g,t[9]=p-v,t[10]=1-u-f,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}},91616:function(t){t.exports=function(t,e,r){var n,i,a,o=r[0],s=r[1],l=r[2],u=Math.sqrt(o*o+s*s+l*l);return Math.abs(u)<1e-6?null:(o*=u=1/u,s*=u,l*=u,n=Math.sin(e),a=1-(i=Math.cos(e)),t[0]=o*o*a+i,t[1]=s*o*a+l*n,t[2]=l*o*a-s*n,t[3]=0,t[4]=o*s*a-l*n,t[5]=s*s*a+i,t[6]=l*s*a+o*n,t[7]=0,t[8]=o*l*a+s*n,t[9]=s*l*a-o*n,t[10]=l*l*a+i,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t)}},51944:function(t){t.exports=function(t,e,r){var n=e[0],i=e[1],a=e[2],o=e[3],s=n+n,l=i+i,u=a+a,c=n*s,f=n*l,h=n*u,p=i*l,d=i*u,v=a*u,g=o*s,y=o*l,m=o*u;return t[0]=1-(p+v),t[1]=f+m,t[2]=h-y,t[3]=0,t[4]=f-m,t[5]=1-(c+v),t[6]=d+g,t[7]=0,t[8]=h+y,t[9]=d-g,t[10]=1-(c+p),t[11]=0,t[12]=r[0],t[13]=r[1],t[14]=r[2],t[15]=1,t}},69444:function(t){t.exports=function(t,e){return t[0]=e[0],t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=e[1],t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=e[2],t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}},48268:function(t){t.exports=function(t,e){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=e[0],t[13]=e[1],t[14]=e[2],t[15]=1,t}},21856:function(t){t.exports=function(t,e){var r=Math.sin(e),n=Math.cos(e);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=n,t[6]=r,t[7]=0,t[8]=0,t[9]=-r,t[10]=n,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}},79216:function(t){t.exports=function(t,e){var r=Math.sin(e),n=Math.cos(e);return t[0]=n,t[1]=0,t[2]=-r,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=r,t[9]=0,t[10]=n,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}},57736:function(t){t.exports=function(t,e){var r=Math.sin(e),n=Math.cos(e);return t[0]=n,t[1]=r,t[2]=0,t[3]=0,t[4]=-r,t[5]=n,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}},38848:function(t){t.exports=function(t,e,r,n,i,a,o){var s=1/(r-e),l=1/(i-n),u=1/(a-o);return t[0]=2*a*s,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=2*a*l,t[6]=0,t[7]=0,t[8]=(r+e)*s,t[9]=(i+n)*l,t[10]=(o+a)*u,t[11]=-1,t[12]=0,t[13]=0,t[14]=o*a*2*u,t[15]=0,t}},36635:function(t){t.exports=function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}},36524:function(t,e,r){t.exports={create:r(54212),clone:r(76860),copy:r(64492),identity:r(36635),transpose:r(86520),invert:r(4308),adjoint:r(12408),determinant:r(70800),multiply:r(80944),translate:r(35176),scale:r(68152),rotate:r(30016),rotateX:r(15456),rotateY:r(64840),rotateZ:r(4192),fromRotation:r(91616),fromRotationTranslation:r(51944),fromScaling:r(69444),fromTranslation:r(48268),fromXRotation:r(21856),fromYRotation:r(79216),fromZRotation:r(57736),fromQuat:r(61784),frustum:r(38848),perspective:r(51296),perspectiveFromFieldOfView:r(63688),ortho:r(97688),lookAt:r(56508),str:r(89412)}},4308:function(t){t.exports=function(t,e){var r=e[0],n=e[1],i=e[2],a=e[3],o=e[4],s=e[5],l=e[6],u=e[7],c=e[8],f=e[9],h=e[10],p=e[11],d=e[12],v=e[13],g=e[14],y=e[15],m=r*s-n*o,x=r*l-i*o,b=r*u-a*o,_=n*l-i*s,w=n*u-a*s,T=i*u-a*l,k=c*v-f*d,A=c*g-h*d,M=c*y-p*d,S=f*g-h*v,E=f*y-p*v,L=h*y-p*g,C=m*L-x*E+b*S+_*M-w*A+T*k;return C?(C=1/C,t[0]=(s*L-l*E+u*S)*C,t[1]=(i*E-n*L-a*S)*C,t[2]=(v*T-g*w+y*_)*C,t[3]=(h*w-f*T-p*_)*C,t[4]=(l*M-o*L-u*A)*C,t[5]=(r*L-i*M+a*A)*C,t[6]=(g*b-d*T-y*x)*C,t[7]=(c*T-h*b+p*x)*C,t[8]=(o*E-s*M+u*k)*C,t[9]=(n*M-r*E-a*k)*C,t[10]=(d*w-v*b+y*m)*C,t[11]=(f*b-c*w-p*m)*C,t[12]=(s*A-o*S-l*k)*C,t[13]=(r*S-n*A+i*k)*C,t[14]=(v*x-d*_-g*m)*C,t[15]=(c*_-f*x+h*m)*C,t):null}},56508:function(t,e,r){var n=r(36635);t.exports=function(t,e,r,i){var a,o,s,l,u,c,f,h,p,d,v=e[0],g=e[1],y=e[2],m=i[0],x=i[1],b=i[2],_=r[0],w=r[1],T=r[2];return Math.abs(v-_)<1e-6&&Math.abs(g-w)<1e-6&&Math.abs(y-T)<1e-6?n(t):(f=v-_,h=g-w,p=y-T,a=x*(p*=d=1/Math.sqrt(f*f+h*h+p*p))-b*(h*=d),o=b*(f*=d)-m*p,s=m*h-x*f,(d=Math.sqrt(a*a+o*o+s*s))?(a*=d=1/d,o*=d,s*=d):(a=0,o=0,s=0),l=h*s-p*o,u=p*a-f*s,c=f*o-h*a,(d=Math.sqrt(l*l+u*u+c*c))?(l*=d=1/d,u*=d,c*=d):(l=0,u=0,c=0),t[0]=a,t[1]=l,t[2]=f,t[3]=0,t[4]=o,t[5]=u,t[6]=h,t[7]=0,t[8]=s,t[9]=c,t[10]=p,t[11]=0,t[12]=-(a*v+o*g+s*y),t[13]=-(l*v+u*g+c*y),t[14]=-(f*v+h*g+p*y),t[15]=1,t)}},80944:function(t){t.exports=function(t,e,r){var n=e[0],i=e[1],a=e[2],o=e[3],s=e[4],l=e[5],u=e[6],c=e[7],f=e[8],h=e[9],p=e[10],d=e[11],v=e[12],g=e[13],y=e[14],m=e[15],x=r[0],b=r[1],_=r[2],w=r[3];return t[0]=x*n+b*s+_*f+w*v,t[1]=x*i+b*l+_*h+w*g,t[2]=x*a+b*u+_*p+w*y,t[3]=x*o+b*c+_*d+w*m,x=r[4],b=r[5],_=r[6],w=r[7],t[4]=x*n+b*s+_*f+w*v,t[5]=x*i+b*l+_*h+w*g,t[6]=x*a+b*u+_*p+w*y,t[7]=x*o+b*c+_*d+w*m,x=r[8],b=r[9],_=r[10],w=r[11],t[8]=x*n+b*s+_*f+w*v,t[9]=x*i+b*l+_*h+w*g,t[10]=x*a+b*u+_*p+w*y,t[11]=x*o+b*c+_*d+w*m,x=r[12],b=r[13],_=r[14],w=r[15],t[12]=x*n+b*s+_*f+w*v,t[13]=x*i+b*l+_*h+w*g,t[14]=x*a+b*u+_*p+w*y,t[15]=x*o+b*c+_*d+w*m,t}},97688:function(t){t.exports=function(t,e,r,n,i,a,o){var s=1/(e-r),l=1/(n-i),u=1/(a-o);return t[0]=-2*s,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=-2*l,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=2*u,t[11]=0,t[12]=(e+r)*s,t[13]=(i+n)*l,t[14]=(o+a)*u,t[15]=1,t}},51296:function(t){t.exports=function(t,e,r,n,i){var a=1/Math.tan(e/2),o=1/(n-i);return t[0]=a/r,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=a,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=(i+n)*o,t[11]=-1,t[12]=0,t[13]=0,t[14]=2*i*n*o,t[15]=0,t}},63688:function(t){t.exports=function(t,e,r,n){var i=Math.tan(e.upDegrees*Math.PI/180),a=Math.tan(e.downDegrees*Math.PI/180),o=Math.tan(e.leftDegrees*Math.PI/180),s=Math.tan(e.rightDegrees*Math.PI/180),l=2/(o+s),u=2/(i+a);return t[0]=l,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=u,t[6]=0,t[7]=0,t[8]=-(o-s)*l*.5,t[9]=(i-a)*u*.5,t[10]=n/(r-n),t[11]=-1,t[12]=0,t[13]=0,t[14]=n*r/(r-n),t[15]=0,t}},30016:function(t){t.exports=function(t,e,r,n){var i,a,o,s,l,u,c,f,h,p,d,v,g,y,m,x,b,_,w,T,k,A,M,S,E=n[0],L=n[1],C=n[2],P=Math.sqrt(E*E+L*L+C*C);return Math.abs(P)<1e-6?null:(E*=P=1/P,L*=P,C*=P,i=Math.sin(r),o=1-(a=Math.cos(r)),s=e[0],l=e[1],u=e[2],c=e[3],f=e[4],h=e[5],p=e[6],d=e[7],v=e[8],g=e[9],y=e[10],m=e[11],x=E*E*o+a,b=L*E*o+C*i,_=C*E*o-L*i,w=E*L*o-C*i,T=L*L*o+a,k=C*L*o+E*i,A=E*C*o+L*i,M=L*C*o-E*i,S=C*C*o+a,t[0]=s*x+f*b+v*_,t[1]=l*x+h*b+g*_,t[2]=u*x+p*b+y*_,t[3]=c*x+d*b+m*_,t[4]=s*w+f*T+v*k,t[5]=l*w+h*T+g*k,t[6]=u*w+p*T+y*k,t[7]=c*w+d*T+m*k,t[8]=s*A+f*M+v*S,t[9]=l*A+h*M+g*S,t[10]=u*A+p*M+y*S,t[11]=c*A+d*M+m*S,e!==t&&(t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15]),t)}},15456:function(t){t.exports=function(t,e,r){var n=Math.sin(r),i=Math.cos(r),a=e[4],o=e[5],s=e[6],l=e[7],u=e[8],c=e[9],f=e[10],h=e[11];return e!==t&&(t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15]),t[4]=a*i+u*n,t[5]=o*i+c*n,t[6]=s*i+f*n,t[7]=l*i+h*n,t[8]=u*i-a*n,t[9]=c*i-o*n,t[10]=f*i-s*n,t[11]=h*i-l*n,t}},64840:function(t){t.exports=function(t,e,r){var n=Math.sin(r),i=Math.cos(r),a=e[0],o=e[1],s=e[2],l=e[3],u=e[8],c=e[9],f=e[10],h=e[11];return e!==t&&(t[4]=e[4],t[5]=e[5],t[6]=e[6],t[7]=e[7],t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15]),t[0]=a*i-u*n,t[1]=o*i-c*n,t[2]=s*i-f*n,t[3]=l*i-h*n,t[8]=a*n+u*i,t[9]=o*n+c*i,t[10]=s*n+f*i,t[11]=l*n+h*i,t}},4192:function(t){t.exports=function(t,e,r){var n=Math.sin(r),i=Math.cos(r),a=e[0],o=e[1],s=e[2],l=e[3],u=e[4],c=e[5],f=e[6],h=e[7];return e!==t&&(t[8]=e[8],t[9]=e[9],t[10]=e[10],t[11]=e[11],t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15]),t[0]=a*i+u*n,t[1]=o*i+c*n,t[2]=s*i+f*n,t[3]=l*i+h*n,t[4]=u*i-a*n,t[5]=c*i-o*n,t[6]=f*i-s*n,t[7]=h*i-l*n,t}},68152:function(t){t.exports=function(t,e,r){var n=r[0],i=r[1],a=r[2];return t[0]=e[0]*n,t[1]=e[1]*n,t[2]=e[2]*n,t[3]=e[3]*n,t[4]=e[4]*i,t[5]=e[5]*i,t[6]=e[6]*i,t[7]=e[7]*i,t[8]=e[8]*a,t[9]=e[9]*a,t[10]=e[10]*a,t[11]=e[11]*a,t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15],t}},89412:function(t){t.exports=function(t){return\"mat4(\"+t[0]+\", \"+t[1]+\", \"+t[2]+\", \"+t[3]+\", \"+t[4]+\", \"+t[5]+\", \"+t[6]+\", \"+t[7]+\", \"+t[8]+\", \"+t[9]+\", \"+t[10]+\", \"+t[11]+\", \"+t[12]+\", \"+t[13]+\", \"+t[14]+\", \"+t[15]+\")\"}},35176:function(t){t.exports=function(t,e,r){var n,i,a,o,s,l,u,c,f,h,p,d,v=r[0],g=r[1],y=r[2];return e===t?(t[12]=e[0]*v+e[4]*g+e[8]*y+e[12],t[13]=e[1]*v+e[5]*g+e[9]*y+e[13],t[14]=e[2]*v+e[6]*g+e[10]*y+e[14],t[15]=e[3]*v+e[7]*g+e[11]*y+e[15]):(n=e[0],i=e[1],a=e[2],o=e[3],s=e[4],l=e[5],u=e[6],c=e[7],f=e[8],h=e[9],p=e[10],d=e[11],t[0]=n,t[1]=i,t[2]=a,t[3]=o,t[4]=s,t[5]=l,t[6]=u,t[7]=c,t[8]=f,t[9]=h,t[10]=p,t[11]=d,t[12]=n*v+s*g+f*y+e[12],t[13]=i*v+l*g+h*y+e[13],t[14]=a*v+u*g+p*y+e[14],t[15]=o*v+c*g+d*y+e[15]),t}},86520:function(t){t.exports=function(t,e){if(t===e){var r=e[1],n=e[2],i=e[3],a=e[6],o=e[7],s=e[11];t[1]=e[4],t[2]=e[8],t[3]=e[12],t[4]=r,t[6]=e[9],t[7]=e[13],t[8]=n,t[9]=a,t[11]=e[14],t[12]=i,t[13]=o,t[14]=s}else t[0]=e[0],t[1]=e[4],t[2]=e[8],t[3]=e[12],t[4]=e[1],t[5]=e[5],t[6]=e[9],t[7]=e[13],t[8]=e[2],t[9]=e[6],t[10]=e[10],t[11]=e[14],t[12]=e[3],t[13]=e[7],t[14]=e[11],t[15]=e[15];return t}},23352:function(t,e,r){\"use strict\";var n=r(42771),i=r(55616),a=r(28624),o=r(55212),s=r(60463),l=r(72160),u=r(33888),c=r(14144),f=r(51160),h=r(58908),p=r(65819),d=r(23464),v=r(63768),g=r(50896),y=r(71920),m=r(47520),x=r(308).nextPow2,b=new s,_=!1;if(document.body){var w=document.body.appendChild(document.createElement(\"div\"));w.style.font=\"italic small-caps bold condensed 16px/2 cursive\",getComputedStyle(w).fontStretch&&(_=!0),document.body.removeChild(w)}var T=function(t){!function(t){return\"function\"==typeof t&&t._gl&&t.prop&&t.texture&&t.buffer}(t)?this.gl=o(t):(t={regl:t},this.gl=t.regl._gl),this.shader=b.get(this.gl),this.shader?this.regl=this.shader.regl:this.regl=t.regl||a({gl:this.gl}),this.charBuffer=this.regl.buffer({type:\"uint8\",usage:\"stream\"}),this.sizeBuffer=this.regl.buffer({type:\"float\",usage:\"stream\"}),this.shader||(this.shader=this.createShader(),b.set(this.gl,this.shader)),this.batch=[],this.fontSize=[],this.font=[],this.fontAtlas=[],this.draw=this.shader.draw.bind(this),this.render=function(){this.regl._refresh(),this.draw(this.batch)},this.canvas=this.gl.canvas,this.update(h(t)?t:{})};T.prototype.createShader=function(){var t=this.regl,e=t({blend:{enable:!0,color:[0,0,0,1],func:{srcRGB:\"src alpha\",dstRGB:\"one minus src alpha\",srcAlpha:\"one minus dst alpha\",dstAlpha:\"one\"}},stencil:{enable:!1},depth:{enable:!1},count:t.prop(\"count\"),offset:t.prop(\"offset\"),attributes:{charOffset:{offset:4,stride:8,buffer:t.this(\"sizeBuffer\")},width:{offset:0,stride:8,buffer:t.this(\"sizeBuffer\")},char:t.this(\"charBuffer\"),position:t.this(\"position\")},uniforms:{atlasSize:function(t,e){return[e.atlas.width,e.atlas.height]},atlasDim:function(t,e){return[e.atlas.cols,e.atlas.rows]},atlas:function(t,e){return e.atlas.texture},charStep:function(t,e){return e.atlas.step},em:function(t,e){return e.atlas.em},color:t.prop(\"color\"),opacity:t.prop(\"opacity\"),viewport:t.this(\"viewportArray\"),scale:t.this(\"scale\"),align:t.prop(\"align\"),baseline:t.prop(\"baseline\"),translate:t.this(\"translate\"),positionOffset:t.prop(\"positionOffset\")},primitive:\"points\",viewport:t.this(\"viewport\"),vert:\"\\n\\t\\t\\tprecision highp float;\\n\\t\\t\\tattribute float width, charOffset, char;\\n\\t\\t\\tattribute vec2 position;\\n\\t\\t\\tuniform float fontSize, charStep, em, align, baseline;\\n\\t\\t\\tuniform vec4 viewport;\\n\\t\\t\\tuniform vec4 color;\\n\\t\\t\\tuniform vec2 atlasSize, atlasDim, scale, translate, positionOffset;\\n\\t\\t\\tvarying vec2 charCoord, charId;\\n\\t\\t\\tvarying float charWidth;\\n\\t\\t\\tvarying vec4 fontColor;\\n\\t\\t\\tvoid main () {\\n\\t\\t\\t\\tvec2 offset = floor(em * (vec2(align + charOffset, baseline)\\n\\t\\t\\t\\t\\t+ vec2(positionOffset.x, -positionOffset.y)))\\n\\t\\t\\t\\t\\t/ (viewport.zw * scale.xy);\\n\\n\\t\\t\\t\\tvec2 position = (position + translate) * scale;\\n\\t\\t\\t\\tposition += offset * scale;\\n\\n\\t\\t\\t\\tcharCoord = position * viewport.zw + viewport.xy;\\n\\n\\t\\t\\t\\tgl_Position = vec4(position * 2. - 1., 0, 1);\\n\\n\\t\\t\\t\\tgl_PointSize = charStep;\\n\\n\\t\\t\\t\\tcharId.x = mod(char, atlasDim.x);\\n\\t\\t\\t\\tcharId.y = floor(char / atlasDim.x);\\n\\n\\t\\t\\t\\tcharWidth = width * em;\\n\\n\\t\\t\\t\\tfontColor = color / 255.;\\n\\t\\t\\t}\",frag:\"\\n\\t\\t\\tprecision highp float;\\n\\t\\t\\tuniform float fontSize, charStep, opacity;\\n\\t\\t\\tuniform vec2 atlasSize;\\n\\t\\t\\tuniform vec4 viewport;\\n\\t\\t\\tuniform sampler2D atlas;\\n\\t\\t\\tvarying vec4 fontColor;\\n\\t\\t\\tvarying vec2 charCoord, charId;\\n\\t\\t\\tvarying float charWidth;\\n\\n\\t\\t\\tfloat lightness(vec4 color) {\\n\\t\\t\\t\\treturn color.r * 0.299 + color.g * 0.587 + color.b * 0.114;\\n\\t\\t\\t}\\n\\n\\t\\t\\tvoid main () {\\n\\t\\t\\t\\tvec2 uv = gl_FragCoord.xy - charCoord + charStep * .5;\\n\\t\\t\\t\\tfloat halfCharStep = floor(charStep * .5 + .5);\\n\\n\\t\\t\\t\\t// invert y and shift by 1px (FF expecially needs that)\\n\\t\\t\\t\\tuv.y = charStep - uv.y;\\n\\n\\t\\t\\t\\t// ignore points outside of character bounding box\\n\\t\\t\\t\\tfloat halfCharWidth = ceil(charWidth * .5);\\n\\t\\t\\t\\tif (floor(uv.x) > halfCharStep + halfCharWidth ||\\n\\t\\t\\t\\t\\tfloor(uv.x) < halfCharStep - halfCharWidth) return;\\n\\n\\t\\t\\t\\tuv += charId * charStep;\\n\\t\\t\\t\\tuv = uv / atlasSize;\\n\\n\\t\\t\\t\\tvec4 color = fontColor;\\n\\t\\t\\t\\tvec4 mask = texture2D(atlas, uv);\\n\\n\\t\\t\\t\\tfloat maskY = lightness(mask);\\n\\t\\t\\t\\t// float colorY = lightness(color);\\n\\t\\t\\t\\tcolor.a *= maskY;\\n\\t\\t\\t\\tcolor.a *= opacity;\\n\\n\\t\\t\\t\\t// color.a += .1;\\n\\n\\t\\t\\t\\t// antialiasing, see yiq color space y-channel formula\\n\\t\\t\\t\\t// color.rgb += (1. - color.rgb) * (1. - mask.rgb);\\n\\n\\t\\t\\t\\tgl_FragColor = color;\\n\\t\\t\\t}\"});return{regl:t,draw:e,atlas:{}}},T.prototype.update=function(t){var e=this;if(\"string\"==typeof t)t={text:t};else if(!t)return;null!=(t=i(t,{position:\"position positions coord coords coordinates\",font:\"font fontFace fontface typeface cssFont css-font family fontFamily\",fontSize:\"fontSize fontsize size font-size\",text:\"text texts chars characters value values symbols\",align:\"align alignment textAlign textbaseline\",baseline:\"baseline textBaseline textbaseline\",direction:\"dir direction textDirection\",color:\"color colour fill fill-color fillColor textColor textcolor\",kerning:\"kerning kern\",range:\"range dataBox\",viewport:\"vp viewport viewBox viewbox viewPort\",opacity:\"opacity alpha transparency visible visibility opaque\",offset:\"offset positionOffset padding shift indent indentation\"},!0)).opacity&&(Array.isArray(t.opacity)?this.opacity=t.opacity.map((function(t){return parseFloat(t)})):this.opacity=parseFloat(t.opacity)),null!=t.viewport&&(this.viewport=f(t.viewport),this.viewportArray=[this.viewport.x,this.viewport.y,this.viewport.width,this.viewport.height]),null==this.viewport&&(this.viewport={x:0,y:0,width:this.gl.drawingBufferWidth,height:this.gl.drawingBufferHeight},this.viewportArray=[this.viewport.x,this.viewport.y,this.viewport.width,this.viewport.height]),null!=t.kerning&&(this.kerning=t.kerning),null!=t.offset&&(\"number\"==typeof t.offset&&(t.offset=[t.offset,0]),this.positionOffset=m(t.offset)),t.direction&&(this.direction=t.direction),t.range&&(this.range=t.range,this.scale=[1/(t.range[2]-t.range[0]),1/(t.range[3]-t.range[1])],this.translate=[-t.range[0],-t.range[1]]),t.scale&&(this.scale=t.scale),t.translate&&(this.translate=t.translate),this.scale||(this.scale=[1/this.viewport.width,1/this.viewport.height]),this.translate||(this.translate=[0,0]),this.font.length||t.font||(t.font=T.baseFontSize+\"px sans-serif\");var r,a=!1,o=!1;if(t.font&&(Array.isArray(t.font)?t.font:[t.font]).forEach((function(t,r){if(\"string\"==typeof t)try{t=n.parse(t)}catch(e){t=n.parse(T.baseFontSize+\"px \"+t)}else{var i=t.style,s=t.weight,l=t.stretch,u=t.variant;t=n.parse(n.stringify(t)),i&&(t.style=i),s&&(t.weight=s),l&&(t.stretch=l),u&&(t.variant=u)}var c=n.stringify({size:T.baseFontSize,family:t.family,stretch:_?t.stretch:void 0,variant:t.variant,weight:t.weight,style:t.style}),f=p(t.size),h=Math.round(f[0]*d(f[1]));if(h!==e.fontSize[r]&&(o=!0,e.fontSize[r]=h),!(e.font[r]&&c==e.font[r].baseString||(a=!0,e.font[r]=T.fonts[c],e.font[r]))){var v=t.family.join(\", \"),g=[t.style];t.style!=t.variant&&g.push(t.variant),t.variant!=t.weight&&g.push(t.weight),_&&t.weight!=t.stretch&&g.push(t.stretch),e.font[r]={baseString:c,family:v,weight:t.weight,stretch:t.stretch,style:t.style,variant:t.variant,width:{},kerning:{},metrics:y(v,{origin:\"top\",fontSize:T.baseFontSize,fontStyle:g.join(\" \")})},T.fonts[c]=e.font[r]}})),(a||o)&&this.font.forEach((function(r,i){var a=n.stringify({size:e.fontSize[i],family:r.family,stretch:_?r.stretch:void 0,variant:r.variant,weight:r.weight,style:r.style});if(e.fontAtlas[i]=e.shader.atlas[a],!e.fontAtlas[i]){var o=r.metrics;e.shader.atlas[a]=e.fontAtlas[i]={fontString:a,step:2*Math.ceil(e.fontSize[i]*o.bottom*.5),em:e.fontSize[i],cols:0,rows:0,height:0,width:0,chars:[],ids:{},texture:e.regl.texture()}}null==t.text&&(t.text=e.text)})),\"string\"==typeof t.text&&t.position&&t.position.length>2){for(var s=Array(.5*t.position.length),h=0;h2){for(var w=!t.position[0].length,k=c.mallocFloat(2*this.count),A=0,M=0;A1?e.align[r]:e.align[0]:e.align;if(\"number\"==typeof n)return n;switch(n){case\"right\":case\"end\":return-t;case\"center\":case\"centre\":case\"middle\":return.5*-t}return 0}))),null==this.baseline&&null==t.baseline&&(t.baseline=0),null!=t.baseline&&(this.baseline=t.baseline,Array.isArray(this.baseline)||(this.baseline=[this.baseline]),this.baselineOffset=this.baseline.map((function(t,r){var n=(e.font[r]||e.font[0]).metrics,i=0;return i+=.5*n.bottom,-1*(i+=\"number\"==typeof t?t-n.baseline:-n[t])}))),null!=t.color)if(t.color||(t.color=\"transparent\"),\"string\"!=typeof t.color&&isNaN(t.color)){var H;if(\"number\"==typeof t.color[0]&&t.color.length>this.counts.length){var G=t.color.length;H=c.mallocUint8(G);for(var W=(t.color.subarray||t.color.slice).bind(t.color),Y=0;Y4||this.baselineOffset.length>1||this.align&&this.align.length>1||this.fontAtlas.length>1||this.positionOffset.length>2){var K=Math.max(.5*this.position.length||0,.25*this.color.length||0,this.baselineOffset.length||0,this.alignOffset.length||0,this.font.length||0,this.opacity.length||0,.5*this.positionOffset.length||0);this.batch=Array(K);for(var J=0;J1?this.counts[J]:this.counts[0],offset:this.textOffsets.length>1?this.textOffsets[J]:this.textOffsets[0],color:this.color?this.color.length<=4?this.color:this.color.subarray(4*J,4*J+4):[0,0,0,255],opacity:Array.isArray(this.opacity)?this.opacity[J]:this.opacity,baseline:null!=this.baselineOffset[J]?this.baselineOffset[J]:this.baselineOffset[0],align:this.align?null!=this.alignOffset[J]?this.alignOffset[J]:this.alignOffset[0]:0,atlas:this.fontAtlas[J]||this.fontAtlas[0],positionOffset:this.positionOffset.length>2?this.positionOffset.subarray(2*J,2*J+2):this.positionOffset}}else this.count?this.batch=[{count:this.count,offset:0,color:this.color||[0,0,0,255],opacity:Array.isArray(this.opacity)?this.opacity[0]:this.opacity,baseline:this.baselineOffset[0],align:this.alignOffset?this.alignOffset[0]:0,atlas:this.fontAtlas[0],positionOffset:this.positionOffset}]:this.batch=[]},T.prototype.destroy=function(){},T.prototype.kerning=!0,T.prototype.position={constant:new Float32Array(2)},T.prototype.translate=null,T.prototype.scale=null,T.prototype.font=null,T.prototype.text=\"\",T.prototype.positionOffset=[0,0],T.prototype.opacity=1,T.prototype.color=new Uint8Array([0,0,0,255]),T.prototype.alignOffset=[0,0],T.maxAtlasSize=1024,T.atlasCanvas=document.createElement(\"canvas\"),T.atlasContext=T.atlasCanvas.getContext(\"2d\",{alpha:!1}),T.baseFontSize=64,T.fonts={},t.exports=T},55212:function(t,e,r){\"use strict\";var n=r(55616);function i(t){if(t.container)if(t.container==document.body)document.body.style.width||(t.canvas.width=t.width||t.pixelRatio*r.g.innerWidth),document.body.style.height||(t.canvas.height=t.height||t.pixelRatio*r.g.innerHeight);else{var e=t.container.getBoundingClientRect();t.canvas.width=t.width||e.right-e.left,t.canvas.height=t.height||e.bottom-e.top}}function a(t){return\"function\"==typeof t.getContext&&\"width\"in t&&\"height\"in t}function o(){var t=document.createElement(\"canvas\");return t.style.position=\"absolute\",t.style.top=0,t.style.left=0,t}t.exports=function(t){var e;if(t?\"string\"==typeof t&&(t={container:t}):t={},(t=a(t)||\"string\"==typeof(e=t).nodeName&&\"function\"==typeof e.appendChild&&\"function\"==typeof e.getBoundingClientRect?{container:t}:function(t){return\"function\"==typeof t.drawArrays||\"function\"==typeof t.drawElements}(t)?{gl:t}:n(t,{container:\"container target element el canvas holder parent parentNode wrapper use ref root node\",gl:\"gl context webgl glContext\",attrs:\"attributes attrs contextAttributes\",pixelRatio:\"pixelRatio pxRatio px ratio pxratio pixelratio\",width:\"w width\",height:\"h height\"},!0)).pixelRatio||(t.pixelRatio=r.g.pixelRatio||1),t.gl)return t.gl;if(t.canvas&&(t.container=t.canvas.parentNode),t.container){if(\"string\"==typeof t.container){var s=document.querySelector(t.container);if(!s)throw Error(\"Element \"+t.container+\" is not found\");t.container=s}a(t.container)?(t.canvas=t.container,t.container=t.canvas.parentNode):t.canvas||(t.canvas=o(),t.container.appendChild(t.canvas),i(t))}else if(!t.canvas){if(\"undefined\"==typeof document)throw Error(\"Not DOM environment. Use headless-gl.\");t.container=document.body||document.documentElement,t.canvas=o(),t.container.appendChild(t.canvas),i(t)}return t.gl||[\"webgl\",\"experimental-webgl\",\"webgl-experimental\"].some((function(e){try{t.gl=t.canvas.getContext(e,t.attrs)}catch(t){}return t.gl})),t.gl}},26444:function(t){t.exports=function(t){\"string\"==typeof t&&(t=[t]);for(var e=[].slice.call(arguments,1),r=[],n=0;n>1,c=-7,f=r?i-1:0,h=r?-1:1,p=t[e+f];for(f+=h,a=p&(1<<-c)-1,p>>=-c,c+=s;c>0;a=256*a+t[e+f],f+=h,c-=8);for(o=a&(1<<-c)-1,a>>=-c,c+=n;c>0;o=256*o+t[e+f],f+=h,c-=8);if(0===a)a=1-u;else{if(a===l)return o?NaN:1/0*(p?-1:1);o+=Math.pow(2,n),a-=u}return(p?-1:1)*o*Math.pow(2,a-n)},e.write=function(t,e,r,n,i,a){var o,s,l,u=8*a-i-1,c=(1<>1,h=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,p=n?0:a-1,d=n?1:-1,v=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(s=isNaN(e)?1:0,o=c):(o=Math.floor(Math.log(e)/Math.LN2),e*(l=Math.pow(2,-o))<1&&(o--,l*=2),(e+=o+f>=1?h/l:h*Math.pow(2,1-f))*l>=2&&(o++,l/=2),o+f>=c?(s=0,o=c):o+f>=1?(s=(e*l-1)*Math.pow(2,i),o+=f):(s=e*Math.pow(2,f-1)*Math.pow(2,i),o=0));i>=8;t[r+p]=255&s,p+=d,s/=256,i-=8);for(o=o<0;t[r+p]=255&o,p+=d,o/=256,u-=8);t[r+p-d]|=128*v}},6768:function(t){\"function\"==typeof Object.create?t.exports=function(t,e){e&&(t.super_=e,t.prototype=Object.create(e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}))}:t.exports=function(t,e){if(e){t.super_=e;var r=function(){};r.prototype=e.prototype,t.prototype=new r,t.prototype.constructor=t}}},91148:function(t,e,r){\"use strict\";var n=r(46672)(),i=r(99676)(\"Object.prototype.toString\"),a=function(t){return!(n&&t&&\"object\"==typeof t&&Symbol.toStringTag in t)&&\"[object Arguments]\"===i(t)},o=function(t){return!!a(t)||null!==t&&\"object\"==typeof t&&\"number\"==typeof t.length&&t.length>=0&&\"[object Array]\"!==i(t)&&\"[object Function]\"===i(t.callee)},s=function(){return a(arguments)}();a.isLegacyArguments=o,t.exports=s?a:o},24200:function(t){t.exports=!0},90720:function(t){\"use strict\";var e,r,n=Function.prototype.toString,i=\"object\"==typeof Reflect&&null!==Reflect&&Reflect.apply;if(\"function\"==typeof i&&\"function\"==typeof Object.defineProperty)try{e=Object.defineProperty({},\"length\",{get:function(){throw r}}),r={},i((function(){throw 42}),null,e)}catch(t){t!==r&&(i=null)}else i=null;var a=/^\\s*class\\b/,o=function(t){try{var e=n.call(t);return a.test(e)}catch(t){return!1}},s=function(t){try{return!o(t)&&(n.call(t),!0)}catch(t){return!1}},l=Object.prototype.toString,u=\"function\"==typeof Symbol&&!!Symbol.toStringTag,c=!(0 in[,]),f=function(){return!1};if(\"object\"==typeof document){var h=document.all;l.call(h)===l.call(document.all)&&(f=function(t){if((c||!t)&&(void 0===t||\"object\"==typeof t))try{var e=l.call(t);return(\"[object HTMLAllCollection]\"===e||\"[object HTML document.all class]\"===e||\"[object HTMLCollection]\"===e||\"[object Object]\"===e)&&null==t(\"\")}catch(t){}return!1})}t.exports=i?function(t){if(f(t))return!0;if(!t)return!1;if(\"function\"!=typeof t&&\"object\"!=typeof t)return!1;try{i(t,null,e)}catch(t){if(t!==r)return!1}return!o(t)&&s(t)}:function(t){if(f(t))return!0;if(!t)return!1;if(\"function\"!=typeof t&&\"object\"!=typeof t)return!1;if(u)return s(t);if(o(t))return!1;var e=l.call(t);return!(\"[object Function]\"!==e&&\"[object GeneratorFunction]\"!==e&&!/^\\[object HTML/.test(e))&&s(t)}},84420:function(t,e,r){\"use strict\";var n,i=Object.prototype.toString,a=Function.prototype.toString,o=/^\\s*(?:function)?\\*/,s=r(46672)(),l=Object.getPrototypeOf;t.exports=function(t){if(\"function\"!=typeof t)return!1;if(o.test(a.call(t)))return!0;if(!s)return\"[object GeneratorFunction]\"===i.call(t);if(!l)return!1;if(void 0===n){var e=function(){if(!s)return!1;try{return Function(\"return function*() {}\")()}catch(t){}}();n=!!e&&l(e)}return l(t)===n}},96604:function(t){\"use strict\";t.exports=\"undefined\"!=typeof navigator&&(/MSIE/.test(navigator.userAgent)||/Trident\\//.test(navigator.appVersion))},85992:function(t){\"use strict\";t.exports=function(t){return t!=t}},1560:function(t,e,r){\"use strict\";var n=r(57916),i=r(81288),a=r(85992),o=r(57740),s=r(59736),l=n(o(),Number);i(l,{getPolyfill:o,implementation:a,shim:s}),t.exports=l},57740:function(t,e,r){\"use strict\";var n=r(85992);t.exports=function(){return Number.isNaN&&Number.isNaN(NaN)&&!Number.isNaN(\"a\")?Number.isNaN:n}},59736:function(t,e,r){\"use strict\";var n=r(81288),i=r(57740);t.exports=function(){var t=i();return n(Number,{isNaN:t},{isNaN:function(){return Number.isNaN!==t}}),t}},18400:function(t){\"use strict\";t.exports=function(t){var e=typeof t;return null!==t&&(\"object\"===e||\"function\"===e)}},58908:function(t){\"use strict\";var e=Object.prototype.toString;t.exports=function(t){var r;return\"[object Object]\"===e.call(t)&&(null===(r=Object.getPrototypeOf(t))||r===Object.getPrototypeOf({}))}},94576:function(t){\"use strict\";t.exports=function(t){for(var e,r=t.length,n=0;n13)&&32!==e&&133!==e&&160!==e&&5760!==e&&6158!==e&&(e<8192||e>8205)&&8232!==e&&8233!==e&&8239!==e&&8287!==e&&8288!==e&&12288!==e&&65279!==e)return!1;return!0}},53520:function(t){\"use strict\";t.exports=function(t){return\"string\"==typeof t&&(t=t.trim(),!!(/^[mzlhvcsqta]\\s*[-+.0-9][^mlhvzcsqta]+/i.test(t)&&/[\\dz]$/i.test(t)&&t.length>4))}},7728:function(t,e,r){\"use strict\";var n=r(46492),i=r(63436),a=r(99676),o=a(\"Object.prototype.toString\"),s=r(46672)(),l=r(2304),u=\"undefined\"==typeof globalThis?r.g:globalThis,c=i(),f=a(\"Array.prototype.indexOf\",!0)||function(t,e){for(var r=0;r-1}return!!l&&function(t){var e=!1;return n(p,(function(r,n){if(!e)try{e=r.call(t)===n}catch(t){}})),e}(t)}},76244:function(t){\"use strict\";t.exports=Math.log2||function(t){return Math.log(t)*Math.LOG2E}},62644:function(t,e,r){\"use strict\";t.exports=function(t,e){e||(e=t,t=window);var r=0,i=0,a=0,o={shift:!1,alt:!1,control:!1,meta:!1},s=!1;function l(t){var e=!1;return\"altKey\"in t&&(e=e||t.altKey!==o.alt,o.alt=!!t.altKey),\"shiftKey\"in t&&(e=e||t.shiftKey!==o.shift,o.shift=!!t.shiftKey),\"ctrlKey\"in t&&(e=e||t.ctrlKey!==o.control,o.control=!!t.ctrlKey),\"metaKey\"in t&&(e=e||t.metaKey!==o.meta,o.meta=!!t.metaKey),e}function u(t,s){var u=n.x(s),c=n.y(s);\"buttons\"in s&&(t=0|s.buttons),(t!==r||u!==i||c!==a||l(s))&&(r=0|t,i=u||0,a=c||0,e&&e(r,i,a,o))}function c(t){u(0,t)}function f(){(r||i||a||o.shift||o.alt||o.meta||o.control)&&(i=a=0,r=0,o.shift=o.alt=o.control=o.meta=!1,e&&e(0,0,0,o))}function h(t){l(t)&&e&&e(r,i,a,o)}function p(t){0===n.buttons(t)?u(0,t):u(r,t)}function d(t){u(r|n.buttons(t),t)}function v(t){u(r&~n.buttons(t),t)}function g(){s||(s=!0,t.addEventListener(\"mousemove\",p),t.addEventListener(\"mousedown\",d),t.addEventListener(\"mouseup\",v),t.addEventListener(\"mouseleave\",c),t.addEventListener(\"mouseenter\",c),t.addEventListener(\"mouseout\",c),t.addEventListener(\"mouseover\",c),t.addEventListener(\"blur\",f),t.addEventListener(\"keyup\",h),t.addEventListener(\"keydown\",h),t.addEventListener(\"keypress\",h),t!==window&&(window.addEventListener(\"blur\",f),window.addEventListener(\"keyup\",h),window.addEventListener(\"keydown\",h),window.addEventListener(\"keypress\",h)))}g();var y={element:t};return Object.defineProperties(y,{enabled:{get:function(){return s},set:function(e){e?g():s&&(s=!1,t.removeEventListener(\"mousemove\",p),t.removeEventListener(\"mousedown\",d),t.removeEventListener(\"mouseup\",v),t.removeEventListener(\"mouseleave\",c),t.removeEventListener(\"mouseenter\",c),t.removeEventListener(\"mouseout\",c),t.removeEventListener(\"mouseover\",c),t.removeEventListener(\"blur\",f),t.removeEventListener(\"keyup\",h),t.removeEventListener(\"keydown\",h),t.removeEventListener(\"keypress\",h),t!==window&&(window.removeEventListener(\"blur\",f),window.removeEventListener(\"keyup\",h),window.removeEventListener(\"keydown\",h),window.removeEventListener(\"keypress\",h)))},enumerable:!0},buttons:{get:function(){return r},enumerable:!0},x:{get:function(){return i},enumerable:!0},y:{get:function(){return a},enumerable:!0},mods:{get:function(){return o},enumerable:!0}}),y};var n=r(93784)},29128:function(t){var e={left:0,top:0};t.exports=function(t,r,n){r=r||t.currentTarget||t.srcElement,Array.isArray(n)||(n=[0,0]);var i,a=t.clientX||0,o=t.clientY||0,s=(i=r)===window||i===document||i===document.body?e:i.getBoundingClientRect();return n[0]=a-s.left,n[1]=o-s.top,n}},93784:function(t,e){\"use strict\";function r(t){return t.target||t.srcElement||window}e.buttons=function(t){if(\"object\"==typeof t){if(\"buttons\"in t)return t.buttons;if(\"which\"in t){if(2===(e=t.which))return 4;if(3===e)return 2;if(e>0)return 1<=0)return 1<0&&a(s,r))}catch(t){c.call(new h(r),t)}}}function c(t){var e=this;e.triggered||(e.triggered=!0,e.def&&(e=e.def),e.msg=t,e.state=2,e.chain.length>0&&a(s,e))}function f(t,e,r,n){for(var i=0;i1&&(i*=y=Math.sqrt(y),s*=y);var m=i*i,x=s*s,b=(u==c?-1:1)*Math.sqrt(Math.abs((m*x-m*g*g-x*v*v)/(m*g*g+x*v*v)));b==1/0&&(b=1);var _=b*i*g/s+(t+f)/2,w=b*-s*v/i+(n+h)/2,T=Math.asin(((n-w)/s).toFixed(9)),k=Math.asin(((h-w)/s).toFixed(9));(T=t<_?e-T:T)<0&&(T=2*e+T),(k=f<_?e-k:k)<0&&(k=2*e+k),c&&T>k&&(T-=2*e),!c&&k>T&&(k-=2*e)}if(Math.abs(k-T)>r){var A=k,M=f,S=h;k=T+r*(c&&k>T?1:-1);var E=a(f=_+i*Math.cos(k),h=w+s*Math.sin(k),i,s,l,0,c,M,S,[k,A,_,w])}var L=Math.tan((k-T)/4),C=4/3*i*L,P=4/3*s*L,O=[2*t-(t+C*Math.sin(T)),2*n-(n-P*Math.cos(T)),f+C*Math.sin(k),h-P*Math.cos(k),f,h];if(p)return O;E&&(O=O.concat(E));for(var I=0;I7&&(r.push(y.splice(0,7)),y.unshift(\"C\"));break;case\"S\":var x=p,b=d;\"C\"!=e&&\"S\"!=e||(x+=x-o,b+=b-l),y=[\"C\",x,b,y[1],y[2],y[3],y[4]];break;case\"T\":\"Q\"==e||\"T\"==e?(f=2*p-f,h=2*d-h):(f=p,h=d),y=i(p,d,f,h,y[1],y[2]);break;case\"Q\":f=y[1],h=y[2],y=i(p,d,y[1],y[2],y[3],y[4]);break;case\"L\":y=n(p,d,y[1],y[2]);break;case\"H\":y=n(p,d,y[1],d);break;case\"V\":y=n(p,d,p,y[1]);break;case\"Z\":y=n(p,d,u,c)}e=m,p=y[y.length-2],d=y[y.length-1],y.length>4?(o=y[y.length-4],l=y[y.length-3]):(o=p,l=d),r.push(y)}return r}},50896:function(t){\"use strict\";var e=Object.getOwnPropertySymbols,r=Object.prototype.hasOwnProperty,n=Object.prototype.propertyIsEnumerable;t.exports=function(){try{if(!Object.assign)return!1;var t=new String(\"abc\");if(t[5]=\"de\",\"5\"===Object.getOwnPropertyNames(t)[0])return!1;for(var e={},r=0;r<10;r++)e[\"_\"+String.fromCharCode(r)]=r;if(\"0123456789\"!==Object.getOwnPropertyNames(e).map((function(t){return e[t]})).join(\"\"))return!1;var n={};return\"abcdefghijklmnopqrst\".split(\"\").forEach((function(t){n[t]=t})),\"abcdefghijklmnopqrst\"===Object.keys(Object.assign({},n)).join(\"\")}catch(t){return!1}}()?Object.assign:function(t,i){for(var a,o,s=function(t){if(null==t)throw new TypeError(\"Object.assign cannot be called with null or undefined\");return Object(t)}(t),l=1;l0&&!i.call(t,0))for(var v=0;v0)for(var g=0;g=0&&\"[object Function]\"===e.call(t.callee)),n}},32868:function(t){\"use strict\";function e(t,e){if(\"string\"!=typeof t)return[t];var r=[t];\"string\"==typeof e||Array.isArray(e)?e={brackets:e}:e||(e={});var n=e.brackets?Array.isArray(e.brackets)?e.brackets:[e.brackets]:[\"{}\",\"[]\",\"()\"],i=e.escape||\"___\",a=!!e.flat;n.forEach((function(t){var e=new RegExp([\"\\\\\",t[0],\"[^\\\\\",t[0],\"\\\\\",t[1],\"]*\\\\\",t[1]].join(\"\")),n=[];function a(e,a,o){var s=r.push(e.slice(t[0].length,-t[1].length))-1;return n.push(s),i+s+i}r.forEach((function(t,n){for(var i,o=0;t!=i;)if(i=t,t=t.replace(e,a),o++>1e4)throw Error(\"References have circular dependency. Please, check them.\");r[n]=t})),n=n.reverse(),r=r.map((function(e){return n.forEach((function(r){e=e.replace(new RegExp(\"(\\\\\"+i+r+\"\\\\\"+i+\")\",\"g\"),t[0]+\"$1\"+t[1])})),e}))}));var o=new RegExp(\"\\\\\"+i+\"([0-9]+)\\\\\"+i);return a?r:function t(e,r,n){for(var i,a=[],s=0;i=o.exec(e);){if(s++>1e4)throw Error(\"Circular references in parenthesis\");a.push(e.slice(0,i.index)),a.push(t(r[i[1]],r)),e=e.slice(i.index+i[0].length)}return a.push(e),a}(r[0],r)}function r(t,e){if(e&&e.flat){var r,n=e&&e.escape||\"___\",i=t[0];if(!i)return\"\";for(var a=new RegExp(\"\\\\\"+n+\"([0-9]+)\\\\\"+n),o=0;i!=r;){if(o++>1e4)throw Error(\"Circular references in \"+t);r=i,i=i.replace(a,s)}return i}return t.reduce((function t(e,r){return Array.isArray(r)&&(r=r.reduce(t,\"\")),e+r}),\"\");function s(e,r){if(null==t[r])throw Error(\"Reference \"+r+\"is undefined\");return t[r]}}function n(t,n){return Array.isArray(t)?r(t,n):e(t,n)}n.parse=e,n.stringify=r,t.exports=n},51160:function(t,e,r){\"use strict\";var n=r(55616);t.exports=function(t){var e;return arguments.length>1&&(t=arguments),\"string\"==typeof t?t=t.split(/\\s/).map(parseFloat):\"number\"==typeof t&&(t=[t]),t.length&&\"number\"==typeof t[0]?e=1===t.length?{width:t[0],height:t[0],x:0,y:0}:2===t.length?{width:t[0],height:t[1],x:0,y:0}:{x:t[0],y:t[1],width:t[2]-t[0]||0,height:t[3]-t[1]||0}:t&&(e={x:(t=n(t,{left:\"x l left Left\",top:\"y t top Top\",width:\"w width W Width\",height:\"h height W Width\",bottom:\"b bottom Bottom\",right:\"r right Right\"})).left||0,y:t.top||0},null==t.width?t.right?e.width=t.right-e.x:e.width=0:e.width=t.width,null==t.height?t.bottom?e.height=t.bottom-e.y:e.height=0:e.height=t.height),e}},21984:function(t){t.exports=function(t){var i=[];return t.replace(r,(function(t,r,a){var o=r.toLowerCase();for(a=function(t){var e=t.match(n);return e?e.map(Number):[]}(a),\"m\"==o&&a.length>2&&(i.push([r].concat(a.splice(0,2))),o=\"l\",r=\"m\"==r?\"l\":\"L\");;){if(a.length==e[o])return a.unshift(r),i.push(a);if(a.lengtha!=p>a&&i<(h-c)*(a-f)/(p-f)+c&&(o=!o)}return o}},14756:function(t,e,r){var n,i=r(7688),a=r(28648),o=r(72200),s=r(11403),l=r(82368),u=r(17792),c=!1,f=a();function h(t,e,r){var i=n.segments(t),a=n.segments(e),o=r(n.combine(i,a));return n.polygon(o)}n={buildLog:function(t){return!0===t?c=i():!1===t&&(c=!1),!1!==c&&c.list},epsilon:function(t){return f.epsilon(t)},segments:function(t){var e=o(!0,f,c);return t.regions.forEach(e.addRegion),{segments:e.calculate(t.inverted),inverted:t.inverted}},combine:function(t,e){return{combined:o(!1,f,c).calculate(t.segments,t.inverted,e.segments,e.inverted),inverted1:t.inverted,inverted2:e.inverted}},selectUnion:function(t){return{segments:l.union(t.combined,c),inverted:t.inverted1||t.inverted2}},selectIntersect:function(t){return{segments:l.intersect(t.combined,c),inverted:t.inverted1&&t.inverted2}},selectDifference:function(t){return{segments:l.difference(t.combined,c),inverted:t.inverted1&&!t.inverted2}},selectDifferenceRev:function(t){return{segments:l.differenceRev(t.combined,c),inverted:!t.inverted1&&t.inverted2}},selectXor:function(t){return{segments:l.xor(t.combined,c),inverted:t.inverted1!==t.inverted2}},polygon:function(t){return{regions:s(t.segments,f,c),inverted:t.inverted}},polygonFromGeoJSON:function(t){return u.toPolygon(n,t)},polygonToGeoJSON:function(t){return u.fromPolygon(n,f,t)},union:function(t,e){return h(t,e,n.selectUnion)},intersect:function(t,e){return h(t,e,n.selectIntersect)},difference:function(t,e){return h(t,e,n.selectDifference)},differenceRev:function(t,e){return h(t,e,n.selectDifferenceRev)},xor:function(t,e){return h(t,e,n.selectXor)}},\"object\"==typeof window&&(window.PolyBool=n),t.exports=n},7688:function(t){t.exports=function(){var t,e=0,r=!1;function n(e,r){return t.list.push({type:e,data:r?JSON.parse(JSON.stringify(r)):void 0}),t}return t={list:[],segmentId:function(){return e++},checkIntersection:function(t,e){return n(\"check\",{seg1:t,seg2:e})},segmentChop:function(t,e){return n(\"div_seg\",{seg:t,pt:e}),n(\"chop\",{seg:t,pt:e})},statusRemove:function(t){return n(\"pop_seg\",{seg:t})},segmentUpdate:function(t){return n(\"seg_update\",{seg:t})},segmentNew:function(t,e){return n(\"new_seg\",{seg:t,primary:e})},segmentRemove:function(t){return n(\"rem_seg\",{seg:t})},tempStatus:function(t,e,r){return n(\"temp_status\",{seg:t,above:e,below:r})},rewind:function(t){return n(\"rewind\",{seg:t})},status:function(t,e,r){return n(\"status\",{seg:t,above:e,below:r})},vert:function(e){return e===r?t:(r=e,n(\"vert\",{x:e}))},log:function(t){return\"string\"!=typeof t&&(t=JSON.stringify(t,!1,\" \")),n(\"log\",{txt:t})},reset:function(){return n(\"reset\")},selected:function(t){return n(\"selected\",{segs:t})},chainStart:function(t){return n(\"chain_start\",{seg:t})},chainRemoveHead:function(t,e){return n(\"chain_rem_head\",{index:t,pt:e})},chainRemoveTail:function(t,e){return n(\"chain_rem_tail\",{index:t,pt:e})},chainNew:function(t,e){return n(\"chain_new\",{pt1:t,pt2:e})},chainMatch:function(t){return n(\"chain_match\",{index:t})},chainClose:function(t){return n(\"chain_close\",{index:t})},chainAddHead:function(t,e){return n(\"chain_add_head\",{index:t,pt:e})},chainAddTail:function(t,e){return n(\"chain_add_tail\",{index:t,pt:e})},chainConnect:function(t,e){return n(\"chain_con\",{index1:t,index2:e})},chainReverse:function(t){return n(\"chain_rev\",{index:t})},chainJoin:function(t,e){return n(\"chain_join\",{index1:t,index2:e})},done:function(){return n(\"done\")}}}},28648:function(t){t.exports=function(t){\"number\"!=typeof t&&(t=1e-10);var e={epsilon:function(e){return\"number\"==typeof e&&(t=e),t},pointAboveOrOnLine:function(e,r,n){var i=r[0],a=r[1],o=n[0],s=n[1],l=e[0];return(o-i)*(e[1]-a)-(s-a)*(l-i)>=-t},pointBetween:function(e,r,n){var i=e[1]-r[1],a=n[0]-r[0],o=e[0]-r[0],s=n[1]-r[1],l=o*a+i*s;return!(l-t)},pointsSameX:function(e,r){return Math.abs(e[0]-r[0])t!=o-i>t&&(a-u)*(i-c)/(o-c)+u-n>t&&(s=!s),a=u,o=c}return s}};return e}},17792:function(t){var e={toPolygon:function(t,e){function r(e){if(e.length<=0)return t.segments({inverted:!1,regions:[]});function r(e){var r=e.slice(0,e.length-1);return t.segments({inverted:!1,regions:[r]})}for(var n=r(e[0]),i=1;i0}))}function c(t,n){var i=t.seg,a=n.seg,o=i.start,s=i.end,u=a.start,c=a.end;r&&r.checkIntersection(i,a);var f=e.linesIntersect(o,s,u,c);if(!1===f){if(!e.pointsCollinear(o,s,u))return!1;if(e.pointsSame(o,c)||e.pointsSame(s,u))return!1;var h=e.pointsSame(o,u),p=e.pointsSame(s,c);if(h&&p)return n;var d=!h&&e.pointBetween(o,u,c),v=!p&&e.pointBetween(s,u,c);if(h)return v?l(n,s):l(t,c),n;d&&(p||(v?l(n,s):l(t,c)),l(n,o))}else 0===f.alongA&&(-1===f.alongB?l(t,u):0===f.alongB?l(t,f.pt):1===f.alongB&&l(t,c)),0===f.alongB&&(-1===f.alongA?l(n,o):0===f.alongA?l(n,f.pt):1===f.alongA&&l(n,s));return!1}for(var f=[];!a.isEmpty();){var h=a.getHead();if(r&&r.vert(h.pt[0]),h.isStart){r&&r.segmentNew(h.seg,h.primary);var p=u(h),d=p.before?p.before.ev:null,v=p.after?p.after.ev:null;function g(){if(d){var t=c(h,d);if(t)return t}return!!v&&c(h,v)}r&&r.tempStatus(h.seg,!!d&&d.seg,!!v&&v.seg);var y,m,x=g();if(x)t?(m=null===h.seg.myFill.below||h.seg.myFill.above!==h.seg.myFill.below)&&(x.seg.myFill.above=!x.seg.myFill.above):x.seg.otherFill=h.seg.myFill,r&&r.segmentUpdate(x.seg),h.other.remove(),h.remove();if(a.getHead()!==h){r&&r.rewind(h.seg);continue}t?(m=null===h.seg.myFill.below||h.seg.myFill.above!==h.seg.myFill.below,h.seg.myFill.below=v?v.seg.myFill.above:i,h.seg.myFill.above=m?!h.seg.myFill.below:h.seg.myFill.below):null===h.seg.otherFill&&(y=v?h.primary===v.primary?v.seg.otherFill.above:v.seg.myFill.above:h.primary?o:i,h.seg.otherFill={above:y,below:y}),r&&r.status(h.seg,!!d&&d.seg,!!v&&v.seg),h.other.status=p.insert(n.node({ev:h}))}else{var b=h.status;if(null===b)throw new Error(\"PolyBool: Zero-length segment detected; your epsilon is probably too small or too large\");if(s.exists(b.prev)&&s.exists(b.next)&&c(b.prev.ev,b.next.ev),r&&r.statusRemove(b.ev.seg),b.remove(),!h.primary){var _=h.seg.myFill;h.seg.myFill=h.seg.otherFill,h.seg.otherFill=_}f.push(h.seg)}a.getHead().remove()}return r&&r.done(),f}return t?{addRegion:function(t){for(var n,i,a,o=t[t.length-1],l=0;l0&&!this.aborted;){var r=this.ifds_to_read.shift();r.offset&&this.scan_ifd(r.id,r.offset,t)}},n.prototype.read_uint16=function(t){var r=this.input;if(t+2>r.length)throw e(\"unexpected EOF\",\"EBADDATA\");return this.big_endian?256*r[t]+r[t+1]:r[t]+256*r[t+1]},n.prototype.read_uint32=function(t){var r=this.input;if(t+4>r.length)throw e(\"unexpected EOF\",\"EBADDATA\");return this.big_endian?16777216*r[t]+65536*r[t+1]+256*r[t+2]+r[t+3]:r[t]+256*r[t+1]+65536*r[t+2]+16777216*r[t+3]},n.prototype.is_subifd_link=function(t,e){return 0===t&&34665===e||0===t&&34853===e||34665===t&&40965===e},n.prototype.exif_format_length=function(t){switch(t){case 1:case 2:case 6:case 7:return 1;case 3:case 8:return 2;case 4:case 9:case 11:return 4;case 5:case 10:case 12:return 8;default:return 0}},n.prototype.exif_format_read=function(t,e){var r;switch(t){case 1:case 2:return this.input[e];case 6:return(r=this.input[e])|33554430*(128&r);case 3:return this.read_uint16(e);case 8:return(r=this.read_uint16(e))|131070*(32768&r);case 4:return this.read_uint32(e);case 9:return 0|this.read_uint32(e);default:return null}},n.prototype.scan_ifd=function(t,n,i){var a=this.read_uint16(n);n+=2;for(var o=0;othis.input.length)throw e(\"unexpected EOF\",\"EBADDATA\");for(var d=[],v=h,g=0;g0&&(this.ifds_to_read.push({id:s,offset:d[0]}),p=!0),!1===i({is_big_endian:this.big_endian,ifd:t,tag:s,format:l,count:u,entry_offset:n+this.start,data_length:f,data_offset:h+this.start,value:d,is_subifd_link:p}))return void(this.aborted=!0);n+=12}0===t&&this.ifds_to_read.push({id:1,offset:this.read_uint32(n)})},t.exports.ExifParser=n,t.exports.get_orientation=function(t){var e=0;try{return new n(t,0,t.length).each((function(t){if(0===t.ifd&&274===t.tag&&Array.isArray(t.value))return e=t.value[0],!1})),e}catch(t){return-1}}},44600:function(t,e,r){\"use strict\";var n=r(9696).eW,i=r(9696).eI;function a(t,e){if(t.length<4+e)return null;var r=i(t,e);return t.length>4&15,i=15&t[4],a=t[5]>>4&15,o=n(t,6),l=8,u=0;ue.width||t.width===e.width&&t.height>e.height?t:e})),i=r.reduce((function(t,e){return t.height>e.height||t.height===e.height&&t.width>e.width?t:e})),n.width>i.height||n.width===i.height&&n.height>i.width?n:i),s=1;e.transforms.forEach((function(t){var e={1:6,2:5,3:8,4:7,5:4,6:3,7:2,8:1},r={1:4,2:3,3:2,4:1,5:6,6:5,7:8,8:7};if(\"imir\"===t.type&&(s=0===t.value?r[s]:e[s=e[s=r[s]]]),\"irot\"===t.type)for(var n=0;n1&&(h.variants=f.variants),f.orientation&&(h.orientation=f.orientation),f.exif_location&&f.exif_location.offset+f.exif_location.length<=t.length){var p=a(t,f.exif_location.offset),d=t.slice(f.exif_location.offset+p+4,f.exif_location.offset+f.exif_location.length),v=s.get_orientation(d);v>0&&(h.orientation=v)}return h}}}}}}},38728:function(t,e,r){\"use strict\";var n=r(9696).wR,i=r(9696).gS,a=r(9696).Bz,o=n(\"BM\");t.exports=function(t){if(!(t.length<26)&&i(t,0,o))return{width:a(t,18),height:a(t,22),type:\"bmp\",mime:\"image/bmp\",wUnits:\"px\",hUnits:\"px\"}}},5588:function(t,e,r){\"use strict\";var n=r(9696).wR,i=r(9696).gS,a=r(9696).Bz,o=n(\"GIF87a\"),s=n(\"GIF89a\");t.exports=function(t){if(!(t.length<10)&&(i(t,0,o)||i(t,0,s)))return{width:a(t,6),height:a(t,8),type:\"gif\",mime:\"image/gif\",wUnits:\"px\",hUnits:\"px\"}}},41924:function(t,e,r){\"use strict\";var n=r(9696).Bz;t.exports=function(t){var e=n(t,0),r=n(t,2),i=n(t,4);if(0===e&&1===r&&i){for(var a=[],o={width:0,height:0},s=0;so.width||u>o.height)&&(o=c)}return{width:o.width,height:o.height,variants:a,type:\"ico\",mime:\"image/x-icon\",wUnits:\"px\",hUnits:\"px\"}}}},87968:function(t,e,r){\"use strict\";var n=r(9696).eW,i=r(9696).wR,a=r(9696).gS,o=r(11688),s=i(\"Exif\\0\\0\");t.exports=function(t){if(!(t.length<2)&&255===t[0]&&216===t[1]&&255===t[2])for(var e=2;;){for(;;){if(t.length-e<2)return;if(255===t[e++])break}for(var r,i,l=t[e++];255===l;)l=t[e++];if(208<=l&&l<=217||1===l)r=0;else{if(!(192<=l&&l<=254))return;if(t.length-e<2)return;r=n(t,e)-2,e+=2}if(217===l||218===l)return;if(225===l&&r>=10&&a(t,e,s)&&(i=o.get_orientation(t.slice(e+6,e+r))),r>=5&&192<=l&&l<=207&&196!==l&&200!==l&&204!==l){if(t.length-e0&&(u.orientation=i),u}e+=r}}},37276:function(t,e,r){\"use strict\";var n=r(9696).wR,i=r(9696).gS,a=r(9696).eI,o=n(\"‰PNG\\r\\n\u001a\\n\"),s=n(\"IHDR\");t.exports=function(t){if(!(t.length<24)&&i(t,0,o)&&i(t,12,s))return{width:a(t,16),height:a(t,20),type:\"png\",mime:\"image/png\",wUnits:\"px\",hUnits:\"px\"}}},90328:function(t,e,r){\"use strict\";var n=r(9696).wR,i=r(9696).gS,a=r(9696).eI,o=n(\"8BPS\\0\u0001\");t.exports=function(t){if(!(t.length<22)&&i(t,0,o))return{width:a(t,18),height:a(t,14),type:\"psd\",mime:\"image/vnd.adobe.photoshop\",wUnits:\"px\",hUnits:\"px\"}}},16024:function(t){\"use strict\";function e(t){return\"number\"==typeof t&&isFinite(t)&&t>0}var r=/<[-_.:a-zA-Z0-9][^>]*>/,n=/^<([-_.:a-zA-Z0-9]+:)?svg\\s/,i=/[^-]\\bwidth=\"([^%]+?)\"|[^-]\\bwidth='([^%]+?)'/,a=/\\bheight=\"([^%]+?)\"|\\bheight='([^%]+?)'/,o=/\\bview[bB]ox=\"(.+?)\"|\\bview[bB]ox='(.+?)'/,s=/in$|mm$|cm$|pt$|pc$|px$|em$|ex$/;function l(t){return s.test(t)?t.match(s)[0]:\"px\"}t.exports=function(t){if(function(t){var e,r=0,n=t.length;for(239===t[0]&&187===t[1]&&191===t[2]&&(r=3);r>14&16383),type:\"webp\",mime:\"image/webp\",wUnits:\"px\",hUnits:\"px\"}}}function h(t,e){return{width:1+(t[e+6]<<16|t[e+5]<<8|t[e+4]),height:1+(t[e+9]<t.length)){for(;e+8=10?r=r||c(t,e+8):\"VP8L\"===p&&d>=9?r=r||f(t,e+8):\"VP8X\"===p&&d>=10?r=r||h(t,e+8):\"EXIF\"===p&&(n=s.get_orientation(t.slice(e+8,e+8+d)),e=1/0),e+=8+d}else e++;if(r)return n>0&&(r.orientation=n),r}}}},87480:function(t,e,r){\"use strict\";t.exports={avif:r(40528),bmp:r(38728),gif:r(5588),ico:r(41924),jpeg:r(87968),png:r(37276),psd:r(90328),svg:r(16024),tiff:r(98792),webp:r(20704)}},19480:function(t,e,r){\"use strict\";var n=r(87480);t.exports=function(t){return function(t){for(var e=Object.keys(n),r=0;r1)for(var r=1;r1&&(t.scaleRatio=[t.scale[0]*t.viewport.width,t.scale[1]*t.viewport.height],r(t),t.after&&t.after(t))}function T(t){if(t){null!=t.length?\"number\"==typeof t[0]&&(t=[{positions:t}]):Array.isArray(t)||(t=[t]);var e=0,r=0;if(b.groups=x=t.map((function(t,u){var c=x[u];return t?(\"function\"==typeof t?t={after:t}:\"number\"==typeof t[0]&&(t={positions:t}),t=o(t,{color:\"color colors fill\",capSize:\"capSize cap capsize cap-size\",lineWidth:\"lineWidth line-width width line thickness\",opacity:\"opacity alpha\",range:\"range dataBox\",viewport:\"viewport viewBox\",errors:\"errors error\",positions:\"positions position data points\"}),c||(x[u]=c={id:u,scale:null,translate:null,scaleFract:null,translateFract:null,draw:!0},t=s({},m,t)),a(c,t,[{lineWidth:function(t){return.5*+t},capSize:function(t){return.5*+t},opacity:parseFloat,errors:function(t){return t=l(t),r+=t.length,t},positions:function(t,r){return t=l(t,\"float64\"),r.count=Math.floor(t.length/2),r.bounds=n(t,2),r.offset=e,e+=r.count,t}},{color:function(t,e){var r=e.count;if(t||(t=\"transparent\"),!Array.isArray(t)||\"number\"==typeof t[0]){var n=t;t=Array(r);for(var a=0;a 0. && baClipping < length(normalWidth * endBotJoin)) {\\n\\t\\t//handle miter clipping\\n\\t\\tbTopCoord -= normalWidth * endTopJoin;\\n\\t\\tbTopCoord += normalize(endTopJoin * normalWidth) * baClipping;\\n\\t}\\n\\n\\tif (nextReverse) {\\n\\t\\t//make join rectangular\\n\\t\\tvec2 miterShift = normalWidth * endJoinDirection * miterLimit * .5;\\n\\t\\tfloat normalAdjust = 1. - min(miterLimit / endMiterRatio, 1.);\\n\\t\\tbBotCoord = bCoord + miterShift - normalAdjust * normalWidth * currNormal * .5;\\n\\t\\tbTopCoord = bCoord + miterShift + normalAdjust * normalWidth * currNormal * .5;\\n\\t}\\n\\telse if (!prevReverse && abClipping > 0. && abClipping < length(normalWidth * startBotJoin)) {\\n\\t\\t//handle miter clipping\\n\\t\\taBotCoord -= normalWidth * startBotJoin;\\n\\t\\taBotCoord += normalize(startBotJoin * normalWidth) * abClipping;\\n\\t}\\n\\n\\tvec2 aTopPosition = (aTopCoord) * adjustedScale + translate;\\n\\tvec2 aBotPosition = (aBotCoord) * adjustedScale + translate;\\n\\n\\tvec2 bTopPosition = (bTopCoord) * adjustedScale + translate;\\n\\tvec2 bBotPosition = (bBotCoord) * adjustedScale + translate;\\n\\n\\t//position is normalized 0..1 coord on the screen\\n\\tvec2 position = (aTopPosition * lineTop + aBotPosition * lineBot) * lineStart + (bTopPosition * lineTop + bBotPosition * lineBot) * lineEnd;\\n\\n\\tstartCoord = aCoord * scaleRatio + translate * viewport.zw + viewport.xy;\\n\\tendCoord = bCoord * scaleRatio + translate * viewport.zw + viewport.xy;\\n\\n\\tgl_Position = vec4(position * 2.0 - 1.0, depth, 1);\\n\\n\\tenableStartMiter = step(dot(currTangent, prevTangent), .5);\\n\\tenableEndMiter = step(dot(currTangent, nextTangent), .5);\\n\\n\\t//bevel miter cutoffs\\n\\tif (miterMode == 1.) {\\n\\t\\tif (enableStartMiter == 1.) {\\n\\t\\t\\tvec2 startMiterWidth = vec2(startJoinDirection) * thickness * miterLimit * .5;\\n\\t\\t\\tstartCutoff = vec4(aCoord, aCoord);\\n\\t\\t\\tstartCutoff.zw += vec2(-startJoinDirection.y, startJoinDirection.x) / scaleRatio;\\n\\t\\t\\tstartCutoff = startCutoff * scaleRatio.xyxy + translate.xyxy * viewport.zwzw;\\n\\t\\t\\tstartCutoff += viewport.xyxy;\\n\\t\\t\\tstartCutoff += startMiterWidth.xyxy;\\n\\t\\t}\\n\\n\\t\\tif (enableEndMiter == 1.) {\\n\\t\\t\\tvec2 endMiterWidth = vec2(endJoinDirection) * thickness * miterLimit * .5;\\n\\t\\t\\tendCutoff = vec4(bCoord, bCoord);\\n\\t\\t\\tendCutoff.zw += vec2(-endJoinDirection.y, endJoinDirection.x) / scaleRatio;\\n\\t\\t\\tendCutoff = endCutoff * scaleRatio.xyxy + translate.xyxy * viewport.zwzw;\\n\\t\\t\\tendCutoff += viewport.xyxy;\\n\\t\\t\\tendCutoff += endMiterWidth.xyxy;\\n\\t\\t}\\n\\t}\\n\\n\\t//round miter cutoffs\\n\\telse if (miterMode == 2.) {\\n\\t\\tif (enableStartMiter == 1.) {\\n\\t\\t\\tvec2 startMiterWidth = vec2(startJoinDirection) * thickness * abs(dot(startJoinDirection, currNormal)) * .5;\\n\\t\\t\\tstartCutoff = vec4(aCoord, aCoord);\\n\\t\\t\\tstartCutoff.zw += vec2(-startJoinDirection.y, startJoinDirection.x) / scaleRatio;\\n\\t\\t\\tstartCutoff = startCutoff * scaleRatio.xyxy + translate.xyxy * viewport.zwzw;\\n\\t\\t\\tstartCutoff += viewport.xyxy;\\n\\t\\t\\tstartCutoff += startMiterWidth.xyxy;\\n\\t\\t}\\n\\n\\t\\tif (enableEndMiter == 1.) {\\n\\t\\t\\tvec2 endMiterWidth = vec2(endJoinDirection) * thickness * abs(dot(endJoinDirection, currNormal)) * .5;\\n\\t\\t\\tendCutoff = vec4(bCoord, bCoord);\\n\\t\\t\\tendCutoff.zw += vec2(-endJoinDirection.y, endJoinDirection.x) / scaleRatio;\\n\\t\\t\\tendCutoff = endCutoff * scaleRatio.xyxy + translate.xyxy * viewport.zwzw;\\n\\t\\t\\tendCutoff += viewport.xyxy;\\n\\t\\t\\tendCutoff += endMiterWidth.xyxy;\\n\\t\\t}\\n\\t}\\n}\\n\",frag:\"\\nprecision highp float;\\n\\nuniform float dashLength, pixelRatio, thickness, opacity, id, miterMode;\\nuniform sampler2D dashTexture;\\n\\nvarying vec4 fragColor;\\nvarying vec2 tangent;\\nvarying vec4 startCutoff, endCutoff;\\nvarying vec2 startCoord, endCoord;\\nvarying float enableStartMiter, enableEndMiter;\\n\\nfloat distToLine(vec2 p, vec2 a, vec2 b) {\\n\\tvec2 diff = b - a;\\n\\tvec2 perp = normalize(vec2(-diff.y, diff.x));\\n\\treturn dot(p - a, perp);\\n}\\n\\nvoid main() {\\n\\tfloat alpha = 1., distToStart, distToEnd;\\n\\tfloat cutoff = thickness * .5;\\n\\n\\t//bevel miter\\n\\tif (miterMode == 1.) {\\n\\t\\tif (enableStartMiter == 1.) {\\n\\t\\t\\tdistToStart = distToLine(gl_FragCoord.xy, startCutoff.xy, startCutoff.zw);\\n\\t\\t\\tif (distToStart < -1.) {\\n\\t\\t\\t\\tdiscard;\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\t\\t\\talpha *= min(max(distToStart + 1., 0.), 1.);\\n\\t\\t}\\n\\n\\t\\tif (enableEndMiter == 1.) {\\n\\t\\t\\tdistToEnd = distToLine(gl_FragCoord.xy, endCutoff.xy, endCutoff.zw);\\n\\t\\t\\tif (distToEnd < -1.) {\\n\\t\\t\\t\\tdiscard;\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\t\\t\\talpha *= min(max(distToEnd + 1., 0.), 1.);\\n\\t\\t}\\n\\t}\\n\\n\\t// round miter\\n\\telse if (miterMode == 2.) {\\n\\t\\tif (enableStartMiter == 1.) {\\n\\t\\t\\tdistToStart = distToLine(gl_FragCoord.xy, startCutoff.xy, startCutoff.zw);\\n\\t\\t\\tif (distToStart < 0.) {\\n\\t\\t\\t\\tfloat radius = length(gl_FragCoord.xy - startCoord);\\n\\n\\t\\t\\t\\tif(radius > cutoff + .5) {\\n\\t\\t\\t\\t\\tdiscard;\\n\\t\\t\\t\\t\\treturn;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\talpha -= smoothstep(cutoff - .5, cutoff + .5, radius);\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\tif (enableEndMiter == 1.) {\\n\\t\\t\\tdistToEnd = distToLine(gl_FragCoord.xy, endCutoff.xy, endCutoff.zw);\\n\\t\\t\\tif (distToEnd < 0.) {\\n\\t\\t\\t\\tfloat radius = length(gl_FragCoord.xy - endCoord);\\n\\n\\t\\t\\t\\tif(radius > cutoff + .5) {\\n\\t\\t\\t\\t\\tdiscard;\\n\\t\\t\\t\\t\\treturn;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\talpha -= smoothstep(cutoff - .5, cutoff + .5, radius);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\tfloat t = fract(dot(tangent, gl_FragCoord.xy) / dashLength) * .5 + .25;\\n\\tfloat dash = texture2D(dashTexture, vec2(t, .5)).r;\\n\\n\\tgl_FragColor = fragColor;\\n\\tgl_FragColor.a *= alpha * opacity * dash;\\n}\\n\",attributes:{lineEnd:{buffer:r,divisor:0,stride:8,offset:0},lineTop:{buffer:r,divisor:0,stride:8,offset:4},aColor:{buffer:t.prop(\"colorBuffer\"),stride:4,offset:0,divisor:1},bColor:{buffer:t.prop(\"colorBuffer\"),stride:4,offset:4,divisor:1},prevCoord:{buffer:t.prop(\"positionBuffer\"),stride:8,offset:0,divisor:1},aCoord:{buffer:t.prop(\"positionBuffer\"),stride:8,offset:8,divisor:1},bCoord:{buffer:t.prop(\"positionBuffer\"),stride:8,offset:16,divisor:1},nextCoord:{buffer:t.prop(\"positionBuffer\"),stride:8,offset:24,divisor:1}}},n))}catch(t){e=i}return{fill:t({primitive:\"triangle\",elements:function(t,e){return e.triangles},offset:0,vert:\"\\nprecision highp float;\\n\\nattribute vec2 position, positionFract;\\n\\nuniform vec4 color;\\nuniform vec2 scale, scaleFract, translate, translateFract;\\nuniform float pixelRatio, id;\\nuniform vec4 viewport;\\nuniform float opacity;\\n\\nvarying vec4 fragColor;\\n\\nconst float MAX_LINES = 256.;\\n\\nvoid main() {\\n\\tfloat depth = (MAX_LINES - 4. - id) / (MAX_LINES);\\n\\n\\tvec2 position = position * scale + translate\\n + positionFract * scale + translateFract\\n + position * scaleFract\\n + positionFract * scaleFract;\\n\\n\\tgl_Position = vec4(position * 2.0 - 1.0, depth, 1);\\n\\n\\tfragColor = color / 255.;\\n\\tfragColor.a *= opacity;\\n}\\n\",frag:\"\\nprecision highp float;\\nvarying vec4 fragColor;\\n\\nvoid main() {\\n\\tgl_FragColor = fragColor;\\n}\\n\",uniforms:{scale:t.prop(\"scale\"),color:t.prop(\"fill\"),scaleFract:t.prop(\"scaleFract\"),translateFract:t.prop(\"translateFract\"),translate:t.prop(\"translate\"),opacity:t.prop(\"opacity\"),pixelRatio:t.context(\"pixelRatio\"),id:t.prop(\"id\"),viewport:function(t,e){return[e.viewport.x,e.viewport.y,t.viewportWidth,t.viewportHeight]}},attributes:{position:{buffer:t.prop(\"positionBuffer\"),stride:8,offset:8},positionFract:{buffer:t.prop(\"positionFractBuffer\"),stride:8,offset:8}},blend:n.blend,depth:{enable:!1},scissor:n.scissor,stencil:n.stencil,viewport:n.viewport}),rect:i,miter:e}},g.defaults={dashes:null,join:\"miter\",miterLimit:1,thickness:10,cap:\"square\",color:\"black\",opacity:1,overlay:!1,viewport:null,range:null,close:!1,fill:null},g.prototype.render=function(){for(var t,e=[],r=arguments.length;r--;)e[r]=arguments[r];e.length&&(t=this).update.apply(t,e),this.draw()},g.prototype.draw=function(){for(var t=this,e=[],r=arguments.length;r--;)e[r]=arguments[r];return(e.length?e:this.passes).forEach((function(e,r){var n;if(e&&Array.isArray(e))return(n=t).draw.apply(n,e);\"number\"==typeof e&&(e=t.passes[e]),e&&e.count>1&&e.opacity&&(t.regl._refresh(),e.fill&&e.triangles&&e.triangles.length>2&&t.shaders.fill(e),e.thickness&&(e.scale[0]*e.viewport.width>g.precisionThreshold||e.scale[1]*e.viewport.height>g.precisionThreshold||\"rect\"===e.join||!e.join&&(e.thickness<=2||e.count>=g.maxPoints)?t.shaders.rect(e):t.shaders.miter(e)))})),this},g.prototype.update=function(t){var e=this;if(t){null!=t.length?\"number\"==typeof t[0]&&(t=[{positions:t}]):Array.isArray(t)||(t=[t]);var r=this.regl,c=this.gl;if(t.forEach((function(t,p){var y=e.passes[p];if(void 0!==t)if(null!==t){if(\"number\"==typeof t[0]&&(t={positions:t}),t=o(t,{positions:\"positions points data coords\",thickness:\"thickness lineWidth lineWidths line-width linewidth width stroke-width strokewidth strokeWidth\",join:\"lineJoin linejoin join type mode\",miterLimit:\"miterlimit miterLimit\",dashes:\"dash dashes dasharray dash-array dashArray\",color:\"color colour stroke colors colours stroke-color strokeColor\",fill:\"fill fill-color fillColor\",opacity:\"alpha opacity\",overlay:\"overlay crease overlap intersect\",close:\"closed close closed-path closePath\",range:\"range dataBox\",viewport:\"viewport viewBox\",hole:\"holes hole hollow\",splitNull:\"splitNull\"}),y||(e.passes[p]=y={id:p,scale:null,scaleFract:null,translate:null,translateFract:null,count:0,hole:[],depth:0,dashLength:1,dashTexture:r.texture({channels:1,data:new Uint8Array([255]),width:1,height:1,mag:\"linear\",min:\"linear\"}),colorBuffer:r.buffer({usage:\"dynamic\",type:\"uint8\",data:new Uint8Array}),positionBuffer:r.buffer({usage:\"dynamic\",type:\"float\",data:new Uint8Array}),positionFractBuffer:r.buffer({usage:\"dynamic\",type:\"float\",data:new Uint8Array})},t=a({},g.defaults,t)),null!=t.thickness&&(y.thickness=parseFloat(t.thickness)),null!=t.opacity&&(y.opacity=parseFloat(t.opacity)),null!=t.miterLimit&&(y.miterLimit=parseFloat(t.miterLimit)),null!=t.overlay&&(y.overlay=!!t.overlay,p=D}));(O=O.slice(0,R)).push(D)}for(var F=function(t){var e=k.slice(2*z,2*O[t]).concat(D?k.slice(2*D):[]),r=(y.hole||[]).map((function(e){return e-D+(O[t]-z)})),n=l(e,r);n=n.map((function(e){return e+z+(e+zt.length)&&(e=t.length);for(var r=0,n=new Array(e);r 1.0 + delta) {\\n\\t\\tdiscard;\\n\\t}\\n\\n\\talpha -= smoothstep(1.0 - delta, 1.0 + delta, radius);\\n\\n\\tfloat borderRadius = fragBorderRadius;\\n\\tfloat ratio = smoothstep(borderRadius - delta, borderRadius + delta, radius);\\n\\tvec4 color = mix(fragColor, fragBorderColor, ratio);\\n\\tcolor.a *= alpha * opacity;\\n\\tgl_FragColor = color;\\n}\\n\"]),l.vert=f([\"precision highp float;\\n#define GLSLIFY 1\\n\\nattribute float x, y, xFract, yFract;\\nattribute float size, borderSize;\\nattribute vec4 colorId, borderColorId;\\nattribute float isActive;\\n\\n// `invariant` effectively turns off optimizations for the position.\\n// We need this because -fast-math on M1 Macs is re-ordering\\n// floating point operations in a way that causes floating point\\n// precision limits to put points in the wrong locations.\\ninvariant gl_Position;\\n\\nuniform bool constPointSize;\\nuniform float pixelRatio;\\nuniform vec2 paletteSize, scale, scaleFract, translate, translateFract;\\nuniform sampler2D paletteTexture;\\n\\nconst float maxSize = 100.;\\n\\nvarying vec4 fragColor, fragBorderColor;\\nvarying float fragBorderRadius, fragWidth;\\n\\nfloat pointSizeScale = (constPointSize) ? 2. : pixelRatio;\\n\\nbool isDirect = (paletteSize.x < 1.);\\n\\nvec4 getColor(vec4 id) {\\n return isDirect ? id / 255. : texture2D(paletteTexture,\\n vec2(\\n (id.x + .5) / paletteSize.x,\\n (id.y + .5) / paletteSize.y\\n )\\n );\\n}\\n\\nvoid main() {\\n // ignore inactive points\\n if (isActive == 0.) return;\\n\\n vec2 position = vec2(x, y);\\n vec2 positionFract = vec2(xFract, yFract);\\n\\n vec4 color = getColor(colorId);\\n vec4 borderColor = getColor(borderColorId);\\n\\n float size = size * maxSize / 255.;\\n float borderSize = borderSize * maxSize / 255.;\\n\\n gl_PointSize = (size + borderSize) * pointSizeScale;\\n\\n vec2 pos = (position + translate) * scale\\n + (positionFract + translateFract) * scale\\n + (position + translate) * scaleFract\\n + (positionFract + translateFract) * scaleFract;\\n\\n gl_Position = vec4(pos * 2. - 1., 0., 1.);\\n\\n fragBorderRadius = 1. - 2. * borderSize / (size + borderSize);\\n fragColor = color;\\n fragBorderColor = borderColor.a == 0. || borderSize == 0. ? vec4(color.rgb, 0.) : borderColor;\\n fragWidth = 1. / gl_PointSize;\\n}\\n\"]),v&&(l.frag=l.frag.replace(\"smoothstep\",\"smoothStep\"),s.frag=s.frag.replace(\"smoothstep\",\"smoothStep\")),this.drawCircle=t(l)}x.defaults={color:\"black\",borderColor:\"transparent\",borderSize:0,size:12,opacity:1,marker:void 0,viewport:null,range:null,pixelSize:null,count:0,offset:0,bounds:null,positions:[],snap:1e4},x.prototype.render=function(){return arguments.length&&this.update.apply(this,arguments),this.draw(),this},x.prototype.draw=function(){for(var t=this,e=arguments.length,r=new Array(e),n=0;nn)?e.tree=u(t,{bounds:f}):n&&n.length&&(e.tree=n),e.tree){var h={primitive:\"points\",usage:\"static\",data:e.tree,type:\"uint32\"};e.elements?e.elements(h):e.elements=o.elements(h)}var p=g.float32(t);return i({data:p,usage:\"dynamic\"}),a({data:g.fract32(t,p),usage:\"dynamic\"}),l({data:new Uint8Array(c),type:\"uint8\",usage:\"stream\"}),t}},{marker:function(e,r,n){var i=r.activation;if(i.forEach((function(t){return t&&t.destroy&&t.destroy()})),i.length=0,e&&\"number\"!=typeof e[0]){for(var a=[],s=0,l=Math.min(e.length,r.count);s=0)return a;if(t instanceof Uint8Array||t instanceof Uint8ClampedArray)e=t;else{e=new Uint8Array(t.length);for(var o=0,s=t.length;o4*n&&(this.tooManyColors=!0),this.updatePalette(r),1===i.length?i[0]:i},x.prototype.updatePalette=function(t){if(!this.tooManyColors){var e=this.maxColors,r=this.paletteTexture,n=Math.ceil(.25*t.length/e);if(n>1)for(var i=.25*(t=t.slice()).length%e;i2?(s[0],s[2],n=s[1],i=s[3]):s.length?(n=s[0],i=s[1]):(s.x,n=s.y,s.x,s.width,i=s.y+s.height),l.length>2?(a=l[0],o=l[2],l[1],l[3]):l.length?(a=l[0],o=l[1]):(a=l.x,l.y,o=l.x+l.width,l.y,l.height),[a,n,o,i]}function p(t){if(\"number\"==typeof t)return[t,t,t,t];if(2===t.length)return[t[0],t[1],t[0],t[1]];var e=l(t);return[e.x,e.y,e.x+e.width,e.y+e.height]}t.exports=c,c.prototype.render=function(){for(var t,e=this,r=[],n=arguments.length;n--;)r[n]=arguments[n];return r.length&&(t=this).update.apply(t,r),this.regl.attributes.preserveDrawingBuffer?this.draw():(this.dirty?null==this.planned&&(this.planned=o((function(){e.draw(),e.dirty=!0,e.planned=null}))):(this.draw(),this.dirty=!0,o((function(){e.dirty=!1}))),this)},c.prototype.update=function(){for(var t,e=[],r=arguments.length;r--;)e[r]=arguments[r];if(e.length){for(var n=0;nk))&&(s.lower||!(T>>=e))<<3,(e|=r=(15<(t>>>=r))<<2)|(r=(3<(t>>>=r))<<1)|t>>>r>>1}function l(){function t(t){t:{for(var e=16;268435456>=e;e*=16)if(t<=e){t=e;break t}t=0}return 0<(e=r[s(t)>>2]).length?e.pop():new ArrayBuffer(t)}function e(t){r[s(t.byteLength)>>2].push(t)}var r=o(8,(function(){return[]}));return{alloc:t,free:e,allocType:function(e,r){var n=null;switch(e){case 5120:n=new Int8Array(t(r),0,r);break;case 5121:n=new Uint8Array(t(r),0,r);break;case 5122:n=new Int16Array(t(2*r),0,r);break;case 5123:n=new Uint16Array(t(2*r),0,r);break;case 5124:n=new Int32Array(t(4*r),0,r);break;case 5125:n=new Uint32Array(t(4*r),0,r);break;case 5126:n=new Float32Array(t(4*r),0,r);break;default:return null}return n.length!==r?n.subarray(0,r):n},freeType:function(t){e(t.buffer)}}}function u(t){return!!t&&\"object\"==typeof t&&Array.isArray(t.shape)&&Array.isArray(t.stride)&&\"number\"==typeof t.offset&&t.shape.length===t.stride.length&&(Array.isArray(t.data)||$(t.data))}function c(t,e,r,n,i,a){for(var o=0;o(i=s)&&(i=n.buffer.byteLength,5123===f?i>>=1:5125===f&&(i>>=2)),n.vertCount=i,i=o,0>o&&(i=4,1===(o=n.buffer.dimension)&&(i=0),2===o&&(i=1),3===o&&(i=4)),n.primType=i}function o(t){n.elementsCount--,delete s[t.id],t.buffer.destroy(),t.buffer=null}var s={},l=0,c={uint8:5121,uint16:5123};e.oes_element_index_uint&&(c.uint32=5125),i.prototype.bind=function(){this.buffer.bind()};var f=[];return{create:function(t,e){function s(t){if(t)if(\"number\"==typeof t)l(t),f.primType=4,f.vertCount=0|t,f.type=5121;else{var e=null,r=35044,n=-1,i=-1,o=0,h=0;Array.isArray(t)||$(t)||u(t)?e=t:(\"data\"in t&&(e=t.data),\"usage\"in t&&(r=nt[t.usage]),\"primitive\"in t&&(n=st[t.primitive]),\"count\"in t&&(i=0|t.count),\"type\"in t&&(h=c[t.type]),\"length\"in t?o=0|t.length:(o=i,5123===h||5122===h?o*=2:5125!==h&&5124!==h||(o*=4))),a(f,e,r,n,i,o,h)}else l(),f.primType=4,f.vertCount=0,f.type=5121;return s}var l=r.create(null,34963,!0),f=new i(l._buffer);return n.elementsCount++,s(t),s._reglType=\"elements\",s._elements=f,s.subdata=function(t,e){return l.subdata(t,e),s},s.destroy=function(){o(f)},s},createStream:function(t){var e=f.pop();return e||(e=new i(r.create(null,34963,!0,!1)._buffer)),a(e,t,35040,-1,-1,0,0),e},destroyStream:function(t){f.push(t)},getElements:function(t){return\"function\"==typeof t&&t._elements instanceof i?t._elements:null},clear:function(){Q(s).forEach(o)}}}function y(t){for(var e=K.allocType(5123,t.length),r=0;r>>31<<15,i=(a<<1>>>24)-127,a=a>>13&1023;e[r]=-24>i?n:-14>i?n+(a+1024>>-14-i):15>=i,r.height>>=i,p(r,n[i]),t.mipmask|=1<e;++e)t.images[e]=null;return t}function C(t){for(var e=t.images,r=0;re){for(var r=0;r=--this.refCount&&F(this)}}),o.profile&&(a.getTotalTextureSize=function(){var t=0;return Object.keys(ut).forEach((function(e){t+=ut[e].stats.size})),t}),{create2D:function(e,r){function n(t,e){var r=i.texInfo;P.call(r);var a=L();return\"number\"==typeof t?M(a,0|t,\"number\"==typeof e?0|e:0|t):t?(O(r,t),S(a,t)):M(a,1,1),r.genMipmaps&&(a.mipmask=(a.width<<1)-1),i.mipmask=a.mipmask,l(i,a),i.internalformat=a.internalformat,n.width=a.width,n.height=a.height,D(i),E(a,3553),I(r,3553),R(),C(a),o.profile&&(i.stats.size=A(i.internalformat,i.type,a.width,a.height,r.genMipmaps,!1)),n.format=Z[i.internalformat],n.type=J[i.type],n.mag=rt[r.magFilter],n.min=nt[r.minFilter],n.wrapS=it[r.wrapS],n.wrapT=it[r.wrapT],n}var i=new z(3553);return ut[i.id]=i,a.textureCount++,n(e,r),n.subimage=function(t,e,r,a){e|=0,r|=0,a|=0;var o=v();return l(o,i),o.width=0,o.height=0,p(o,t),o.width=o.width||(i.width>>a)-e,o.height=o.height||(i.height>>a)-r,D(i),d(o,3553,e,r,a),R(),g(o),n},n.resize=function(e,r){var a=0|e,s=0|r||a;if(a===i.width&&s===i.height)return n;n.width=i.width=a,n.height=i.height=s,D(i);for(var l=0;i.mipmask>>l;++l){var u=a>>l,c=s>>l;if(!u||!c)break;t.texImage2D(3553,l,i.format,u,c,0,i.format,i.type,null)}return R(),o.profile&&(i.stats.size=A(i.internalformat,i.type,a,s,!1,!1)),n},n._reglType=\"texture2d\",n._texture=i,o.profile&&(n.stats=i.stats),n.destroy=function(){i.decRef()},n},createCube:function(e,r,n,i,s,u){function f(t,e,r,n,i,a){var s,u=h.texInfo;for(P.call(u),s=0;6>s;++s)y[s]=L();if(\"number\"!=typeof t&&t){if(\"object\"==typeof t)if(e)S(y[0],t),S(y[1],e),S(y[2],r),S(y[3],n),S(y[4],i),S(y[5],a);else if(O(u,t),c(h,t),\"faces\"in t)for(t=t.faces,s=0;6>s;++s)l(y[s],h),S(y[s],t[s]);else for(s=0;6>s;++s)S(y[s],t)}else for(t=0|t||1,s=0;6>s;++s)M(y[s],t,t);for(l(h,y[0]),h.mipmask=u.genMipmaps?(y[0].width<<1)-1:y[0].mipmask,h.internalformat=y[0].internalformat,f.width=y[0].width,f.height=y[0].height,D(h),s=0;6>s;++s)E(y[s],34069+s);for(I(u,34067),R(),o.profile&&(h.stats.size=A(h.internalformat,h.type,f.width,f.height,u.genMipmaps,!0)),f.format=Z[h.internalformat],f.type=J[h.type],f.mag=rt[u.magFilter],f.min=nt[u.minFilter],f.wrapS=it[u.wrapS],f.wrapT=it[u.wrapT],s=0;6>s;++s)C(y[s]);return f}var h=new z(34067);ut[h.id]=h,a.cubeCount++;var y=Array(6);return f(e,r,n,i,s,u),f.subimage=function(t,e,r,n,i){r|=0,n|=0,i|=0;var a=v();return l(a,h),a.width=0,a.height=0,p(a,e),a.width=a.width||(h.width>>i)-r,a.height=a.height||(h.height>>i)-n,D(h),d(a,34069+t,r,n,i),R(),g(a),f},f.resize=function(e){if((e|=0)!==h.width){f.width=h.width=e,f.height=h.height=e,D(h);for(var r=0;6>r;++r)for(var n=0;h.mipmask>>n;++n)t.texImage2D(34069+r,n,h.format,e>>n,e>>n,0,h.format,h.type,null);return R(),o.profile&&(h.stats.size=A(h.internalformat,h.type,f.width,f.height,!1,!0)),f}},f._reglType=\"textureCube\",f._texture=h,o.profile&&(f.stats=h.stats),f.destroy=function(){h.decRef()},f},clear:function(){for(var e=0;er;++r)if(0!=(e.mipmask&1<>r,e.height>>r,0,e.internalformat,e.type,null);else for(var n=0;6>n;++n)t.texImage2D(34069+n,r,e.internalformat,e.width>>r,e.height>>r,0,e.internalformat,e.type,null);I(e.texInfo,e.target)}))},refresh:function(){for(var e=0;ei;++i){for(u=0;ut;++t)r[t].resize(n);return e.width=e.height=n,e},_reglType:\"framebufferCube\",destroy:function(){r.forEach((function(t){t.destroy()}))}})},clear:function(){Q(k).forEach(g)},restore:function(){x.cur=null,x.next=null,x.dirty=!0,Q(k).forEach((function(e){e.framebuffer=t.createFramebuffer(),y(e)}))}})}function E(){this.w=this.z=this.y=this.x=this.state=0,this.buffer=null,this.size=0,this.normalized=!1,this.type=5126,this.divisor=this.stride=this.offset=0}function L(t,e,r,n,i,a,o){function s(){this.id=++f,this.attributes=[],this.elements=null,this.ownsElements=!1,this.offset=this.count=0,this.instances=-1,this.primitive=4;var t=e.oes_vertex_array_object;this.vao=t?t.createVertexArrayOES():null,h[this.id]=this,this.buffers=[]}var l=r.maxAttributes,c=Array(l);for(r=0;r=h.byteLength?l.subdata(h):(l.destroy(),r.buffers[s]=null)),r.buffers[s]||(l=r.buffers[s]=i.create(c,34962,!1,!0)),f.buffer=i.getBuffer(l),f.size=0|f.buffer.dimension,f.normalized=!1,f.type=f.buffer.dtype,f.offset=0,f.stride=0,f.divisor=0,f.state=1,t[s]=1):i.getBuffer(c)?(f.buffer=i.getBuffer(c),f.size=0|f.buffer.dimension,f.normalized=!1,f.type=f.buffer.dtype,f.offset=0,f.stride=0,f.divisor=0,f.state=1):i.getBuffer(c.buffer)?(f.buffer=i.getBuffer(c.buffer),f.size=0|(+c.size||f.buffer.dimension),f.normalized=!!c.normalized||!1,f.type=\"type\"in c?rt[c.type]:f.buffer.dtype,f.offset=0|(c.offset||0),f.stride=0|(c.stride||0),f.divisor=0|(c.divisor||0),f.state=1):\"x\"in c&&(f.x=+c.x||0,f.y=+c.y||0,f.z=+c.z||0,f.w=+c.w||0,f.state=2)}for(l=0;lt&&(t=e.stats.uniformsCount)})),t},r.getMaxAttributesCount=function(){var t=0;return h.forEach((function(e){e.stats.attributesCount>t&&(t=e.stats.attributesCount)})),t}),{clear:function(){var e=t.deleteShader.bind(t);Q(u).forEach(e),u={},Q(c).forEach(e),c={},h.forEach((function(e){t.deleteProgram(e.program)})),h.length=0,f={},r.shaderCount=0},program:function(e,n,i,a){var o=f[n];o||(o=f[n]={});var p=o[e];if(p&&(p.refCount++,!a))return p;var d=new s(n,e);return r.shaderCount++,l(d,i,a),p||(o[e]=d),h.push(d),G(d,{destroy:function(){if(d.refCount--,0>=d.refCount){t.deleteProgram(d.program);var e=h.indexOf(d);h.splice(e,1),r.shaderCount--}0>=o[d.vertId].refCount&&(t.deleteShader(c[d.vertId]),delete c[d.vertId],delete f[d.fragId][d.vertId]),Object.keys(f[d.fragId]).length||(t.deleteShader(u[d.fragId]),delete u[d.fragId],delete f[d.fragId])}})},restore:function(){u={},c={};for(var t=0;t>>e|t<<32-e}function I(t,e){var r=(65535&t)+(65535&e);return(t>>16)+(e>>16)+(r>>16)<<16|65535&r}function z(t){return Array.prototype.slice.call(t)}function D(t){return z(t).join(\"\")}function R(t){function e(){var t=[],e=[];return G((function(){t.push.apply(t,z(arguments))}),{def:function(){var r=\"v\"+i++;return e.push(r),0>>4&15)+\"0123456789abcdef\".charAt(15&e);return r}(function(t){for(var e=Array(t.length>>2),r=0;r>5]|=(255&t.charCodeAt(r/8))<<24-r%32;var n,i,a,o,s,l,u,c,f,h,p,d=8*t.length;for(t=[1779033703,-1150833019,1013904242,-1521486534,1359893119,-1694144372,528734635,1541459225],r=Array(64),e[d>>5]|=128<<24-d%32,e[15+(d+64>>9<<4)]=d,c=0;cf;f++){var v;16>f?r[f]=e[f+c]:(h=f,p=I(p=O(p=r[f-2],17)^O(p,19)^p>>>10,r[f-7]),v=O(v=r[f-15],7)^O(v,18)^v>>>3,r[h]=I(I(p,v),r[f-16])),h=I(I(I(I(u,h=O(h=o,6)^O(h,11)^O(h,25)),o&s^~o&l),Mt[f]),r[f]),p=I(u=O(u=d,2)^O(u,13)^O(u,22),d&n^d&i^n&i),u=l,l=s,s=o,o=I(a,h),a=i,i=n,n=d,d=I(h,p)}t[0]=I(d,t[0]),t[1]=I(n,t[1]),t[2]=I(i,t[2]),t[3]=I(a,t[3]),t[4]=I(o,t[4]),t[5]=I(s,t[5]),t[6]=I(l,t[6]),t[7]=I(u,t[7])}for(e=\"\",r=0;r<32*t.length;r+=8)e+=String.fromCharCode(t[r>>5]>>>24-r%32&255);return e}(function(t){for(var e,r,n=\"\",i=-1;++i=e&&56320<=r&&57343>=r&&(e=65536+((1023&e)<<10)+(1023&r),i++),127>=e?n+=String.fromCharCode(e):2047>=e?n+=String.fromCharCode(192|e>>>6&31,128|63&e):65535>=e?n+=String.fromCharCode(224|e>>>12&15,128|e>>>6&63,128|63&e):2097151>=e&&(n+=String.fromCharCode(240|e>>>18&7,128|e>>>12&63,128|e>>>6&63,128|63&e));return n}(r))),n[e])?n[e].apply(null,o):(r=Function.apply(null,a.concat(r)),n&&(n[e]=r),r.apply(null,o))}}}function F(t){return Array.isArray(t)||$(t)||u(t)}function B(t){return t.sort((function(t,e){return\"viewport\"===t?-1:\"viewport\"===e?1:t\"+e+\"?\"+i+\".constant[\"+e+\"]:0;\"})).join(\"\"),\"}}else{\",\"if(\",s,\"(\",i,\".buffer)){\",c,\"=\",a,\".createStream(\",34962,\",\",i,\".buffer);\",\"}else{\",c,\"=\",a,\".getBuffer(\",i,\".buffer);\",\"}\",f,'=\"type\" in ',i,\"?\",o.glTypes,\"[\",i,\".type]:\",c,\".dtype;\",l.normalized,\"=!!\",i,\".normalized;\"),n(\"size\"),n(\"offset\"),n(\"stride\"),n(\"divisor\"),r(\"}}\"),r.exit(\"if(\",l.isStream,\"){\",a,\".destroyStream(\",c,\");\",\"}\"),l}))})),o}function M(t,e,n,i,a){function s(t){var e=u[t];e&&(h[t]=e)}var l=function(t,e){if(\"string\"==typeof(r=t.static).frag&&\"string\"==typeof r.vert){if(0>1)\",s],\");\")}function e(){r(l,\".drawArraysInstancedANGLE(\",[d,v,g,s],\");\")}p&&\"null\"!==p?m?t():(r(\"if(\",p,\"){\"),t(),r(\"}else{\"),e(),r(\"}\")):e()}function o(){function t(){r(c+\".drawElements(\"+[d,g,y,v+\"<<((\"+y+\"-5121)>>1)\"]+\");\")}function e(){r(c+\".drawArrays(\"+[d,v,g]+\");\")}p&&\"null\"!==p?m?t():(r(\"if(\",p,\"){\"),t(),r(\"}else{\"),e(),r(\"}\")):e()}var s,l,u=t.shared,c=u.gl,f=u.draw,h=n.draw,p=function(){var i=h.elements,a=e;return i?((i.contextDep&&n.contextDynamic||i.propDep)&&(a=r),i=i.append(t,a),h.elementsActive&&a(\"if(\"+i+\")\"+c+\".bindBuffer(34963,\"+i+\".buffer.buffer);\")):(i=a.def(),a(i,\"=\",f,\".\",\"elements\",\";\",\"if(\",i,\"){\",c,\".bindBuffer(\",34963,\",\",i,\".buffer.buffer);}\",\"else if(\",u.vao,\".currentVAO){\",i,\"=\",t.shared.elements+\".getElements(\"+u.vao,\".currentVAO.elements);\",et?\"\":\"if(\"+i+\")\"+c+\".bindBuffer(34963,\"+i+\".buffer.buffer);\",\"}\")),i}(),d=i(\"primitive\"),v=i(\"offset\"),g=function(){var i=h.count,a=e;return i?((i.contextDep&&n.contextDynamic||i.propDep)&&(a=r),i=i.append(t,a)):i=a.def(f,\".\",\"count\"),i}();if(\"number\"==typeof g){if(0===g)return}else r(\"if(\",g,\"){\"),r.exit(\"}\");Q&&(s=i(\"instances\"),l=t.instancing);var y=p+\".type\",m=h.elements&&j(h.elements)&&!h.vaoActive;Q&&(\"number\"!=typeof s||0<=s)?\"string\"==typeof s?(r(\"if(\",s,\">0){\"),a(),r(\"}else if(\",s,\"<0){\"),o(),r(\"}\")):a():o()}function q(t,e,r,n,i){return i=(e=_()).proc(\"body\",i),Q&&(e.instancing=i.def(e.shared.extensions,\".angle_instanced_arrays\")),t(e,i,r,n),e.compile().body}function H(t,e,r,n){P(t,e),r.useVAO?r.drawVAO?e(t.shared.vao,\".setVAO(\",r.drawVAO.append(t,e),\");\"):e(t.shared.vao,\".setVAO(\",t.shared.vao,\".targetVAO);\"):(e(t.shared.vao,\".setVAO(null);\"),I(t,e,r,n.attributes,(function(){return!0}))),z(t,e,r,n.uniforms,(function(){return!0}),!1),D(t,e,e,r)}function W(t,e,r,n){function i(){return!0}t.batchId=\"a1\",P(t,e),I(t,e,r,n.attributes,i),z(t,e,r,n.uniforms,i,!1),D(t,e,e,r)}function X(t,e,r,n){function i(t){return t.contextDep&&o||t.propDep}function a(t){return!i(t)}P(t,e);var o=r.contextDep,s=e.def(),l=e.def();t.shared.props=l,t.batchId=s;var u=t.scope(),c=t.scope();e(u.entry,\"for(\",s,\"=0;\",s,\"<\",\"a1\",\";++\",s,\"){\",l,\"=\",\"a0\",\"[\",s,\"];\",c,\"}\",u.exit),r.needsContext&&S(t,c,r.context),r.needsFramebuffer&&E(t,c,r.framebuffer),C(t,c,r.state,i),r.profile&&i(r.profile)&&O(t,c,r,!1,!0),n?(r.useVAO?r.drawVAO?i(r.drawVAO)?c(t.shared.vao,\".setVAO(\",r.drawVAO.append(t,c),\");\"):u(t.shared.vao,\".setVAO(\",r.drawVAO.append(t,u),\");\"):u(t.shared.vao,\".setVAO(\",t.shared.vao,\".targetVAO);\"):(u(t.shared.vao,\".setVAO(null);\"),I(t,u,r,n.attributes,a),I(t,c,r,n.attributes,i)),z(t,u,r,n.uniforms,a,!1),z(t,c,r,n.uniforms,i,!0),D(t,u,c,r)):(e=t.global.def(\"{}\"),n=r.shader.progVar.append(t,c),l=c.def(n,\".id\"),u=c.def(e,\"[\",l,\"]\"),c(t.shared.gl,\".useProgram(\",n,\".program);\",\"if(!\",u,\"){\",u,\"=\",e,\"[\",l,\"]=\",t.link((function(e){return q(W,t,r,e,2)})),\"(\",n,\");}\",u,\".call(this,a0[\",s,\"],\",s,\");\"))}function Z(t,r){function n(e){var n=r.shader[e];n&&(n=n.append(t,i),isNaN(n)?i.set(a.shader,\".\"+e,n):i.set(a.shader,\".\"+e,t.link(n,{stable:!0})))}var i=t.proc(\"scope\",3);t.batchId=\"a2\";var a=t.shared,o=a.current;if(S(t,i,r.context),r.framebuffer&&r.framebuffer.append(t,i),B(Object.keys(r.state)).forEach((function(e){var n=r.state[e],o=n.append(t,i);m(o)?o.forEach((function(r,n){isNaN(r)?i.set(t.next[e],\"[\"+n+\"]\",r):i.set(t.next[e],\"[\"+n+\"]\",t.link(r,{stable:!0}))})):j(n)?i.set(a.next,\".\"+e,t.link(o,{stable:!0})):i.set(a.next,\".\"+e,o)})),O(t,i,r,!0,!0),[\"elements\",\"offset\",\"count\",\"instances\",\"primitive\"].forEach((function(e){var n=r.draw[e];n&&(n=n.append(t,i),isNaN(n)?i.set(a.draw,\".\"+e,n):i.set(a.draw,\".\"+e,t.link(n),{stable:!0}))})),Object.keys(r.uniforms).forEach((function(n){var o=r.uniforms[n].append(t,i);Array.isArray(o)&&(o=\"[\"+o.map((function(e){return isNaN(e)?e:t.link(e,{stable:!0})}))+\"]\"),i.set(a.uniforms,\"[\"+t.link(e.id(n),{stable:!0})+\"]\",o)})),Object.keys(r.attributes).forEach((function(e){var n=r.attributes[e].append(t,i),a=t.scopeAttrib(e);Object.keys(new J).forEach((function(t){i.set(a,\".\"+t,n[t])}))})),r.scopeVAO){var s=r.scopeVAO.append(t,i);isNaN(s)?i.set(a.vao,\".targetVAO\",s):i.set(a.vao,\".targetVAO\",t.link(s,{stable:!0}))}n(\"vert\"),n(\"frag\"),0=--this.refCount&&o(this)},i.profile&&(n.getTotalRenderbufferSize=function(){var t=0;return Object.keys(c).forEach((function(e){t+=c[e].stats.size})),t}),{create:function(e,r){function o(e,r){var n=0,a=0,c=32854;if(\"object\"==typeof e&&e?(\"shape\"in e?(n=0|(a=e.shape)[0],a=0|a[1]):(\"radius\"in e&&(n=a=0|e.radius),\"width\"in e&&(n=0|e.width),\"height\"in e&&(a=0|e.height)),\"format\"in e&&(c=s[e.format])):\"number\"==typeof e?(n=0|e,a=\"number\"==typeof r?0|r:n):e||(n=a=1),n!==u.width||a!==u.height||c!==u.format)return o.width=u.width=n,o.height=u.height=a,u.format=c,t.bindRenderbuffer(36161,u.renderbuffer),t.renderbufferStorage(36161,c,n,a),i.profile&&(u.stats.size=wt[u.format]*u.width*u.height),o.format=l[u.format],o}var u=new a(t.createRenderbuffer());return c[u.id]=u,n.renderbufferCount++,o(e,r),o.resize=function(e,r){var n=0|e,a=0|r||n;return n===u.width&&a===u.height||(o.width=u.width=n,o.height=u.height=a,t.bindRenderbuffer(36161,u.renderbuffer),t.renderbufferStorage(36161,u.format,n,a),i.profile&&(u.stats.size=wt[u.format]*u.width*u.height)),o},o._reglType=\"renderbuffer\",o._renderbuffer=u,i.profile&&(o.stats=u.stats),o.destroy=function(){u.decRef()},o},clear:function(){Q(c).forEach(o)},restore:function(){Q(c).forEach((function(e){e.renderbuffer=t.createRenderbuffer(),t.bindRenderbuffer(36161,e.renderbuffer),t.renderbufferStorage(36161,e.format,e.width,e.height)})),t.bindRenderbuffer(36161,null)}}},kt=[];kt[6408]=4,kt[6407]=3;var At=[];At[5121]=1,At[5126]=4,At[36193]=2;var Mt=[1116352408,1899447441,-1245643825,-373957723,961987163,1508970993,-1841331548,-1424204075,-670586216,310598401,607225278,1426881987,1925078388,-2132889090,-1680079193,-1046744716,-459576895,-272742522,264347078,604807628,770255983,1249150122,1555081692,1996064986,-1740746414,-1473132947,-1341970488,-1084653625,-958395405,-710438585,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,-2117940946,-1838011259,-1564481375,-1474664885,-1035236496,-949202525,-778901479,-694614492,-200395387,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,-2067236844,-1933114872,-1866530822,-1538233109,-1090935817,-965641998],St=[\"x\",\"y\",\"z\",\"w\"],Et=\"blend.func blend.equation stencil.func stencil.opFront stencil.opBack sample.coverage viewport scissor.box polygonOffset.offset\".split(\" \"),Lt={0:0,1:1,zero:0,one:1,\"src color\":768,\"one minus src color\":769,\"src alpha\":770,\"one minus src alpha\":771,\"dst color\":774,\"one minus dst color\":775,\"dst alpha\":772,\"one minus dst alpha\":773,\"constant color\":32769,\"one minus constant color\":32770,\"constant alpha\":32771,\"one minus constant alpha\":32772,\"src alpha saturate\":776},Ct={never:512,less:513,\"<\":513,equal:514,\"=\":514,\"==\":514,\"===\":514,lequal:515,\"<=\":515,greater:516,\">\":516,notequal:517,\"!=\":517,\"!==\":517,gequal:518,\">=\":518,always:519},Pt={0:0,zero:0,keep:7680,replace:7681,increment:7682,decrement:7683,\"increment wrap\":34055,\"decrement wrap\":34056,invert:5386},Ot={cw:2304,ccw:2305},It=new N(!1,!1,!1,(function(){}));return function(t){function e(){if(0===K.length)T&&T.update(),et=null;else{et=X.next(e),f();for(var t=K.length-1;0<=t;--t){var r=K[t];r&&r(O,null,0)}d.flush(),T&&T.update()}}function r(){!et&&0=K.length&&n()}}}}function c(){var t=V.viewport,e=V.scissor_box;t[0]=t[1]=e[0]=e[1]=0,O.viewportWidth=O.framebufferWidth=O.drawingBufferWidth=t[2]=e[2]=d.drawingBufferWidth,O.viewportHeight=O.framebufferHeight=O.drawingBufferHeight=t[3]=e[3]=d.drawingBufferHeight}function f(){O.tick+=1,O.time=p(),c(),U.procs.poll()}function h(){B.refresh(),c(),U.procs.refresh(),T&&T.update()}function p(){return(Z()-k)/1e3}if(!(t=a(t)))return null;var d=t.gl,y=d.getContextAttributes();d.isContextLost();var m=function(t,e){function r(e){var r;e=e.toLowerCase();try{r=n[e]=t.getExtension(e)}catch(t){}return!!r}for(var n={},i=0;ie;++e)rt(G({framebuffer:t.framebuffer.faces[e]},t),l);else rt(t,l);else l(0,t)},prop:Y.define.bind(null,1),context:Y.define.bind(null,2),this:Y.define.bind(null,3),draw:s({}),buffer:function(t){return z.create(t,34962,!1,!1)},elements:function(t){return D.create(t,!1)},texture:B.create2D,cube:B.createCube,renderbuffer:N.create,framebuffer:j.create,framebufferCube:j.createCube,vao:R.createVAO,attributes:y,frame:u,on:function(t,e){var r;switch(t){case\"frame\":return u(e);case\"lost\":r=$;break;case\"restore\":r=Q;break;case\"destroy\":r=tt}return r.push(e),{cancel:function(){for(var t=0;t4294967295||l(e)!==e)throw new s(\"`length` must be a positive 32-bit integer\");var r=arguments.length>2&&!!arguments[2],n=!0,u=!0;if(\"length\"in t&&o){var c=o(t,\"length\");c&&!c.configurable&&(n=!1),c&&!c.writable&&(u=!1)}return(n||u||!r)&&(a?i(t,\"length\",e,!0,!0):i(t,\"length\",e)),t}},29936:function(t,e,r){t.exports=i;var n=r(61252).EventEmitter;function i(){n.call(this)}r(6768)(i,n),i.Readable=r(12348),i.Writable=r(11288),i.Duplex=r(15316),i.Transform=r(22477),i.PassThrough=r(27136),i.finished=r(15932),i.pipeline=r(38180),i.Stream=i,i.prototype.pipe=function(t,e){var r=this;function i(e){t.writable&&!1===t.write(e)&&r.pause&&r.pause()}function a(){r.readable&&r.resume&&r.resume()}r.on(\"data\",i),t.on(\"drain\",a),t._isStdio||e&&!1===e.end||(r.on(\"end\",s),r.on(\"close\",l));var o=!1;function s(){o||(o=!0,t.end())}function l(){o||(o=!0,\"function\"==typeof t.destroy&&t.destroy())}function u(t){if(c(),0===n.listenerCount(this,\"error\"))throw t}function c(){r.removeListener(\"data\",i),t.removeListener(\"drain\",a),r.removeListener(\"end\",s),r.removeListener(\"close\",l),r.removeListener(\"error\",u),t.removeListener(\"error\",u),r.removeListener(\"end\",c),r.removeListener(\"close\",c),t.removeListener(\"close\",c)}return r.on(\"error\",u),t.on(\"error\",u),r.on(\"end\",c),r.on(\"close\",c),t.on(\"close\",c),t.emit(\"pipe\",r),t}},92784:function(t){\"use strict\";var e={};function r(t,r,n){n||(n=Error);var i=function(t){var e,n;function i(e,n,i){return t.call(this,function(t,e,n){return\"string\"==typeof r?r:r(t,e,n)}(e,n,i))||this}return n=t,(e=i).prototype=Object.create(n.prototype),e.prototype.constructor=e,e.__proto__=n,i}(n);i.prototype.name=n.name,i.prototype.code=t,e[t]=i}function n(t,e){if(Array.isArray(t)){var r=t.length;return t=t.map((function(t){return String(t)})),r>2?\"one of \".concat(e,\" \").concat(t.slice(0,r-1).join(\", \"),\", or \")+t[r-1]:2===r?\"one of \".concat(e,\" \").concat(t[0],\" or \").concat(t[1]):\"of \".concat(e,\" \").concat(t[0])}return\"of \".concat(e,\" \").concat(String(t))}r(\"ERR_INVALID_OPT_VALUE\",(function(t,e){return'The value \"'+e+'\" is invalid for option \"'+t+'\"'}),TypeError),r(\"ERR_INVALID_ARG_TYPE\",(function(t,e,r){var i,a,o,s,l;if(\"string\"==typeof e&&(a=\"not \",e.substr(0,4)===a)?(i=\"must not be\",e=e.replace(/^not /,\"\")):i=\"must be\",function(t,e,r){return(void 0===r||r>t.length)&&(r=t.length),t.substring(r-9,r)===e}(t,\" argument\"))o=\"The \".concat(t,\" \").concat(i,\" \").concat(n(e,\"type\"));else{var u=(\"number\"!=typeof l&&(l=0),l+1>(s=t).length||-1===s.indexOf(\".\",l)?\"argument\":\"property\");o='The \"'.concat(t,'\" ').concat(u,\" \").concat(i,\" \").concat(n(e,\"type\"))}return o+\". Received type \".concat(typeof r)}),TypeError),r(\"ERR_STREAM_PUSH_AFTER_EOF\",\"stream.push() after EOF\"),r(\"ERR_METHOD_NOT_IMPLEMENTED\",(function(t){return\"The \"+t+\" method is not implemented\"})),r(\"ERR_STREAM_PREMATURE_CLOSE\",\"Premature close\"),r(\"ERR_STREAM_DESTROYED\",(function(t){return\"Cannot call \"+t+\" after a stream was destroyed\"})),r(\"ERR_MULTIPLE_CALLBACK\",\"Callback called multiple times\"),r(\"ERR_STREAM_CANNOT_PIPE\",\"Cannot pipe, not readable\"),r(\"ERR_STREAM_WRITE_AFTER_END\",\"write after end\"),r(\"ERR_STREAM_NULL_VALUES\",\"May not write null values to stream\",TypeError),r(\"ERR_UNKNOWN_ENCODING\",(function(t){return\"Unknown encoding: \"+t}),TypeError),r(\"ERR_STREAM_UNSHIFT_AFTER_END_EVENT\",\"stream.unshift() after end event\"),t.exports.i=e},15316:function(t,e,r){\"use strict\";var n=r(4168),i=Object.keys||function(t){var e=[];for(var r in t)e.push(r);return e};t.exports=c;var a=r(12348),o=r(11288);r(6768)(c,a);for(var s=i(o.prototype),l=0;l0)if(\"string\"==typeof e||s.objectMode||Object.getPrototypeOf(e)===l.prototype||(e=function(t){return l.from(t)}(e)),n)s.endEmitted?w(t,new _):S(t,s,e,!0);else if(s.ended)w(t,new x);else{if(s.destroyed)return!1;s.reading=!1,s.decoder&&!r?(e=s.decoder.write(e),s.objectMode||0!==e.length?S(t,s,e,!1):O(t,s)):S(t,s,e,!1)}else n||(s.reading=!1,O(t,s));return!s.ended&&(s.lengthe.highWaterMark&&(e.highWaterMark=function(t){return t>=E?t=E:(t--,t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,t|=t>>>16,t++),t}(t)),t<=e.length?t:e.ended?e.length:(e.needReadable=!0,0))}function C(t){var e=t._readableState;a(\"emitReadable\",e.needReadable,e.emittedReadable),e.needReadable=!1,e.emittedReadable||(a(\"emitReadable\",e.flowing),e.emittedReadable=!0,i.nextTick(P,t))}function P(t){var e=t._readableState;a(\"emitReadable_\",e.destroyed,e.length,e.ended),e.destroyed||!e.length&&!e.ended||(t.emit(\"readable\"),e.emittedReadable=!1),e.needReadable=!e.flowing&&!e.ended&&e.length<=e.highWaterMark,F(t)}function O(t,e){e.readingMore||(e.readingMore=!0,i.nextTick(I,t,e))}function I(t,e){for(;!e.reading&&!e.ended&&(e.length0,e.resumeScheduled&&!e.paused?e.flowing=!0:t.listenerCount(\"data\")>0&&t.resume()}function D(t){a(\"readable nexttick read 0\"),t.read(0)}function R(t,e){a(\"resume\",e.reading),e.reading||t.read(0),e.resumeScheduled=!1,t.emit(\"resume\"),F(t),e.flowing&&!e.reading&&t.read(0)}function F(t){var e=t._readableState;for(a(\"flow\",e.flowing);e.flowing&&null!==t.read(););}function B(t,e){return 0===e.length?null:(e.objectMode?r=e.buffer.shift():!t||t>=e.length?(r=e.decoder?e.buffer.join(\"\"):1===e.buffer.length?e.buffer.first():e.buffer.concat(e.length),e.buffer.clear()):r=e.buffer.consume(t,e.decoder),r);var r}function N(t){var e=t._readableState;a(\"endReadable\",e.endEmitted),e.endEmitted||(e.ended=!0,i.nextTick(j,e,t))}function j(t,e){if(a(\"endReadableNT\",t.endEmitted,t.length),!t.endEmitted&&0===t.length&&(t.endEmitted=!0,e.readable=!1,e.emit(\"end\"),t.autoDestroy)){var r=e._writableState;(!r||r.autoDestroy&&r.finished)&&e.destroy()}}function U(t,e){for(var r=0,n=t.length;r=e.highWaterMark:e.length>0)||e.ended))return a(\"read: emitReadable\",e.length,e.ended),0===e.length&&e.ended?N(this):C(this),null;if(0===(t=L(t,e))&&e.ended)return 0===e.length&&N(this),null;var n,i=e.needReadable;return a(\"need readable\",i),(0===e.length||e.length-t0?B(t,e):null)?(e.needReadable=e.length<=e.highWaterMark,t=0):(e.length-=t,e.awaitDrain=0),0===e.length&&(e.ended||(e.needReadable=!0),r!==t&&e.ended&&N(this)),null!==n&&this.emit(\"data\",n),n},A.prototype._read=function(t){w(this,new b(\"_read()\"))},A.prototype.pipe=function(t,e){var r=this,n=this._readableState;switch(n.pipesCount){case 0:n.pipes=t;break;case 1:n.pipes=[n.pipes,t];break;default:n.pipes.push(t)}n.pipesCount+=1,a(\"pipe count=%d opts=%j\",n.pipesCount,e);var s=e&&!1===e.end||t===i.stdout||t===i.stderr?v:l;function l(){a(\"onend\"),t.end()}n.endEmitted?i.nextTick(s):r.once(\"end\",s),t.on(\"unpipe\",(function e(i,o){a(\"onunpipe\"),i===r&&o&&!1===o.hasUnpiped&&(o.hasUnpiped=!0,a(\"cleanup\"),t.removeListener(\"close\",p),t.removeListener(\"finish\",d),t.removeListener(\"drain\",u),t.removeListener(\"error\",h),t.removeListener(\"unpipe\",e),r.removeListener(\"end\",l),r.removeListener(\"end\",v),r.removeListener(\"data\",f),c=!0,!n.awaitDrain||t._writableState&&!t._writableState.needDrain||u())}));var u=function(t){return function(){var e=t._readableState;a(\"pipeOnDrain\",e.awaitDrain),e.awaitDrain&&e.awaitDrain--,0===e.awaitDrain&&o(t,\"data\")&&(e.flowing=!0,F(t))}}(r);t.on(\"drain\",u);var c=!1;function f(e){a(\"ondata\");var i=t.write(e);a(\"dest.write\",i),!1===i&&((1===n.pipesCount&&n.pipes===t||n.pipesCount>1&&-1!==U(n.pipes,t))&&!c&&(a(\"false write response, pause\",n.awaitDrain),n.awaitDrain++),r.pause())}function h(e){a(\"onerror\",e),v(),t.removeListener(\"error\",h),0===o(t,\"error\")&&w(t,e)}function p(){t.removeListener(\"finish\",d),v()}function d(){a(\"onfinish\"),t.removeListener(\"close\",p),v()}function v(){a(\"unpipe\"),r.unpipe(t)}return r.on(\"data\",f),function(t,e,r){if(\"function\"==typeof t.prependListener)return t.prependListener(e,r);t._events&&t._events[e]?Array.isArray(t._events[e])?t._events[e].unshift(r):t._events[e]=[r,t._events[e]]:t.on(e,r)}(t,\"error\",h),t.once(\"close\",p),t.once(\"finish\",d),t.emit(\"pipe\",r),n.flowing||(a(\"pipe resume\"),r.resume()),t},A.prototype.unpipe=function(t){var e=this._readableState,r={hasUnpiped:!1};if(0===e.pipesCount)return this;if(1===e.pipesCount)return t&&t!==e.pipes||(t||(t=e.pipes),e.pipes=null,e.pipesCount=0,e.flowing=!1,t&&t.emit(\"unpipe\",this,r)),this;if(!t){var n=e.pipes,i=e.pipesCount;e.pipes=null,e.pipesCount=0,e.flowing=!1;for(var a=0;a0,!1!==n.flowing&&this.resume()):\"readable\"===t&&(n.endEmitted||n.readableListening||(n.readableListening=n.needReadable=!0,n.flowing=!1,n.emittedReadable=!1,a(\"on readable\",n.length,n.reading),n.length?C(this):n.reading||i.nextTick(D,this))),r},A.prototype.addListener=A.prototype.on,A.prototype.removeListener=function(t,e){var r=s.prototype.removeListener.call(this,t,e);return\"readable\"===t&&i.nextTick(z,this),r},A.prototype.removeAllListeners=function(t){var e=s.prototype.removeAllListeners.apply(this,arguments);return\"readable\"!==t&&void 0!==t||i.nextTick(z,this),e},A.prototype.resume=function(){var t=this._readableState;return t.flowing||(a(\"resume\"),t.flowing=!t.readableListening,function(t,e){e.resumeScheduled||(e.resumeScheduled=!0,i.nextTick(R,t,e))}(this,t)),t.paused=!1,this},A.prototype.pause=function(){return a(\"call pause flowing=%j\",this._readableState.flowing),!1!==this._readableState.flowing&&(a(\"pause\"),this._readableState.flowing=!1,this.emit(\"pause\")),this._readableState.paused=!0,this},A.prototype.wrap=function(t){var e=this,r=this._readableState,n=!1;for(var i in t.on(\"end\",(function(){if(a(\"wrapped end\"),r.decoder&&!r.ended){var t=r.decoder.end();t&&t.length&&e.push(t)}e.push(null)})),t.on(\"data\",(function(i){a(\"wrapped data\"),r.decoder&&(i=r.decoder.write(i)),r.objectMode&&null==i||(r.objectMode||i&&i.length)&&(e.push(i)||(n=!0,t.pause()))})),t)void 0===this[i]&&\"function\"==typeof t[i]&&(this[i]=function(e){return function(){return t[e].apply(t,arguments)}}(i));for(var o=0;o-1))throw new _(t);return this._writableState.defaultEncoding=t,this},Object.defineProperty(A.prototype,\"writableBuffer\",{enumerable:!1,get:function(){return this._writableState&&this._writableState.getBuffer()}}),Object.defineProperty(A.prototype,\"writableHighWaterMark\",{enumerable:!1,get:function(){return this._writableState.highWaterMark}}),A.prototype._write=function(t,e,r){r(new v(\"_write()\"))},A.prototype._writev=null,A.prototype.end=function(t,e,r){var n=this._writableState;return\"function\"==typeof t?(r=t,t=null,e=null):\"function\"==typeof e&&(r=e,e=null),null!=t&&this.write(t,e),n.corked&&(n.corked=1,this.uncork()),n.ending||function(t,e,r){e.ending=!0,P(t,e),r&&(e.finished?i.nextTick(r):t.once(\"finish\",r)),e.ended=!0,t.writable=!1}(this,n,r),this},Object.defineProperty(A.prototype,\"writableLength\",{enumerable:!1,get:function(){return this._writableState.length}}),Object.defineProperty(A.prototype,\"destroyed\",{enumerable:!1,get:function(){return void 0!==this._writableState&&this._writableState.destroyed},set:function(t){this._writableState&&(this._writableState.destroyed=t)}}),A.prototype.destroy=f.destroy,A.prototype._undestroy=f.undestroy,A.prototype._destroy=function(t,e){e(t)}},60328:function(t,e,r){\"use strict\";var n,i=r(4168);function a(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}var o=r(15932),s=Symbol(\"lastResolve\"),l=Symbol(\"lastReject\"),u=Symbol(\"error\"),c=Symbol(\"ended\"),f=Symbol(\"lastPromise\"),h=Symbol(\"handlePromise\"),p=Symbol(\"stream\");function d(t,e){return{value:t,done:e}}function v(t){var e=t[s];if(null!==e){var r=t[p].read();null!==r&&(t[f]=null,t[s]=null,t[l]=null,e(d(r,!1)))}}function g(t){i.nextTick(v,t)}var y=Object.getPrototypeOf((function(){})),m=Object.setPrototypeOf((a(n={get stream(){return this[p]},next:function(){var t=this,e=this[u];if(null!==e)return Promise.reject(e);if(this[c])return Promise.resolve(d(void 0,!0));if(this[p].destroyed)return new Promise((function(e,r){i.nextTick((function(){t[u]?r(t[u]):e(d(void 0,!0))}))}));var r,n=this[f];if(n)r=new Promise(function(t,e){return function(r,n){t.then((function(){e[c]?r(d(void 0,!0)):e[h](r,n)}),n)}}(n,this));else{var a=this[p].read();if(null!==a)return Promise.resolve(d(a,!1));r=new Promise(this[h])}return this[f]=r,r}},Symbol.asyncIterator,(function(){return this})),a(n,\"return\",(function(){var t=this;return new Promise((function(e,r){t[p].destroy(null,(function(t){t?r(t):e(d(void 0,!0))}))}))})),n),y);t.exports=function(t){var e,r=Object.create(m,(a(e={},p,{value:t,writable:!0}),a(e,s,{value:null,writable:!0}),a(e,l,{value:null,writable:!0}),a(e,u,{value:null,writable:!0}),a(e,c,{value:t._readableState.endEmitted,writable:!0}),a(e,h,{value:function(t,e){var n=r[p].read();n?(r[f]=null,r[s]=null,r[l]=null,t(d(n,!1))):(r[s]=t,r[l]=e)},writable:!0}),e));return r[f]=null,o(t,(function(t){if(t&&\"ERR_STREAM_PREMATURE_CLOSE\"!==t.code){var e=r[l];return null!==e&&(r[f]=null,r[s]=null,r[l]=null,e(t)),void(r[u]=t)}var n=r[s];null!==n&&(r[f]=null,r[s]=null,r[l]=null,n(d(void 0,!0))),r[c]=!0})),t.on(\"readable\",g.bind(null,r)),r}},47264:function(t,e,r){\"use strict\";function n(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),r.push.apply(r,n)}return r}function i(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function a(t,e){for(var r=0;r0?this.tail.next=e:this.head=e,this.tail=e,++this.length}},{key:\"unshift\",value:function(t){var e={data:t,next:this.head};0===this.length&&(this.tail=e),this.head=e,++this.length}},{key:\"shift\",value:function(){if(0!==this.length){var t=this.head.data;return 1===this.length?this.head=this.tail=null:this.head=this.head.next,--this.length,t}}},{key:\"clear\",value:function(){this.head=this.tail=null,this.length=0}},{key:\"join\",value:function(t){if(0===this.length)return\"\";for(var e=this.head,r=\"\"+e.data;e=e.next;)r+=t+e.data;return r}},{key:\"concat\",value:function(t){if(0===this.length)return o.alloc(0);for(var e,r,n,i=o.allocUnsafe(t>>>0),a=this.head,s=0;a;)e=a.data,r=i,n=s,o.prototype.copy.call(e,r,n),s+=a.data.length,a=a.next;return i}},{key:\"consume\",value:function(t,e){var r;return ti.length?i.length:t;if(a===i.length?n+=i:n+=i.slice(0,t),0==(t-=a)){a===i.length?(++r,e.next?this.head=e.next:this.head=this.tail=null):(this.head=e,e.data=i.slice(a));break}++r}return this.length-=r,n}},{key:\"_getBuffer\",value:function(t){var e=o.allocUnsafe(t),r=this.head,n=1;for(r.data.copy(e),t-=r.data.length;r=r.next;){var i=r.data,a=t>i.length?i.length:t;if(i.copy(e,e.length-t,0,a),0==(t-=a)){a===i.length?(++n,r.next?this.head=r.next:this.head=this.tail=null):(this.head=r,r.data=i.slice(a));break}++n}return this.length-=n,e}},{key:l,value:function(t,e){return s(this,function(t){for(var e=1;e0,(function(t){c||(c=t),t&&h.forEach(l),a||(h.forEach(l),f(c))}))}));return e.reduce(u)}},24888:function(t,e,r){\"use strict\";var n=r(92784).i.ERR_INVALID_OPT_VALUE;t.exports={getHighWaterMark:function(t,e,r,i){var a=function(t,e,r){return null!=t.highWaterMark?t.highWaterMark:e?t[r]:null}(e,i,r);if(null!=a){if(!isFinite(a)||Math.floor(a)!==a||a<0)throw new n(i?r:\"highWaterMark\",a);return Math.floor(a)}return t.objectMode?16:16384}}},4776:function(t,e,r){t.exports=r(61252).EventEmitter},86032:function(t,e,r){\"use strict\";var n=r(30456).Buffer,i=n.isEncoding||function(t){switch((t=\"\"+t)&&t.toLowerCase()){case\"hex\":case\"utf8\":case\"utf-8\":case\"ascii\":case\"binary\":case\"base64\":case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":case\"raw\":return!0;default:return!1}};function a(t){var e;switch(this.encoding=function(t){var e=function(t){if(!t)return\"utf8\";for(var e;;)switch(t){case\"utf8\":case\"utf-8\":return\"utf8\";case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return\"utf16le\";case\"latin1\":case\"binary\":return\"latin1\";case\"base64\":case\"ascii\":case\"hex\":return t;default:if(e)return;t=(\"\"+t).toLowerCase(),e=!0}}(t);if(\"string\"!=typeof e&&(n.isEncoding===i||!i(t)))throw new Error(\"Unknown encoding: \"+t);return e||t}(t),this.encoding){case\"utf16le\":this.text=l,this.end=u,e=4;break;case\"utf8\":this.fillLast=s,e=4;break;case\"base64\":this.text=c,this.end=f,e=3;break;default:return this.write=h,void(this.end=p)}this.lastNeed=0,this.lastTotal=0,this.lastChar=n.allocUnsafe(e)}function o(t){return t<=127?0:t>>5==6?2:t>>4==14?3:t>>3==30?4:t>>6==2?-1:-2}function s(t){var e=this.lastTotal-this.lastNeed,r=function(t,e,r){if(128!=(192&e[0]))return t.lastNeed=0,\"�\";if(t.lastNeed>1&&e.length>1){if(128!=(192&e[1]))return t.lastNeed=1,\"�\";if(t.lastNeed>2&&e.length>2&&128!=(192&e[2]))return t.lastNeed=2,\"�\"}}(this,t);return void 0!==r?r:this.lastNeed<=t.length?(t.copy(this.lastChar,e,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal)):(t.copy(this.lastChar,e,0,t.length),void(this.lastNeed-=t.length))}function l(t,e){if((t.length-e)%2==0){var r=t.toString(\"utf16le\",e);if(r){var n=r.charCodeAt(r.length-1);if(n>=55296&&n<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1],r.slice(0,-1)}return r}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=t[t.length-1],t.toString(\"utf16le\",e,t.length-1)}function u(t){var e=t&&t.length?this.write(t):\"\";if(this.lastNeed){var r=this.lastTotal-this.lastNeed;return e+this.lastChar.toString(\"utf16le\",0,r)}return e}function c(t,e){var r=(t.length-e)%3;return 0===r?t.toString(\"base64\",e):(this.lastNeed=3-r,this.lastTotal=3,1===r?this.lastChar[0]=t[t.length-1]:(this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1]),t.toString(\"base64\",e,t.length-r))}function f(t){var e=t&&t.length?this.write(t):\"\";return this.lastNeed?e+this.lastChar.toString(\"base64\",0,3-this.lastNeed):e}function h(t){return t.toString(this.encoding)}function p(t){return t&&t.length?this.write(t):\"\"}e.o=a,a.prototype.write=function(t){if(0===t.length)return\"\";var e,r;if(this.lastNeed){if(void 0===(e=this.fillLast(t)))return\"\";r=this.lastNeed,this.lastNeed=0}else r=0;return r=0?(i>0&&(t.lastNeed=i-1),i):--n=0?(i>0&&(t.lastNeed=i-2),i):--n=0?(i>0&&(2===i?i=0:t.lastNeed=i-3),i):0}(this,t,e);if(!this.lastNeed)return t.toString(\"utf8\",e);this.lastTotal=r;var n=t.length-(r-this.lastNeed);return t.copy(this.lastChar,0,n),t.toString(\"utf8\",e,n)},a.prototype.fillLast=function(t){if(this.lastNeed<=t.length)return t.copy(this.lastChar,this.lastTotal-this.lastNeed,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);t.copy(this.lastChar,this.lastTotal-this.lastNeed,0,t.length),this.lastNeed-=t.length}},55619:function(t,e,r){var n=r(45408),i=r(86844)(\"stream-parser\");t.exports=function(t){var e=t&&\"function\"==typeof t._transform,r=t&&\"function\"==typeof t._write;if(!e&&!r)throw new Error(\"must pass a Writable or Transform stream in\");i(\"extending Parser into stream\"),t._bytes=c,t._skipBytes=f,e&&(t._passthrough=h),e?t._transform=d:t._write=p};var a=-1,o=0,s=1,l=2;function u(t){i(\"initializing parser stream\"),t._parserBytesLeft=0,t._parserBuffers=[],t._parserBuffered=0,t._parserState=a,t._parserCallback=null,\"function\"==typeof t.push&&(t._parserOutput=t.push.bind(t)),t._parserInit=!0}function c(t,e){n(!this._parserCallback,'there is already a \"callback\" set!'),n(isFinite(t)&&t>0,'can only buffer a finite number of bytes > 0, got \"'+t+'\"'),this._parserInit||u(this),i(\"buffering %o bytes\",t),this._parserBytesLeft=t,this._parserCallback=e,this._parserState=o}function f(t,e){n(!this._parserCallback,'there is already a \"callback\" set!'),n(t>0,'can only skip > 0 bytes, got \"'+t+'\"'),this._parserInit||u(this),i(\"skipping %o bytes\",t),this._parserBytesLeft=t,this._parserCallback=e,this._parserState=s}function h(t,e){n(!this._parserCallback,'There is already a \"callback\" set!'),n(t>0,'can only pass through > 0 bytes, got \"'+t+'\"'),this._parserInit||u(this),i(\"passing through %o bytes\",t),this._parserBytesLeft=t,this._parserCallback=e,this._parserState=l}function p(t,e,r){this._parserInit||u(this),i(\"write(%o bytes)\",t.length),\"function\"==typeof e&&(r=e),g(this,t,null,r)}function d(t,e,r){this._parserInit||u(this),i(\"transform(%o bytes)\",t.length),\"function\"!=typeof e&&(e=this._parserOutput),g(this,t,e,r)}function v(t,e,r,n){if(t._parserBytesLeft-=e.length,i(\"%o bytes left for stream piece\",t._parserBytesLeft),t._parserState===o?(t._parserBuffers.push(e),t._parserBuffered+=e.length):t._parserState===l&&r(e),0!==t._parserBytesLeft)return n;var s=t._parserCallback;if(s&&t._parserState===o&&t._parserBuffers.length>1&&(e=Buffer.concat(t._parserBuffers,t._parserBuffered)),t._parserState!==o&&(e=null),t._parserCallback=null,t._parserBuffered=0,t._parserState=a,t._parserBuffers.splice(0),s){var u=[];e&&u.push(e),r&&u.push(r);var c=s.length>u.length;c&&u.push(y(n));var f=s.apply(t,u);if(!c||n===f)return n}}var g=y((function t(e,r,n,i){return e._parserBytesLeft<=0?i(new Error(\"got data but not currently parsing anything\")):r.length<=e._parserBytesLeft?function(){return v(e,r,n,i)}:function(){var a=r.slice(0,e._parserBytesLeft);return v(e,a,n,(function(o){return o?i(o):r.length>a.length?function(){return t(e,r.slice(a.length),n,i)}:void 0}))}}));function y(t){return function(){for(var e=t.apply(this,arguments);\"function\"==typeof e;)e=e();return e}}},86844:function(t,e,r){var n=r(4168);function i(){var t;try{t=e.storage.debug}catch(t){}return!t&&void 0!==n&&\"env\"in n&&(t=n.env.DEBUG),t}(e=t.exports=r(89416)).log=function(){return\"object\"==typeof console&&console.log&&Function.prototype.apply.call(console.log,console,arguments)},e.formatArgs=function(t){var r=this.useColors;if(t[0]=(r?\"%c\":\"\")+this.namespace+(r?\" %c\":\" \")+t[0]+(r?\"%c \":\" \")+\"+\"+e.humanize(this.diff),r){var n=\"color: \"+this.color;t.splice(1,0,n,\"color: inherit\");var i=0,a=0;t[0].replace(/%[a-zA-Z%]/g,(function(t){\"%%\"!==t&&(i++,\"%c\"===t&&(a=i))})),t.splice(a,0,n)}},e.save=function(t){try{null==t?e.storage.removeItem(\"debug\"):e.storage.debug=t}catch(t){}},e.load=i,e.useColors=function(){return!(\"undefined\"==typeof window||!window.process||\"renderer\"!==window.process.type)||(\"undefined\"!=typeof document&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||\"undefined\"!=typeof window&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||\"undefined\"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/)&&parseInt(RegExp.$1,10)>=31||\"undefined\"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/))},e.storage=\"undefined\"!=typeof chrome&&void 0!==chrome.storage?chrome.storage.local:function(){try{return window.localStorage}catch(t){}}(),e.colors=[\"lightseagreen\",\"forestgreen\",\"goldenrod\",\"dodgerblue\",\"darkorchid\",\"crimson\"],e.formatters.j=function(t){try{return JSON.stringify(t)}catch(t){return\"[UnexpectedJSONParseError]: \"+t.message}},e.enable(i())},89416:function(t,e,r){var n;function i(t){function r(){if(r.enabled){var t=r,i=+new Date,a=i-(n||i);t.diff=a,t.prev=n,t.curr=i,n=i;for(var o=new Array(arguments.length),s=0;s0)return function(t){if(!((t=String(t)).length>100)){var a=/^((?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(t);if(a){var o=parseFloat(a[1]);switch((a[2]||\"ms\").toLowerCase()){case\"years\":case\"year\":case\"yrs\":case\"yr\":case\"y\":return 315576e5*o;case\"days\":case\"day\":case\"d\":return o*i;case\"hours\":case\"hour\":case\"hrs\":case\"hr\":case\"h\":return o*n;case\"minutes\":case\"minute\":case\"mins\":case\"min\":case\"m\":return o*r;case\"seconds\":case\"second\":case\"secs\":case\"sec\":case\"s\":return o*e;case\"milliseconds\":case\"millisecond\":case\"msecs\":case\"msec\":case\"ms\":return o;default:return}}}}(t);if(\"number\"===l&&!1===isNaN(t))return o.long?a(s=t,i,\"day\")||a(s,n,\"hour\")||a(s,r,\"minute\")||a(s,e,\"second\")||s+\" ms\":function(t){return t>=i?Math.round(t/i)+\"d\":t>=n?Math.round(t/n)+\"h\":t>=r?Math.round(t/r)+\"m\":t>=e?Math.round(t/e)+\"s\":t+\"ms\"}(t);throw new Error(\"val is not a non-empty string or a valid number. val=\"+JSON.stringify(t))}},39956:function(t,e,r){\"use strict\";var n=r(32868);t.exports=function(t,e,r){if(null==t)throw Error(\"First argument should be a string\");if(null==e)throw Error(\"Separator should be a string or a RegExp\");r?(\"string\"==typeof r||Array.isArray(r))&&(r={ignore:r}):r={},null==r.escape&&(r.escape=!0),null==r.ignore?r.ignore=[\"[]\",\"()\",\"{}\",\"<>\",'\"\"',\"''\",\"``\",\"“”\",\"«»\"]:(\"string\"==typeof r.ignore&&(r.ignore=[r.ignore]),r.ignore=r.ignore.map((function(t){return 1===t.length&&(t+=t),t})));var i=n.parse(t,{flat:!0,brackets:r.ignore}),a=i[0].split(e);if(r.escape){for(var o=[],s=0;s0;){e=u[u.length-1];var p=t[e];if(a[e]=0&&s[e].push(o[v])}a[e]=d}else{if(n[e]===r[e]){var g=[],y=[],m=0;for(d=l.length-1;d>=0;--d){var x=l[d];if(i[x]=!1,g.push(x),y.push(s[x]),m+=s[x].length,o[x]=f.length,x===e){l.length=d;break}}f.push(g);var b=new Array(m);for(d=0;d1&&(i=1),i<-1&&(i=-1),(t*n-e*r<0?-1:1)*Math.acos(i)};e.default=function(t){var e=t.px,r=t.py,s=t.cx,l=t.cy,u=t.rx,c=t.ry,f=t.xAxisRotation,h=void 0===f?0:f,p=t.largeArcFlag,d=void 0===p?0:p,v=t.sweepFlag,g=void 0===v?0:v,y=[];if(0===u||0===c)return[];var m=Math.sin(h*n/360),x=Math.cos(h*n/360),b=x*(e-s)/2+m*(r-l)/2,_=-m*(e-s)/2+x*(r-l)/2;if(0===b&&0===_)return[];u=Math.abs(u),c=Math.abs(c);var w=Math.pow(b,2)/Math.pow(u,2)+Math.pow(_,2)/Math.pow(c,2);w>1&&(u*=Math.sqrt(w),c*=Math.sqrt(w));var T=function(t,e,r,i,a,s,l,u,c,f,h,p){var d=Math.pow(a,2),v=Math.pow(s,2),g=Math.pow(h,2),y=Math.pow(p,2),m=d*v-d*y-v*g;m<0&&(m=0),m/=d*y+v*g;var x=(m=Math.sqrt(m)*(l===u?-1:1))*a/s*p,b=m*-s/a*h,_=f*x-c*b+(t+r)/2,w=c*x+f*b+(e+i)/2,T=(h-x)/a,k=(p-b)/s,A=(-h-x)/a,M=(-p-b)/s,S=o(1,0,T,k),E=o(T,k,A,M);return 0===u&&E>0&&(E-=n),1===u&&E<0&&(E+=n),[_,w,S,E]}(e,r,s,l,u,c,d,g,m,x,b,_),k=function(t,e){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return function(t,e){var r=[],n=!0,i=!1,a=void 0;try{for(var o,s=t[Symbol.iterator]();!(n=(o=s.next()).done)&&(r.push(o.value),!e||r.length!==e);n=!0);}catch(t){i=!0,a=t}finally{try{!n&&s.return&&s.return()}finally{if(i)throw a}}return r}(t,e);throw new TypeError(\"Invalid attempt to destructure non-iterable instance\")}(T,4),A=k[0],M=k[1],S=k[2],E=k[3],L=Math.abs(E)/(n/4);Math.abs(1-L)<1e-7&&(L=1);var C=Math.max(Math.ceil(L),1);E/=C;for(var P=0;Pe[2]&&(e[2]=u[c+0]),u[c+1]>e[3]&&(e[3]=u[c+1]);return e}},41976:function(t,e,r){\"use strict\";t.exports=function(t){for(var e,r=[],o=0,s=0,l=0,u=0,c=null,f=null,h=0,p=0,d=0,v=t.length;d4?(o=g[g.length-4],s=g[g.length-3]):(o=h,s=p),r.push(g)}return r};var n=r(92848);function i(t,e,r,n){return[\"C\",t,e,r,n,r,n]}function a(t,e,r,n,i,a){return[\"C\",t/3+2/3*r,e/3+2/3*n,i/3+2/3*r,a/3+2/3*n,i,a]}},20472:function(t,e,r){\"use strict\";var n,i=r(74840),a=r(21984),o=r(22235),s=r(53520),l=r(29620),u=document.createElement(\"canvas\"),c=u.getContext(\"2d\");t.exports=function(t,e){if(!s(t))throw Error(\"Argument should be valid svg path string\");var r,f;e||(e={}),e.shape?(r=e.shape[0],f=e.shape[1]):(r=u.width=e.w||e.width||200,f=u.height=e.h||e.height||200);var h=Math.min(r,f),p=e.stroke||0,d=e.viewbox||e.viewBox||i(t),v=[r/(d[2]-d[0]),f/(d[3]-d[1])],g=Math.min(v[0]||0,v[1]||0)/2;if(c.fillStyle=\"black\",c.fillRect(0,0,r,f),c.fillStyle=\"white\",p&&(\"number\"!=typeof p&&(p=1),c.strokeStyle=p>0?\"white\":\"black\",c.lineWidth=Math.abs(p)),c.translate(.5*r,.5*f),c.scale(g,g),function(){if(null!=n)return n;var t=document.createElement(\"canvas\").getContext(\"2d\");if(t.canvas.width=t.canvas.height=1,!window.Path2D)return n=!1;var e=new Path2D(\"M0,0h1v1h-1v-1Z\");t.fillStyle=\"black\",t.fill(e);var r=t.getImageData(0,0,1,1);return n=r&&r.data&&255===r.data[3]}()){var y=new Path2D(t);c.fill(y),p&&c.stroke(y)}else{var m=a(t);o(c,m),c.fill(),p&&c.stroke()}return c.setTransform(1,0,0,1,0,0),l(c,{cutoff:null!=e.cutoff?e.cutoff:.5,radius:null!=e.radius?e.radius:.5*h})}},49760:function(t,e,r){var n;!function(i){var a=/^\\s+/,o=/\\s+$/,s=0,l=i.round,u=i.min,c=i.max,f=i.random;function h(t,e){if(e=e||{},(t=t||\"\")instanceof h)return t;if(!(this instanceof h))return new h(t,e);var r=function(t){var e,r,n,s={r:0,g:0,b:0},l=1,f=null,h=null,p=null,d=!1,v=!1;return\"string\"==typeof t&&(t=function(t){t=t.replace(a,\"\").replace(o,\"\").toLowerCase();var e,r=!1;if(C[t])t=C[t],r=!0;else if(\"transparent\"==t)return{r:0,g:0,b:0,a:0,format:\"name\"};return(e=q.rgb.exec(t))?{r:e[1],g:e[2],b:e[3]}:(e=q.rgba.exec(t))?{r:e[1],g:e[2],b:e[3],a:e[4]}:(e=q.hsl.exec(t))?{h:e[1],s:e[2],l:e[3]}:(e=q.hsla.exec(t))?{h:e[1],s:e[2],l:e[3],a:e[4]}:(e=q.hsv.exec(t))?{h:e[1],s:e[2],v:e[3]}:(e=q.hsva.exec(t))?{h:e[1],s:e[2],v:e[3],a:e[4]}:(e=q.hex8.exec(t))?{r:D(e[1]),g:D(e[2]),b:D(e[3]),a:N(e[4]),format:r?\"name\":\"hex8\"}:(e=q.hex6.exec(t))?{r:D(e[1]),g:D(e[2]),b:D(e[3]),format:r?\"name\":\"hex\"}:(e=q.hex4.exec(t))?{r:D(e[1]+\"\"+e[1]),g:D(e[2]+\"\"+e[2]),b:D(e[3]+\"\"+e[3]),a:N(e[4]+\"\"+e[4]),format:r?\"name\":\"hex8\"}:!!(e=q.hex3.exec(t))&&{r:D(e[1]+\"\"+e[1]),g:D(e[2]+\"\"+e[2]),b:D(e[3]+\"\"+e[3]),format:r?\"name\":\"hex\"}}(t)),\"object\"==typeof t&&(H(t.r)&&H(t.g)&&H(t.b)?(e=t.r,r=t.g,n=t.b,s={r:255*I(e,255),g:255*I(r,255),b:255*I(n,255)},d=!0,v=\"%\"===String(t.r).substr(-1)?\"prgb\":\"rgb\"):H(t.h)&&H(t.s)&&H(t.v)?(f=F(t.s),h=F(t.v),s=function(t,e,r){t=6*I(t,360),e=I(e,100),r=I(r,100);var n=i.floor(t),a=t-n,o=r*(1-e),s=r*(1-a*e),l=r*(1-(1-a)*e),u=n%6;return{r:255*[r,s,o,o,l,r][u],g:255*[l,r,r,s,o,o][u],b:255*[o,o,l,r,r,s][u]}}(t.h,f,h),d=!0,v=\"hsv\"):H(t.h)&&H(t.s)&&H(t.l)&&(f=F(t.s),p=F(t.l),s=function(t,e,r){var n,i,a;function o(t,e,r){return r<0&&(r+=1),r>1&&(r-=1),r<1/6?t+6*(e-t)*r:r<.5?e:r<2/3?t+(e-t)*(2/3-r)*6:t}if(t=I(t,360),e=I(e,100),r=I(r,100),0===e)n=i=a=r;else{var s=r<.5?r*(1+e):r+e-r*e,l=2*r-s;n=o(l,s,t+1/3),i=o(l,s,t),a=o(l,s,t-1/3)}return{r:255*n,g:255*i,b:255*a}}(t.h,f,p),d=!0,v=\"hsl\"),t.hasOwnProperty(\"a\")&&(l=t.a)),l=O(l),{ok:d,format:t.format||v,r:u(255,c(s.r,0)),g:u(255,c(s.g,0)),b:u(255,c(s.b,0)),a:l}}(t);this._originalInput=t,this._r=r.r,this._g=r.g,this._b=r.b,this._a=r.a,this._roundA=l(100*this._a)/100,this._format=e.format||r.format,this._gradientType=e.gradientType,this._r<1&&(this._r=l(this._r)),this._g<1&&(this._g=l(this._g)),this._b<1&&(this._b=l(this._b)),this._ok=r.ok,this._tc_id=s++}function p(t,e,r){t=I(t,255),e=I(e,255),r=I(r,255);var n,i,a=c(t,e,r),o=u(t,e,r),s=(a+o)/2;if(a==o)n=i=0;else{var l=a-o;switch(i=s>.5?l/(2-a-o):l/(a+o),a){case t:n=(e-r)/l+(e>1)+720)%360;--e;)n.h=(n.h+i)%360,a.push(h(n));return a}function L(t,e){e=e||6;for(var r=h(t).toHsv(),n=r.h,i=r.s,a=r.v,o=[],s=1/e;e--;)o.push(h({h:n,s:i,v:a})),a=(a+s)%1;return o}h.prototype={isDark:function(){return this.getBrightness()<128},isLight:function(){return!this.isDark()},isValid:function(){return this._ok},getOriginalInput:function(){return this._originalInput},getFormat:function(){return this._format},getAlpha:function(){return this._a},getBrightness:function(){var t=this.toRgb();return(299*t.r+587*t.g+114*t.b)/1e3},getLuminance:function(){var t,e,r,n=this.toRgb();return t=n.r/255,e=n.g/255,r=n.b/255,.2126*(t<=.03928?t/12.92:i.pow((t+.055)/1.055,2.4))+.7152*(e<=.03928?e/12.92:i.pow((e+.055)/1.055,2.4))+.0722*(r<=.03928?r/12.92:i.pow((r+.055)/1.055,2.4))},setAlpha:function(t){return this._a=O(t),this._roundA=l(100*this._a)/100,this},toHsv:function(){var t=d(this._r,this._g,this._b);return{h:360*t.h,s:t.s,v:t.v,a:this._a}},toHsvString:function(){var t=d(this._r,this._g,this._b),e=l(360*t.h),r=l(100*t.s),n=l(100*t.v);return 1==this._a?\"hsv(\"+e+\", \"+r+\"%, \"+n+\"%)\":\"hsva(\"+e+\", \"+r+\"%, \"+n+\"%, \"+this._roundA+\")\"},toHsl:function(){var t=p(this._r,this._g,this._b);return{h:360*t.h,s:t.s,l:t.l,a:this._a}},toHslString:function(){var t=p(this._r,this._g,this._b),e=l(360*t.h),r=l(100*t.s),n=l(100*t.l);return 1==this._a?\"hsl(\"+e+\", \"+r+\"%, \"+n+\"%)\":\"hsla(\"+e+\", \"+r+\"%, \"+n+\"%, \"+this._roundA+\")\"},toHex:function(t){return v(this._r,this._g,this._b,t)},toHexString:function(t){return\"#\"+this.toHex(t)},toHex8:function(t){return function(t,e,r,n,i){var a=[R(l(t).toString(16)),R(l(e).toString(16)),R(l(r).toString(16)),R(B(n))];return i&&a[0].charAt(0)==a[0].charAt(1)&&a[1].charAt(0)==a[1].charAt(1)&&a[2].charAt(0)==a[2].charAt(1)&&a[3].charAt(0)==a[3].charAt(1)?a[0].charAt(0)+a[1].charAt(0)+a[2].charAt(0)+a[3].charAt(0):a.join(\"\")}(this._r,this._g,this._b,this._a,t)},toHex8String:function(t){return\"#\"+this.toHex8(t)},toRgb:function(){return{r:l(this._r),g:l(this._g),b:l(this._b),a:this._a}},toRgbString:function(){return 1==this._a?\"rgb(\"+l(this._r)+\", \"+l(this._g)+\", \"+l(this._b)+\")\":\"rgba(\"+l(this._r)+\", \"+l(this._g)+\", \"+l(this._b)+\", \"+this._roundA+\")\"},toPercentageRgb:function(){return{r:l(100*I(this._r,255))+\"%\",g:l(100*I(this._g,255))+\"%\",b:l(100*I(this._b,255))+\"%\",a:this._a}},toPercentageRgbString:function(){return 1==this._a?\"rgb(\"+l(100*I(this._r,255))+\"%, \"+l(100*I(this._g,255))+\"%, \"+l(100*I(this._b,255))+\"%)\":\"rgba(\"+l(100*I(this._r,255))+\"%, \"+l(100*I(this._g,255))+\"%, \"+l(100*I(this._b,255))+\"%, \"+this._roundA+\")\"},toName:function(){return 0===this._a?\"transparent\":!(this._a<1)&&(P[v(this._r,this._g,this._b,!0)]||!1)},toFilter:function(t){var e=\"#\"+g(this._r,this._g,this._b,this._a),r=e,n=this._gradientType?\"GradientType = 1, \":\"\";if(t){var i=h(t);r=\"#\"+g(i._r,i._g,i._b,i._a)}return\"progid:DXImageTransform.Microsoft.gradient(\"+n+\"startColorstr=\"+e+\",endColorstr=\"+r+\")\"},toString:function(t){var e=!!t;t=t||this._format;var r=!1,n=this._a<1&&this._a>=0;return e||!n||\"hex\"!==t&&\"hex6\"!==t&&\"hex3\"!==t&&\"hex4\"!==t&&\"hex8\"!==t&&\"name\"!==t?(\"rgb\"===t&&(r=this.toRgbString()),\"prgb\"===t&&(r=this.toPercentageRgbString()),\"hex\"!==t&&\"hex6\"!==t||(r=this.toHexString()),\"hex3\"===t&&(r=this.toHexString(!0)),\"hex4\"===t&&(r=this.toHex8String(!0)),\"hex8\"===t&&(r=this.toHex8String()),\"name\"===t&&(r=this.toName()),\"hsl\"===t&&(r=this.toHslString()),\"hsv\"===t&&(r=this.toHsvString()),r||this.toHexString()):\"name\"===t&&0===this._a?this.toName():this.toRgbString()},clone:function(){return h(this.toString())},_applyModification:function(t,e){var r=t.apply(null,[this].concat([].slice.call(e)));return this._r=r._r,this._g=r._g,this._b=r._b,this.setAlpha(r._a),this},lighten:function(){return this._applyModification(b,arguments)},brighten:function(){return this._applyModification(_,arguments)},darken:function(){return this._applyModification(w,arguments)},desaturate:function(){return this._applyModification(y,arguments)},saturate:function(){return this._applyModification(m,arguments)},greyscale:function(){return this._applyModification(x,arguments)},spin:function(){return this._applyModification(T,arguments)},_applyCombination:function(t,e){return t.apply(null,[this].concat([].slice.call(e)))},analogous:function(){return this._applyCombination(E,arguments)},complement:function(){return this._applyCombination(k,arguments)},monochromatic:function(){return this._applyCombination(L,arguments)},splitcomplement:function(){return this._applyCombination(S,arguments)},triad:function(){return this._applyCombination(A,arguments)},tetrad:function(){return this._applyCombination(M,arguments)}},h.fromRatio=function(t,e){if(\"object\"==typeof t){var r={};for(var n in t)t.hasOwnProperty(n)&&(r[n]=\"a\"===n?t[n]:F(t[n]));t=r}return h(t,e)},h.equals=function(t,e){return!(!t||!e)&&h(t).toRgbString()==h(e).toRgbString()},h.random=function(){return h.fromRatio({r:f(),g:f(),b:f()})},h.mix=function(t,e,r){r=0===r?0:r||50;var n=h(t).toRgb(),i=h(e).toRgb(),a=r/100;return h({r:(i.r-n.r)*a+n.r,g:(i.g-n.g)*a+n.g,b:(i.b-n.b)*a+n.b,a:(i.a-n.a)*a+n.a})},h.readability=function(t,e){var r=h(t),n=h(e);return(i.max(r.getLuminance(),n.getLuminance())+.05)/(i.min(r.getLuminance(),n.getLuminance())+.05)},h.isReadable=function(t,e,r){var n,i,a,o,s,l=h.readability(t,e);switch(i=!1,(a=r,\"AA\"!==(o=((a=a||{level:\"AA\",size:\"small\"}).level||\"AA\").toUpperCase())&&\"AAA\"!==o&&(o=\"AA\"),\"small\"!==(s=(a.size||\"small\").toLowerCase())&&\"large\"!==s&&(s=\"small\"),n={level:o,size:s}).level+n.size){case\"AAsmall\":case\"AAAlarge\":i=l>=4.5;break;case\"AAlarge\":i=l>=3;break;case\"AAAsmall\":i=l>=7}return i},h.mostReadable=function(t,e,r){var n,i,a,o,s=null,l=0;i=(r=r||{}).includeFallbackColors,a=r.level,o=r.size;for(var u=0;ul&&(l=n,s=h(e[u]));return h.isReadable(t,s,{level:a,size:o})||!i?s:(r.includeFallbackColors=!1,h.mostReadable(t,[\"#fff\",\"#000\"],r))};var C=h.names={aliceblue:\"f0f8ff\",antiquewhite:\"faebd7\",aqua:\"0ff\",aquamarine:\"7fffd4\",azure:\"f0ffff\",beige:\"f5f5dc\",bisque:\"ffe4c4\",black:\"000\",blanchedalmond:\"ffebcd\",blue:\"00f\",blueviolet:\"8a2be2\",brown:\"a52a2a\",burlywood:\"deb887\",burntsienna:\"ea7e5d\",cadetblue:\"5f9ea0\",chartreuse:\"7fff00\",chocolate:\"d2691e\",coral:\"ff7f50\",cornflowerblue:\"6495ed\",cornsilk:\"fff8dc\",crimson:\"dc143c\",cyan:\"0ff\",darkblue:\"00008b\",darkcyan:\"008b8b\",darkgoldenrod:\"b8860b\",darkgray:\"a9a9a9\",darkgreen:\"006400\",darkgrey:\"a9a9a9\",darkkhaki:\"bdb76b\",darkmagenta:\"8b008b\",darkolivegreen:\"556b2f\",darkorange:\"ff8c00\",darkorchid:\"9932cc\",darkred:\"8b0000\",darksalmon:\"e9967a\",darkseagreen:\"8fbc8f\",darkslateblue:\"483d8b\",darkslategray:\"2f4f4f\",darkslategrey:\"2f4f4f\",darkturquoise:\"00ced1\",darkviolet:\"9400d3\",deeppink:\"ff1493\",deepskyblue:\"00bfff\",dimgray:\"696969\",dimgrey:\"696969\",dodgerblue:\"1e90ff\",firebrick:\"b22222\",floralwhite:\"fffaf0\",forestgreen:\"228b22\",fuchsia:\"f0f\",gainsboro:\"dcdcdc\",ghostwhite:\"f8f8ff\",gold:\"ffd700\",goldenrod:\"daa520\",gray:\"808080\",green:\"008000\",greenyellow:\"adff2f\",grey:\"808080\",honeydew:\"f0fff0\",hotpink:\"ff69b4\",indianred:\"cd5c5c\",indigo:\"4b0082\",ivory:\"fffff0\",khaki:\"f0e68c\",lavender:\"e6e6fa\",lavenderblush:\"fff0f5\",lawngreen:\"7cfc00\",lemonchiffon:\"fffacd\",lightblue:\"add8e6\",lightcoral:\"f08080\",lightcyan:\"e0ffff\",lightgoldenrodyellow:\"fafad2\",lightgray:\"d3d3d3\",lightgreen:\"90ee90\",lightgrey:\"d3d3d3\",lightpink:\"ffb6c1\",lightsalmon:\"ffa07a\",lightseagreen:\"20b2aa\",lightskyblue:\"87cefa\",lightslategray:\"789\",lightslategrey:\"789\",lightsteelblue:\"b0c4de\",lightyellow:\"ffffe0\",lime:\"0f0\",limegreen:\"32cd32\",linen:\"faf0e6\",magenta:\"f0f\",maroon:\"800000\",mediumaquamarine:\"66cdaa\",mediumblue:\"0000cd\",mediumorchid:\"ba55d3\",mediumpurple:\"9370db\",mediumseagreen:\"3cb371\",mediumslateblue:\"7b68ee\",mediumspringgreen:\"00fa9a\",mediumturquoise:\"48d1cc\",mediumvioletred:\"c71585\",midnightblue:\"191970\",mintcream:\"f5fffa\",mistyrose:\"ffe4e1\",moccasin:\"ffe4b5\",navajowhite:\"ffdead\",navy:\"000080\",oldlace:\"fdf5e6\",olive:\"808000\",olivedrab:\"6b8e23\",orange:\"ffa500\",orangered:\"ff4500\",orchid:\"da70d6\",palegoldenrod:\"eee8aa\",palegreen:\"98fb98\",paleturquoise:\"afeeee\",palevioletred:\"db7093\",papayawhip:\"ffefd5\",peachpuff:\"ffdab9\",peru:\"cd853f\",pink:\"ffc0cb\",plum:\"dda0dd\",powderblue:\"b0e0e6\",purple:\"800080\",rebeccapurple:\"663399\",red:\"f00\",rosybrown:\"bc8f8f\",royalblue:\"4169e1\",saddlebrown:\"8b4513\",salmon:\"fa8072\",sandybrown:\"f4a460\",seagreen:\"2e8b57\",seashell:\"fff5ee\",sienna:\"a0522d\",silver:\"c0c0c0\",skyblue:\"87ceeb\",slateblue:\"6a5acd\",slategray:\"708090\",slategrey:\"708090\",snow:\"fffafa\",springgreen:\"00ff7f\",steelblue:\"4682b4\",tan:\"d2b48c\",teal:\"008080\",thistle:\"d8bfd8\",tomato:\"ff6347\",turquoise:\"40e0d0\",violet:\"ee82ee\",wheat:\"f5deb3\",white:\"fff\",whitesmoke:\"f5f5f5\",yellow:\"ff0\",yellowgreen:\"9acd32\"},P=h.hexNames=function(t){var e={};for(var r in t)t.hasOwnProperty(r)&&(e[t[r]]=r);return e}(C);function O(t){return t=parseFloat(t),(isNaN(t)||t<0||t>1)&&(t=1),t}function I(t,e){(function(t){return\"string\"==typeof t&&-1!=t.indexOf(\".\")&&1===parseFloat(t)})(t)&&(t=\"100%\");var r=function(t){return\"string\"==typeof t&&-1!=t.indexOf(\"%\")}(t);return t=u(e,c(0,parseFloat(t))),r&&(t=parseInt(t*e,10)/100),i.abs(t-e)<1e-6?1:t%e/parseFloat(e)}function z(t){return u(1,c(0,t))}function D(t){return parseInt(t,16)}function R(t){return 1==t.length?\"0\"+t:\"\"+t}function F(t){return t<=1&&(t=100*t+\"%\"),t}function B(t){return i.round(255*parseFloat(t)).toString(16)}function N(t){return D(t)/255}var j,U,V,q=(U=\"[\\\\s|\\\\(]+(\"+(j=\"(?:[-\\\\+]?\\\\d*\\\\.\\\\d+%?)|(?:[-\\\\+]?\\\\d+%?)\")+\")[,|\\\\s]+(\"+j+\")[,|\\\\s]+(\"+j+\")\\\\s*\\\\)?\",V=\"[\\\\s|\\\\(]+(\"+j+\")[,|\\\\s]+(\"+j+\")[,|\\\\s]+(\"+j+\")[,|\\\\s]+(\"+j+\")\\\\s*\\\\)?\",{CSS_UNIT:new RegExp(j),rgb:new RegExp(\"rgb\"+U),rgba:new RegExp(\"rgba\"+V),hsl:new RegExp(\"hsl\"+U),hsla:new RegExp(\"hsla\"+V),hsv:new RegExp(\"hsv\"+U),hsva:new RegExp(\"hsva\"+V),hex3:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex6:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,hex4:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex8:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/});function H(t){return!!q.CSS_UNIT.exec(t)}t.exports?t.exports=h:void 0===(n=function(){return h}.call(e,r,e,t))||(t.exports=n)}(Math)},37816:function(t){\"use strict\";t.exports=r,t.exports.float32=t.exports.float=r,t.exports.fract32=t.exports.fract=function(t,e){if(t.length){if(t instanceof Float32Array)return new Float32Array(t.length);e instanceof Float32Array||(e=r(t));for(var n=0,i=e.length;n\":(e.length>100&&(e=e.slice(0,99)+\"…\"),e=e.replace(i,(function(t){switch(t){case\"\\n\":return\"\\\\n\";case\"\\r\":return\"\\\\r\";case\"\\u2028\":return\"\\\\u2028\";case\"\\u2029\":return\"\\\\u2029\";default:throw new Error(\"Unexpected character\")}})))}},7328:function(t,e,r){\"use strict\";var n=r(81680),i={object:!0,function:!0,undefined:!0};t.exports=function(t){return!!n(t)&&hasOwnProperty.call(i,typeof t)}},87396:function(t,e,r){\"use strict\";var n=r(57980),i=r(85488);t.exports=function(t){return i(t)?t:n(t,\"%v is not a plain function\",arguments[1])}},85488:function(t,e,r){\"use strict\";var n=r(73384),i=/^\\s*class[\\s{/}]/,a=Function.prototype.toString;t.exports=function(t){return!!n(t)&&!i.test(a.call(t))}},54612:function(t,e,r){\"use strict\";var n=r(7328);t.exports=function(t){if(!n(t))return!1;try{return!!t.constructor&&t.constructor.prototype===t}catch(t){return!1}}},33940:function(t,e,r){\"use strict\";var n=r(81680),i=r(7328),a=Object.prototype.toString;t.exports=function(t){if(!n(t))return null;if(i(t)){var e=t.toString;if(\"function\"!=typeof e)return null;if(e===a)return null}try{return\"\"+t}catch(t){return null}}},18496:function(t,e,r){\"use strict\";var n=r(57980),i=r(81680);t.exports=function(t){return i(t)?t:n(t,\"Cannot use %v\",arguments[1])}},81680:function(t){\"use strict\";t.exports=function(t){return null!=t}},14144:function(t,e,r){\"use strict\";var n=r(308),i=r(10352),a=r(33576).Buffer;r.g.__TYPEDARRAY_POOL||(r.g.__TYPEDARRAY_POOL={UINT8:i([32,0]),UINT16:i([32,0]),UINT32:i([32,0]),BIGUINT64:i([32,0]),INT8:i([32,0]),INT16:i([32,0]),INT32:i([32,0]),BIGINT64:i([32,0]),FLOAT:i([32,0]),DOUBLE:i([32,0]),DATA:i([32,0]),UINT8C:i([32,0]),BUFFER:i([32,0])});var o=\"undefined\"!=typeof Uint8ClampedArray,s=\"undefined\"!=typeof BigUint64Array,l=\"undefined\"!=typeof BigInt64Array,u=r.g.__TYPEDARRAY_POOL;u.UINT8C||(u.UINT8C=i([32,0])),u.BIGUINT64||(u.BIGUINT64=i([32,0])),u.BIGINT64||(u.BIGINT64=i([32,0])),u.BUFFER||(u.BUFFER=i([32,0]));var c=u.DATA,f=u.BUFFER;function h(t){if(t){var e=t.length||t.byteLength,r=n.log2(e);c[r].push(t)}}function p(t){t=n.nextPow2(t);var e=n.log2(t),r=c[e];return r.length>0?r.pop():new ArrayBuffer(t)}function d(t){return new Uint8Array(p(t),0,t)}function v(t){return new Uint16Array(p(2*t),0,t)}function g(t){return new Uint32Array(p(4*t),0,t)}function y(t){return new Int8Array(p(t),0,t)}function m(t){return new Int16Array(p(2*t),0,t)}function x(t){return new Int32Array(p(4*t),0,t)}function b(t){return new Float32Array(p(4*t),0,t)}function _(t){return new Float64Array(p(8*t),0,t)}function w(t){return o?new Uint8ClampedArray(p(t),0,t):d(t)}function T(t){return s?new BigUint64Array(p(8*t),0,t):null}function k(t){return l?new BigInt64Array(p(8*t),0,t):null}function A(t){return new DataView(p(t),0,t)}function M(t){t=n.nextPow2(t);var e=n.log2(t),r=f[e];return r.length>0?r.pop():new a(t)}e.free=function(t){if(a.isBuffer(t))f[n.log2(t.length)].push(t);else{if(\"[object ArrayBuffer]\"!==Object.prototype.toString.call(t)&&(t=t.buffer),!t)return;var e=t.length||t.byteLength,r=0|n.log2(e);c[r].push(t)}},e.freeUint8=e.freeUint16=e.freeUint32=e.freeBigUint64=e.freeInt8=e.freeInt16=e.freeInt32=e.freeBigInt64=e.freeFloat32=e.freeFloat=e.freeFloat64=e.freeDouble=e.freeUint8Clamped=e.freeDataView=function(t){h(t.buffer)},e.freeArrayBuffer=h,e.freeBuffer=function(t){f[n.log2(t.length)].push(t)},e.malloc=function(t,e){if(void 0===e||\"arraybuffer\"===e)return p(t);switch(e){case\"uint8\":return d(t);case\"uint16\":return v(t);case\"uint32\":return g(t);case\"int8\":return y(t);case\"int16\":return m(t);case\"int32\":return x(t);case\"float\":case\"float32\":return b(t);case\"double\":case\"float64\":return _(t);case\"uint8_clamped\":return w(t);case\"bigint64\":return k(t);case\"biguint64\":return T(t);case\"buffer\":return M(t);case\"data\":case\"dataview\":return A(t);default:return null}return null},e.mallocArrayBuffer=p,e.mallocUint8=d,e.mallocUint16=v,e.mallocUint32=g,e.mallocInt8=y,e.mallocInt16=m,e.mallocInt32=x,e.mallocFloat32=e.mallocFloat=b,e.mallocFloat64=e.mallocDouble=_,e.mallocUint8Clamped=w,e.mallocBigUint64=T,e.mallocBigInt64=k,e.mallocDataView=A,e.mallocBuffer=M,e.clearCache=function(){for(var t=0;t<32;++t)u.UINT8[t].length=0,u.UINT16[t].length=0,u.UINT32[t].length=0,u.INT8[t].length=0,u.INT16[t].length=0,u.INT32[t].length=0,u.FLOAT[t].length=0,u.DOUBLE[t].length=0,u.BIGUINT64[t].length=0,u.BIGINT64[t].length=0,u.UINT8C[t].length=0,c[t].length=0,f[t].length=0}},92384:function(t){var e=/[\\'\\\"]/;t.exports=function(t){return t?(e.test(t.charAt(0))&&(t=t.substr(1)),e.test(t.charAt(t.length-1))&&(t=t.substr(0,t.length-1)),t):\"\"}},45223:function(t){\"use strict\";t.exports=function(t,e,r){Array.isArray(r)||(r=[].slice.call(arguments,2));for(var n=0,i=r.length;n=i)return t;switch(t){case\"%s\":return String(n[r++]);case\"%d\":return Number(n[r++]);case\"%j\":try{return JSON.stringify(n[r++])}catch(t){return\"[Circular]\"}default:return t}})),s=n[r];r=3&&(n.depth=arguments[2]),arguments.length>=4&&(n.colors=arguments[3]),g(r)?n.showHidden=r:r&&e._extend(n,r),b(n.showHidden)&&(n.showHidden=!1),b(n.depth)&&(n.depth=2),b(n.colors)&&(n.colors=!1),b(n.customInspect)&&(n.customInspect=!0),n.colors&&(n.stylize=c),h(n,t,n.depth)}function c(t,e){var r=u.styles[e];return r?\"\u001b[\"+u.colors[r][0]+\"m\"+t+\"\u001b[\"+u.colors[r][1]+\"m\":t}function f(t,e){return t}function h(t,r,n){if(t.customInspect&&r&&A(r.inspect)&&r.inspect!==e.inspect&&(!r.constructor||r.constructor.prototype!==r)){var i=r.inspect(n,t);return x(i)||(i=h(t,i,n)),i}var a=function(t,e){if(b(e))return t.stylize(\"undefined\",\"undefined\");if(x(e)){var r=\"'\"+JSON.stringify(e).replace(/^\"|\"$/g,\"\").replace(/'/g,\"\\\\'\").replace(/\\\\\"/g,'\"')+\"'\";return t.stylize(r,\"string\")}return m(e)?t.stylize(\"\"+e,\"number\"):g(e)?t.stylize(\"\"+e,\"boolean\"):y(e)?t.stylize(\"null\",\"null\"):void 0}(t,r);if(a)return a;var o=Object.keys(r),s=function(t){var e={};return t.forEach((function(t,r){e[t]=!0})),e}(o);if(t.showHidden&&(o=Object.getOwnPropertyNames(r)),k(r)&&(o.indexOf(\"message\")>=0||o.indexOf(\"description\")>=0))return p(r);if(0===o.length){if(A(r)){var l=r.name?\": \"+r.name:\"\";return t.stylize(\"[Function\"+l+\"]\",\"special\")}if(_(r))return t.stylize(RegExp.prototype.toString.call(r),\"regexp\");if(T(r))return t.stylize(Date.prototype.toString.call(r),\"date\");if(k(r))return p(r)}var u,c=\"\",f=!1,w=[\"{\",\"}\"];return v(r)&&(f=!0,w=[\"[\",\"]\"]),A(r)&&(c=\" [Function\"+(r.name?\": \"+r.name:\"\")+\"]\"),_(r)&&(c=\" \"+RegExp.prototype.toString.call(r)),T(r)&&(c=\" \"+Date.prototype.toUTCString.call(r)),k(r)&&(c=\" \"+p(r)),0!==o.length||f&&0!=r.length?n<0?_(r)?t.stylize(RegExp.prototype.toString.call(r),\"regexp\"):t.stylize(\"[Object]\",\"special\"):(t.seen.push(r),u=f?function(t,e,r,n,i){for(var a=[],o=0,s=e.length;o60?r[0]+(\"\"===e?\"\":e+\"\\n \")+\" \"+t.join(\",\\n \")+\" \"+r[1]:r[0]+e+\" \"+t.join(\", \")+\" \"+r[1]}(u,c,w)):w[0]+c+w[1]}function p(t){return\"[\"+Error.prototype.toString.call(t)+\"]\"}function d(t,e,r,n,i,a){var o,s,l;if((l=Object.getOwnPropertyDescriptor(e,i)||{value:e[i]}).get?s=l.set?t.stylize(\"[Getter/Setter]\",\"special\"):t.stylize(\"[Getter]\",\"special\"):l.set&&(s=t.stylize(\"[Setter]\",\"special\")),L(n,i)||(o=\"[\"+i+\"]\"),s||(t.seen.indexOf(l.value)<0?(s=y(r)?h(t,l.value,null):h(t,l.value,r-1)).indexOf(\"\\n\")>-1&&(s=a?s.split(\"\\n\").map((function(t){return\" \"+t})).join(\"\\n\").slice(2):\"\\n\"+s.split(\"\\n\").map((function(t){return\" \"+t})).join(\"\\n\")):s=t.stylize(\"[Circular]\",\"special\")),b(o)){if(a&&i.match(/^\\d+$/))return s;(o=JSON.stringify(\"\"+i)).match(/^\"([a-zA-Z_][a-zA-Z_0-9]*)\"$/)?(o=o.slice(1,-1),o=t.stylize(o,\"name\")):(o=o.replace(/'/g,\"\\\\'\").replace(/\\\\\"/g,'\"').replace(/(^\"|\"$)/g,\"'\"),o=t.stylize(o,\"string\"))}return o+\": \"+s}function v(t){return Array.isArray(t)}function g(t){return\"boolean\"==typeof t}function y(t){return null===t}function m(t){return\"number\"==typeof t}function x(t){return\"string\"==typeof t}function b(t){return void 0===t}function _(t){return w(t)&&\"[object RegExp]\"===M(t)}function w(t){return\"object\"==typeof t&&null!==t}function T(t){return w(t)&&\"[object Date]\"===M(t)}function k(t){return w(t)&&(\"[object Error]\"===M(t)||t instanceof Error)}function A(t){return\"function\"==typeof t}function M(t){return Object.prototype.toString.call(t)}function S(t){return t<10?\"0\"+t.toString(10):t.toString(10)}e.debuglog=function(t){if(t=t.toUpperCase(),!o[t])if(s.test(t)){var r=n.pid;o[t]=function(){var n=e.format.apply(e,arguments);console.error(\"%s %d: %s\",t,r,n)}}else o[t]=function(){};return o[t]},e.inspect=u,u.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},u.styles={special:\"cyan\",number:\"yellow\",boolean:\"yellow\",undefined:\"grey\",null:\"bold\",string:\"green\",date:\"magenta\",regexp:\"red\"},e.types=r(41088),e.isArray=v,e.isBoolean=g,e.isNull=y,e.isNullOrUndefined=function(t){return null==t},e.isNumber=m,e.isString=x,e.isSymbol=function(t){return\"symbol\"==typeof t},e.isUndefined=b,e.isRegExp=_,e.types.isRegExp=_,e.isObject=w,e.isDate=T,e.types.isDate=T,e.isError=k,e.types.isNativeError=k,e.isFunction=A,e.isPrimitive=function(t){return null===t||\"boolean\"==typeof t||\"number\"==typeof t||\"string\"==typeof t||\"symbol\"==typeof t||void 0===t},e.isBuffer=r(75272);var E=[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"];function L(t,e){return Object.prototype.hasOwnProperty.call(t,e)}e.log=function(){var t,r;console.log(\"%s - %s\",(r=[S((t=new Date).getHours()),S(t.getMinutes()),S(t.getSeconds())].join(\":\"),[t.getDate(),E[t.getMonth()],r].join(\" \")),e.format.apply(e,arguments))},e.inherits=r(6768),e._extend=function(t,e){if(!e||!w(e))return t;for(var r=Object.keys(e),n=r.length;n--;)t[r[n]]=e[r[n]];return t};var C=\"undefined\"!=typeof Symbol?Symbol(\"util.promisify.custom\"):void 0;function P(t,e){if(!t){var r=new Error(\"Promise was rejected with a falsy value\");r.reason=t,t=r}return e(t)}e.promisify=function(t){if(\"function\"!=typeof t)throw new TypeError('The \"original\" argument must be of type Function');if(C&&t[C]){var e;if(\"function\"!=typeof(e=t[C]))throw new TypeError('The \"util.promisify.custom\" argument must be of type Function');return Object.defineProperty(e,C,{value:e,enumerable:!1,writable:!1,configurable:!0}),e}function e(){for(var e,r,n=new Promise((function(t,n){e=t,r=n})),i=[],a=0;a-1?e:\"Object\"===e&&function(t){var e=!1;return n(v,(function(r,n){if(!e)try{r(t),e=h(n,1)}catch(t){}})),e}(t)}return s?function(t){var e=!1;return n(v,(function(r,n){if(!e)try{\"$\"+r(t)===n&&(e=h(n,1))}catch(t){}})),e}(t):null}},67020:function(t,e,r){var n=r(38700),i=r(50896),a=n.instance();function o(t){this.local=this.regionalOptions[t||\"\"]||this.regionalOptions[\"\"]}o.prototype=new n.baseCalendar,i(o.prototype,{name:\"Chinese\",jdEpoch:1721425.5,hasYearZero:!1,minMonth:0,firstMonth:0,minDay:1,regionalOptions:{\"\":{name:\"Chinese\",epochs:[\"BEC\",\"EC\"],monthNumbers:function(t,e){if(\"string\"==typeof t){var r=t.match(l);return r?r[0]:\"\"}var n=this._validateYear(t),i=t.month(),a=\"\"+this.toChineseMonth(n,i);return e&&a.length<2&&(a=\"0\"+a),this.isIntercalaryMonth(n,i)&&(a+=\"i\"),a},monthNames:function(t){if(\"string\"==typeof t){var e=t.match(u);return e?e[0]:\"\"}var r=this._validateYear(t),n=t.month(),i=[\"一月\",\"二月\",\"三月\",\"四月\",\"五月\",\"六月\",\"七月\",\"八月\",\"九月\",\"十月\",\"十一月\",\"十二月\"][this.toChineseMonth(r,n)-1];return this.isIntercalaryMonth(r,n)&&(i=\"闰\"+i),i},monthNamesShort:function(t){if(\"string\"==typeof t){var e=t.match(c);return e?e[0]:\"\"}var r=this._validateYear(t),n=t.month(),i=[\"一\",\"二\",\"三\",\"四\",\"五\",\"六\",\"七\",\"八\",\"九\",\"十\",\"十一\",\"十二\"][this.toChineseMonth(r,n)-1];return this.isIntercalaryMonth(r,n)&&(i=\"闰\"+i),i},parseMonth:function(t,e){t=this._validateYear(t);var r,n=parseInt(e);if(isNaN(n))\"闰\"===e[0]&&(r=!0,e=e.substring(1)),\"月\"===e[e.length-1]&&(e=e.substring(0,e.length-1)),n=1+[\"一\",\"二\",\"三\",\"四\",\"五\",\"六\",\"七\",\"八\",\"九\",\"十\",\"十一\",\"十二\"].indexOf(e);else{var i=e[e.length-1];r=\"i\"===i||\"I\"===i}return this.toMonthIndex(t,n,r)},dayNames:[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],dayNamesShort:[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],dayNamesMin:[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"],digits:null,dateFormat:\"yyyy/mm/dd\",firstDay:1,isRTL:!1}},_validateYear:function(t,e){if(t.year&&(t=t.year()),\"number\"!=typeof t||t<1888||t>2111)throw e.replace(/\\{0\\}/,this.local.name);return t},toMonthIndex:function(t,e,r){var i=this.intercalaryMonth(t);if(r&&e!==i||e<1||e>12)throw n.local.invalidMonth.replace(/\\{0\\}/,this.local.name);return i?!r&&e<=i?e-1:e:e-1},toChineseMonth:function(t,e){t.year&&(e=(t=t.year()).month());var r=this.intercalaryMonth(t);if(e<0||e>(r?12:11))throw n.local.invalidMonth.replace(/\\{0\\}/,this.local.name);return r?e>13},isIntercalaryMonth:function(t,e){t.year&&(e=(t=t.year()).month());var r=this.intercalaryMonth(t);return!!r&&r===e},leapYear:function(t){return 0!==this.intercalaryMonth(t)},weekOfYear:function(t,e,r){var i,o=this._validateYear(t,n.local.invalidyear),s=h[o-h[0]],l=s>>9&4095,u=s>>5&15,c=31&s;(i=a.newDate(l,u,c)).add(4-(i.dayOfWeek()||7),\"d\");var f=this.toJD(t,e,r)-i.toJD();return 1+Math.floor(f/7)},monthsInYear:function(t){return this.leapYear(t)?13:12},daysInMonth:function(t,e){t.year&&(e=t.month(),t=t.year()),t=this._validateYear(t);var r=f[t-f[0]];if(e>(r>>13?12:11))throw n.local.invalidMonth.replace(/\\{0\\}/,this.local.name);return r&1<<12-e?30:29},weekDay:function(t,e,r){return(this.dayOfWeek(t,e,r)||7)<6},toJD:function(t,e,r){var i=this._validate(t,s,r,n.local.invalidDate);t=this._validateYear(i.year()),e=i.month(),r=i.day();var o=this.isIntercalaryMonth(t,e),s=this.toChineseMonth(t,e),l=function(t,e,r,n,i){var a,o,s;if(\"object\"==typeof t)o=t,a=e||{};else{var l;if(!(\"number\"==typeof t&&t>=1888&&t<=2111))throw new Error(\"Lunar year outside range 1888-2111\");if(!(\"number\"==typeof e&&e>=1&&e<=12))throw new Error(\"Lunar month outside range 1 - 12\");if(!(\"number\"==typeof r&&r>=1&&r<=30))throw new Error(\"Lunar day outside range 1 - 30\");\"object\"==typeof n?(l=!1,a=n):(l=!!n,a={}),o={year:t,month:e,day:r,isIntercalary:l}}s=o.day-1;var u,c=f[o.year-f[0]],p=c>>13;u=p&&(o.month>p||o.isIntercalary)?o.month:o.month-1;for(var d=0;d>9&4095,(v>>5&15)-1,(31&v)+s);return a.year=g.getFullYear(),a.month=1+g.getMonth(),a.day=g.getDate(),a}(t,s,r,o);return a.toJD(l.year,l.month,l.day)},fromJD:function(t){var e=a.fromJD(t),r=function(t,e,r,n){var i,a;if(\"object\"==typeof t)i=t,a=e||{};else{if(!(\"number\"==typeof t&&t>=1888&&t<=2111))throw new Error(\"Solar year outside range 1888-2111\");if(!(\"number\"==typeof e&&e>=1&&e<=12))throw new Error(\"Solar month outside range 1 - 12\");if(!(\"number\"==typeof r&&r>=1&&r<=31))throw new Error(\"Solar day outside range 1 - 31\");i={year:t,month:e,day:r},a={}}var o=h[i.year-h[0]],s=i.year<<9|i.month<<5|i.day;a.year=s>=o?i.year:i.year-1,o=h[a.year-h[0]];var l,u=new Date(o>>9&4095,(o>>5&15)-1,31&o),c=new Date(i.year,i.month-1,i.day);l=Math.round((c-u)/864e5);var p,d=f[a.year-f[0]];for(p=0;p<13;p++){var v=d&1<<12-p?30:29;if(l>13;return!g||p=2&&n<=6},extraInfo:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate);return{century:o[Math.floor((i.year()-1)/100)+1]||\"\"}},toJD:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate);return t=i.year()+(i.year()<0?1:0),e=i.month(),(r=i.day())+(e>1?16:0)+(e>2?32*(e-2):0)+400*(t-1)+this.jdEpoch-1},fromJD:function(t){t=Math.floor(t+.5)-Math.floor(this.jdEpoch)-1;var e=Math.floor(t/400)+1;t-=400*(e-1),t+=t>15?16:0;var r=Math.floor(t/32)+1,n=t-32*(r-1)+1;return this.newDate(e<=0?e-1:e,r,n)}});var o={20:\"Fruitbat\",21:\"Anchovy\"};n.calendars.discworld=a},65168:function(t,e,r){var n=r(38700),i=r(50896);function a(t){this.local=this.regionalOptions[t||\"\"]||this.regionalOptions[\"\"]}a.prototype=new n.baseCalendar,i(a.prototype,{name:\"Ethiopian\",jdEpoch:1724220.5,daysPerMonth:[30,30,30,30,30,30,30,30,30,30,30,30,5],hasYearZero:!1,minMonth:1,firstMonth:1,minDay:1,regionalOptions:{\"\":{name:\"Ethiopian\",epochs:[\"BEE\",\"EE\"],monthNames:[\"Meskerem\",\"Tikemet\",\"Hidar\",\"Tahesas\",\"Tir\",\"Yekatit\",\"Megabit\",\"Miazia\",\"Genbot\",\"Sene\",\"Hamle\",\"Nehase\",\"Pagume\"],monthNamesShort:[\"Mes\",\"Tik\",\"Hid\",\"Tah\",\"Tir\",\"Yek\",\"Meg\",\"Mia\",\"Gen\",\"Sen\",\"Ham\",\"Neh\",\"Pag\"],dayNames:[\"Ehud\",\"Segno\",\"Maksegno\",\"Irob\",\"Hamus\",\"Arb\",\"Kidame\"],dayNamesShort:[\"Ehu\",\"Seg\",\"Mak\",\"Iro\",\"Ham\",\"Arb\",\"Kid\"],dayNamesMin:[\"Eh\",\"Se\",\"Ma\",\"Ir\",\"Ha\",\"Ar\",\"Ki\"],digits:null,dateFormat:\"dd/mm/yyyy\",firstDay:0,isRTL:!1}},leapYear:function(t){var e=this._validate(t,this.minMonth,this.minDay,n.local.invalidYear);return(t=e.year()+(e.year()<0?1:0))%4==3||t%4==-1},monthsInYear:function(t){return this._validate(t,this.minMonth,this.minDay,n.local.invalidYear||n.regionalOptions[\"\"].invalidYear),13},weekOfYear:function(t,e,r){var n=this.newDate(t,e,r);return n.add(-n.dayOfWeek(),\"d\"),Math.floor((n.dayOfYear()-1)/7)+1},daysInMonth:function(t,e){var r=this._validate(t,e,this.minDay,n.local.invalidMonth);return this.daysPerMonth[r.month()-1]+(13===r.month()&&this.leapYear(r.year())?1:0)},weekDay:function(t,e,r){return(this.dayOfWeek(t,e,r)||7)<6},toJD:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate);return(t=i.year())<0&&t++,i.day()+30*(i.month()-1)+365*(t-1)+Math.floor(t/4)+this.jdEpoch-1},fromJD:function(t){var e=Math.floor(t)+.5-this.jdEpoch,r=Math.floor((e-Math.floor((e+366)/1461))/365)+1;r<=0&&r--,e=Math.floor(t)+.5-this.newDate(r,1,1).toJD();var n=Math.floor(e/30)+1,i=e-30*(n-1)+1;return this.newDate(r,n,i)}}),n.calendars.ethiopian=a},2084:function(t,e,r){var n=r(38700),i=r(50896);function a(t){this.local=this.regionalOptions[t||\"\"]||this.regionalOptions[\"\"]}function o(t,e){return t-e*Math.floor(t/e)}a.prototype=new n.baseCalendar,i(a.prototype,{name:\"Hebrew\",jdEpoch:347995.5,daysPerMonth:[30,29,30,29,30,29,30,29,30,29,30,29,29],hasYearZero:!1,minMonth:1,firstMonth:7,minDay:1,regionalOptions:{\"\":{name:\"Hebrew\",epochs:[\"BAM\",\"AM\"],monthNames:[\"Nisan\",\"Iyar\",\"Sivan\",\"Tammuz\",\"Av\",\"Elul\",\"Tishrei\",\"Cheshvan\",\"Kislev\",\"Tevet\",\"Shevat\",\"Adar\",\"Adar II\"],monthNamesShort:[\"Nis\",\"Iya\",\"Siv\",\"Tam\",\"Av\",\"Elu\",\"Tis\",\"Che\",\"Kis\",\"Tev\",\"She\",\"Ada\",\"Ad2\"],dayNames:[\"Yom Rishon\",\"Yom Sheni\",\"Yom Shlishi\",\"Yom Revi'i\",\"Yom Chamishi\",\"Yom Shishi\",\"Yom Shabbat\"],dayNamesShort:[\"Ris\",\"She\",\"Shl\",\"Rev\",\"Cha\",\"Shi\",\"Sha\"],dayNamesMin:[\"Ri\",\"She\",\"Shl\",\"Re\",\"Ch\",\"Shi\",\"Sha\"],digits:null,dateFormat:\"dd/mm/yyyy\",firstDay:0,isRTL:!1}},leapYear:function(t){var e=this._validate(t,this.minMonth,this.minDay,n.local.invalidYear);return this._leapYear(e.year())},_leapYear:function(t){return o(7*(t=t<0?t+1:t)+1,19)<7},monthsInYear:function(t){return this._validate(t,this.minMonth,this.minDay,n.local.invalidYear),this._leapYear(t.year?t.year():t)?13:12},weekOfYear:function(t,e,r){var n=this.newDate(t,e,r);return n.add(-n.dayOfWeek(),\"d\"),Math.floor((n.dayOfYear()-1)/7)+1},daysInYear:function(t){return t=this._validate(t,this.minMonth,this.minDay,n.local.invalidYear).year(),this.toJD(-1===t?1:t+1,7,1)-this.toJD(t,7,1)},daysInMonth:function(t,e){return t.year&&(e=t.month(),t=t.year()),this._validate(t,e,this.minDay,n.local.invalidMonth),12===e&&this.leapYear(t)||8===e&&5===o(this.daysInYear(t),10)?30:9===e&&3===o(this.daysInYear(t),10)?29:this.daysPerMonth[e-1]},weekDay:function(t,e,r){return 6!==this.dayOfWeek(t,e,r)},extraInfo:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate);return{yearType:(this.leapYear(i)?\"embolismic\":\"common\")+\" \"+[\"deficient\",\"regular\",\"complete\"][this.daysInYear(i)%10-3]}},toJD:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate);t=i.year(),e=i.month(),r=i.day();var a=t<=0?t+1:t,o=this.jdEpoch+this._delay1(a)+this._delay2(a)+r+1;if(e<7){for(var s=7;s<=this.monthsInYear(t);s++)o+=this.daysInMonth(t,s);for(s=1;s=this.toJD(-1===e?1:e+1,7,1);)e++;for(var r=tthis.toJD(e,r,this.daysInMonth(e,r));)r++;var n=t-this.toJD(e,r,1)+1;return this.newDate(e,r,n)}}),n.calendars.hebrew=a},26368:function(t,e,r){var n=r(38700),i=r(50896);function a(t){this.local=this.regionalOptions[t||\"\"]||this.regionalOptions[\"\"]}a.prototype=new n.baseCalendar,i(a.prototype,{name:\"Islamic\",jdEpoch:1948439.5,daysPerMonth:[30,29,30,29,30,29,30,29,30,29,30,29],hasYearZero:!1,minMonth:1,firstMonth:1,minDay:1,regionalOptions:{\"\":{name:\"Islamic\",epochs:[\"BH\",\"AH\"],monthNames:[\"Muharram\",\"Safar\",\"Rabi' al-awwal\",\"Rabi' al-thani\",\"Jumada al-awwal\",\"Jumada al-thani\",\"Rajab\",\"Sha'aban\",\"Ramadan\",\"Shawwal\",\"Dhu al-Qi'dah\",\"Dhu al-Hijjah\"],monthNamesShort:[\"Muh\",\"Saf\",\"Rab1\",\"Rab2\",\"Jum1\",\"Jum2\",\"Raj\",\"Sha'\",\"Ram\",\"Shaw\",\"DhuQ\",\"DhuH\"],dayNames:[\"Yawm al-ahad\",\"Yawm al-ithnayn\",\"Yawm ath-thulaathaa'\",\"Yawm al-arbi'aa'\",\"Yawm al-khamīs\",\"Yawm al-jum'a\",\"Yawm as-sabt\"],dayNamesShort:[\"Aha\",\"Ith\",\"Thu\",\"Arb\",\"Kha\",\"Jum\",\"Sab\"],dayNamesMin:[\"Ah\",\"It\",\"Th\",\"Ar\",\"Kh\",\"Ju\",\"Sa\"],digits:null,dateFormat:\"yyyy/mm/dd\",firstDay:6,isRTL:!1}},leapYear:function(t){return(11*this._validate(t,this.minMonth,this.minDay,n.local.invalidYear).year()+14)%30<11},weekOfYear:function(t,e,r){var n=this.newDate(t,e,r);return n.add(-n.dayOfWeek(),\"d\"),Math.floor((n.dayOfYear()-1)/7)+1},daysInYear:function(t){return this.leapYear(t)?355:354},daysInMonth:function(t,e){var r=this._validate(t,e,this.minDay,n.local.invalidMonth);return this.daysPerMonth[r.month()-1]+(12===r.month()&&this.leapYear(r.year())?1:0)},weekDay:function(t,e,r){return 5!==this.dayOfWeek(t,e,r)},toJD:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate);return t=i.year(),e=i.month(),t=t<=0?t+1:t,(r=i.day())+Math.ceil(29.5*(e-1))+354*(t-1)+Math.floor((3+11*t)/30)+this.jdEpoch-1},fromJD:function(t){t=Math.floor(t)+.5;var e=Math.floor((30*(t-this.jdEpoch)+10646)/10631);e=e<=0?e-1:e;var r=Math.min(12,Math.ceil((t-29-this.toJD(e,1,1))/29.5)+1),n=t-this.toJD(e,r,1)+1;return this.newDate(e,r,n)}}),n.calendars.islamic=a},24747:function(t,e,r){var n=r(38700),i=r(50896);function a(t){this.local=this.regionalOptions[t||\"\"]||this.regionalOptions[\"\"]}a.prototype=new n.baseCalendar,i(a.prototype,{name:\"Julian\",jdEpoch:1721423.5,daysPerMonth:[31,28,31,30,31,30,31,31,30,31,30,31],hasYearZero:!1,minMonth:1,firstMonth:1,minDay:1,regionalOptions:{\"\":{name:\"Julian\",epochs:[\"BC\",\"AD\"],monthNames:[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"],monthNamesShort:[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"],dayNames:[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],dayNamesShort:[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],dayNamesMin:[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"],digits:null,dateFormat:\"mm/dd/yyyy\",firstDay:0,isRTL:!1}},leapYear:function(t){var e=this._validate(t,this.minMonth,this.minDay,n.local.invalidYear);return(t=e.year()<0?e.year()+1:e.year())%4==0},weekOfYear:function(t,e,r){var n=this.newDate(t,e,r);return n.add(4-(n.dayOfWeek()||7),\"d\"),Math.floor((n.dayOfYear()-1)/7)+1},daysInMonth:function(t,e){var r=this._validate(t,e,this.minDay,n.local.invalidMonth);return this.daysPerMonth[r.month()-1]+(2===r.month()&&this.leapYear(r.year())?1:0)},weekDay:function(t,e,r){return(this.dayOfWeek(t,e,r)||7)<6},toJD:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate);return t=i.year(),e=i.month(),r=i.day(),t<0&&t++,e<=2&&(t--,e+=12),Math.floor(365.25*(t+4716))+Math.floor(30.6001*(e+1))+r-1524.5},fromJD:function(t){var e=Math.floor(t+.5)+1524,r=Math.floor((e-122.1)/365.25),n=Math.floor(365.25*r),i=Math.floor((e-n)/30.6001),a=i-Math.floor(i<14?1:13),o=r-Math.floor(a>2?4716:4715),s=e-n-Math.floor(30.6001*i);return o<=0&&o--,this.newDate(o,a,s)}}),n.calendars.julian=a},65616:function(t,e,r){var n=r(38700),i=r(50896);function a(t){this.local=this.regionalOptions[t||\"\"]||this.regionalOptions[\"\"]}function o(t,e){return t-e*Math.floor(t/e)}function s(t,e){return o(t-1,e)+1}a.prototype=new n.baseCalendar,i(a.prototype,{name:\"Mayan\",jdEpoch:584282.5,hasYearZero:!0,minMonth:0,firstMonth:0,minDay:0,regionalOptions:{\"\":{name:\"Mayan\",epochs:[\"\",\"\"],monthNames:[\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\",\"13\",\"14\",\"15\",\"16\",\"17\"],monthNamesShort:[\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\",\"13\",\"14\",\"15\",\"16\",\"17\"],dayNames:[\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\",\"13\",\"14\",\"15\",\"16\",\"17\",\"18\",\"19\"],dayNamesShort:[\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\",\"13\",\"14\",\"15\",\"16\",\"17\",\"18\",\"19\"],dayNamesMin:[\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\",\"13\",\"14\",\"15\",\"16\",\"17\",\"18\",\"19\"],digits:null,dateFormat:\"YYYY.m.d\",firstDay:0,isRTL:!1,haabMonths:[\"Pop\",\"Uo\",\"Zip\",\"Zotz\",\"Tzec\",\"Xul\",\"Yaxkin\",\"Mol\",\"Chen\",\"Yax\",\"Zac\",\"Ceh\",\"Mac\",\"Kankin\",\"Muan\",\"Pax\",\"Kayab\",\"Cumku\",\"Uayeb\"],tzolkinMonths:[\"Imix\",\"Ik\",\"Akbal\",\"Kan\",\"Chicchan\",\"Cimi\",\"Manik\",\"Lamat\",\"Muluc\",\"Oc\",\"Chuen\",\"Eb\",\"Ben\",\"Ix\",\"Men\",\"Cib\",\"Caban\",\"Etznab\",\"Cauac\",\"Ahau\"]}},leapYear:function(t){return this._validate(t,this.minMonth,this.minDay,n.local.invalidYear),!1},formatYear:function(t){t=this._validate(t,this.minMonth,this.minDay,n.local.invalidYear).year();var e=Math.floor(t/400);return t%=400,t+=t<0?400:0,e+\".\"+Math.floor(t/20)+\".\"+t%20},forYear:function(t){if((t=t.split(\".\")).length<3)throw\"Invalid Mayan year\";for(var e=0,r=0;r19||r>0&&n<0)throw\"Invalid Mayan year\";e=20*e+n}return e},monthsInYear:function(t){return this._validate(t,this.minMonth,this.minDay,n.local.invalidYear),18},weekOfYear:function(t,e,r){return this._validate(t,e,r,n.local.invalidDate),0},daysInYear:function(t){return this._validate(t,this.minMonth,this.minDay,n.local.invalidYear),360},daysInMonth:function(t,e){return this._validate(t,e,this.minDay,n.local.invalidMonth),20},daysInWeek:function(){return 5},dayOfWeek:function(t,e,r){return this._validate(t,e,r,n.local.invalidDate).day()},weekDay:function(t,e,r){return this._validate(t,e,r,n.local.invalidDate),!0},extraInfo:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate).toJD(),a=this._toHaab(i),o=this._toTzolkin(i);return{haabMonthName:this.local.haabMonths[a[0]-1],haabMonth:a[0],haabDay:a[1],tzolkinDayName:this.local.tzolkinMonths[o[0]-1],tzolkinDay:o[0],tzolkinTrecena:o[1]}},_toHaab:function(t){var e=o(8+(t-=this.jdEpoch)+340,365);return[Math.floor(e/20)+1,o(e,20)]},_toTzolkin:function(t){return[s(20+(t-=this.jdEpoch),20),s(t+4,13)]},toJD:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate);return i.day()+20*i.month()+360*i.year()+this.jdEpoch},fromJD:function(t){t=Math.floor(t)+.5-this.jdEpoch;var e=Math.floor(t/360);t%=360,t+=t<0?360:0;var r=Math.floor(t/20),n=t%20;return this.newDate(e,r,n)}}),n.calendars.mayan=a},30632:function(t,e,r){var n=r(38700),i=r(50896);function a(t){this.local=this.regionalOptions[t||\"\"]||this.regionalOptions[\"\"]}a.prototype=new n.baseCalendar;var o=n.instance(\"gregorian\");i(a.prototype,{name:\"Nanakshahi\",jdEpoch:2257673.5,daysPerMonth:[31,31,31,31,31,30,30,30,30,30,30,30],hasYearZero:!1,minMonth:1,firstMonth:1,minDay:1,regionalOptions:{\"\":{name:\"Nanakshahi\",epochs:[\"BN\",\"AN\"],monthNames:[\"Chet\",\"Vaisakh\",\"Jeth\",\"Harh\",\"Sawan\",\"Bhadon\",\"Assu\",\"Katak\",\"Maghar\",\"Poh\",\"Magh\",\"Phagun\"],monthNamesShort:[\"Che\",\"Vai\",\"Jet\",\"Har\",\"Saw\",\"Bha\",\"Ass\",\"Kat\",\"Mgr\",\"Poh\",\"Mgh\",\"Pha\"],dayNames:[\"Somvaar\",\"Mangalvar\",\"Budhvaar\",\"Veervaar\",\"Shukarvaar\",\"Sanicharvaar\",\"Etvaar\"],dayNamesShort:[\"Som\",\"Mangal\",\"Budh\",\"Veer\",\"Shukar\",\"Sanichar\",\"Et\"],dayNamesMin:[\"So\",\"Ma\",\"Bu\",\"Ve\",\"Sh\",\"Sa\",\"Et\"],digits:null,dateFormat:\"dd-mm-yyyy\",firstDay:0,isRTL:!1}},leapYear:function(t){var e=this._validate(t,this.minMonth,this.minDay,n.local.invalidYear||n.regionalOptions[\"\"].invalidYear);return o.leapYear(e.year()+(e.year()<1?1:0)+1469)},weekOfYear:function(t,e,r){var n=this.newDate(t,e,r);return n.add(1-(n.dayOfWeek()||7),\"d\"),Math.floor((n.dayOfYear()-1)/7)+1},daysInMonth:function(t,e){var r=this._validate(t,e,this.minDay,n.local.invalidMonth);return this.daysPerMonth[r.month()-1]+(12===r.month()&&this.leapYear(r.year())?1:0)},weekDay:function(t,e,r){return(this.dayOfWeek(t,e,r)||7)<6},toJD:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidMonth);(t=i.year())<0&&t++;for(var a=i.day(),s=1;s=this.toJD(e+1,1,1);)e++;for(var r=t-Math.floor(this.toJD(e,1,1)+.5)+1,n=1;r>this.daysInMonth(e,n);)r-=this.daysInMonth(e,n),n++;return this.newDate(e,n,r)}}),n.calendars.nanakshahi=a},73040:function(t,e,r){var n=r(38700),i=r(50896);function a(t){this.local=this.regionalOptions[t||\"\"]||this.regionalOptions[\"\"]}a.prototype=new n.baseCalendar,i(a.prototype,{name:\"Nepali\",jdEpoch:1700709.5,daysPerMonth:[31,31,32,32,31,30,30,29,30,29,30,30],hasYearZero:!1,minMonth:1,firstMonth:1,minDay:1,daysPerYear:365,regionalOptions:{\"\":{name:\"Nepali\",epochs:[\"BBS\",\"ABS\"],monthNames:[\"Baisakh\",\"Jestha\",\"Ashadh\",\"Shrawan\",\"Bhadra\",\"Ashwin\",\"Kartik\",\"Mangsir\",\"Paush\",\"Mangh\",\"Falgun\",\"Chaitra\"],monthNamesShort:[\"Bai\",\"Je\",\"As\",\"Shra\",\"Bha\",\"Ash\",\"Kar\",\"Mang\",\"Pau\",\"Ma\",\"Fal\",\"Chai\"],dayNames:[\"Aaitabaar\",\"Sombaar\",\"Manglbaar\",\"Budhabaar\",\"Bihibaar\",\"Shukrabaar\",\"Shanibaar\"],dayNamesShort:[\"Aaita\",\"Som\",\"Mangl\",\"Budha\",\"Bihi\",\"Shukra\",\"Shani\"],dayNamesMin:[\"Aai\",\"So\",\"Man\",\"Bu\",\"Bi\",\"Shu\",\"Sha\"],digits:null,dateFormat:\"dd/mm/yyyy\",firstDay:1,isRTL:!1}},leapYear:function(t){return this.daysInYear(t)!==this.daysPerYear},weekOfYear:function(t,e,r){var n=this.newDate(t,e,r);return n.add(-n.dayOfWeek(),\"d\"),Math.floor((n.dayOfYear()-1)/7)+1},daysInYear:function(t){if(t=this._validate(t,this.minMonth,this.minDay,n.local.invalidYear).year(),void 0===this.NEPALI_CALENDAR_DATA[t])return this.daysPerYear;for(var e=0,r=this.minMonth;r<=12;r++)e+=this.NEPALI_CALENDAR_DATA[t][r];return e},daysInMonth:function(t,e){return t.year&&(e=t.month(),t=t.year()),this._validate(t,e,this.minDay,n.local.invalidMonth),void 0===this.NEPALI_CALENDAR_DATA[t]?this.daysPerMonth[e-1]:this.NEPALI_CALENDAR_DATA[t][e]},weekDay:function(t,e,r){return 6!==this.dayOfWeek(t,e,r)},toJD:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate);t=i.year(),e=i.month(),r=i.day();var a=n.instance(),o=0,s=e,l=t;this._createMissingCalendarData(t);var u=t-(s>9||9===s&&r>=this.NEPALI_CALENDAR_DATA[l][0]?56:57);for(9!==e&&(o=r,s--);9!==s;)s<=0&&(s=12,l--),o+=this.NEPALI_CALENDAR_DATA[l][s],s--;return 9===e?(o+=r-this.NEPALI_CALENDAR_DATA[l][0])<0&&(o+=a.daysInYear(u)):o+=this.NEPALI_CALENDAR_DATA[l][9]-this.NEPALI_CALENDAR_DATA[l][0],a.newDate(u,1,1).add(o,\"d\").toJD()},fromJD:function(t){var e=n.instance().fromJD(t),r=e.year(),i=e.dayOfYear(),a=r+56;this._createMissingCalendarData(a);for(var o=9,s=this.NEPALI_CALENDAR_DATA[a][0],l=this.NEPALI_CALENDAR_DATA[a][o]-s+1;i>l;)++o>12&&(o=1,a++),l+=this.NEPALI_CALENDAR_DATA[a][o];var u=this.NEPALI_CALENDAR_DATA[a][o]-(l-i);return this.newDate(a,o,u)},_createMissingCalendarData:function(t){var e=this.daysPerMonth.slice(0);e.unshift(17);for(var r=t-1;r0?474:473))%2820+474+38)%2816<682},weekOfYear:function(t,e,r){var n=this.newDate(t,e,r);return n.add(-(n.dayOfWeek()+1)%7,\"d\"),Math.floor((n.dayOfYear()-1)/7)+1},daysInMonth:function(t,e){var r=this._validate(t,e,this.minDay,n.local.invalidMonth);return this.daysPerMonth[r.month()-1]+(12===r.month()&&this.leapYear(r.year())?1:0)},weekDay:function(t,e,r){return 5!==this.dayOfWeek(t,e,r)},toJD:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate);t=i.year(),e=i.month(),r=i.day();var a=t-(t>=0?474:473),s=474+o(a,2820);return r+(e<=7?31*(e-1):30*(e-1)+6)+Math.floor((682*s-110)/2816)+365*(s-1)+1029983*Math.floor(a/2820)+this.jdEpoch-1},fromJD:function(t){var e=(t=Math.floor(t)+.5)-this.toJD(475,1,1),r=Math.floor(e/1029983),n=o(e,1029983),i=2820;if(1029982!==n){var a=Math.floor(n/366),s=o(n,366);i=Math.floor((2134*a+2816*s+2815)/1028522)+a+1}var l=i+2820*r+474;l=l<=0?l-1:l;var u=t-this.toJD(l,1,1)+1,c=u<=186?Math.ceil(u/31):Math.ceil((u-6)/30),f=t-this.toJD(l,c,1)+1;return this.newDate(l,c,f)}}),n.calendars.persian=a,n.calendars.jalali=a},51456:function(t,e,r){var n=r(38700),i=r(50896),a=n.instance();function o(t){this.local=this.regionalOptions[t||\"\"]||this.regionalOptions[\"\"]}o.prototype=new n.baseCalendar,i(o.prototype,{name:\"Taiwan\",jdEpoch:2419402.5,yearsOffset:1911,daysPerMonth:[31,28,31,30,31,30,31,31,30,31,30,31],hasYearZero:!1,minMonth:1,firstMonth:1,minDay:1,regionalOptions:{\"\":{name:\"Taiwan\",epochs:[\"BROC\",\"ROC\"],monthNames:[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"],monthNamesShort:[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"],dayNames:[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],dayNamesShort:[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],dayNamesMin:[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"],digits:null,dateFormat:\"yyyy/mm/dd\",firstDay:1,isRTL:!1}},leapYear:function(t){var e=this._validate(t,this.minMonth,this.minDay,n.local.invalidYear);return t=this._t2gYear(e.year()),a.leapYear(t)},weekOfYear:function(t,e,r){var i=this._validate(t,this.minMonth,this.minDay,n.local.invalidYear);return t=this._t2gYear(i.year()),a.weekOfYear(t,i.month(),i.day())},daysInMonth:function(t,e){var r=this._validate(t,e,this.minDay,n.local.invalidMonth);return this.daysPerMonth[r.month()-1]+(2===r.month()&&this.leapYear(r.year())?1:0)},weekDay:function(t,e,r){return(this.dayOfWeek(t,e,r)||7)<6},toJD:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate);return t=this._t2gYear(i.year()),a.toJD(t,i.month(),i.day())},fromJD:function(t){var e=a.fromJD(t),r=this._g2tYear(e.year());return this.newDate(r,e.month(),e.day())},_t2gYear:function(t){return t+this.yearsOffset+(t>=-this.yearsOffset&&t<=-1?1:0)},_g2tYear:function(t){return t-this.yearsOffset-(t>=1&&t<=this.yearsOffset?1:0)}}),n.calendars.taiwan=o},4592:function(t,e,r){var n=r(38700),i=r(50896),a=n.instance();function o(t){this.local=this.regionalOptions[t||\"\"]||this.regionalOptions[\"\"]}o.prototype=new n.baseCalendar,i(o.prototype,{name:\"Thai\",jdEpoch:1523098.5,yearsOffset:543,daysPerMonth:[31,28,31,30,31,30,31,31,30,31,30,31],hasYearZero:!1,minMonth:1,firstMonth:1,minDay:1,regionalOptions:{\"\":{name:\"Thai\",epochs:[\"BBE\",\"BE\"],monthNames:[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"],monthNamesShort:[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"],dayNames:[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],dayNamesShort:[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],dayNamesMin:[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"],digits:null,dateFormat:\"dd/mm/yyyy\",firstDay:0,isRTL:!1}},leapYear:function(t){var e=this._validate(t,this.minMonth,this.minDay,n.local.invalidYear);return t=this._t2gYear(e.year()),a.leapYear(t)},weekOfYear:function(t,e,r){var i=this._validate(t,this.minMonth,this.minDay,n.local.invalidYear);return t=this._t2gYear(i.year()),a.weekOfYear(t,i.month(),i.day())},daysInMonth:function(t,e){var r=this._validate(t,e,this.minDay,n.local.invalidMonth);return this.daysPerMonth[r.month()-1]+(2===r.month()&&this.leapYear(r.year())?1:0)},weekDay:function(t,e,r){return(this.dayOfWeek(t,e,r)||7)<6},toJD:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate);return t=this._t2gYear(i.year()),a.toJD(t,i.month(),i.day())},fromJD:function(t){var e=a.fromJD(t),r=this._g2tYear(e.year());return this.newDate(r,e.month(),e.day())},_t2gYear:function(t){return t-this.yearsOffset-(t>=1&&t<=this.yearsOffset?1:0)},_g2tYear:function(t){return t+this.yearsOffset+(t>=-this.yearsOffset&&t<=-1?1:0)}}),n.calendars.thai=o},45348:function(t,e,r){var n=r(38700),i=r(50896);function a(t){this.local=this.regionalOptions[t||\"\"]||this.regionalOptions[\"\"]}a.prototype=new n.baseCalendar,i(a.prototype,{name:\"UmmAlQura\",hasYearZero:!1,minMonth:1,firstMonth:1,minDay:1,regionalOptions:{\"\":{name:\"Umm al-Qura\",epochs:[\"BH\",\"AH\"],monthNames:[\"Al-Muharram\",\"Safar\",\"Rabi' al-awwal\",\"Rabi' Al-Thani\",\"Jumada Al-Awwal\",\"Jumada Al-Thani\",\"Rajab\",\"Sha'aban\",\"Ramadan\",\"Shawwal\",\"Dhu al-Qi'dah\",\"Dhu al-Hijjah\"],monthNamesShort:[\"Muh\",\"Saf\",\"Rab1\",\"Rab2\",\"Jum1\",\"Jum2\",\"Raj\",\"Sha'\",\"Ram\",\"Shaw\",\"DhuQ\",\"DhuH\"],dayNames:[\"Yawm al-Ahad\",\"Yawm al-Ithnain\",\"Yawm al-Thalāthā’\",\"Yawm al-Arba‘ā’\",\"Yawm al-Khamīs\",\"Yawm al-Jum‘a\",\"Yawm al-Sabt\"],dayNamesMin:[\"Ah\",\"Ith\",\"Th\",\"Ar\",\"Kh\",\"Ju\",\"Sa\"],digits:null,dateFormat:\"yyyy/mm/dd\",firstDay:6,isRTL:!0}},leapYear:function(t){var e=this._validate(t,this.minMonth,this.minDay,n.local.invalidYear);return 355===this.daysInYear(e.year())},weekOfYear:function(t,e,r){var n=this.newDate(t,e,r);return n.add(-n.dayOfWeek(),\"d\"),Math.floor((n.dayOfYear()-1)/7)+1},daysInYear:function(t){for(var e=0,r=1;r<=12;r++)e+=this.daysInMonth(t,r);return e},daysInMonth:function(t,e){for(var r=this._validate(t,e,this.minDay,n.local.invalidMonth).toJD()-24e5+.5,i=0,a=0;ar)return o[i]-o[i-1];i++}return 30},weekDay:function(t,e,r){return 5!==this.dayOfWeek(t,e,r)},toJD:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate),a=12*(i.year()-1)+i.month()-15292;return i.day()+o[a-1]-1+24e5-.5},fromJD:function(t){for(var e=t-24e5+.5,r=0,n=0;ne);n++)r++;var i=r+15292,a=Math.floor((i-1)/12),s=a+1,l=i-12*a,u=e-o[r-1]+1;return this.newDate(s,l,u)},isValid:function(t,e,r){var i=n.baseCalendar.prototype.isValid.apply(this,arguments);return i&&(i=(t=null!=t.year?t.year:t)>=1276&&t<=1500),i},_validate:function(t,e,r,i){var a=n.baseCalendar.prototype._validate.apply(this,arguments);if(a.year<1276||a.year>1500)throw i.replace(/\\{0\\}/,this.local.name);return a}}),n.calendars.ummalqura=a;var o=[20,50,79,109,138,168,197,227,256,286,315,345,374,404,433,463,492,522,551,581,611,641,670,700,729,759,788,818,847,877,906,936,965,995,1024,1054,1083,1113,1142,1172,1201,1231,1260,1290,1320,1350,1379,1409,1438,1468,1497,1527,1556,1586,1615,1645,1674,1704,1733,1763,1792,1822,1851,1881,1910,1940,1969,1999,2028,2058,2087,2117,2146,2176,2205,2235,2264,2294,2323,2353,2383,2413,2442,2472,2501,2531,2560,2590,2619,2649,2678,2708,2737,2767,2796,2826,2855,2885,2914,2944,2973,3003,3032,3062,3091,3121,3150,3180,3209,3239,3268,3298,3327,3357,3386,3416,3446,3476,3505,3535,3564,3594,3623,3653,3682,3712,3741,3771,3800,3830,3859,3889,3918,3948,3977,4007,4036,4066,4095,4125,4155,4185,4214,4244,4273,4303,4332,4362,4391,4421,4450,4480,4509,4539,4568,4598,4627,4657,4686,4716,4745,4775,4804,4834,4863,4893,4922,4952,4981,5011,5040,5070,5099,5129,5158,5188,5218,5248,5277,5307,5336,5366,5395,5425,5454,5484,5513,5543,5572,5602,5631,5661,5690,5720,5749,5779,5808,5838,5867,5897,5926,5956,5985,6015,6044,6074,6103,6133,6162,6192,6221,6251,6281,6311,6340,6370,6399,6429,6458,6488,6517,6547,6576,6606,6635,6665,6694,6724,6753,6783,6812,6842,6871,6901,6930,6960,6989,7019,7048,7078,7107,7137,7166,7196,7225,7255,7284,7314,7344,7374,7403,7433,7462,7492,7521,7551,7580,7610,7639,7669,7698,7728,7757,7787,7816,7846,7875,7905,7934,7964,7993,8023,8053,8083,8112,8142,8171,8201,8230,8260,8289,8319,8348,8378,8407,8437,8466,8496,8525,8555,8584,8614,8643,8673,8702,8732,8761,8791,8821,8850,8880,8909,8938,8968,8997,9027,9056,9086,9115,9145,9175,9205,9234,9264,9293,9322,9352,9381,9410,9440,9470,9499,9529,9559,9589,9618,9648,9677,9706,9736,9765,9794,9824,9853,9883,9913,9943,9972,10002,10032,10061,10090,10120,10149,10178,10208,10237,10267,10297,10326,10356,10386,10415,10445,10474,10504,10533,10562,10592,10621,10651,10680,10710,10740,10770,10799,10829,10858,10888,10917,10947,10976,11005,11035,11064,11094,11124,11153,11183,11213,11242,11272,11301,11331,11360,11389,11419,11448,11478,11507,11537,11567,11596,11626,11655,11685,11715,11744,11774,11803,11832,11862,11891,11921,11950,11980,12010,12039,12069,12099,12128,12158,12187,12216,12246,12275,12304,12334,12364,12393,12423,12453,12483,12512,12542,12571,12600,12630,12659,12688,12718,12747,12777,12807,12837,12866,12896,12926,12955,12984,13014,13043,13072,13102,13131,13161,13191,13220,13250,13280,13310,13339,13368,13398,13427,13456,13486,13515,13545,13574,13604,13634,13664,13693,13723,13752,13782,13811,13840,13870,13899,13929,13958,13988,14018,14047,14077,14107,14136,14166,14195,14224,14254,14283,14313,14342,14372,14401,14431,14461,14490,14520,14550,14579,14609,14638,14667,14697,14726,14756,14785,14815,14844,14874,14904,14933,14963,14993,15021,15051,15081,15110,15140,15169,15199,15228,15258,15287,15317,15347,15377,15406,15436,15465,15494,15524,15553,15582,15612,15641,15671,15701,15731,15760,15790,15820,15849,15878,15908,15937,15966,15996,16025,16055,16085,16114,16144,16174,16204,16233,16262,16292,16321,16350,16380,16409,16439,16468,16498,16528,16558,16587,16617,16646,16676,16705,16734,16764,16793,16823,16852,16882,16912,16941,16971,17001,17030,17060,17089,17118,17148,17177,17207,17236,17266,17295,17325,17355,17384,17414,17444,17473,17502,17532,17561,17591,17620,17650,17679,17709,17738,17768,17798,17827,17857,17886,17916,17945,17975,18004,18034,18063,18093,18122,18152,18181,18211,18241,18270,18300,18330,18359,18388,18418,18447,18476,18506,18535,18565,18595,18625,18654,18684,18714,18743,18772,18802,18831,18860,18890,18919,18949,18979,19008,19038,19068,19098,19127,19156,19186,19215,19244,19274,19303,19333,19362,19392,19422,19452,19481,19511,19540,19570,19599,19628,19658,19687,19717,19746,19776,19806,19836,19865,19895,19924,19954,19983,20012,20042,20071,20101,20130,20160,20190,20219,20249,20279,20308,20338,20367,20396,20426,20455,20485,20514,20544,20573,20603,20633,20662,20692,20721,20751,20780,20810,20839,20869,20898,20928,20957,20987,21016,21046,21076,21105,21135,21164,21194,21223,21253,21282,21312,21341,21371,21400,21430,21459,21489,21519,21548,21578,21607,21637,21666,21696,21725,21754,21784,21813,21843,21873,21902,21932,21962,21991,22021,22050,22080,22109,22138,22168,22197,22227,22256,22286,22316,22346,22375,22405,22434,22464,22493,22522,22552,22581,22611,22640,22670,22700,22730,22759,22789,22818,22848,22877,22906,22936,22965,22994,23024,23054,23083,23113,23143,23173,23202,23232,23261,23290,23320,23349,23379,23408,23438,23467,23497,23527,23556,23586,23616,23645,23674,23704,23733,23763,23792,23822,23851,23881,23910,23940,23970,23999,24029,24058,24088,24117,24147,24176,24206,24235,24265,24294,24324,24353,24383,24413,24442,24472,24501,24531,24560,24590,24619,24648,24678,24707,24737,24767,24796,24826,24856,24885,24915,24944,24974,25003,25032,25062,25091,25121,25150,25180,25210,25240,25269,25299,25328,25358,25387,25416,25446,25475,25505,25534,25564,25594,25624,25653,25683,25712,25742,25771,25800,25830,25859,25888,25918,25948,25977,26007,26037,26067,26096,26126,26155,26184,26214,26243,26272,26302,26332,26361,26391,26421,26451,26480,26510,26539,26568,26598,26627,26656,26686,26715,26745,26775,26805,26834,26864,26893,26923,26952,26982,27011,27041,27070,27099,27129,27159,27188,27218,27248,27277,27307,27336,27366,27395,27425,27454,27484,27513,27542,27572,27602,27631,27661,27691,27720,27750,27779,27809,27838,27868,27897,27926,27956,27985,28015,28045,28074,28104,28134,28163,28193,28222,28252,28281,28310,28340,28369,28399,28428,28458,28488,28517,28547,28577,28607,28636,28665,28695,28724,28754,28783,28813,28843,28872,28901,28931,28960,28990,29019,29049,29078,29108,29137,29167,29196,29226,29255,29285,29315,29345,29375,29404,29434,29463,29492,29522,29551,29580,29610,29640,29669,29699,29729,29759,29788,29818,29847,29876,29906,29935,29964,29994,30023,30053,30082,30112,30141,30171,30200,30230,30259,30289,30318,30348,30378,30408,30437,30467,30496,30526,30555,30585,30614,30644,30673,30703,30732,30762,30791,30821,30850,30880,30909,30939,30968,30998,31027,31057,31086,31116,31145,31175,31204,31234,31263,31293,31322,31352,31381,31411,31441,31471,31500,31530,31559,31589,31618,31648,31676,31706,31736,31766,31795,31825,31854,31884,31913,31943,31972,32002,32031,32061,32090,32120,32150,32180,32209,32239,32268,32298,32327,32357,32386,32416,32445,32475,32504,32534,32563,32593,32622,32652,32681,32711,32740,32770,32799,32829,32858,32888,32917,32947,32976,33006,33035,33065,33094,33124,33153,33183,33213,33243,33272,33302,33331,33361,33390,33420,33450,33479,33509,33539,33568,33598,33627,33657,33686,33716,33745,33775,33804,33834,33863,33893,33922,33952,33981,34011,34040,34069,34099,34128,34158,34187,34217,34247,34277,34306,34336,34365,34395,34424,34454,34483,34512,34542,34571,34601,34631,34660,34690,34719,34749,34778,34808,34837,34867,34896,34926,34955,34985,35015,35044,35074,35103,35133,35162,35192,35222,35251,35280,35310,35340,35370,35399,35429,35458,35488,35517,35547,35576,35605,35635,35665,35694,35723,35753,35782,35811,35841,35871,35901,35930,35960,35989,36019,36048,36078,36107,36136,36166,36195,36225,36254,36284,36314,36343,36373,36403,36433,36462,36492,36521,36551,36580,36610,36639,36669,36698,36728,36757,36786,36816,36845,36875,36904,36934,36963,36993,37022,37052,37081,37111,37141,37170,37200,37229,37259,37288,37318,37347,37377,37406,37436,37465,37495,37524,37554,37584,37613,37643,37672,37701,37731,37760,37790,37819,37849,37878,37908,37938,37967,37997,38027,38056,38085,38115,38144,38174,38203,38233,38262,38292,38322,38351,38381,38410,38440,38469,38499,38528,38558,38587,38617,38646,38676,38705,38735,38764,38794,38823,38853,38882,38912,38941,38971,39001,39030,39059,39089,39118,39148,39178,39208,39237,39267,39297,39326,39355,39385,39414,39444,39473,39503,39532,39562,39592,39621,39650,39680,39709,39739,39768,39798,39827,39857,39886,39916,39946,39975,40005,40035,40064,40094,40123,40153,40182,40212,40241,40271,40300,40330,40359,40389,40418,40448,40477,40507,40536,40566,40595,40625,40655,40685,40714,40744,40773,40803,40832,40862,40892,40921,40951,40980,41009,41039,41068,41098,41127,41157,41186,41216,41245,41275,41304,41334,41364,41393,41422,41452,41481,41511,41540,41570,41599,41629,41658,41688,41718,41748,41777,41807,41836,41865,41894,41924,41953,41983,42012,42042,42072,42102,42131,42161,42190,42220,42249,42279,42308,42337,42367,42397,42426,42456,42485,42515,42545,42574,42604,42633,42662,42692,42721,42751,42780,42810,42839,42869,42899,42929,42958,42988,43017,43046,43076,43105,43135,43164,43194,43223,43253,43283,43312,43342,43371,43401,43430,43460,43489,43519,43548,43578,43607,43637,43666,43696,43726,43755,43785,43814,43844,43873,43903,43932,43962,43991,44021,44050,44080,44109,44139,44169,44198,44228,44258,44287,44317,44346,44375,44405,44434,44464,44493,44523,44553,44582,44612,44641,44671,44700,44730,44759,44788,44818,44847,44877,44906,44936,44966,44996,45025,45055,45084,45114,45143,45172,45202,45231,45261,45290,45320,45350,45380,45409,45439,45468,45498,45527,45556,45586,45615,45644,45674,45704,45733,45763,45793,45823,45852,45882,45911,45940,45970,45999,46028,46058,46088,46117,46147,46177,46206,46236,46265,46295,46324,46354,46383,46413,46442,46472,46501,46531,46560,46590,46620,46649,46679,46708,46738,46767,46797,46826,46856,46885,46915,46944,46974,47003,47033,47063,47092,47122,47151,47181,47210,47240,47269,47298,47328,47357,47387,47417,47446,47476,47506,47535,47565,47594,47624,47653,47682,47712,47741,47771,47800,47830,47860,47890,47919,47949,47978,48008,48037,48066,48096,48125,48155,48184,48214,48244,48273,48303,48333,48362,48392,48421,48450,48480,48509,48538,48568,48598,48627,48657,48687,48717,48746,48776,48805,48834,48864,48893,48922,48952,48982,49011,49041,49071,49100,49130,49160,49189,49218,49248,49277,49306,49336,49365,49395,49425,49455,49484,49514,49543,49573,49602,49632,49661,49690,49720,49749,49779,49809,49838,49868,49898,49927,49957,49986,50016,50045,50075,50104,50133,50163,50192,50222,50252,50281,50311,50340,50370,50400,50429,50459,50488,50518,50547,50576,50606,50635,50665,50694,50724,50754,50784,50813,50843,50872,50902,50931,50960,50990,51019,51049,51078,51108,51138,51167,51197,51227,51256,51286,51315,51345,51374,51403,51433,51462,51492,51522,51552,51582,51611,51641,51670,51699,51729,51758,51787,51816,51846,51876,51906,51936,51965,51995,52025,52054,52083,52113,52142,52171,52200,52230,52260,52290,52319,52349,52379,52408,52438,52467,52497,52526,52555,52585,52614,52644,52673,52703,52733,52762,52792,52822,52851,52881,52910,52939,52969,52998,53028,53057,53087,53116,53146,53176,53205,53235,53264,53294,53324,53353,53383,53412,53441,53471,53500,53530,53559,53589,53619,53648,53678,53708,53737,53767,53796,53825,53855,53884,53913,53943,53973,54003,54032,54062,54092,54121,54151,54180,54209,54239,54268,54297,54327,54357,54387,54416,54446,54476,54505,54535,54564,54593,54623,54652,54681,54711,54741,54770,54800,54830,54859,54889,54919,54948,54977,55007,55036,55066,55095,55125,55154,55184,55213,55243,55273,55302,55332,55361,55391,55420,55450,55479,55508,55538,55567,55597,55627,55657,55686,55716,55745,55775,55804,55834,55863,55892,55922,55951,55981,56011,56040,56070,56100,56129,56159,56188,56218,56247,56276,56306,56335,56365,56394,56424,56454,56483,56513,56543,56572,56601,56631,56660,56690,56719,56749,56778,56808,56837,56867,56897,56926,56956,56985,57015,57044,57074,57103,57133,57162,57192,57221,57251,57280,57310,57340,57369,57399,57429,57458,57487,57517,57546,57576,57605,57634,57664,57694,57723,57753,57783,57813,57842,57871,57901,57930,57959,57989,58018,58048,58077,58107,58137,58167,58196,58226,58255,58285,58314,58343,58373,58402,58432,58461,58491,58521,58551,58580,58610,58639,58669,58698,58727,58757,58786,58816,58845,58875,58905,58934,58964,58994,59023,59053,59082,59111,59141,59170,59200,59229,59259,59288,59318,59348,59377,59407,59436,59466,59495,59525,59554,59584,59613,59643,59672,59702,59731,59761,59791,59820,59850,59879,59909,59939,59968,59997,60027,60056,60086,60115,60145,60174,60204,60234,60264,60293,60323,60352,60381,60411,60440,60469,60499,60528,60558,60588,60618,60648,60677,60707,60736,60765,60795,60824,60853,60883,60912,60942,60972,61002,61031,61061,61090,61120,61149,61179,61208,61237,61267,61296,61326,61356,61385,61415,61445,61474,61504,61533,61563,61592,61621,61651,61680,61710,61739,61769,61799,61828,61858,61888,61917,61947,61976,62006,62035,62064,62094,62123,62153,62182,62212,62242,62271,62301,62331,62360,62390,62419,62448,62478,62507,62537,62566,62596,62625,62655,62685,62715,62744,62774,62803,62832,62862,62891,62921,62950,62980,63009,63039,63069,63099,63128,63157,63187,63216,63246,63275,63305,63334,63363,63393,63423,63453,63482,63512,63541,63571,63600,63630,63659,63689,63718,63747,63777,63807,63836,63866,63895,63925,63955,63984,64014,64043,64073,64102,64131,64161,64190,64220,64249,64279,64309,64339,64368,64398,64427,64457,64486,64515,64545,64574,64603,64633,64663,64692,64722,64752,64782,64811,64841,64870,64899,64929,64958,64987,65017,65047,65076,65106,65136,65166,65195,65225,65254,65283,65313,65342,65371,65401,65431,65460,65490,65520,65549,65579,65608,65638,65667,65697,65726,65755,65785,65815,65844,65874,65903,65933,65963,65992,66022,66051,66081,66110,66140,66169,66199,66228,66258,66287,66317,66346,66376,66405,66435,66465,66494,66524,66553,66583,66612,66641,66671,66700,66730,66760,66789,66819,66849,66878,66908,66937,66967,66996,67025,67055,67084,67114,67143,67173,67203,67233,67262,67292,67321,67351,67380,67409,67439,67468,67497,67527,67557,67587,67617,67646,67676,67705,67735,67764,67793,67823,67852,67882,67911,67941,67971,68e3,68030,68060,68089,68119,68148,68177,68207,68236,68266,68295,68325,68354,68384,68414,68443,68473,68502,68532,68561,68591,68620,68650,68679,68708,68738,68768,68797,68827,68857,68886,68916,68946,68975,69004,69034,69063,69092,69122,69152,69181,69211,69240,69270,69300,69330,69359,69388,69418,69447,69476,69506,69535,69565,69595,69624,69654,69684,69713,69743,69772,69802,69831,69861,69890,69919,69949,69978,70008,70038,70067,70097,70126,70156,70186,70215,70245,70274,70303,70333,70362,70392,70421,70451,70481,70510,70540,70570,70599,70629,70658,70687,70717,70746,70776,70805,70835,70864,70894,70924,70954,70983,71013,71042,71071,71101,71130,71159,71189,71218,71248,71278,71308,71337,71367,71397,71426,71455,71485,71514,71543,71573,71602,71632,71662,71691,71721,71751,71781,71810,71839,71869,71898,71927,71957,71986,72016,72046,72075,72105,72135,72164,72194,72223,72253,72282,72311,72341,72370,72400,72429,72459,72489,72518,72548,72577,72607,72637,72666,72695,72725,72754,72784,72813,72843,72872,72902,72931,72961,72991,73020,73050,73080,73109,73139,73168,73197,73227,73256,73286,73315,73345,73375,73404,73434,73464,73493,73523,73552,73581,73611,73640,73669,73699,73729,73758,73788,73818,73848,73877,73907,73936,73965,73995,74024,74053,74083,74113,74142,74172,74202,74231,74261,74291,74320,74349,74379,74408,74437,74467,74497,74526,74556,74586,74615,74645,74675,74704,74733,74763,74792,74822,74851,74881,74910,74940,74969,74999,75029,75058,75088,75117,75147,75176,75206,75235,75264,75294,75323,75353,75383,75412,75442,75472,75501,75531,75560,75590,75619,75648,75678,75707,75737,75766,75796,75826,75856,75885,75915,75944,75974,76003,76032,76062,76091,76121,76150,76180,76210,76239,76269,76299,76328,76358,76387,76416,76446,76475,76505,76534,76564,76593,76623,76653,76682,76712,76741,76771,76801,76830,76859,76889,76918,76948,76977,77007,77036,77066,77096,77125,77155,77185,77214,77243,77273,77302,77332,77361,77390,77420,77450,77479,77509,77539,77569,77598,77627,77657,77686,77715,77745,77774,77804,77833,77863,77893,77923,77952,77982,78011,78041,78070,78099,78129,78158,78188,78217,78247,78277,78307,78336,78366,78395,78425,78454,78483,78513,78542,78572,78601,78631,78661,78690,78720,78750,78779,78808,78838,78867,78897,78926,78956,78985,79015,79044,79074,79104,79133,79163,79192,79222,79251,79281,79310,79340,79369,79399,79428,79458,79487,79517,79546,79576,79606,79635,79665,79695,79724,79753,79783,79812,79841,79871,79900,79930,79960,79990]},38700:function(t,e,r){var n=r(50896);function i(){this.regionalOptions=[],this.regionalOptions[\"\"]={invalidCalendar:\"Calendar {0} not found\",invalidDate:\"Invalid {0} date\",invalidMonth:\"Invalid {0} month\",invalidYear:\"Invalid {0} year\",differentCalendars:\"Cannot mix {0} and {1} dates\"},this.local=this.regionalOptions[\"\"],this.calendars={},this._localCals={}}function a(t,e,r,n){if(this._calendar=t,this._year=e,this._month=r,this._day=n,0===this._calendar._validateLevel&&!this._calendar.isValid(this._year,this._month,this._day))throw(u.local.invalidDate||u.regionalOptions[\"\"].invalidDate).replace(/\\{0\\}/,this._calendar.local.name)}function o(t,e){return\"000000\".substring(0,e-(t=\"\"+t).length)+t}function s(){this.shortYearCutoff=\"+10\"}function l(t){this.local=this.regionalOptions[t]||this.regionalOptions[\"\"]}n(i.prototype,{instance:function(t,e){t=(t||\"gregorian\").toLowerCase(),e=e||\"\";var r=this._localCals[t+\"-\"+e];if(!r&&this.calendars[t]&&(r=new this.calendars[t](e),this._localCals[t+\"-\"+e]=r),!r)throw(this.local.invalidCalendar||this.regionalOptions[\"\"].invalidCalendar).replace(/\\{0\\}/,t);return r},newDate:function(t,e,r,n,i){return(n=(null!=t&&t.year?t.calendar():\"string\"==typeof n?this.instance(n,i):n)||this.instance()).newDate(t,e,r)},substituteDigits:function(t){return function(e){return(e+\"\").replace(/[0-9]/g,(function(e){return t[e]}))}},substituteChineseDigits:function(t,e){return function(r){for(var n=\"\",i=0;r>0;){var a=r%10;n=(0===a?\"\":t[a]+e[i])+n,i++,r=Math.floor(r/10)}return 0===n.indexOf(t[1]+e[1])&&(n=n.substr(1)),n||t[0]}}}),n(a.prototype,{newDate:function(t,e,r){return this._calendar.newDate(null==t?this:t,e,r)},year:function(t){return 0===arguments.length?this._year:this.set(t,\"y\")},month:function(t){return 0===arguments.length?this._month:this.set(t,\"m\")},day:function(t){return 0===arguments.length?this._day:this.set(t,\"d\")},date:function(t,e,r){if(!this._calendar.isValid(t,e,r))throw(u.local.invalidDate||u.regionalOptions[\"\"].invalidDate).replace(/\\{0\\}/,this._calendar.local.name);return this._year=t,this._month=e,this._day=r,this},leapYear:function(){return this._calendar.leapYear(this)},epoch:function(){return this._calendar.epoch(this)},formatYear:function(){return this._calendar.formatYear(this)},monthOfYear:function(){return this._calendar.monthOfYear(this)},weekOfYear:function(){return this._calendar.weekOfYear(this)},daysInYear:function(){return this._calendar.daysInYear(this)},dayOfYear:function(){return this._calendar.dayOfYear(this)},daysInMonth:function(){return this._calendar.daysInMonth(this)},dayOfWeek:function(){return this._calendar.dayOfWeek(this)},weekDay:function(){return this._calendar.weekDay(this)},extraInfo:function(){return this._calendar.extraInfo(this)},add:function(t,e){return this._calendar.add(this,t,e)},set:function(t,e){return this._calendar.set(this,t,e)},compareTo:function(t){if(this._calendar.name!==t._calendar.name)throw(u.local.differentCalendars||u.regionalOptions[\"\"].differentCalendars).replace(/\\{0\\}/,this._calendar.local.name).replace(/\\{1\\}/,t._calendar.local.name);var e=this._year!==t._year?this._year-t._year:this._month!==t._month?this.monthOfYear()-t.monthOfYear():this._day-t._day;return 0===e?0:e<0?-1:1},calendar:function(){return this._calendar},toJD:function(){return this._calendar.toJD(this)},fromJD:function(t){return this._calendar.fromJD(t)},toJSDate:function(){return this._calendar.toJSDate(this)},fromJSDate:function(t){return this._calendar.fromJSDate(t)},toString:function(){return(this.year()<0?\"-\":\"\")+o(Math.abs(this.year()),4)+\"-\"+o(this.month(),2)+\"-\"+o(this.day(),2)}}),n(s.prototype,{_validateLevel:0,newDate:function(t,e,r){return null==t?this.today():(t.year&&(this._validate(t,e,r,u.local.invalidDate||u.regionalOptions[\"\"].invalidDate),r=t.day(),e=t.month(),t=t.year()),new a(this,t,e,r))},today:function(){return this.fromJSDate(new Date)},epoch:function(t){return this._validate(t,this.minMonth,this.minDay,u.local.invalidYear||u.regionalOptions[\"\"].invalidYear).year()<0?this.local.epochs[0]:this.local.epochs[1]},formatYear:function(t){var e=this._validate(t,this.minMonth,this.minDay,u.local.invalidYear||u.regionalOptions[\"\"].invalidYear);return(e.year()<0?\"-\":\"\")+o(Math.abs(e.year()),4)},monthsInYear:function(t){return this._validate(t,this.minMonth,this.minDay,u.local.invalidYear||u.regionalOptions[\"\"].invalidYear),12},monthOfYear:function(t,e){var r=this._validate(t,e,this.minDay,u.local.invalidMonth||u.regionalOptions[\"\"].invalidMonth);return(r.month()+this.monthsInYear(r)-this.firstMonth)%this.monthsInYear(r)+this.minMonth},fromMonthOfYear:function(t,e){var r=(e+this.firstMonth-2*this.minMonth)%this.monthsInYear(t)+this.minMonth;return this._validate(t,r,this.minDay,u.local.invalidMonth||u.regionalOptions[\"\"].invalidMonth),r},daysInYear:function(t){var e=this._validate(t,this.minMonth,this.minDay,u.local.invalidYear||u.regionalOptions[\"\"].invalidYear);return this.leapYear(e)?366:365},dayOfYear:function(t,e,r){var n=this._validate(t,e,r,u.local.invalidDate||u.regionalOptions[\"\"].invalidDate);return n.toJD()-this.newDate(n.year(),this.fromMonthOfYear(n.year(),this.minMonth),this.minDay).toJD()+1},daysInWeek:function(){return 7},dayOfWeek:function(t,e,r){var n=this._validate(t,e,r,u.local.invalidDate||u.regionalOptions[\"\"].invalidDate);return(Math.floor(this.toJD(n))+2)%this.daysInWeek()},extraInfo:function(t,e,r){return this._validate(t,e,r,u.local.invalidDate||u.regionalOptions[\"\"].invalidDate),{}},add:function(t,e,r){return this._validate(t,this.minMonth,this.minDay,u.local.invalidDate||u.regionalOptions[\"\"].invalidDate),this._correctAdd(t,this._add(t,e,r),e,r)},_add:function(t,e,r){if(this._validateLevel++,\"d\"===r||\"w\"===r){var n=t.toJD()+e*(\"w\"===r?this.daysInWeek():1),i=t.calendar().fromJD(n);return this._validateLevel--,[i.year(),i.month(),i.day()]}try{var a=t.year()+(\"y\"===r?e:0),o=t.monthOfYear()+(\"m\"===r?e:0);i=t.day(),\"y\"===r?(t.month()!==this.fromMonthOfYear(a,o)&&(o=this.newDate(a,t.month(),this.minDay).monthOfYear()),o=Math.min(o,this.monthsInYear(a)),i=Math.min(i,this.daysInMonth(a,this.fromMonthOfYear(a,o)))):\"m\"===r&&(function(t){for(;oe-1+t.minMonth;)a++,o-=e,e=t.monthsInYear(a)}(this),i=Math.min(i,this.daysInMonth(a,this.fromMonthOfYear(a,o))));var s=[a,this.fromMonthOfYear(a,o),i];return this._validateLevel--,s}catch(t){throw this._validateLevel--,t}},_correctAdd:function(t,e,r,n){if(!(this.hasYearZero||\"y\"!==n&&\"m\"!==n||0!==e[0]&&t.year()>0==e[0]>0)){var i={y:[1,1,\"y\"],m:[1,this.monthsInYear(-1),\"m\"],w:[this.daysInWeek(),this.daysInYear(-1),\"d\"],d:[1,this.daysInYear(-1),\"d\"]}[n],a=r<0?-1:1;e=this._add(t,r*i[0]+a*i[1],i[2])}return t.date(e[0],e[1],e[2])},set:function(t,e,r){this._validate(t,this.minMonth,this.minDay,u.local.invalidDate||u.regionalOptions[\"\"].invalidDate);var n=\"y\"===r?e:t.year(),i=\"m\"===r?e:t.month(),a=\"d\"===r?e:t.day();return\"y\"!==r&&\"m\"!==r||(a=Math.min(a,this.daysInMonth(n,i))),t.date(n,i,a)},isValid:function(t,e,r){this._validateLevel++;var n=this.hasYearZero||0!==t;if(n){var i=this.newDate(t,e,this.minDay);n=e>=this.minMonth&&e-this.minMonth=this.minDay&&r-this.minDay13.5?13:1),u=i-(l>2.5?4716:4715);return u<=0&&u--,this.newDate(u,l,s)},toJSDate:function(t,e,r){var n=this._validate(t,e,r,u.local.invalidDate||u.regionalOptions[\"\"].invalidDate),i=new Date(n.year(),n.month()-1,n.day());return i.setHours(0),i.setMinutes(0),i.setSeconds(0),i.setMilliseconds(0),i.setHours(i.getHours()>12?i.getHours()+2:0),i},fromJSDate:function(t){return this.newDate(t.getFullYear(),t.getMonth()+1,t.getDate())}});var u=t.exports=new i;u.cdate=a,u.baseCalendar=s,u.calendars.gregorian=l},15168:function(t,e,r){var n=r(50896),i=r(38700);n(i.regionalOptions[\"\"],{invalidArguments:\"Invalid arguments\",invalidFormat:\"Cannot format a date from another calendar\",missingNumberAt:\"Missing number at position {0}\",unknownNameAt:\"Unknown name at position {0}\",unexpectedLiteralAt:\"Unexpected literal at position {0}\",unexpectedText:\"Additional text found at end\"}),i.local=i.regionalOptions[\"\"],n(i.cdate.prototype,{formatDate:function(t,e){return\"string\"!=typeof t&&(e=t,t=\"\"),this._calendar.formatDate(t||\"\",this,e)}}),n(i.baseCalendar.prototype,{UNIX_EPOCH:i.instance().newDate(1970,1,1).toJD(),SECS_PER_DAY:86400,TICKS_EPOCH:i.instance().jdEpoch,TICKS_PER_DAY:864e9,ATOM:\"yyyy-mm-dd\",COOKIE:\"D, dd M yyyy\",FULL:\"DD, MM d, yyyy\",ISO_8601:\"yyyy-mm-dd\",JULIAN:\"J\",RFC_822:\"D, d M yy\",RFC_850:\"DD, dd-M-yy\",RFC_1036:\"D, d M yy\",RFC_1123:\"D, d M yyyy\",RFC_2822:\"D, d M yyyy\",RSS:\"D, d M yy\",TICKS:\"!\",TIMESTAMP:\"@\",W3C:\"yyyy-mm-dd\",formatDate:function(t,e,r){if(\"string\"!=typeof t&&(r=e,e=t,t=\"\"),!e)return\"\";if(e.calendar()!==this)throw i.local.invalidFormat||i.regionalOptions[\"\"].invalidFormat;t=t||this.local.dateFormat;for(var n,a,o,s=(r=r||{}).dayNamesShort||this.local.dayNamesShort,l=r.dayNames||this.local.dayNames,u=r.monthNumbers||this.local.monthNumbers,c=r.monthNamesShort||this.local.monthNamesShort,f=r.monthNames||this.local.monthNames,h=(r.calculateWeek||this.local.calculateWeek,function(e,r){for(var n=1;_+n1}),p=function(t,e,r,n){var i=\"\"+e;if(h(t,n))for(;i.length1},x=function(t,r){var n=m(t,r),a=[2,3,n?4:2,n?4:2,10,11,20][\"oyYJ@!\".indexOf(t)+1],o=new RegExp(\"^-?\\\\d{1,\"+a+\"}\"),s=e.substring(A).match(o);if(!s)throw(i.local.missingNumberAt||i.regionalOptions[\"\"].missingNumberAt).replace(/\\{0\\}/,A);return A+=s[0].length,parseInt(s[0],10)},b=this,_=function(){if(\"function\"==typeof l){m(\"m\");var t=l.call(b,e.substring(A));return A+=t.length,t}return x(\"m\")},w=function(t,r,n,a){for(var o=m(t,a)?n:r,s=0;s-1){p=1,d=v;for(var E=this.daysInMonth(h,p);d>E;E=this.daysInMonth(h,p))p++,d-=E}return f>-1?this.fromJD(f):this.newDate(h,p,d)},determineDate:function(t,e,r,n,i){r&&\"object\"!=typeof r&&(i=n,n=r,r=null),\"string\"!=typeof n&&(i=n,n=\"\");var a=this;return e=e?e.newDate():null,null==t?e:\"string\"==typeof t?function(t){try{return a.parseDate(n,t,i)}catch(t){}for(var e=((t=t.toLowerCase()).match(/^c/)&&r?r.newDate():null)||a.today(),o=/([+-]?[0-9]+)\\s*(d|w|m|y)?/g,s=o.exec(t);s;)e.add(parseInt(s[1],10),s[2]||\"d\"),s=o.exec(t);return e}(t):\"number\"==typeof t?isNaN(t)||t===1/0||t===-1/0?e:a.today().add(t,\"d\"):a.newDate(t)}})},21576:function(){},19768:function(){},63436:function(t,e,r){\"use strict\";var n=[\"BigInt64Array\",\"BigUint64Array\",\"Float32Array\",\"Float64Array\",\"Int16Array\",\"Int32Array\",\"Int8Array\",\"Uint16Array\",\"Uint32Array\",\"Uint8Array\",\"Uint8ClampedArray\"],i=\"undefined\"==typeof globalThis?r.g:globalThis;t.exports=function(){for(var t=[],e=0;e>8&15|e>>4&240,e>>4&15|240&e,(15&e)<<4|15&e,1):8===r?T(e>>24&255,e>>16&255,e>>8&255,(255&e)/255):4===r?T(e>>12&15|e>>8&240,e>>8&15|e>>4&240,e>>4&15|240&e,((15&e)<<4|15&e)/255):null):(e=h.exec(t))?new A(e[1],e[2],e[3],1):(e=p.exec(t))?new A(255*e[1]/100,255*e[2]/100,255*e[3]/100,1):(e=d.exec(t))?T(e[1],e[2],e[3],e[4]):(e=v.exec(t))?T(255*e[1]/100,255*e[2]/100,255*e[3]/100,e[4]):(e=g.exec(t))?P(e[1],e[2]/100,e[3]/100,1):(e=y.exec(t))?P(e[1],e[2]/100,e[3]/100,e[4]):m.hasOwnProperty(t)?w(m[t]):\"transparent\"===t?new A(NaN,NaN,NaN,0):null}function w(t){return new A(t>>16&255,t>>8&255,255&t,1)}function T(t,e,r,n){return n<=0&&(t=e=r=NaN),new A(t,e,r,n)}function k(t,e,r,n){return 1===arguments.length?((i=t)instanceof a||(i=_(i)),i?new A((i=i.rgb()).r,i.g,i.b,i.opacity):new A):new A(t,e,r,null==n?1:n);var i}function A(t,e,r,n){this.r=+t,this.g=+e,this.b=+r,this.opacity=+n}function M(){return\"#\".concat(C(this.r)).concat(C(this.g)).concat(C(this.b))}function S(){var t=E(this.opacity);return\"\".concat(1===t?\"rgb(\":\"rgba(\").concat(L(this.r),\", \").concat(L(this.g),\", \").concat(L(this.b)).concat(1===t?\")\":\", \".concat(t,\")\"))}function E(t){return isNaN(t)?1:Math.max(0,Math.min(1,t))}function L(t){return Math.max(0,Math.min(255,Math.round(t)||0))}function C(t){return((t=L(t))<16?\"0\":\"\")+t.toString(16)}function P(t,e,r,n){return n<=0?t=e=r=NaN:r<=0||r>=1?t=e=NaN:e<=0&&(t=NaN),new I(t,e,r,n)}function O(t){if(t instanceof I)return new I(t.h,t.s,t.l,t.opacity);if(t instanceof a||(t=_(t)),!t)return new I;if(t instanceof I)return t;var e=(t=t.rgb()).r/255,r=t.g/255,n=t.b/255,i=Math.min(e,r,n),o=Math.max(e,r,n),s=NaN,l=o-i,u=(o+i)/2;return l?(s=e===o?(r-n)/l+6*(r0&&u<1?0:s,new I(s,l,u,t.opacity)}function I(t,e,r,n){this.h=+t,this.s=+e,this.l=+r,this.opacity=+n}function z(t){return(t=(t||0)%360)<0?t+360:t}function D(t){return Math.max(0,Math.min(1,t||0))}function R(t,e,r){return 255*(t<60?e+(r-e)*t/60:t<180?r:t<240?e+(r-e)*(240-t)/60:e)}function F(t,e,r,n,i){var a=t*t,o=a*t;return((1-3*t+3*a-o)*e+(4-6*a+3*o)*r+(1+3*t+3*a-3*o)*n+o*i)/6}n(a,_,{copy:function(t){return Object.assign(new this.constructor,this,t)},displayable:function(){return this.rgb().displayable()},hex:x,formatHex:x,formatHex8:function(){return this.rgb().formatHex8()},formatHsl:function(){return O(this).formatHsl()},formatRgb:b,toString:b}),n(A,k,i(a,{brighter:function(t){return t=null==t?s:Math.pow(s,t),new A(this.r*t,this.g*t,this.b*t,this.opacity)},darker:function(t){return t=null==t?o:Math.pow(o,t),new A(this.r*t,this.g*t,this.b*t,this.opacity)},rgb:function(){return this},clamp:function(){return new A(L(this.r),L(this.g),L(this.b),E(this.opacity))},displayable:function(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:M,formatHex:M,formatHex8:function(){return\"#\".concat(C(this.r)).concat(C(this.g)).concat(C(this.b)).concat(C(255*(isNaN(this.opacity)?1:this.opacity)))},formatRgb:S,toString:S})),n(I,(function(t,e,r,n){return 1===arguments.length?O(t):new I(t,e,r,null==n?1:n)}),i(a,{brighter:function(t){return t=null==t?s:Math.pow(s,t),new I(this.h,this.s,this.l*t,this.opacity)},darker:function(t){return t=null==t?o:Math.pow(o,t),new I(this.h,this.s,this.l*t,this.opacity)},rgb:function(){var t=this.h%360+360*(this.h<0),e=isNaN(t)||isNaN(this.s)?0:this.s,r=this.l,n=r+(r<.5?r:1-r)*e,i=2*r-n;return new A(R(t>=240?t-240:t+120,i,n),R(t,i,n),R(t<120?t+240:t-120,i,n),this.opacity)},clamp:function(){return new I(z(this.h),D(this.s),D(this.l),E(this.opacity))},displayable:function(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl:function(){var t=E(this.opacity);return\"\".concat(1===t?\"hsl(\":\"hsla(\").concat(z(this.h),\", \").concat(100*D(this.s),\"%, \").concat(100*D(this.l),\"%\").concat(1===t?\")\":\", \".concat(t,\")\"))}}));var B=function(t){return function(){return t}};function N(t,e){var r=e-t;return r?function(t,e){return function(r){return t+r*e}}(t,r):B(isNaN(t)?e:t)}var j=function t(e){var r=function(t){return 1==(t=+t)?N:function(e,r){return r-e?function(t,e,r){return t=Math.pow(t,r),e=Math.pow(e,r)-t,r=1/r,function(n){return Math.pow(t+n*e,r)}}(e,r,t):B(isNaN(e)?r:e)}}(e);function n(t,e){var n=r((t=k(t)).r,(e=k(e)).r),i=r(t.g,e.g),a=r(t.b,e.b),o=N(t.opacity,e.opacity);return function(e){return t.r=n(e),t.g=i(e),t.b=a(e),t.opacity=o(e),t+\"\"}}return n.gamma=t,n}(1);function U(t){return function(e){var r,n,i=e.length,a=new Array(i),o=new Array(i),s=new Array(i);for(r=0;r=1?(r=1,e-1):Math.floor(r*e),i=t[n],a=t[n+1],o=n>0?t[n-1]:2*i-a,s=na&&(i=e.slice(a,i),s[o]?s[o]+=i:s[++o]=i),(r=r[0])===(n=n[0])?s[o]?s[o]+=n:s[++o]=n:(s[++o]=null,l.push({i:o,x:H(r,n)})),a=X.lastIndex;return a\n", + " " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "hoverinfo": "text", + "hovertext": "bd15781e-a765-43ba-b641-64cff386435f", + "line": { + "color": "lightgrey", + "width": 1 + }, + "mode": "lines", + "showlegend": false, + "type": "scatter", + "x": [ + 114272757, + 114371007 + ], + "y": [ + 2, + 2 + ] + }, + { + "hoverinfo": "text", + "hovertext": "62f58ea9-6228-4b3c-a00d-e8e4377c2d9a", + "line": { + "color": "lightgrey", + "width": 1 + }, + "mode": "lines", + "showlegend": false, + "type": "scatter", + "x": [ + 114273549, + 114407394 + ], + "y": [ + 0, + 0 + ] + }, + { + "hoverinfo": "text", + "hovertext": "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + "line": { + "color": "lightgrey", + "width": 1 + }, + "mode": "lines", + "showlegend": false, + "type": "scatter", + "x": [ + 114286982, + 114389604 + ], + "y": [ + 1, + 1 + ] + }, + { + "hoverinfo": "text", + "hovertext": "8a461cc7-ebdc-4456-98a6-afbd85560245", + "line": { + "color": "lightgrey", + "width": 1 + }, + "mode": "lines", + "showlegend": false, + "type": "scatter", + "x": [ + 114320500, + 114366576 + ], + "y": [ + 7, + 7 + ] + }, + { + "hoverinfo": "text", + "hovertext": "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + "line": { + "color": "lightgrey", + "width": 1 + }, + "mode": "lines", + "showlegend": false, + "type": "scatter", + "x": [ + 114323087, + 114361162 + ], + "y": [ + 11, + 11 + ] + }, + { + "hoverinfo": "text", + "hovertext": "4c30ceba-4a6a-41ba-8906-293ba44965d1", + "line": { + "color": "lightgrey", + "width": 1 + }, + "mode": "lines", + "showlegend": false, + "type": "scatter", + "x": [ + 114324537, + 114362163 + ], + "y": [ + 12, + 12 + ] + }, + { + "hoverinfo": "text", + "hovertext": "8db57d1c-ad62-47bc-a1fa-77489954f766", + "line": { + "color": "lightgrey", + "width": 1 + }, + "mode": "lines", + "showlegend": false, + "type": "scatter", + "x": [ + 114325720, + 114376439 + ], + "y": [ + 5, + 5 + ] + }, + { + "hoverinfo": "text", + "hovertext": "c4269dbc-9387-4644-a195-bab0ab597d21", + "line": { + "color": "lightgrey", + "width": 1 + }, + "mode": "lines", + "showlegend": false, + "type": "scatter", + "x": [ + 114332522, + 114390219 + ], + "y": [ + 4, + 4 + ] + }, + { + "hoverinfo": "text", + "hovertext": "c299b672-9ba1-430b-ae22-43d7591eead8", + "line": { + "color": "lightgrey", + "width": 1 + }, + "mode": "lines", + "showlegend": false, + "type": "scatter", + "x": [ + 114332525, + 114377428 + ], + "y": [ + 8, + 8 + ] + }, + { + "hoverinfo": "text", + "hovertext": "1b72803e-adef-4222-a6ac-262f2dd04db8", + "line": { + "color": "lightgrey", + "width": 1 + }, + "mode": "lines", + "showlegend": false, + "type": "scatter", + "x": [ + 114338510, + 114368055 + ], + "y": [ + 16, + 16 + ] + }, + { + "hoverinfo": "text", + "hovertext": "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + "line": { + "color": "lightgrey", + "width": 1 + }, + "mode": "lines", + "showlegend": false, + "type": "scatter", + "x": [ + 114339863, + 114386990 + ], + "y": [ + 6, + 6 + ] + }, + { + "hoverinfo": "text", + "hovertext": "66ca78ed-7f5e-4af3-93cd-0ceb736246ec", + "line": { + "color": "lightgrey", + "width": 1 + }, + "mode": "lines", + "showlegend": false, + "type": "scatter", + "x": [ + 114341066, + 114379357 + ], + "y": [ + 10, + 10 + ] + }, + { + "hoverinfo": "text", + "hovertext": "c06c775e-9473-423d-bb0f-48aaad4a7ad6", + "line": { + "color": "lightgrey", + "width": 1 + }, + "mode": "lines", + "showlegend": false, + "type": "scatter", + "x": [ + 114341117, + 114371835 + ], + "y": [ + 15, + 15 + ] + }, + { + "hoverinfo": "text", + "hovertext": "bdde52cf-4aed-42f6-80e5-e2c02b86596c", + "line": { + "color": "lightgrey", + "width": 1 + }, + "mode": "lines", + "showlegend": false, + "type": "scatter", + "x": [ + 114343597, + 114405294 + ], + "y": [ + 3, + 3 + ] + }, + { + "hoverinfo": "text", + "hovertext": "81abd2b7-68a5-44ce-9d92-c5790e68f0b6", + "line": { + "color": "lightgrey", + "width": 1 + }, + "mode": "lines", + "showlegend": false, + "type": "scatter", + "x": [ + 114346047, + 114359121 + ], + "y": [ + 23, + 23 + ] + }, + { + "hoverinfo": "text", + "hovertext": "d2f5df66-fe62-4723-b360-572dec3493c8", + "line": { + "color": "lightgrey", + "width": 1 + }, + "mode": "lines", + "showlegend": false, + "type": "scatter", + "x": [ + 114347104, + 114372936 + ], + "y": [ + 19, + 19 + ] + }, + { + "hoverinfo": "text", + "hovertext": "a865b338-ab12-4c49-910e-f4ef80af8677", + "line": { + "color": "lightgrey", + "width": 1 + }, + "mode": "lines", + "showlegend": false, + "type": "scatter", + "x": [ + 114348722, + 114383387 + ], + "y": [ + 14, + 14 + ] + }, + { + "hoverinfo": "text", + "hovertext": "34f01854-c28c-4ec6-a5ff-635d1327b18d", + "line": { + "color": "lightgrey", + "width": 1 + }, + "mode": "lines", + "showlegend": false, + "type": "scatter", + "x": [ + 114349315, + 114373482 + ], + "y": [ + 20, + 20 + ] + }, + { + "hoverinfo": "text", + "hovertext": "a054616a-0028-4b5e-877f-53b611ad2767", + "line": { + "color": "lightgrey", + "width": 1 + }, + "mode": "lines", + "showlegend": false, + "type": "scatter", + "x": [ + 114350271, + 114372234 + ], + "y": [ + 21, + 21 + ] + }, + { + "hoverinfo": "text", + "hovertext": "5a71d07f-4b9a-487c-8fa0-b9a26e2c626c", + "line": { + "color": "lightgrey", + "width": 1 + }, + "mode": "lines", + "showlegend": false, + "type": "scatter", + "x": [ + 114352078, + 114359682 + ], + "y": [ + 24, + 24 + ] + }, + { + "hoverinfo": "text", + "hovertext": "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + "line": { + "color": "lightgrey", + "width": 1 + }, + "mode": "lines", + "showlegend": false, + "type": "scatter", + "x": [ + 114352748, + 114379429 + ], + "y": [ + 18, + 18 + ] + }, + { + "hoverinfo": "text", + "hovertext": "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + "line": { + "color": "lightgrey", + "width": 1 + }, + "mode": "lines", + "showlegend": false, + "type": "scatter", + "x": [ + 114353092, + 114381301 + ], + "y": [ + 17, + 17 + ] + }, + { + "hoverinfo": "text", + "hovertext": "a6fcae27-656a-4f86-b117-02fee057fab6", + "line": { + "color": "lightgrey", + "width": 1 + }, + "mode": "lines", + "showlegend": false, + "type": "scatter", + "x": [ + 114353689, + 114360654 + ], + "y": [ + 25, + 25 + ] + }, + { + "hoverinfo": "text", + "hovertext": "49025607-57f8-4319-adfb-1d30dc5fca5a", + "line": { + "color": "lightgrey", + "width": 1 + }, + "mode": "lines", + "showlegend": false, + "type": "scatter", + "x": [ + 114353874, + 114393731 + ], + "y": [ + 9, + 9 + ] + }, + { + "hoverinfo": "text", + "hovertext": "0254472b-d540-423f-8589-cd6bc16c74c9", + "line": { + "color": "lightgrey", + "width": 1 + }, + "mode": "lines", + "showlegend": false, + "type": "scatter", + "x": [ + 114354714, + 114376509 + ], + "y": [ + 22, + 22 + ] + }, + { + "hoverinfo": "text", + "hovertext": "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + "line": { + "color": "lightgrey", + "width": 1 + }, + "mode": "lines", + "showlegend": false, + "type": "scatter", + "x": [ + 114356767, + 114393905 + ], + "y": [ + 13, + 13 + ] + }, + { + "hoverinfo": "text", + "hovertext": "ce306fa9-2d47-45dc-8d7a-2294fdcd5e25", + "line": { + "color": "lightgrey", + "width": 1 + }, + "mode": "lines", + "showlegend": false, + "type": "scatter", + "x": [ + 114357416, + 114360136 + ], + "y": [ + 26, + 26 + ] + }, + { + "customdata": [ + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.556640625 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.599609375 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.783203125 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.822265625 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.865234375 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.912109375 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.794921875 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.552734375 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.576171875 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.931640625 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.779296875 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.548828125 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.544921875 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.826171875 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.962890625 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.513671875 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.759765625 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.689453125 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.892578125 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.884765625 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.970703125 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.970703125 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.970703125 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.939453125 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.783203125 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.849609375 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.779296875 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.673828125 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.904296875 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.814453125 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.841796875 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.794921875 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.822265625 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.833984375 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.802734375 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.763671875 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.767578125 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.630859375 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.998046875 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.587890625 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.748046875 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.857421875 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.525390625 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.564453125 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.736328125 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.978515625 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.861328125 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.865234375 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.712890625 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.720703125 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.673828125 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.892578125 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.623046875 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.751953125 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.830078125 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.771484375 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.880859375 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.669921875 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.955078125 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.978515625 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.900390625 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.576171875 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.857421875 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.822265625 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.771484375 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.826171875 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.880859375 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.533203125 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.673828125 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.783203125 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.681640625 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.865234375 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.619140625 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.908203125 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.966796875 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.865234375 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.720703125 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.767578125 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.748046875 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.595703125 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.833984375 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.935546875 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.900390625 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.767578125 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.919921875 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.982421875 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.759765625 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.837890625 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.556640625 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.857421875 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.634765625 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.599609375 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.650390625 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.759765625 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.904296875 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.998046875 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.533203125 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.599609375 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.978515625 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.677734375 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.689453125 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.603515625 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.791015625 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.849609375 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.884765625 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.525390625 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.826171875 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.919921875 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.689453125 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.783203125 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.623046875 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.591796875 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.966796875 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.841796875 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.853515625 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.697265625 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.806640625 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.947265625 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.931640625 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.736328125 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.607421875 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.658203125 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.642578125 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.658203125 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.728515625 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.564453125 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.919921875 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.962890625 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.857421875 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.931640625 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.947265625 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.630859375 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.591796875 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.978515625 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.986328125 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.798828125 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.873046875 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.564453125 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.689453125 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.552734375 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.751953125 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.951171875 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.583984375 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.626953125 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.541015625 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.880859375 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.873046875 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.611328125 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.869140625 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.740234375 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.779296875 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.970703125 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.955078125 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.708984375 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.919921875 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.689453125 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.767578125 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.630859375 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.740234375 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.966796875 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.943359375 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.900390625 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.904296875 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.931640625 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.603515625 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.958984375 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.794921875 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.923828125 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.880859375 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.865234375 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.845703125 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.712890625 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.626953125 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.642578125 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.525390625 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.736328125 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.775390625 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.767578125 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.775390625 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.724609375 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.783203125 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.833984375 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.505859375 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.513671875 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.771484375 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.767578125 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.720703125 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.955078125 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.806640625 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.802734375 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.630859375 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.587890625 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.541015625 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.751953125 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.716796875 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.884765625 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.662109375 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.814453125 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.771484375 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.806640625 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.837890625 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.763671875 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.736328125 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.845703125 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.685546875 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.630859375 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.638671875 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.533203125 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.775390625 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.572265625 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.787109375 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.806640625 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.962890625 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.927734375 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.912109375 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.513671875 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.892578125 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.955078125 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.978515625 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.966796875 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.974609375 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.998046875 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.697265625 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.744140625 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.962890625 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.888671875 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.537109375 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.955078125 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.787109375 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.642578125 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.869140625 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.966796875 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.787109375 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.962890625 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.736328125 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.884765625 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.705078125 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.634765625 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.853515625 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.919921875 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.865234375 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.552734375 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.943359375 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.798828125 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.767578125 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.861328125 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.642578125 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.701171875 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.955078125 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.619140625 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.888671875 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.806640625 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.603515625 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.650390625 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.642578125 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.830078125 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.880859375 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.943359375 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.564453125 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.505859375 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.771484375 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.837890625 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.771484375 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.822265625 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.779296875 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.638671875 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.849609375 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.888671875 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.560546875 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.798828125 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.767578125 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.826171875 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.833984375 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.517578125 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.548828125 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.822265625 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.896484375 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.841796875 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.990234375 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.802734375 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.689453125 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.970703125 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.931640625 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.818359375 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.517578125 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.865234375 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.841796875 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.822265625 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.767578125 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.814453125 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.552734375 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.791015625 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.708984375 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.822265625 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.904296875 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.947265625 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.951171875 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.591796875 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.701171875 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.556640625 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.638671875 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.748046875 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.658203125 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.736328125 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.701171875 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.912109375 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.861328125 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.876953125 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.888671875 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.619140625 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.736328125 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.708984375 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.896484375 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.826171875 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.919921875 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.775390625 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.564453125 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.837890625 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.802734375 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.595703125 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.638671875 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.783203125 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.666015625 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.501953125 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.537109375 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.732421875 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.576171875 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.642578125 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.501953125 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.552734375 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.900390625 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.568359375 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.505859375 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.572265625 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.666015625 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.685546875 + ], + [ + "1b72803e-adef-4222-a6ac-262f2dd04db8", + 0.513671875 + ], + [ + "1b72803e-adef-4222-a6ac-262f2dd04db8", + 0.552734375 + ], + [ + "1b72803e-adef-4222-a6ac-262f2dd04db8", + 0.646484375 + ], + [ + "1b72803e-adef-4222-a6ac-262f2dd04db8", + 0.576171875 + ], + [ + "1b72803e-adef-4222-a6ac-262f2dd04db8", + 0.771484375 + ], + [ + "1b72803e-adef-4222-a6ac-262f2dd04db8", + 0.642578125 + ], + [ + "1b72803e-adef-4222-a6ac-262f2dd04db8", + 0.689453125 + ], + [ + "1b72803e-adef-4222-a6ac-262f2dd04db8", + 0.916015625 + ], + [ + "1b72803e-adef-4222-a6ac-262f2dd04db8", + 0.693359375 + ], + [ + "1b72803e-adef-4222-a6ac-262f2dd04db8", + 0.857421875 + ], + [ + "1b72803e-adef-4222-a6ac-262f2dd04db8", + 0.771484375 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.716796875 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.552734375 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.595703125 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.830078125 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.853515625 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.849609375 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.900390625 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.787109375 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.638671875 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.779296875 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.943359375 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.537109375 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.544921875 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.869140625 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.865234375 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.884765625 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.927734375 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.916015625 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.712890625 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.767578125 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.810546875 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.552734375 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.779296875 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.560546875 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.576171875 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.513671875 + ], + [ + "66ca78ed-7f5e-4af3-93cd-0ceb736246ec", + 0.705078125 + ], + [ + "66ca78ed-7f5e-4af3-93cd-0ceb736246ec", + 0.705078125 + ], + [ + "66ca78ed-7f5e-4af3-93cd-0ceb736246ec", + 0.974609375 + ], + [ + "66ca78ed-7f5e-4af3-93cd-0ceb736246ec", + 0.982421875 + ], + [ + "66ca78ed-7f5e-4af3-93cd-0ceb736246ec", + 0.892578125 + ], + [ + "66ca78ed-7f5e-4af3-93cd-0ceb736246ec", + 0.958984375 + ], + [ + "66ca78ed-7f5e-4af3-93cd-0ceb736246ec", + 0.826171875 + ], + [ + "66ca78ed-7f5e-4af3-93cd-0ceb736246ec", + 0.775390625 + ], + [ + "66ca78ed-7f5e-4af3-93cd-0ceb736246ec", + 0.634765625 + ], + [ + "66ca78ed-7f5e-4af3-93cd-0ceb736246ec", + 0.630859375 + ], + [ + "66ca78ed-7f5e-4af3-93cd-0ceb736246ec", + 0.638671875 + ], + [ + "bdde52cf-4aed-42f6-80e5-e2c02b86596c", + 0.583984375 + ], + [ + "bdde52cf-4aed-42f6-80e5-e2c02b86596c", + 0.626953125 + ], + [ + "bdde52cf-4aed-42f6-80e5-e2c02b86596c", + 0.771484375 + ], + [ + "bdde52cf-4aed-42f6-80e5-e2c02b86596c", + 0.572265625 + ], + [ + "bdde52cf-4aed-42f6-80e5-e2c02b86596c", + 0.931640625 + ], + [ + "bdde52cf-4aed-42f6-80e5-e2c02b86596c", + 0.884765625 + ], + [ + "bdde52cf-4aed-42f6-80e5-e2c02b86596c", + 0.857421875 + ], + [ + "bdde52cf-4aed-42f6-80e5-e2c02b86596c", + 0.666015625 + ], + [ + "bdde52cf-4aed-42f6-80e5-e2c02b86596c", + 0.955078125 + ], + [ + "bdde52cf-4aed-42f6-80e5-e2c02b86596c", + 0.630859375 + ], + [ + "bdde52cf-4aed-42f6-80e5-e2c02b86596c", + 0.712890625 + ], + [ + "bdde52cf-4aed-42f6-80e5-e2c02b86596c", + 0.716796875 + ], + [ + "bdde52cf-4aed-42f6-80e5-e2c02b86596c", + 0.708984375 + ], + [ + "bdde52cf-4aed-42f6-80e5-e2c02b86596c", + 0.833984375 + ], + [ + "bdde52cf-4aed-42f6-80e5-e2c02b86596c", + 0.791015625 + ], + [ + "bdde52cf-4aed-42f6-80e5-e2c02b86596c", + 0.951171875 + ], + [ + "bdde52cf-4aed-42f6-80e5-e2c02b86596c", + 0.548828125 + ], + [ + "bdde52cf-4aed-42f6-80e5-e2c02b86596c", + 0.744140625 + ], + [ + "bdde52cf-4aed-42f6-80e5-e2c02b86596c", + 0.701171875 + ], + [ + "bdde52cf-4aed-42f6-80e5-e2c02b86596c", + 0.931640625 + ], + [ + "bdde52cf-4aed-42f6-80e5-e2c02b86596c", + 0.900390625 + ], + [ + "bdde52cf-4aed-42f6-80e5-e2c02b86596c", + 0.955078125 + ], + [ + "bdde52cf-4aed-42f6-80e5-e2c02b86596c", + 0.935546875 + ], + [ + "bdde52cf-4aed-42f6-80e5-e2c02b86596c", + 0.892578125 + ], + [ + "bdde52cf-4aed-42f6-80e5-e2c02b86596c", + 0.837890625 + ], + [ + "bdde52cf-4aed-42f6-80e5-e2c02b86596c", + 0.607421875 + ], + [ + "bdde52cf-4aed-42f6-80e5-e2c02b86596c", + 0.576171875 + ], + [ + "bdde52cf-4aed-42f6-80e5-e2c02b86596c", + 0.869140625 + ], + [ + "bdde52cf-4aed-42f6-80e5-e2c02b86596c", + 0.705078125 + ], + [ + "bdde52cf-4aed-42f6-80e5-e2c02b86596c", + 0.548828125 + ], + [ + "bdde52cf-4aed-42f6-80e5-e2c02b86596c", + 0.994140625 + ], + [ + "bdde52cf-4aed-42f6-80e5-e2c02b86596c", + 0.873046875 + ], + [ + "bdde52cf-4aed-42f6-80e5-e2c02b86596c", + 0.892578125 + ], + [ + "bdde52cf-4aed-42f6-80e5-e2c02b86596c", + 0.607421875 + ], + [ + "bdde52cf-4aed-42f6-80e5-e2c02b86596c", + 0.896484375 + ], + [ + "bdde52cf-4aed-42f6-80e5-e2c02b86596c", + 0.919921875 + ], + [ + "bdde52cf-4aed-42f6-80e5-e2c02b86596c", + 0.685546875 + ], + [ + "bdde52cf-4aed-42f6-80e5-e2c02b86596c", + 0.537109375 + ], + [ + "bdde52cf-4aed-42f6-80e5-e2c02b86596c", + 0.857421875 + ], + [ + "bdde52cf-4aed-42f6-80e5-e2c02b86596c", + 0.884765625 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.603515625 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.521484375 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.779296875 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.603515625 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.599609375 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.501953125 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.572265625 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.923828125 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.677734375 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.755859375 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.876953125 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.884765625 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.943359375 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.759765625 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.884765625 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.568359375 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.576171875 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.708984375 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.767578125 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.900390625 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.888671875 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.599609375 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.908203125 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.916015625 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.861328125 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.896484375 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.908203125 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.904296875 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.908203125 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.900390625 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.939453125 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.587890625 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.626953125 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.818359375 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.701171875 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.505859375 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.556640625 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.955078125 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.931640625 + ], + [ + "a865b338-ab12-4c49-910e-f4ef80af8677", + 0.587890625 + ], + [ + "a865b338-ab12-4c49-910e-f4ef80af8677", + 0.736328125 + ], + [ + "a865b338-ab12-4c49-910e-f4ef80af8677", + 0.947265625 + ], + [ + "a865b338-ab12-4c49-910e-f4ef80af8677", + 0.791015625 + ], + [ + "a865b338-ab12-4c49-910e-f4ef80af8677", + 0.943359375 + ], + [ + "a865b338-ab12-4c49-910e-f4ef80af8677", + 0.880859375 + ], + [ + "a865b338-ab12-4c49-910e-f4ef80af8677", + 0.939453125 + ], + [ + "a865b338-ab12-4c49-910e-f4ef80af8677", + 0.833984375 + ], + [ + "a865b338-ab12-4c49-910e-f4ef80af8677", + 0.880859375 + ], + [ + "a865b338-ab12-4c49-910e-f4ef80af8677", + 0.958984375 + ], + [ + "a865b338-ab12-4c49-910e-f4ef80af8677", + 0.966796875 + ], + [ + "a865b338-ab12-4c49-910e-f4ef80af8677", + 0.833984375 + ], + [ + "a865b338-ab12-4c49-910e-f4ef80af8677", + 0.826171875 + ], + [ + "a865b338-ab12-4c49-910e-f4ef80af8677", + 0.908203125 + ], + [ + "a865b338-ab12-4c49-910e-f4ef80af8677", + 0.892578125 + ], + [ + "a865b338-ab12-4c49-910e-f4ef80af8677", + 0.892578125 + ], + [ + "a865b338-ab12-4c49-910e-f4ef80af8677", + 0.873046875 + ], + [ + "a865b338-ab12-4c49-910e-f4ef80af8677", + 0.501953125 + ], + [ + "a865b338-ab12-4c49-910e-f4ef80af8677", + 0.763671875 + ], + [ + "a865b338-ab12-4c49-910e-f4ef80af8677", + 0.623046875 + ], + [ + "a865b338-ab12-4c49-910e-f4ef80af8677", + 0.990234375 + ], + [ + "a865b338-ab12-4c49-910e-f4ef80af8677", + 0.505859375 + ], + [ + "a865b338-ab12-4c49-910e-f4ef80af8677", + 0.501953125 + ], + [ + "a865b338-ab12-4c49-910e-f4ef80af8677", + 0.833984375 + ], + [ + "a865b338-ab12-4c49-910e-f4ef80af8677", + 0.931640625 + ], + [ + "a865b338-ab12-4c49-910e-f4ef80af8677", + 0.912109375 + ], + [ + "a865b338-ab12-4c49-910e-f4ef80af8677", + 0.732421875 + ], + [ + "a865b338-ab12-4c49-910e-f4ef80af8677", + 0.896484375 + ], + [ + "a865b338-ab12-4c49-910e-f4ef80af8677", + 0.908203125 + ], + [ + "a865b338-ab12-4c49-910e-f4ef80af8677", + 0.908203125 + ], + [ + "a865b338-ab12-4c49-910e-f4ef80af8677", + 0.732421875 + ], + [ + "a865b338-ab12-4c49-910e-f4ef80af8677", + 0.521484375 + ], + [ + "a865b338-ab12-4c49-910e-f4ef80af8677", + 0.685546875 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.849609375 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.513671875 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.919921875 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.744140625 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.998046875 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.650390625 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.939453125 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.919921875 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.876953125 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.791015625 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.630859375 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.755859375 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.904296875 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.919921875 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.986328125 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.783203125 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.794921875 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.775390625 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.748046875 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.806640625 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.548828125 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.607421875 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.919921875 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.798828125 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.759765625 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.654296875 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.732421875 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.560546875 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.673828125 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.876953125 + ], + [ + "5a71d07f-4b9a-487c-8fa0-b9a26e2c626c", + 0.548828125 + ], + [ + "5a71d07f-4b9a-487c-8fa0-b9a26e2c626c", + 0.978515625 + ], + [ + "5a71d07f-4b9a-487c-8fa0-b9a26e2c626c", + 0.857421875 + ], + [ + "5a71d07f-4b9a-487c-8fa0-b9a26e2c626c", + 0.947265625 + ], + [ + "5a71d07f-4b9a-487c-8fa0-b9a26e2c626c", + 0.861328125 + ], + [ + "5a71d07f-4b9a-487c-8fa0-b9a26e2c626c", + 0.802734375 + ], + [ + "5a71d07f-4b9a-487c-8fa0-b9a26e2c626c", + 0.783203125 + ], + [ + "5a71d07f-4b9a-487c-8fa0-b9a26e2c626c", + 0.576171875 + ], + [ + "5a71d07f-4b9a-487c-8fa0-b9a26e2c626c", + 0.677734375 + ], + [ + "5a71d07f-4b9a-487c-8fa0-b9a26e2c626c", + 0.955078125 + ], + [ + "5a71d07f-4b9a-487c-8fa0-b9a26e2c626c", + 0.904296875 + ], + [ + "5a71d07f-4b9a-487c-8fa0-b9a26e2c626c", + 0.591796875 + ], + [ + "5a71d07f-4b9a-487c-8fa0-b9a26e2c626c", + 0.685546875 + ], + [ + "5a71d07f-4b9a-487c-8fa0-b9a26e2c626c", + 0.677734375 + ], + [ + "5a71d07f-4b9a-487c-8fa0-b9a26e2c626c", + 0.943359375 + ], + [ + "5a71d07f-4b9a-487c-8fa0-b9a26e2c626c", + 0.720703125 + ], + [ + "5a71d07f-4b9a-487c-8fa0-b9a26e2c626c", + 0.533203125 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.615234375 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.521484375 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.587890625 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.626953125 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.673828125 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.689453125 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.591796875 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.822265625 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.533203125 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.716796875 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.666015625 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.892578125 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.947265625 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.974609375 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.759765625 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.583984375 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.572265625 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.541015625 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.615234375 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.669921875 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.818359375 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.712890625 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.763671875 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.720703125 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.919921875 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.517578125 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.693359375 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.744140625 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.748046875 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.947265625 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.751953125 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.744140625 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.896484375 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.900390625 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.791015625 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.634765625 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.814453125 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.732421875 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.904296875 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.716796875 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.806640625 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.615234375 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.689453125 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.923828125 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.736328125 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.611328125 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.509765625 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.501953125 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.869140625 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.791015625 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.658203125 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.603515625 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.587890625 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.607421875 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.841796875 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.791015625 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.533203125 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.677734375 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.673828125 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.607421875 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.791015625 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.599609375 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.978515625 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.822265625 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.552734375 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.552734375 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.767578125 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.501953125 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.986328125 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.923828125 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.935546875 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.849609375 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.728515625 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.787109375 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.615234375 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.830078125 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.525390625 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.931640625 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.951171875 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.568359375 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.673828125 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.794921875 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.541015625 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.650390625 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.841796875 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.802734375 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.958984375 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.927734375 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.927734375 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.892578125 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.830078125 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.861328125 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.849609375 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.705078125 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.873046875 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.767578125 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.884765625 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.669921875 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.619140625 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.583984375 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.927734375 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.560546875 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.654296875 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.615234375 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.728515625 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.572265625 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.630859375 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.544921875 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.787109375 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.763671875 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.556640625 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.611328125 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.552734375 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.708984375 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.732421875 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.705078125 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.751953125 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.720703125 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.708984375 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.658203125 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.787109375 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.697265625 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.720703125 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.744140625 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.658203125 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.818359375 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.779296875 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.755859375 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.701171875 + ], + [ + "49025607-57f8-4319-adfb-1d30dc5fca5a", + 0.587890625 + ], + [ + "49025607-57f8-4319-adfb-1d30dc5fca5a", + 0.861328125 + ], + [ + "49025607-57f8-4319-adfb-1d30dc5fca5a", + 0.986328125 + ], + [ + "49025607-57f8-4319-adfb-1d30dc5fca5a", + 0.681640625 + ], + [ + "49025607-57f8-4319-adfb-1d30dc5fca5a", + 0.791015625 + ], + [ + "49025607-57f8-4319-adfb-1d30dc5fca5a", + 0.525390625 + ], + [ + "49025607-57f8-4319-adfb-1d30dc5fca5a", + 0.552734375 + ], + [ + "49025607-57f8-4319-adfb-1d30dc5fca5a", + 0.716796875 + ], + [ + "49025607-57f8-4319-adfb-1d30dc5fca5a", + 0.712890625 + ], + [ + "49025607-57f8-4319-adfb-1d30dc5fca5a", + 0.876953125 + ], + [ + "49025607-57f8-4319-adfb-1d30dc5fca5a", + 0.806640625 + ], + [ + "49025607-57f8-4319-adfb-1d30dc5fca5a", + 0.619140625 + ], + [ + "49025607-57f8-4319-adfb-1d30dc5fca5a", + 0.759765625 + ], + [ + "49025607-57f8-4319-adfb-1d30dc5fca5a", + 0.904296875 + ], + [ + "49025607-57f8-4319-adfb-1d30dc5fca5a", + 0.642578125 + ], + [ + "49025607-57f8-4319-adfb-1d30dc5fca5a", + 0.794921875 + ], + [ + "49025607-57f8-4319-adfb-1d30dc5fca5a", + 0.884765625 + ], + [ + "49025607-57f8-4319-adfb-1d30dc5fca5a", + 0.880859375 + ], + [ + "49025607-57f8-4319-adfb-1d30dc5fca5a", + 0.689453125 + ], + [ + "49025607-57f8-4319-adfb-1d30dc5fca5a", + 0.603515625 + ], + [ + "49025607-57f8-4319-adfb-1d30dc5fca5a", + 0.927734375 + ], + [ + "49025607-57f8-4319-adfb-1d30dc5fca5a", + 0.685546875 + ], + [ + "49025607-57f8-4319-adfb-1d30dc5fca5a", + 0.876953125 + ], + [ + "49025607-57f8-4319-adfb-1d30dc5fca5a", + 0.869140625 + ], + [ + "49025607-57f8-4319-adfb-1d30dc5fca5a", + 0.865234375 + ], + [ + "49025607-57f8-4319-adfb-1d30dc5fca5a", + 0.755859375 + ], + [ + "49025607-57f8-4319-adfb-1d30dc5fca5a", + 0.650390625 + ], + [ + "49025607-57f8-4319-adfb-1d30dc5fca5a", + 0.638671875 + ], + [ + "49025607-57f8-4319-adfb-1d30dc5fca5a", + 0.970703125 + ], + [ + "49025607-57f8-4319-adfb-1d30dc5fca5a", + 0.947265625 + ], + [ + "49025607-57f8-4319-adfb-1d30dc5fca5a", + 0.654296875 + ], + [ + "49025607-57f8-4319-adfb-1d30dc5fca5a", + 0.587890625 + ], + [ + "49025607-57f8-4319-adfb-1d30dc5fca5a", + 0.888671875 + ], + [ + "49025607-57f8-4319-adfb-1d30dc5fca5a", + 0.681640625 + ], + [ + "49025607-57f8-4319-adfb-1d30dc5fca5a", + 0.669921875 + ], + [ + "49025607-57f8-4319-adfb-1d30dc5fca5a", + 0.876953125 + ], + [ + "49025607-57f8-4319-adfb-1d30dc5fca5a", + 0.681640625 + ], + [ + "49025607-57f8-4319-adfb-1d30dc5fca5a", + 0.966796875 + ], + [ + "49025607-57f8-4319-adfb-1d30dc5fca5a", + 0.892578125 + ], + [ + "0254472b-d540-423f-8589-cd6bc16c74c9", + 0.873046875 + ], + [ + "0254472b-d540-423f-8589-cd6bc16c74c9", + 0.955078125 + ], + [ + "0254472b-d540-423f-8589-cd6bc16c74c9", + 0.853515625 + ], + [ + "0254472b-d540-423f-8589-cd6bc16c74c9", + 0.544921875 + ], + [ + "0254472b-d540-423f-8589-cd6bc16c74c9", + 0.720703125 + ], + [ + "0254472b-d540-423f-8589-cd6bc16c74c9", + 0.802734375 + ], + [ + "0254472b-d540-423f-8589-cd6bc16c74c9", + 0.912109375 + ], + [ + "0254472b-d540-423f-8589-cd6bc16c74c9", + 0.791015625 + ], + [ + "0254472b-d540-423f-8589-cd6bc16c74c9", + 0.826171875 + ], + [ + "0254472b-d540-423f-8589-cd6bc16c74c9", + 0.650390625 + ], + [ + "0254472b-d540-423f-8589-cd6bc16c74c9", + 0.580078125 + ], + [ + "0254472b-d540-423f-8589-cd6bc16c74c9", + 0.982421875 + ], + [ + "0254472b-d540-423f-8589-cd6bc16c74c9", + 0.830078125 + ], + [ + "0254472b-d540-423f-8589-cd6bc16c74c9", + 0.517578125 + ], + [ + "0254472b-d540-423f-8589-cd6bc16c74c9", + 0.572265625 + ], + [ + "0254472b-d540-423f-8589-cd6bc16c74c9", + 0.771484375 + ], + [ + "0254472b-d540-423f-8589-cd6bc16c74c9", + 0.794921875 + ], + [ + "0254472b-d540-423f-8589-cd6bc16c74c9", + 0.560546875 + ], + [ + "0254472b-d540-423f-8589-cd6bc16c74c9", + 0.509765625 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.744140625 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.947265625 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.974609375 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.533203125 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.587890625 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.533203125 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.501953125 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.580078125 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.849609375 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.923828125 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.544921875 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.662109375 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.771484375 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.900390625 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.783203125 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.876953125 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.525390625 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.669921875 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.552734375 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.771484375 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.705078125 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.705078125 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.669921875 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.662109375 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.587890625 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.791015625 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.607421875 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.779296875 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.822265625 + ], + [ + "ce306fa9-2d47-45dc-8d7a-2294fdcd5e25", + 0.798828125 + ], + [ + "ce306fa9-2d47-45dc-8d7a-2294fdcd5e25", + 0.966796875 + ], + [ + "ce306fa9-2d47-45dc-8d7a-2294fdcd5e25", + 0.873046875 + ], + [ + "ce306fa9-2d47-45dc-8d7a-2294fdcd5e25", + 0.923828125 + ], + [ + "ce306fa9-2d47-45dc-8d7a-2294fdcd5e25", + 0.697265625 + ], + [ + "ce306fa9-2d47-45dc-8d7a-2294fdcd5e25", + 0.759765625 + ], + [ + "ce306fa9-2d47-45dc-8d7a-2294fdcd5e25", + 0.638671875 + ], + [ + "ce306fa9-2d47-45dc-8d7a-2294fdcd5e25", + 0.998046875 + ], + [ + "ce306fa9-2d47-45dc-8d7a-2294fdcd5e25", + 0.919921875 + ], + [ + "ce306fa9-2d47-45dc-8d7a-2294fdcd5e25", + 0.916015625 + ] + ], + "hovertemplate": "Read: %{customdata[0]}
Position: %{x:,}
Probability: %{customdata[1]:.2f}", + "marker": { + "color": [ + 0.556640625, + 0.599609375, + 0.783203125, + 0.822265625, + 0.865234375, + 0.912109375, + 0.794921875, + 0.552734375, + 0.576171875, + 0.931640625, + 0.779296875, + 0.548828125, + 0.544921875, + 0.826171875, + 0.962890625, + 0.513671875, + 0.759765625, + 0.689453125, + 0.892578125, + 0.884765625, + 0.970703125, + 0.970703125, + 0.970703125, + 0.939453125, + 0.783203125, + 0.849609375, + 0.779296875, + 0.673828125, + 0.904296875, + 0.814453125, + 0.841796875, + 0.794921875, + 0.822265625, + 0.833984375, + 0.802734375, + 0.763671875, + 0.767578125, + 0.630859375, + 0.998046875, + 0.587890625, + 0.748046875, + 0.857421875, + 0.525390625, + 0.564453125, + 0.736328125, + 0.978515625, + 0.861328125, + 0.865234375, + 0.712890625, + 0.720703125, + 0.673828125, + 0.892578125, + 0.623046875, + 0.751953125, + 0.830078125, + 0.771484375, + 0.880859375, + 0.669921875, + 0.955078125, + 0.978515625, + 0.900390625, + 0.576171875, + 0.857421875, + 0.822265625, + 0.771484375, + 0.826171875, + 0.880859375, + 0.533203125, + 0.673828125, + 0.783203125, + 0.681640625, + 0.865234375, + 0.619140625, + 0.908203125, + 0.966796875, + 0.865234375, + 0.720703125, + 0.767578125, + 0.748046875, + 0.595703125, + 0.833984375, + 0.935546875, + 0.900390625, + 0.767578125, + 0.919921875, + 0.982421875, + 0.759765625, + 0.837890625, + 0.556640625, + 0.857421875, + 0.634765625, + 0.599609375, + 0.650390625, + 0.759765625, + 0.904296875, + 0.998046875, + 0.533203125, + 0.599609375, + 0.978515625, + 0.677734375, + 0.689453125, + 0.603515625, + 0.791015625, + 0.849609375, + 0.884765625, + 0.525390625, + 0.826171875, + 0.919921875, + 0.689453125, + 0.783203125, + 0.623046875, + 0.591796875, + 0.966796875, + 0.841796875, + 0.853515625, + 0.697265625, + 0.806640625, + 0.947265625, + 0.931640625, + 0.736328125, + 0.607421875, + 0.658203125, + 0.642578125, + 0.658203125, + 0.728515625, + 0.564453125, + 0.919921875, + 0.962890625, + 0.857421875, + 0.931640625, + 0.947265625, + 0.630859375, + 0.591796875, + 0.978515625, + 0.986328125, + 0.798828125, + 0.873046875, + 0.564453125, + 0.689453125, + 0.552734375, + 0.751953125, + 0.951171875, + 0.583984375, + 0.626953125, + 0.541015625, + 0.880859375, + 0.873046875, + 0.611328125, + 0.869140625, + 0.740234375, + 0.779296875, + 0.970703125, + 0.955078125, + 0.708984375, + 0.919921875, + 0.689453125, + 0.767578125, + 0.630859375, + 0.740234375, + 0.966796875, + 0.943359375, + 0.900390625, + 0.904296875, + 0.931640625, + 0.603515625, + 0.958984375, + 0.794921875, + 0.923828125, + 0.880859375, + 0.865234375, + 0.845703125, + 0.712890625, + 0.626953125, + 0.642578125, + 0.525390625, + 0.736328125, + 0.775390625, + 0.767578125, + 0.775390625, + 0.724609375, + 0.783203125, + 0.833984375, + 0.505859375, + 0.513671875, + 0.771484375, + 0.767578125, + 0.720703125, + 0.955078125, + 0.806640625, + 0.802734375, + 0.630859375, + 0.587890625, + 0.541015625, + 0.751953125, + 0.716796875, + 0.884765625, + 0.662109375, + 0.814453125, + 0.771484375, + 0.806640625, + 0.837890625, + 0.763671875, + 0.736328125, + 0.845703125, + 0.685546875, + 0.630859375, + 0.638671875, + 0.533203125, + 0.775390625, + 0.572265625, + 0.787109375, + 0.806640625, + 0.962890625, + 0.927734375, + 0.912109375, + 0.513671875, + 0.892578125, + 0.955078125, + 0.978515625, + 0.966796875, + 0.974609375, + 0.998046875, + 0.697265625, + 0.744140625, + 0.962890625, + 0.888671875, + 0.537109375, + 0.955078125, + 0.787109375, + 0.642578125, + 0.869140625, + 0.966796875, + 0.787109375, + 0.962890625, + 0.736328125, + 0.884765625, + 0.705078125, + 0.634765625, + 0.853515625, + 0.919921875, + 0.865234375, + 0.552734375, + 0.943359375, + 0.798828125, + 0.767578125, + 0.861328125, + 0.642578125, + 0.701171875, + 0.955078125, + 0.619140625, + 0.888671875, + 0.806640625, + 0.603515625, + 0.650390625, + 0.642578125, + 0.830078125, + 0.880859375, + 0.943359375, + 0.564453125, + 0.505859375, + 0.771484375, + 0.837890625, + 0.771484375, + 0.822265625, + 0.779296875, + 0.638671875, + 0.849609375, + 0.888671875, + 0.560546875, + 0.798828125, + 0.767578125, + 0.826171875, + 0.833984375, + 0.517578125, + 0.548828125, + 0.822265625, + 0.896484375, + 0.841796875, + 0.990234375, + 0.802734375, + 0.689453125, + 0.970703125, + 0.931640625, + 0.818359375, + 0.517578125, + 0.865234375, + 0.841796875, + 0.822265625, + 0.767578125, + 0.814453125, + 0.552734375, + 0.791015625, + 0.708984375, + 0.822265625, + 0.904296875, + 0.947265625, + 0.951171875, + 0.591796875, + 0.701171875, + 0.556640625, + 0.638671875, + 0.748046875, + 0.658203125, + 0.736328125, + 0.701171875, + 0.912109375, + 0.861328125, + 0.876953125, + 0.888671875, + 0.619140625, + 0.736328125, + 0.708984375, + 0.896484375, + 0.826171875, + 0.919921875, + 0.775390625, + 0.564453125, + 0.837890625, + 0.802734375, + 0.595703125, + 0.638671875, + 0.783203125, + 0.666015625, + 0.501953125, + 0.537109375, + 0.732421875, + 0.576171875, + 0.642578125, + 0.501953125, + 0.552734375, + 0.900390625, + 0.568359375, + 0.505859375, + 0.572265625, + 0.666015625, + 0.685546875, + 0.513671875, + 0.552734375, + 0.646484375, + 0.576171875, + 0.771484375, + 0.642578125, + 0.689453125, + 0.916015625, + 0.693359375, + 0.857421875, + 0.771484375, + 0.716796875, + 0.552734375, + 0.595703125, + 0.830078125, + 0.853515625, + 0.849609375, + 0.900390625, + 0.787109375, + 0.638671875, + 0.779296875, + 0.943359375, + 0.537109375, + 0.544921875, + 0.869140625, + 0.865234375, + 0.884765625, + 0.927734375, + 0.916015625, + 0.712890625, + 0.767578125, + 0.810546875, + 0.552734375, + 0.779296875, + 0.560546875, + 0.576171875, + 0.513671875, + 0.705078125, + 0.705078125, + 0.974609375, + 0.982421875, + 0.892578125, + 0.958984375, + 0.826171875, + 0.775390625, + 0.634765625, + 0.630859375, + 0.638671875, + 0.583984375, + 0.626953125, + 0.771484375, + 0.572265625, + 0.931640625, + 0.884765625, + 0.857421875, + 0.666015625, + 0.955078125, + 0.630859375, + 0.712890625, + 0.716796875, + 0.708984375, + 0.833984375, + 0.791015625, + 0.951171875, + 0.548828125, + 0.744140625, + 0.701171875, + 0.931640625, + 0.900390625, + 0.955078125, + 0.935546875, + 0.892578125, + 0.837890625, + 0.607421875, + 0.576171875, + 0.869140625, + 0.705078125, + 0.548828125, + 0.994140625, + 0.873046875, + 0.892578125, + 0.607421875, + 0.896484375, + 0.919921875, + 0.685546875, + 0.537109375, + 0.857421875, + 0.884765625, + 0.603515625, + 0.521484375, + 0.779296875, + 0.603515625, + 0.599609375, + 0.501953125, + 0.572265625, + 0.923828125, + 0.677734375, + 0.755859375, + 0.876953125, + 0.884765625, + 0.943359375, + 0.759765625, + 0.884765625, + 0.568359375, + 0.576171875, + 0.708984375, + 0.767578125, + 0.900390625, + 0.888671875, + 0.599609375, + 0.908203125, + 0.916015625, + 0.861328125, + 0.896484375, + 0.908203125, + 0.904296875, + 0.908203125, + 0.900390625, + 0.939453125, + 0.587890625, + 0.626953125, + 0.818359375, + 0.701171875, + 0.505859375, + 0.556640625, + 0.955078125, + 0.931640625, + 0.587890625, + 0.736328125, + 0.947265625, + 0.791015625, + 0.943359375, + 0.880859375, + 0.939453125, + 0.833984375, + 0.880859375, + 0.958984375, + 0.966796875, + 0.833984375, + 0.826171875, + 0.908203125, + 0.892578125, + 0.892578125, + 0.873046875, + 0.501953125, + 0.763671875, + 0.623046875, + 0.990234375, + 0.505859375, + 0.501953125, + 0.833984375, + 0.931640625, + 0.912109375, + 0.732421875, + 0.896484375, + 0.908203125, + 0.908203125, + 0.732421875, + 0.521484375, + 0.685546875, + 0.849609375, + 0.513671875, + 0.919921875, + 0.744140625, + 0.998046875, + 0.650390625, + 0.939453125, + 0.919921875, + 0.876953125, + 0.791015625, + 0.630859375, + 0.755859375, + 0.904296875, + 0.919921875, + 0.986328125, + 0.783203125, + 0.794921875, + 0.775390625, + 0.748046875, + 0.806640625, + 0.548828125, + 0.607421875, + 0.919921875, + 0.798828125, + 0.759765625, + 0.654296875, + 0.732421875, + 0.560546875, + 0.673828125, + 0.876953125, + 0.548828125, + 0.978515625, + 0.857421875, + 0.947265625, + 0.861328125, + 0.802734375, + 0.783203125, + 0.576171875, + 0.677734375, + 0.955078125, + 0.904296875, + 0.591796875, + 0.685546875, + 0.677734375, + 0.943359375, + 0.720703125, + 0.533203125, + 0.615234375, + 0.521484375, + 0.587890625, + 0.626953125, + 0.673828125, + 0.689453125, + 0.591796875, + 0.822265625, + 0.533203125, + 0.716796875, + 0.666015625, + 0.892578125, + 0.947265625, + 0.974609375, + 0.759765625, + 0.583984375, + 0.572265625, + 0.541015625, + 0.615234375, + 0.669921875, + 0.818359375, + 0.712890625, + 0.763671875, + 0.720703125, + 0.919921875, + 0.517578125, + 0.693359375, + 0.744140625, + 0.748046875, + 0.947265625, + 0.751953125, + 0.744140625, + 0.896484375, + 0.900390625, + 0.791015625, + 0.634765625, + 0.814453125, + 0.732421875, + 0.904296875, + 0.716796875, + 0.806640625, + 0.615234375, + 0.689453125, + 0.923828125, + 0.736328125, + 0.611328125, + 0.509765625, + 0.501953125, + 0.869140625, + 0.791015625, + 0.658203125, + 0.603515625, + 0.587890625, + 0.607421875, + 0.841796875, + 0.791015625, + 0.533203125, + 0.677734375, + 0.673828125, + 0.607421875, + 0.791015625, + 0.599609375, + 0.978515625, + 0.822265625, + 0.552734375, + 0.552734375, + 0.767578125, + 0.501953125, + 0.986328125, + 0.923828125, + 0.935546875, + 0.849609375, + 0.728515625, + 0.787109375, + 0.615234375, + 0.830078125, + 0.525390625, + 0.931640625, + 0.951171875, + 0.568359375, + 0.673828125, + 0.794921875, + 0.541015625, + 0.650390625, + 0.841796875, + 0.802734375, + 0.958984375, + 0.927734375, + 0.927734375, + 0.892578125, + 0.830078125, + 0.861328125, + 0.849609375, + 0.705078125, + 0.873046875, + 0.767578125, + 0.884765625, + 0.669921875, + 0.619140625, + 0.583984375, + 0.927734375, + 0.560546875, + 0.654296875, + 0.615234375, + 0.728515625, + 0.572265625, + 0.630859375, + 0.544921875, + 0.787109375, + 0.763671875, + 0.556640625, + 0.611328125, + 0.552734375, + 0.708984375, + 0.732421875, + 0.705078125, + 0.751953125, + 0.720703125, + 0.708984375, + 0.658203125, + 0.787109375, + 0.697265625, + 0.720703125, + 0.744140625, + 0.658203125, + 0.818359375, + 0.779296875, + 0.755859375, + 0.701171875, + 0.587890625, + 0.861328125, + 0.986328125, + 0.681640625, + 0.791015625, + 0.525390625, + 0.552734375, + 0.716796875, + 0.712890625, + 0.876953125, + 0.806640625, + 0.619140625, + 0.759765625, + 0.904296875, + 0.642578125, + 0.794921875, + 0.884765625, + 0.880859375, + 0.689453125, + 0.603515625, + 0.927734375, + 0.685546875, + 0.876953125, + 0.869140625, + 0.865234375, + 0.755859375, + 0.650390625, + 0.638671875, + 0.970703125, + 0.947265625, + 0.654296875, + 0.587890625, + 0.888671875, + 0.681640625, + 0.669921875, + 0.876953125, + 0.681640625, + 0.966796875, + 0.892578125, + 0.873046875, + 0.955078125, + 0.853515625, + 0.544921875, + 0.720703125, + 0.802734375, + 0.912109375, + 0.791015625, + 0.826171875, + 0.650390625, + 0.580078125, + 0.982421875, + 0.830078125, + 0.517578125, + 0.572265625, + 0.771484375, + 0.794921875, + 0.560546875, + 0.509765625, + 0.744140625, + 0.947265625, + 0.974609375, + 0.533203125, + 0.587890625, + 0.533203125, + 0.501953125, + 0.580078125, + 0.849609375, + 0.923828125, + 0.544921875, + 0.662109375, + 0.771484375, + 0.900390625, + 0.783203125, + 0.876953125, + 0.525390625, + 0.669921875, + 0.552734375, + 0.771484375, + 0.705078125, + 0.705078125, + 0.669921875, + 0.662109375, + 0.587890625, + 0.791015625, + 0.607421875, + 0.779296875, + 0.822265625, + 0.798828125, + 0.966796875, + 0.873046875, + 0.923828125, + 0.697265625, + 0.759765625, + 0.638671875, + 0.998046875, + 0.919921875, + 0.916015625 + ], + "colorbar": { + "thickness": 15, + "tickmode": "array", + "ticks": "outside", + "ticktext": [ + "0.5", + "1.0" + ], + "tickvals": [ + 0.501953125, + 0.998046875 + ], + "title": { + "side": "right", + "text": "A,0 probability" + }, + "x": 1, + "y": 0.5 + }, + "colorscale": [ + [ + 0, + "white" + ], + [ + 1, + "blue" + ] + ], + "size": 4 + }, + "mode": "markers", + "showlegend": false, + "type": "scatter", + "x": [ + 114356450, + 114356488, + 114356815, + 114356844, + 114356846, + 114356848, + 114356861, + 114356863, + 114357034, + 114357036, + 114357037, + 114357038, + 114358452, + 114358475, + 114358503, + 114358506, + 114358522, + 114358523, + 114358532, + 114358547, + 114358613, + 114358615, + 114358616, + 114358618, + 114358622, + 114358773, + 114358775, + 114359477, + 114359500, + 114359503, + 114359552, + 114359558, + 114359563, + 114359565, + 114359567, + 114359568, + 114359569, + 114359667, + 114359700, + 114356551, + 114356570, + 114356572, + 114356618, + 114356620, + 114356622, + 114356637, + 114356820, + 114356822, + 114356864, + 114356869, + 114356873, + 114356875, + 114358280, + 114358426, + 114358457, + 114358459, + 114358478, + 114358480, + 114358508, + 114358510, + 114358512, + 114358611, + 114358706, + 114358707, + 114358710, + 114358711, + 114358713, + 114358799, + 114358813, + 114358822, + 114358825, + 114358828, + 114358831, + 114358988, + 114358990, + 114359015, + 114359017, + 114359026, + 114359028, + 114359056, + 114359221, + 114359222, + 114359225, + 114359226, + 114359236, + 114359396, + 114359457, + 114359459, + 114359522, + 114359604, + 114359607, + 114359704, + 114359784, + 114359786, + 114359806, + 114359807, + 114360178, + 114360180, + 114360416, + 114361356, + 114361357, + 114356480, + 114357051, + 114357052, + 114357056, + 114357058, + 114358256, + 114358257, + 114358260, + 114358261, + 114358301, + 114358447, + 114358457, + 114358459, + 114358478, + 114358480, + 114358508, + 114358510, + 114358512, + 114358531, + 114358539, + 114358575, + 114358577, + 114358632, + 114358645, + 114358679, + 114358681, + 114359015, + 114359017, + 114359026, + 114359028, + 114359043, + 114359045, + 114359582, + 114359583, + 114359599, + 114359602, + 114359604, + 114359911, + 114359914, + 114359916, + 114359918, + 114360279, + 114360280, + 114360281, + 114360634, + 114360673, + 114360852, + 114360870, + 114360871, + 114361050, + 114361052, + 114361054, + 114361064, + 114361066, + 114361104, + 114361105, + 114358457, + 114358459, + 114358478, + 114358480, + 114358508, + 114358510, + 114358512, + 114358519, + 114358531, + 114358572, + 114358575, + 114358577, + 114358578, + 114358587, + 114358632, + 114358638, + 114358657, + 114358658, + 114358706, + 114358707, + 114358720, + 114359911, + 114359914, + 114359916, + 114359918, + 114360010, + 114360077, + 114360327, + 114360328, + 114360329, + 114356951, + 114356953, + 114357019, + 114357546, + 114357564, + 114357702, + 114357704, + 114357705, + 114357707, + 114357732, + 114357733, + 114357736, + 114358013, + 114358059, + 114358068, + 114358379, + 114358381, + 114358409, + 114358410, + 114358411, + 114358412, + 114358447, + 114358450, + 114358457, + 114358459, + 114358508, + 114358510, + 114358512, + 114358531, + 114358572, + 114358575, + 114358577, + 114358578, + 114358591, + 114358592, + 114358657, + 114358658, + 114358713, + 114358736, + 114358891, + 114359015, + 114359017, + 114359026, + 114359351, + 114359352, + 114359369, + 114359387, + 114359602, + 114359990, + 114359994, + 114359995, + 114360570, + 114360572, + 114360583, + 114360614, + 114360616, + 114360805, + 114360806, + 114360807, + 114360851, + 114360852, + 114360863, + 114361032, + 114361480, + 114361482, + 114358134, + 114358138, + 114358276, + 114358277, + 114358290, + 114358292, + 114358457, + 114358478, + 114358508, + 114358510, + 114358512, + 114358531, + 114358555, + 114358575, + 114358577, + 114358578, + 114358587, + 114358645, + 114358679, + 114358681, + 114361359, + 114361360, + 114361432, + 114355941, + 114355975, + 114355977, + 114356551, + 114356749, + 114358508, + 114358510, + 114358512, + 114358548, + 114358572, + 114358575, + 114358577, + 114358578, + 114358587, + 114358632, + 114359004, + 114359006, + 114359157, + 114359158, + 114359160, + 114359161, + 114359162, + 114359330, + 114359331, + 114359347, + 114359351, + 114359352, + 114359432, + 114359433, + 114359435, + 114359516, + 114359518, + 114359554, + 114359556, + 114359582, + 114359693, + 114359695, + 114359709, + 114359720, + 114359722, + 114359760, + 114359763, + 114359905, + 114359906, + 114359914, + 114359916, + 114359918, + 114359961, + 114359962, + 114359963, + 114360151, + 114360152, + 114360158, + 114360233, + 114360234, + 114360338, + 114360341, + 114360369, + 114360370, + 114361124, + 114361163, + 114356435, + 114356438, + 114358364, + 114358365, + 114358366, + 114358368, + 114358503, + 114358547, + 114358628, + 114358661, + 114358662, + 114358270, + 114358283, + 114358285, + 114358452, + 114358473, + 114358474, + 114358475, + 114358503, + 114358506, + 114358532, + 114358547, + 114358557, + 114358560, + 114358655, + 114358661, + 114358662, + 114358664, + 114358665, + 114358698, + 114359385, + 114359388, + 114359598, + 114359601, + 114359640, + 114361462, + 114361463, + 114358457, + 114358459, + 114358508, + 114358510, + 114358512, + 114358531, + 114358548, + 114358555, + 114358572, + 114358577, + 114358578, + 114356546, + 114356548, + 114357693, + 114357725, + 114357740, + 114358393, + 114358394, + 114358406, + 114358424, + 114358438, + 114358442, + 114358443, + 114358475, + 114358503, + 114358532, + 114358547, + 114358613, + 114358615, + 114358616, + 114358655, + 114358656, + 114358661, + 114358662, + 114358664, + 114358665, + 114358674, + 114358675, + 114358688, + 114358689, + 114358698, + 114358714, + 114358716, + 114358719, + 114358722, + 114358732, + 114358733, + 114358882, + 114359202, + 114359587, + 114359588, + 114358279, + 114358280, + 114358430, + 114358447, + 114358478, + 114358500, + 114358508, + 114358510, + 114358512, + 114358531, + 114358577, + 114358578, + 114358632, + 114358638, + 114358645, + 114358657, + 114358658, + 114358679, + 114358681, + 114358706, + 114358707, + 114358710, + 114358711, + 114358720, + 114358736, + 114359015, + 114359017, + 114359026, + 114359028, + 114359330, + 114359331, + 114359351, + 114359352, + 114359396, + 114359549, + 114359562, + 114359701, + 114359720, + 114359722, + 114358452, + 114358475, + 114358503, + 114358506, + 114358522, + 114358523, + 114358532, + 114358547, + 114358613, + 114358615, + 114358616, + 114358633, + 114358656, + 114358661, + 114358662, + 114358664, + 114358665, + 114358700, + 114359574, + 114359575, + 114359893, + 114359933, + 114360068, + 114360238, + 114360240, + 114360241, + 114360250, + 114360265, + 114360269, + 114360271, + 114360273, + 114360274, + 114360290, + 114358170, + 114358443, + 114358503, + 114358506, + 114358532, + 114358590, + 114356267, + 114356637, + 114357444, + 114358478, + 114358491, + 114358508, + 114358510, + 114358512, + 114358531, + 114358575, + 114358577, + 114358578, + 114358585, + 114358828, + 114358831, + 114358930, + 114359015, + 114359017, + 114359026, + 114359028, + 114359270, + 114359701, + 114359826, + 114359828, + 114358510, + 114358531, + 114358548, + 114358577, + 114358578, + 114358587, + 114358657, + 114358658, + 114358828, + 114359015, + 114359017, + 114359124, + 114359126, + 114359347, + 114359516, + 114359518, + 114359680, + 114356440, + 114357507, + 114357508, + 114357512, + 114357514, + 114357515, + 114357516, + 114357519, + 114357550, + 114357567, + 114357568, + 114357572, + 114357575, + 114357576, + 114357588, + 114357665, + 114357667, + 114357669, + 114358137, + 114358316, + 114358317, + 114358473, + 114358474, + 114358475, + 114358532, + 114358547, + 114358613, + 114358615, + 114358616, + 114358633, + 114358655, + 114358656, + 114358661, + 114358662, + 114358664, + 114358665, + 114358700, + 114358703, + 114358719, + 114358722, + 114359567, + 114359568, + 114360170, + 114360172, + 114360333, + 114360334, + 114360365, + 114360391, + 114357226, + 114357588, + 114357740, + 114358452, + 114358462, + 114358463, + 114358464, + 114358465, + 114358474, + 114358475, + 114358493, + 114358503, + 114358522, + 114358523, + 114358532, + 114358547, + 114358560, + 114358615, + 114358622, + 114358628, + 114358633, + 114358661, + 114358662, + 114358664, + 114358665, + 114358674, + 114358675, + 114358698, + 114358700, + 114358847, + 114358848, + 114359202, + 114359719, + 114359921, + 114359923, + 114359931, + 114359933, + 114359975, + 114359977, + 114360170, + 114360172, + 114356046, + 114356212, + 114356435, + 114356438, + 114356440, + 114356629, + 114356844, + 114356846, + 114357006, + 114357233, + 114357402, + 114357404, + 114357406, + 114357575, + 114357576, + 114358250, + 114358283, + 114358285, + 114358299, + 114358303, + 114358475, + 114358522, + 114358523, + 114358590, + 114358633, + 114358655, + 114358656, + 114358661, + 114358662, + 114358664, + 114358665, + 114358674, + 114358675, + 114358685, + 114358688, + 114358689, + 114358695, + 114358698, + 114358700, + 114358703, + 114356438, + 114356484, + 114356660, + 114356663, + 114356839, + 114356841, + 114356844, + 114356846, + 114356848, + 114358105, + 114358107, + 114358285, + 114358299, + 114358452, + 114358473, + 114358474, + 114358475, + 114358503, + 114358522, + 114358523, + 114358532, + 114358547, + 114358613, + 114358615, + 114358616, + 114358618, + 114358655, + 114358656, + 114358661, + 114358662, + 114358674, + 114358675, + 114358698, + 114358700, + 114358722, + 114358735, + 114360481, + 114361491, + 114361492, + 114356844, + 114356846, + 114356848, + 114357710, + 114357779, + 114357943, + 114357945, + 114357946, + 114357948, + 114358493, + 114358506, + 114358532, + 114358633, + 114358661, + 114358662, + 114358664, + 114358700, + 114358703, + 114360639, + 114358273, + 114358276, + 114358277, + 114358304, + 114358459, + 114358491, + 114358495, + 114358508, + 114358510, + 114358512, + 114358531, + 114358548, + 114358575, + 114358577, + 114358578, + 114358632, + 114358645, + 114358681, + 114359026, + 114359161, + 114359162, + 114359763, + 114359937, + 114360583, + 114360596, + 114361169, + 114361184, + 114361323, + 114361325, + 114358508, + 114358510, + 114358512, + 114358531, + 114358555, + 114358577, + 114358578, + 114358632, + 114358691, + 114358692 + ], + "y": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 16, + 16, + 16, + 16, + 16, + 16, + 16, + 16, + 16, + 16, + 16, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 19, + 19, + 19, + 19, + 19, + 19, + 19, + 19, + 19, + 19, + 19, + 19, + 19, + 19, + 19, + 19, + 19, + 19, + 19, + 19, + 19, + 19, + 19, + 19, + 19, + 19, + 19, + 19, + 19, + 19, + 19, + 19, + 19, + 19, + 19, + 19, + 19, + 19, + 19, + 14, + 14, + 14, + 14, + 14, + 14, + 14, + 14, + 14, + 14, + 14, + 14, + 14, + 14, + 14, + 14, + 14, + 14, + 14, + 14, + 14, + 14, + 14, + 14, + 14, + 14, + 14, + 14, + 14, + 14, + 14, + 14, + 14, + 20, + 20, + 20, + 20, + 20, + 20, + 21, + 21, + 21, + 21, + 21, + 21, + 21, + 21, + 21, + 21, + 21, + 21, + 21, + 21, + 21, + 21, + 21, + 21, + 21, + 21, + 21, + 21, + 21, + 21, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 17, + 17, + 17, + 17, + 17, + 17, + 17, + 17, + 17, + 17, + 17, + 17, + 17, + 17, + 17, + 17, + 17, + 17, + 17, + 17, + 17, + 17, + 17, + 17, + 17, + 17, + 17, + 17, + 17, + 17, + 17, + 17, + 17, + 17, + 17, + 17, + 17, + 17, + 17, + 17, + 17, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 22, + 22, + 22, + 22, + 22, + 22, + 22, + 22, + 22, + 22, + 22, + 22, + 22, + 22, + 22, + 22, + 22, + 22, + 22, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 26, + 26, + 26, + 26, + 26, + 26, + 26, + 26, + 26, + 26 + ] + }, + { + "customdata": [ + [ + "bd15781e-a765-43ba-b641-64cff386435f", + 0.939453125 + ], + [ + "bd15781e-a765-43ba-b641-64cff386435f", + 0.783203125 + ], + [ + "bd15781e-a765-43ba-b641-64cff386435f", + 0.955078125 + ], + [ + "bd15781e-a765-43ba-b641-64cff386435f", + 0.751953125 + ], + [ + "bd15781e-a765-43ba-b641-64cff386435f", + 0.533203125 + ], + [ + "bd15781e-a765-43ba-b641-64cff386435f", + 0.943359375 + ], + [ + "bd15781e-a765-43ba-b641-64cff386435f", + 0.751953125 + ], + [ + "bd15781e-a765-43ba-b641-64cff386435f", + 0.533203125 + ], + [ + "bd15781e-a765-43ba-b641-64cff386435f", + 0.955078125 + ], + [ + "bd15781e-a765-43ba-b641-64cff386435f", + 0.611328125 + ], + [ + "bd15781e-a765-43ba-b641-64cff386435f", + 0.841796875 + ], + [ + "bd15781e-a765-43ba-b641-64cff386435f", + 0.501953125 + ], + [ + "bd15781e-a765-43ba-b641-64cff386435f", + 0.634765625 + ], + [ + "bd15781e-a765-43ba-b641-64cff386435f", + 0.802734375 + ], + [ + "bd15781e-a765-43ba-b641-64cff386435f", + 0.939453125 + ], + [ + "bd15781e-a765-43ba-b641-64cff386435f", + 0.861328125 + ], + [ + "bd15781e-a765-43ba-b641-64cff386435f", + 0.931640625 + ], + [ + "bd15781e-a765-43ba-b641-64cff386435f", + 0.556640625 + ], + [ + "bd15781e-a765-43ba-b641-64cff386435f", + 0.603515625 + ], + [ + "bd15781e-a765-43ba-b641-64cff386435f", + 0.537109375 + ], + [ + "bd15781e-a765-43ba-b641-64cff386435f", + 0.619140625 + ], + [ + "62f58ea9-6228-4b3c-a00d-e8e4377c2d9a", + 0.564453125 + ], + [ + "62f58ea9-6228-4b3c-a00d-e8e4377c2d9a", + 0.958984375 + ], + [ + "62f58ea9-6228-4b3c-a00d-e8e4377c2d9a", + 0.833984375 + ], + [ + "62f58ea9-6228-4b3c-a00d-e8e4377c2d9a", + 0.970703125 + ], + [ + "62f58ea9-6228-4b3c-a00d-e8e4377c2d9a", + 0.935546875 + ], + [ + "62f58ea9-6228-4b3c-a00d-e8e4377c2d9a", + 0.587890625 + ], + [ + "62f58ea9-6228-4b3c-a00d-e8e4377c2d9a", + 0.587890625 + ], + [ + "62f58ea9-6228-4b3c-a00d-e8e4377c2d9a", + 0.857421875 + ], + [ + "62f58ea9-6228-4b3c-a00d-e8e4377c2d9a", + 0.794921875 + ], + [ + "62f58ea9-6228-4b3c-a00d-e8e4377c2d9a", + 0.966796875 + ], + [ + "62f58ea9-6228-4b3c-a00d-e8e4377c2d9a", + 0.802734375 + ], + [ + "62f58ea9-6228-4b3c-a00d-e8e4377c2d9a", + 0.591796875 + ], + [ + "62f58ea9-6228-4b3c-a00d-e8e4377c2d9a", + 0.966796875 + ], + [ + "62f58ea9-6228-4b3c-a00d-e8e4377c2d9a", + 0.654296875 + ], + [ + "62f58ea9-6228-4b3c-a00d-e8e4377c2d9a", + 0.873046875 + ], + [ + "62f58ea9-6228-4b3c-a00d-e8e4377c2d9a", + 0.501953125 + ], + [ + "62f58ea9-6228-4b3c-a00d-e8e4377c2d9a", + 0.919921875 + ], + [ + "62f58ea9-6228-4b3c-a00d-e8e4377c2d9a", + 0.912109375 + ], + [ + "62f58ea9-6228-4b3c-a00d-e8e4377c2d9a", + 0.822265625 + ], + [ + "62f58ea9-6228-4b3c-a00d-e8e4377c2d9a", + 0.740234375 + ], + [ + "62f58ea9-6228-4b3c-a00d-e8e4377c2d9a", + 0.791015625 + ], + [ + "62f58ea9-6228-4b3c-a00d-e8e4377c2d9a", + 0.935546875 + ], + [ + "62f58ea9-6228-4b3c-a00d-e8e4377c2d9a", + 0.576171875 + ], + [ + "62f58ea9-6228-4b3c-a00d-e8e4377c2d9a", + 0.646484375 + ], + [ + "62f58ea9-6228-4b3c-a00d-e8e4377c2d9a", + 0.802734375 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.685546875 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.650390625 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.806640625 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.826171875 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.908203125 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.662109375 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.728515625 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.966796875 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.892578125 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.697265625 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.775390625 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.857421875 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.658203125 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.916015625 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.587890625 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.845703125 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.724609375 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.564453125 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.751953125 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.794921875 + ], + [ + "f2f48fe0-36ac-4af3-8551-f3afc13b64df", + 0.830078125 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.705078125 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.978515625 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.943359375 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.501953125 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.982421875 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.919921875 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.798828125 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.845703125 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.970703125 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.767578125 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.619140625 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.833984375 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.779296875 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.876953125 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.931640625 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.970703125 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.912109375 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.896484375 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.818359375 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.720703125 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.794921875 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.611328125 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.908203125 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.673828125 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.849609375 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.873046875 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.810546875 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.951171875 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.517578125 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.908203125 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.865234375 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.720703125 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.740234375 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.681640625 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.841796875 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.978515625 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.650390625 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.658203125 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.544921875 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.505859375 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.818359375 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.505859375 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.630859375 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.556640625 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.912109375 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.716796875 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.681640625 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.783203125 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.861328125 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.791015625 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.818359375 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.673828125 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.826171875 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.806640625 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.712890625 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.572265625 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.943359375 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.833984375 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.955078125 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.701171875 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.888671875 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.791015625 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.638671875 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.736328125 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.599609375 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.798828125 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.904296875 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.951171875 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.837890625 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.931640625 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.955078125 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.939453125 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.755859375 + ], + [ + "8db57d1c-ad62-47bc-a1fa-77489954f766", + 0.900390625 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.673828125 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.732421875 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.908203125 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.798828125 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.603515625 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.888671875 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.861328125 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.951171875 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.986328125 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.857421875 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.869140625 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.560546875 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.830078125 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.564453125 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.857421875 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.501953125 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.654296875 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.564453125 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.826171875 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.544921875 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.943359375 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.982421875 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.873046875 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.888671875 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.904296875 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.677734375 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.876953125 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.810546875 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.880859375 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.884765625 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.755859375 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.541015625 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.744140625 + ], + [ + "1b72803e-adef-4222-a6ac-262f2dd04db8", + 0.783203125 + ], + [ + "1b72803e-adef-4222-a6ac-262f2dd04db8", + 0.935546875 + ], + [ + "1b72803e-adef-4222-a6ac-262f2dd04db8", + 0.919921875 + ], + [ + "1b72803e-adef-4222-a6ac-262f2dd04db8", + 0.587890625 + ], + [ + "1b72803e-adef-4222-a6ac-262f2dd04db8", + 0.876953125 + ], + [ + "1b72803e-adef-4222-a6ac-262f2dd04db8", + 0.513671875 + ], + [ + "1b72803e-adef-4222-a6ac-262f2dd04db8", + 0.666015625 + ], + [ + "1b72803e-adef-4222-a6ac-262f2dd04db8", + 0.802734375 + ], + [ + "1b72803e-adef-4222-a6ac-262f2dd04db8", + 0.576171875 + ], + [ + "1b72803e-adef-4222-a6ac-262f2dd04db8", + 0.673828125 + ], + [ + "1b72803e-adef-4222-a6ac-262f2dd04db8", + 0.681640625 + ], + [ + "1b72803e-adef-4222-a6ac-262f2dd04db8", + 0.990234375 + ], + [ + "1b72803e-adef-4222-a6ac-262f2dd04db8", + 0.748046875 + ], + [ + "1b72803e-adef-4222-a6ac-262f2dd04db8", + 0.541015625 + ], + [ + "1b72803e-adef-4222-a6ac-262f2dd04db8", + 0.841796875 + ], + [ + "1b72803e-adef-4222-a6ac-262f2dd04db8", + 0.533203125 + ], + [ + "1b72803e-adef-4222-a6ac-262f2dd04db8", + 0.697265625 + ], + [ + "1b72803e-adef-4222-a6ac-262f2dd04db8", + 0.958984375 + ], + [ + "1b72803e-adef-4222-a6ac-262f2dd04db8", + 0.666015625 + ], + [ + "1b72803e-adef-4222-a6ac-262f2dd04db8", + 0.904296875 + ], + [ + "1b72803e-adef-4222-a6ac-262f2dd04db8", + 0.626953125 + ], + [ + "1b72803e-adef-4222-a6ac-262f2dd04db8", + 0.876953125 + ], + [ + "1b72803e-adef-4222-a6ac-262f2dd04db8", + 0.861328125 + ], + [ + "1b72803e-adef-4222-a6ac-262f2dd04db8", + 0.599609375 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.630859375 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.841796875 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.787109375 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.951171875 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.650390625 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.833984375 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.814453125 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.755859375 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.564453125 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.951171875 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.869140625 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.837890625 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.552734375 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.853515625 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.623046875 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.880859375 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.958984375 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.599609375 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.724609375 + ], + [ + "66ca78ed-7f5e-4af3-93cd-0ceb736246ec", + 0.623046875 + ], + [ + "66ca78ed-7f5e-4af3-93cd-0ceb736246ec", + 0.662109375 + ], + [ + "66ca78ed-7f5e-4af3-93cd-0ceb736246ec", + 0.814453125 + ], + [ + "66ca78ed-7f5e-4af3-93cd-0ceb736246ec", + 0.876953125 + ], + [ + "66ca78ed-7f5e-4af3-93cd-0ceb736246ec", + 0.818359375 + ], + [ + "66ca78ed-7f5e-4af3-93cd-0ceb736246ec", + 0.505859375 + ], + [ + "66ca78ed-7f5e-4af3-93cd-0ceb736246ec", + 0.658203125 + ], + [ + "66ca78ed-7f5e-4af3-93cd-0ceb736246ec", + 0.814453125 + ], + [ + "66ca78ed-7f5e-4af3-93cd-0ceb736246ec", + 0.564453125 + ], + [ + "66ca78ed-7f5e-4af3-93cd-0ceb736246ec", + 0.994140625 + ], + [ + "66ca78ed-7f5e-4af3-93cd-0ceb736246ec", + 0.919921875 + ], + [ + "66ca78ed-7f5e-4af3-93cd-0ceb736246ec", + 0.767578125 + ], + [ + "66ca78ed-7f5e-4af3-93cd-0ceb736246ec", + 0.853515625 + ], + [ + "66ca78ed-7f5e-4af3-93cd-0ceb736246ec", + 0.658203125 + ], + [ + "66ca78ed-7f5e-4af3-93cd-0ceb736246ec", + 0.923828125 + ], + [ + "c06c775e-9473-423d-bb0f-48aaad4a7ad6", + 0.845703125 + ], + [ + "c06c775e-9473-423d-bb0f-48aaad4a7ad6", + 0.810546875 + ], + [ + "c06c775e-9473-423d-bb0f-48aaad4a7ad6", + 0.833984375 + ], + [ + "c06c775e-9473-423d-bb0f-48aaad4a7ad6", + 0.568359375 + ], + [ + "c06c775e-9473-423d-bb0f-48aaad4a7ad6", + 0.826171875 + ], + [ + "c06c775e-9473-423d-bb0f-48aaad4a7ad6", + 0.830078125 + ], + [ + "c06c775e-9473-423d-bb0f-48aaad4a7ad6", + 0.947265625 + ], + [ + "c06c775e-9473-423d-bb0f-48aaad4a7ad6", + 0.966796875 + ], + [ + "c06c775e-9473-423d-bb0f-48aaad4a7ad6", + 0.826171875 + ], + [ + "c06c775e-9473-423d-bb0f-48aaad4a7ad6", + 0.509765625 + ], + [ + "c06c775e-9473-423d-bb0f-48aaad4a7ad6", + 0.716796875 + ], + [ + "c06c775e-9473-423d-bb0f-48aaad4a7ad6", + 0.705078125 + ], + [ + "c06c775e-9473-423d-bb0f-48aaad4a7ad6", + 0.740234375 + ], + [ + "c06c775e-9473-423d-bb0f-48aaad4a7ad6", + 0.806640625 + ], + [ + "c06c775e-9473-423d-bb0f-48aaad4a7ad6", + 0.982421875 + ], + [ + "c06c775e-9473-423d-bb0f-48aaad4a7ad6", + 0.513671875 + ], + [ + "c06c775e-9473-423d-bb0f-48aaad4a7ad6", + 0.951171875 + ], + [ + "c06c775e-9473-423d-bb0f-48aaad4a7ad6", + 0.755859375 + ], + [ + "c06c775e-9473-423d-bb0f-48aaad4a7ad6", + 0.845703125 + ], + [ + "c06c775e-9473-423d-bb0f-48aaad4a7ad6", + 0.787109375 + ], + [ + "c06c775e-9473-423d-bb0f-48aaad4a7ad6", + 0.658203125 + ], + [ + "c06c775e-9473-423d-bb0f-48aaad4a7ad6", + 0.626953125 + ], + [ + "c06c775e-9473-423d-bb0f-48aaad4a7ad6", + 0.607421875 + ], + [ + "c06c775e-9473-423d-bb0f-48aaad4a7ad6", + 0.669921875 + ], + [ + "c06c775e-9473-423d-bb0f-48aaad4a7ad6", + 0.638671875 + ], + [ + "c06c775e-9473-423d-bb0f-48aaad4a7ad6", + 0.810546875 + ], + [ + "c06c775e-9473-423d-bb0f-48aaad4a7ad6", + 0.591796875 + ], + [ + "c06c775e-9473-423d-bb0f-48aaad4a7ad6", + 0.509765625 + ], + [ + "c06c775e-9473-423d-bb0f-48aaad4a7ad6", + 0.544921875 + ], + [ + "c06c775e-9473-423d-bb0f-48aaad4a7ad6", + 0.521484375 + ], + [ + "c06c775e-9473-423d-bb0f-48aaad4a7ad6", + 0.634765625 + ], + [ + "c06c775e-9473-423d-bb0f-48aaad4a7ad6", + 0.587890625 + ], + [ + "c06c775e-9473-423d-bb0f-48aaad4a7ad6", + 0.861328125 + ], + [ + "c06c775e-9473-423d-bb0f-48aaad4a7ad6", + 0.830078125 + ], + [ + "c06c775e-9473-423d-bb0f-48aaad4a7ad6", + 0.927734375 + ], + [ + "c06c775e-9473-423d-bb0f-48aaad4a7ad6", + 0.861328125 + ], + [ + "c06c775e-9473-423d-bb0f-48aaad4a7ad6", + 0.658203125 + ], + [ + "c06c775e-9473-423d-bb0f-48aaad4a7ad6", + 0.978515625 + ], + [ + "c06c775e-9473-423d-bb0f-48aaad4a7ad6", + 0.814453125 + ], + [ + "bdde52cf-4aed-42f6-80e5-e2c02b86596c", + 0.677734375 + ], + [ + "bdde52cf-4aed-42f6-80e5-e2c02b86596c", + 0.560546875 + ], + [ + "bdde52cf-4aed-42f6-80e5-e2c02b86596c", + 0.814453125 + ], + [ + "bdde52cf-4aed-42f6-80e5-e2c02b86596c", + 0.564453125 + ], + [ + "bdde52cf-4aed-42f6-80e5-e2c02b86596c", + 0.607421875 + ], + [ + "bdde52cf-4aed-42f6-80e5-e2c02b86596c", + 0.732421875 + ], + [ + "bdde52cf-4aed-42f6-80e5-e2c02b86596c", + 0.974609375 + ], + [ + "bdde52cf-4aed-42f6-80e5-e2c02b86596c", + 0.732421875 + ], + [ + "bdde52cf-4aed-42f6-80e5-e2c02b86596c", + 0.595703125 + ], + [ + "bdde52cf-4aed-42f6-80e5-e2c02b86596c", + 0.822265625 + ], + [ + "bdde52cf-4aed-42f6-80e5-e2c02b86596c", + 0.673828125 + ], + [ + "bdde52cf-4aed-42f6-80e5-e2c02b86596c", + 0.681640625 + ], + [ + "81abd2b7-68a5-44ce-9d92-c5790e68f0b6", + 0.572265625 + ], + [ + "81abd2b7-68a5-44ce-9d92-c5790e68f0b6", + 0.966796875 + ], + [ + "81abd2b7-68a5-44ce-9d92-c5790e68f0b6", + 0.537109375 + ], + [ + "81abd2b7-68a5-44ce-9d92-c5790e68f0b6", + 0.595703125 + ], + [ + "81abd2b7-68a5-44ce-9d92-c5790e68f0b6", + 0.708984375 + ], + [ + "81abd2b7-68a5-44ce-9d92-c5790e68f0b6", + 0.892578125 + ], + [ + "81abd2b7-68a5-44ce-9d92-c5790e68f0b6", + 0.849609375 + ], + [ + "81abd2b7-68a5-44ce-9d92-c5790e68f0b6", + 0.572265625 + ], + [ + "81abd2b7-68a5-44ce-9d92-c5790e68f0b6", + 0.728515625 + ], + [ + "81abd2b7-68a5-44ce-9d92-c5790e68f0b6", + 0.779296875 + ], + [ + "81abd2b7-68a5-44ce-9d92-c5790e68f0b6", + 0.919921875 + ], + [ + "81abd2b7-68a5-44ce-9d92-c5790e68f0b6", + 0.818359375 + ], + [ + "81abd2b7-68a5-44ce-9d92-c5790e68f0b6", + 0.880859375 + ], + [ + "81abd2b7-68a5-44ce-9d92-c5790e68f0b6", + 0.970703125 + ], + [ + "81abd2b7-68a5-44ce-9d92-c5790e68f0b6", + 0.505859375 + ], + [ + "81abd2b7-68a5-44ce-9d92-c5790e68f0b6", + 0.876953125 + ], + [ + "81abd2b7-68a5-44ce-9d92-c5790e68f0b6", + 0.818359375 + ], + [ + "81abd2b7-68a5-44ce-9d92-c5790e68f0b6", + 0.791015625 + ], + [ + "81abd2b7-68a5-44ce-9d92-c5790e68f0b6", + 0.849609375 + ], + [ + "81abd2b7-68a5-44ce-9d92-c5790e68f0b6", + 0.822265625 + ], + [ + "81abd2b7-68a5-44ce-9d92-c5790e68f0b6", + 0.607421875 + ], + [ + "81abd2b7-68a5-44ce-9d92-c5790e68f0b6", + 0.830078125 + ], + [ + "81abd2b7-68a5-44ce-9d92-c5790e68f0b6", + 0.658203125 + ], + [ + "81abd2b7-68a5-44ce-9d92-c5790e68f0b6", + 0.537109375 + ], + [ + "81abd2b7-68a5-44ce-9d92-c5790e68f0b6", + 0.541015625 + ], + [ + "81abd2b7-68a5-44ce-9d92-c5790e68f0b6", + 0.505859375 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.537109375 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.728515625 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.720703125 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.912109375 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.548828125 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.666015625 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.888671875 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.912109375 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.505859375 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.951171875 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.650390625 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.583984375 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.904296875 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.916015625 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.818359375 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.943359375 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.587890625 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.845703125 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.552734375 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.658203125 + ], + [ + "a865b338-ab12-4c49-910e-f4ef80af8677", + 0.599609375 + ], + [ + "a865b338-ab12-4c49-910e-f4ef80af8677", + 0.724609375 + ], + [ + "a865b338-ab12-4c49-910e-f4ef80af8677", + 0.962890625 + ], + [ + "a865b338-ab12-4c49-910e-f4ef80af8677", + 0.927734375 + ], + [ + "a865b338-ab12-4c49-910e-f4ef80af8677", + 0.740234375 + ], + [ + "a865b338-ab12-4c49-910e-f4ef80af8677", + 0.986328125 + ], + [ + "a865b338-ab12-4c49-910e-f4ef80af8677", + 0.814453125 + ], + [ + "a865b338-ab12-4c49-910e-f4ef80af8677", + 0.884765625 + ], + [ + "a865b338-ab12-4c49-910e-f4ef80af8677", + 0.556640625 + ], + [ + "a865b338-ab12-4c49-910e-f4ef80af8677", + 0.841796875 + ], + [ + "a865b338-ab12-4c49-910e-f4ef80af8677", + 0.935546875 + ], + [ + "a865b338-ab12-4c49-910e-f4ef80af8677", + 0.525390625 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.658203125 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.767578125 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.904296875 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.900390625 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.990234375 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.677734375 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.712890625 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.740234375 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.626953125 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.748046875 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.771484375 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.884765625 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.880859375 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.763671875 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.931640625 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.544921875 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.619140625 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.755859375 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.880859375 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.712890625 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.849609375 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.845703125 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.978515625 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.783203125 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.669921875 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.669921875 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.568359375 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.884765625 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.873046875 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.904296875 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.810546875 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.662109375 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.951171875 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.923828125 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.615234375 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.865234375 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.908203125 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.966796875 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.966796875 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.728515625 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.634765625 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.673828125 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.775390625 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.513671875 + ], + [ + "5a71d07f-4b9a-487c-8fa0-b9a26e2c626c", + 0.595703125 + ], + [ + "5a71d07f-4b9a-487c-8fa0-b9a26e2c626c", + 0.623046875 + ], + [ + "5a71d07f-4b9a-487c-8fa0-b9a26e2c626c", + 0.896484375 + ], + [ + "5a71d07f-4b9a-487c-8fa0-b9a26e2c626c", + 0.923828125 + ], + [ + "5a71d07f-4b9a-487c-8fa0-b9a26e2c626c", + 0.533203125 + ], + [ + "5a71d07f-4b9a-487c-8fa0-b9a26e2c626c", + 0.533203125 + ], + [ + "5a71d07f-4b9a-487c-8fa0-b9a26e2c626c", + 0.751953125 + ], + [ + "5a71d07f-4b9a-487c-8fa0-b9a26e2c626c", + 0.927734375 + ], + [ + "5a71d07f-4b9a-487c-8fa0-b9a26e2c626c", + 0.576171875 + ], + [ + "5a71d07f-4b9a-487c-8fa0-b9a26e2c626c", + 0.513671875 + ], + [ + "5a71d07f-4b9a-487c-8fa0-b9a26e2c626c", + 0.595703125 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.841796875 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.654296875 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.654296875 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.677734375 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.517578125 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.716796875 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.962890625 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.744140625 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.537109375 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.791015625 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.779296875 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.544921875 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.548828125 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.615234375 + ], + [ + "b1e7ffc8-b74a-4b98-bb8f-a5f3f8fcb3b7", + 0.712890625 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.751953125 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.916015625 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.966796875 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.787109375 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.638671875 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.646484375 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.759765625 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.525390625 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.892578125 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.720703125 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.802734375 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.556640625 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.677734375 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.572265625 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.673828125 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.904296875 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.826171875 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.876953125 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.603515625 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.748046875 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.587890625 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.919921875 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.775390625 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.736328125 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.802734375 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.814453125 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.876953125 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.775390625 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.978515625 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.767578125 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.552734375 + ], + [ + "49025607-57f8-4319-adfb-1d30dc5fca5a", + 0.556640625 + ], + [ + "49025607-57f8-4319-adfb-1d30dc5fca5a", + 0.822265625 + ], + [ + "49025607-57f8-4319-adfb-1d30dc5fca5a", + 0.607421875 + ], + [ + "49025607-57f8-4319-adfb-1d30dc5fca5a", + 0.759765625 + ], + [ + "49025607-57f8-4319-adfb-1d30dc5fca5a", + 0.673828125 + ], + [ + "49025607-57f8-4319-adfb-1d30dc5fca5a", + 0.845703125 + ], + [ + "49025607-57f8-4319-adfb-1d30dc5fca5a", + 0.677734375 + ], + [ + "49025607-57f8-4319-adfb-1d30dc5fca5a", + 0.751953125 + ], + [ + "49025607-57f8-4319-adfb-1d30dc5fca5a", + 0.751953125 + ], + [ + "49025607-57f8-4319-adfb-1d30dc5fca5a", + 0.572265625 + ], + [ + "49025607-57f8-4319-adfb-1d30dc5fca5a", + 0.962890625 + ], + [ + "49025607-57f8-4319-adfb-1d30dc5fca5a", + 0.904296875 + ], + [ + "49025607-57f8-4319-adfb-1d30dc5fca5a", + 0.552734375 + ], + [ + "0254472b-d540-423f-8589-cd6bc16c74c9", + 0.607421875 + ], + [ + "0254472b-d540-423f-8589-cd6bc16c74c9", + 0.650390625 + ], + [ + "0254472b-d540-423f-8589-cd6bc16c74c9", + 0.990234375 + ], + [ + "0254472b-d540-423f-8589-cd6bc16c74c9", + 0.982421875 + ], + [ + "0254472b-d540-423f-8589-cd6bc16c74c9", + 0.521484375 + ], + [ + "0254472b-d540-423f-8589-cd6bc16c74c9", + 0.587890625 + ], + [ + "0254472b-d540-423f-8589-cd6bc16c74c9", + 0.587890625 + ], + [ + "0254472b-d540-423f-8589-cd6bc16c74c9", + 0.638671875 + ], + [ + "0254472b-d540-423f-8589-cd6bc16c74c9", + 0.978515625 + ], + [ + "0254472b-d540-423f-8589-cd6bc16c74c9", + 0.884765625 + ], + [ + "0254472b-d540-423f-8589-cd6bc16c74c9", + 0.791015625 + ], + [ + "0254472b-d540-423f-8589-cd6bc16c74c9", + 0.755859375 + ], + [ + "0254472b-d540-423f-8589-cd6bc16c74c9", + 0.783203125 + ], + [ + "0254472b-d540-423f-8589-cd6bc16c74c9", + 0.619140625 + ], + [ + "0254472b-d540-423f-8589-cd6bc16c74c9", + 0.794921875 + ], + [ + "0254472b-d540-423f-8589-cd6bc16c74c9", + 0.623046875 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.931640625 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.982421875 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.505859375 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.513671875 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.916015625 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.818359375 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.916015625 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.916015625 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.802734375 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.955078125 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.595703125 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.818359375 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.728515625 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.716796875 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.970703125 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.810546875 + ], + [ + "ce306fa9-2d47-45dc-8d7a-2294fdcd5e25", + 0.896484375 + ], + [ + "ce306fa9-2d47-45dc-8d7a-2294fdcd5e25", + 0.943359375 + ], + [ + "ce306fa9-2d47-45dc-8d7a-2294fdcd5e25", + 0.779296875 + ], + [ + "ce306fa9-2d47-45dc-8d7a-2294fdcd5e25", + 0.666015625 + ], + [ + "ce306fa9-2d47-45dc-8d7a-2294fdcd5e25", + 0.740234375 + ], + [ + "ce306fa9-2d47-45dc-8d7a-2294fdcd5e25", + 0.841796875 + ], + [ + "ce306fa9-2d47-45dc-8d7a-2294fdcd5e25", + 0.779296875 + ], + [ + "ce306fa9-2d47-45dc-8d7a-2294fdcd5e25", + 0.900390625 + ], + [ + "ce306fa9-2d47-45dc-8d7a-2294fdcd5e25", + 0.841796875 + ], + [ + "ce306fa9-2d47-45dc-8d7a-2294fdcd5e25", + 0.888671875 + ], + [ + "ce306fa9-2d47-45dc-8d7a-2294fdcd5e25", + 0.826171875 + ], + [ + "ce306fa9-2d47-45dc-8d7a-2294fdcd5e25", + 0.666015625 + ], + [ + "ce306fa9-2d47-45dc-8d7a-2294fdcd5e25", + 0.900390625 + ], + [ + "ce306fa9-2d47-45dc-8d7a-2294fdcd5e25", + 0.587890625 + ], + [ + "ce306fa9-2d47-45dc-8d7a-2294fdcd5e25", + 0.775390625 + ], + [ + "ce306fa9-2d47-45dc-8d7a-2294fdcd5e25", + 0.521484375 + ], + [ + "ce306fa9-2d47-45dc-8d7a-2294fdcd5e25", + 0.693359375 + ] + ], + "hovertemplate": "Read: %{customdata[0]}
Position: %{x:,}
Probability: %{customdata[1]:.2f}", + "marker": { + "color": [ + 0.939453125, + 0.783203125, + 0.955078125, + 0.751953125, + 0.533203125, + 0.943359375, + 0.751953125, + 0.533203125, + 0.955078125, + 0.611328125, + 0.841796875, + 0.501953125, + 0.634765625, + 0.802734375, + 0.939453125, + 0.861328125, + 0.931640625, + 0.556640625, + 0.603515625, + 0.537109375, + 0.619140625, + 0.564453125, + 0.958984375, + 0.833984375, + 0.970703125, + 0.935546875, + 0.587890625, + 0.587890625, + 0.857421875, + 0.794921875, + 0.966796875, + 0.802734375, + 0.591796875, + 0.966796875, + 0.654296875, + 0.873046875, + 0.501953125, + 0.919921875, + 0.912109375, + 0.822265625, + 0.740234375, + 0.791015625, + 0.935546875, + 0.576171875, + 0.646484375, + 0.802734375, + 0.685546875, + 0.650390625, + 0.806640625, + 0.826171875, + 0.908203125, + 0.662109375, + 0.728515625, + 0.966796875, + 0.892578125, + 0.697265625, + 0.775390625, + 0.857421875, + 0.658203125, + 0.916015625, + 0.587890625, + 0.845703125, + 0.724609375, + 0.564453125, + 0.751953125, + 0.794921875, + 0.830078125, + 0.705078125, + 0.978515625, + 0.943359375, + 0.501953125, + 0.982421875, + 0.919921875, + 0.798828125, + 0.845703125, + 0.970703125, + 0.767578125, + 0.619140625, + 0.833984375, + 0.779296875, + 0.876953125, + 0.931640625, + 0.970703125, + 0.912109375, + 0.896484375, + 0.818359375, + 0.720703125, + 0.794921875, + 0.611328125, + 0.908203125, + 0.673828125, + 0.849609375, + 0.873046875, + 0.810546875, + 0.951171875, + 0.517578125, + 0.908203125, + 0.865234375, + 0.720703125, + 0.740234375, + 0.681640625, + 0.841796875, + 0.978515625, + 0.650390625, + 0.658203125, + 0.544921875, + 0.505859375, + 0.818359375, + 0.505859375, + 0.630859375, + 0.556640625, + 0.912109375, + 0.716796875, + 0.681640625, + 0.783203125, + 0.861328125, + 0.791015625, + 0.818359375, + 0.673828125, + 0.826171875, + 0.806640625, + 0.712890625, + 0.572265625, + 0.943359375, + 0.833984375, + 0.955078125, + 0.701171875, + 0.888671875, + 0.791015625, + 0.638671875, + 0.736328125, + 0.599609375, + 0.798828125, + 0.904296875, + 0.951171875, + 0.837890625, + 0.931640625, + 0.955078125, + 0.939453125, + 0.755859375, + 0.900390625, + 0.673828125, + 0.732421875, + 0.908203125, + 0.798828125, + 0.603515625, + 0.888671875, + 0.861328125, + 0.951171875, + 0.986328125, + 0.857421875, + 0.869140625, + 0.560546875, + 0.830078125, + 0.564453125, + 0.857421875, + 0.501953125, + 0.654296875, + 0.564453125, + 0.826171875, + 0.544921875, + 0.943359375, + 0.982421875, + 0.873046875, + 0.888671875, + 0.904296875, + 0.677734375, + 0.876953125, + 0.810546875, + 0.880859375, + 0.884765625, + 0.755859375, + 0.541015625, + 0.744140625, + 0.783203125, + 0.935546875, + 0.919921875, + 0.587890625, + 0.876953125, + 0.513671875, + 0.666015625, + 0.802734375, + 0.576171875, + 0.673828125, + 0.681640625, + 0.990234375, + 0.748046875, + 0.541015625, + 0.841796875, + 0.533203125, + 0.697265625, + 0.958984375, + 0.666015625, + 0.904296875, + 0.626953125, + 0.876953125, + 0.861328125, + 0.599609375, + 0.630859375, + 0.841796875, + 0.787109375, + 0.951171875, + 0.650390625, + 0.833984375, + 0.814453125, + 0.755859375, + 0.564453125, + 0.951171875, + 0.869140625, + 0.837890625, + 0.552734375, + 0.853515625, + 0.623046875, + 0.880859375, + 0.958984375, + 0.599609375, + 0.724609375, + 0.623046875, + 0.662109375, + 0.814453125, + 0.876953125, + 0.818359375, + 0.505859375, + 0.658203125, + 0.814453125, + 0.564453125, + 0.994140625, + 0.919921875, + 0.767578125, + 0.853515625, + 0.658203125, + 0.923828125, + 0.845703125, + 0.810546875, + 0.833984375, + 0.568359375, + 0.826171875, + 0.830078125, + 0.947265625, + 0.966796875, + 0.826171875, + 0.509765625, + 0.716796875, + 0.705078125, + 0.740234375, + 0.806640625, + 0.982421875, + 0.513671875, + 0.951171875, + 0.755859375, + 0.845703125, + 0.787109375, + 0.658203125, + 0.626953125, + 0.607421875, + 0.669921875, + 0.638671875, + 0.810546875, + 0.591796875, + 0.509765625, + 0.544921875, + 0.521484375, + 0.634765625, + 0.587890625, + 0.861328125, + 0.830078125, + 0.927734375, + 0.861328125, + 0.658203125, + 0.978515625, + 0.814453125, + 0.677734375, + 0.560546875, + 0.814453125, + 0.564453125, + 0.607421875, + 0.732421875, + 0.974609375, + 0.732421875, + 0.595703125, + 0.822265625, + 0.673828125, + 0.681640625, + 0.572265625, + 0.966796875, + 0.537109375, + 0.595703125, + 0.708984375, + 0.892578125, + 0.849609375, + 0.572265625, + 0.728515625, + 0.779296875, + 0.919921875, + 0.818359375, + 0.880859375, + 0.970703125, + 0.505859375, + 0.876953125, + 0.818359375, + 0.791015625, + 0.849609375, + 0.822265625, + 0.607421875, + 0.830078125, + 0.658203125, + 0.537109375, + 0.541015625, + 0.505859375, + 0.537109375, + 0.728515625, + 0.720703125, + 0.912109375, + 0.548828125, + 0.666015625, + 0.888671875, + 0.912109375, + 0.505859375, + 0.951171875, + 0.650390625, + 0.583984375, + 0.904296875, + 0.916015625, + 0.818359375, + 0.943359375, + 0.587890625, + 0.845703125, + 0.552734375, + 0.658203125, + 0.599609375, + 0.724609375, + 0.962890625, + 0.927734375, + 0.740234375, + 0.986328125, + 0.814453125, + 0.884765625, + 0.556640625, + 0.841796875, + 0.935546875, + 0.525390625, + 0.658203125, + 0.767578125, + 0.904296875, + 0.900390625, + 0.990234375, + 0.677734375, + 0.712890625, + 0.740234375, + 0.626953125, + 0.748046875, + 0.771484375, + 0.884765625, + 0.880859375, + 0.763671875, + 0.931640625, + 0.544921875, + 0.619140625, + 0.755859375, + 0.880859375, + 0.712890625, + 0.849609375, + 0.845703125, + 0.978515625, + 0.783203125, + 0.669921875, + 0.669921875, + 0.568359375, + 0.884765625, + 0.873046875, + 0.904296875, + 0.810546875, + 0.662109375, + 0.951171875, + 0.923828125, + 0.615234375, + 0.865234375, + 0.908203125, + 0.966796875, + 0.966796875, + 0.728515625, + 0.634765625, + 0.673828125, + 0.775390625, + 0.513671875, + 0.595703125, + 0.623046875, + 0.896484375, + 0.923828125, + 0.533203125, + 0.533203125, + 0.751953125, + 0.927734375, + 0.576171875, + 0.513671875, + 0.595703125, + 0.841796875, + 0.654296875, + 0.654296875, + 0.677734375, + 0.517578125, + 0.716796875, + 0.962890625, + 0.744140625, + 0.537109375, + 0.791015625, + 0.779296875, + 0.544921875, + 0.548828125, + 0.615234375, + 0.712890625, + 0.751953125, + 0.916015625, + 0.966796875, + 0.787109375, + 0.638671875, + 0.646484375, + 0.759765625, + 0.525390625, + 0.892578125, + 0.720703125, + 0.802734375, + 0.556640625, + 0.677734375, + 0.572265625, + 0.673828125, + 0.904296875, + 0.826171875, + 0.876953125, + 0.603515625, + 0.748046875, + 0.587890625, + 0.919921875, + 0.775390625, + 0.736328125, + 0.802734375, + 0.814453125, + 0.876953125, + 0.775390625, + 0.978515625, + 0.767578125, + 0.552734375, + 0.556640625, + 0.822265625, + 0.607421875, + 0.759765625, + 0.673828125, + 0.845703125, + 0.677734375, + 0.751953125, + 0.751953125, + 0.572265625, + 0.962890625, + 0.904296875, + 0.552734375, + 0.607421875, + 0.650390625, + 0.990234375, + 0.982421875, + 0.521484375, + 0.587890625, + 0.587890625, + 0.638671875, + 0.978515625, + 0.884765625, + 0.791015625, + 0.755859375, + 0.783203125, + 0.619140625, + 0.794921875, + 0.623046875, + 0.931640625, + 0.982421875, + 0.505859375, + 0.513671875, + 0.916015625, + 0.818359375, + 0.916015625, + 0.916015625, + 0.802734375, + 0.955078125, + 0.595703125, + 0.818359375, + 0.728515625, + 0.716796875, + 0.970703125, + 0.810546875, + 0.896484375, + 0.943359375, + 0.779296875, + 0.666015625, + 0.740234375, + 0.841796875, + 0.779296875, + 0.900390625, + 0.841796875, + 0.888671875, + 0.826171875, + 0.666015625, + 0.900390625, + 0.587890625, + 0.775390625, + 0.521484375, + 0.693359375 + ], + "colorbar": { + "thickness": 15, + "tickmode": "array", + "ticks": "outside", + "ticktext": [ + "0.5", + "0.99" + ], + "tickvals": [ + 0.501953125, + 0.994140625 + ], + "title": { + "side": "right", + "text": "CG,0 probability" + }, + "x": 1.1, + "y": 0.5 + }, + "colorscale": [ + [ + 0, + "white" + ], + [ + 1, + "orange" + ] + ], + "size": 4 + }, + "mode": "markers", + "showlegend": false, + "type": "scatter", + "x": [ + 114356808, + 114356966, + 114357087, + 114357181, + 114357319, + 114357325, + 114357327, + 114357365, + 114357501, + 114357674, + 114357890, + 114357960, + 114358019, + 114358027, + 114358047, + 114358052, + 114358064, + 114358515, + 114358540, + 114358549, + 114358641, + 114355978, + 114357674, + 114357727, + 114357890, + 114357924, + 114357934, + 114357960, + 114358004, + 114358047, + 114358096, + 114358098, + 114358641, + 114358838, + 114359174, + 114359258, + 114359291, + 114359416, + 114359506, + 114359530, + 114360777, + 114360955, + 114360964, + 114360968, + 114361012, + 114361174, + 114355781, + 114355827, + 114357181, + 114357319, + 114357325, + 114357327, + 114357674, + 114357890, + 114357924, + 114357934, + 114357960, + 114358004, + 114358019, + 114358047, + 114358052, + 114358096, + 114359185, + 114359291, + 114360955, + 114360964, + 114361012, + 114357103, + 114357182, + 114357366, + 114357450, + 114357502, + 114357584, + 114357675, + 114357728, + 114357864, + 114357891, + 114357925, + 114357961, + 114357997, + 114358005, + 114358020, + 114358053, + 114358065, + 114358071, + 114358097, + 114360956, + 114360965, + 114360969, + 114361013, + 114355828, + 114355845, + 114355979, + 114356757, + 114357366, + 114357502, + 114357558, + 114357679, + 114357864, + 114357891, + 114357935, + 114357997, + 114358020, + 114358053, + 114358071, + 114358097, + 114358099, + 114359145, + 114359175, + 114359259, + 114359292, + 114355979, + 114356967, + 114357182, + 114357243, + 114357287, + 114357366, + 114357558, + 114357584, + 114357675, + 114357864, + 114357925, + 114357961, + 114357997, + 114358005, + 114358020, + 114358053, + 114358071, + 114358176, + 114360956, + 114360969, + 114361379, + 114355979, + 114357103, + 114357287, + 114357320, + 114357326, + 114357328, + 114357366, + 114357450, + 114357502, + 114356967, + 114357088, + 114357182, + 114357287, + 114357320, + 114357326, + 114357366, + 114357502, + 114357558, + 114357675, + 114357864, + 114357935, + 114357961, + 114357997, + 114358020, + 114358065, + 114358802, + 114359145, + 114360778, + 114360965, + 114360969, + 114361013, + 114357502, + 114357558, + 114357675, + 114357935, + 114357961, + 114357997, + 114358020, + 114358053, + 114358065, + 114358071, + 114358315, + 114356808, + 114356966, + 114357087, + 114357102, + 114357319, + 114357501, + 114357557, + 114357583, + 114357674, + 114357924, + 114357960, + 114358047, + 114358096, + 114358098, + 114358770, + 114358838, + 114359174, + 114359260, + 114359291, + 114359506, + 114359530, + 114360422, + 114360566, + 114360694, + 114355827, + 114355978, + 114356808, + 114357087, + 114357674, + 114357890, + 114357924, + 114357960, + 114358019, + 114358047, + 114358096, + 114358838, + 114359144, + 114359861, + 114359867, + 114360132, + 114360422, + 114360628, + 114360968, + 114357287, + 114357320, + 114357450, + 114357558, + 114357864, + 114357925, + 114357935, + 114357961, + 114357997, + 114358020, + 114358053, + 114358097, + 114358099, + 114359868, + 114361013, + 114355979, + 114356967, + 114357103, + 114357182, + 114357320, + 114357326, + 114357328, + 114357366, + 114357502, + 114357675, + 114357679, + 114357864, + 114357891, + 114357925, + 114357961, + 114357997, + 114358005, + 114358020, + 114358065, + 114358071, + 114358097, + 114358099, + 114358179, + 114358211, + 114358237, + 114358252, + 114358315, + 114358323, + 114358490, + 114358606, + 114358608, + 114358630, + 114358771, + 114358802, + 114359145, + 114359175, + 114359259, + 114361013, + 114361175, + 114356534, + 114357181, + 114357242, + 114357319, + 114357325, + 114357327, + 114357890, + 114357996, + 114358004, + 114358047, + 114358096, + 114358770, + 114355828, + 114355979, + 114356809, + 114356967, + 114357103, + 114357182, + 114357243, + 114357287, + 114357320, + 114357326, + 114357366, + 114357450, + 114357502, + 114357558, + 114357675, + 114357864, + 114357891, + 114357935, + 114357961, + 114357997, + 114358005, + 114358020, + 114358048, + 114358071, + 114358097, + 114358820, + 114357088, + 114357182, + 114357287, + 114357366, + 114357450, + 114357502, + 114357558, + 114357864, + 114357925, + 114357961, + 114357997, + 114358005, + 114358020, + 114358053, + 114358097, + 114358099, + 114360778, + 114360956, + 114360969, + 114361013, + 114356756, + 114356808, + 114356966, + 114357087, + 114357102, + 114357181, + 114357327, + 114357501, + 114357557, + 114357583, + 114357674, + 114357890, + 114355827, + 114355978, + 114356252, + 114356808, + 114357087, + 114357181, + 114357286, + 114357319, + 114357325, + 114357327, + 114357583, + 114357674, + 114357727, + 114357890, + 114357924, + 114358019, + 114358047, + 114358096, + 114359174, + 114359185, + 114359416, + 114359530, + 114359824, + 114360955, + 114360964, + 114360968, + 114357088, + 114357103, + 114357182, + 114357287, + 114357320, + 114357326, + 114357328, + 114357366, + 114357925, + 114357961, + 114358005, + 114358020, + 114358053, + 114358097, + 114358099, + 114360956, + 114360965, + 114360969, + 114357925, + 114357935, + 114357961, + 114358020, + 114358053, + 114358211, + 114358252, + 114358315, + 114358323, + 114358455, + 114358488, + 114356808, + 114356966, + 114357181, + 114357286, + 114359076, + 114359185, + 114359260, + 114359506, + 114359824, + 114359861, + 114359867, + 114359935, + 114360964, + 114360968, + 114361378, + 114355781, + 114356808, + 114356966, + 114357924, + 114357960, + 114357996, + 114358004, + 114358019, + 114358047, + 114358096, + 114359260, + 114359416, + 114359530, + 114360964, + 114361012, + 114355827, + 114356966, + 114357890, + 114357996, + 114358047, + 114358064, + 114358096, + 114358098, + 114358770, + 114358801, + 114358819, + 114358838, + 114358888, + 114359144, + 114359174, + 114359258, + 114357327, + 114357674, + 114357924, + 114358047, + 114358052, + 114358838, + 114358888, + 114359174, + 114359185, + 114359291, + 114359416, + 114359530, + 114359824, + 114355827, + 114355978, + 114356966, + 114357087, + 114357181, + 114357319, + 114357501, + 114357583, + 114357674, + 114358096, + 114359144, + 114359174, + 114359185, + 114359291, + 114359530, + 114359861, + 114357182, + 114357287, + 114357326, + 114357328, + 114357366, + 114357450, + 114357502, + 114357558, + 114357864, + 114357891, + 114357925, + 114357961, + 114357997, + 114358005, + 114358020, + 114358065, + 114357558, + 114357584, + 114357675, + 114357728, + 114357891, + 114357925, + 114357935, + 114357961, + 114357997, + 114358020, + 114358053, + 114358065, + 114358771, + 114358802, + 114359077, + 114359145, + 114359175 + ], + "y": [ + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 16, + 16, + 16, + 16, + 16, + 16, + 16, + 16, + 16, + 16, + 16, + 16, + 16, + 16, + 16, + 16, + 16, + 16, + 16, + 16, + 16, + 16, + 16, + 16, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 23, + 23, + 23, + 23, + 23, + 23, + 23, + 23, + 23, + 23, + 23, + 23, + 23, + 23, + 23, + 23, + 23, + 23, + 23, + 23, + 23, + 23, + 23, + 23, + 23, + 23, + 19, + 19, + 19, + 19, + 19, + 19, + 19, + 19, + 19, + 19, + 19, + 19, + 19, + 19, + 19, + 19, + 19, + 19, + 19, + 19, + 14, + 14, + 14, + 14, + 14, + 14, + 14, + 14, + 14, + 14, + 14, + 14, + 20, + 20, + 20, + 20, + 20, + 20, + 20, + 20, + 20, + 20, + 20, + 20, + 20, + 20, + 20, + 20, + 20, + 20, + 20, + 20, + 20, + 20, + 20, + 20, + 20, + 20, + 21, + 21, + 21, + 21, + 21, + 21, + 21, + 21, + 21, + 21, + 21, + 21, + 21, + 21, + 21, + 21, + 21, + 21, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 17, + 17, + 17, + 17, + 17, + 17, + 17, + 17, + 17, + 17, + 17, + 17, + 17, + 17, + 17, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 22, + 22, + 22, + 22, + 22, + 22, + 22, + 22, + 22, + 22, + 22, + 22, + 22, + 22, + 22, + 22, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 26, + 26, + 26, + 26, + 26, + 26, + 26, + 26, + 26, + 26, + 26, + 26, + 26, + 26, + 26, + 26, + 26 + ] + } + ], + "layout": { + "barmode": "overlay", + "height": 300, + "hovermode": false, + "plot_bgcolor": "rgba(0, 0, 0, 0)", + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "pad": { + "b": 10 + }, + "text": "DiMeLo-seq CTCF and CpG methylation", + "x": 0.5, + "xanchor": "center", + "y": 0.75, + "yanchor": "top" + }, + "width": 1000, + "xaxis": { + "range": [ + 114357437, + 114359753 + ], + "title": { + "text": "chr1 coordinate, t2t v1.0" + }, + "type": "linear" + }, + "yaxis": { + "autorange": true, + "range": [ + -2.2941176470588234, + 28.294117647058822 + ], + "title": { + "text": "reads" + }, + "type": "linear" + } + } + }, + "image/png": "iVBORw0KGgoAAAANSUhEUgAABK4AAAFoCAYAAAB+E7NxAAAAAXNSR0IArs4c6QAAIABJREFUeF7s3Qd0FFXfBvAnm94IaRCKVGnSBKUIKoIoFhT1VVTEiAiISBFFRYqKCKJYKNIERV2QIhaK0kRRpAgoAoIiIL2E9EJCssnu9/1nMrubuiWbZJM89xzP+yaZuXPnd2c32YdbPEwmkwksFKAABShAAQpQgAIUoAAFKEABClCAAhRwMwEPBldu1iNsDgUoQAEKUIACFKAABShAAQpQgAIUoIAiwOCKDwIFKEABClCAAhSgAAUoQAEKUIACFKCAWwowuHLLbmGjKEABClCAAhSgAAUoQAEKUIACFKAABRhc8RmgAAUoQAEKUIACFKAABShAAQpQgAIUcEsBBldu2S1sFAUoQAEKUIACFKAABShAAQpQgAIUoACDKz4DFKAABShAAQpQgAIUoAAFKEABClCAAm4pwODKLbuFjaIABShAAQpQgAIUoAAFKEABClCAAhRgcMVngAIUoAAFKEABClCAAhSgAAUoQAEKUMAtBRhcuWW3sFEUoAAFKEABClCAAhSgAAUoQAEKUIACDK74DFCAAhSgAAUoQAEKUIACFKAABShAAQq4pQCDK7fsFjaKAhSgAAUoQAEKUIACFKAABShAAQpQgMEVnwEKUIACFKAABShAAQpQgAIUoAAFKEABtxRgcOWW3cJGUYACFKAABShAAQpQgAIUoAAFKEABCjC44jNAAQpQgAIUoAAFKEABClCAAhSgAAUo4JYCDK7cslvYKApQgAIUoAAFKEABClCAAhSgAAUoQAEGV3wGKEABClCAAhSgAAUoQAEKUIACFKAABdxSgMGVW3YLG0UBClCAAhSgAAUoQAEKUIACFKAABSjA4IrPAAUoQAEKUIACFKAABShAAQpQgAIUoIBbCjC4cstuYaMoQAEKUIACFKAABShAAQpQgAIUoAAFGFzxGaAABShAAQpQgAIUoAAFKEABClCAAhRwSwEGV27ZLWwUBShAAQpQgAIUoAAFKEABClCAAhSgAIMrPgMUoAAFKEABClCAAhSgAAUoQAEKUIACbinA4Motu4WNogAFKEABClCAAhSgAAUoQAEKUIACFGBwxWeAAhSgAAUoQAEKUIACFKAABShAAQpQwC0FGFy5ZbewURSgAAUoQAEKUIACFKAABShAAQpQgAIMrvgMUIACFKAABShAAQpQgAIUoAAFKEABCrilAIMrt+wWNooCFKAABShAAQpQgAIUoAAFKEABClCAwRWfAQpQgAIUoAAFKEABClCAAhSgAAUoQAG3FGBw5ZbdwkZRgAIUoAAFKEABClCAAhSgAAUoQAEKMLjiM0ABClCAAhSgAAUoQAEKUIACFKAABSjglgIMrtyyW9goClCAAhSgAAUoQAEKUIACFKAABShAAQZXfAYoQAEKUIACFKAABShAAQpQgAIUoAAF3FKAwZVbdgsbRQEKUIACFKAABShAAQpQgAIUoAAFKMDgis8ABShAAQpQgAIUoAAFKEABClCAAhSggFsKMLhyy25hoyhAAQpQgAIUoAAFKEABClCAAhSgAAUYXPEZoAAFKEABClCAAhSgAAUoQAEKUIACFHBLAQZXbtktbBQFKEABClCAAhSgAAUoQAEKUIACFKAAgys+AxSgAAUoQAEKUIACFKAABShAAQpQgAJuKcDgyi27hY2iAAUoQAEKUIACFKAABShAAQpQgAIUYHDFZ4ACFKAABShAAQpQgAIUoAAFKEABClDALQUYXLllt7BRFKAABShAAQpQgAIUoAAFKEABClCAAgyu+AxQgAIUoAAFKEABClCAAhSgAAUoQAEKuKUAgyu37BY2igIUoAAFKEABClCAAhSgAAUoQAEKUIDBFZ8BClCAAhSgAAUoQAEKUIACFKAABShAAbcUYHDllt3CRlGAAhSgAAUoQAEKUIACFKAABShAAQowuOIzQAEKUIACFKAABShAAQpQgAIUoAAFKOCWAgyu3LJb2CgKUIACFKAABShAAQpQgAIUoAAFKEABBld8BihAAQpQgAIUoAAFKEABClCAAhSgAAXcUoDBlVt2CxtFAQpQgAIUoAAFKEABClCAAhSgAAUowOCKzwAFKEABClCAAhSgAAUoQAEKUIACFKCAWwowuHLLbmGjKEABClCAAhSgAAUoQAEKUIACFKAABRhc8RmgAAUoQAEKUIACFKAABShAAQpQgAIUcEsBBldu2S1sFAUoQAEKUIACFKAABShAAQpQgAIUoACDKz4DFKAABShAAQpQgAIUoAAFKEABClCAAm4pwODKLbuFjaIABShAAQpQgAIUoAAFKEABClCAAhRgcMVngAIUoAAFKEABClCAAhSgAAUoQAEKUMAtBRhcuWW3sFEUoAAFKEABClCAAhSgAAUoQAEKUIACDK74DFCAAhSgAAUoQAEKUIACFKAABShAAQq4pQCDK7fsFjaKAhSgAAUoQAEKUIACFKAABShAAQpQgMEVnwEKUIACFKAABShAAQpQgAIUoAAFKEABtxRgcOWW3cJGUYACFKAABShAAQpQgAIUoAAFKEABCjC44jNAAQpQgAIUoAAFKEABClCAAhSgAAUo4JYCDK7cslvYKApQgAIUoAAFKEABClCAAhSgAAUoQAEGV3wGKEABClCAAhSgAAUoQAEKUIACFKAABdxSgMGVW3YLG0UBClCAAhSgAAUoQAEKUIACFKAABSjA4IrPAAUoQAEKUIACFKAABShAAQpQgAIUoIBbCjC4cstuYaMoQAEKUIACFKAABShAAQpQgAIUoAAFGFzxGaAABShAAQpQgAIUoAAFKEABClCAAhRwSwEGV27ZLWwUBShAAQpQgAIUoAAFKEABClCAAhSgAIMrPgMUoAAFKEABClCAAhSgAAUoQAEKUIACbinA4Motu4WNogAFKEABClCAAhSgAAUoQAEKUIACFGBwxWeAAhSgAAUoQAEKUIACFKAABShAAQpQwC0FGFy5ZbewURSgAAUoQAEKUIACFKAABShAAQpQgAIMrvgMUIACFKAABShAAQpQgAIUoAAFKEABCrilAIMrt+wWNooCFKAABShAAQpQgAIUoAAFKEABClCAwRWfAQpQgAIUoAAFKEABClCAAhSgAAUoQAG3FGBw5ZbdwkZRgAIUoAAFKEABClCAAhSgAAUoQAEKMLjiM0ABClCAAhSgAAUoQAEKUIACFKAABSjglgIMrtyyW9goClCAAhSgAAUoQAEKUIACFKAABShAAQZXfAYoQAEKUIACFKAABShAAQpQgAIUoAAF3FKAwZVbdgsbRQEKUIACFKAABShAAQpQgAIUoAAFKMDgis8ABShAAQpQgAIUoAAFKEABClCAAhSggFsKMLhyy25hoyhAAQpQgAIUoAAFKEABClCAAhSgAAUYXPEZoAAFKEABClCAAhSgAAUoQAEKUIACFHBLAQZXbtktbBQFKEABClCAAhSgAAUoQAEKUIACFKAAgys+AxSgAAUoQAEKUIACFKAABShAAQpQgAJuKcDgyi27hY2iAAUoQAEKUIACFKAABShAAQpQgAIUYHDFZ4AC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BEiABEiABEiABEigQBCgcFUglpmTJAESIAESIAESIAESIAESIAESIAESIAH7I0Dhyv7WjCMmARIgARIgARIgARIgARIgARIgARIggQJBgMJVgVhmTpIESIAESIAESIAESIAESIAESIAESIAE7I8AhSv7WzOOmARIgARIgARIgARIgARIgARIgARIgAQKBAEKVwVimTlJEiABEiABEiABEiABEiABEiABEiABErA/AhSu7G/NOGISIAESIAESIAESIAESIAESIAESIAESKBAEKFwViGXmJEmABEiABEiABEiABEiABEiABEiABEjA/ghQuLK/NeOISYAESIAESIAESIAESIAESIAESIAESKBAEKBwVSCWmZMkARIgARIgARIgARIgARIgARIgARIgAfsjQOHK/taMIyYBEiABEiABEiABEiABEiABEiABEiCBAkGAwlWBWGZOkgRIgARIgARIgARIgARIgARIgARIgATsjwCFK/tbM46YBEiABEiABEiABEiABEiABEiABEiABAoEAQpXBWKZOUkSIAESIAESIAESIAESIAESIAESIAESsD8CFK7sb804YhIgARIgARIgARIgARIgARIgARIgARIoEAQoXBWIZeYkSYAESIAESIAESIAESIAESIAESIAESMD+CFC4sr8144hJgARIgARIgARIgARIgARIgARIgARIoEAQoHBVIJaZkyQBEiABEiABEiABEiABEiABEiABEiAB+yNA4cr+1owjJgESIAESIAESIAESIAESIAESIAESIIECQYDCVYFYZk6SBEiABEiABEiABEiABEiABEiABEiABOyPAIUr+1szjpgESIAESIAESIAESIAESIAESIAESIAECgQBClcFYpk5SRIgARIgARIgARIgARIgARIgARIgARKwPwIUruxvzThiEiABEiABEiABEiABEiABEiABEiABEigQBChcFYhl5iRJgARIgARIgARIgARIgARIgARIgARIwP4IULiyvzXjiEmABEiABEiABEiABEiABEiABEiABEigQBCgcFUglpmTJAESIAESIAESIAESIAESIAESIAESIAH7I0Dhyv7WjCMmARIgARIgARIgARIgARIgARIgARIggQJBgMJVgVhmTpIESIAESIAESIAESIAESIAESCIg2fcAAACuSURBVIAESIAE7I8AhSv7WzOOmARIgARIgARIgARIgARIgARIgARIgAQKBAEKVwVimTlJEiABEiABEiABEiABEiABEiABEiABErA/AhSu7G/NOGISIAESIAESIAESIAESIAESIAESIAESKBAEKFwViGXmJEmABEiABEiABEiABEiABEiABEiABEjA/ghQuLK/NeOISYAESIAESIAESIAESIAESIAESIAESKBAEPg/GI+3OmVphp8AAAAASUVORK5CYII=", + "text/html": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "\n", + "fig = plot_read_browser.plot_read_browser(\n", + " mod_file_name=extract_file_no_thresh,\n", + " region='chr1:114357437-114359753', # you can only browser a single region, not a bed file or list of regions.\n", + " # The only cap on region size is your computer's memory and your patience\n", + " motifs=['CG,0','A,0'],\n", + " thresh=0.5,\n", + " single_strand=False,\n", + " sort_by=\"collapse\",#you can sort by anything that the loading function accepts, but the special \"collapse\" option doesn't allow other sorting\n", + " hover=False, #turning off hover will remove the hoverover read names and other info\n", + ")\n", + "# plot browser is made using plotly, so you can use the returned \"fig\" object to make updates using plotly commands\n", + "fig.update_layout(\n", + " width=1000,# these values are in pixels\n", + " height=300, \n", + " title={\n", + " 'text': 'DiMeLo-seq CTCF and CpG methylation',\n", + " 'x': 0.5,\n", + " 'xanchor': 'center',\n", + " 'y': 0.75, # Adjust the vertical position of the title\n", + " 'yanchor': 'top',\n", + " 'pad': {'b': 10} \n", + " },\n", + " xaxis_title='chr1 coordinate, t2t v1.0',\n", + " yaxis_title='reads'\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When using the read browser, one can optionally request plotting of a random subset of the reads using the `subset_parameters` argument:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "hoverinfo": "text", + "hovertext": "bd15781e-a765-43ba-b641-64cff386435f", + "line": { + "color": "lightgrey", + "width": 1 + }, + "mode": "lines", + "showlegend": false, + "type": "scatter", + "x": [ + 114272757, + 114371007 + ], + "y": [ + 0, + 0 + ] + }, + { + "hoverinfo": "text", + "hovertext": "8a461cc7-ebdc-4456-98a6-afbd85560245", + "line": { + "color": "lightgrey", + "width": 1 + }, + "mode": "lines", + "showlegend": false, + "type": "scatter", + "x": [ + 114320500, + 114366576 + ], + "y": [ + 3, + 3 + ] + }, + { + "hoverinfo": "text", + "hovertext": "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + "line": { + "color": "lightgrey", + "width": 1 + }, + "mode": "lines", + "showlegend": false, + "type": "scatter", + "x": [ + 114323087, + 114361162 + ], + "y": [ + 6, + 6 + ] + }, + { + "hoverinfo": "text", + "hovertext": "4c30ceba-4a6a-41ba-8906-293ba44965d1", + "line": { + "color": "lightgrey", + "width": 1 + }, + "mode": "lines", + "showlegend": false, + "type": "scatter", + "x": [ + 114324537, + 114362163 + ], + "y": [ + 7, + 7 + ] + }, + { + "hoverinfo": "text", + "hovertext": "c4269dbc-9387-4644-a195-bab0ab597d21", + "line": { + "color": "lightgrey", + "width": 1 + }, + "mode": "lines", + "showlegend": false, + "type": "scatter", + "x": [ + 114332522, + 114390219 + ], + "y": [ + 1, + 1 + ] + }, + { + "hoverinfo": "text", + "hovertext": "c299b672-9ba1-430b-ae22-43d7591eead8", + "line": { + "color": "lightgrey", + "width": 1 + }, + "mode": "lines", + "showlegend": false, + "type": "scatter", + "x": [ + 114332525, + 114377428 + ], + "y": [ + 4, + 4 + ] + }, + { + "hoverinfo": "text", + "hovertext": "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + "line": { + "color": "lightgrey", + "width": 1 + }, + "mode": "lines", + "showlegend": false, + "type": "scatter", + "x": [ + 114339863, + 114386990 + ], + "y": [ + 2, + 2 + ] + }, + { + "hoverinfo": "text", + "hovertext": "66ca78ed-7f5e-4af3-93cd-0ceb736246ec", + "line": { + "color": "lightgrey", + "width": 1 + }, + "mode": "lines", + "showlegend": false, + "type": "scatter", + "x": [ + 114341066, + 114379357 + ], + "y": [ + 5, + 5 + ] + }, + { + "hoverinfo": "text", + "hovertext": "d2f5df66-fe62-4723-b360-572dec3493c8", + "line": { + "color": "lightgrey", + "width": 1 + }, + "mode": "lines", + "showlegend": false, + "type": "scatter", + "x": [ + 114347104, + 114372936 + ], + "y": [ + 10, + 10 + ] + }, + { + "hoverinfo": "text", + "hovertext": "34f01854-c28c-4ec6-a5ff-635d1327b18d", + "line": { + "color": "lightgrey", + "width": 1 + }, + "mode": "lines", + "showlegend": false, + "type": "scatter", + "x": [ + 114349315, + 114373482 + ], + "y": [ + 11, + 11 + ] + }, + { + "hoverinfo": "text", + "hovertext": "a054616a-0028-4b5e-877f-53b611ad2767", + "line": { + "color": "lightgrey", + "width": 1 + }, + "mode": "lines", + "showlegend": false, + "type": "scatter", + "x": [ + 114350271, + 114372234 + ], + "y": [ + 12, + 12 + ] + }, + { + "hoverinfo": "text", + "hovertext": "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + "line": { + "color": "lightgrey", + "width": 1 + }, + "mode": "lines", + "showlegend": false, + "type": "scatter", + "x": [ + 114353092, + 114381301 + ], + "y": [ + 9, + 9 + ] + }, + { + "hoverinfo": "text", + "hovertext": "a6fcae27-656a-4f86-b117-02fee057fab6", + "line": { + "color": "lightgrey", + "width": 1 + }, + "mode": "lines", + "showlegend": false, + "type": "scatter", + "x": [ + 114353689, + 114360654 + ], + "y": [ + 13, + 13 + ] + }, + { + "hoverinfo": "text", + "hovertext": "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + "line": { + "color": "lightgrey", + "width": 1 + }, + "mode": "lines", + "showlegend": false, + "type": "scatter", + "x": [ + 114356767, + 114393905 + ], + "y": [ + 8, + 8 + ] + }, + { + "customdata": [ + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.603515625 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.791015625 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.849609375 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.884765625 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.525390625 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.826171875 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.919921875 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.689453125 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.783203125 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.623046875 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.591796875 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.966796875 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.841796875 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.853515625 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.697265625 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.806640625 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.947265625 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.931640625 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.736328125 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.607421875 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.658203125 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.642578125 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.658203125 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.728515625 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.564453125 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.919921875 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.962890625 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.857421875 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.931640625 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.947265625 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.630859375 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.591796875 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.978515625 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.986328125 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.798828125 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.873046875 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.564453125 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.689453125 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.552734375 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.751953125 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.951171875 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.583984375 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.626953125 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.541015625 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.880859375 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.873046875 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.611328125 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.869140625 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.740234375 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.779296875 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.970703125 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.955078125 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.708984375 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.919921875 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.689453125 + ], + [ + "1ad45bea-ccfe-4f2f-b727-d8280358f0b0", + 0.767578125 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.630859375 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.740234375 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.966796875 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.943359375 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.900390625 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.904296875 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.931640625 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.603515625 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.958984375 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.794921875 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.923828125 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.880859375 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.865234375 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.845703125 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.712890625 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.626953125 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.642578125 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.525390625 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.736328125 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.775390625 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.767578125 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.775390625 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.724609375 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.783203125 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.833984375 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.505859375 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.513671875 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.771484375 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.767578125 + ], + [ + "4c30ceba-4a6a-41ba-8906-293ba44965d1", + 0.720703125 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.716796875 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.552734375 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.595703125 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.830078125 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.853515625 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.849609375 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.900390625 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.787109375 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.638671875 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.779296875 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.943359375 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.537109375 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.544921875 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.869140625 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.865234375 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.884765625 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.927734375 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.916015625 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.712890625 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.767578125 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.810546875 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.552734375 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.779296875 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.560546875 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.576171875 + ], + [ + "9ae3a9ec-de2b-4678-80c5-82ef5b18d7af", + 0.513671875 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.603515625 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.521484375 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.779296875 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.603515625 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.599609375 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.501953125 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.572265625 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.923828125 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.677734375 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.755859375 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.876953125 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.884765625 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.943359375 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.759765625 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.884765625 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.568359375 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.576171875 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.708984375 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.767578125 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.900390625 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.888671875 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.599609375 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.908203125 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.916015625 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.861328125 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.896484375 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.908203125 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.904296875 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.908203125 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.900390625 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.939453125 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.587890625 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.626953125 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.818359375 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.701171875 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.505859375 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.556640625 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.955078125 + ], + [ + "d2f5df66-fe62-4723-b360-572dec3493c8", + 0.931640625 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.939453125 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.919921875 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.876953125 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.791015625 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.630859375 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.755859375 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.904296875 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.919921875 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.986328125 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.783203125 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.794921875 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.775390625 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.748046875 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.806640625 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.548828125 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.607421875 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.919921875 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.798828125 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.759765625 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.654296875 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.732421875 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.560546875 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.673828125 + ], + [ + "a054616a-0028-4b5e-877f-53b611ad2767", + 0.876953125 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.892578125 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.830078125 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.861328125 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.849609375 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.705078125 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.873046875 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.767578125 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.884765625 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.669921875 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.619140625 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.583984375 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.927734375 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.560546875 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.654296875 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.615234375 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.728515625 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.572265625 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.630859375 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.544921875 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.787109375 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.763671875 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.556640625 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.611328125 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.552734375 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.708984375 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.732421875 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.705078125 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.751953125 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.720703125 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.708984375 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.658203125 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.787109375 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.697265625 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.720703125 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.744140625 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.658203125 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.818359375 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.779296875 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.755859375 + ], + [ + "a6fcae27-656a-4f86-b117-02fee057fab6", + 0.701171875 + ] + ], + "hovertemplate": "Read: %{customdata[0]}
Position: %{x:,}
Probability: %{customdata[1]:.2f}", + "marker": { + "color": [ + 0.603515625, + 0.791015625, + 0.849609375, + 0.884765625, + 0.525390625, + 0.826171875, + 0.919921875, + 0.689453125, + 0.783203125, + 0.623046875, + 0.591796875, + 0.966796875, + 0.841796875, + 0.853515625, + 0.697265625, + 0.806640625, + 0.947265625, + 0.931640625, + 0.736328125, + 0.607421875, + 0.658203125, + 0.642578125, + 0.658203125, + 0.728515625, + 0.564453125, + 0.919921875, + 0.962890625, + 0.857421875, + 0.931640625, + 0.947265625, + 0.630859375, + 0.591796875, + 0.978515625, + 0.986328125, + 0.798828125, + 0.873046875, + 0.564453125, + 0.689453125, + 0.552734375, + 0.751953125, + 0.951171875, + 0.583984375, + 0.626953125, + 0.541015625, + 0.880859375, + 0.873046875, + 0.611328125, + 0.869140625, + 0.740234375, + 0.779296875, + 0.970703125, + 0.955078125, + 0.708984375, + 0.919921875, + 0.689453125, + 0.767578125, + 0.630859375, + 0.740234375, + 0.966796875, + 0.943359375, + 0.900390625, + 0.904296875, + 0.931640625, + 0.603515625, + 0.958984375, + 0.794921875, + 0.923828125, + 0.880859375, + 0.865234375, + 0.845703125, + 0.712890625, + 0.626953125, + 0.642578125, + 0.525390625, + 0.736328125, + 0.775390625, + 0.767578125, + 0.775390625, + 0.724609375, + 0.783203125, + 0.833984375, + 0.505859375, + 0.513671875, + 0.771484375, + 0.767578125, + 0.720703125, + 0.716796875, + 0.552734375, + 0.595703125, + 0.830078125, + 0.853515625, + 0.849609375, + 0.900390625, + 0.787109375, + 0.638671875, + 0.779296875, + 0.943359375, + 0.537109375, + 0.544921875, + 0.869140625, + 0.865234375, + 0.884765625, + 0.927734375, + 0.916015625, + 0.712890625, + 0.767578125, + 0.810546875, + 0.552734375, + 0.779296875, + 0.560546875, + 0.576171875, + 0.513671875, + 0.603515625, + 0.521484375, + 0.779296875, + 0.603515625, + 0.599609375, + 0.501953125, + 0.572265625, + 0.923828125, + 0.677734375, + 0.755859375, + 0.876953125, + 0.884765625, + 0.943359375, + 0.759765625, + 0.884765625, + 0.568359375, + 0.576171875, + 0.708984375, + 0.767578125, + 0.900390625, + 0.888671875, + 0.599609375, + 0.908203125, + 0.916015625, + 0.861328125, + 0.896484375, + 0.908203125, + 0.904296875, + 0.908203125, + 0.900390625, + 0.939453125, + 0.587890625, + 0.626953125, + 0.818359375, + 0.701171875, + 0.505859375, + 0.556640625, + 0.955078125, + 0.931640625, + 0.939453125, + 0.919921875, + 0.876953125, + 0.791015625, + 0.630859375, + 0.755859375, + 0.904296875, + 0.919921875, + 0.986328125, + 0.783203125, + 0.794921875, + 0.775390625, + 0.748046875, + 0.806640625, + 0.548828125, + 0.607421875, + 0.919921875, + 0.798828125, + 0.759765625, + 0.654296875, + 0.732421875, + 0.560546875, + 0.673828125, + 0.876953125, + 0.892578125, + 0.830078125, + 0.861328125, + 0.849609375, + 0.705078125, + 0.873046875, + 0.767578125, + 0.884765625, + 0.669921875, + 0.619140625, + 0.583984375, + 0.927734375, + 0.560546875, + 0.654296875, + 0.615234375, + 0.728515625, + 0.572265625, + 0.630859375, + 0.544921875, + 0.787109375, + 0.763671875, + 0.556640625, + 0.611328125, + 0.552734375, + 0.708984375, + 0.732421875, + 0.705078125, + 0.751953125, + 0.720703125, + 0.708984375, + 0.658203125, + 0.787109375, + 0.697265625, + 0.720703125, + 0.744140625, + 0.658203125, + 0.818359375, + 0.779296875, + 0.755859375, + 0.701171875 + ], + "colorbar": { + "thickness": 15, + "tickmode": "array", + "ticks": "outside", + "ticktext": [ + "0.5", + "0.99" + ], + "tickvals": [ + 0.501953125, + 0.986328125 + ], + "title": { + "side": "right", + "text": "A,0 probability" + }, + "x": 1 + }, + "colorscale": [ + [ + 0, + "white" + ], + [ + 1, + "blue" + ] + ], + "size": 4 + }, + "mode": "markers", + "showlegend": false, + "type": "scatter", + "x": [ + 114356480, + 114357051, + 114357052, + 114357056, + 114357058, + 114358256, + 114358257, + 114358260, + 114358261, + 114358301, + 114358447, + 114358457, + 114358459, + 114358478, + 114358480, + 114358508, + 114358510, + 114358512, + 114358531, + 114358539, + 114358575, + 114358577, + 114358632, + 114358645, + 114358679, + 114358681, + 114359015, + 114359017, + 114359026, + 114359028, + 114359043, + 114359045, + 114359582, + 114359583, + 114359599, + 114359602, + 114359604, + 114359911, + 114359914, + 114359916, + 114359918, + 114360279, + 114360280, + 114360281, + 114360634, + 114360673, + 114360852, + 114360870, + 114360871, + 114361050, + 114361052, + 114361054, + 114361064, + 114361066, + 114361104, + 114361105, + 114358457, + 114358459, + 114358478, + 114358480, + 114358508, + 114358510, + 114358512, + 114358519, + 114358531, + 114358572, + 114358575, + 114358577, + 114358578, + 114358587, + 114358632, + 114358638, + 114358657, + 114358658, + 114358706, + 114358707, + 114358720, + 114359911, + 114359914, + 114359916, + 114359918, + 114360010, + 114360077, + 114360327, + 114360328, + 114360329, + 114358270, + 114358283, + 114358285, + 114358452, + 114358473, + 114358474, + 114358475, + 114358503, + 114358506, + 114358532, + 114358547, + 114358557, + 114358560, + 114358655, + 114358661, + 114358662, + 114358664, + 114358665, + 114358698, + 114359385, + 114359388, + 114359598, + 114359601, + 114359640, + 114361462, + 114361463, + 114358279, + 114358280, + 114358430, + 114358447, + 114358478, + 114358500, + 114358508, + 114358510, + 114358512, + 114358531, + 114358577, + 114358578, + 114358632, + 114358638, + 114358645, + 114358657, + 114358658, + 114358679, + 114358681, + 114358706, + 114358707, + 114358710, + 114358711, + 114358720, + 114358736, + 114359015, + 114359017, + 114359026, + 114359028, + 114359330, + 114359331, + 114359351, + 114359352, + 114359396, + 114359549, + 114359562, + 114359701, + 114359720, + 114359722, + 114356267, + 114356637, + 114357444, + 114358478, + 114358491, + 114358508, + 114358510, + 114358512, + 114358531, + 114358575, + 114358577, + 114358578, + 114358585, + 114358828, + 114358831, + 114358930, + 114359015, + 114359017, + 114359026, + 114359028, + 114359270, + 114359701, + 114359826, + 114359828, + 114356046, + 114356212, + 114356435, + 114356438, + 114356440, + 114356629, + 114356844, + 114356846, + 114357006, + 114357233, + 114357402, + 114357404, + 114357406, + 114357575, + 114357576, + 114358250, + 114358283, + 114358285, + 114358299, + 114358303, + 114358475, + 114358522, + 114358523, + 114358590, + 114358633, + 114358655, + 114358656, + 114358661, + 114358662, + 114358664, + 114358665, + 114358674, + 114358675, + 114358685, + 114358688, + 114358689, + 114358695, + 114358698, + 114358700, + 114358703 + ], + "y": [ + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13 + ] + }, + { + "customdata": [ + [ + "bd15781e-a765-43ba-b641-64cff386435f", + 0.939453125 + ], + [ + "bd15781e-a765-43ba-b641-64cff386435f", + 0.783203125 + ], + [ + "bd15781e-a765-43ba-b641-64cff386435f", + 0.955078125 + ], + [ + "bd15781e-a765-43ba-b641-64cff386435f", + 0.751953125 + ], + [ + "bd15781e-a765-43ba-b641-64cff386435f", + 0.533203125 + ], + [ + "bd15781e-a765-43ba-b641-64cff386435f", + 0.943359375 + ], + [ + "bd15781e-a765-43ba-b641-64cff386435f", + 0.751953125 + ], + [ + "bd15781e-a765-43ba-b641-64cff386435f", + 0.533203125 + ], + [ + "bd15781e-a765-43ba-b641-64cff386435f", + 0.955078125 + ], + [ + "bd15781e-a765-43ba-b641-64cff386435f", + 0.611328125 + ], + [ + "bd15781e-a765-43ba-b641-64cff386435f", + 0.841796875 + ], + [ + "bd15781e-a765-43ba-b641-64cff386435f", + 0.501953125 + ], + [ + "bd15781e-a765-43ba-b641-64cff386435f", + 0.634765625 + ], + [ + "bd15781e-a765-43ba-b641-64cff386435f", + 0.802734375 + ], + [ + "bd15781e-a765-43ba-b641-64cff386435f", + 0.939453125 + ], + [ + "bd15781e-a765-43ba-b641-64cff386435f", + 0.861328125 + ], + [ + "bd15781e-a765-43ba-b641-64cff386435f", + 0.931640625 + ], + [ + "bd15781e-a765-43ba-b641-64cff386435f", + 0.556640625 + ], + [ + "bd15781e-a765-43ba-b641-64cff386435f", + 0.603515625 + ], + [ + "bd15781e-a765-43ba-b641-64cff386435f", + 0.537109375 + ], + [ + "bd15781e-a765-43ba-b641-64cff386435f", + 0.619140625 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.705078125 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.978515625 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.943359375 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.501953125 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.982421875 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.919921875 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.798828125 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.845703125 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.970703125 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.767578125 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.619140625 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.833984375 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.779296875 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.876953125 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.931640625 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.970703125 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.912109375 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.896484375 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.818359375 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.720703125 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.794921875 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.611328125 + ], + [ + "8a461cc7-ebdc-4456-98a6-afbd85560245", + 0.908203125 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.673828125 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.732421875 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.908203125 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.798828125 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.603515625 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.888671875 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.861328125 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.951171875 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.986328125 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.857421875 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.869140625 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.560546875 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.830078125 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.564453125 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.857421875 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.501953125 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.654296875 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.564453125 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.826171875 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.544921875 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.943359375 + ], + [ + "c4269dbc-9387-4644-a195-bab0ab597d21", + 0.982421875 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.873046875 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.888671875 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.904296875 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.677734375 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.876953125 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.810546875 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.880859375 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.884765625 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.755859375 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.541015625 + ], + [ + "c299b672-9ba1-430b-ae22-43d7591eead8", + 0.744140625 + ], + [ + "66ca78ed-7f5e-4af3-93cd-0ceb736246ec", + 0.623046875 + ], + [ + "66ca78ed-7f5e-4af3-93cd-0ceb736246ec", + 0.662109375 + ], + [ + "66ca78ed-7f5e-4af3-93cd-0ceb736246ec", + 0.814453125 + ], + [ + "66ca78ed-7f5e-4af3-93cd-0ceb736246ec", + 0.876953125 + ], + [ + "66ca78ed-7f5e-4af3-93cd-0ceb736246ec", + 0.818359375 + ], + [ + "66ca78ed-7f5e-4af3-93cd-0ceb736246ec", + 0.505859375 + ], + [ + "66ca78ed-7f5e-4af3-93cd-0ceb736246ec", + 0.658203125 + ], + [ + "66ca78ed-7f5e-4af3-93cd-0ceb736246ec", + 0.814453125 + ], + [ + "66ca78ed-7f5e-4af3-93cd-0ceb736246ec", + 0.564453125 + ], + [ + "66ca78ed-7f5e-4af3-93cd-0ceb736246ec", + 0.994140625 + ], + [ + "66ca78ed-7f5e-4af3-93cd-0ceb736246ec", + 0.919921875 + ], + [ + "66ca78ed-7f5e-4af3-93cd-0ceb736246ec", + 0.767578125 + ], + [ + "66ca78ed-7f5e-4af3-93cd-0ceb736246ec", + 0.853515625 + ], + [ + "66ca78ed-7f5e-4af3-93cd-0ceb736246ec", + 0.658203125 + ], + [ + "66ca78ed-7f5e-4af3-93cd-0ceb736246ec", + 0.923828125 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.658203125 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.767578125 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.904296875 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.900390625 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.990234375 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.677734375 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.712890625 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.740234375 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.626953125 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.748046875 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.771484375 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.884765625 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.880859375 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.763671875 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.931640625 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.544921875 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.619140625 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.755859375 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.880859375 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.712890625 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.849609375 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.845703125 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.978515625 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.783203125 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.669921875 + ], + [ + "34f01854-c28c-4ec6-a5ff-635d1327b18d", + 0.669921875 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.751953125 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.916015625 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.966796875 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.787109375 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.638671875 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.646484375 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.759765625 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.525390625 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.892578125 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.720703125 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.802734375 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.556640625 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.677734375 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.572265625 + ], + [ + "7e3be4d2-be0b-4eda-91fb-d56b0df8d9ec", + 0.673828125 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.931640625 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.982421875 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.505859375 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.513671875 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.916015625 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.818359375 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.916015625 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.916015625 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.802734375 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.955078125 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.595703125 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.818359375 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.728515625 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.716796875 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.970703125 + ], + [ + "09ad09ac-fe99-4e99-9fe4-d308c41538d8", + 0.810546875 + ] + ], + "hovertemplate": "Read: %{customdata[0]}
Position: %{x:,}
Probability: %{customdata[1]:.2f}", + "marker": { + "color": [ + 0.939453125, + 0.783203125, + 0.955078125, + 0.751953125, + 0.533203125, + 0.943359375, + 0.751953125, + 0.533203125, + 0.955078125, + 0.611328125, + 0.841796875, + 0.501953125, + 0.634765625, + 0.802734375, + 0.939453125, + 0.861328125, + 0.931640625, + 0.556640625, + 0.603515625, + 0.537109375, + 0.619140625, + 0.705078125, + 0.978515625, + 0.943359375, + 0.501953125, + 0.982421875, + 0.919921875, + 0.798828125, + 0.845703125, + 0.970703125, + 0.767578125, + 0.619140625, + 0.833984375, + 0.779296875, + 0.876953125, + 0.931640625, + 0.970703125, + 0.912109375, + 0.896484375, + 0.818359375, + 0.720703125, + 0.794921875, + 0.611328125, + 0.908203125, + 0.673828125, + 0.732421875, + 0.908203125, + 0.798828125, + 0.603515625, + 0.888671875, + 0.861328125, + 0.951171875, + 0.986328125, + 0.857421875, + 0.869140625, + 0.560546875, + 0.830078125, + 0.564453125, + 0.857421875, + 0.501953125, + 0.654296875, + 0.564453125, + 0.826171875, + 0.544921875, + 0.943359375, + 0.982421875, + 0.873046875, + 0.888671875, + 0.904296875, + 0.677734375, + 0.876953125, + 0.810546875, + 0.880859375, + 0.884765625, + 0.755859375, + 0.541015625, + 0.744140625, + 0.623046875, + 0.662109375, + 0.814453125, + 0.876953125, + 0.818359375, + 0.505859375, + 0.658203125, + 0.814453125, + 0.564453125, + 0.994140625, + 0.919921875, + 0.767578125, + 0.853515625, + 0.658203125, + 0.923828125, + 0.658203125, + 0.767578125, + 0.904296875, + 0.900390625, + 0.990234375, + 0.677734375, + 0.712890625, + 0.740234375, + 0.626953125, + 0.748046875, + 0.771484375, + 0.884765625, + 0.880859375, + 0.763671875, + 0.931640625, + 0.544921875, + 0.619140625, + 0.755859375, + 0.880859375, + 0.712890625, + 0.849609375, + 0.845703125, + 0.978515625, + 0.783203125, + 0.669921875, + 0.669921875, + 0.751953125, + 0.916015625, + 0.966796875, + 0.787109375, + 0.638671875, + 0.646484375, + 0.759765625, + 0.525390625, + 0.892578125, + 0.720703125, + 0.802734375, + 0.556640625, + 0.677734375, + 0.572265625, + 0.673828125, + 0.931640625, + 0.982421875, + 0.505859375, + 0.513671875, + 0.916015625, + 0.818359375, + 0.916015625, + 0.916015625, + 0.802734375, + 0.955078125, + 0.595703125, + 0.818359375, + 0.728515625, + 0.716796875, + 0.970703125, + 0.810546875 + ], + "colorbar": { + "thickness": 15, + "tickmode": "array", + "ticks": "outside", + "ticktext": [ + "0.5", + "0.99" + ], + "tickvals": [ + 0.501953125, + 0.994140625 + ], + "title": { + "side": "right", + "text": "CG,0 probability" + }, + "x": 1.1 + }, + "colorscale": [ + [ + 0, + "white" + ], + [ + 1, + "orange" + ] + ], + "size": 4 + }, + "mode": "markers", + "showlegend": false, + "type": "scatter", + "x": [ + 114356808, + 114356966, + 114357087, + 114357181, + 114357319, + 114357325, + 114357327, + 114357365, + 114357501, + 114357674, + 114357890, + 114357960, + 114358019, + 114358027, + 114358047, + 114358052, + 114358064, + 114358515, + 114358540, + 114358549, + 114358641, + 114357103, + 114357182, + 114357366, + 114357450, + 114357502, + 114357584, + 114357675, + 114357728, + 114357864, + 114357891, + 114357925, + 114357961, + 114357997, + 114358005, + 114358020, + 114358053, + 114358065, + 114358071, + 114358097, + 114360956, + 114360965, + 114360969, + 114361013, + 114356967, + 114357088, + 114357182, + 114357287, + 114357320, + 114357326, + 114357366, + 114357502, + 114357558, + 114357675, + 114357864, + 114357935, + 114357961, + 114357997, + 114358020, + 114358065, + 114358802, + 114359145, + 114360778, + 114360965, + 114360969, + 114361013, + 114357502, + 114357558, + 114357675, + 114357935, + 114357961, + 114357997, + 114358020, + 114358053, + 114358065, + 114358071, + 114358315, + 114357287, + 114357320, + 114357450, + 114357558, + 114357864, + 114357925, + 114357935, + 114357961, + 114357997, + 114358020, + 114358053, + 114358097, + 114358099, + 114359868, + 114361013, + 114355827, + 114355978, + 114356252, + 114356808, + 114357087, + 114357181, + 114357286, + 114357319, + 114357325, + 114357327, + 114357583, + 114357674, + 114357727, + 114357890, + 114357924, + 114358019, + 114358047, + 114358096, + 114359174, + 114359185, + 114359416, + 114359530, + 114359824, + 114360955, + 114360964, + 114360968, + 114355781, + 114356808, + 114356966, + 114357924, + 114357960, + 114357996, + 114358004, + 114358019, + 114358047, + 114358096, + 114359260, + 114359416, + 114359530, + 114360964, + 114361012, + 114357182, + 114357287, + 114357326, + 114357328, + 114357366, + 114357450, + 114357502, + 114357558, + 114357864, + 114357891, + 114357925, + 114357961, + 114357997, + 114358005, + 114358020, + 114358065 + ], + "y": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8 + ] + } + ], + "layout": { + "barmode": "overlay", + "hovermode": false, + "plot_bgcolor": "rgba(0,0,0,0)", + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "chr1" + }, + "xaxis": { + "range": [ + 114357437, + 114359753 + ] + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_read_browser.plot_read_browser(\n", + " mod_file_name=extract_file_no_thresh,\n", + " region='chr1:114357437-114359753',\n", + " motifs=['CG,0','A,0'],\n", + " thresh=0.5,\n", + " single_strand=False,\n", + " sort_by=\"collapse\",\n", + " hover=False,\n", + " subset_parameters={\"frac\": 0.25}\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Plot read depth profile" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The depth profile plotters allow you to visualize the depth of your data, both at a single locus and across many loci. This is always showing the read depth that is *usable for DiMeLo-seq*, that is to say read depth for the motifs in question where there is mod tag information available for the putatively modified nucleotide. Because not all motifs are reverse-complement-symmetrical, the depth is expressed on a per strand basis. You can use the same single_strand command as in enrichment plotters to only pull data from the strand specified for a region. Otherwise, data will be pulled from both strands, but the populated read depth will for each position only come from one strand, so you will still only get effectively (full read depth) / 2. " + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "from dimelo import plot_depth_profile" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize=(4, 2)) # If you want a different sized plot, you can us matplotlib commands\n", + "plt.title(\"Forward strand mod read depth\")\n", + "plot_depth_profile.by_modification(\n", + " mod_file_name=pileup_file,\n", + " regions='chr1:114357437-114359753,+',\n", + " window_size=1000,\n", + " motifs=['A,0'],\n", + " single_strand=True, # if set to True, regions that specify the strand will only pull from reads on the strand (as opposed to both strands)\n", + " regions_5to3prime=False, # if set to True, regions on the reverse (-) strand will be flipped so everything is 5 prime to 3 prime\n", + " smooth_window=None,\n", + " palette = { # you can pass down kwargs to sns barplot if you want to\n", + " 'A,0 depth':'blue',\n", + " }\n", + ")\n", + "plt.figure(figsize=(4, 2)) # If you want a different sized plot, you can us matplotlib commands\n", + "plt.title(\"Reverse strand mod read depth\")\n", + "plot_depth_profile.by_modification(\n", + " mod_file_name=pileup_file,\n", + " regions='chr1:114357437-114359753,-',\n", + " window_size=1000,\n", + " motifs=['A,0'],\n", + " single_strand=True, # if set to True, regions that specify the strand will only pull from reads on the strand (as opposed to both strands)\n", + " regions_5to3prime=False, # if set to True, regions on the reverse (-) strand will be flipped so everything is 5 prime to 3 prime\n", + " smooth_window=None,\n", + " palette = { # you can pass down kwargs to sns barplot if you want to\n", + " 'A,0 depth':'red',\n", + " }\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can superimpose plots of mod fraction enrichment and read depth to get a better picture of what is going on, and how meaningful results are. For example, in the below plot, we see that adenines are somewhat depleted at CTCF sites, while CpG motifs are enriched. The adenine modification signal has much higher read depth because `A,0` motifs are much more prevalent than `CG,0` motifs. With this set of loci and read depth, the CpG signal flanking the CTCF sites is quite low depth - explaining the noisy trace." + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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vLw8iZU/NTVVsh7dtl6vR9++fe1ul7apV69elvd5eXm4deuWpH5BeZz/+/fvY+vWrZgxYwbefvttSXtYIiMjERoaipMnT7q0H3ruU1NTJefeYDDg8uXLVuepZcuWaNmyJd566y3s2bMHXbp0waJFi/Dee+8BALRaLfr06YM+ffrg448/xqxZs/Dmm29i+/btds+5krvMuXPnEBgYiMjISABASEgIjEaj3W39/PPPSEhIwKpVqyS/D53JkdOpUye88MILGDx4MJ588kn8+uuv8PGR3qojIiIwbtw4jBs3Dnl5eejevTveffddLvg5HI4q3KWHw3lACQ4Oxueff453330XQ4YMUV1v4MCBMBqN+PTTTyXL582bB41GY8n0AwBBQUGqKSjLg6eeego3btzA4sWLrT4rLCy0ZH+hFl3Wkp2dnY2lS5dKvtO3b1/o9Xp88sknknXnz5/vUHsGDhyI0tJSSbpPo9GITz75RLJezZo10bNnT/zvf//DrVu3rLajlCrziy++QElJieX9559/jtLS0nI//0rnDrA+J1qtFkOHDsXvv/+OQ4cOWW3H3ixC37594evriwULFkjWXbJkCbKzsy1ZanJycqxqSLRs2RJardaSivXevXtW26fZcOTpWpXYu3evxL/+2rVrWLNmDfr16wedTgedTofhw4fjl19+URzgsL+f0vnbv38/9u7dq7r/vn374scff8SGDRvw7LPPSmZR5KlQg4OD0aBBA4eOi8PhPLhwCz+H8wCj5o7AMmTIEPTq1Qtvvvkmrly5gtatW2PTpk1Ys2YNpk6dKkm9mZiYiC1btuDjjz9GbGws6tWrh44dO5Zb+5999ln89NNPeOGFF7B9+3Z06dIFRqMRZ8+exU8//YSNGzeiXbt26NevH3x9fTFkyBD87W9/Q15eHhYvXoyaNWtKBHdkZCRee+01zJ49G4MHD8bAgQNx5MgR/PHHH6hRo4bd9gwZMgRdunTBP//5T1y5cgXNmjXDqlWrFH21Fy5ciK5du6Jly5aYOHEiEhISkJGRgb179+L69es4duyYZH2DwYA+ffrgqaeeQmpqKj777DN07doVjz76qGWdxMREfP7553jvvffQoEED1KxZ0xLA7CqhoaHo3r075syZg5KSEtSqVQubNm3C5cuXrdadNWsWNm3ahB49eljSpN66dQsrV67Erl27bLqN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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax1 = plt.subplots(figsize=(8, 4)) # Create figure and primary axis\n", + "ax2 = ax1.twinx() # Create secondary y-axis sharing the same x-axis\n", + "plt.title(\"Motif read depth across peaks\")\n", + "plot_depth_profile.by_modification(\n", + " mod_file_name=pileup_file,\n", + " regions=ctcf_target_regions,\n", + " window_size=1000,\n", + " motifs=['A,0','CG,0'],\n", + " single_strand=False, # if set to True, regions that specify the strand will only pull from reads on the strand (as opposed to both strands)\n", + " regions_5to3prime=False, # if set to True, regions on the reverse (-) strand will be flipped so everything is 5 prime to 3 prime\n", + " smooth_window=10,\n", + " palette = { # you can pass down kwargs to sns barplot if you want to\n", + " 'A,0 depth':'blue',\n", + " 'CG,0 depth':'orange',\n", + " },\n", + " alpha=0.4,\n", + " ax=ax1,\n", + ")\n", + "plot_enrichment_profile.by_modification(\n", + " mod_file_name=pileup_file,\n", + " regions=ctcf_target_regions,\n", + " window_size=1000,\n", + " motifs=['A,0','CG,0'],\n", + " single_strand=False, # if set to True, regions that specify the strand will only pull from reads on the strand (as opposed to both strands)\n", + " regions_5to3prime=False, # if set to True, regions on the reverse (-) strand will be flipped so everything is 5 prime to 3 prime\n", + " smooth_window=50,\n", + " palette = { # you can pass down kwargs to sns barplot if you want to\n", + " 'A,0':'blue',\n", + " 'CG,0':'orange'\n", + " },\n", + " ax=ax2,\n", + ")\n", + "# Combine legends\n", + "lines1, labels1 = ax1.get_legend_handles_labels()\n", + "lines2, labels2 = ax2.get_legend_handles_labels()\n", + "ax1.legend(lines1 + lines2, labels1 + labels2, loc=\"upper left\")\n", + "ax1.set_ylabel(\"Read Depth\")\n", + "ax2.set_ylabel(\"Enrichment\")\n", + "ax1.set_xlabel(\"Relative Genomic Position\")\n", + "ax2.get_legend().remove()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Plot depth histogram" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Depth histograms show the distribution of read depths across sites, either averaging each locus into a single value or providing readouts across all genomic coordinates." + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [], + "source": [ + "from dimelo import plot_depth_histogram" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "11bb57091dd44965ad3c1dc33ab0856d", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Processing regions in parallel across 64: 0%| | 0/100 [00:00" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjIAAAHBCAYAAABzIlFzAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAABALUlEQVR4nO3deVhVBeL/8c+VTZTNlaVAcAXNhVxw18JSpzG3csk1nZxptNw1p3FpdS/H8ptjmUu/SmsmzclJU3MpNVSU1MSNUExRQwNEEFnO748e73QT0KsXLgffr+c5z8PZP/dgw2fOOfcci2EYhgAAAEyonLMDAAAA3CmKDAAAMC2KDAAAMC2KDAAAMC2KDAAAMC2KDAAAMC2KDAAAMC2KDAAAMC1XZwcobvn5+Tp37py8vb1lsVicHQcAANwGwzB05coVBQUFqVy5ws+7lPkic+7cOQUHBzs7BgAAuANnzpzR/fffX+j8Ml9kvL29Jf16IHx8fJycBgAA3I709HQFBwdb/44XpswXmRuXk3x8fCgyAACYzK1uC+FmXwAAYFoUGQAAYFoUGQAAYFpl/h4ZAEDZkpeXp5ycHGfHwF1yc3OTi4vLXW+HIgMAMAXDMHT+/HmlpqY6OwocxM/PTwEBAXf1nDeKDADAFG6UmOrVq6tChQo85NTEDMNQZmamLl68KEkKDAy8421RZAAApV5eXp61xFSpUsXZceAAnp6ekqSLFy+qevXqd3yZiZt9AQCl3o17YipUqODkJHCkG7/Pu7nniSIDADANLieVLY74fVJkAAC4A6GhoVqwYIGzY9zzuEcGAIA7sHfvXlWsWNHZMZxu6NChSk1N1dq1a52yf4oMAOCecf36dbm7uztkW9WqVXPIdnB3uLQEACizOnbsqFGjRmnMmDGqWrWqOnfuLEk6fPiwunbtKi8vL/n7+2vQoEFKSUmxrnflyhUNGDBAFStWVGBgoN5880117NhRY8aMsS7z+0tLSUlJ6t69u7y8vOTj46M+ffrowoUL1vkzZsxQkyZN9MEHHyg0NFS+vr7q16+frly5Yl3mX//6lxo2bChPT09VqVJFnTp10tWrVwv9fD/88IP++Mc/ysfHR97e3mrXrp0SEhIkSfn5+Xr55Zd1//33y8PDQ02aNNGGDRus627btk0Wi8XmuTxxcXGyWCw6deqUJGn58uXy8/PTxo0bFRERIS8vL3Xp0kXJycnWz7RixQp9/vnnslgsslgs2rZt223/fhyBIgMAKNNWrFghd3d37dy5U4sXL1ZqaqoefvhhRUZGat++fdqwYYMuXLigPn36WNcZN26cdu7cqXXr1mnTpk365ptvtH///kL3kZ+fr+7du+vy5cvavn27Nm3apB9//FF9+/a1WS4hIUFr167VF198oS+++ELbt2/XrFmzJEnJycnq37+/hg0bpvj4eG3btk29evWSYRgF7vPs2bNq3769PDw89PXXXys2NlbDhg1Tbm6uJOkf//iH5s+fr3nz5ungwYPq3LmzHn/8cZ04ccKu45eZmal58+bpgw8+0I4dO5SUlKQJEyZIkiZMmKA+ffpYy01ycrJat25t1/bvFpeWAMBkkpKSbM4elEZVq1ZVSEiIs2NIkurUqaM5c+ZYx1999VVFRkbq9ddft057//33FRwcrOPHjyswMFArVqzQRx99pOjoaEnSsmXLFBQUVOg+tmzZokOHDikxMVHBwcGSpJUrV6pBgwbau3evmjdvLunXwrN8+XJ5e3tLkgYNGqQtW7botddeU3JysnJzc9WrVy/VqFFDktSwYcNC97lo0SL5+vpq1apVcnNzkyTVrVvXOn/evHmaPHmy+vXrJ0maPXu2tm7dqgULFmjRokW3ffxycnK0ePFi1apVS5I0atQovfzyy5IkLy8veXp6Kjs7WwEBAbe9TUeiyACAiSQlJSk8PEJZWZnOjlIkT88KOno0vlSUmaZNm9qMf//999q6dau8vLxuWjYhIUFZWVnKyclRixYtrNN9fX1Vr169QvcRHx+v4OBga4mRpPr168vPz0/x8fHWIhMaGmotMdKvT7S98XTbxo0bKzo6Wg0bNlTnzp316KOP6oknnlClSpUK3GdcXJzatWtnLTG/lZ6ernPnzqlNmzY209u0aaPvv/++0M9RkAoVKlhLzO8zlwYUGQAwkZSUFGVlZSpq2HT5BIY6O06B0pNPKeb9l5SSklIqiszvv1mUkZGhbt26afbs2TctGxgYqJMnTxZblt+XDovFovz8fEmSi4uLNm3apF27dumrr77SW2+9pRdffFExMTEKCwu7aVs3nox7p8qV+/Xukt9euirowXQFZS7scpczUGQAwIR8AkNVOaTwMwQo3IMPPqh///vfCg0NlavrzX8Ga9asKTc3N+3du9daxNLS0nT8+HG1b9++wG1GRETozJkzOnPmjPWszJEjR5Samqr69evfdjaLxaI2bdqoTZs2mjZtmmrUqKE1a9Zo3LhxNy3bqFEjrVixQjk5OTeVDR8fHwUFBWnnzp3q0KGDdfrOnTutZ5pufOsqOTnZetYnLi7utrPe4O7urry8PLvXcxRu9gUA3FNGjhypy5cvq3///tq7d68SEhK0ceNGPf3008rLy5O3t7eGDBmiiRMnauvWrfrhhx80fPhwlStXrtAn0Xbq1EkNGzbUgAEDtH//fu3Zs0eDBw9Whw4d1KxZs9vKFRMTo9dff1379u1TUlKSPvvsM/3888+KiIgocPlRo0YpPT1d/fr10759+3TixAl98MEHOnbsmCRp4sSJmj17tlavXq1jx47phRdeUFxcnEaPHi1Jql27toKDgzVjxgydOHFC69ev1/z58+0+nqGhoTp48KCOHTumlJSUu3rdwJ2gyAAA7ik3zlTk5eXp0UcfVcOGDTVmzBj5+flZL7e88cYbatWqlf74xz+qU6dOatOmjSIiIlS+fPkCt2mxWPT555+rUqVKat++vTp16qSaNWtq9erVt53Lx8dHO3bs0B/+8AfVrVtXf//73zV//nx17dq1wOWrVKmir7/+WhkZGerQoYOaNm2qd99913p25vnnn9e4ceM0fvx4NWzYUBs2bNC6detUp04dSb9eMvr444919OhRNWrUSLNnz9arr75qz6GUJD3zzDOqV6+emjVrpmrVqmnnzp12b+NuWIzSdKGrGKSnp8vX11dpaWny8fFxdhwAuCv79+9X06ZN9ciLy0rtpaXLSce06bWnFRsbqwcffNAh27x27ZoSExMVFhZWaJkoTlevXtV9992n+fPna/jw4SW+/7KqqN/r7f795h4ZAAB+58CBAzp69KhatGihtLQ069eNu3fv7uRk+D2KDAAABZg3b56OHTsmd3d3NW3aVN98842qVq3q7Fj4HYoMAAC/ExkZqdjYWGfHwG3gZl8AAGBaFBkAAGBaFBkAAGBaFBkAAGBaFBkAAGBaFBkAAGBaFBkAAMqwjh07asyYMSWyL4vForVr15bIvm7gOTIAAFNLSkpSSkpKie2vatWq1rdi22P37t1q27atunTpovXr199yecMwNH36dL377rtKTU1VmzZt9M4771jfleRMM2bM0Nq1a+/obdmORpEB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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_depth_histogram.by_modification(\n", + " mod_file_name=pileup_file,\n", + " regions=ctcf_target_regions,\n", + " window_size=1000,\n", + " motifs=['A,0'],#,'CG,0'],\n", + " one_depth_per_region=True,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "0b5fe837bed8459b8eb02a0bd6c8986e", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Processing regions in parallel across 64: 0%| | 0/100 [00:00" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_depth_histogram.by_modification(\n", + " mod_file_name=pileup_file,\n", + " regions=ctcf_target_regions,\n", + " window_size=1000,\n", + " motifs=['A,0'],#,'CG,0'],\n", + " one_depth_per_region=False,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Advanced Use Cases" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Exporting pileups to bigwig" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For some use cases, such as loading pileup information into a genome browser, it can be desireable to create files with less information content than the full bedmethyls. The `export` module contains functions to do these sorts of exports. " + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "dimelo/test/output/ctcf_demo_pileup_on_target/pileup.sorted.bed.gz\n", + "dimelo/test/output/chm13.draft_v1.0.fasta\n" + ] + } + ], + "source": [ + "pileup_file = 'dimelo/test/output/ctcf_demo_pileup_on_target/pileup.sorted.bed.gz'\n", + "ref_genome_file = 'dimelo/test/output/chm13.draft_v1.0.fasta'\n", + "print(pileup_file)\n", + "print(ref_genome_file)" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4b4f06d86ab14983a699c1dc1b80649b", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Step 1: Indexing contigs in pileup.sorted.bed.gz to set up bigwig header for pileup.fractions.bigwig: 0%| …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Indexing chr1.: 0it [00:00, ?it/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Indexing chr12.: 0it [00:00, ?it/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Indexing chr14.: 0it [00:00, ?it/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Indexing chr15.: 0it [00:00, ?it/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Indexing chr16.: 0it [00:00, ?it/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Indexing chr17.: 0it [00:00, ?it/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Indexing chr19.: 0it [00:00, ?it/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Indexing chr2.: 0it [00:00, ?it/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Indexing chr20.: 0it [00:00, ?it/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Indexing chr21.: 0it [00:00, ?it/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Indexing chr3.: 0it [00:00, ?it/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Indexing chr5.: 0it [00:00, ?it/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Indexing chr6.: 0it [00:00, ?it/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Indexing chr7.: 0it [00:00, ?it/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Indexing chr8.: 0it [00:00, ?it/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Indexing chr9.: 0it [00:00, ?it/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Indexing chrX.: 0it [00:00, ?it/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "5b1bca519eda485291fafdd7ca637ace", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Step 2: Writing pileup.sorted.bed.gz contents to pileup.fractions.bigwig: 0%| | 0/17 [00:00" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "sort_by = ['chromosome','region_start'] # you can sort reads also!\n", + "plot_reads.plot_reads(\n", + " mod_file_name=extract_file_no_thresh,\n", + " regions=ctcf_target_regions,\n", + " motifs=['A,0', 'CG,0'],\n", + " window_size=1000,\n", + " single_strand=False, # if set to True, regions that specify the strand will only pull from reads on the strand (as opposed to both strands)\n", + " regions_5to3prime=True, # if set to True, regions on the reverse (-) strand will be flipped so everything is 5 prime to 3 prime\n", + " thresh=190,\n", + " sort_by=sort_by,\n", + " s=2, \n", + ")\n", + "plt.title(f'CTCF target data, 100 known binding locations\\nsort_by={sort_by}')\n", + "plt.xlabel('position relative to annotated CTCF site')\n", + "plt.ylabel('reads')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Manually Loading Processed Data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Load sum total modified/valid base read counts by genomic regions" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [], + "source": [ + "from dimelo import load_processed" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "total methylated adenines across regions in bed file: 14242 \n", + "total adenine reads called as methylated or unmethylated across regions in bed file: 174078\n" + ] + } + ], + "source": [ + "modified_base_count,valid_base_count = load_processed.pileup_counts_from_bedmethyl(\n", + " bedmethyl_file = pileup_file,\n", + " motif = 'A,0',\n", + " regions = ctcf_target_regions,\n", + " single_strand=False, # if set to True, regions that specify the strand will only pull from reads on the strand (as opposed to both strands)\n", + ")\n", + "print('total methylated adenines across regions in bed file:',modified_base_count,'\\ntotal adenine reads called as methylated or unmethylated across regions in bed file:',valid_base_count)" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "total methylated adenines in single window: 213 \n", + "total adenine reads called as methylated or unmethylated in single window: 1619\n" + ] + } + ], + "source": [ + "modified_base_count,valid_base_count = load_processed.pileup_counts_from_bedmethyl(\n", + " bedmethyl_file = pileup_file,\n", + " motif = 'A,0',\n", + " regions = 'chr1:114358436-114358754',\n", + " single_strand=False, # if set to True, regions that specify the strand will only pull from reads on the strand (as opposed to both strands)\n", + ")\n", + "print('total methylated adenines in single window:',modified_base_count,'\\ntotal adenine reads called as methylated or unmethylated in single window:',valid_base_count)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Load pileup vectors (modified and valid base read counts) aligned to target region(s)" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "methylated adenines by position near peak center:\n", + " [38 53 32 6 4 54 2 83 90 0 85 39 15 45 11 18 11 16 38 20] \n", + "adenine reads by position, called as methylated or unmethylated:\n", + " [588 679 297 210 70 534 58 445 839 0 891 431 80 486 51 303 286 514\n", + " 491 589]\n" + ] + } + ], + "source": [ + "modified_base_counts,valid_base_counts = load_processed.pileup_vectors_from_bedmethyl(\n", + " bedmethyl_file = pileup_file,\n", + " motif = 'A,0',\n", + " regions = ctcf_target_regions, # Regions from bed file\n", + " window_size = 10, # Trim/extend regions to same size\n", + " single_strand=False, # if set to True, regions that specify the strand will only pull from reads on the strand (as opposed to both strands)\n", + " regions_5to3prime=False, # if set to True, regions on the reverse (-) strand will be flipped so everything is 5 prime to 3 prime\n", + ")\n", + "print('methylated adenines by position near peak center:\\n',modified_base_counts,'\\nadenine reads by position, called as methylated or unmethylated:\\n',valid_base_counts)" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "methylated adenines by position near peak center:\n", + " [1 0 3 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0] \n", + "adenine reads by position, called as methylated or unmethylated:\n", + " [14 0 14 0 0 13 14 14 13 0 13 0 0 0 0 0 0 0 13 0]\n" + ] + } + ], + "source": [ + "modified_base_counts,valid_base_counts = load_processed.pileup_vectors_from_bedmethyl(\n", + " bedmethyl_file = pileup_file,\n", + " motif = 'A,0',\n", + " regions = 'chr1:114358585-114358605', # Region from string specifier\n", + " window_size = None, # No adjustment applied to regions \n", + " single_strand=False, # if set to True, regions that specify the strand will only pull from reads on the strand (as opposed to both strands)\n", + " regions_5to3prime=False, # if set to True, regions on the reverse (-) strand will be flipped so everything is 5 prime to 3 prime\n", + ")\n", + "print('methylated adenines by position near peak center:\\n',modified_base_counts,'\\nadenine reads by position, called as methylated or unmethylated:\\n',valid_base_counts)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Load modified/valid base information by individual reads" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The current function to load reads returns somewhat counterintuitive data structures; this will likely be changed in future. If you want to convert to a more straightforward list of read data dicts, where each element in the list represents specific modification types (e.g. A,0) on a specific read from a specific region, code is provided below. An example is also shown for how one might filter reads using list and dict comprehension using this structure. " + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "chromosome\n", + "\tchr1\n", + "mod_vector\n", + "\t[False False False ... False False False]\n", + "motif\n", + "\tA,0\n", + "read_end\n", + "\t9206582\n", + "read_name\n", + "\tbc8057e5-935b-4a1a-a0de-f7a4c0dbe4bb\n", + "read_start\n", + "\t9127032\n", + "strand\n", + "\t-\n", + "val_vector\n", + "\t[False False False ... False False True]\n", + "region_start\n", + "\t9169918\n", + "region_end\n", + "\t9170236\n", + "region_strand\n", + "\t.\n", + "CG,0_mod_fraction\n", + "\t0.15053763440860216\n", + "A,0_mod_fraction\n", + "\t0.01842948717948718\n", + "[{'chromosome': 'chr14', 'mod_vector': array([False, False, False, ..., False, False, False]), 'motif': 'CG,0', 'read_end': np.int32(44230138), 'read_name': 'b35229d7-6592-48fa-ab21-53154531c984', 'read_start': np.int32(43990221), 'strand': '-', 'val_vector': array([False, False, False, ..., False, False, True]), 'region_start': 44125008, 'region_end': 44125326, 'region_strand': '.', 'CG,0_mod_fraction': np.float64(0.03731343283582089), 'A,0_mod_fraction': np.float64(0.007779772591262717)}, {'chromosome': 'chr14', 'mod_vector': array([False, False, False, ..., False, False, False]), 'motif': 'CG,0', 'read_end': np.int32(44230138), 'read_name': 'b35229d7-6592-48fa-ab21-53154531c984', 'read_start': np.int32(43990221), 'strand': '-', 'val_vector': array([False, False, False, ..., False, False, True]), 'region_start': 44125009, 'region_end': 44125325, 'region_strand': '.', 'CG,0_mod_fraction': np.float64(0.03731343283582089), 'A,0_mod_fraction': np.float64(0.007779772591262717)}]\n" + ] + } + ], + "source": [ + "read_data_list, datasets, _ = load_processed.read_vectors_from_hdf5(\n", + " file=extract_file, # binarized modification calls\n", + " regions=ctcf_target_regions,\n", + " motifs=['CG,0','A,0'],\n", + " single_strand=False, # if set to True, regions that specify the strand will only pull from reads on the strand (as opposed to both strands)\n", + " sort_by = ['chromosome','read_start','read_name']\n", + ")\n", + "# Print out the data from the first read\n", + "for idx,dataset in enumerate(datasets):\n", + " print(dataset)\n", + " for read_data in read_data_list:\n", + " print('\\t'+str(read_data[idx]))\n", + " break\n", + "# create a list of dicts for easy processing\n", + "list_of_dicts = [dict(zip(datasets,data)) for data in read_data_list]\n", + "# pull out a read by info about it, in this case the name and motif\n", + "# note that if your regions parameter for load_processed.read_vectors_from_hdf5 has multiple windows \n", + "# and a read is present in more than one of them, that read will be returned more than once, which is\n", + "# necessary and correct for e.g. the plot_reads functionality\n", + "print([read for read in list_of_dicts \n", + " if read['read_name']=='b35229d7-6592-48fa-ab21-53154531c984' \n", + " and read['motif']=='CG,0']\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "chromosome\n", + "\t chr14\n", + "mod_vector\n", + "\t [0. 0. 0. ... 0. 0. 0.001953]\n", + "motif\n", + "\t A,0\n", + "read_end\n", + "\t 44230138\n", + "read_name\n", + "\t b35229d7-6592-48fa-ab21-53154531c984\n", + "read_start\n", + "\t 43990221\n", + "strand\n", + "\t -\n", + "val_vector\n", + "\t [0 0 0 ... 0 0 1]\n", + "region_start\n", + "\t 44125008\n", + "region_end\n", + "\t 44125326\n", + "region_strand\n", + "\t .\n", + "CG,0_mod_fraction\n", + "\t 0.09485774253731344\n", + "A,0_mod_fraction\n", + "\t 0.020627618192698982\n", + "[{'chromosome': 'chr14', 'mod_vector': array([0. , 0. , 0. , ..., 0. , 0. , 0.3223], dtype=float16), 'motif': 'CG,0', 'read_end': np.int32(44230138), 'read_name': 'b35229d7-6592-48fa-ab21-53154531c984', 'read_start': np.int32(43990221), 'strand': '-', 'val_vector': array([0, 0, 0, ..., 0, 0, 1]), 'region_start': 44125008, 'region_end': 44125326, 'region_strand': '.', 'CG,0_mod_fraction': np.float64(0.09485774253731344), 'A,0_mod_fraction': np.float64(0.020627618192698982)}]\n" + ] + } + ], + "source": [ + "read_data_list, datasets, _ = load_processed.read_vectors_from_hdf5(\n", + " file=extract_file_no_thresh, # raw modification probabilities\n", + " regions='chr14:44125008-44125326',\n", + " motifs=['CG,0','A,0'],\n", + " single_strand=False, # if set to True, regions that specify the strand will only pull from reads on the strand (as opposed to both strands)\n", + ")\n", + "# Print out the data from the first read\n", + "for idx,dataset in enumerate(datasets):\n", + " print(dataset)\n", + " for read_data in read_data_list:\n", + " print('\\t',read_data[idx])\n", + " break\n", + "# create a list of dicts for easy processing\n", + "list_of_dicts = [dict(zip(datasets,data)) for data in read_data_list]\n", + "# pull out a read by info about it, in this case the name and motif\n", + "# note that if your regions parameter for load_processed.read_vectors_from_hdf5 has multiple windows \n", + "# and a read is present in more than one of them, that read will be returned more than once, which is\n", + "# necessary and correct for e.g. the plot_reads functionality\n", + "print([read for read in list_of_dicts \n", + " if read['read_name']=='b35229d7-6592-48fa-ab21-53154531c984' \n", + " and read['motif']=='CG,0']\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Load regions to a list" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can run any load_processed loader function one-by-one through a set of regions, rather than aggregating to a single output. This is implemented by the `load_processed.regions_to_list`, which takes a function handle to e.g. `load_processed.pileup_counts_from_bedmethyl` and runs it with the specified parameters but running each region in the regions specifier separately." + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "352287b1e6a7446380034a5bf3f4fecf", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Processing regions in parallel across 64: 0%| | 0/100 [00:00 [OPTIONS] to update or consolidate mod codes.\n", + "See https://github.com/nanoporetech/modkit/blob/master/book/src/advanced_usage.md\n", + " \n", + "No specified number of cores requested. 64 available on machine, allocating all.\n", + "Modification threshold of 190 assumed to be for range 0-255. 190/255=0.7450980392156863 will be sent to modkit.\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "ab55ba6d03e74aecac759d3de27d5c38", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " | Step 1: Identify motif locations in chm13.draft_v1.0.fasta 0% | 00:00" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "af6298cdde0849849359048312399e65", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " | Step 2: Parse regions in ctcf_demo.updated.bam 0% | 00:00" + ] + }, + "execution_count": 50, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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r56Cg4NVp04dSdKxY8ecehxP44oQAACSAiv6as9r8R47dmktXLhQBQUFioyMtLcZhiF/f3/NmTNHISEhhfqHh4dLkjIzMxUREWFvz8zMVIsWLUo8TteuXVW7dm0tWLBAkZGRstlsatKkifLz80tdqzcgCAEAIMlisTg0POUJBQUF+uCDD/TWW2+pU6dOhT7r3r27PvroIz3zzDOF2uvWravw8HClpaXZg092drY2b96sZ599ttjjnDt3Tvv27dOCBQvUvn17SdKmTZuc/4XKgLJ9xgEAgN2///1vXbhwQYMGDSpy5adnz55auHBhkSBksVg0YsQITZo0SQ0aNFDdunU1btw4RUZGqnv37sUep1q1aqpRo4bmz5+viIgIHTt2TKNHj3bV1/Io5ggBAOAlFi5cqLi4uCIhSPolCG3dulW7du1SnTp1NGHCBPtnL730koYNG6bBgwerdevWysnJUWpqqgICAux9OnbsqAEDBkiSfHx8tGTJEm3btk1NmjTRyJEjNX36dFd/PY+wGI7es+flsrOzFRISoqysLAUHB3u6HACAh1y9elVHjhxR3bp1CwUCb3f58mXVqFFD//nPf4q9i6wktWvX1sSJE+1hyBNudE5c9fvNFSEAAMqR9evX6/7773coBP3www8KCQlRYmKi6woro5gjBABAOdKlS5dSPX/s1xo3bqxdu3a5qKKyjStCAADAtAhCAADAtAhCAADAtAhCAADAtAhCAADAtAhCAADAtAhCAADAtAhCAADAtAhCAAB4oYyMDA0bNkz16tWTv7+/oqKi1LVrV6Wlpdn77NixQwkJCYqIiJC/v79q166thx9+WP/61790oydsGYah8ePHKyIiQoGBgYqLi9OBAwfc8bXcjiAEAICXOXr0qKKjo/XFF19o+vTp2r17t1JTU3XfffdpyJAhkqTPPvtMd999t3JycrR48WLt3btXqamp6tGjh8aOHausrKwS9z9t2jS98847mjdvnjZv3qzKlSsrPj5eV69edddXdBseugoAMCVvfuhq586dtWvXLu3bt0+VK1cu9NnFixdVsWJF1a5dW/fee6+WL19e7D4Mw5DFYim2PTIyUi+88IJGjRolScrKylJYWJjef/99Pf7448Xur2PHjmratKl8fX21ePFi+fn5adKkSerTp4+GDh2qjz/+WGFhYZo9e7b++Mc/FrsPHroKAICnGIaUn+uZlwPXJM6fP6/U1FQNGTKkSAiSpKpVq2rt2rU6d+6cXnrppRL3U1wIkqQjR44oIyNDcXFx9raQkBDFxMQoPT39hrUtXrxYoaGh2rJli4YNG6Znn31WvXr1Utu2bbV9+3Z16tRJ/fr10+XLl0v5bV2Ph64CACBJ1y5LkyM9c+xXTkp+RUNNcQ4ePCjDMNSoUaMS++zfv1+S1LBhQ3vbt99+q/vuu8/+fsmSJXr44YeLbJuRkSFJCgsLK9QeFhZm/6wkzZs319ixYyVJY8aM0dSpUxUaGqqnn35akjR+/HjNnTtXu3bt0t13333DfbkLQQgAAC9yszNamjVrpp07d0qSGjRooIKCAidW9X/HuM7X11c1atRQ06ZN7W3Xw9Xp06edfuybRRACAECSKlb65cqMp45dSg0aNJDFYtGPP/54wz6StG/fPvuVF39/f9WvX/839x8eHi5JyszMVEREhL09MzNTLVq0uOG2FStWLPTeYrEUars+HGez2X6zDndhjhAAAJJksfwyPOWJVwnzdYpTvXp1xcfHKyUlRbm5uUU+v3jxojp16qTq1avrzTffdPivoW7dugoPDy90G352drY2b96s2NhYh/dX1hGEAADwMikpKbJarWrTpo0++eQTHThwQHv37tU777yj2NhYBQUF6d1339WqVavUpUsXrVmzRocPH9auXbs0bdo0Sb8MXRXHYrFoxIgRmjRpklauXKndu3crMTFRkZGR6t69uxu/pXsQhAAA8DL16tXT9u3bdd999+mFF15QkyZN9OCDDyotLU1z586VJPXo0UPffPONKlWqpMTERDVs2FD333+/vvjiiyITpevUqaMJEybY37/00ksaNmyYBg8erNatWysnJ0epqamFbmnv2LGjBgwY4K6v7DKsIwQAMCVvXkfImS5fvqwaNWroP//5jzp27Fjq7WrXrq2JEyc6NQyxjhAAAHCr9evX6/7773coBP3www8KCQlRYmKi6wpzE+4aAwDAxLp06aIuXbo4tE3jxo21a9cuF1XkXlwRAgAApuXxIJSSkqI6deooICBAMTEx2rJlyw37z5o1Sw0bNlRgYKCioqI0cuTIcvkQOAAA4HoeDUJLly5VUlKSkpOTtX37djVv3lzx8fElrjj5j3/8Q6NHj1ZycrL27t2rhQsXaunSpXrllVfcXDkAoLww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v/ByytF/G79GEHIuR8/FN998Y8TExBj+/v5GvXr1jDfeeMMoKChwc9XlkyPn4tq1a8aECROM2267zQgICDCioqKM5557zrhw4YL7Cy9n1q9fX+xvwPW///79+xsdOnQosk2LFi0MPz8/o169esZ7773n8HEthsG1PAAAYE7lao4QAACAIwhCAADAtAhCAADAtAhCAADAtAhCAADAtAhCAADAtAhCAADAtAhCAADAtAhCAADAtAhCAADAtAhCAMq8jh07aujQoRo6dKhCQkIUGhqqcePG2Z/2feHCBSUmJqpatWqqVKmS/vjHP+rAgQP27X/66Sd17dpV1apVU+XKldW4cWOtXr3aU18HQBlCEALgFRYvXqwKFSpoy5YtevvttzVz5ky9++67kqQBAwZo69atWrlypdLT02UYhjp37qxr165JkoYMGaK8vDxt3LhRu3fv1ptvvqmgoCBPfh0AZQQPXQVQ5nXs2FGnT5/WDz/8IIvFIkkaPXq0Vq5cqc8++0y33367vv76a7Vt21aSdO7cOUVFRWnx4sXq1auXmjVrpp49eyo5OdmTXwNAGcQVIQBe4e6777aHIEmKjY3VgQMHtGfPHlWoUEExMTH2z2rUqKGGDRtq7969kqTnn39ekyZNUrt27ZScnKxdu3a5vX4AZRNBCEC599RTT+nw4cPq16+fdu/erVatWmn27NmeLgtAGUAQAuAVNm/eXOj9f//7XzVo0EB33nmnCgoKCn1+7tw57du3T3feeae9LSoqSs8884yWL1+uF154QQsWLHBb7QDKLoIQAK9w7NgxJSUlad++ffroo480e/ZsDR8+XA0aNFC3bt309NNPa9OmTfruu+/0xBNPqFatWurWrZskacSIEVqzZo2OHDmi7du3a/369brjjjs8/I0AlAUVPF0AAJRGYmKirly5ojZt2sjX11fDhw/X4MGDJUnvvfeehg8frocfflj5+fm69957tXr1alWsWFGSZLVaNWTIEJ04cULBwcF66KGH9Je//MWTXwdAGcFdYwDKvI4dO6pFixaaNWuWp0sBUM4wNAYAAEyLIAQAAEyLoTEAAGBaXBECAACmRRACAACmRRACAACmRRACAACmRRACAACmRRACAACmRRACAACmRRACAACmRRACAACm9f8B7a6CfBk4tWIAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from dimelo import plot_enrichment_profile\n", + "plot_enrichment_profile.by_modification(\n", + " mod_file_name=pileup_file_coded,\n", + " regions=ctcf_target_regions,\n", + " window_size=1000,\n", + " motifs=['A,0,a','CG,0,m'], # We know from above that these mod codes aren't present in our file!\n", + " single_strand=False, # if set to True, regions that specify the strand will only pull from reads on the strand (as opposed to both strands)\n", + " regions_5to3prime=False, # if set to True, regions on the reverse (-) strand will be flipped so everything is 5 prime to 3 prime\n", + " smooth_window=50,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The `modkit` command below will make the bam file work for the to-spec mod codes m and a. However, you must use this command with caution: `modkit` can and will adjust any mod code to any other mod code; you need to verify yourself that they are actually equivalent and thus that the operation is in fact valid." + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> Converting Y to a\n", + "> Converting Z to m\n", + "\u001b[2K> done, 1025 records processed, 0 failed, 0 skipped \n" + ] + } + ], + "source": [ + "!modkit adjust-mods dimelo/test/output/ctcf_demo.updated.bam dimelo/test/output/ctcf_demo.recoded.bam --convert Y a --convert Z m" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "''" + ] + }, + "execution_count": 52, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ctcf_bam_file_recoded = output_dir / 'ctcf_demo.recoded.bam'\n", + "pysam.index(str(ctcf_bam_file_recoded))" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "No specified number of cores requested. 64 available on machine, allocating all.\n", + "Modification threshold of 190 assumed to be for range 0-255. 190/255=0.7450980392156863 will be sent to modkit.\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "5b2aeab7d98f404487a90e9d02829dd1", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " | Step 1: Identify motif locations in chm13.draft_v1.0.fasta 0% | 00:00" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "19977fe32d1b471f982ff504c8fa7cb5", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " | Step 2: Parse regions in ctcf_demo.recoded.bam 0% | 00:00" + ] + }, + "execution_count": 54, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from dimelo import plot_enrichment_profile\n", + "plot_enrichment_profile.by_modification(\n", + " mod_file_name=pileup_file_recoded,\n", + " regions=ctcf_target_regions,\n", + " window_size=1000,\n", + " motifs=['A,0,a','CG,0,m'],\n", + " single_strand=False, # if set to True, regions that specify the strand will only pull from reads on the strand (as opposed to both strands)\n", + " regions_5to3prime=False, # if set to True, regions on the reverse (-) strand will be flipped so everything is 5 prime to 3 prime\n", + " smooth_window=50,\n", + ")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "dimelo_modkit_parsing", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.8" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/version.py b/version.py deleted file mode 100644 index 17c76c40..00000000 --- a/version.py +++ /dev/null @@ -1,4 +0,0 @@ -version = "0.0.1a0" - -if __name__ == "__main__": - print(version)